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

模拟服务器

开发平台:

C/C++

  1. #ifndef DBTABLE_H
  2. #define DBTABLE_H
  3. //定义支持复制、事务处理的,多索引记录的数据表类
  4. #include "db.h"
  5. #include "malloc.h"
  6. #define MAX_INDEX 16 //一个数据表最多的索引数目
  7. #define MAX_TABLE_NAME 256 //最长的表名字
  8. typedef int (*GetIndexFunc)(DB *, const DBT *, const DBT *, DBT *);
  9. typedef struct ZCursor {
  10. bool bTravel; //是否遍历
  11. DBC *dbcp; //当前遍历使用的游标
  12. int index; //当前的索引
  13. char *key;
  14. int key_size;
  15. char *data; //返回的数据
  16. int size; //数据的大小
  17. }tagZCursor;
  18. class ZDBTable {
  19. DB *primary_db; //存放主键-数据的数据库
  20. DB *index_db[MAX_INDEX]; //存放索引-主键的数据库
  21. GetIndexFunc get_index_funcs[MAX_INDEX]; //从数据中获得二级key的的函数列表
  22. bool is_index_unique[MAX_INDEX]; //索引是否唯一
  23. int index_number; //二级索引数目
  24. char table_name[MAX_TABLE_NAME];
  25. protected:
  26. char env_path[MAX_TABLE_NAME];
  27. DB_ENV *dbenv; //数据库环境
  28. ZCursor *_search(bool bKey, const char *key_ptr, int key_size, int index); //搜索指定记录
  29. bool _next(bool bKey, ZCursor *cursor); //下一个记录
  30. public:
  31. bool bStop;
  32. ZDBTable(const char *path, const char *name); //环境目录和数据表的名字
  33. virtual ~ZDBTable();
  34. int addIndex(GetIndexFunc func, bool isUnique = false); //增加索引项
  35. bool open(); //打开数据表
  36. void close(); //关闭数据表
  37. bool commit(); //基于事务的提交,目前使用自动提交,不使用
  38. //基本记录操作
  39. bool add(const char *key_ptr, int key_size, const char *data_ptr, int data_size);
  40. bool remove(const char *key_ptr, int key_size, int index = -1);
  41. void closeCursor(ZCursor *cursor) {
  42. if(!cursor) return;
  43. if(cursor->bTravel) {
  44. free(cursor->key);
  45. }
  46. free(cursor->data);
  47. delete cursor;
  48. }
  49. ZCursor *first() { //遍历数据库,得到第一条记录
  50. return _search(false, NULL, 0, -1);
  51. }
  52. ZCursor *search(const char *key_ptr, int key_size, int index = -1){
  53. return _search(false, key_ptr, key_size, index); //搜索指定记录
  54. }
  55. bool next(ZCursor *cursor) { //下一个记录
  56. return _next(false, cursor);
  57. }
  58. ZCursor *search_key(const char *key_ptr, int key_size, int index = -1) { //搜索指定记录,返回主键值
  59. return _search(true, key_ptr, key_size, index);
  60. }
  61. bool next_key(ZCursor *cursor) { //下一个记录,返回主键值
  62. return _next(true, cursor);
  63. }
  64. //下面是一些维护性的操作
  65. void deadlock() { //解除死锁
  66. dbenv->lock_detect(dbenv, 0, DB_LOCK_DEFAULT, NULL);
  67. }
  68. void removeLog(); //清除日志文件
  69. };
  70. #define MAX_RETRY 16
  71. #endif