campo-sirio/cb/source/d4remove.c
alex af15e0698b Codebase
git-svn-id: svn://10.65.10.50/trunk@4679 c028cbd2-c16b-5b4b-a496-9718f37d4682
1997-06-16 13:01:08 +00:00

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 */