DBTable.h
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:4k
源码类别:

模拟服务器

开发平台:

C/C++

  1. #ifndef DBTABLE_H
  2. #define DBTABLE_H
  3. //定义支持复制、事务处理的,多索引记录的数据表类
  4. #include "db.h"
  5. #define MAX_INDEX 16
  6. #define MAX_TABLE_NAME 256
  7. typedef int (*GetIndexFunc)(DB *, const DBT *, const DBT *, DBT *);
  8. class ZDBTable {
  9. DB *primary_db; //存放主键-数据的数据库
  10. DB *index_db[MAX_INDEX]; //存放索引-主键的数据库
  11. GetIndexFunc get_index_funcs[MAX_INDEX]; //从数据中获得二级key的的函数列表
  12. bool is_index_unique[MAX_INDEX]; //索引是否唯一
  13. int index_number; //二级索引数目
  14. char table_name[MAX_TABLE_NAME];
  15. DBC *dbcp; //目前考虑单线程,使用一个CURSOR
  16. protected:
  17. char env_path[MAX_TABLE_NAME];
  18. DB_ENV *dbenv; //数据库环境
  19. char *_search(bool bKey, const char *key_ptr, int key_size, int &size, int index); //搜索指定记录
  20. char *_next(bool bKey, int &size); //下一个记录
  21. public:
  22. ZDBTable(const char *path, const char *name); //环境目录和数据表的名字
  23. virtual ~ZDBTable();
  24. int addIndex(GetIndexFunc func, bool isUnique = false); //增加二级索引
  25. bool open(); //打开数据表
  26. void close(); //关闭数据表
  27. bool commit(); //基于事务的提交
  28. //基本记录操作
  29. bool add(const char *key_ptr, int key_size, const char *data_ptr, int data_size);
  30. char *search(const char *key_ptr, int key_size, int &size, int index = -1){
  31. return _search(false, key_ptr, key_size, size, index); //搜索指定记录
  32. }
  33. char *next(int &size) { //下一个记录
  34. return _next(false, size);
  35. }
  36. char *search_key(const char *key_ptr, int key_size, int &size, int index = -1) { //搜索指定记录,返回主键值
  37. return _search(true, key_ptr, key_size, size, index); //搜索指定记录
  38. }
  39. char *next_key(int &size) { //下一个记录,返回主键值
  40. return _next(true, size);
  41. }
  42. bool remove(const char *key_ptr, int key_size, int index = -1);
  43. //遍历纪录记录(by Fellow)
  44. enum CursorPointer{cpFirst=10, cpCurrent=8, cpNext=19, cpLast=18};
  45. char *GetRecord(int &size, CursorPointer cpMode, int index = -1);//取得按游标某一个数据
  46. char *GetRecord_key(int &size, CursorPointer cpMode, int index = -1); //取得按游标某一个数据的Key值
  47. bool GetRecordEx(char* aBuffer, int &size,
  48. char* aKeyBuffer, int &keysize,
  49. CursorPointer cpMode, int index = -1); //取得按游标某一个数据和key(新版函数)
  50. };
  51. //数据库操作类(只读) Add By Fellow At 2003.08.14
  52. //支持并发读取
  53. class CDBTableReadOnly  
  54. {
  55. DB *primary_db; //存放主键-数据的数据库
  56. DBC *dbcp; //目前考虑单线程,使用一个CURSOR
  57. char table_name[MAX_TABLE_NAME];
  58. protected:
  59. char env_path[MAX_TABLE_NAME];
  60. DB_ENV *dbenv; //数据库环境
  61. char *_search(bool bKey, const char *key_ptr, int key_size, int &size); //搜索指定记录
  62. char *_next(bool bKey, int &size); //下一个记录
  63. public:
  64. CDBTableReadOnly(const char *path, const char *name); //环境目录和数据表的名字
  65. virtual ~CDBTableReadOnly();
  66. bool open(); //打开数据表
  67. void close(); //关闭数据表
  68. //基本记录操作
  69. char *search(const char *key_ptr, int key_size, int &size){
  70. return _search(false, key_ptr, key_size, size); //搜索指定记录
  71. }
  72. char *next(int &size) { //下一个记录
  73. return _next(false, size);
  74. }
  75. //遍历纪录记录(by Fellow)
  76. enum CursorPointer{cpFirst=10, cpCurrent=8, cpNext=19, cpLast=18};
  77. char *GetRecord(int &size, CursorPointer cpMode);//取得按游标某一个数据
  78. char *GetRecord_key(int &size, CursorPointer cpMode); //取得按游标某一个数据的Key值
  79. bool GetRecordEx(char* aBuffer, int &size,
  80.    char* aKeyBuffer, int &keysize,
  81.    CursorPointer cpMode);
  82. char *search_key(const char *key_ptr, int key_size, int &size) { //搜索指定记录,返回主键值
  83. return _search(true, key_ptr, key_size, size); //搜索指定记录
  84. }
  85. char *next_key(int &size) { //下一个记录,返回主键值
  86. return _next(true, size);
  87. }
  88. };
  89. #endif