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;
00209 void BindBlob(int column, const void* data, int numberOfBytes = -1) const;
00214 void BindZeroBlob(int column, int length) const;
00215
00218 void ExecuteAndFree();
00224 void GetTable(const std::string &sql, unsigned short consoleOutputColumnWidth = 20) const;
00225
00231 void GetTableColumnMetadata(const std::string &tableName, const std::string &columnName) const;
00232
00235 void ClearBindings() const;
00236
00240 void Reset() const;
00241
00243 void BeginTransaction();
00246 void CommitTransaction();
00248 inline void RollbackTransaction()
00249 {
00250 SqlStatement("ROLLBACK;");
00251 FreeAllStatements();
00252 }
00253
00260 inline void Transaction(const char *sql) {mTransactionSQL[mTransactionID++] = std::make_pair(sql, false);}
00267 inline void Transaction(const std::string &sql) {mTransactionSQL[mTransactionID++] = std::make_pair(sql.c_str(), false);}
00274 inline void Transaction(const wchar_t *sql) {mTransactionSQL16[mTransactionID++] = std::make_pair(sql, false);}
00275
00281 void SecureTransaction(const char *sql);
00287 void SecureTransaction(const std::string sql);
00293 void SecureTransaction(const wchar_t *sql);
00294
00295 protected:
00298 void Prepare(const char *sqlStatement);
00301 void Prepare(const wchar_t *sqlStatement);
00303 bool Step() const;
00305 void CheckStatement() const;
00307 void CheckDatabase() const;
00309 void FreeAllStatements();
00310
00312 template<class T>
00313 inline void DeleteTransactionSqlStr(bool isMemAllocated, T *str)
00314 {
00315 if(isMemAllocated)
00316 delete[] str;
00317 }
00318
00320 void CleanUpTransaction();
00321
00322 private:
00324 struct sqlite3_stmt *mStatement;
00326 SQLiteDatabase *mDatabase;
00327
00329 typedef std::map<unsigned short , std::pair<const char* , bool > > TTransactionSQL;
00331 typedef std::map<unsigned short , std::pair<const wchar_t* , bool > > TTransactionSQL16;
00332
00334 TTransactionSQL mTransactionSQL;
00336 TTransactionSQL16 mTransactionSQL16;
00337
00339 unsigned short mTransactionID;
00340
00341 };
00342 };
00343
00344 #endif // KompexSQLiteStatement_H