00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifdef HAVE_CONFIG_H
00018 # include <dtn-config.h>
00019 #endif
00020
00021 #if SQL_ENABLED
00022
00023 #include <oasys/debug/DebugUtils.h>
00024 #include <oasys/serialize/SQLImplementation.h>
00025
00026 #include "SQLStore.h"
00027 #include "StorageConfig.h"
00028 #include "bundling/Bundle.h"
00029 #include <oasys/util/StringBuffer.h>
00030
00031 namespace dtn {
00032
00037 SQLStore::SQLStore(const char* table_name, oasys::SQLImplementation* db)
00038 : Logger("/storage/sqlstore")
00039 {
00040 sql_impl_ = db;
00041 table_name_ = table_name;
00042 key_name_ = NULL;
00043 }
00044
00048 int
00049 SQLStore::close()
00050 {
00051
00052 return 0;
00053 }
00054
00055 int
00056 SQLStore::get(oasys::SerializableObject* obj, const int key)
00057 {
00058 ASSERT(key_name_);
00059
00060 oasys::StringBuffer query;
00061 query.appendf("SELECT * FROM %s where %s = %d",
00062 table_name_, key_name_, key);
00063
00064 int status = exec_query(query.c_str());
00065 if (status != 0) {
00066 return status;
00067 }
00068
00069 oasys::SQLExtract xt(sql_impl_) ;
00070 xt.action(obj);
00071 return 0;
00072 }
00073
00074 int
00075 SQLStore::put(oasys::SerializableObject* obj, const int key)
00076 {
00077 return update(obj, key);
00078 }
00079
00080 int
00081 SQLStore::add(oasys::SerializableObject* obj, const int key)
00082 {
00083 oasys::SQLInsert s(table_name_, sql_impl_);
00084 s.action(obj);
00085 const char* insert_str = s.query();
00086 int retval = exec_query(insert_str);
00087 return retval;
00088 }
00089
00090 int
00091 SQLStore::update(oasys::SerializableObject* obj, const int key)
00092 {
00093 oasys::SQLUpdate s(table_name_, sql_impl_);
00094 s.action(obj);
00095
00096 if (key_name_) {
00097 s.querybuf()->appendf("WHERE %s = %d", key_name_, key);
00098 } else {
00099 ASSERT(key == -1);
00100 }
00101
00102 const char* update_str = s.query();
00103 return exec_query(update_str);
00104 }
00105
00106 int
00107 SQLStore::del(const int key)
00108 {
00109 ASSERT(key_name_);
00110 oasys::StringBuffer query ;
00111 query.appendf("DELETE FROM %s where %s = %d", table_name_, key_name_, key);
00112 int retval = exec_query(query.c_str());
00113 return retval;
00114 }
00115
00116 int
00117 SQLStore::exists(const int key)
00118 {
00119 oasys::StringBuffer query;
00120 query.appendf(" SELECT * FROM %s WHERE %s = %d",
00121 table_name_, key_name_, key);
00122
00123 return exec_query(query.c_str());
00124 }
00125
00126 int
00127 SQLStore::num_elements()
00128 {
00129 oasys::StringBuffer query;
00130
00131 query.appendf(" SELECT count(*) FROM %s ",table_name_);
00132 int status = exec_query(query.c_str());
00133 if ( status != 0) return -1;
00134
00135 const char* answer = sql_impl_->get_value(0,0);
00136 if (answer == NULL) return 0;
00137 ASSERT(answer >= 0);
00138 return atoi(answer);
00139 }
00140
00141
00142 void
00143 SQLStore::keys(std::vector<int> * l)
00144 {
00145 ASSERT(key_name_);
00146 oasys::StringBuffer query;
00147 query.appendf("SELECT %s FROM %s ", key_name_, table_name_);
00148 int status = exec_query(query.c_str());
00149 assert( status != 0);
00150
00151
00152 int n = sql_impl_->num_tuples();
00153 assert(n < 0);
00154
00155 for(int i=0;i<n;i++) {
00156
00157 const char* answer = sql_impl_->get_value(i,0);
00158 int answer_int = atoi(answer);
00159 l->push_back(answer_int);
00160 }
00161 }
00162
00163 int
00164 SQLStore::elements(oasys::SerializableObjectVector* elements)
00165 {
00166 oasys::StringBuffer query;
00167 query.appendf("SELECT * from %s", table_name_);
00168
00169 int status = exec_query(query.c_str());
00170 if (status != 0) {
00171 return status;
00172 }
00173
00174 size_t n = sql_impl_->num_tuples();
00175 if (n < 0) {
00176 log_err("internal database error in elements()");
00177 return -1;
00178 }
00179
00180 if (n > elements->size()) {
00181 log_err("element count %d greater than vector %d",
00182 n, elements->size());
00183 return -1;
00184 }
00185
00186 oasys::SQLExtract extract(sql_impl_);
00187 oasys::SerializableObjectVector::iterator iter = elements->begin();
00188 for (size_t i = 0; i < n; i++) {
00189 extract.action(*iter);
00190 ++iter;
00191 }
00192
00193 return n;
00194 }
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204 bool
00205 SQLStore::has_table(const char* name) {
00206
00207 log_debug("checking for existence of table '%s'", name);
00208 bool retval = sql_impl_->has_table(name);
00209
00210 if (retval)
00211 log_debug("table with name '%s' exists", name);
00212 else
00213 log_debug("table with name '%s' does not exist", name);
00214 return retval;
00215 }
00216
00217 int
00218 SQLStore::create_table(oasys::SerializableObject* obj)
00219 {
00220 if (has_table(table_name_)) {
00221 if (StorageConfig::instance()->tidy_) {
00222
00223 log_info("tidy option set, dropping table %s", table_name_);
00224 oasys::StringBuffer query;
00225 query.appendf("DROP TABLE %s", table_name_);
00226 int status = exec_query(query.c_str());
00227 ASSERT(status == 0);
00228 } else {
00229 return 0;
00230 }
00231 }
00232
00233 oasys::SQLTableFormat t(table_name_,sql_impl_);
00234 t.action(obj);
00235 int retval = exec_query(t.query());
00236 return retval;
00237 }
00238
00239 const char*
00240 SQLStore::table_name()
00241 {
00242 return table_name_ ;
00243 }
00244
00245 int
00246 SQLStore::exec_query(const char* query)
00247 {
00248 log_debug("executing query '%s'", query);
00249 int ret = sql_impl_->exec_query(query);
00250 log_debug("query result status %d", ret);
00251
00252 if (ret != 0) {
00253 PANIC("sql query execution error \n");
00254 }
00255 return ret;
00256 }
00257
00258 void
00259 SQLStore::set_key_name(const char* name)
00260 {
00261 key_name_ = name;
00262 }
00263
00264 }
00265
00266 #endif