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
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
00239
00240
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