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