af15e0698b
git-svn-id: svn://10.65.10.50/trunk@4679 c028cbd2-c16b-5b4b-a496-9718f37d4682
218 lines
4.9 KiB
C
Executable File
218 lines
4.9 KiB
C
Executable File
/* d4remove.c (c)Copyright Sequiter Software Inc., 1988-1996. All rights reserved. */
|
|
|
|
#include "d4all.h"
|
|
#ifndef S4UNIX
|
|
#ifdef __TURBOC__
|
|
#pragma hdrstop
|
|
#endif
|
|
#endif
|
|
|
|
#ifndef S4SERVER
|
|
int S4FUNCTION d4remove( DATA4 *data )
|
|
{
|
|
int rc ;
|
|
CODE4 *c4 ;
|
|
|
|
#ifdef E4PARM_HIGH
|
|
if ( data == 0 )
|
|
return error4( 0, e4parm_null, E96401 ) ;
|
|
#endif
|
|
|
|
/* for c/s, server takes care of determining this info... */
|
|
#ifdef S4STAND_ALONE
|
|
#ifndef S4OFF_TRAN
|
|
if ( code4transEnabled( data->codeBase ) )
|
|
if ( tran4active( data->codeBase, data ) != 0 )
|
|
return error4( data->codeBase, e4transViolation, E81521 ) ;
|
|
#endif
|
|
#endif
|
|
|
|
c4 = data->codeBase;
|
|
c4->doRemove = 1 ;
|
|
rc = d4close( data ) ;
|
|
c4->doRemove = 0 ;
|
|
|
|
return rc ;
|
|
}
|
|
#endif /* S4SERVER */
|
|
|
|
#ifdef S4CLIENT
|
|
int dfile4remove( DATA4FILE *data )
|
|
{
|
|
CODE4 *c4 ;
|
|
int finalRc ;
|
|
INDEX4FILE *i4 ;
|
|
|
|
#ifdef E4PARM_LOW
|
|
if ( data == 0 )
|
|
return error4( 0, e4parm_null, E96401 ) ;
|
|
#endif
|
|
|
|
#ifdef E4ANALYZE
|
|
if ( data->userCount <= 0 )
|
|
return error4( 0, e4struct, E96401 ) ;
|
|
#endif
|
|
|
|
c4 = data->c4 ;
|
|
finalRc = error4set( c4, 0 ) ;
|
|
|
|
data->userCount-- ;
|
|
if ( data->userCount == 0 )
|
|
{
|
|
if ( data->info != 0 )
|
|
{
|
|
u4free( data->info ) ;
|
|
data->info = 0 ;
|
|
}
|
|
|
|
if ( data->connection == 0 )
|
|
finalRc = e4connection ;
|
|
else
|
|
{
|
|
connection4assign( data->connection, CON4REMOVE, 0, data->serverId ) ;
|
|
connection4send( data->connection ) ;
|
|
finalRc = connection4receive( data->connection ) ;
|
|
if ( finalRc == 0 )
|
|
finalRc = connection4status( data->connection ) ;
|
|
}
|
|
|
|
#ifndef S4OFF_INDEX
|
|
for ( ;; )
|
|
{
|
|
i4 = (INDEX4FILE *)l4first( &data->indexes ) ;
|
|
if ( i4 == 0 )
|
|
break ;
|
|
index4close( i4 ) ;
|
|
}
|
|
#endif
|
|
|
|
l4remove( &c4->dataFileList, data ) ;
|
|
mem4free( c4->data4fileMemory, data ) ;
|
|
error4set( c4, finalRc ) ;
|
|
return finalRc ;
|
|
}
|
|
else
|
|
return error4( 0, e4remove, E86402 ) ;
|
|
}
|
|
#else
|
|
|
|
#ifdef S4SERVER
|
|
int d4clearTables( DATA4FILE *data )
|
|
{
|
|
CODE4 *c4 ;
|
|
#ifndef S4OFF_CATALOG
|
|
TAG4 *tag ;
|
|
CATALOG4 *catalog ;
|
|
#ifndef S4OFF_SECURITY
|
|
TAG4 *secTag ;
|
|
DATA4 *table ;
|
|
#endif
|
|
#endif
|
|
|
|
c4 = data->c4 ;
|
|
|
|
#ifndef S4OFF_CATALOG
|
|
catalog = c4->catalog ;
|
|
if ( catalog != 0 )
|
|
if ( catalog->catalogStatus )
|
|
{
|
|
tag = d4tag( catalog->data, "PATH" ) ;
|
|
if ( tag == 0 )
|
|
return error4( c4, e4info, E81403 ) ;
|
|
d4tagSelect( catalog->data, tag ) ;
|
|
#ifndef S4OFF_SECURITY
|
|
table = c4->server->tableAuth ;
|
|
if ( table != 0 )
|
|
{
|
|
secTag = d4tag( table, "ALIAS" ) ;
|
|
if ( secTag == 0 )
|
|
return error4( c4, e4info, E70220 ) ;
|
|
d4tagSelect( table, secTag ) ;
|
|
}
|
|
#endif
|
|
for ( ;; )
|
|
{
|
|
if ( error4code( c4 ) != 0 )
|
|
return -1 ;
|
|
if ( d4seek( catalog->data, data->file.name ) == 0 )
|
|
{
|
|
#ifndef S4OFF_SECURITY
|
|
if ( table != 0 )
|
|
{
|
|
if ( d4seek( table, cat4alias( catalog ) ) == 0 )
|
|
{
|
|
d4delete( table ) ;
|
|
d4update( table ) ;
|
|
}
|
|
}
|
|
#endif
|
|
d4delete( catalog->data ) ;
|
|
d4update( catalog->data ) ;
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
return 0 ;
|
|
}
|
|
#endif
|
|
|
|
int S4FUNCTION dfile4remove( DATA4FILE *data )
|
|
{
|
|
int rc ;
|
|
#ifndef S4INDEX_OFF
|
|
#ifdef N4OTHER
|
|
TAG4FILE *tagOn ;
|
|
#else
|
|
INDEX4FILE *indexOn ;
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef E4PARM_HIGH
|
|
if ( data == 0 )
|
|
return error4( 0, e4parm_null, E96401 ) ;
|
|
#endif
|
|
|
|
if ( data->userCount != 0 )
|
|
return error4( 0, e4parm_null, E86402 ) ;
|
|
|
|
#ifdef S4SERVER
|
|
/* remove entries in all tables */
|
|
d4clearTables( data ) ;
|
|
#endif
|
|
|
|
#ifndef S4INDEX_OFF
|
|
#ifdef N4OTHER
|
|
for( tagOn = 0;; )
|
|
{
|
|
tagOn = dfile4tagNext( data, tagOn ) ;
|
|
if ( tagOn == 0 )
|
|
break ;
|
|
|
|
tagOn->file.isTemp = 1 ;
|
|
}
|
|
#else
|
|
for( indexOn = 0 ;; )
|
|
{
|
|
indexOn = (INDEX4FILE *)l4next( &data->indexes, indexOn ) ;
|
|
if ( indexOn == 0 )
|
|
break ;
|
|
|
|
indexOn->file.isTemp = 1 ;
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
data->file.isTemp = 1 ;
|
|
|
|
#ifndef S4MEMO_OFF
|
|
if (data->nFieldsMemo )
|
|
data->memoFile.file.isTemp = 1 ;
|
|
#endif
|
|
|
|
rc = dfile4closeLow( data ) ;
|
|
|
|
return rc ;
|
|
}
|
|
#endif /* S4CLIENT */
|