dballe++ 4.0.18
|
00001 #ifndef DBALLE_CPP_DB_H 00002 #define DBALLE_CPP_DB_H 00003 00004 #include <dballe/db/db.h> 00005 #include <dballe/core/file.h> 00006 00007 #include <dballe++/record.h> 00008 #include <vector> 00009 00010 namespace dballe { 00011 00013 class Cursor 00014 { 00015 dba_db_cursor m_cur; 00016 00017 public: 00019 Cursor(const Cursor& cur) 00020 { 00021 m_cur = cur.m_cur; 00022 Cursor* nc_cur = const_cast<Cursor*>(&cur); 00023 nc_cur->m_cur = 0; 00024 } 00026 Cursor& operator=(const Cursor& cur); 00027 00029 Cursor(dba_db_cursor cur) : m_cur(cur) {} 00030 ~Cursor(); 00031 00033 int remaining() const; 00034 00036 dba_varcode varcode() const; 00037 00039 int contextID() const; 00040 00046 bool next(Record& rec); 00047 00050 int attributes(Record& res); 00051 00054 int attributes(const std::vector<dba_varcode>& wanted, Record& res); 00055 }; 00056 00057 00059 class DB 00060 { 00061 private: 00062 dba_db m_db; 00063 00064 // Forbid copying 00065 DB(const DB& db); 00066 DB& operator=(const DB& var); 00067 00068 public: 00070 DB(dba_db db) : m_db(db) {} 00071 00073 DB(const std::string& dsn, const std::string& user, const std::string& password); 00074 ~DB(); 00075 00083 void disconnect() 00084 { 00085 if (m_db) 00086 { 00087 dba_db_delete(m_db); 00088 m_db = 0; 00089 } 00090 } 00091 00096 void reset(const std::string& repinfo_file = std::string()) 00097 { 00098 if (repinfo_file == std::string()) 00099 checked(dba_db_reset(m_db, NULL)); 00100 else 00101 checked(dba_db_reset(m_db, repinfo_file.c_str())); 00102 } 00103 00108 Cursor queryAna(const Record& query) 00109 { 00110 int count; 00111 dba_db_cursor cur; 00112 checked(dba_db_ana_query(m_db, query.rec(), &cur, &count)); 00113 return Cursor(cur); 00114 } 00115 00119 Cursor query(const Record& query) 00120 { 00121 int count; 00122 dba_db_cursor cur; 00123 checked(dba_db_query(m_db, query.rec(), &cur, &count)); 00124 return Cursor(cur); 00125 } 00126 00131 Cursor queryAnaSummary(const Record& query); 00132 00134 Cursor queryLevels(const Record& query); 00135 00138 Cursor queryTimeRanges(const Record& query); 00139 00142 Cursor queryLevelsAndTimeRanges(const Record& query); 00143 00145 Cursor queryVariableTypes(const Record& query); 00146 00149 Cursor queryIdents(const Record& query); 00150 00153 Cursor queryReports(const Record& query); 00154 00157 Cursor queryDateTimes(const Record& query); 00158 00160 int attrQuery(int context, dba_varcode var, Record& res) const 00161 { 00162 int count; 00163 checked(dba_db_qc_query(m_db, context, var, NULL, 0, res.rec(), &count)); 00164 return count; 00165 } 00166 00168 int attrQuery(int context, dba_varcode var, const std::vector<dba_varcode>& wanted, Record& res) const; 00169 00184 int insert(Record& rec, bool canReplace, bool addToPseudoana, int *anaid = NULL) 00185 { 00186 int context; 00187 checked(dba_db_insert(m_db, rec.rec(), canReplace, addToPseudoana, 00188 anaid, &context)); 00189 return context; 00190 } 00191 00192 void attrInsert(int context, dba_varcode var, Record& data) 00193 { 00194 checked(dba_db_qc_insert(m_db, context, var, data.rec())); 00195 } 00196 void attrInsertCurrent(const Cursor& cur, Record& data) 00197 { 00198 attrInsert(cur.contextID(), cur.varcode(), data); 00199 } 00200 void attrInsertNew(int context, dba_varcode var, Record& data) 00201 { 00202 checked(dba_db_qc_insert_new(m_db, context, var, data.rec())); 00203 } 00204 void attrInsertNewCurrent(const Cursor& cur, Record& data) 00205 { 00206 attrInsertNew(cur.contextID(), cur.varcode(), data); 00207 } 00208 00210 void remove(const Record& query) 00211 { 00212 checked(dba_db_remove(m_db, query.rec())); 00213 } 00214 00216 void removeOrphans() 00217 { 00218 checked(dba_db_remove_orphans(m_db)); 00219 } 00220 00221 void attrRemove(int context, dba_varcode var, dba_varcode attr) 00222 { 00223 dba_varcode codes[1]; 00224 codes[0] = attr; 00225 checked(dba_db_qc_remove(m_db, context, var, codes, 1)); 00226 } 00227 void attrRemoveAll(int context, dba_varcode var) 00228 { 00229 checked(dba_db_qc_remove(m_db, context, var, NULL, 0)); 00230 } 00231 void attrRemoveList(int context, dba_varcode var, const std::vector<dba_varcode>& attrs) 00232 { 00233 dba_varcode codes[attrs.size()]; 00234 std::copy(attrs.begin(), attrs.end(), &codes[0]); 00235 checked(dba_db_qc_remove(m_db, context, var, codes, attrs.size())); 00236 } 00237 /* 00238 void attrRemoveCurrent(const Cursor& cur, const std::vector<dba_varcode>& attrs = std::vector<dba_varcode>()) 00239 { 00240 attrRemove(cur.contextID(), cur.varcode(), attrs); 00241 } 00242 */ 00243 00245 void exportResults(Record& query, dba_encoding encoding, const std::string& file); 00246 00249 void exportResultsAsGeneric(Record& query, dba_encoding encoding, const std::string& file); 00250 00252 const dba_db db() const 00253 { 00254 return m_db; 00255 } 00257 dba_db db() 00258 { 00259 return m_db; 00260 } 00261 }; 00262 00269 class TestDB : public DB 00270 { 00271 public: 00272 TestDB(); 00273 00274 bool valid() const { return db() != 0; } 00275 }; 00276 00277 } 00278 00279 #endif