易語言數據庫文件格式技術資料: by - 2006-1-8 22:19:52 易語言數據庫文件格式技術資料: 1、通用宏 ////////////////////////////////////////////////////////////////////////// // 數據庫文件的默認后綴為 .EDB // 數據庫索引文件的默認后綴為 .ENX // 數據庫輔助文件(用作存放備注及字節(jié)集類型字段的數據)的默認后綴為 .EDT #define DE_DATABASE_FILE _T("EDB") #define DE_INDEX_FILE _T("ENX") #define DE_DAT_FILE _T("EDT") // 非加密數據庫的起始標志。 #define DB_BEGIN_MARK 'BDEW' // 加密數據庫的起始標志。 #define ENCRYPTED_DB_BEGIN_MARK 'BDCW' // 輔助文件的起始標志。 #define DAT_BEGIN_MARK 'TDEW' // 索引文件的起始標志 #define INDEX_BEGIN_MARK 'XNEW' // 數據庫文件的 1.0 版本號 #define DB_VER_01_00 MAKELONG (0, 1) // 數據庫文件的當前版本號 #define DB_CUR_VER DB_VER_01_00 // 字段名稱的最大長度 #define MAX_FIELD_NAME_LEN 16 // 同一數據庫文件最多可以同時打開索引文件的數目。 #define MAX_OPEN_INDEX_COUNT 10 // 索引文件對應的最多字段的數目。 #define MAX_INDEX_FIELDS_COUNT 8 // 固定長度文本字段的最小寬度。 #define MIN_FIXED_TEXT_FIELD_WIDTH 1 // 固定長度文本字段的最大寬度。 #define MAX_FIXED_TEXT_FIELD_WIDTH 1024 2、.EDB文件格式 //////////////////////////////////////////////////////////////////// // 數據庫.EDB文件起始信息 struct DB_HEADER { // 在加密數據庫中,只有此標記在明文區(qū)中。 DWORD m_dwMark; // 為 DB_BEGIN_MARK 或 ENCRYPTED_DB_BEGIN_MARK INT m_nVer; // 本數據庫的版本號 DATE m_dtCreated; // 創(chuàng)建日期 // 當前庫中記錄數及當前未用記錄書簽值。 INT m_nRecordsCount, m_nFreeBookmark; INT m_nRecordSize; // 每一條記錄的數據尺寸。 // 如果為加密數據庫,記錄正確訪問密碼的MD5編碼以供核對。 #define PASSWORD_MD5_BUF_LEN (32 + 4) char m_szPasswordMD5 [PASSWORD_MD5_BUF_LEN]; // 保留 INT m_nReserved [11]; }; typedef DB_HEADER* PDB_HEADER; ///////////////////////// // 字段類型宏值。 #define FDT_BYTE 1 #define FDT_SHORT 2 #define FDT_INT 3 #define FDT_INT64 4 #define FDT_FLOAT 5 #define FDT_DOUBLE 6 #define FDT_BOOL 7 #define FDT_DATE_TIME 8 #define FDT_SUB_PTR 9 #define FDT_FIXED_TEXT 10 // 定長文本 #define FDT_BIN 11 #define FDT_MEMO 12 // 備注文本 struct FIELD_INF { TCHAR m_szName [MAX_FIELD_NAME_LEN + 1]; INT m_nType; // 字段的類型 INT m_nOffset; // 本字段數據在記錄中的偏移量 // 字段數據長度,僅對 FDT_FIXED_TEXT 定長文本字段有效,值在 // MIN_FIXED_TEXT_FIELD_WIDTH 及 MAX_FIXED_TEXT_FIELD_WIDTH 之間。 INT m_nFixedTextWidth; // 保留 INT m_nReserved [10]; }; typedef FIELD_INF* PFIELD_INF; ///////////////////////// /* .EDB數據庫文件結構圖: DB_HEADER (結構) 本數據庫中的字段總數 (整數值) 與字段數目相同數目的 FIELD_INF 結構 記錄書簽及刪除標記(整數值,如果小于 0 表示已經被標記刪除) + 記錄數據 . . . */ 3、.EDT文件格式 //////////////////////////////////////////////////////////////////// #define BLK_SIZE 512 // 每一個數據塊的尺寸 struct DAT_HEADER { DWORD m_dwMark; // 為 DAT_BEGIN_MARK INT m_nVer; // 本輔助文件所屬數據庫的版本號 DATE m_dtCreated; // 創(chuàng)建日期 INT m_nBlockCount; // 當前所有塊的數目(包括文件頭所在塊)。 INT m_nEmptyBlockCount; // 當前空塊的數目。 INT m_nStartEmptyBlockNO; // 第一個空塊的位置(0 表示無空塊)。 }; typedef DAT_HEADER* PDAT_HEADER; ///////////////////////// // 塊號為 0 的第一塊包含 DAT_HEADER 信息。 struct BLOCK_HEADER { INT m_nPrevBlockNO; // 上一塊的位置,如果為 0 ,表示為首塊。 INT m_nNextBlockNO; // 下一塊的位置,如果為 0 ,表示為尾塊。 INT m_nDataSize; // 本塊中數據的長度,如果為 0 ,表示為空塊。 }; typedef BLOCK_HEADER* PBLOCK_HEADER; ///////////////////////// /* .EDT輔助文件結構圖: DAT_HEADER (結構),占據一塊 BLOCK_HEADER (結構)+ 數據 . . . */ 4、.ENX文件格式 //////////////////////////////////////////////////////////////////// struct ALL_FIELDS_OF_INDEX { INT m_nFieldsCount; // 本索引所對應的字段總數。 // 所有字段的名稱 TCHAR m_szaryFieldName [MAX_INDEX_FIELDS_COUNT][MAX_FIELD_NAME_LEN + 1]; // 所有字段的類型,如果小于 0 ,表示為文本型,其絕對值為文本的固定寬度。 INT m_naryFieldsType [MAX_INDEX_FIELDS_COUNT]; }; typedef ALL_FIELDS_OF_INDEX* PALL_FIELDS_OF_INDEX; ///////////////////////// #define MIN_NODE_SIZE 512 // 結點的最小尺寸 #define MAX_KEY_SIZE 80 // 關鍵字數據的最大尺寸 // 結點中的項目數不能小于 4 。 struct INDEX_HEADER { DWORD m_dwMark; // 為 INDEX_BEGIN_MARK INT m_nVer; // 本索引文件所屬數據庫的版本號 DATE m_dtCreated; // 創(chuàng)建日期 #define IT_NORMAL 0 // 所有文本型字段使用拼音存儲。 #define IT_PY_TEXT 1 // 所有文本型字段使用南方拼音存儲(將相近音轉換為統(tǒng)一音)。 #define IT_SOUTH_PY_TEXT 2 INT m_nType; #define IX_NOT_MATCH_CASE_TEXT (1 << 0) // 所有文本型字段中的字母不區(qū)分大小寫存儲。 #define IX_DISCARD_ALL_SPACE (1 << 1) // 所有文本型字段中的全半角空格都被拋棄。 DWORD m_dwState; INT m_nNodeCount; // 當前所有結點的數目(包括文件頭所在結點)。 INT m_nEmptyNodeCount; // 當前空結點的數目。 INT m_nStartEmptyNodeNO; // 第一個空結點的位置(0 表示無空結點)。 INT m_nRootNodeNO; // B+ 樹根(樹 / 葉)結點的位置。 ///////////////// INT m_nNodeSize; // 每一個結點的尺寸。 INT m_nKeySize; // 關鍵字數據(所有字段的尺寸和)的尺寸。 ALL_FIELDS_OF_INDEX m_infFields; }; typedef INDEX_HEADER* PINDEX_HEADER; ///////////////////////// struct NODE_HEAD { #define INS_IS_TREE_NODE (1 << 0) #define INS_IS_EMPTY_NODE (1 << 1) WORD m_wState; SHORT m_shtItemCount; }; typedef NODE_HEAD* PNODE_HEAD; ///////////////////////// /* 1、樹結點的結構: NODE_HEAD 結點號(INT) + 關鍵字數據 . . . 最右結點號(INT) 2、葉結點的結構: NODE_HEAD 對應記錄號(INT) + 關鍵字數據 . . . 3、空結點的結構: NODE_HEAD,其中 m_shtItemCount 始終為 0 。 一個 INT 記錄上一個空結點(0 表示無),一個 INT 記錄下一個空結點(0 表示無)。 */ ///////////////////////// /* .ENX索引文件結構圖: INDEX_HEADER (結構) B+ 樹結點數據集 */ [em08][em08][em08] |