00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef KompexSQLiteStatement_H
00020 #define KompexSQLiteStatement_H
00021
00022 #include <map>
00023 #include <string>
00024
00025 #include "KompexSQLitePrerequisites.h"
00026
00027 namespace Kompex
00028 {
00029 #if defined(_MSC_VER) || defined(__BORLANDC__)
00030 typedef __int64 int64;
00031 typedef unsigned __int64 uint64;
00032 #else
00033 typedef long long int int64;
00034 typedef unsigned long long int uint64;
00035 #endif
00036
00037 class SQLiteDatabase;
00038
00039 class _SQLiteWrapperExport SQLiteStatement
00040 {
00041 public:
00044 SQLiteStatement(SQLiteDatabase *db);
00046 virtual ~SQLiteStatement();
00047
00051 void SqlStatement(const std::string &sqlStatement);
00055 void SqlStatement(const char *sqlStatement);
00059 void SqlStatement(const wchar_t *sqlStatement);
00060
00064 inline void Sql(const std::string &sql) {Prepare(sql.c_str());}
00068 inline void Sql(wchar_t *sql) {Prepare(sql);}
00072 inline void Sql(const char *sql) {Prepare(sql);}
00073
00075 bool FetchRow() const;
00077 void FreeQuery();
00078
00083 float SqlAggregateFuncResult(const std::string &countSql);
00088 float SqlAggregateFuncResult(wchar_t *countSql);
00093 float SqlAggregateFuncResult(const char *countSql);
00094
00097 const char *GetColumnName(int column) const;
00100 wchar_t *GetColumnName16(int column) const;
00101
00110 int GetColumnType(int column) const;
00111
00114 const unsigned char *GetColumnCString(int column) const;
00117 std::string GetColumnString(int column) const;
00120 wchar_t *GetColumnString16(int column) const;
00123 double GetColumnDouble(int column) const;
00126 int GetColumnInt(int column) const;
00129 int64 GetColumnInt64(int column) const;
00132 const void *GetColumnBlob(int column) const;
00133
00136 int GetColumnCount() const;
00139 int GetColumnBytes(int column) const;
00142 int GetColumnBytes16(int column) const;
00145 const char *GetColumnDatabaseName(int column) const;
00148 wchar_t *GetColumnDatabaseName16(int column) const;
00151 const char *GetColumnTableName(int column) const;
00154 wchar_t *GetColumnTableName16(int column) const;
00157 const char *GetColumnOriginName(int column) const;
00160 wchar_t *GetColumnOriginName16(int column) const;
00163 const char *GetColumnDeclaredDatatype(int column) const;
00166 wchar_t *GetColumnDeclaredDatatype16(int column) const;
00169 inline int GetDataCount() const {return sqlite3_data_count(mStatement);}
00170
00175 void BindInt(int column, int value) const;
00180 void BindString(int column, const std::string &string) const;
00185 void BindString16(int column, const wchar_t *string) const;
00190 void BindDouble(int column, double value) const;
00195 void BindInt64(int column, int64 value) const;
00199 void BindNull(int column) const;
00204 void BindBlob(int column, const void* data) const;
00209 void BindZeroBlob(int column, int length) const;
00210
00213 void ExecuteAndFree();
00219 void GetTable(const std::string &sql, unsigned short consoleOutputColumnWidth = 20) const;
00220
00226 void GetTableColumnMetadata(const std::string &tableName, const std::string &columnName) const;
00227
00229 void ClearBindings() const;
00230
00232 void BeginTransaction();
00235 void CommitTransaction();
00237 inline void RollbackTransaction()
00238 {
00239 SqlStatement("ROLLBACK;");
00240 FreeAllStatements();
00241 }
00242
00249 inline void Transaction(const char *sql) {mTransactionSQL[mTransactionID++] = std::make_pair(sql, false);}
00256 inline void Transaction(const std::string &sql) {mTransactionSQL[mTransactionID++] = std::make_pair(sql.c_str(), false);}
00263 inline void Transaction(const wchar_t *sql) {mTransactionSQL16[mTransactionID++] = std::make_pair(sql, false);}
00264
00270 void SecureTransaction(const char *sql);
00276 void SecureTransaction(const std::string sql);
00282 void SecureTransaction(const wchar_t *sql);
00283
00284 protected:
00287 void Prepare(const char *sqlStatement);
00290 void Prepare(const wchar_t *sqlStatement);
00292 bool Step() const;
00294 void CheckStatement() const;
00296 void CheckDatabase() const;
00298 void FreeAllStatements();
00299
00301 template<class T>
00302 inline void DeleteTransactionSqlStr(bool isMemAllocated, T *str)
00303 {
00304 if(isMemAllocated)
00305 delete[] str;
00306 }
00307
00309 void CleanUpTransaction();
00310
00311 private:
00313 struct sqlite3_stmt *mStatement;
00315 SQLiteDatabase *mDatabase;
00316
00318 typedef std::map<unsigned short , std::pair<const char* , bool > > TTransactionSQL;
00320 typedef std::map<unsigned short , std::pair<const wchar_t* , bool > > TTransactionSQL16;
00321
00323 TTransactionSQL mTransactionSQL;
00325 TTransactionSQL16 mTransactionSQL16;
00326
00328 unsigned short mTransactionID;
00329
00330 };
00331 };
00332
00333 #endif // KompexSQLiteStatement_H