/*++ Copyright (c) 1997-1999 Microsoft Corporation Module Name: tablefcn.h Abstract: Defines the function prototypes for the functions used to access the Jet database tables. Include after frsalloc.h Author: David Orbits (davidor) - 10-Apr-1997 Revision History: */ JET_ERR DbsCreateJetSession( IN OUT PTHREAD_CTX ThreadCtx ); JET_ERR DbsCloseJetSession( IN PTHREAD_CTX ThreadCtx ); JET_ERR DbsInsertTable2( IN PTABLE_CTX TableCtx ); JET_ERR DbsTableMoveFirst( IN PTHREAD_CTX ThreadCtx, IN PTABLE_CTX TableCtx, IN ULONG ReplicaNumber, IN ULONG RecordIndex ); JET_ERR DbsOpenTable0( IN PTHREAD_CTX ThreadCtx, IN PTABLE_CTX TableCtx, IN ULONG ReplicaNumber, OUT PCHAR TableName, OUT JET_TABLEID *Tid ); JET_ERR DbsOpenReplicaTables ( IN PTHREAD_CTX ThreadCtx, IN PREPLICA Replica, IN PREPLICA_THREAD_CTX RtCtx ); FRS_ERROR_CODE DbsCloseSessionReplicaTables ( IN PTHREAD_CTX ThreadCtx, IN OUT PREPLICA Replica ); JET_ERR DbsCloseReplicaTables ( IN PTHREAD_CTX ThreadCtx, IN PREPLICA Replica, IN PREPLICA_THREAD_CTX RtCtx, IN BOOL SessionErrorCheck ); VOID DbsSetJetColAddr ( IN PTABLE_CTX TableCtx ); VOID DbsSetJetColSize( IN PTABLE_CTX TableCtx ); NTSTATUS DbsAllocRecordStorage( IN OUT PTABLE_CTX TableCtx ); JET_ERR DbsCheckSetRetrieveErrors( IN OUT PTABLE_CTX TableCtx ); #if DBG VOID DbsDisplayRecord( IN ULONG Severity, IN PTABLE_CTX TableCtx, IN BOOL Read, IN PCHAR Debsub, IN ULONG uLineNo, IN PULONG RecordFieldx, IN ULONG FieldCount ); #endif DBG JET_ERR DbsRecordOperation( IN PTHREAD_CTX ThreadCtx, IN ULONG Operation, IN PVOID KeyValue, IN ULONG RecordIndex, IN PTABLE_CTX TableCtx ); ULONG DbsRecordOperationMKey( IN PTHREAD_CTX ThreadCtx, IN ULONG Operation, IN PVOID *KeyValueArray, IN ULONG RecordIndex, IN PTABLE_CTX TableCtx ); JET_ERR DbsWriteReplicaTableRecord( IN PTHREAD_CTX ThreadCtx, IN ULONG ReplicaNumber, IN PTABLE_CTX TableCtx ); ULONG DbsWriteTableField( IN PTHREAD_CTX ThreadCtx, IN ULONG ReplicaNumber, IN PTABLE_CTX TableCtx, IN ULONG RecordFieldx ); ULONG DbsWriteTableFieldMult( IN PTHREAD_CTX ThreadCtx, IN ULONG ReplicaNumber, IN PTABLE_CTX TableCtx, IN PULONG RecordFieldx, IN ULONG FieldCount ); PVOID DbsDataExtensionFind( IN PVOID ExtBuf, IN DATA_EXTENSION_TYPE_CODES TypeCode ); VOID DbsDataInitCocExtension( IN PCHANGE_ORDER_RECORD_EXTENSION CocExt ); VOID DbsDataInitIDTableExtension( IN PIDTABLE_RECORD_EXTENSION IdtExt ); DWORD FrsGetOrSetFileObjectId( IN HANDLE Handle, IN LPCWSTR FileName, IN BOOL CallerSupplied, OUT PFILE_OBJECTID_BUFFER ObjectIdBuffer ); ULONG ChgOrdInboundRetired( IN PCHANGE_ORDER_ENTRY ChangeOrder ); ULONG ChgOrdInboundRetry( IN PCHANGE_ORDER_ENTRY ChangeOrder, IN ULONG NewState ); // // DB Service access functions. // VOID DbsInitialize( VOID ); VOID DbsShutDown( VOID ); PTABLE_CTX DbsCreateTableContext( IN ULONG TableType ); ULONG DbsOpenTable( IN PTHREAD_CTX ThreadCtx, IN PTABLE_CTX TableCtx, IN ULONG ReplicaNumber, IN ULONG TableType, IN PVOID DataRecord ); BOOL DbsFreeTableContext( IN PTABLE_CTX TableCtx, IN JET_SESID Sesid ); PCOMMAND_PACKET DbsPrepareCmdPkt ( PCOMMAND_PACKET CmdPkt, PREPLICA Replica, ULONG CmdRequest, PTABLE_CTX TableCtx, PVOID CallContext, ULONG TableType, ULONG AccessRequest, ULONG IndexType, PVOID KeyValue, ULONG KeyValueLength, BOOL Submit ); PCOMMAND_PACKET DbsPrepFieldUpdateCmdPkt ( PCOMMAND_PACKET CmdPkt, PREPLICA Replica, PTABLE_CTX TableCtx, PVOID CallContext, ULONG TableType, ULONG IndexType, PVOID KeyValue, ULONG KeyValueLength, ULONG FieldCount, PULONG FieldIDList ); ULONG DbsInitializeIDTableRecord( IN OUT PTABLE_CTX TableCtx, IN HANDLE FileHandle, IN PREPLICA Replica, IN PCHANGE_ORDER_ENTRY ChangeOrder, IN PWCHAR FileName, IN OUT BOOL *ExistingOid ); VOID DbsDBInitConfigRecord( IN PTABLE_CTX TableCtx, IN GUID *ReplicaSetGuid, IN PWCHAR ReplicaSetName, IN ULONG ReplicaNumber, IN PWCHAR ReplicaRootPath, IN PWCHAR ReplicaStagingPath, IN PWCHAR ReplicaVolume ); ULONG DbsFidToGuid( IN PTHREAD_CTX ThreadCtx, IN PREPLICA Replica, IN PTABLE_CTX TableCtx, IN PULONGLONG Fid, OUT GUID *Guid ); ULONG DbsGuidToFid( IN PTHREAD_CTX ThreadCtx, IN PREPLICA Replica, IN PTABLE_CTX TableCtx, IN GUID *Guid, OUT PULONGLONG Fid ); ULONG DbsInitOneReplicaSet( PREPLICA Replica ); ULONG DbsFreeRtCtx( IN PTHREAD_CTX ThreadCtx, IN PREPLICA Replica, IN PREPLICA_THREAD_CTX RtCtx, IN BOOL SessionErrorCheck ); JET_ERR DbsDeleteTableRecord( IN PTABLE_CTX TableCtx ); ULONG DbsDeleteTableRecordByIndex( IN PTHREAD_CTX ThreadCtx, IN PREPLICA Replica, IN PTABLE_CTX TableCtx, IN PVOID pIndex, IN ULONG IndexType, IN ULONG TableType ); #define DbsDeleteIDTableRecord(_ThreadCtx_, _Replica_, _TableCtx_, _pIndex_) \ DbsDeleteTableRecordByIndex(_ThreadCtx_, \ _Replica_, \ _TableCtx_, \ _pIndex_, \ GuidIndexx, \ IDTablex) #define DbsDeleteDIRTableRecord(_ThreadCtx_, _Replica_, _TableCtx_, _pIndex_) \ DbsDeleteTableRecordByIndex(_ThreadCtx_, \ _Replica_, \ _TableCtx_, \ _pIndex_, \ DFileGuidIndexx, \ DIRTablex) ULONG DbsReadTableRecordByIndex( IN PTHREAD_CTX ThreadCtx, IN PREPLICA Replica, IN PTABLE_CTX TableCtx, IN PVOID pIndex, IN ULONG IndexType, IN ULONG TableType ); ULONG DbsUpdateTableRecordByIndex( IN PTHREAD_CTX ThreadCtx, IN PREPLICA Replica, IN PTABLE_CTX TableCtx, IN PVOID pIndex, IN ULONG IndexType, IN ULONG TableType ); ULONG DbsInsertTable( IN PTHREAD_CTX ThreadCtx, IN PREPLICA Replica, IN PTABLE_CTX TableCtx, IN ULONG TableType, IN PVOID DataRecord ); ULONG DbsTableMoveToRecord( IN PTHREAD_CTX ThreadCtx, IN PTABLE_CTX TableCtx, IN ULONG RecordIndex, IN ULONG MoveArg ); #define FrsMoveFirst JET_MoveFirst #define FrsMovePrevious JET_MovePrevious #define FrsMoveNext JET_MoveNext #define FrsMoveLast JET_MoveLast ULONG DbsTableRead( IN PTHREAD_CTX ThreadCtx, IN PTABLE_CTX TableCtx ); ULONG DbsUpdateRecordField( IN PTHREAD_CTX ThreadCtx, IN PREPLICA Replica, IN PTABLE_CTX TableCtx, IN ULONG IndexField, IN PVOID IndexValue, IN ULONG UpdateField ); ULONG DbsRequestSaveMark( PVOLUME_MONITOR_ENTRY pVme, BOOL Wait ); ULONG DbsRequestReplicaServiceStateSave( IN PREPLICA Replica, IN BOOL Wait ); ULONG DbsUpdateVV( IN PTHREAD_CTX ThreadCtx, IN PREPLICA Replica, IN PREPLICA_THREAD_CTX RtCtx, IN ULONGLONG OriginatorVsn, IN GUID *OriginatorGuid ); // // An enumerate table function is passed as a parameter to FrsEnumerateTable(). // It gets a PTHREAD_CTX, PTABLE_CTX and a pointer to a data record from the // table. It does its processing of the record data and returns a JET_ERR // status. If the status is JET_errSuccess it will be called with the next // record in the table. IF the status is NOT JET_errSuccess, that status is // returned as the status result of the FrsEnumerateTable() function. If // the status is JET_errInvalidObject then re-read the record and call the table // function again. // // typedef JET_ERR (NTAPI *PENUMERATE_TABLE_ROUTINE) ( IN PTHREAD_CTX ThreadCtx, IN PTABLE_CTX TableCtx, IN PVOID Record, IN PVOID Context ); typedef JET_ERR (NTAPI *PENUMERATE_TABLE_PREREAD) ( IN PTHREAD_CTX ThreadCtx, IN PTABLE_CTX TableCtx, IN PVOID Context ); typedef JET_ERR (NTAPI *PENUMERATE_OUTLOGTABLE_ROUTINE) ( IN PTHREAD_CTX ThreadCtx, IN PTABLE_CTX TableCtx, IN PCHANGE_ORDER_COMMAND CoCmd, IN PVOID Context, IN ULONG OutLogSeqNumber ); JET_ERR DbsEnumerateTable2( IN PTHREAD_CTX ThreadCtx, IN PTABLE_CTX TableCtx, IN ULONG RecordIndex, IN PENUMERATE_TABLE_ROUTINE RecordFunction, IN PVOID Context, IN PENUMERATE_TABLE_PREREAD PreReadFunction ); JET_ERR DbsEnumerateTableFrom( IN PTHREAD_CTX ThreadCtx, IN PTABLE_CTX TableCtx, IN ULONG RecordIndex, IN PVOID KeyValue, IN INT ScanDirection, IN PENUMERATE_TABLE_ROUTINE RecordFunction, IN PVOID Context, IN PENUMERATE_TABLE_PREREAD PreReadFunction ); #define FrsEnumerateTable(_TH, _TC, _RI, _RF, _CTX) \ DbsEnumerateTable2(_TH, _TC, _RI, _RF, _CTX, NULL) #define FrsEnumerateTableFrom(_TH, _TC, _RI, _KV, _SD, _RF, _CTX) \ DbsEnumerateTableFrom(_TH, _TC, _RI, _KV, _SD, _RF, _CTX, NULL) // // An enumerate directory function is passed as a parameter to // FrsEnumerateDirectory(). // // The function gets a the directory handle and a pointer to a directory // record from the directory. It does its processing of the directory // data and returns a WIN32 STATUS. If the status is ERROR_SUCCESS it // will be called with the next record in the directory. IF the status // is NOT ERROR_SUCCESS, that status is returned as the status result of // the FrsEnumerateDirectory() function and enumeration stops. // // The function is responsible for recursing into the next level of // directory by calling FrsEnumerateDirectoryRecurse() as needed. // // FrsEnumerateDirectory() will continue an enumeration even if // errors occur if ENUMERATE_DIRECTORY_FLAGS_ERROR_CONTINUE is set. // // FrsEnumerateDirectory() will skip non-directory entries if // if ENUMERATE_DIRECTORY_FLAGS_DIRECTORIES_ONLY is set. // #define ENUMERATE_DIRECTORY_FLAGS_NONE (0x00000000) #define ENUMERATE_DIRECTORY_FLAGS_ERROR_CONTINUE (0x00000001) #define ENUMERATE_DIRECTORY_FLAGS_DIRECTORIES_ONLY (0x00000002) typedef DWORD (NTAPI *PENUMERATE_DIRECTORY_ROUTINE) ( IN HANDLE DirectoryHandle, IN PWCHAR DirectoryName, IN DWORD DirectoryLevel, IN PFILE_DIRECTORY_INFORMATION DirectoryRecord, IN DWORD DirectoryFlags, IN PWCHAR FileName, IN PVOID Context ); DWORD FrsEnumerateDirectoryDeleteWorker( IN HANDLE DirectoryHandle, IN PWCHAR DirectoryName, IN DWORD DirectoryLevel, IN PFILE_DIRECTORY_INFORMATION DirectoryRecord, IN DWORD DirectoryFlags, IN PWCHAR FileName, IN PVOID Ignored ); DWORD FrsEnumerateDirectoryRecurse( IN HANDLE DirectoryHandle, IN PWCHAR DirectoryName, IN DWORD DirectoryLevel, IN PFILE_DIRECTORY_INFORMATION DirectoryRecord, IN DWORD DirectoryFlags, IN PWCHAR FileName, IN HANDLE FileHandle, IN PVOID Context, IN PENUMERATE_DIRECTORY_ROUTINE Function ); DWORD FrsEnumerateDirectory( IN HANDLE DirectoryHandle, IN PWCHAR DirectoryName, IN DWORD DirectoryLevel, IN DWORD DirectoryFlags, IN PVOID Context, IN PENUMERATE_DIRECTORY_ROUTINE Function );