00001 #ifndef LUX_STORAGE_CURIAHASH_H 00002 #define LUX_STORAGE_CURIAHASH_H 00003 00004 #include "lux/lux.h" 00005 #include "storage_engine.h" 00006 #include "data_unit.h" 00007 #include <curia.h> 00008 #include <cassert> 00009 #include <iostream> 00010 00011 namespace Lux { 00012 00013 class CuriaHash { 00014 00015 public: 00016 CuriaHash() 00017 {} 00018 00019 CuriaHash(const char *filename, db_flags_t open_flags) 00020 { 00021 this->open(filename, open_flags); 00022 } 00023 00024 CuriaHash(std::string filename, db_flags_t open_flags) 00025 { 00026 this->open(filename.c_str(), open_flags); 00027 } 00028 00029 bool open(const char *filename, db_flags_t open_flags) 00030 { 00031 assert(filename); 00032 int oflags = 0; 00033 if (open_flags & DB_RDONLY) { 00034 oflags = CR_OREADER; 00035 } 00036 if (open_flags & DB_RDWR) { 00037 oflags = CR_OWRITER; 00038 } 00039 if (open_flags & DB_CREAT) { 00040 oflags = CR_OWRITER | CR_OCREAT; 00041 mkdir(filename); 00042 } 00043 if (open_flags & DB_TRUNC) { 00044 oflags |= CR_OTRUNC; 00045 } 00046 if (!(curia_ = cropen(filename, oflags, -1, -1))) { 00047 return false; 00048 } 00049 return true; 00050 } 00051 00052 bool close() 00053 { 00054 if (!crclose(curia_)) { 00055 return false; 00056 } 00057 curia_ = NULL; 00058 return true; 00059 } 00060 00061 bool put(LuxDataUnit &key, LuxDataUnit &val) 00062 { 00063 return __put(key, val, CR_DOVER); 00064 } 00065 00066 bool put(LuxDataUnit *key, LuxDataUnit *val) 00067 { 00068 return put(*key, *val); 00069 } 00070 00071 bool append(LuxDataUnit &key, LuxDataUnit &val) 00072 { 00073 return __put(key, val, CR_DCAT); 00074 } 00075 00076 bool append(LuxDataUnit *key, LuxDataUnit *val) 00077 { 00078 return append(*key, *val); 00079 } 00080 00081 bool get(LuxDataUnit &key, LuxDataUnit &val) 00082 { 00083 assert(key.get_data()); 00084 int val_size; 00085 void *val_data; 00086 00087 val_data = crget(curia_, static_cast<const char *>(key.get_data()), 00088 key.get_size(), 0, -1, &(val_size)); 00089 00090 if (val_data == NULL) { 00091 return false; 00092 } 00093 00094 val.set_cleanup_needed(true); 00095 val.set_data(val_data); 00096 val.set_size(static_cast<unsigned int>(val_size)); 00097 00098 return true; 00099 } 00100 00101 bool get(LuxDataUnit *key, LuxDataUnit *val) 00102 { 00103 return get(*key, *val); 00104 } 00105 00106 bool del(LuxDataUnit &key) 00107 { 00108 assert(key.get_data()); 00109 if (crout(curia_, static_cast<const char *>(key.get_data()), 00110 key.get_size())) { 00111 return true; 00112 } 00113 return false; 00114 } 00115 bool del(LuxDataUnit *key) 00116 { 00117 return del(*key); 00118 } 00119 00120 protected: 00121 ~CuriaHash() 00122 { 00123 if (curia_ != NULL) { 00124 if (crclose(curia_)) { 00125 curia_ = NULL; 00126 } 00127 } 00128 } 00129 00130 private: 00131 CURIA *curia_; 00132 00133 bool __put(LuxDataUnit &key, LuxDataUnit &val, int mode) 00134 { 00135 assert(key.get_data() && val.get_data()); 00136 if (crput(curia_, 00137 static_cast<const char *>(key.get_data()), 00138 key.get_size(), 00139 static_cast<const char *>(val.get_data()), 00140 val.get_size(), 00141 mode) 00142 ) { 00143 return true; 00144 } 00145 return false; 00146 } 00147 }; 00148 } 00149 00150 #endif