/* d4top.c (c)Copyright Sequiter Software Inc., 1988-1996. All rights reserved. */ #include "d4all.h" #ifndef S4UNIX #ifdef __TURBOC__ #pragma hdrstop #endif /* __TUROBC__ */ #endif /* S4UNIX */ #ifdef S4CLIENT int S4FUNCTION d4top( DATA4 *data ) { #ifndef S4OFF_INDEX TAG4 *tag ; #endif int rc ; CONNECTION4 *connection ; CONNECTION4TOP_INFO_IN info ; CONNECTION4TOP_INFO_OUT *out ; CODE4 *c4 ; #ifdef S4VBASIC if ( c4parm_check( data, 2, E92301 ) ) return -1 ; #endif #ifdef E4PARM_HIGH if ( data == 0 ) return error4( 0, e4parm_null, E92301 ) ; #endif c4 = data->codeBase ; if ( error4code( c4 ) < 0 ) return e4codeBase ; #ifndef S4OFF_WRITE rc = d4updateRecord( data, 0 ) ; if ( rc ) return rc ; #endif connection = data->dataFile->connection ; if ( connection == 0 ) return e4connection ; data->recNum = -1 ; connection4assign( connection, CON4TOP, data4clientId( data ), data4serverId( data ) ) ; #ifdef S4OFF_INDEX info.usesTag = 0 ; #else tag = data->tagSelected ; if ( tag == 0 ) info.usesTag = 0 ; else { info.usesTag = 1 ; memcpy( info.tagName, tag->tagFile->alias, LEN4TAG_ALIAS ) ; info.tagName[LEN4TAG_ALIAS] = 0 ; } #endif connection4addData( connection, &info, sizeof( CONNECTION4TOP_INFO_IN ), 0 ) ; rc = connection4repeat( connection, -2, -1, -1, data ) ; switch( rc ) { case r4eof: data->bofFlag = 1 ; return d4goEof( data ) ; case r4success: break ; default: if ( rc < 0 ) connection4error( connection, c4, rc, E92301 ) ; return rc ; } if ( connection4len( connection ) != (long)sizeof( CONNECTION4TOP_INFO_OUT ) + (long)dfile4recWidth( data->dataFile ) ) return error4( c4, e4packetLen, E92301 ) ; out = (CONNECTION4TOP_INFO_OUT *)connection4data( connection ) ; /* now copy the data into the record */ memcpy( data->record, ((char *)out) + sizeof( CONNECTION4TOP_INFO_OUT ), dfile4recWidth( data->dataFile ) ) ; data->bofFlag = out->bofFlag ; data->eofFlag = out->eofFlag ; data->recNum = out->recNo ; if ( out->recordLocked == 1 ) { d4localLockSet( data, out->recNo ) ; memcpy( data->recordOld, data->record, dfile4recWidth( data->dataFile ) ) ; data->recNumOld = data->recNum ; data->memoValidated = 1 ; } return 0 ; } #else int S4FUNCTION d4top( DATA4 *data ) { int rc ; CODE4 *c4 ; #ifndef S4OFF_INDEX long recno ; TAG4 *tag ; TAG4FILE *tagFile ; #endif #ifndef S4SERVER int saveFlag ; #endif #ifdef S4VBASIC if ( c4parm_check( data, 2, E92301 ) ) return -1; #endif /* S4VBASIC */ #ifdef E4PARM_HIGH if ( data == 0 ) return error4( 0, e4parm_null, E92301 ) ; #endif c4 = data->codeBase ; if ( error4code( c4 ) < 0 ) return -1 ; #ifndef S4OFF_INDEX tag = data->tagSelected ; if ( tag == 0 ) { #endif if ( d4recCount( data ) > 0L ) { #ifndef S4SERVER saveFlag = c4->errGo ; c4->errGo = 0 ; #endif rc = d4go( data, 1L ) ; #ifndef S4SERVER c4->errGo = saveFlag ; #endif return rc ; } #ifndef S4OFF_INDEX } else { tagFile = tag->tagFile ; #ifndef S4OFF_WRITE rc = d4updateRecord( data, 0 ) ; /* was 1 */ if ( rc ) return rc ; #endif t4versionCheck( tag, 0, 0 ) ; rc = tfile4top( tagFile ) ; if ( rc ) return rc ; if ( !tfile4eof( tagFile ) ) { recno = tfile4recNo( tagFile ) ; if ( recno < 0 ) return (int)recno ; rc = d4go( data, recno ) ; #ifndef S4OFF_MULTI #ifndef S4OFF_TRAN if ( rc == 0 ) if ( code4transEnabled( c4 ) ) if ( t4unique( tag ) != 0 ) #ifdef S4SERVER if ( !dfile4lockTestFile( data->dataFile, data4clientId( data ), data4serverId( data ) ) ) #else if ( !d4lockTestFile( data ) ) #endif rc = d4tagSyncDo( data, tag, 1 ) ; #endif #endif return rc ; } } #endif data->bofFlag = 1 ; return d4goEof( data ) ; } #endif /* S4CLIENT */ int S4FUNCTION d4goBof( DATA4 *data ) { int rc ; #ifdef E4PARM_HIGH if ( data == 0 ) return error4( 0, e4parm_null, E93104 ) ; #endif if ( error4code( data->codeBase ) < 0 ) return e4codeBase ; #ifndef S4OFF_WRITE rc = d4updateRecord( data, 1 ) ; if ( rc ) return rc ; #endif rc = d4top( data ) ; data->bofFlag = 1 ; if ( rc < 0 ) return rc ; return r4bof ; }