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 #if defined(_MSC_VER) || defined(__BORLANDC__)
00032 typedef __int64 int64;
00033 typedef unsigned __int64 uint64;
00034 #else
00035 typedef long long int int64;
00036 typedef unsigned long long int uint64;
00037 #endif
00038
00039 class SQLiteDatabase;
00040
00041 class _SQLiteWrapperExport SQLiteStatement
00042 {
00043 public:
00046 SQLiteStatement(SQLiteDatabase *db);
00048 virtual ~SQLiteStatement();
00049
00055 inline void SqlStatement(const std::string &sqlStatement) {SqlStatement(sqlStatement.c_str());}
00061 void SqlStatement(const char *sqlStatement);
00067 inline void SqlStatement(const std::wstring &sqlStatement) {SqlStatement(sqlStatement.c_str());}
00073 void SqlStatement(const wchar_t *sqlStatement);
00074
00078 inline void Sql(const std::string &sql) {Prepare(sql.c_str());}
00082 inline void Sql(const char *sql) {Prepare(sql);}
00086 inline void Sql(const std::wstring &sql) {Prepare(sql.c_str());}
00090 inline void Sql(const wchar_t *sql) {Prepare(sql);}
00091
00094 bool FetchRow() const;
00096 void FreeQuery();
00097
00102 float SqlAggregateFuncResult(const std::string &countSql);
00107 float SqlAggregateFuncResult(wchar_t *countSql);
00112 float SqlAggregateFuncResult(const char *countSql);
00113
00117 const char *GetColumnName(int column) const;
00121 const char *GetColumnName(const std::string &column) const;
00122
00126 wchar_t *GetColumnName16(int column) const;
00130 wchar_t *GetColumnName16(const std::string &column) const;
00131
00141 int GetColumnType(int column) const;
00151 int GetColumnType(const std::string &column) const;
00152
00156 const unsigned char *GetColumnCString(int column) const;
00160 const unsigned char *GetColumnCString(const std::string &column) const;
00161
00165 std::string GetColumnString(int column) const;
00169 std::string GetColumnString(const std::string &column) const;
00170
00174 wchar_t *GetColumnString16(int column) const;
00178 wchar_t *GetColumnString16(const std::string &column) const;
00179
00183 double GetColumnDouble(int column) const;
00187 double GetColumnDouble(const std::string &column) const;
00188
00192 int GetColumnInt(int column) const;
00196 int GetColumnInt(const std::string &column) const;
00197
00204 bool GetColumnBool(int column) const;
00211 bool GetColumnBool(const std::string &column) const;
00212
00216 int64 GetColumnInt64(int column) const;
00220 int64 GetColumnInt64(const std::string &column) const;
00221
00225 const void *GetColumnBlob(int column) const;
00229 const void *GetColumnBlob(const std::string &column) const;
00230
00234 int GetColumnBytes(int column) const;
00238 int GetColumnBytes(const std::string &column) const;
00242 int GetColumnBytes16(int column) const;
00246 int GetColumnBytes16(const std::string &column) const;
00247
00251 const char *GetColumnDatabaseName(int column) const;
00255 const char *GetColumnDatabaseName(const std::string &column) const;
00259 wchar_t *GetColumnDatabaseName16(int column) const;
00263 wchar_t *GetColumnDatabaseName16(const std::string &column) const;
00264
00268 const char *GetColumnTableName(int column) const;
00272 const char *GetColumnTableName(const std::string &column) const;
00276 wchar_t *GetColumnTableName16(int column) const;
00280 wchar_t *GetColumnTableName16(const std::string &column) const;
00281
00285 const char *GetColumnOriginName(int column) const;
00289 const char *GetColumnOriginName(const std::string &column) const;
00293 wchar_t *GetColumnOriginName16(int column) const;
00297 wchar_t *GetColumnOriginName16(const std::string &column) const;
00298
00302 const char *GetColumnDeclaredDatatype(int column) const;
00306 const char *GetColumnDeclaredDatatype(const std::string &column) const;
00310 wchar_t *GetColumnDeclaredDatatype16(int column) const;
00314 wchar_t *GetColumnDeclaredDatatype16(const std::string &column) const;
00315
00318 int GetColumnCount() const;
00321 inline int GetDataCount() const {return sqlite3_data_count(mStatement);}
00322
00327 void BindInt(int column, int value) const;
00332 void BindBool(int column, bool value) const;
00337 void BindString(int column, const std::string &string) const;
00342 void BindString16(int column, const wchar_t *string) const;
00347 void BindDouble(int column, double value) const;
00352 void BindInt64(int column, int64 value) const;
00356 void BindNull(int column) const;
00366 void BindBlob(int column, const void* data, int numberOfBytes = -1) const;
00371 void BindZeroBlob(int column, int length) const;
00372
00378 void Execute() const;
00381 void ExecuteAndFree();
00382
00388 void GetTable(const std::string &sql, unsigned short consoleOutputColumnWidth = 20) const;
00389
00395 void GetTableColumnMetadata(const std::string &tableName, const std::string &columnName) const;
00396
00399 void ClearBindings() const;
00400
00404 void Reset() const;
00405
00407 void BeginTransaction();
00410 void CommitTransaction();
00412 inline void RollbackTransaction()
00413 {
00414 SqlStatement("ROLLBACK;");
00415 FreeAllStatements();
00416 }
00417
00424 inline void Transaction(const char *sql) {mTransactionSQL[mTransactionID++] = std::make_pair(sql, false);}
00431 inline void Transaction(const std::string &sql) {mTransactionSQL[mTransactionID++] = std::make_pair(sql.c_str(), false);}
00438 inline void Transaction(const wchar_t *sql) {mTransactionSQL16[mTransactionID++] = std::make_pair(sql, false);}
00439
00445 void SecureTransaction(const char *sql);
00451 void SecureTransaction(const std::string sql);
00457 void SecureTransaction(const wchar_t *sql);
00458
00462 std::string GetSqlResultString(const std::string &sql, const std::string &defaultReturnValue = "");
00466 std::string GetSqlResultString(const char *sql, const std::string &defaultReturnValue = "");
00470 std::string GetSqlResultString(const wchar_t *sql, const std::string &defaultReturnValue = "");
00471
00475 int GetSqlResultInt(const std::string &sql, int defaultReturnValue = -1);
00479 int GetSqlResultInt(const char *sql, int defaultReturnValue = -1);
00483 int GetSqlResultInt(const wchar_t *sql, int defaultReturnValue = -1);
00484
00488 int64 GetSqlResultInt64(const std::string &sql, int64 defaultReturnValue = -1);
00492 int64 GetSqlResultInt64(const char *sql, int64 defaultReturnValue = -1);
00496 int64 GetSqlResultInt64(const wchar_t *sql, int64 defaultReturnValue = -1);
00497
00501 double GetSqlResultDouble(const std::string &sql, double defaultReturnValue = -1);
00505 double GetSqlResultDouble(const char *sql, double defaultReturnValue = -1);
00509 double GetSqlResultDouble(const wchar_t *sql, double defaultReturnValue = -1);
00510
00519 const unsigned char *GetSqlResultCString(const std::string &sql, const unsigned char *defaultReturnValue = 0);
00528 const unsigned char *GetSqlResultCString(const char *sql, const unsigned char *defaultReturnValue = 0);
00537 const unsigned char *GetSqlResultCString(const wchar_t *sql, const unsigned char *defaultReturnValue = 0);
00538
00547 wchar_t *GetSqlResultString16(const std::string &sql, wchar_t *defaultReturnValue = 0);
00556 wchar_t *GetSqlResultString16(const char *sql, wchar_t *defaultReturnValue = 0);
00565 wchar_t *GetSqlResultString16(const wchar_t *sql, wchar_t *defaultReturnValue = 0);
00566
00575 const void *GetSqlResultBlob(const std::string &sql, const void *defaultReturnValue = 0);
00584 const void *GetSqlResultBlob(const char *sql, const void *defaultReturnValue = 0);
00593 const void *GetSqlResultBlob(const wchar_t *sql, const void *defaultReturnValue = 0);
00594
00596 unsigned int GetNumberOfRows();
00597
00598 protected:
00601 void Prepare(const char *sqlStatement);
00604 void Prepare(const wchar_t *sqlStatement);
00606 bool Step() const;
00608 void CheckStatement() const;
00610 void CheckDatabase() const;
00612 void FreeAllStatements();
00613
00615 sqlite3_stmt *GetStatementHandle() const {return mStatement;}
00616
00618 const unsigned char *SqlResultCString(const unsigned char *defaultReturnValue);
00620 wchar_t *SqlResultString16(wchar_t *defaultReturnValue);
00622 const void *SqlResultBlob(const void *defaultReturnValue);
00623
00627 void CheckColumnNumber(int columnNumber, const std::string &functionName = "") const;
00628
00630 void CleanUpTransaction();
00631
00635 template<class T>
00636 inline void DeleteTransactionSqlStr(bool isMemAllocated, T *str)
00637 {
00638 if(isMemAllocated)
00639 delete[] str;
00640 }
00641
00646 template<class S, class T>
00647 T GetColumnValue(S sql, T(Kompex::SQLiteStatement::*getColumnFunc)(int columnNumber)const, T defaultReturnValue);
00648
00649 private:
00651 void AssignColumnNumberToColumnName() const;
00653 int GetAssignedColumnNumber(const std::string &columnName) const;
00654
00656 struct sqlite3_stmt *mStatement;
00658 SQLiteDatabase *mDatabase;
00659
00661 typedef std::map<unsigned short , std::pair<const char* , bool > > TTransactionSQL;
00663 typedef std::map<unsigned short , std::pair<const wchar_t* , bool > > TTransactionSQL16;
00664
00666 TTransactionSQL mTransactionSQL;
00668 TTransactionSQL16 mTransactionSQL16;
00669
00671 unsigned short mTransactionID;
00672
00674 mutable std::map<std::string , int > mColumnNumberToColumnNameAssignment;
00676 mutable bool mIsColumnNumberAssignedToColumnName;
00677
00678 };
00679 };
00680
00681 #endif // KompexSQLiteStatement_H