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