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

模拟服务器

开发平台:

C/C++

  1. #include "stdafx.h"
  2. #include "DBTable.h"
  3. #ifndef WIN32
  4. #include <sys/stat.h>
  5. #else
  6. #include <direct.h>
  7. #endif
  8. #include <stdio.h>
  9. #include <string.h>
  10. ZDBTable::ZDBTable(const char *path, const char *name) {
  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. index_number = 0;
  26. strcpy(table_name, name);
  27. return; //成功了
  28. }
  29. dbenv->close(dbenv, 0);
  30. }
  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. int ret;
  48. if(!db_create(&primary_db, dbenv, 0)) {
  49. if(!primary_db->open(primary_db, NULL, table_name, NULL, DB_BTREE, DB_CREATE|DB_AUTO_COMMIT, 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(ret = primary_db->associate(primary_db, NULL, index_db[index], get_index_funcs[index], DB_AUTO_COMMIT)) {
  58. index_db[index]->close(index_db[index], 0);
  59. break;
  60. }
  61. }
  62. else break;
  63. }
  64. if(index == index_number) return true; //成功了
  65. else while(--index) (index_db[index])->close(index_db[index], 0); //出错,关闭前面的索引表
  66. primary_db->close(primary_db, 0);
  67. }
  68. }
  69. return false;
  70. }
  71. void ZDBTable::close() {
  72. if(!dbenv) return;
  73. primary_db->close(primary_db, 0);
  74. for(int index = 0; index < index_number; index++) index_db[index]->close(index_db[index], 0);
  75. }
  76. bool ZDBTable::commit() {
  77. /* if(!dbenv) return false;
  78. int ret;
  79. DB_TXN *tid;
  80. if((ret = dbenv->txn_begin(dbenv, NULL, &tid, 0)) != 0) return false;
  81. if((ret = primary_db->sync(primary_db, 0)) == 0) {
  82. ret = tid->commit(tid, 0);
  83. if(!ret) return true;
  84. }
  85. else {
  86. tid->abort(tid);
  87. return false;
  88. }*/
  89. return true;
  90. }
  91. bool ZDBTable::add(const char *key_ptr, int key_size, const char *data_ptr, int data_size) {
  92. DBT data, key;
  93. memset(&key, 0, sizeof(DBT));
  94. memset(&data, 0, sizeof(DBT));
  95. key.data = (void *)key_ptr;
  96. key.size = key_size;
  97. data.data = (void *)data_ptr;
  98. data.size = data_size;
  99. if(!primary_db->put(primary_db, NULL, &key, &data, DB_AUTO_COMMIT)) {
  100. return true;
  101. }
  102. return false;
  103. }
  104. bool ZDBTable::remove(const char *key_ptr, int key_size, int index) {
  105. DBT data, key;
  106. memset(&key, 0, sizeof(DBT));
  107. memset(&data, 0, sizeof(DBT));
  108. key.data = (void *)key_ptr;
  109. key.size = key_size;
  110. if(!primary_db->del(primary_db, NULL, &key, DB_AUTO_COMMIT)) {
  111. return true;
  112. }
  113. return false;
  114. }
  115. char *ZDBTable::_search(bool bKey, const char *key_ptr, int key_size, int &size, int index) {
  116. dbcp = NULL;
  117. DBT key, data, pkey;
  118. if(index < -1 || index >= index_number) return NULL;
  119. memset(&key, 0, sizeof(key));
  120. memset(&data, 0, sizeof(data));
  121. memset(&pkey, 0, sizeof(pkey));
  122. key.data = (void *)key_ptr;
  123. key.size = key_size;
  124. if(index == -1) { //主键搜索
  125. if(primary_db->get(primary_db, NULL, &key, &data, 0)) return NULL;
  126. }
  127. else if(is_index_unique[index]) { //没有重复索引
  128. if(bKey) {
  129. if(index_db[index]->pget(index_db[index], NULL, &key, &pkey, &data, 0)) return NULL;
  130. }
  131. else {
  132. if(index_db[index]->get(index_db[index], NULL, &key, &data, 0)) return NULL;
  133. }
  134. }
  135. else { //打开游标
  136. if(index_db[index]->cursor(index_db[index], NULL, &dbcp, 0)) {
  137. dbcp = NULL;
  138. return NULL;
  139. }
  140. if(bKey) {
  141. if(dbcp->c_pget(dbcp, &key, &pkey, &data, DB_SET)) {
  142. dbcp->c_close(dbcp);
  143. dbcp = NULL;
  144. return NULL;
  145. }
  146. }
  147. else {
  148. if(dbcp->c_get(dbcp, &key, &data, DB_SET)) {
  149. dbcp->c_close(dbcp);
  150. dbcp = NULL;
  151. return NULL;
  152. }
  153. }
  154. }
  155. char *result;
  156. if(bKey) {
  157. result = new char[pkey.size];
  158. memmove(result, pkey.data, pkey.size);
  159. size = pkey.size;
  160. }
  161. else {
  162. result = new char[data.size];
  163. memmove(result, data.data, data.size);
  164. size = data.size;
  165. }
  166. return result;
  167. }
  168. char *ZDBTable::_next(bool bKey, int &size) {
  169. if(!dbcp) return NULL;
  170. DBT key, data, pkey;
  171. memset(&key, 0, sizeof(key));
  172. memset(&data, 0, sizeof(data));
  173. memset(&pkey, 0, sizeof(pkey));
  174. if(bKey) {
  175. if(dbcp->c_pget(dbcp, &key, &pkey, &data, DB_NEXT_DUP)) {
  176. dbcp->c_close(dbcp);
  177. dbcp = NULL;
  178. return NULL;
  179. }
  180. }
  181. else {
  182. if(dbcp->c_get(dbcp, &key, &data, DB_NEXT_DUP)) {
  183. dbcp->c_close(dbcp);
  184. dbcp = NULL;
  185. return NULL;
  186. }
  187. }
  188. char *result;
  189. if(bKey) {
  190. result = new char[pkey.size];
  191. memmove(result, pkey.data, pkey.size);
  192. size = pkey.size;
  193. }
  194. else {
  195. result = new char[data.size];
  196. memmove(result, data.data, data.size);
  197. size = data.size;
  198. }
  199. return result;
  200. }