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 dba_db m_db;
00062
00063 private:
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 {
00075 checked(dba_db_create(dsn.c_str(), user.c_str(), password.c_str(), &m_db));
00076 }
00077 ~DB()
00078 {
00079 if (m_db)
00080 dba_db_delete(m_db);
00081 }
00082
00090 void disconnect()
00091 {
00092 if (m_db)
00093 {
00094 dba_db_delete(m_db);
00095 m_db = 0;
00096 }
00097 }
00098
00103 void reset(const std::string& repinfo_file = std::string())
00104 {
00105 if (repinfo_file == std::string())
00106 checked(dba_db_reset(m_db, NULL));
00107 else
00108 checked(dba_db_reset(m_db, repinfo_file.c_str()));
00109 }
00110
00115 Cursor queryAna(const Record& query)
00116 {
00117 int count;
00118 dba_db_cursor cur;
00119 checked(dba_db_ana_query(m_db, query.rec(), &cur, &count));
00120 return Cursor(cur);
00121 }
00122
00126 Cursor query(const Record& query)
00127 {
00128 int count;
00129 dba_db_cursor cur;
00130 checked(dba_db_query(m_db, query.rec(), &cur, &count));
00131 return Cursor(cur);
00132 }
00133
00138 Cursor queryAnaSummary(const Record& query);
00139
00141 Cursor queryLevels(const Record& query);
00142
00145 Cursor queryTimeRanges(const Record& query);
00146
00149 Cursor queryLevelsAndTimeRanges(const Record& query);
00150
00152 Cursor queryVariableTypes(const Record& query);
00153
00156 Cursor queryIdents(const Record& query);
00157
00160 Cursor queryReports(const Record& query);
00161
00164 Cursor queryDateTimes(const Record& query);
00165
00167 int attrQuery(int context, dba_varcode var, Record& res) const
00168 {
00169 int count;
00170 checked(dba_db_qc_query(m_db, context, var, NULL, 0, res.rec(), &count));
00171 return count;
00172 }
00173
00175 int attrQuery(int context, dba_varcode var, const std::vector<dba_varcode>& wanted, Record& res) const;
00176
00191 int insert(Record& rec, bool canReplace, bool addToPseudoana, int *anaid = NULL)
00192 {
00193 int context;
00194 checked(dba_db_insert(m_db, rec.rec(), canReplace, addToPseudoana,
00195 anaid, &context));
00196 return context;
00197 }
00198
00199 void attrInsert(int context, dba_varcode var, Record& data)
00200 {
00201 checked(dba_db_qc_insert(m_db, context, var, data.rec()));
00202 }
00203 void attrInsertCurrent(const Cursor& cur, Record& data)
00204 {
00205 attrInsert(cur.contextID(), cur.varcode(), data);
00206 }
00207 void attrInsertNew(int context, dba_varcode var, Record& data)
00208 {
00209 checked(dba_db_qc_insert_new(m_db, context, var, data.rec()));
00210 }
00211 void attrInsertNewCurrent(const Cursor& cur, Record& data)
00212 {
00213 attrInsertNew(cur.contextID(), cur.varcode(), data);
00214 }
00215
00217 void remove(const Record& query)
00218 {
00219 checked(dba_db_remove(m_db, query.rec()));
00220 }
00221
00223 void removeOrphans()
00224 {
00225 checked(dba_db_remove_orphans(m_db));
00226 }
00227
00228 void attrRemove(int context, dba_varcode var, dba_varcode attr)
00229 {
00230 dba_varcode codes[1];
00231 codes[0] = attr;
00232 checked(dba_db_qc_remove(m_db, context, var, codes, 1));
00233 }
00234 void attrRemoveAll(int context, dba_varcode var)
00235 {
00236 checked(dba_db_qc_remove(m_db, context, var, NULL, 0));
00237 }
00238 void attrRemoveList(int context, dba_varcode var, const std::vector<dba_varcode>& attrs)
00239 {
00240 dba_varcode codes[attrs.size()];
00241 std::copy(attrs.begin(), attrs.end(), &codes[0]);
00242 checked(dba_db_qc_remove(m_db, context, var, codes, attrs.size()));
00243 }
00244
00245
00246
00247
00248
00249
00250
00252 void exportResults(Record& query, dba_encoding encoding, const std::string& file);
00253
00256 void exportResultsAsGeneric(Record& query, dba_encoding encoding, const std::string& file);
00257
00259 const dba_db db() const
00260 {
00261 return m_db;
00262 }
00264 dba_db db()
00265 {
00266 return m_db;
00267 }
00268 };
00269
00270 }
00271
00272 #endif