分享

[转帖]易语言数据库文件格式技术资料|易语言俱乐部

 quasiceo 2013-12-02
易语言数据库文件格式技术资料:
by - 2006-1-8 22:19:52
易语言数据库文件格式技术资料:
1、通用宏 //////////////////////////////////////////////////////////////////////////
// 数据库文件的默认后缀为 .EDB
// 数据库索引文件的默认后缀为 .ENX
// 数据库辅助文件(用作存放备注及字节集类型字段的数据)的默认后缀为 .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
{
// 在加密数据库中,只有此标记在明文区中。
DWORD m_dwMark; // 为 DB_BEGIN_MARK 或 ENCRYPTED_DB_BEGIN_MARK
INT m_nVer; // 本数据库的版本号
DATE m_dtCreated; // 创建日期
// 当前库中记录数及当前未用记录书签值。
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; // 创建日期
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; // 创建日期
#define IT_NORMAL 0
// 所有文本型字段使用拼音存储。
#define IT_PY_TEXT 1
// 所有文本型字段使用南方拼音存储(将相近音转换为统一音)。
#define IT_SOUTH_PY_TEXT 2
INT m_nType;
#define IX_NOT_MATCH_CASE_TEXT (1 << 0) // 所有文本型字段中的字母不区分大小写存储。
#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]

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多