3d6c8b3e2d
Files correlati : cb6.dll Ricompilazione Demo : [ ] Commento : Modifiche per la compilazione Linux git-svn-id: svn://10.65.10.50/trunk@11080 c028cbd2-c16b-5b4b-a496-9718f37d4682
591 lines
12 KiB
C
Executable File
591 lines
12 KiB
C
Executable File
/* d4data.c (c)Copyright Sequiter Software Inc., 1988-1996. All rights reserved. */
|
|
|
|
#include "d4all.h"
|
|
#ifdef __TURBOC__
|
|
#pragma hdrstop
|
|
#endif /* __TUROBC__ */
|
|
|
|
#ifndef S4INLINE
|
|
#ifdef S4STAND_ALONE
|
|
unsigned long S4FUNCTION data4serverId( DATA4 *d4 )
|
|
{
|
|
return d4->clientId ;
|
|
}
|
|
|
|
unsigned long data4clientId( DATA4 *d4 )
|
|
{
|
|
return d4->clientId ;
|
|
}
|
|
#endif
|
|
|
|
#ifdef S4SERVER
|
|
unsigned long S4FUNCTION data4serverId( DATA4 *d4 )
|
|
{
|
|
return d4->serverId ;
|
|
}
|
|
|
|
unsigned long data4clientId( DATA4 *d4 )
|
|
{
|
|
return d4->clientId ;
|
|
}
|
|
#endif
|
|
|
|
#ifdef S4CLIENT
|
|
unsigned long S4FUNCTION data4serverId( DATA4 *d4 )
|
|
{
|
|
return d4->dataFile->serverId ;
|
|
}
|
|
|
|
unsigned long data4clientId( DATA4 *d4 )
|
|
{
|
|
return d4->clientId ;
|
|
}
|
|
#endif
|
|
#endif /* S4INLINE */
|
|
|
|
S4CONST char *S4FUNCTION d4alias( DATA4 *data )
|
|
{
|
|
#ifdef S4VBASIC
|
|
if ( c4parm_check( data, 2, E93301 ) )
|
|
return (char *) NULL;
|
|
#endif /* S4VBASIC */
|
|
|
|
#ifdef E4PARM_HIGH
|
|
if ( data == 0 )
|
|
{
|
|
error4( 0, e4parm_null, E93301 ) ;
|
|
return 0 ;
|
|
}
|
|
#endif
|
|
return data->alias ;
|
|
}
|
|
|
|
#ifndef S4SERVER
|
|
void S4FUNCTION d4aliasSet( DATA4 *data, const char * newAlias )
|
|
{
|
|
#ifdef S4VBASIC
|
|
if ( c4parm_check( data, 2, E93302 ) )
|
|
return ;
|
|
#endif /* S4VBASIC */
|
|
|
|
#ifdef E4PARM_HIGH
|
|
if ( data == 0 || newAlias == 0 )
|
|
{
|
|
error4( 0, e4parm_null, E93302 ) ;
|
|
return ;
|
|
}
|
|
#endif
|
|
|
|
u4ncpy( data->alias, newAlias, sizeof( data->alias ) ) ;
|
|
#ifndef S4CASE_SEN
|
|
c4upper( data->alias ) ;
|
|
#endif
|
|
|
|
return ;
|
|
}
|
|
#endif /* S4SERVER */
|
|
|
|
void S4FUNCTION d4blank( DATA4 *data )
|
|
{
|
|
#ifdef S4CLIENT_OR_FOX
|
|
short int loop ;
|
|
#endif
|
|
#ifdef S4VBASIC
|
|
if ( c4parm_check( data, 2, E93303 ) )
|
|
return ;
|
|
#endif /* S4VBASIC */
|
|
|
|
#ifdef E4PARM_HIGH
|
|
if ( data == 0 )
|
|
{
|
|
error4( 0, e4parm_null, E93303 ) ;
|
|
return ;
|
|
}
|
|
#endif
|
|
|
|
#ifndef S4SERVER
|
|
#ifndef S4OFF_ENFORCE_LOCK
|
|
if ( data->codeBase->lockEnforce && data->recNum > 0L )
|
|
if ( d4lockTest( data, data->recNum ) != 1 )
|
|
{
|
|
error4( data->codeBase, e4lock, E93303 ) ;
|
|
return ;
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef S4CLIENT_OR_FOX
|
|
if ( d4version( data ) == 0x30 )
|
|
{
|
|
/* because some field types record blanks as 0, must do field by field */
|
|
data->record[0] = ' ' ; /* reset the deleted flag */
|
|
for ( loop = d4numFields( data ) ; loop > 0 ; loop-- )
|
|
f4blank( d4fieldJ( data, loop ) ) ;
|
|
}
|
|
else
|
|
memset( data->record, ' ', (unsigned int)dfile4recWidth( data->dataFile ) ) ;
|
|
#else
|
|
memset( data->record, ' ', (unsigned int)dfile4recWidth( data->dataFile ) ) ;
|
|
#endif
|
|
|
|
data->recordChanged = 1 ;
|
|
|
|
return ;
|
|
}
|
|
|
|
int S4FUNCTION d4bof( DATA4 *data )
|
|
{
|
|
#ifdef S4VBASIC
|
|
if ( c4parm_check( data, 2, E93304 ) )
|
|
return -1;
|
|
#endif /* S4VBASIC */
|
|
|
|
#ifdef E4PARM_HIGH
|
|
if ( data == 0 )
|
|
return error4( 0, e4parm_null, E93304 ) ;
|
|
#endif
|
|
|
|
if ( error4code( data->codeBase ) < 0 )
|
|
return e4codeBase ;
|
|
|
|
return data->bofFlag ;
|
|
}
|
|
|
|
#ifndef S4OFF_WRITE
|
|
void S4FUNCTION d4delete( DATA4 *data )
|
|
{
|
|
#ifdef S4VBASIC
|
|
if ( c4parm_check( data, 2, E93305 ) )
|
|
return ;
|
|
#endif /* S4VBASIC */
|
|
|
|
#ifdef E4PARM_HIGH
|
|
if ( data == 0 )
|
|
{
|
|
error4( 0, e4parm_null, E93305 ) ;
|
|
return ;
|
|
}
|
|
#endif
|
|
#ifdef E4MISC
|
|
if ( data->record[0] != ' ' && data->record[0] != '*' )
|
|
{
|
|
error4( data->codeBase, e4info, E83301 ) ;
|
|
return ;
|
|
}
|
|
#endif
|
|
|
|
if ( data->record[0] != '*' )
|
|
{
|
|
#ifndef S4SERVER
|
|
#ifndef S4OFF_ENFORCE_LOCK
|
|
if ( data->codeBase->lockEnforce && data->recNum > 0L )
|
|
if ( d4lockTest( data, data->recNum ) != 1 )
|
|
{
|
|
error4( data->codeBase, e4lock, E93305 ) ;
|
|
return ;
|
|
}
|
|
#endif
|
|
#endif
|
|
data->record[0] = '*' ;
|
|
data->recordChanged = 1 ;
|
|
}
|
|
|
|
return ;
|
|
}
|
|
#endif
|
|
|
|
#ifndef S4SERVER
|
|
int S4FUNCTION d4deleted( DATA4 *data )
|
|
{
|
|
#ifdef S4VBASIC
|
|
if ( c4parm_check( data, 2, E93306 ) )
|
|
return -1;
|
|
#endif /* S4VBASIC */
|
|
|
|
#ifdef E4PARM_HIGH
|
|
if ( data == 0 )
|
|
return error4( 0, e4parm_null, E93306 ) ;
|
|
#endif
|
|
#ifdef E4MISC
|
|
if ( data->record[0] != ' ' && data->record[0] != '*' )
|
|
return error4( data->codeBase, e4info, E83301 ) ;
|
|
#endif
|
|
|
|
return *data->record != ' ' ;
|
|
}
|
|
#endif /* S4SERVER */
|
|
|
|
int S4FUNCTION d4eof( DATA4 *data )
|
|
{
|
|
#ifdef S4VBASIC
|
|
if ( c4parm_check( data, 2, E93307 ) )
|
|
return -1;
|
|
#endif /* S4VBASIC */
|
|
|
|
#ifdef E4PARM_HIGH
|
|
if ( data == 0 )
|
|
return error4( 0, e4parm_null, E93307 ) ;
|
|
#endif
|
|
|
|
if ( error4code( data->codeBase ) < 0 )
|
|
return e4codeBase ;
|
|
|
|
return data->eofFlag ;
|
|
}
|
|
|
|
const char *S4FUNCTION d4fileName( DATA4 *data )
|
|
{
|
|
#ifdef S4CLIENT
|
|
CONNECTION4 *connection ;
|
|
int rc ;
|
|
#endif
|
|
|
|
#ifdef E4PARM_HIGH
|
|
if ( data == 0 )
|
|
{
|
|
error4( 0, e4parm_null, E93205 ) ;
|
|
return 0 ;
|
|
}
|
|
#endif
|
|
|
|
#ifdef S4CLIENT
|
|
if ( error4code( data->codeBase ) < 0 )
|
|
return 0 ;
|
|
|
|
connection = data->dataFile->connection ;
|
|
connection4assign( connection, CON4DATA_FNAME, data4clientId( data ), data4serverId( data ) ) ;
|
|
connection4addData( connection, data->dataFile->accessName, strlen( data->dataFile->accessName ) + 1, 0 ) ;
|
|
connection4send( connection ) ;
|
|
rc = connection4receive( connection ) ;
|
|
if ( rc < 0 )
|
|
{
|
|
#ifdef E4STACK
|
|
error4stack( data->codeBase, rc, E95501 ) ;
|
|
#endif
|
|
return 0 ;
|
|
}
|
|
|
|
rc = connection4status( connection ) ;
|
|
if ( rc < 0 )
|
|
{
|
|
connection4error( connection, data->codeBase, rc, E95501 ) ;
|
|
return 0 ;
|
|
}
|
|
|
|
return connection4data( connection ) ;
|
|
#else
|
|
return data->dataFile->file.name ;
|
|
#endif
|
|
}
|
|
|
|
#ifndef S4OFF_TRAN
|
|
#ifdef S4STAND_ALONE
|
|
#ifndef S4OFF_WRITE
|
|
/* can change LOG4ON-->LOG4TRANS or LOG4TRANS-->LOG4ON */
|
|
int S4FUNCTION d4log( DATA4 *data, const int logging )
|
|
{
|
|
int oldVal ;
|
|
|
|
#ifdef E4PARM_HIGH
|
|
if ( data == 0 )
|
|
return error4( 0, e4parm_null, E93319 ) ;
|
|
#endif
|
|
|
|
if ( code4transEnabled( data->codeBase ) == 0 )
|
|
{
|
|
if ( logging == -1 )
|
|
return r4logOff ;
|
|
else
|
|
return error4( data->codeBase, e4trans, E83807 ) ;
|
|
}
|
|
|
|
if ( data->logVal == LOG4ALWAYS )
|
|
return r4logOn ;
|
|
|
|
oldVal = ( data->logVal == 0 ) ? 0 : 1 ;
|
|
|
|
if ( logging != -1 )
|
|
{
|
|
if ( logging )
|
|
{
|
|
if ( data->logVal == LOG4TRANS )
|
|
data->logVal = LOG4ON ;
|
|
}
|
|
else
|
|
if ( data->logVal == LOG4ON )
|
|
data->logVal = LOG4TRANS ;
|
|
}
|
|
|
|
return oldVal ;
|
|
}
|
|
#endif /* S4OFF_WRITE */
|
|
#endif /* S4STAND_ALONE */
|
|
#endif /* S4OFF_TRAN */
|
|
|
|
short int S4FUNCTION d4numFields( DATA4 *data )
|
|
{
|
|
#ifdef S4VBASIC
|
|
if ( c4parm_check( data, 2, E93308 ) )
|
|
return -1;
|
|
#endif /* S4VBASIC */
|
|
|
|
#ifdef E4PARM_HIGH
|
|
if ( data == 0 )
|
|
return error4( 0, e4parm_null, E93308 ) ;
|
|
#endif
|
|
|
|
#ifdef S4CLIENT_OR_FOX
|
|
if ( data->fields[data->dataFile->nFields-1].type == '0' ) /* null flags field */
|
|
return data->dataFile->nFields - 1 ;
|
|
#endif
|
|
|
|
return data->dataFile->nFields ;
|
|
}
|
|
|
|
#ifndef S4CLIENT
|
|
/* currently this function is not used...
|
|
int d4read( DATA4 *data, const long recNum, char *ptr )
|
|
{
|
|
#ifdef E4PARM_LOW
|
|
if ( data == 0 || recNum <= 0 || ptr == 0 )
|
|
return error4( 0, e4parm, E93309 ) ;
|
|
#endif
|
|
|
|
return dfile4read( data->dataFile, recNum, ptr, 0 ) ;
|
|
}
|
|
*/
|
|
|
|
int d4readOld( DATA4 *data, const long recNum )
|
|
{
|
|
int rc ;
|
|
|
|
#ifdef E4PARM_LOW
|
|
if ( data == 0 || recNum <= 0 )
|
|
return error4( 0, e4parm, E93310 ) ;
|
|
#endif
|
|
|
|
if ( error4code( data->codeBase ) < 0 )
|
|
return e4codeBase ;
|
|
|
|
if ( recNum <= 0 )
|
|
{
|
|
data->recNumOld = recNum ;
|
|
memset( data->recordOld, ' ', (unsigned int)dfile4recWidth( data->dataFile ) ) ;
|
|
}
|
|
|
|
if ( data->recNumOld == recNum )
|
|
return 0 ;
|
|
|
|
data->recNumOld = -1 ;
|
|
rc = dfile4read( data->dataFile, recNum, data->recordOld, 1 ) ;
|
|
if ( rc < 0 )
|
|
return -1 ;
|
|
if ( rc > 0 )
|
|
memset( data->recordOld, ' ', (unsigned int)dfile4recWidth( data->dataFile ) ) ;
|
|
data->recNumOld = recNum ;
|
|
|
|
return 0 ;
|
|
}
|
|
#endif
|
|
|
|
#ifndef S4SERVER
|
|
#ifndef S4OFF_WRITE
|
|
void S4FUNCTION d4recall( DATA4 *data )
|
|
{
|
|
#ifdef S4VBASIC
|
|
if ( c4parm_check( data, 2, E93311 ) )
|
|
return ;
|
|
#endif /* S4VBASIC */
|
|
|
|
#ifdef E4PARM_HIGH
|
|
if ( data == 0 )
|
|
{
|
|
error4( 0, e4parm_null, E93311 ) ;
|
|
return ;
|
|
}
|
|
#endif
|
|
#ifdef E4MISC
|
|
if ( data->record[0] != ' ' && data->record[0] != '*' )
|
|
{
|
|
error4( data->codeBase, e4info, E83301 ) ;
|
|
return ;
|
|
}
|
|
#endif
|
|
|
|
if ( *data->record != ' ' )
|
|
{
|
|
#ifndef S4SERVER
|
|
#ifndef S4OFF_ENFORCE_LOCK
|
|
if ( data->codeBase->lockEnforce && data->recNum > 0L )
|
|
if ( d4lockTest( data, data->recNum ) != 1 )
|
|
{
|
|
error4( data->codeBase, e4lock, E93311 ) ;
|
|
return ;
|
|
}
|
|
#endif
|
|
#endif
|
|
*data->record = ' ' ;
|
|
data->recordChanged = 1 ;
|
|
}
|
|
|
|
return ;
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
/* returns true if the input count is <= record count */
|
|
int d4recCountLessEq( DATA4 *data, long count )
|
|
{
|
|
long count2 ;
|
|
|
|
count2 = data->count ;
|
|
if ( count2 > data->dataFile->minCount ) /* transaction rollback possibility */
|
|
count2 = data->dataFile->minCount ;
|
|
if ( count <= count2 )
|
|
return 1 ;
|
|
data->count = d4recCount( data ) ;
|
|
if ( data->count < 0 )
|
|
return error4( data->codeBase, (short int)data->count, E93318 ) ;
|
|
if ( count <= data->count )
|
|
return 1 ;
|
|
return 0 ;
|
|
}
|
|
|
|
#ifndef S4OFF_MULTI
|
|
/* note that S4OFF_MULTI version just calls dfile4recCount since checking of
|
|
locks and serverId are not required */
|
|
|
|
long S4FUNCTION d4recCountDo( DATA4 *data )
|
|
{
|
|
#ifdef S4VBASIC
|
|
if ( c4parm_check( data, 2, E93312 ) )
|
|
return -1L ;
|
|
#endif /* S4VBASIC */
|
|
|
|
#ifdef E4PARM_HIGH
|
|
if ( data == 0 )
|
|
return error4( 0, e4parm_null, E93312 ) ;
|
|
#endif
|
|
|
|
if ( data->dataFile->numRecs >= 0L )
|
|
{
|
|
#ifndef S4OFF_MULTI
|
|
if ( d4lockTestAppend( data ) != 1 )
|
|
return data->dataFile->minCount ;
|
|
else
|
|
#endif
|
|
return data->dataFile->numRecs ;
|
|
}
|
|
|
|
return dfile4recCount( data->dataFile, data4serverId( data ) ) ;
|
|
}
|
|
#endif
|
|
|
|
long S4FUNCTION d4recNo( DATA4 *data )
|
|
{
|
|
#ifdef S4VBASIC
|
|
if ( c4parm_check( data, 2, E93313 ) )
|
|
return -1L;
|
|
#endif /* S4VBASIC */
|
|
|
|
#ifdef E4PARM_HIGH
|
|
if ( data == 0 )
|
|
return error4( 0, e4parm_null, E93313 ) ;
|
|
#endif
|
|
|
|
return data->recNum ;
|
|
}
|
|
|
|
char *S4FUNCTION d4record( DATA4 *data )
|
|
{
|
|
#ifdef E4PARM_HIGH
|
|
if ( data == 0 )
|
|
{
|
|
error4( 0, e4parm_null, E93314 ) ;
|
|
return 0 ;
|
|
}
|
|
#endif
|
|
|
|
return data->record ;
|
|
}
|
|
|
|
#ifndef S4SERVER
|
|
long S4FUNCTION d4recPosition( DATA4 *data, const long rec )
|
|
{
|
|
#ifdef E4PARM_HIGH
|
|
if ( data == 0 || rec <= 0 )
|
|
return error4( 0, e4parm, E93315 ) ;
|
|
#endif
|
|
|
|
return dfile4recordPosition( data->dataFile, rec ) ;
|
|
}
|
|
#endif /* S4SERVER */
|
|
|
|
unsigned int S4FUNCTION d4recWidth( DATA4 *data )
|
|
{
|
|
#ifdef E4PARM_HIGH
|
|
if ( data == 0 )
|
|
{
|
|
error4( 0, e4parm_null, E93316 ) ;
|
|
return 0 ;
|
|
}
|
|
#endif
|
|
|
|
return dfile4recWidth( data->dataFile ) ;
|
|
}
|
|
|
|
#ifdef P4ARGS_USED
|
|
#pragma argsused
|
|
#endif
|
|
int d4verify( DATA4 *d4, const int subs )
|
|
{
|
|
#ifndef S4OFF_WRITE
|
|
#ifdef E4ANALYZE
|
|
int rc ;
|
|
#endif
|
|
#endif
|
|
|
|
if ( d4 == 0 )
|
|
return error4( d4->codeBase, e4parm_null, E93317 ) ;
|
|
|
|
if ( d4->trans == 0 )
|
|
return error4( 0, e4struct, E93317 ) ;
|
|
|
|
#ifndef S4OFF_WRITE
|
|
#ifdef E4ANALYZE
|
|
if ( subs == 1 )
|
|
if ( ( rc = tran4verify( d4->trans, 1 ) ) < 0 )
|
|
return rc ;
|
|
#endif
|
|
#endif
|
|
|
|
if ( d4->link.n == 0 || d4->link.p == 0 )
|
|
return error4( d4->codeBase, e4struct, E93317 ) ;
|
|
|
|
#ifndef S4CLIENT
|
|
if ( d4->dataFile == 0 )
|
|
return error4( d4->codeBase, e4struct, E93317 ) ;
|
|
|
|
#ifdef E4ANALYZE
|
|
if ( subs == 1 )
|
|
return dfile4verify( d4->dataFile, 0 ) ;
|
|
#endif
|
|
#endif
|
|
|
|
return 0 ;
|
|
}
|
|
|
|
#ifdef S4VB_DOS
|
|
|
|
char * d4alias_v( DATA4 *d4 )
|
|
{
|
|
return v4str( d4alias(d4) ) ;
|
|
}
|
|
|
|
void d4aliasSet( DATA4 *d4, const char *alias )
|
|
{
|
|
d4aliasSet( d4, c4str(alias) ) ;
|
|
}
|
|
|
|
#endif
|