Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

590 lines
12 KiB

/*++
Copyright (c) 1998 Microsoft Corporation
Module Name:
database.h
Abstract:
SIS Groveler Jet-Blue database include file
Authors:
Cedric Krumbein, 1998
Environment:
User Mode
Revision History:
--*/
#define USERNAME ""
#define PASSWORD ""
#define TABLE_PAGES 50
#define TABLE_DENSITY 50
#define MIN_VER_PAGES 128
#define MAX_DATABASE_CACHE_SIZE (6*1024*1024)
#define COUNTRY_CODE 1
#define LANG_ID 0x0409
#define CODE_PAGE 1252
#define COLLATE 0
#define MAX_KEYS 3
#define MAX_COLUMNS 8
#define MAX_LIST_NAME_LEN 255
#define GET_ALL_MASK (~0U)
typedef struct {
CHAR *name;
DWORD size;
DWORD offset;
JET_COLTYP coltyp;
JET_GRBIT grbit;
} ColumnSpec;
/***************************** Table parameters ******************************/
#define TABLE_NAME "SGTable"
typedef DWORDLONG Signature;
typedef GUID CSID;
typedef struct _SGNativeTableEntry {
DWORDLONG fileID;
DWORDLONG fileSize;
Signature signature;
DWORD attributes;
CSID csIndex;
DWORDLONG createTime;
DWORDLONG writeTime;
} SGNativeTableEntry;
#define TABLE_COL_NUM_FILE_ID 0
#define TABLE_COL_NUM_SIZE 1
#define TABLE_COL_NUM_SIG 2
#define TABLE_COL_NUM_ATTR 3
#define TABLE_COL_NUM_CSIDLO 4
#define TABLE_COL_NUM_CSIDHI 5
#define TABLE_COL_NUM_CR_TIME 6
#define TABLE_COL_NUM_WR_TIME 7
#define TABLE_NCOLS 8
#define TABLE_COL_NAME_FILE_ID "FileID"
#define TABLE_COL_NAME_SIZE "FileSize"
#define TABLE_COL_NAME_SIG "Signature"
#define TABLE_COL_NAME_ATTR "Attributes"
#define TABLE_COL_NAME_CSIDLO "CSIndexLo"
#define TABLE_COL_NAME_CSIDHI "CSIndexHi"
#define TABLE_COL_NAME_CR_TIME "CreateTime"
#define TABLE_COL_NAME_WR_TIME "WriteTime"
#define TABLE_KEY_NAME_FILE_ID "FileIDKey"
#define TABLE_KEY_NAME_ATTR "AttributeKey"
#define TABLE_KEY_NAME_CSID "CSIndexKey"
#define TABLE_KEY_NCOLS_FILE_ID 1
#define TABLE_KEY_NCOLS_ATTR 3
#define TABLE_KEY_NCOLS_CSID 2
#define TABLE_EXCLUDE_FILE_ID_MASK \
(~(1U << TABLE_COL_NUM_FILE_ID))
#define TABLE_EXCLUDE_ATTR_MASK \
(~(1U << TABLE_COL_NUM_SIZE \
| 1U << TABLE_COL_NUM_SIG \
| 1U << TABLE_COL_NUM_ATTR))
#define TABLE_EXCLUDE_CS_INDEX_MASK \
(~(1U << TABLE_COL_NUM_CSIDLO \
| 1U << TABLE_COL_NUM_CSIDHI))
static ColumnSpec
tableColDefFileID = {
TABLE_COL_NAME_FILE_ID,
sizeof(DWORDLONG),
offsetof(SGNativeTableEntry, fileID),
JET_coltypCurrency,
0
},
tableColDefSize = {
TABLE_COL_NAME_SIZE,
sizeof(DWORDLONG),
offsetof(SGNativeTableEntry, fileSize),
JET_coltypCurrency,
0
},
tableColDefSig = {
TABLE_COL_NAME_SIG,
sizeof(Signature),
offsetof(SGNativeTableEntry, signature),
JET_coltypCurrency,
0
},
tableColDefAttr = {
TABLE_COL_NAME_ATTR,
sizeof(DWORD),
offsetof(SGNativeTableEntry, attributes),
JET_coltypLong,
0
},
tableColDefCSIDlo = {
TABLE_COL_NAME_CSIDLO,
sizeof(DWORDLONG),
offsetof(SGNativeTableEntry, csIndex),
JET_coltypCurrency,
0
},
tableColDefCSIDhi = {
TABLE_COL_NAME_CSIDHI,
sizeof(DWORDLONG),
offsetof(SGNativeTableEntry, csIndex) + sizeof(DWORDLONG),
JET_coltypCurrency,
0
},
tableColDefCrTime = {
TABLE_COL_NAME_CR_TIME,
sizeof(DWORDLONG),
offsetof(SGNativeTableEntry, createTime),
JET_coltypCurrency,
0
},
tableColDefWrTime = {
TABLE_COL_NAME_WR_TIME,
sizeof(DWORDLONG),
offsetof(SGNativeTableEntry, writeTime),
JET_coltypCurrency,
0
},
*tableColumnSpecs[TABLE_NCOLS] = {
&tableColDefFileID,
&tableColDefSize,
&tableColDefSig,
&tableColDefAttr,
&tableColDefCSIDlo,
&tableColDefCSIDhi,
&tableColDefCrTime,
&tableColDefWrTime
},
*tableKeyFileID[TABLE_KEY_NCOLS_FILE_ID] = {
&tableColDefFileID
},
*tableKeyAttr[TABLE_KEY_NCOLS_ATTR] = {
&tableColDefSize,
&tableColDefSig,
&tableColDefAttr,
},
*tableKeyCSID[TABLE_KEY_NCOLS_CSID] = {
&tableColDefCSIDlo,
&tableColDefCSIDhi,
};
/***************************** Queue parameters ******************************/
#define QUEUE_NAME "SGQueue"
typedef struct _SGNativeQueueEntry {
DWORDLONG fileID;
DWORDLONG parentID;
DWORD reason;
DWORD order;
DWORDLONG readyTime;
DWORDLONG retryTime;
TCHAR *fileName;
} SGNativeQueueEntry;
#define QUEUE_COL_NUM_FILE_ID 0
#define QUEUE_COL_NUM_PARENT_ID 1
#define QUEUE_COL_NUM_REASON 2
#define QUEUE_COL_NUM_ORDER 3
#define QUEUE_COL_NUM_READY_TIME 4
#define QUEUE_COL_NUM_RETRY_TIME 5
#define QUEUE_COL_NUM_NAME 6
#define QUEUE_NCOLS 7
#define QUEUE_COL_NAME_FILE_ID "FileID"
#define QUEUE_COL_NAME_PARENT_ID "ParentID"
#define QUEUE_COL_NAME_REASON "Reason"
#define QUEUE_COL_NAME_ORDER "Order"
#define QUEUE_COL_NAME_READY_TIME "ReadyTime"
#define QUEUE_COL_NAME_RETRY_TIME "RetryTime"
#define QUEUE_COL_NAME_NAME "FileName"
#define QUEUE_KEY_NAME_READY_TIME "ReadyTimeKey"
#define QUEUE_KEY_NAME_FILE_ID "FileIDKey"
#define QUEUE_KEY_NAME_ORDER "Order"
#define QUEUE_KEY_NCOLS_READY_TIME 1
#define QUEUE_KEY_NCOLS_FILE_ID 1
#define QUEUE_KEY_NCOLS_ORDER 1
#define QUEUE_EXCLUDE_FILE_ID_MASK \
(~(1U << QUEUE_COL_NUM_FILE_ID))
static ColumnSpec
queueColDefFileID = {
QUEUE_COL_NAME_FILE_ID,
sizeof(DWORDLONG),
offsetof(SGNativeQueueEntry, fileID),
JET_coltypCurrency,
0
},
queueColDefParentID = {
QUEUE_COL_NAME_PARENT_ID,
sizeof(DWORDLONG),
offsetof(SGNativeQueueEntry, parentID),
JET_coltypCurrency,
0
},
queueColDefReason = {
QUEUE_COL_NAME_REASON,
sizeof(DWORD),
offsetof(SGNativeQueueEntry, reason),
JET_coltypLong,
0
},
queueColDefOrder = {
QUEUE_COL_NAME_ORDER,
sizeof(DWORD),
offsetof(SGNativeQueueEntry, order),
JET_coltypLong,
JET_bitColumnAutoincrement
},
queueColDefReadyTime = {
QUEUE_COL_NAME_READY_TIME,
sizeof(DWORDLONG),
offsetof(SGNativeQueueEntry, readyTime),
JET_coltypCurrency,
0
},
queueColDefRetryTime = {
QUEUE_COL_NAME_RETRY_TIME,
sizeof(DWORDLONG),
offsetof(SGNativeQueueEntry, retryTime),
JET_coltypCurrency,
0
},
queueColDefName = {
QUEUE_COL_NAME_NAME,
MAX_PATH * sizeof(TCHAR),
offsetof(SGNativeQueueEntry, fileName),
JET_coltypLongBinary,
0
},
*queueColumnSpecs[QUEUE_NCOLS] = {
&queueColDefFileID,
&queueColDefParentID,
&queueColDefReason,
&queueColDefOrder,
&queueColDefReadyTime,
&queueColDefRetryTime,
&queueColDefName
},
*queueKeyReadyTime[QUEUE_KEY_NCOLS_READY_TIME] = {
&queueColDefReadyTime
},
*queueKeyFileID[QUEUE_KEY_NCOLS_FILE_ID] = {
&queueColDefFileID
},
*queueKeyOrder[QUEUE_KEY_NCOLS_ORDER] = {
&queueColDefOrder
};
/***************************** Stack parameters ******************************/
#define STACK_NAME "SGStack"
typedef struct _SGNativeStackEntry {
DWORDLONG fileID;
DWORD order;
} SGNativeStackEntry;
#define STACK_COL_NUM_FILE_ID 0
#define STACK_COL_NUM_ORDER 1
#define STACK_NCOLS 2
#define STACK_COL_NAME_FILE_ID "FileID"
#define STACK_COL_NAME_ORDER "Order"
#define STACK_KEY_NAME_FILE_ID "FileIDKey"
#define STACK_KEY_NAME_ORDER "Order"
#define STACK_KEY_NCOLS_FILE_ID 1
#define STACK_KEY_NCOLS_ORDER 1
#define STACK_EXCLUDE_FILE_ID_MASK \
(~(1U << STACK_COL_NUM_FILE_ID))
#define STACK_GET_ORDER_ONLY_MASK \
(1U << STACK_COL_NUM_ORDER)
static ColumnSpec
stackColDefFileID = {
STACK_COL_NAME_FILE_ID,
sizeof(DWORDLONG),
offsetof(SGNativeStackEntry, fileID),
JET_coltypCurrency,
0
},
stackColDefOrder = {
STACK_COL_NAME_ORDER,
sizeof(DWORD),
offsetof(SGNativeStackEntry, order),
JET_coltypLong,
0
},
*stackColumnSpecs[STACK_NCOLS] = {
&stackColDefFileID,
&stackColDefOrder
},
*stackKeyFileID[STACK_KEY_NCOLS_FILE_ID] = {
&stackColDefFileID
},
*stackKeyOrder[STACK_KEY_NCOLS_ORDER] = {
&stackColDefOrder
};
/****************************** List parameters ******************************/
#define LIST_NAME "SGList"
typedef struct _SGNativeListEntry {
const TCHAR *name;
TCHAR *value;
} SGNativeListEntry;
#define LIST_COL_NUM_NAME 0
#define LIST_COL_NUM_VALUE 1
#define LIST_NCOLS 2
#define LIST_COL_NAME_NAME "Name"
#define LIST_COL_NAME_VALUE "Value"
#define LIST_KEY_NAME_NAME "NameKey"
#define LIST_KEY_NCOLS_NAME 1
#define LIST_EXCLUDE_NAME_MASK \
(~(1U << LIST_COL_NUM_NAME))
static ColumnSpec
listColDefName = {
LIST_COL_NAME_NAME,
MAX_LIST_NAME_LEN,
offsetof(SGNativeListEntry, name),
JET_coltypBinary,
0
},
listColDefValue = {
LIST_COL_NAME_VALUE,
MAX_PATH * sizeof(TCHAR),
offsetof(SGNativeListEntry, value),
JET_coltypLongBinary,
0
},
*listColumnSpecs[LIST_NCOLS] = {
&listColDefName,
&listColDefValue,
},
*listKeyName[LIST_KEY_NCOLS_NAME] = {
&listColDefName
};
/************************ SGDatabase class declaration ***********************/
class SGDatabase {
private:
static DWORD numInstances;
static JET_INSTANCE instance;
static BOOL jetInitialized;
static TCHAR *logDir;
CHAR *fileName; // fully qualified database file name
JET_SESID sesID;
JET_DBID dbID;
JET_TABLEID tableID,
queueID,
stackID,
listID;
JET_COLUMNID tableColumnIDs[TABLE_NCOLS],
queueColumnIDs[QUEUE_NCOLS],
stackColumnIDs[STACK_NCOLS],
listColumnIDs[ LIST_NCOLS];
LONG numTableEntries,
numQueueEntries,
numStackEntries,
numListEntries,
numUncommittedTableEntries,
numUncommittedQueueEntries,
numUncommittedStackEntries,
numUncommittedListEntries;
BOOL inTransaction;
// Static methods
static BOOL InitializeEngine();
static BOOL TerminateEngine();
// Table / queue / stack / list methods
BOOL CreateTable(
const CHAR *tblName,
DWORD numColumns,
ColumnSpec **columnSpecs,
JET_COLUMNID *columnIDs,
JET_TABLEID *tblID);
BOOL CreateIndex(
JET_TABLEID tblID,
const CHAR *keyName,
DWORD numKeys,
ColumnSpec **keyColumnSpecs);
BOOL OpenTable(
const CHAR *tblName,
DWORD numColumns,
ColumnSpec **columnSpecs,
JET_COLUMNID *columnIDs,
JET_TABLEID *tblID);
BOOL CloseTable(JET_TABLEID tblID);
LONG PositionCursor(
JET_TABLEID tblID,
const CHAR *keyName,
const VOID *entry,
DWORD numKeys,
ColumnSpec **keyColumnSpecs) const;
LONG PositionCursorFirst(
JET_TABLEID tblID,
const CHAR *keyName) const;
LONG PositionCursorNext(JET_TABLEID tblID) const;
LONG PositionCursorLast(
JET_TABLEID tblID,
const CHAR *keyName) const;
BOOL PutData(
JET_TABLEID tblID,
const VOID *entry,
DWORD numColumns,
ColumnSpec **columnSpecs,
const JET_COLUMNID *columnIDs);
BOOL SGDatabase::RetrieveData(
JET_TABLEID tblID,
VOID *entry,
DWORD numColumns,
ColumnSpec **columnSpecs,
const JET_COLUMNID *columnIDs,
DWORD includeMask) const;
LONG Delete(JET_TABLEID tblID);
LONG Count(
JET_TABLEID tblID,
const CHAR *keyName) const;
public:
// General methods
SGDatabase();
~SGDatabase();
BOOL Create(const TCHAR *dbName);
BOOL Open(const TCHAR *dbName, BOOL is_log_drive);
BOOL Close();
BOOL BeginTransaction();
BOOL CommitTransaction();
BOOL AbortTransaction();
static BOOL set_log_drive(const _TCHAR *drive_name);
// Table methods
LONG TablePut(const SGNativeTableEntry *entry);
LONG TableGetFirstByFileID(SGNativeTableEntry *entry) const;
LONG TableGetFirstByAttr(SGNativeTableEntry *entry) const;
LONG TableGetFirstByCSIndex(SGNativeTableEntry *entry) const;
LONG TableGetNext(SGNativeTableEntry *entry) const;
LONG TableDeleteByFileID(DWORDLONG fileID);
LONG TableDeleteByCSIndex(const CSID *csIndex);
LONG TableCount() const;
// Queue methods
LONG QueuePut(SGNativeQueueEntry *entry);
LONG QueueGetFirst(SGNativeQueueEntry *entry) const;
LONG QueueGetFirstByFileID(SGNativeQueueEntry *entry) const;
LONG QueueGetNext(SGNativeQueueEntry *entry) const;
LONG QueueDelete(DWORD order);
LONG QueueDeleteByFileID(DWORDLONG fileID);
LONG QueueCount() const;
// Stack methods
LONG StackPut(DWORDLONG fileID, BOOL done);
LONG StackGetTop(SGNativeStackEntry *entry) const;
LONG StackGetFirstByFileID(SGNativeStackEntry *entry) const;
LONG StackGetNext(SGNativeStackEntry *entry) const;
LONG StackDelete(DWORD order);
LONG StackDeleteByFileID(DWORDLONG fileID);
LONG StackCount() const;
// List methods
LONG ListWrite(const SGNativeListEntry *entry);
LONG ListRead(SGNativeListEntry *entry) const;
LONG ListDelete(const TCHAR *name);
LONG ListCount() const;
};