www.pudn.com > isync2[1].0.rar > CDatabase.h
/*************************************************************************************************\ * 文件名称 :CDatabase.h CDatabase类 头文件 * CopyRight (c) 2004 汉王科技公司 * * 作者 : 王欣 * 创建时间: 2004年04月14日 * 当前版本: 0.1 * * 说明 : 存储数据类。存储是以文件为基础的,只支持定长数据记录的存储, * 优点可以自动利用空闲空间,不会造成浪费。 * * 注意 : 1 Open,Fetch,Delete函数中size_t类型参数的值不能大于数据库的大小, * 也就是GetDBSize()的值,否则将出现未定义的结果。用户要确保这个 * 参数在指定范围内,函数本身不负责范围检查。 * \**************************************************************************************************/ #ifndef CDATABASE_H #define CDATABASE_H #include#include #include #define DBVerString "IPhone card database ver 1.0" #define DefaultVerString "CDatabase Version 1.0" #define VER_STRING_LEN 32 typedef unsigned char BYTE; class CDatabase { public: enum OpenMode_T { R = 0, RW }; enum DBErrors_T { DBERR_DATABASE_FULL = 0, DBERR_READDATA, DBERR_WRITEDATA, DBERR_WRITEHEADITEM }; CDatabase (const char *filename, bool add_to_tail = false); virtual ~CDatabase (); bool Create (const char *vstr, size_t rcount, size_t rsize); void Close (void); bool Open (OpenMode_T mode, size_t off_set = 0); size_t GetCapacity (void) const; size_t GetDBSize (void) const; size_t GetRecordSize (void) const; size_t GetUsedCount (void) const; bool Delete (size_t id); bool Fetch (void *pdata, size_t id); bool FetchEx (void *pdata, size_t id, size_t offset, size_t len); size_t Insert (void *pdata); bool Modify (size_t id, void *pdata); bool ModifyEx (size_t id, size_t offset, size_t len, void *pdata); size_t FindFirst (void); size_t FindNext (size_t id); protected: struct DBHead { char verString[VER_STRING_LEN]; // 信息字符串 size_t recordSize; // 每个记录的大小(以字节为单位) size_t recordCount; // 能够容纳的记录总数,因此数据库大小 // 为recordCount*recordSize+sizeof(Head) size_t usedRecordCount; // 已存储的记录个数 size_t fstFreeOffset; // 第一个空闲块的偏移量 void PrintSelfInfo (void); }; static int refCount; // 引用计数,如果数据库被打开,则计数加1 const size_t headSize; bool addToTail; // 数据库添加在宿主文件末尾 size_t beginngOffSet; // 数据库在宿主文件中的偏移量 DBHead dbHead; // 数据文件索引头结构 std::string fileName; // 数据文件名称 OpenMode_T openMode; // 数据文件打开方式 FILE *pdbFile; // 数据文件句柄 FILE *CreateDBFile (void); void CloseDBFile (void); bool FileExist (const char *file_name); bool FillEmptyRecord (FILE *pf, size_t off_set); size_t GetFirstFreeBlockPos (void) const; off_t GetFileSize (const char *fileName); bool InitDBFileStruct (FILE *pf); void InitDBHead (const char *vstr, size_t rcount, size_t rsize); // 初始化数据库头结构 bool RecordIsEmpty (size_t off_set); void Seek (size_t pos); FILE *OpenDBFile (OpenMode_T mode); bool ReadFileHead (FILE *pf); bool WriteData (size_t pos, void *data); bool WriteHeadDataItem (size_t index, size_t value); }; inline size_t CDatabase::GetCapacity (void) const { return dbHead.recordCount; } inline size_t CDatabase::GetDBSize (void) const { return dbHead.recordCount*dbHead.recordSize + sizeof(DBHead); } inline size_t CDatabase::GetFirstFreeBlockPos (void) const { return dbHead.fstFreeOffset; } inline size_t CDatabase::GetRecordSize (void) const { return dbHead.recordSize; } inline size_t CDatabase::GetUsedCount (void) const { return dbHead.usedRecordCount; } #endif