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
00149 const unsigned char *GetColumnCString(int column) const;
00153 const unsigned char *GetColumnCString(const std::string &column) const;
00154
00158 std::string GetColumnString(int column) const;
00162 std::string GetColumnString(const std::string &column) const;
00163
00167 wchar_t *GetColumnString16(int column) const;
00171 wchar_t *GetColumnString16(const std::string &column) const;
00172
00176 double GetColumnDouble(int column) const;
00180 double GetColumnDouble(const std::string &column) const;
00181
00185 int GetColumnInt(int column) const;
00189 int GetColumnInt(const std::string &column) const;
00190
00197 bool GetColumnBool(int column) const;
00204 bool GetColumnBool(const std::string &column) const;
00205
00209 int64 GetColumnInt64(int column) const;
00213 int64 GetColumnInt64(const std::string &column) const;
00214
00218 const void *GetColumnBlob(int column) const;
00222 const void *GetColumnBlob(const std::string &column) const;
00223
00227 int GetColumnBytes(int column) const;
00231 int GetColumnBytes(const std::string &column) const;
00235 int GetColumnBytes16(int column) const;
00239 int GetColumnBytes16(const std::string &column) const;
00240
00244 const char *GetColumnDatabaseName(int column) const;
00248 const char *GetColumnDatabaseName(const std::string &column) const;
00252 wchar_t *GetColumnDatabaseName16(int column) const;
00256 wchar_t *GetColumnDatabaseName16(const std::string &column) const;
00257
00261 const char *GetColumnTableName(int column) const;
00265 const char *GetColumnTableName(const std::string &column) const;
00269 wchar_t *GetColumnTableName16(int column) const;
00273 wchar_t *GetColumnTableName16(const std::string &column) const;
00274
00278 const char *GetColumnOriginName(int column) const;
00282 const char *GetColumnOriginName(const std::string &column) const;
00286 wchar_t *GetColumnOriginName16(int column) const;
00290 wchar_t *GetColumnOriginName16(const std::string &column) const;
00291
00295 const char *GetColumnDeclaredDatatype(int column) const;
00299 const char *GetColumnDeclaredDatatype(const std::string &column) const;
00303 wchar_t *GetColumnDeclaredDatatype16(int column) const;
00307 wchar_t *GetColumnDeclaredDatatype16(const std::string &column) const;
00308
00311 int GetColumnCount() const;
00314 inline int GetDataCount() const {return sqlite3_data_count(mStatement);}
00315
00320 void BindInt(int column, int value) const;
00325 void BindBool(int column, bool value) const;
00330 void BindString(int column, const std::string &string) const;
00335 void BindString16(int column, const wchar_t *string) const;
00340 void BindDouble(int column, double value) const;
00345 void BindInt64(int column, int64 value) const;
00349 void BindNull(int column) const;
00359 void BindBlob(int column, const void* data, int numberOfBytes = -1) const;
00364 void BindZeroBlob(int column, int length) const;
00365
00371 void Execute() const;
00374 void ExecuteAndFree();
00375
00381 void GetTable(const std::string &sql, unsigned short consoleOutputColumnWidth = 20) const;
00382
00388 void GetTableColumnMetadata(const std::string &tableName, const std::string &columnName) const;
00389
00392 void ClearBindings() const;
00393
00397 void Reset() const;
00398
00400 void BeginTransaction();
00403 void CommitTransaction();
00405 inline void RollbackTransaction()
00406 {
00407 FreeQuery();
00408 SqlStatement("ROLLBACK;");
00409 }
00410
00417 inline void Transaction(const char *sql) {mTransactionSQL[mTransactionID++] = std::make_pair(sql, false);}
00424 inline void Transaction(const std::string &sql) {mTransactionSQL[mTransactionID++] = std::make_pair(sql.c_str(), false);}
00431 inline void Transaction(const wchar_t *sql) {mTransactionSQL16[mTransactionID++] = std::make_pair(sql, false);}
00432
00438 void SecureTransaction(const char *sql);
00444 void SecureTransaction(const std::string sql);
00450 void SecureTransaction(const wchar_t *sql);
00451
00455 std::string GetSqlResultString(const std::string &sql, const std::string &defaultReturnValue = "");
00459 std::string GetSqlResultString(const char *sql, const std::string &defaultReturnValue = "");
00463 std::string GetSqlResultString(const wchar_t *sql, const std::string &defaultReturnValue = "");
00464
00468 int GetSqlResultInt(const std::string &sql, int defaultReturnValue = -1);
00472 int GetSqlResultInt(const char *sql, int defaultReturnValue = -1);
00476 int GetSqlResultInt(const wchar_t *sql, int defaultReturnValue = -1);
00477
00481 int64 GetSqlResultInt64(const std::string &sql, int64 defaultReturnValue = -1);
00485 int64 GetSqlResultInt64(const char *sql, int64 defaultReturnValue = -1);
00489 int64 GetSqlResultInt64(const wchar_t *sql, int64 defaultReturnValue = -1);
00490
00494 double GetSqlResultDouble(const std::string &sql, double defaultReturnValue = -1);
00498 double GetSqlResultDouble(const char *sql, double defaultReturnValue = -1);
00502 double GetSqlResultDouble(const wchar_t *sql, double defaultReturnValue = -1);
00503
00512 const unsigned char *GetSqlResultCString(const std::string &sql, const unsigned char *defaultReturnValue = 0);
00521 const unsigned char *GetSqlResultCString(const char *sql, const unsigned char *defaultReturnValue = 0);
00530 const unsigned char *GetSqlResultCString(const wchar_t *sql, const unsigned char *defaultReturnValue = 0);
00531
00540 wchar_t *GetSqlResultString16(const std::string &sql, wchar_t *defaultReturnValue = 0);
00549 wchar_t *GetSqlResultString16(const char *sql, wchar_t *defaultReturnValue = 0);
00558 wchar_t *GetSqlResultString16(const wchar_t *sql, wchar_t *defaultReturnValue = 0);
00559
00568 const void *GetSqlResultBlob(const std::string &sql, const void *defaultReturnValue = 0);
00577 const void *GetSqlResultBlob(const char *sql, const void *defaultReturnValue = 0);
00586 const void *GetSqlResultBlob(const wchar_t *sql, const void *defaultReturnValue = 0);
00587
00589 unsigned int GetNumberOfRows();
00590
00591 protected:
00594 void Prepare(const char *sqlStatement);
00597 void Prepare(const wchar_t *sqlStatement);
00599 bool Step() const;
00601 void CheckStatement() const;
00603 void CheckDatabase() const;
00604
00606 sqlite3_stmt *GetStatementHandle() const {return mStatement;}
00607
00609 const unsigned char *SqlResultCString(const unsigned char *defaultReturnValue);
00611 wchar_t *SqlResultString16(wchar_t *defaultReturnValue);
00613 const void *SqlResultBlob(const void *defaultReturnValue);
00614
00618 void CheckColumnNumber(int columnNumber, const std::string &functionName = "") const;
00619
00621 void CleanUpTransaction();
00622
00626 template<class T>
00627 inline void DeleteTransactionSqlStr(bool isMemAllocated, T *str)
00628 {
00629 if(isMemAllocated)
00630 delete[] str;
00631 }
00632
00637 template<class S, class T>
00638 T GetColumnValue(S sql, T(Kompex::SQLiteStatement::*getColumnFunc)(int columnNumber)const, T defaultReturnValue);
00639
00640 private:
00642 void AssignColumnNumberToColumnName() const;
00644 int GetAssignedColumnNumber(const std::string &columnName) const;
00645
00647 struct sqlite3_stmt *mStatement;
00649 SQLiteDatabase *mDatabase;
00650
00652 typedef std::map<unsigned short , std::pair<const char* , bool > > TTransactionSQL;
00654 typedef std::map<unsigned short , std::pair<const wchar_t* , bool > > TTransactionSQL16;
00655
00657 TTransactionSQL mTransactionSQL;
00659 TTransactionSQL16 mTransactionSQL16;
00660
00662 unsigned short mTransactionID;
00663
00665 mutable std::map<std::string , int > mColumnNumberToColumnNameAssignment;
00667 mutable bool mIsColumnNumberAssignedToColumnName;
00668
00669 };
00670 };
00671
00672 #endif // KompexSQLiteStatement_H