Go to the documentation of this file.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
00053 inline void SqlStatement(const std::string &sqlStatement) {SqlStatement(sqlStatement.c_str());}
00057 void SqlStatement(const char *sqlStatement);
00061 inline void SqlStatement(const std::wstring &sqlStatement) {SqlStatement(sqlStatement.c_str());}
00065 void SqlStatement(const wchar_t *sqlStatement);
00066
00070 inline void Sql(const std::string &sql) {Prepare(sql.c_str());}
00074 inline void Sql(const char *sql) {Prepare(sql);}
00078 inline void Sql(const std::wstring &sql) {Prepare(sql.c_str());}
00082 inline void Sql(const wchar_t *sql) {Prepare(sql);}
00083
00085 bool FetchRow() const;
00087 void FreeQuery();
00088
00093 float SqlAggregateFuncResult(const std::string &countSql);
00098 float SqlAggregateFuncResult(wchar_t *countSql);
00103 float SqlAggregateFuncResult(const char *countSql);
00104
00108 const char *GetColumnName(int column) const;
00112 const char *GetColumnName(const std::string &column) const;
00113
00117 wchar_t *GetColumnName16(int column) const;
00121 wchar_t *GetColumnName16(const std::string &column) const;
00122
00132 int GetColumnType(int column) const;
00142 int GetColumnType(const std::string &column) const;
00143
00147 const unsigned char *GetColumnCString(int column) const;
00151 const unsigned char *GetColumnCString(const std::string &column) const;
00152
00156 std::string GetColumnString(int column) const;
00160 std::string GetColumnString(const std::string &column) const;
00161
00165 wchar_t *GetColumnString16(int column) const;
00169 wchar_t *GetColumnString16(const std::string &column) const;
00170
00174 double GetColumnDouble(int column) const;
00178 double GetColumnDouble(const std::string &column) const;
00179
00183 int GetColumnInt(int column) const;
00187 int GetColumnInt(const std::string &column) const;
00188
00192 int64 GetColumnInt64(int column) const;
00196 int64 GetColumnInt64(const std::string &column) const;
00197
00201 const void *GetColumnBlob(int column) const;
00205 const void *GetColumnBlob(const std::string &column) const;
00206
00210 int GetColumnBytes(int column) const;
00214 int GetColumnBytes(const std::string &column) const;
00218 int GetColumnBytes16(int column) const;
00222 int GetColumnBytes16(const std::string &column) const;
00223
00227 const char *GetColumnDatabaseName(int column) const;
00231 const char *GetColumnDatabaseName(const std::string &column) const;
00235 wchar_t *GetColumnDatabaseName16(int column) const;
00239 wchar_t *GetColumnDatabaseName16(const std::string &column) const;
00240
00244 const char *GetColumnTableName(int column) const;
00248 const char *GetColumnTableName(const std::string &column) const;
00252 wchar_t *GetColumnTableName16(int column) const;
00256 wchar_t *GetColumnTableName16(const std::string &column) const;
00257
00261 const char *GetColumnOriginName(int column) const;
00265 const char *GetColumnOriginName(const std::string &column) const;
00269 wchar_t *GetColumnOriginName16(int column) const;
00273 wchar_t *GetColumnOriginName16(const std::string &column) const;
00274
00278 const char *GetColumnDeclaredDatatype(int column) const;
00282 const char *GetColumnDeclaredDatatype(const std::string &column) const;
00286 wchar_t *GetColumnDeclaredDatatype16(int column) const;
00290 wchar_t *GetColumnDeclaredDatatype16(const std::string &column) const;
00291
00294 int GetColumnCount() const;
00297 inline int GetDataCount() const {return sqlite3_data_count(mStatement);}
00298
00303 void BindInt(int column, int value) const;
00308 void BindString(int column, const std::string &string) const;
00313 void BindString16(int column, const wchar_t *string) const;
00318 void BindDouble(int column, double value) const;
00323 void BindInt64(int column, int64 value) const;
00327 void BindNull(int column) const;
00337 void BindBlob(int column, const void* data, int numberOfBytes = -1) const;
00342 void BindZeroBlob(int column, int length) const;
00343
00346 void ExecuteAndFree();
00352 void GetTable(const std::string &sql, unsigned short consoleOutputColumnWidth = 20) const;
00353
00359 void GetTableColumnMetadata(const std::string &tableName, const std::string &columnName) const;
00360
00363 void ClearBindings() const;
00364
00368 void Reset() const;
00369
00371 void BeginTransaction();
00374 void CommitTransaction();
00376 inline void RollbackTransaction()
00377 {
00378 SqlStatement("ROLLBACK;");
00379 FreeAllStatements();
00380 }
00381
00388 inline void Transaction(const char *sql) {mTransactionSQL[mTransactionID++] = std::make_pair(sql, false);}
00395 inline void Transaction(const std::string &sql) {mTransactionSQL[mTransactionID++] = std::make_pair(sql.c_str(), false);}
00402 inline void Transaction(const wchar_t *sql) {mTransactionSQL16[mTransactionID++] = std::make_pair(sql, false);}
00403
00409 void SecureTransaction(const char *sql);
00415 void SecureTransaction(const std::string sql);
00421 void SecureTransaction(const wchar_t *sql);
00422
00426 std::string GetSqlResultString(const std::string &sql, const std::string &defaultReturnValue = "");
00430 std::string GetSqlResultString(const char *sql, const std::string &defaultReturnValue = "");
00434 std::string GetSqlResultString(const wchar_t *sql, const std::string &defaultReturnValue = "");
00435
00439 int GetSqlResultInt(const std::string &sql, int defaultReturnValue = -1);
00443 int GetSqlResultInt(const char *sql, int defaultReturnValue = -1);
00447 int GetSqlResultInt(const wchar_t *sql, int defaultReturnValue = -1);
00448
00452 int64 GetSqlResultInt64(const std::string &sql, int64 defaultReturnValue = -1);
00456 int64 GetSqlResultInt64(const char *sql, int64 defaultReturnValue = -1);
00460 int64 GetSqlResultInt64(const wchar_t *sql, int64 defaultReturnValue = -1);
00461
00465 double GetSqlResultDouble(const std::string &sql, double defaultReturnValue = -1);
00469 double GetSqlResultDouble(const char *sql, double defaultReturnValue = -1);
00473 double GetSqlResultDouble(const wchar_t *sql, double defaultReturnValue = -1);
00474
00483 const unsigned char *GetSqlResultCString(const std::string &sql, const unsigned char *defaultReturnValue = 0);
00492 const unsigned char *GetSqlResultCString(const char *sql, const unsigned char *defaultReturnValue = 0);
00501 const unsigned char *GetSqlResultCString(const wchar_t *sql, const unsigned char *defaultReturnValue = 0);
00502
00511 wchar_t *GetSqlResultString16(const std::string &sql, wchar_t *defaultReturnValue = 0);
00520 wchar_t *GetSqlResultString16(const char *sql, wchar_t *defaultReturnValue = 0);
00529 wchar_t *GetSqlResultString16(const wchar_t *sql, wchar_t *defaultReturnValue = 0);
00530
00539 const void *GetSqlResultBlob(const std::string &sql, const void *defaultReturnValue = 0);
00548 const void *GetSqlResultBlob(const char *sql, const void *defaultReturnValue = 0);
00557 const void *GetSqlResultBlob(const wchar_t *sql, const void *defaultReturnValue = 0);
00558
00560 unsigned int GetNumberOfRows();
00561
00562 protected:
00565 void Prepare(const char *sqlStatement);
00568 void Prepare(const wchar_t *sqlStatement);
00570 bool Step() const;
00572 void CheckStatement() const;
00574 void CheckDatabase() const;
00576 void FreeAllStatements();
00577
00579 const unsigned char *SqlResultCString(const unsigned char *defaultReturnValue);
00581 wchar_t *SqlResultString16(wchar_t *defaultReturnValue);
00583 const void *SqlResultBlob(const void *defaultReturnValue);
00584
00588 void CheckColumnNumber(int columnNumber, const std::string &functionName = "") const;
00589
00591 void CleanUpTransaction();
00592
00596 template<class T>
00597 inline void DeleteTransactionSqlStr(bool isMemAllocated, T *str)
00598 {
00599 if(isMemAllocated)
00600 delete[] str;
00601 }
00602
00607 template<class S, class T>
00608 T GetColumnValue(S sql, T(Kompex::SQLiteStatement::*getColumnFunc)(int columnNumber)const, T defaultReturnValue);
00609
00610 private:
00612 void AssignColumnNumberToColumnName() const;
00614 int GetAssignedColumnNumber(const std::string &columnName) const;
00615
00617 struct sqlite3_stmt *mStatement;
00619 SQLiteDatabase *mDatabase;
00620
00622 typedef std::map<unsigned short , std::pair<const char* , bool > > TTransactionSQL;
00624 typedef std::map<unsigned short , std::pair<const wchar_t* , bool > > TTransactionSQL16;
00625
00627 TTransactionSQL mTransactionSQL;
00629 TTransactionSQL16 mTransactionSQL16;
00630
00632 unsigned short mTransactionID;
00633
00635 mutable std::map<std::string , int > mColumnNumberToColumnNameAssignment;
00637 mutable bool mIsColumnNumberAssignedToColumnName;
00638
00639 };
00640 };
00641
00642 #endif // KompexSQLiteStatement_H