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 void SqlStatement(const std::string &sqlStatement);
00057 void SqlStatement(const char *sqlStatement);
00061 void SqlStatement(const wchar_t *sqlStatement);
00062
00066 inline void Sql(const std::string &sql) {Prepare(sql.c_str());}
00070 inline void Sql(const wchar_t *sql) {Prepare(sql);}
00074 inline void Sql(const char *sql) {Prepare(sql);}
00075
00077 bool FetchRow() const;
00079 void FreeQuery();
00080
00085 float SqlAggregateFuncResult(const std::string &countSql);
00090 float SqlAggregateFuncResult(wchar_t *countSql);
00095 float SqlAggregateFuncResult(const char *countSql);
00096
00099 const char *GetColumnName(int column) const;
00102 wchar_t *GetColumnName16(int column) const;
00103
00112 int GetColumnType(int column) const;
00113
00116 const unsigned char *GetColumnCString(int column) const;
00119 std::string GetColumnString(int column) const;
00122 wchar_t *GetColumnString16(int column) const;
00125 double GetColumnDouble(int column) const;
00128 int GetColumnInt(int column) const;
00131 int64 GetColumnInt64(int column) const;
00134 const void *GetColumnBlob(int column) const;
00135
00138 int GetColumnCount() const;
00141 int GetColumnBytes(int column) const;
00144 int GetColumnBytes16(int column) const;
00147 const char *GetColumnDatabaseName(int column) const;
00150 wchar_t *GetColumnDatabaseName16(int column) const;
00153 const char *GetColumnTableName(int column) const;
00156 wchar_t *GetColumnTableName16(int column) const;
00159 const char *GetColumnOriginName(int column) const;
00162 wchar_t *GetColumnOriginName16(int column) const;
00165 const char *GetColumnDeclaredDatatype(int column) const;
00168 wchar_t *GetColumnDeclaredDatatype16(int column) const;
00171 inline int GetDataCount() const {return sqlite3_data_count(mStatement);}
00172
00177 void BindInt(int column, int value) const;
00182 void BindString(int column, const std::string &string) const;
00187 void BindString16(int column, const wchar_t *string) const;
00192 void BindDouble(int column, double value) const;
00197 void BindInt64(int column, int64 value) const;
00201 void BindNull(int column) const;
00211 void BindBlob(int column, const void* data, int numberOfBytes = -1) const;
00216 void BindZeroBlob(int column, int length) const;
00217
00220 void ExecuteAndFree();
00226 void GetTable(const std::string &sql, unsigned short consoleOutputColumnWidth = 20) const;
00227
00233 void GetTableColumnMetadata(const std::string &tableName, const std::string &columnName) const;
00234
00237 void ClearBindings() const;
00238
00242 void Reset() const;
00243
00245 void BeginTransaction();
00248 void CommitTransaction();
00250 inline void RollbackTransaction()
00251 {
00252 SqlStatement("ROLLBACK;");
00253 FreeAllStatements();
00254 }
00255
00262 inline void Transaction(const char *sql) {mTransactionSQL[mTransactionID++] = std::make_pair(sql, false);}
00269 inline void Transaction(const std::string &sql) {mTransactionSQL[mTransactionID++] = std::make_pair(sql.c_str(), false);}
00276 inline void Transaction(const wchar_t *sql) {mTransactionSQL16[mTransactionID++] = std::make_pair(sql, false);}
00277
00283 void SecureTransaction(const char *sql);
00289 void SecureTransaction(const std::string sql);
00295 void SecureTransaction(const wchar_t *sql);
00296
00300 std::string GetSqlResultString(const std::string &sql, const std::string &defaultReturnValue = "");
00304 std::string GetSqlResultString(const char *sql, const std::string &defaultReturnValue = "");
00308 std::string GetSqlResultString(const wchar_t *sql, const std::string &defaultReturnValue = "");
00309
00313 int GetSqlResultInt(const std::string &sql, int defaultReturnValue = -1);
00317 int GetSqlResultInt(const char *sql, int defaultReturnValue = -1);
00321 int GetSqlResultInt(const wchar_t *sql, int defaultReturnValue = -1);
00322
00326 int64 GetSqlResultInt64(const std::string &sql, int64 defaultReturnValue = -1);
00330 int64 GetSqlResultInt64(const char *sql, int64 defaultReturnValue = -1);
00334 int64 GetSqlResultInt64(const wchar_t *sql, int64 defaultReturnValue = -1);
00335
00339 double GetSqlResultDouble(const std::string &sql, double defaultReturnValue = -1);
00343 double GetSqlResultDouble(const char *sql, double defaultReturnValue = -1);
00347 double GetSqlResultDouble(const wchar_t *sql, double defaultReturnValue = -1);
00348
00352 const unsigned char *GetSqlResultCString(const std::string &sql, const unsigned char *defaultReturnValue = 0);
00356 const unsigned char *GetSqlResultCString(const char *sql, const unsigned char *defaultReturnValue = 0);
00360 const unsigned char *GetSqlResultCString(const wchar_t *sql, const unsigned char *defaultReturnValue = 0);
00361
00365 wchar_t *GetSqlResultString16(const std::string &sql, wchar_t *defaultReturnValue = 0);
00369 wchar_t *GetSqlResultString16(const char *sql, wchar_t *defaultReturnValue = 0);
00373 wchar_t *GetSqlResultString16(const wchar_t *sql, wchar_t *defaultReturnValue = 0);
00374
00378 const void *GetSqlResultBlob(const std::string &sql, const void *defaultReturnValue = 0);
00382 const void *GetSqlResultBlob(const char *sql, const void *defaultReturnValue = 0);
00386 const void *GetSqlResultBlob(const wchar_t *sql, const void *defaultReturnValue = 0);
00387
00389 unsigned int GetNumberOfRows();
00390
00391 protected:
00394 void Prepare(const char *sqlStatement);
00397 void Prepare(const wchar_t *sqlStatement);
00399 bool Step() const;
00401 void CheckStatement() const;
00403 void CheckDatabase() const;
00405 void FreeAllStatements();
00406
00408 void CleanUpTransaction();
00409
00413 template<class T>
00414 inline void DeleteTransactionSqlStr(bool isMemAllocated, T *str)
00415 {
00416 if(isMemAllocated)
00417 delete[] str;
00418 }
00419
00424 template<class S, class T>
00425 T GetColumnValue(S sql, T(Kompex::SQLiteStatement::*getColumnFunc)(int columnNumber)const, T defaultReturnValue);
00426
00427 private:
00429 struct sqlite3_stmt *mStatement;
00431 SQLiteDatabase *mDatabase;
00432
00434 typedef std::map<unsigned short , std::pair<const char* , bool > > TTransactionSQL;
00436 typedef std::map<unsigned short , std::pair<const wchar_t* , bool > > TTransactionSQL16;
00437
00439 TTransactionSQL mTransactionSQL;
00441 TTransactionSQL16 mTransactionSQL16;
00442
00444 unsigned short mTransactionID;
00445
00446 };
00447 };
00448
00449 #endif // KompexSQLiteStatement_H