af15e0698b
git-svn-id: svn://10.65.10.50/trunk@4679 c028cbd2-c16b-5b4b-a496-9718f37d4682
332 lines
7.2 KiB
C
Executable File
332 lines
7.2 KiB
C
Executable File
/* d4extra.c (c)Copyright Sequiter Software Inc., 1988-1996. All rights reserved. */
|
|
|
|
#include "d4all.h"
|
|
|
|
#ifndef UNIX
|
|
#ifdef __TURBOC__
|
|
#pragma hdrstop
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef E4ANALYZE
|
|
#ifdef P4ARGS_USED
|
|
#pragma argsused
|
|
#endif
|
|
int code4verify( CODE4 *c4, int subs )
|
|
{
|
|
if ( c4 == 0 )
|
|
return error4( 0, e4parm_null, E93901 ) ;
|
|
|
|
if ( error4code( c4 ) < 0 )
|
|
return error4code( c4 ) ;
|
|
|
|
return 0 ;
|
|
}
|
|
|
|
int dfile4verify( DATA4FILE *d4, int subs )
|
|
{
|
|
int rc ;
|
|
|
|
if ( d4 == 0 )
|
|
return error4( 0, e4parm_null, E91102 ) ;
|
|
|
|
if ( d4->c4 == 0 )
|
|
return error4( 0, e4struct, E91102 ) ;
|
|
|
|
if ( subs == 1 )
|
|
if ( ( rc = code4verify( d4->c4, 1 ) ) < 0 )
|
|
return rc ;
|
|
|
|
return 0 ;
|
|
}
|
|
|
|
#ifndef S4SINGLE
|
|
#ifndef S4CLIENT
|
|
int lock4verify( LOCK4 *lock, const int subs )
|
|
{
|
|
int rc ;
|
|
|
|
if ( lock->data == 0 )
|
|
return error4( 0, e4parm_null, E93903 ) ;
|
|
|
|
if ( subs == 1 )
|
|
if ( ( rc = dfile4verify( lock->data, 1 ) ) < 0 )
|
|
return rc ;
|
|
|
|
if ( lock->link.n == 0 || lock->link.p == 0 )
|
|
return error4( lock->data->c4, e4struct, E93903 ) ;
|
|
|
|
return 0 ;
|
|
}
|
|
#endif /* S4CLIENT */
|
|
#endif /* S4SINGLE */
|
|
#endif /* E4ANALYZE */
|
|
|
|
#ifndef S4SINGLE
|
|
#ifndef S4CLIENT
|
|
int lock4lock( LOCK4 *lock )
|
|
{
|
|
int rc ;
|
|
|
|
#ifdef E4ANALYZE
|
|
if ( ( rc = lock4verify( lock, 1 ) ) < 0 )
|
|
return rc ;
|
|
#endif
|
|
|
|
switch( lock->id.type )
|
|
{
|
|
case LOCK4ALL:
|
|
rc = dfile4lockAll( lock->data, lock->id.clientId, lock->id.serverId ) ;
|
|
break ;
|
|
case LOCK4APPEND:
|
|
rc = dfile4lockAppend( lock->data, lock->id.clientId, lock->id.serverId ) ;
|
|
break ;
|
|
case LOCK4FILE:
|
|
rc = dfile4lockFile( lock->data, lock->id.clientId, lock->id.serverId ) ;
|
|
break ;
|
|
case LOCK4RECORD:
|
|
rc = dfile4lock( lock->data, lock->id.clientId, lock->id.serverId, lock->id.recNum ) ;
|
|
break ;
|
|
default:
|
|
rc = error4( lock->data->c4, e4lock, E83901 ) ;
|
|
break ;
|
|
}
|
|
|
|
return rc ;
|
|
}
|
|
|
|
int lock4unlock( LOCK4 *lock )
|
|
{
|
|
int rc, oldUnlockAuto ;
|
|
|
|
#ifdef E4ANALYZE
|
|
if ( ( rc = lock4verify( lock, 1 ) ) < 0 )
|
|
return rc ;
|
|
#endif
|
|
|
|
oldUnlockAuto = code4unlockAuto( lock->data->c4 ) ;
|
|
code4unlockAutoSet( lock->data->c4, 1 ) ;
|
|
|
|
switch ( lock->id.type )
|
|
{
|
|
case LOCK4ALL:
|
|
#ifndef N4OTHER
|
|
#ifndef S4MEMO_OFF
|
|
dfile4memoUnlock( lock->data ) ;
|
|
#endif
|
|
#endif
|
|
#ifndef S4INDEX_OFF
|
|
dfile4unlockIndex( lock->data, lock->id.serverId ) ;
|
|
#endif
|
|
rc = dfile4unlockFile( lock->data, lock->id.clientId, lock->id.serverId ) ;
|
|
break ;
|
|
case LOCK4APPEND:
|
|
rc = dfile4unlockAppend( lock->data, lock->id.clientId, lock->id.serverId ) ;
|
|
break ;
|
|
case LOCK4FILE:
|
|
rc = dfile4unlockFile( lock->data, lock->id.clientId, lock->id.serverId ) ;
|
|
break ;
|
|
case LOCK4RECORD:
|
|
rc = dfile4unlockRecord( lock->data, lock->id.clientId, lock->id.serverId, lock->id.recNum ) ;
|
|
break ;
|
|
default:
|
|
rc = error4( lock->data->c4, e4info, E93801 ) ;
|
|
break ;
|
|
}
|
|
|
|
code4unlockAutoSet( lock->data->c4, oldUnlockAuto ) ;
|
|
|
|
return rc ;
|
|
}
|
|
#endif /* S4CLIENT */
|
|
#endif /* S4SINGLE */
|
|
|
|
/*
|
|
int dfile4lockAppendAdd( DATA4 *d4 )
|
|
{
|
|
LOCK4 *lock ;
|
|
CODE4 *c4 ;
|
|
int rc ;
|
|
|
|
if ( ( rc = d4verify( d4, 1 ) ) < 0 )
|
|
return rc ;
|
|
|
|
c4 = d4->codeBase ;
|
|
|
|
if ( c4->lockMemory == 0 )
|
|
{
|
|
c4->lockMemory = mem4create( c4, c4->memStartLock, sizeof(TAG4), c4->memExpandLock, 0 ) ;
|
|
if ( c4->lockMemory == 0 )
|
|
return 0 ;
|
|
}
|
|
|
|
lock = (LOCK4 *)mem4alloc( c4->lockMemory ) ;
|
|
if ( lock == 0 )
|
|
return error4( c4, e4memory, 0 ) ;
|
|
|
|
lock->data = d4->dataFile ;
|
|
lock->type = S4LOCK_APPEND ;
|
|
lock->serverId = data4serverId( d4 ) ;
|
|
lock->clientId = data4clientId( d4 ) ;
|
|
l4add( &d4->trans->locks, lock ) ;
|
|
|
|
return 0 ;
|
|
}
|
|
|
|
int dfile4lockFileAdd( DATA4 *d4 )
|
|
{
|
|
LOCK4 *lock ;
|
|
CODE4 *c4 ;
|
|
int rc ;
|
|
|
|
if ( ( rc = d4verify( d4, 1 ) ) < 0 )
|
|
return rc ;
|
|
|
|
c4 = d4->codeBase ;
|
|
|
|
if ( c4->lockMemory == 0 )
|
|
{
|
|
c4->lockMemory = mem4create( c4, c4->memStartLock, sizeof(TAG4), c4->memExpandLock, 0 ) ;
|
|
if ( c4->lockMemory == 0 )
|
|
return 0 ;
|
|
}
|
|
|
|
lock = (LOCK4 *)mem4alloc( c4->lockMemory ) ;
|
|
if ( lock == 0 )
|
|
return error4( c4, e4memory, 0 ) ;
|
|
|
|
lock->data = d4->dataFile ;
|
|
lock->type = S4LOCK_FILE ;
|
|
lock->serverId = data4serverId( d4 ) ;
|
|
lock->clientId = data4clientId( d4 ) ;
|
|
l4add( &d4->trans->locks, lock ) ;
|
|
return 0 ;
|
|
}
|
|
|
|
int dfile4lockRecordAdd( DATA4 *d4, long rec )
|
|
{
|
|
LOCK4 *lock ;
|
|
CODE4 *c4 ;
|
|
int rc ;
|
|
|
|
if ( ( rc = d4verify( d4, 1 ) ) < 0 )
|
|
return rc ;
|
|
|
|
c4 = d4->codeBase ;
|
|
|
|
if ( c4->lockMemory == 0 )
|
|
{
|
|
c4->lockMemory = mem4create( c4, c4->memStartLock, sizeof(TAG4), c4->memExpandLock, 0 ) ;
|
|
if ( c4->lockMemory == 0 )
|
|
return 0 ;
|
|
}
|
|
|
|
lock = (LOCK4 *)mem4alloc( c4->lockMemory ) ;
|
|
if ( lock == 0 )
|
|
return error4( c4, e4memory, 0 ) ;
|
|
|
|
lock->data = d4->dataFile ;
|
|
lock->type = S4LOCK_RECORD ;
|
|
lock->recNum = rec ;
|
|
lock->serverId = data4serverId( d4 ) ;
|
|
lock->clientId = data4clientId( d4 ) ;
|
|
|
|
l4add( &d4->trans->locks, lock ) ;
|
|
return 0 ;
|
|
}
|
|
*/
|
|
|
|
#ifndef S4OFF_COMMUNICATIONS
|
|
void message4release( CODE4 *c4 )
|
|
{
|
|
MESSAGE4 *message ;
|
|
|
|
for ( ;; )
|
|
{
|
|
message = (MESSAGE4 *)l4first( &c4->availMessages ) ;
|
|
if ( message == 0 )
|
|
return ;
|
|
l4remove( &c4->availMessages, message ) ;
|
|
if ( message->packet != 0 )
|
|
{
|
|
u4free( message->packet ) ;
|
|
message->packet = 0 ;
|
|
}
|
|
u4free( message ) ;
|
|
}
|
|
}
|
|
|
|
void S4FUNCTION message4free( CODE4 *c4, MESSAGE4 *message )
|
|
{
|
|
if ( message->packet != 0 )
|
|
{
|
|
if ( c4 == 0 )
|
|
{
|
|
if ( message->packet != 0 )
|
|
{
|
|
u4free( message->packet ) ;
|
|
message->packet = 0 ;
|
|
}
|
|
u4free( message ) ;
|
|
}
|
|
else
|
|
l4add( &c4->availMessages, message ) ;
|
|
}
|
|
}
|
|
|
|
MESSAGE4 * S4FUNCTION message4alloc( CODE4 *c4, unsigned int sizePacket )
|
|
{
|
|
MESSAGE4 *message ;
|
|
|
|
#ifdef E4PARM_LOW
|
|
if ( c4 == 0 )
|
|
{
|
|
error4( 0, e4parm_null, E93904 ) ;
|
|
return 0 ;
|
|
}
|
|
|
|
if ( sizePacket < sizeof( PACKET4 ) )
|
|
{
|
|
error4( 0, e4parm, E93904 ) ;
|
|
return 0 ;
|
|
}
|
|
#endif
|
|
|
|
message = 0 ;
|
|
for( ;; )
|
|
{
|
|
message = (MESSAGE4 *)l4next( &c4->availMessages, message ) ;
|
|
if ( message == 0 )
|
|
{
|
|
message = (MESSAGE4 *)u4allocFree( c4, (long)sizeof( MESSAGE4 ) ) ;
|
|
if ( message == 0 )
|
|
{
|
|
#ifdef E4STACK
|
|
error4stack( c4, e4memory, E93904 ) ;
|
|
#endif
|
|
return 0 ;
|
|
}
|
|
|
|
message->packet = (PACKET4 *)u4allocFree( c4, (long)sizePacket ) ;
|
|
if ( message->packet == 0 )
|
|
{
|
|
#ifdef E4STACK
|
|
error4stack( c4, e4memory, E93904 ) ;
|
|
#endif
|
|
return 0 ;
|
|
}
|
|
message->len = sizePacket ;
|
|
break ;
|
|
}
|
|
else
|
|
if ( message->len >= sizePacket )
|
|
{
|
|
l4remove( &c4->availMessages, message ) ;
|
|
break ;
|
|
}
|
|
}
|
|
return message ;
|
|
}
|
|
#endif
|
|
|