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

模拟服务器

开发平台:

C/C++

  1. #include "DBTable.h"
  2. #ifndef WIN32
  3. #include <sys/stat.h>
  4. #else
  5. #include <direct.h>
  6. #endif
  7. #include <stdio.h>
  8. #include <string.h>
  9. ZDBTable::ZDBTable(const char *path, const char *name) {
  10. index_number = 0;
  11. /*#ifdef WIN32
  12. getcwd(env_path, MAX_TABLE_NAME);
  13. #else
  14. #endif
  15. strcat(env_path, "\");
  16. strcat(env_path, path);
  17. #ifdef WIN32
  18. int ret = mkdir(env_path);
  19. #else
  20.         int ret = mkdir(env_path, 0);
  21. #endif
  22. if(!db_env_create(&dbenv, 0)) {
  23. dbenv->set_errpfx(dbenv, "index_db");
  24. if(!dbenv->open(dbenv, env_path, DB_CREATE | DB_INIT_LOG | DB_INIT_LOCK | DB_INIT_MPOOL | DB_INIT_TXN | DB_RECOVER, 0)) {
  25. strcpy(table_name, name);
  26. return; //成功了
  27. }
  28. dbenv->close(dbenv, 0);
  29. }*/
  30. strcpy(table_name, name);
  31. dbenv = NULL;
  32. }
  33. ZDBTable::~ZDBTable() {
  34. if(dbenv) dbenv->close(dbenv, 0);
  35. }
  36. int ZDBTable::addIndex(GetIndexFunc func, bool isUnique) {
  37. // if(!dbenv) return -1;
  38. if(index_number + 1 >= MAX_INDEX) return index_number;
  39. get_index_funcs[index_number] = func;
  40. is_index_unique[index_number] = isUnique;
  41. return index_number++;
  42. }
  43. bool ZDBTable::open() {
  44. // if(!dbenv) return false;
  45. char index_table_name[MAX_TABLE_NAME];
  46.     int index;
  47. if(!db_create(&primary_db, dbenv, 0)) {
  48. // if(!primary_db->open(primary_db, NULL, table_name, NULL, DB_BTREE, DB_CREATE|DB_AUTO_COMMIT, 0664)) { //打开主数据库
  49. if(!primary_db->open(primary_db, NULL, table_name, NULL, DB_BTREE, DB_CREATE, 0664)) { //打开主数据库
  50. for(index = 0; index < index_number; index++) {
  51. sprintf(index_table_name, "%s.%d", table_name, index);
  52. if(!db_create(&index_db[index], dbenv, 0)) {
  53. if(!is_index_unique[index]) {
  54. if(index_db[index]->set_flags(index_db[index], DB_DUP | DB_DUPSORT)) break;
  55. }
  56. // if(index_db[index]->open(index_db[index], NULL, index_table_name, NULL, DB_BTREE, DB_CREATE|DB_AUTO_COMMIT, 0664)) break;
  57. if(index_db[index]->open(index_db[index], NULL, index_table_name, NULL, DB_BTREE, DB_CREATE, 0664)) break;
  58. if(primary_db->associate(primary_db, NULL, index_db[index], get_index_funcs[index], 0)) {
  59. index_db[index]->close(index_db[index], 0);
  60. break;
  61. }
  62. }
  63. else break;
  64. }
  65. if(index == index_number) return true; //成功了
  66. else while(--index) (index_db[index])->close(index_db[index], 0); //出错,关闭前面的索引表
  67. primary_db->close(primary_db, 0);
  68. }
  69. }
  70. return false;
  71. }
  72. void ZDBTable::close() {
  73. // if(!dbenv) return;
  74. primary_db->close(primary_db, 0);
  75. for(int index = 0; index < index_number; index++) index_db[index]->close(index_db[index], 0);
  76. }
  77. bool ZDBTable::commit() {
  78. primary_db->sync(primary_db, 0);
  79. return true;
  80. }
  81. bool ZDBTable::add(const char *key_ptr, int key_size, const char *data_ptr, int data_size) {
  82. DBT data, key;
  83. memset(&key, 0, sizeof(DBT));
  84. memset(&data, 0, sizeof(DBT));
  85. key.data = (void *)key_ptr;
  86. key.size = key_size;
  87. data.data = (void *)data_ptr;
  88. data.size = data_size;
  89. // if(!primary_db->put(primary_db, NULL, &key, &data, DB_AUTO_COMMIT)) {
  90. if(!primary_db->put(primary_db, NULL, &key, &data, 0)) {
  91. return true;
  92. }
  93. return false;
  94. }
  95. bool ZDBTable::remove(const char *key_ptr, int key_size, int index) {
  96. DBT data, key;
  97. memset(&key, 0, sizeof(DBT));
  98. memset(&data, 0, sizeof(DBT));
  99. key.data = (void *)key_ptr;
  100. key.size = key_size;
  101. // if(!primary_db->del(primary_db, NULL, &key, DB_AUTO_COMMIT)) {
  102. if(!primary_db->del(primary_db, NULL, &key, 0)) {
  103. return true;
  104. }
  105. return false;
  106. }
  107. char *ZDBTable::_search(bool bKey, const char *key_ptr, int key_size, int &size, int index) {
  108. dbcp = NULL;
  109. DBT key, data, pkey;
  110. if(index < -1 || index >= index_number) return NULL;
  111. memset(&key, 0, sizeof(key));
  112. memset(&data, 0, sizeof(data));
  113. memset(&pkey, 0, sizeof(pkey));
  114. key.data = (void *)key_ptr;
  115. key.size = key_size;
  116. if(index == -1) { //主键搜索
  117. if(primary_db->get(primary_db, NULL, &key, &data, 0)) return NULL;
  118. }
  119. else if(is_index_unique[index]) { //没有重复索引
  120. if(bKey) {
  121. if(index_db[index]->pget(index_db[index], NULL, &key, &pkey, &data, 0)) return NULL;
  122. }
  123. else {
  124. if(index_db[index]->get(index_db[index], NULL, &key, &data, 0)) return NULL;
  125. }
  126. }
  127. else { //打开游标
  128. if(index_db[index]->cursor(index_db[index], NULL, &dbcp, 0)) {
  129. dbcp = NULL;
  130. return NULL;
  131. }
  132. if(bKey) {
  133. if(dbcp->c_pget(dbcp, &key, &pkey, &data, DB_SET)) {
  134. dbcp->c_close(dbcp);
  135. dbcp = NULL;
  136. return NULL;
  137. }
  138. }
  139. else {
  140. if(dbcp->c_get(dbcp, &key, &data, DB_SET)) {
  141. dbcp->c_close(dbcp);
  142. dbcp = NULL;
  143. return NULL;
  144. }
  145. }
  146. }
  147. char *result;
  148. if(bKey) {
  149. result = new char[pkey.size];
  150. memmove(result, pkey.data, pkey.size);
  151. size = pkey.size;
  152. }
  153. else {
  154. result = new char[data.size];
  155. memmove(result, data.data, data.size);
  156. size = data.size;
  157. }
  158. return result;
  159. }
  160. char *ZDBTable::_next(bool bKey, int &size) {
  161. if(!dbcp) return NULL;
  162. DBT key, data, pkey;
  163. memset(&key, 0, sizeof(key));
  164. memset(&data, 0, sizeof(data));
  165. memset(&pkey, 0, sizeof(pkey));
  166. if(bKey) {
  167. if(dbcp->c_pget(dbcp, &key, &pkey, &data, DB_NEXT_DUP)) {
  168. dbcp->c_close(dbcp);
  169. dbcp = NULL;
  170. return NULL;
  171. }
  172. }
  173. else {
  174. if(dbcp->c_get(dbcp, &key, &data, DB_NEXT_DUP)) {
  175. dbcp->c_close(dbcp);
  176. dbcp = NULL;
  177. return NULL;
  178. }
  179. }
  180. char *result;
  181. if(bKey) {
  182. result = new char[pkey.size];
  183. memmove(result, pkey.data, pkey.size);
  184. size = pkey.size;
  185. }
  186. else {
  187. result = new char[data.size];
  188. memmove(result, data.data, data.size);
  189. size = data.size;
  190. }
  191. return result;
  192. }