/*++ Copyright (c) 1997-1999 Microsoft Corporation Module Name: jet.h Abstract: Some macros for use with Frs Jet Table routines. Author: David Orbits (davidor) - 7-Mar-1997 Revision History: --*/ #include #include #include #include "schema.h" #define CONSTANT_UNICODE_STRING(s) { sizeof( s ) - sizeof( WCHAR ), sizeof( s ), s } #define OFFSET(type, field) ((LONG)((ULONG_PTR)&((type *)0)->field)) #define SIZEOF(type, field) ((LONG)(sizeof(((type *)0)->field))) #define RECORD_FIELD(type, field, _dt) ((LONG)((ULONG_PTR)&((type *)0)->field)) , \ (USHORT)(_dt) , \ ((LONG)(sizeof(((type *)0)->field))) #define JET_COLUMN_ID_NIL 0xFFFFFFFF // // DbsRecordOperation options and special cases. // #define ROP_SEEK 0x00000000 #define ROP_READ 0x00000001 #define ROP_DELETE 0x00000002 #define DbsSeekRecord(_threadctx, _key, _index, _tablectx) \ ( DbsRecordOperation(_threadctx, ROP_SEEK, _key, _index, _tablectx) ) #define DbsReadRecord(_threadctx, _key, _index, _tablectx) \ ( DbsRecordOperation(_threadctx, ROP_READ, _key, _index, _tablectx) ) #define DbsDeleteRecord(_threadctx, _key, _index, _tablectx) \ ( DbsRecordOperation(_threadctx, ROP_DELETE, _key, _index, _tablectx) ) // // This macro closes a table and resets the TableCtx Tid and Sessid to Nil. // It first checks for a mismatch between the current session ID and the ID // in the TableCtx struct. // #define DbsCloseTable(_jerr, _Sesid, _TableCtx) \ \ if ((_TableCtx->Tid != JET_tableidNil) && \ IS_REPLICA_TABLE(_TableCtx->TableType)) { \ DPRINT4(5,"DbsCloseTable (%s%05d) Tid, Sesid = %08x, %08x\n", \ _TableCtx->pJetTableCreate->szTableName, \ _TableCtx->ReplicaNumber, \ _TableCtx->Tid, \ _Sesid); \ \ if (_Sesid != _TableCtx->Sesid) { \ DPRINT4(0, "++ DbsCloseTable (%s%05d) bad sesid : %d should be %d\n", \ _TableCtx->pJetTableCreate->szTableName, \ _TableCtx->ReplicaNumber, \ _Sesid, \ _TableCtx->Sesid); \ _jerr = JET_errInvalidSesid; \ } else { \ _jerr = JetCloseTable(_Sesid, _TableCtx->Tid); \ _TableCtx->Tid = JET_tableidNil; \ _TableCtx->Sesid = JET_sesidNil; \ } \ } else { \ DPRINT4(5,"ERROR - DbsCloseTable -- Table Already Closed or invalid tablectx." \ " TableType (%d) ReplicaNum (%d) Tid (%08x) Sesid (%08x)\n", \ _TableCtx->TableType, \ _TableCtx->ReplicaNumber, \ _TableCtx->Tid, \ _Sesid); \ _jerr = JET_errSuccess; \ } #define DBS_OPEN_TABLE(_ThreadCtx, _TableCtx, _ReplicaNumber, _TableName, _Tid) \ (FrsOpenTableSaveTid = (_TableCtx)->Tid , \ DbsOpenTable0((_ThreadCtx), (_TableCtx), (_ReplicaNumber), (_TableName), (_Tid))); \ \ if (FrsOpenTableSaveTid == JET_tableidNil) { \ DPRINT3(3,"FrsOpenTable (%20s) Tid, Sesid = %08x, %08x\n", \ _TableName, \ _TableCtx->Tid, \ _TableCtx->Sesid); \ } // // Macros to reference fields in the Jet Ret/Set Column structs via a TableCtx. // #define FRS_GET_RFIELD_LENGTH_ACTUAL(_TableCtx, _Field) (_TableCtx->pJetRetCol[_Field].cbActual) #define FRS_GET_RFIELD_LENGTH_LIMIT( _TableCtx, _Field) (_TableCtx->pJetRetCol[_Field].cbData) #define FRS_GET_RFIELD_ERROR( _TableCtx, _Field) (_TableCtx->pJetRetCol[_Field].err) #define FRS_GET_RFIELD_ADDRESS( _TableCtx, _Field) (_TableCtx->pJetRetCol[_Field].pvData) #define FRS_GET_RFIELD_COLUMNID( _TableCtx, _Field) (_TableCtx->pJetRetCol[_Field].columnid) #define FRS_GET_SFIELD_LENGTH_ACTUAL(_TableCtx, _Field) (_TableCtx->pJetSetCol[_Field].cbData) #define FRS_GET_SFIELD_LENGTH_LIMIT( _TableCtx, _Field) (_TableCtx->pJetSetCol[_Field].cbData) #define FRS_GET_SFIELD_ERROR( _TableCtx, _Field) (_TableCtx->pJetSetCol[_Field].err) #define FRS_GET_SFIELD_ADDRESS( _TableCtx, _Field) (_TableCtx->pJetSetCol[_Field].pvData) #define FRS_GET_SFIELD_COLUMNID( _TableCtx, _Field) (_TableCtx->pJetSetCol[_Field].columnid) #if DBG #define DBS_DISPLAY_RECORD_SEV(_Severity, _TableCtx, _Read) \ DbsDisplayRecord(_Severity, _TableCtx, _Read, DEBSUB, __LINE__, NULL, 0); #define DBS_DISPLAY_RECORD_SEV_COLS(_Severity, _TableCtx, _Read, _Cols, _NumCols) \ DbsDisplayRecord(_Severity, _TableCtx, _Read, DEBSUB, __LINE__, _Cols, _NumCols); #define FRS_DISPLAY_RECORD(_TableCtx, _Read) \ DbsDisplayRecord(0, _TableCtx, _Read, DEBSUB, __LINE__, NULL, 0); #else DBG #define DBS_DISPLAY_RECORD_SEV(_Severity, _TableCtx, _Read) #define DBS_DISPLAY_RECORD_SEV_COLS(_Severity, _TableCtx, _Read, _Cols, _NumCols) #define FRS_DISPLAY_RECORD(_TableCtx, _Read) #endif DBG #define JET_SUCCESS(_Status) ((_Status) == JET_errSuccess) // // Debug macro for table ctx struct. // #define DUMP_TABLE_CTX(_TableCtx) \ DPRINT2(5,"++ TableCtx: %s, pTableCtx %08x\n", _TableCtx->pJetTableCreate->szTableName, _TableCtx); \ DPRINT1(5,"++ Sesid = %8d\n", _TableCtx->Sesid); \ DPRINT1(5,"++ Tid = %8d\n", _TableCtx->Tid); \ DPRINT1(5,"++ ReplicaNumber = %8d\n", _TableCtx->ReplicaNumber); \ DPRINT1(5,"++ TableType = %8d\n", _TableCtx->TableType); \ DPRINT1(5,"++ PropertyFlags = %08x\n", _TableCtx->PropertyFlags); \ DPRINT1(5,"++ pJetTableCreate = %08x\n", _TableCtx->pJetTableCreate); \ DPRINT1(5,"++ pRecordFields = %08x\n", _TableCtx->pRecordFields); \ DPRINT1(5,"++ pJetSetCol = %08x\n", _TableCtx->pJetSetCol); \ DPRINT1(5,"++ pJetRetCol = %08x\n", _TableCtx->pJetRetCol); \ DPRINT1(5,"++ pDataRecord = %08x\n", _TableCtx->pDataRecord); \ DPRINT1(5,"++ cColumns = %8d\n", _TableCtx->pJetTableCreate->cColumns); \ DPRINT1(5,"++ rgcolumncreate = %08x\n", _TableCtx->pJetTableCreate->rgcolumncreate);\ DPRINT1(5,"++ ulPages = %8d\n", _TableCtx->pJetTableCreate->ulPages); \ DPRINT1(5,"++ ulDensity = %8d\n", _TableCtx->pJetTableCreate->ulDensity); \ DPRINT1(5,"++ cIndexes = %8d\n", _TableCtx->pJetTableCreate->cIndexes); \ DPRINT1(5,"++ rgindexcreate = %08x\n", _TableCtx->pJetTableCreate->rgindexcreate); \ DPRINT1(5,"++ grbit = %08x\n", _TableCtx->pJetTableCreate->grbit); \ DPRINT1(5,"++ tableid = %8d\n", _TableCtx->pJetTableCreate->tableid); \ DPRINT1(5,"++ cCreated objects= %8d\n", _TableCtx->pJetTableCreate->cCreated); \ DPRINT1(5,"++ TemplateTableName= %s\n", _TableCtx->pJetTableCreate->szTemplateTableName); #if 0 // // for future use. from ntfsprop.h // // // VARIABLE_STRUCTURE_SIZE returns the size of a structure S that contains // an array of C structures V // #define VARIABLE_STRUCTURE_SIZE(S,V,C) ((int)sizeof( S ) + ((C) - 1) * (int)sizeof( V )) typedef struct _PROPERTY_SPECIFIER { ULONG Variant; // Distinguish the type union { // Switch on Variant PROPID Id; // Property ID ULONG NameOffset; // Offset to COUNTED_STRING }; } PROPERTY_SPECIFIER, *PPROPERTY_SPECIFIER; // // PROPERTY_SPECIFICATIONS is a serialized form of an array PROPERTY_SPECIFIERs. // Immediately following PROPERTY_SPECIFICATIONS on a USHORT boundary are // of the name strings. Each name string is a COUNTED_STRING // typedef struct _PROPERTY_SPECIFICATIONS { ULONG Length; // Length in bytes of structure and name strings ULONG Count; // Count of PROPERTY_SPECIFIERS PROPERTY_SPECIFIER Specifiers[1]; // Array of actual specifiers, length Count } PROPERTY_SPECIFICATIONS, *PPROPERTY_SPECIFICATIONS; #define PROPERTY_SPECIFICATIONS_SIZE(c) \ (VARIABLE_STRUCTURE_SIZE( PROPERTY_SPECIFICATIONS, PROPERTY_SPECIFIER, (c) )) #define PROPERTY_SPECIFIER_ID(PS,I) \ ((PS)->Specifiers[(I)].Id) #define PROPERTY_SPECIFIER_COUNTED_STRING(PS,I) \ ((PCOUNTED_STRING)Add2Ptr( (PS), (PS)->Specifiers[(I)].NameOffset)) #define PROPERTY_SPECIFIER_NAME(PS,I) \ (&PROPERTY_SPECIFIER_COUNTED_STRING( PS, I )->Text[0]) #define PROPERTY_SPECIFIER_NAME_LENGTH(PS,I) \ (PROPERTY_SPECIFIER_COUNTED_STRING( PS, I )->Length) #endif