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 "sqlite3.h"
00026
00027 #include "KompexSQLitePrerequisites.h"
00028
00029 namespace Kompex
00030 {
00031 class SQLiteDatabase;
00032
00034 class _SQLiteWrapperExport SQLiteStatement
00035 {
00036 public:
00039 SQLiteStatement(SQLiteDatabase *db);
00041 virtual ~SQLiteStatement();
00042
00048 inline void SqlStatement(const std::string &sqlStatement) {SqlStatement(sqlStatement.c_str());}
00054 void SqlStatement(const char *sqlStatement);
00060 inline void SqlStatement(const std::wstring &sqlStatement) {SqlStatement(sqlStatement.c_str());}
00066 void SqlStatement(const wchar_t *sqlStatement);
00067
00071 inline void Sql(const std::string &sql) {Prepare(sql.c_str());}
00075 inline void Sql(const char *sql) {Prepare(sql);}
00079 inline void Sql(const std::wstring &sql) {Prepare(sql.c_str());}
00083 inline void Sql(const wchar_t *sql) {Prepare(sql);}
00084
00087 bool FetchRow() const;
00089 void FreeQuery();
00090
00095 float SqlAggregateFuncResult(const std::string &countSql);
00100 float SqlAggregateFuncResult(wchar_t *countSql);
00105 float SqlAggregateFuncResult(const char *countSql);
00106
00110 const char *GetColumnName(int column) const;
00114 const char *GetColumnName(const std::string &column) const;
00115
00119 wchar_t *GetColumnName16(int column) const;
00123 wchar_t *GetColumnName16(const std::string &column) const;
00124
00134 int GetColumnType(int column) const;
00144 int GetColumnType(const std::string &column) const;
00145
00150 const unsigned char *GetColumnCString(int column) const;
00155 const unsigned char *GetColumnCString(const std::string &column) const;
00156
00161 std::string GetColumnString(int column) const;
00166 std::string GetColumnString(const std::string &column) const;
00167
00172 wchar_t *GetColumnString16(int column) const;
00177 wchar_t *GetColumnString16(const std::string &column) const;
00178
00182 double GetColumnDouble(int column) const;
00186 double GetColumnDouble(const std::string &column) const;
00187
00191 int GetColumnInt(int column) const;
00195 int GetColumnInt(const std::string &column) const;
00196
00203 bool GetColumnBool(int column) const;
00210 bool GetColumnBool(const std::string &column) const;
00211
00215 int64 GetColumnInt64(int column) const;
00219 int64 GetColumnInt64(const std::string &column) const;
00220
00224 const void *GetColumnBlob(int column) const;
00228 const void *GetColumnBlob(const std::string &column) const;
00229
00233 int GetColumnBytes(int column) const;
00237 int GetColumnBytes(const std::string &column) const;
00241 int GetColumnBytes16(int column) const;
00245 int GetColumnBytes16(const std::string &column) const;
00246
00250 const char *GetColumnDatabaseName(int column) const;
00254 const char *GetColumnDatabaseName(const std::string &column) const;
00258 wchar_t *GetColumnDatabaseName16(int column) const;
00262 wchar_t *GetColumnDatabaseName16(const std::string &column) const;
00263
00267 const char *GetColumnTableName(int column) const;
00271 const char *GetColumnTableName(const std::string &column) const;
00275 wchar_t *GetColumnTableName16(int column) const;
00279 wchar_t *GetColumnTableName16(const std::string &column) const;
00280
00284 const char *GetColumnOriginName(int column) const;
00288 const char *GetColumnOriginName(const std::string &column) const;
00292 wchar_t *GetColumnOriginName16(int column) const;
00296 wchar_t *GetColumnOriginName16(const std::string &column) const;
00297
00301 const char *GetColumnDeclaredDatatype(int column) const;
00305 const char *GetColumnDeclaredDatatype(const std::string &column) const;
00309 wchar_t *GetColumnDeclaredDatatype16(int column) const;
00313 wchar_t *GetColumnDeclaredDatatype16(const std::string &column) const;
00314
00317 int GetColumnCount() const;
00320 inline int GetDataCount() const {return sqlite3_data_count(mStatement);}
00321
00326 void BindInt(int column, int value) const;
00331 void BindBool(int column, bool value) const;
00336 void BindString(int column, const std::string &string) const;
00341 void BindString16(int column, const wchar_t *string) const;
00346 void BindDouble(int column, double value) const;
00351 void BindInt64(int column, int64 value) const;
00355 void BindNull(int column) const;
00365 void BindBlob(int column, const void* data, int numberOfBytes = -1) const;
00370 void BindZeroBlob(int column, int length) const;
00371
00377 void Execute() const;
00380 void ExecuteAndFree();
00381
00387 void GetTable(const std::string &sql, unsigned short consoleOutputColumnWidth = 20) const;
00388
00394 void GetTableColumnMetadata(const std::string &tableName, const std::string &columnName) const;
00395
00398 void ClearBindings() const;
00399
00403 void Reset() const;
00404
00406 void BeginTransaction();
00409 void CommitTransaction();
00411 inline void RollbackTransaction()
00412 {
00413 FreeQuery();
00414 SqlStatement("ROLLBACK;");
00415 }
00416
00423 inline void Transaction(const char *sql) {mTransactionSQL[mTransactionID++] = std::make_pair(sql, false);}
00430 inline void Transaction(const std::string &sql) {mTransactionSQL[mTransactionID++] = std::make_pair(sql.c_str(), false);}
00437 inline void Transaction(const wchar_t *sql) {mTransactionSQL16[mTransactionID++] = std::make_pair(sql, false);}
00438
00444 void SecureTransaction(const char *sql);
00450 void SecureTransaction(const std::string sql);
00456 void SecureTransaction(const wchar_t *sql);
00457
00461 std::string GetSqlResultString(const std::string &sql, const std::string &defaultReturnValue = "");
00465 std::string GetSqlResultString(const char *sql, const std::string &defaultReturnValue = "");
00469 std::string GetSqlResultString(const wchar_t *sql, const std::string &defaultReturnValue = "");
00470
00474 int GetSqlResultInt(const std::string &sql, int defaultReturnValue = -1);
00478 int GetSqlResultInt(const char *sql, int defaultReturnValue = -1);
00482 int GetSqlResultInt(const wchar_t *sql, int defaultReturnValue = -1);
00483
00487 int64 GetSqlResultInt64(const std::string &sql, int64 defaultReturnValue = -1);
00491 int64 GetSqlResultInt64(const char *sql, int64 defaultReturnValue = -1);
00495 int64 GetSqlResultInt64(const wchar_t *sql, int64 defaultReturnValue = -1);
00496
00500 double GetSqlResultDouble(const std::string &sql, double defaultReturnValue = -1);
00504 double GetSqlResultDouble(const char *sql, double defaultReturnValue = -1);
00508 double GetSqlResultDouble(const wchar_t *sql, double defaultReturnValue = -1);
00509
00518 const unsigned char *GetSqlResultCString(const std::string &sql, const unsigned char *defaultReturnValue = 0);
00527 const unsigned char *GetSqlResultCString(const char *sql, const unsigned char *defaultReturnValue = 0);
00536 const unsigned char *GetSqlResultCString(const wchar_t *sql, const unsigned char *defaultReturnValue = 0);
00537
00546 wchar_t *GetSqlResultString16(const std::string &sql, wchar_t *defaultReturnValue = 0);
00555 wchar_t *GetSqlResultString16(const char *sql, wchar_t *defaultReturnValue = 0);
00564 wchar_t *GetSqlResultString16(const wchar_t *sql, wchar_t *defaultReturnValue = 0);
00565
00574 const void *GetSqlResultBlob(const std::string &sql, const void *defaultReturnValue = 0);
00583 const void *GetSqlResultBlob(const char *sql, const void *defaultReturnValue = 0);
00592 const void *GetSqlResultBlob(const wchar_t *sql, const void *defaultReturnValue = 0);
00593
00598 unsigned int GetNumberOfRows();
00599
00616 static std::string Mprintf(const char *sql, ...);
00633 static std::string Vmprintf(const char *sql, va_list args);
00634
00635 protected:
00638 void Prepare(const char *sqlStatement);
00641 void Prepare(const wchar_t *sqlStatement);
00643 bool Step() const;
00645 void CheckStatement() const;
00647 void CheckDatabase() const;
00648
00650 sqlite3_stmt *GetStatementHandle() const {return mStatement;}
00651
00653 const unsigned char *SqlResultCString(const unsigned char *defaultReturnValue);
00655 wchar_t *SqlResultString16(wchar_t *defaultReturnValue);
00657 const void *SqlResultBlob(const void *defaultReturnValue);
00658
00662 void CheckColumnNumber(int columnNumber, const std::string &functionName = "") const;
00663
00665 void CleanUpTransaction();
00666
00670 template<class T>
00671 inline void DeleteTransactionSqlStr(bool isMemAllocated, T *str)
00672 {
00673 if(isMemAllocated)
00674 delete[] str;
00675 }
00676
00681 template<class S, class T>
00682 T GetColumnValue(S sql, T(Kompex::SQLiteStatement::*getColumnFunc)(int columnNumber)const, T defaultReturnValue);
00683
00684 private:
00686 void AssignColumnNumberToColumnName() const;
00688 int GetAssignedColumnNumber(const std::string &columnName) const;
00689
00691 struct sqlite3_stmt *mStatement;
00693 SQLiteDatabase *mDatabase;
00694
00696 typedef std::map<unsigned short , std::pair<const char* , bool > > TTransactionSQL;
00698 typedef std::map<unsigned short , std::pair<const wchar_t* , bool > > TTransactionSQL16;
00699
00701 TTransactionSQL mTransactionSQL;
00703 TTransactionSQL16 mTransactionSQL16;
00704
00706 unsigned short mTransactionID;
00707
00709 mutable std::map<std::string , int > mColumnNumberToColumnNameAssignment;
00711 mutable bool mIsColumnNumberAssignedToColumnName;
00712
00713 };
00714 };
00715
00716 #endif // KompexSQLiteStatement_H