00001
00016 #include "bdb_tool.h"
00017 #include "jbxl_state.h"
00018
00019
00020 #ifdef ENABLE_BERKELEYDB
00021
00034 DB* open_fdb(char* fname, unsigned int mode)
00035 {
00036 DB* dp;
00037
00038 if (fname==NULL) return NULL;
00039
00040 int ret = db_create(&dp, NULL, 0);
00041 if (ret==0) {
00042 ret = dp->open(dp, NULL, fname, NULL, DB_HASH, (u_int32_t)mode, 0600);
00043 }
00044
00045 if (ret!=0) {
00046 DEBUG_MODE {
00047 dp->err(dp, ret, "DB->open");
00048 PRINT_MESG("dbname is %s\n", fname);
00049 }
00050 return NULL;
00051 }
00052 return dp;
00053 }
00054
00055
00061 void close_fdb(DB** dp)
00062 {
00063 if (dp==NULL || *dp==NULL) return;
00064
00065 (*dp)->close((*dp), 0);
00066 *dp = NULL;
00067 return;
00068 }
00069
00070
00083 int check_fdb_file(char* fname)
00084 {
00085 DB* dp = open_fdb(fname, DB_CREATE);
00086
00087 if (dp==NULL) return FALSE;
00088 close_fdb(&dp);
00089 return TRUE;
00090 }
00091
00092
00109 int set_fdb_data(DB* dp, Buffer id, Buffer dbdata)
00110 {
00111 DBT key, data;
00112 int ret;
00113
00114 memset(&key, 0, sizeof(DBT));
00115 memset(&data, 0, sizeof(DBT));
00116
00117 key.data = id.buf;
00118 key.size = id.vldsz;
00119 if (key.size<=0) {
00120 key.size = strlen((char*)id.buf);
00121 if (key.size<=0) return JBXL_BDB_DATASZ_ERROR;
00122 }
00123
00124 data.data = dbdata.buf;
00125 data.size = dbdata.vldsz;
00126 if (data.size<=0) return JBXL_BDB_DATASZ_ERROR;
00127
00128 ret = dp->put(dp, NULL, &key, &data, 0);
00129 if (ret!=0) {
00130 DEBUG_MODE dp->err(dp, ret, "DB->put");
00131 return JBXL_BDB_PUT_ERROR;
00132 }
00133 return data.size;
00134 }
00135
00136
00154 int set_fdb_data_file(char* fname, Buffer id, Buffer dbdata)
00155 {
00156 DBT key, data;
00157 DB* dp;
00158 int ret;
00159
00160 dp = open_fdb(fname, DB_CREATE);
00161 if (dp==NULL) return JBXL_BDB_OPEN_ERROR;
00162
00163 memset(&key, 0, sizeof(DBT));
00164 memset(&data, 0, sizeof(DBT));
00165
00166 key.data = (char*)(id.buf);
00167 key.size = id.vldsz;
00168 if (key.size<=0) {
00169 key.size = strlen((char*)id.buf);
00170 if (key.size<=0) return JBXL_BDB_KEY_ERROR;
00171 }
00172
00173 data.data = (char*)dbdata.buf;
00174 data.size = dbdata.vldsz;
00175 if (data.size<=0) return JBXL_BDB_DATASZ_ERROR;
00176
00177 ret = dp->put(dp, NULL, &key, &data, 0);
00178 close_fdb(&dp);
00179
00180 if (ret!=0) {
00181 DEBUG_MODE dp->err(dp, ret, "DB->put");
00182 return JBXL_BDB_PUT_ERROR;
00183 }
00184 return data.size;
00185 }
00186
00187
00210 Buffer get_fdb_data(DB* dp, Buffer id)
00211 {
00212 int ret;
00213 DBT key, data;
00214 Buffer dbdata;
00215
00216 memset(&key, 0, sizeof(DBT));
00217 memset(&data, 0, sizeof(DBT));
00218
00219 dbdata = init_Buffer();
00220 key.data = (void*)id.buf;
00221 key.size = (u_int32_t)id.vldsz;
00222 if (key.size<=0) {
00223 key.size = strlen((char*)id.buf);
00224 if (key.size<=0) {
00225 dbdata.state = JBXL_BDB_MEMOEY_ERROR;
00226 return dbdata;
00227 }
00228 }
00229
00230 ret = dp->get(dp, NULL, &key, &data, 0);
00231 if (ret!=0) {
00232 dbdata.state = JBXL_DBD_MEMORY_ERROR;
00233 return dbdata;
00234 }
00235
00236 dbdata = make_Buffer(data.size+1);
00237 if (dbdata.buf==NULL) {
00238 dbdata.state = JBXL_BDB_GET_ERROR;
00239 return dbdata;
00240 }
00241 memcpy(dbdata.buf, data.data, data.size);
00242 dbdata.vldsz = data.size;
00243 dbdata.buf[data.size] = '\0';
00244
00245 return dbdata;
00246 }
00247
00248
00273 Buffer get_fdb_data_file(char* fname, Buffer id)
00274 {
00275 int ret;
00276 DBT key, data;
00277 DB* dp;
00278 Buffer dbdata;
00279
00280 dbdata = init_Buffer();
00281 dp = open_fdb(fname, DB_RDONLY);
00282 if (dp==NULL) {
00283 dbdata.state = JBXL_BDB_OPEN_ERROR;
00284 return dbdata;
00285 }
00286
00287 memset(&key, 0, sizeof(DBT));
00288 memset(&data, 0, sizeof(DBT));
00289
00290 key.data = (char*)(id.buf);
00291 key.size = id.vldsz;
00292 if (key.size<=0) {
00293 key.size = strlen((char*)id.buf);
00294 if (key.size<=0) {
00295 dbdata.state = JBXL_BDB_KEY_ERROR;
00296 return dbdata;
00297 }
00298 }
00299
00300 ret = dp->get(dp, NULL, &key, &data, 0);
00301 close_fdb(&dp);
00302 if (ret!=0) {
00303 dbdata.state = JBXL_BDB_GET_ERROR;
00304 return dbdata;
00305 }
00306
00307 dbdata = make_Buffer(data.size+1);
00308 if (dbdata.buf==NULL) {
00309 dbdata.state = JBXL_BDB_MEMORY_ERROR;
00310 return dbdata;
00311 }
00312
00313 dbdata.vldsz = data.size;
00314 memcpy(dbdata.buf, data.data, data.size);
00315 dbdata.buf[data.size] = '\0';
00316
00317 return dbdata;
00318 }
00319
00320
00335 int del_fdb_data(DB* dp, Buffer id)
00336 {
00337 DBT key;
00338 int ret;
00339
00340 memset(&key, 0, sizeof(DBT));
00341 key.data = (char*)(id.buf);
00342 key.size = id.vldsz;
00343 if (key.size<=0) {
00344 key.size = strlen((char*)id.buf);
00345 if (key.size<=0) return FALSE;
00346 }
00347 ret = dp->del(dp, NULL, &key, 0);
00348
00349 if (ret!=0) {
00350 DEBUG_MODE dp->err(dp, ret, "DB->del");
00351 return FALSE;
00352 }
00353 return TRUE;
00354 }
00355
00356
00371 int del_fdb_data_file(char* fname, Buffer id)
00372 {
00373 DBT key;
00374 DB* dp;
00375 int ret;
00376
00377 dp = open_fdb(fname, 0);
00378 if (dp==NULL) return FALSE;
00379
00380 memset(&key, 0, sizeof(DBT));
00381 key.data = (char*)(id.buf);
00382 key.size = id.vldsz;
00383 if (key.size<=0) {
00384 key.size = strlen((char*)id.buf);
00385 if (key.size<=0) return FALSE;
00386 }
00387
00388 ret = dp->del(dp, NULL, &key, 0);
00389 close_fdb(&dp);
00390
00391 if (ret!=0) {
00392 DEBUG_MODE dp->err(dp, ret, "DB->del");
00393 return FALSE;
00394 }
00395 return TRUE;
00396 }
00397
00398
00406 tList* get_all_fdb_data(DB* dp)
00407 {
00408 int ret;
00409 DBT key, data;
00410 DBC* crsp;
00411
00412 tList* lt = NULL;
00413 tList* lp = NULL;
00414 Buffer id, dt;
00415
00416 if (dp==NULL) return NULL;
00417
00418 dp->cursor(dp, NULL, &crsp, 0);
00419 if (crsp==NULL) return NULL;
00420
00421 memset(&key, 0, sizeof(DBT));
00422 memset(&data, 0, sizeof(DBT));
00423
00424 ret = crsp->c_get(crsp, &key, &data, DB_NEXT);
00425 while (ret==0) {
00426 id = make_Buffer_bin(key.data, key.size);
00427 dt = make_Buffer_bin(data.data, data.size);
00428 lt = add_tList_node_Buffer(lt, id, dt);
00429 if (lp==NULL) lp = lt;
00430 free_Buffer(&id);
00431 free_Buffer(&dt);
00432
00433 ret = crsp->c_get(crsp, &key, &data, DB_NEXT);
00434 }
00435
00436 crsp->c_close(crsp);
00437
00438 return lp;
00439 }
00440
00441
00449 tList* get_all_fdb_data_file(char* fname)
00450 {
00451 DB* dp;
00452 tList* lp = NULL;
00453
00454 if (fname==NULL) return NULL;
00455
00456 dp = open_fdb(fname, DB_RDONLY);
00457 if (dp==NULL) return NULL;
00458
00459 lp = get_all_fdb_data(dp);
00460 close_fdb(&dp);
00461
00462 return lp;
00463 }
00464
00465
00466 #endif