db.h

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     // 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     {
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     void attrRemoveCurrent(const Cursor& cur, const std::vector<dba_varcode>& attrs = std::vector<dba_varcode>())
00246     {
00247         attrRemove(cur.contextID(), cur.varcode(), attrs);
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

Generated on Fri Jun 22 15:34:04 2007 for dballe++ by  doxygen 1.5.2