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(const 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
00298 std::string GetSqlResultString(const std::string &sql, const std::string &defaultReturnValue = "");
00302 std::string GetSqlResultString(const char *sql, const std::string &defaultReturnValue = "");
00306 std::string GetSqlResultString(const wchar_t *sql, const std::string &defaultReturnValue = "");
00307
00311 int GetSqlResultInt(const std::string &sql, int defaultReturnValue = -1);
00315 int GetSqlResultInt(const char *sql, int defaultReturnValue = -1);
00319 int GetSqlResultInt(const wchar_t *sql, int defaultReturnValue = -1);
00320
00324 int64 GetSqlResultInt64(const std::string &sql, int64 defaultReturnValue = -1);
00328 int64 GetSqlResultInt64(const char *sql, int64 defaultReturnValue = -1);
00332 int64 GetSqlResultInt64(const wchar_t *sql, int64 defaultReturnValue = -1);
00333
00337 double GetSqlResultDouble(const std::string &sql, double defaultReturnValue = -1);
00341 double GetSqlResultDouble(const char *sql, double defaultReturnValue = -1);
00345 double GetSqlResultDouble(const wchar_t *sql, double defaultReturnValue = -1);
00346
00350 const unsigned char *GetSqlResultCString(const std::string &sql, const unsigned char *defaultReturnValue = 0);
00354 const unsigned char *GetSqlResultCString(const char *sql, const unsigned char *defaultReturnValue = 0);
00358 const unsigned char *GetSqlResultCString(const wchar_t *sql, const unsigned char *defaultReturnValue = 0);
00359
00363 wchar_t *GetSqlResultString16(const std::string &sql, wchar_t *defaultReturnValue = 0);
00367 wchar_t *GetSqlResultString16(const char *sql, wchar_t *defaultReturnValue = 0);
00371 wchar_t *GetSqlResultString16(const wchar_t *sql, wchar_t *defaultReturnValue = 0);
00372
00376 const void *GetSqlResultBlob(const std::string &sql, const void *defaultReturnValue = 0);
00380 const void *GetSqlResultBlob(const char *sql, const void *defaultReturnValue = 0);
00384 const void *GetSqlResultBlob(const wchar_t *sql, const void *defaultReturnValue = 0);
00385
00387 unsigned int GetNumberOfRows();
00388
00389 protected:
00392 void Prepare(const char *sqlStatement);
00395 void Prepare(const wchar_t *sqlStatement);
00397 bool Step() const;
00399 void CheckStatement() const;
00401 void CheckDatabase() const;
00403 void FreeAllStatements();
00404
00406 void CleanUpTransaction();
00407
00411 template<class T>
00412 inline void DeleteTransactionSqlStr(bool isMemAllocated, T *str)
00413 {
00414 if(isMemAllocated)
00415 delete[] str;
00416 }
00417
00422 template<class S, class T>
00423 T GetColumnValue(S sql, T(Kompex::SQLiteStatement::*getColumnFunc)(int columnNumber)const, T defaultReturnValue);
00424
00425 private:
00427 struct sqlite3_stmt *mStatement;
00429 SQLiteDatabase *mDatabase;
00430
00432 typedef std::map<unsigned short , std::pair<const char* , bool > > TTransactionSQL;
00434 typedef std::map<unsigned short , std::pair<const wchar_t* , bool > > TTransactionSQL16;
00435
00437 TTransactionSQL mTransactionSQL;
00439 TTransactionSQL16 mTransactionSQL16;
00440
00442 unsigned short mTransactionID;
00443
00444 };
00445 };
00446
00447 #endif // KompexSQLiteStatement_H