00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef OST_IO_SQLITE_WRAP_HH
00020 #define OST_IO_SQLITE_WRAP_HH
00021
00022
00023
00024
00025
00026 #include <ost/message.hh>
00027 #include <boost/shared_ptr.hpp>
00028
00029 #include <ost/base.hh>
00030 #include <ost/message.hh>
00031
00032 #include "sqlite3.h"
00033 #include "sqlite_conv.hh"
00034
00035 namespace ost { namespace db {
00036
00038 class Database;
00039 typedef boost::shared_ptr<Database> DatabasePtr;
00040
00041 class PreparedStatement;
00042 typedef boost::shared_ptr<PreparedStatement> PreparedStatementPtr;
00043
00044 class DLLEXPORT_OST_DB PreparedStatement {
00045 friend class Database;
00046 public:
00047 PreparedStatement();
00048 ~PreparedStatement();
00049
00050 sqlite3_stmt* Handle()
00051 {
00052 return statement_;
00053 }
00055 bool Submit()
00056 {
00057 return sqlite3_step(statement_)==SQLITE_DONE;
00058 }
00060 void BindInt(int col, int value)
00061 {
00062 sqlite3_bind_int(statement_, col, value);
00063 }
00065 void BindInt64(int col, sqlite3_int64 value)
00066 {
00067 sqlite3_bind_int64(statement_, col, value);
00068 }
00070 void BindText(int col, const String& text)
00071 {
00072 sqlite3_bind_text(statement_, col, text.c_str(),
00073 static_cast<int>(text.size()), NULL);
00074 }
00076 void BindBlob(int col, const char* start, size_t size)
00077 {
00078 sqlite3_bind_blob(statement_, col, start, size, NULL);
00079 }
00080 private:
00081 sqlite3_stmt* statement_;
00082 };
00083
00084 class DLLEXPORT DatabaseError : public Error {
00085 public:
00086 DatabaseError(const String& msg):
00087 Error(msg)
00088 {
00089
00090 }
00091 };
00092
00110 template <typename R>
00111 class DLLEXPORT_OST_DB RowSet {
00112 public:
00113 RowSet(PreparedStatementPtr stmt):
00114 stmt_(stmt), value_()
00115 {
00116 this->Step();
00117 }
00118 RowSet():
00119 stmt_(), value_(), cur_val_(SQLITE_DONE)
00120 { }
00121 R& operator*() {
00122 return value_;
00123 }
00124 RowSet<R>& operator++()
00125 {
00126 this->Step();
00127 return *this;
00128 }
00129
00130 bool AtEnd()
00131 {
00132 return cur_val_!=SQLITE_ROW;
00133 }
00134 private:
00135 void Step()
00136 {
00137 cur_val_=sqlite3_step(stmt_->Handle());
00138 if (cur_val_==SQLITE_ROW) {
00139 SqlConvert(stmt_->Handle(), value_);
00140 }
00141 }
00142 PreparedStatementPtr stmt_;
00143 R value_;
00144 int cur_val_;
00145 };
00146
00148 class DLLEXPORT_OST_DB Database {
00149 public:
00154 static DatabasePtr Open(const String& database);
00155
00156 ~Database();
00160 PreparedStatementPtr Prepare(const String& query);
00161
00163 sqlite3* Handle()
00164 {
00165 return conn_;
00166 }
00167
00168 sqlite3_int64 LastRowID();
00172 DatabasePtr Copy(const String& filename);
00173 private:
00174 sqlite3* conn_;
00175 };
00176
00177 }}
00178
00179 #endif