• Main Page
  • Data Structures
  • Files
  • File List

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

Generated on Wed Dec 8 2010 23:34:21 for dballe++ by  doxygen 1.7.2