Kompex SQLite Wrapper  1.9.11
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros
KompexSQLiteStatement.h
Go to the documentation of this file.
1 /*
2  This file is part of Kompex SQLite Wrapper.
3  Copyright (c) 2008-2013 Sven Broeske
4 
5  Kompex SQLite Wrapper is free software: you can redistribute it and/or modify
6  it under the terms of the GNU Lesser General Public License as published by
7  the Free Software Foundation, either version 3 of the License, or
8  (at your option) any later version.
9 
10  Kompex SQLite Wrapper is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  GNU Lesser General Public License for more details.
14 
15  You should have received a copy of the GNU Lesser General Public License
16  along with Kompex SQLite Wrapper. If not, see <http://www.gnu.org/licenses/>.
17 */
18 
19 #ifndef KompexSQLiteStatement_H
20 #define KompexSQLiteStatement_H
21 
22 #include <map>
23 #include <string>
24 
25 #include "sqlite3.h"
26 
28 
29 namespace Kompex
30 {
31  class SQLiteDatabase;
32 
35  {
36  public:
41  virtual ~SQLiteStatement();
42 
48  inline void SqlStatement(const std::string &sqlStatement) {SqlStatement(sqlStatement.c_str());}
54  void SqlStatement(const char *sqlStatement);
60  inline void SqlStatement(const std::wstring &sqlStatement) {SqlStatement(sqlStatement.c_str());}
66  void SqlStatement(const wchar_t *sqlStatement);
67 
71  inline void Sql(const std::string &sql) {Prepare(sql.c_str());}
75  inline void Sql(const char *sql) {Prepare(sql);}
79  inline void Sql(const std::wstring &sql) {Prepare(sql.c_str());}
83  inline void Sql(const wchar_t *sql) {Prepare(sql);}
84 
87  bool FetchRow() const;
89  void FreeQuery();
90 
95  float SqlAggregateFuncResult(const std::string &countSql);
100  float SqlAggregateFuncResult(wchar_t *countSql);
105  float SqlAggregateFuncResult(const char *countSql);
106 
110  const char *GetColumnName(int column) const;
114  const char *GetColumnName(const std::string &column) const;
115 
119  wchar_t *GetColumnName16(int column) const;
123  wchar_t *GetColumnName16(const std::string &column) const;
124 
134  int GetColumnType(int column) const;
144  int GetColumnType(const std::string &column) const;
145 
150  const unsigned char *GetColumnCString(int column) const;
155  const unsigned char *GetColumnCString(const std::string &column) const;
156 
161  std::string GetColumnString(int column) const;
166  std::string GetColumnString(const std::string &column) const;
167 
172  wchar_t *GetColumnString16(int column) const;
177  wchar_t *GetColumnString16(const std::string &column) const;
178 
182  double GetColumnDouble(int column) const;
186  double GetColumnDouble(const std::string &column) const;
187 
191  int GetColumnInt(int column) const;
195  int GetColumnInt(const std::string &column) const;
196 
203  bool GetColumnBool(int column) const;
210  bool GetColumnBool(const std::string &column) const;
211 
215  int64 GetColumnInt64(int column) const;
219  int64 GetColumnInt64(const std::string &column) const;
220 
224  const void *GetColumnBlob(int column) const;
228  const void *GetColumnBlob(const std::string &column) const;
229 
233  int GetColumnBytes(int column) const;
237  int GetColumnBytes(const std::string &column) const;
241  int GetColumnBytes16(int column) const;
245  int GetColumnBytes16(const std::string &column) const;
246 
250  const char *GetColumnDatabaseName(int column) const;
254  const char *GetColumnDatabaseName(const std::string &column) const;
258  wchar_t *GetColumnDatabaseName16(int column) const;
262  wchar_t *GetColumnDatabaseName16(const std::string &column) const;
263 
267  const char *GetColumnTableName(int column) const;
271  const char *GetColumnTableName(const std::string &column) const;
275  wchar_t *GetColumnTableName16(int column) const;
279  wchar_t *GetColumnTableName16(const std::string &column) const;
280 
284  const char *GetColumnOriginName(int column) const;
288  const char *GetColumnOriginName(const std::string &column) const;
292  wchar_t *GetColumnOriginName16(int column) const;
296  wchar_t *GetColumnOriginName16(const std::string &column) const;
297 
301  const char *GetColumnDeclaredDatatype(int column) const;
305  const char *GetColumnDeclaredDatatype(const std::string &column) const;
309  wchar_t *GetColumnDeclaredDatatype16(int column) const;
313  wchar_t *GetColumnDeclaredDatatype16(const std::string &column) const;
314 
317  int GetColumnCount() const;
320  inline int GetDataCount() const {return sqlite3_data_count(mStatement);}
321 
326  void BindInt(int column, int value) const;
331  void BindBool(int column, bool value) const;
336  void BindString(int column, const std::string &string) const;
341  void BindString16(int column, const wchar_t *string) const;
346  void BindDouble(int column, double value) const;
351  void BindInt64(int column, int64 value) const;
355  void BindNull(int column) const;
365  void BindBlob(int column, const void* data, int numberOfBytes = -1) const;
370  void BindZeroBlob(int column, int length) const;
371 
377  void Execute() const;
380  void ExecuteAndFree();
381 
387  void GetTable(const std::string &sql, unsigned short consoleOutputColumnWidth = 20) const;
388 
394  void GetTableColumnMetadata(const std::string &tableName, const std::string &columnName) const;
395 
398  void ClearBindings() const;
399 
403  void Reset() const;
404 
406  void BeginTransaction();
409  void CommitTransaction();
411  inline void RollbackTransaction()
412  {
413  FreeQuery();
414  SqlStatement("ROLLBACK;");
415  }
416 
423  inline void Transaction(const char *sql) {mTransactionSQL[mTransactionID++] = std::make_pair(sql, false);}
430  inline void Transaction(const std::string &sql) {mTransactionSQL[mTransactionID++] = std::make_pair(sql.c_str(), false);}
437  inline void Transaction(const wchar_t *sql) {mTransactionSQL16[mTransactionID++] = std::make_pair(sql, false);}
438 
444  void SecureTransaction(const char *sql);
450  void SecureTransaction(const std::string sql);
456  void SecureTransaction(const wchar_t *sql);
457 
461  std::string GetSqlResultString(const std::string &sql, const std::string &defaultReturnValue = "");
465  std::string GetSqlResultString(const char *sql, const std::string &defaultReturnValue = "");
469  std::string GetSqlResultString(const wchar_t *sql, const std::string &defaultReturnValue = "");
470 
474  int GetSqlResultInt(const std::string &sql, int defaultReturnValue = -1);
478  int GetSqlResultInt(const char *sql, int defaultReturnValue = -1);
482  int GetSqlResultInt(const wchar_t *sql, int defaultReturnValue = -1);
483 
487  int64 GetSqlResultInt64(const std::string &sql, int64 defaultReturnValue = -1);
491  int64 GetSqlResultInt64(const char *sql, int64 defaultReturnValue = -1);
495  int64 GetSqlResultInt64(const wchar_t *sql, int64 defaultReturnValue = -1);
496 
500  double GetSqlResultDouble(const std::string &sql, double defaultReturnValue = -1);
504  double GetSqlResultDouble(const char *sql, double defaultReturnValue = -1);
508  double GetSqlResultDouble(const wchar_t *sql, double defaultReturnValue = -1);
509 
518  const unsigned char *GetSqlResultCString(const std::string &sql, const unsigned char *defaultReturnValue = 0);
527  const unsigned char *GetSqlResultCString(const char *sql, const unsigned char *defaultReturnValue = 0);
536  const unsigned char *GetSqlResultCString(const wchar_t *sql, const unsigned char *defaultReturnValue = 0);
537 
546  wchar_t *GetSqlResultString16(const std::string &sql, wchar_t *defaultReturnValue = 0);
555  wchar_t *GetSqlResultString16(const char *sql, wchar_t *defaultReturnValue = 0);
564  wchar_t *GetSqlResultString16(const wchar_t *sql, wchar_t *defaultReturnValue = 0);
565 
574  const void *GetSqlResultBlob(const std::string &sql, const void *defaultReturnValue = 0);
583  const void *GetSqlResultBlob(const char *sql, const void *defaultReturnValue = 0);
592  const void *GetSqlResultBlob(const wchar_t *sql, const void *defaultReturnValue = 0);
593 
598  unsigned int GetNumberOfRows();
599 
616  static std::string Mprintf(const char *sql, ...);
633  static std::string Vmprintf(const char *sql, va_list args);
634 
635  protected:
638  void Prepare(const char *sqlStatement);
641  void Prepare(const wchar_t *sqlStatement);
643  bool Step() const;
645  void CheckStatement() const;
647  void CheckDatabase() const;
648 
650  sqlite3_stmt *GetStatementHandle() const {return mStatement;}
651 
653  const unsigned char *SqlResultCString(const unsigned char *defaultReturnValue);
655  wchar_t *SqlResultString16(wchar_t *defaultReturnValue);
657  const void *SqlResultBlob(const void *defaultReturnValue);
658 
662  void CheckColumnNumber(int columnNumber, const std::string &functionName = "") const;
663 
665  void CleanUpTransaction();
666 
670  template<class T>
671  inline void DeleteTransactionSqlStr(bool isMemAllocated, T *str)
672  {
673  if(isMemAllocated)
674  delete[] str;
675  }
676 
681  template<class S, class T>
682  T GetColumnValue(S sql, T(Kompex::SQLiteStatement::*getColumnFunc)(int columnNumber)const, T defaultReturnValue);
683 
684  private:
686  void AssignColumnNumberToColumnName() const;
688  int GetAssignedColumnNumber(const std::string &columnName) const;
689 
691  struct sqlite3_stmt *mStatement;
694 
696  typedef std::map<unsigned short /* transaction id */, std::pair<const char* /* sql */, bool /* memory allocated */> > TTransactionSQL;
698  typedef std::map<unsigned short /* transaction id */, std::pair<const wchar_t* /* sql */, bool /* is memory allocated */> > TTransactionSQL16;
699 
704 
706  unsigned short mTransactionID;
707 
709  mutable std::map<std::string /* column name */, int /* column number */> mColumnNumberToColumnNameAssignment;
712 
713  };
714 };
715 
716 #endif // KompexSQLiteStatement_H