Gray C++ Libraries  0.0.2
A set of C++ libraries for MSVC, GNU on Windows, WinCE, Linux
cSQLite.h
Go to the documentation of this file.
1 //
5 
6 #ifndef _INC_cSQLite_H
7 #define _INC_cSQLite_H
8 
9 #include "GraySQLite.h"
11 
12 #ifdef __cplusplus
13 extern "C" {
14 #endif
15  typedef struct sqlite3 sqlite3; // opaque structure.
16  typedef struct sqlite3_stmt sqlite3_stmt; // opaque structure.
17  typedef INT64 sqlite3_int64;
18 #ifdef __cplusplus
19 }
20 #endif
21 
22 namespace GraySQLite
23 {
24  typedef int cSQLiteCol_t;
25 
27  {
32 
33  private:
34  ::sqlite3* const m_pDB;
35  ::sqlite3_stmt* const m_pStmt;
36  const cSQLiteCol_t m_nColumn; // 0 based col.
37 
38  public:
39  cSQLiteColumn(::sqlite3* pDB, ::sqlite3_stmt* pStmt, cSQLiteCol_t nColumn)
40  : m_pDB(pDB), m_pStmt(pStmt), m_nColumn(nColumn)
41  {
42  ASSERT(m_pStmt != nullptr);
43  }
44 
45  int GetInt() const;
46  sqlite3_int64 GetInt64() const;
47  double GetDouble() const;
48  const GChar_t* GetTextPtr() const;
49  cString GetString() const;
50  cHeapBlock GetBlob() const;
51 
52  operator int() const
53  {
54  return GetInt();
55  }
56  operator sqlite3_int64() const
57  {
58  return GetInt64();
59  }
60  operator double() const
61  {
62  return GetDouble();
63  }
64  operator const GChar_t*() const
65  {
66  return GetTextPtr();
67  }
68  operator cString() const
69  {
70  return GetString();
71  }
72  operator cHeapBlock() const
73  {
74  return GetBlob();
75  }
76  };
77 
79  {
82 
83  typedef cRefBase SUPER_t;
84 
85  public:
88 
89  protected:
90  HRESULT ThrowOnError();
91 
92  public:
93  cSQLiteBase(::sqlite3* pDB = nullptr)
94  : m_pDB(pDB)
95  , m_nNativeError(0) // SQLITE_OK=0
96  {
97  }
98  virtual HRESULT FillException(cSQLException* pException = nullptr);
99 
100 #define cSQLiteBase_DISAMBIG virtual HRESULT FillException(cSQLException* pException=nullptr) override { return SUPER_t::FillException(pException); }
101 
103  };
104 
106  {
108 
109  typedef cSQLiteBase SUPER_t;
110  friend class cSQLiteDb;
111 
112  protected:
115 
116  protected:
117  void ResetBind();
119  {
120  if (m_bNeedResetBind)
121  ResetBind();
122  }
123 
124  HRESULT DoBind(SQL_COLUMN_t i, int value);
125  HRESULT DoBind(SQL_COLUMN_t i, sqlite3_int64 value);
126  HRESULT DoBind(SQL_COLUMN_t i, double value);
127  HRESULT DoBind(SQL_COLUMN_t i, const cString& value);
128  HRESULT DoBind(SQL_COLUMN_t i, const GChar_t* pszValue, StrLen_t iLen = -1);
129  HRESULT DoBind(SQL_COLUMN_t i, const void* pValue, size_t nSize);
130  HRESULT DoBind(SQL_COLUMN_t i);
131 
132  cSQLiteStatement(sqlite3* pDb, const GChar_t* pszQueryStr);
133 
134  public:
135  virtual ~cSQLiteStatement();
136 
137  virtual HRESULT CloseStatement(bool bDrop) override;
138  virtual HRESULT ExecuteAndFetch(bool bResultsExpected) override;
139  virtual void ExecCancel() override;
140  virtual HRESULT FetchNext(bool bMore = false) override;
141  virtual ITERATE_t ReadColumnCount() override;
142 
143  cSQLiteColumn GetColumn(cSQLiteCol_t iColumn = 0) const;
144 
145  virtual bool ReadColumnInfo(SQL_COLUMN_t iColumn, OUT cSQLColumnInfo& info) override;
146  virtual bool GetColumnVar(SQL_COLUMN_t iColumn, cSQLColumnInfo* pColInfo, OUT cVariant& vValRet) override;
147 
148  template<class T>
149  HRESULT Bind(SQL_COLUMN_t i, const T& value)
150  {
151  // 1 based col
152  ResetBindCheck();
153  return DoBind(i, value);
154  }
155 
156  HRESULT BindBlob(SQL_COLUMN_t i, const void* value, int nSize)
157  {
158  // 1 based col
159  ResetBindCheck();
160  return DoBind(i, value, nSize);
161  }
163  {
164  // 1 based col
165  ResetBindCheck();
166  return DoBind(i);
167  }
168 
171  };
173 
175  {
177 
178  typedef cSQLiteBase SUPER_t;
179 
180  protected:
181  cSQLiteStatement* QueryInternal(const GChar_t* queryStr);
182 
183  public:
184  cSQLiteDb(const FILECHAR_t* fileName);
185  virtual ~cSQLiteDb();
186 
187  virtual HRESULT OpenConnect(const cSQLConnectionString& rConnectionString, INT_PTR hParentWnd) override;
188  virtual HRESULT ReadConfigDB(OUT cSQLConfigDB& cfg) override;
189  virtual bool Disconnect() override;
190 
192  {
193  return QueryInternal(queryStr);
194  }
195  virtual ISQLStatement* AllocISQLStatement(const cSQLCmd& oCmd) override;
196 
198  {
199  return Query(_GT("BEGIN;"))->ExecuteAndFetch(false);
200  }
201  virtual HRESULT EndTransaction(bool bCommit) override
202  {
203  return Query(bCommit ? _GT("COMMIT;") : _GT("ROLLBACK;"))->ExecuteAndFetch(false);
204  }
205 
206  bool TableExists(const GChar_t* tableName);
207  sqlite3_int64 LastId();
208 
211  };
212 }
213 
214 #endif
#define GRAYSQLITE_LINK
Definition: GraySQLite.h:16
#define _GT(x)
like _T(x) macro for static text.
Definition: StrConst.h:27
INT32 HRESULT
_WIN32 style error codes. INT32
Definition: SysTypes.h:465
#define ASSERT(exp)
Definition: cDebugAssert.h:87
struct sqlite3 sqlite3
Definition: cSQLite.h:15
#define cSQLiteBase_DISAMBIG
Definition: cSQLite.h:100
struct sqlite3_stmt sqlite3_stmt
Definition: cSQLite.h:16
INT64 sqlite3_int64
Definition: cSQLite.h:17
Definition: cSQLCmd.h:36
Definition: cSQLConfig.h:103
Definition: cSQLBase.h:30
Definition: cSQLBase.h:56
Definition: cVariant.h:26
Definition: cSQLite.h:79
int m_nNativeError
should be 'int' or SQL_RETURN_t ? SQLITE_OK, SQLITE_EMPTY
Definition: cSQLite.h:87
cSQLiteBase(::sqlite3 *pDB=nullptr)
Definition: cSQLite.h:93
::sqlite3 * m_pDB
Pointer to the native DB provider / connection.
Definition: cSQLite.h:86
Definition: cSQLite.h:27
cSQLiteColumn(::sqlite3 *pDB, ::sqlite3_stmt *pStmt, cSQLiteCol_t nColumn)
Definition: cSQLite.h:39
Definition: cSQLite.h:175
cSQLiteStatementPtr Query(const GChar_t *queryStr)
Definition: cSQLite.h:191
virtual HRESULT EndTransaction(bool bCommit) override
Definition: cSQLite.h:201
HRESULT BeginTransaction()
Definition: cSQLite.h:197
Definition: cSQLite.h:106
HRESULT BindBlob(SQL_COLUMN_t i, const void *value, int nSize)
Definition: cSQLite.h:156
void ResetBindCheck()
Definition: cSQLite.h:118
HRESULT Bind(SQL_COLUMN_t i, const T &value)
Definition: cSQLite.h:149
bool m_bNeedResetBind
sqlite3_step has been called. need to call sqlite3_reset to clear binds to reuse this statement.
Definition: cSQLite.h:114
::sqlite3_stmt * m_pStmt
Statement in action.
Definition: cSQLite.h:113
HRESULT BindNull(SQL_COLUMN_t i)
Definition: cSQLite.h:162
Definition: cHeap.h:156
Definition: cRefPtr.h:22
Definition: cRefPtr.h:225
Definition: ISQLDriver.h:44
Definition: ISQLDriver.h:30
int SQL_COLUMN_t
what field/column/parameter number. 1 based. SQLUSMALLINT
Definition: cSQLBase.h:23
Definition: GraySQLite.cpp:25
cRefPtr< cSQLiteStatement > cSQLiteStatementPtr
Definition: cSQLite.h:172
int cSQLiteCol_t
0 based columns. unlike SQL_COLUMN_t
Definition: cSQLite.h:24
int StrLen_t
the length of a string in chars (bytes for UTF8, wchar_t for UNICODE). or offset in characters....
Definition: StrConst.h:32
int ITERATE_t
like size_t but signed
Definition: Index.h:28
char FILECHAR_t
a UTF8 char in a file name. like TCHAR
Definition: FileName.h:22
char GChar_t
My version of TCHAR, _TCHAR.
Definition: StrConst.h:26
cStringT< GChar_t > cString
Definition: cString.h:636
Definition: cSQLConfig.h:29