acl  3.5.3.0
db_sqlite.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../acl_cpp_define.hpp"
3 #include "../stdlib/string.hpp"
4 #include "../db/db_handle.hpp"
5 
6 #if !defined(ACL_DB_DISABLE)
7 
8 typedef struct sqlite3 sqlite3;
9 typedef struct sqlite3_stmt sqlite3_stmt;
10 
11 namespace acl {
12 
13 class charset_conv;
14 class sqlite_cursor;
15 
17 {
18 public:
19  /**
20  * 构造函数
21  * @param charset {const char*} 本地字符集(gbk, utf-8, ...)
22  */
23  db_sqlite(const char* dbfile, const char* charset = "utf-8");
24  ~db_sqlite(void);
25 
26  /**
27  * 返回当前的 sqlite 的版本信息
28  * @return {const char*}
29  */
30  const char* version(void) const;
31 
32  /**
33  * 当数据库打开后通过此函数对数据库的操作引擎进行配置,
34  * 进行配置的内容需要严格遵循 sqlite 本身的配置选项要求
35  * @param pragma {const char*} 配置选项内容,格式为:
36  * PRAGMA xxx=xxx
37  * 如:PRAGMA synchronous = NORMAL
38  * @return {bool} 配置数据库是否成功
39  */
40  bool set_conf(const char* pragma);
41 
42  /**
43  * 当数据库打开调用此函数获得数据引擎的配置选项
44  * @param pragma {const char*} 配置选项内容,格式为:
45  * PRAGMA xxx
46  * 如:PRAGMA synchronous
47  * @param out {string&} 如果返回值非空则存储结果
48  * @return {const char*} 为空则说明该配置不存在或数据库未打开
49  */
50  const char* get_conf(const char* pragma, string& out);
51 
52  /**
53  * 在数据库打开的情况下输入数据库引擎的配置选项
54  * @param pragma {const char*} 指定的配置选项,如果该参数为空,
55  * 则输出所有的配置选项,格式为:PRAGMA xxx,如:PRAGMA synchronous
56  */
57  void show_conf(const char* pragma = NULL);
58 
59  /**
60  * 自数据库打开后所有的影响的记录行数
61  * @return {int} 影响的行数,-1 表示出错
62  */
63  int affect_total_count(void) const;
64 
65  /**
66  * 直接获得 sqlite 的句柄,如果返回 NULL 则表示 sqlite 还没有打开
67  * 或出错时内部自动关闭了 sqlite
68  * @return {sqlite3*}
69  */
70  sqlite3* get_conn(void) const
71  {
72  return db_;
73  }
74 
75  /**
76  * 准备游标
77  * @param cursor {sqlite_cursor&}
78  * @return {bool}
79  */
80  bool prepare(sqlite_cursor& cursor);
81 
82  /**
83  * 执行下一步,如果是查询类过程,则将查询结果存入给定的参数中
84  * @param cursor {sqlite_cursor&}
85  * @return {bool}
86  */
87  bool next(sqlite_cursor& cursor, bool* done);
88 
89  /********************************************************************/
90  /* 以下为一些 sqlite3 的私有接口 */
91  /********************************************************************/
92 
93  /**
94  * 将zSql初始化为 prepared statement
95  * @param zSql {const char*} utf-8编码的sql
96  * @param nByte {int} zSql的最大字节长度
97  * @param ppStmt {sqlite3_stmt**} OUT: prepared statement句柄
98  * @param pzTail {const char**} OUT: 指向zSql未使用部分的指针
99  * @return {int} 成功返回 SQLITE_OK,否则返回相应的错误代码
100  */
101  int sqlite3_prepare_v2(const char *zSql,
102  int nByte, sqlite3_stmt **ppStmt, const char **pzTail);
103 
104  /**
105  * 计算 prepared statement
106  * @param stmt {sqlite3_stmt*} prepared statement
107  * @return {int} 返回 SQLITE_BUSY, SQLITE_DONE, SQLITE_ROW,
108  * SQLITE_ERROR, 或 SQLITE_MISUSE
109  */
110  int sqlite3_step(sqlite3_stmt *stmt);
111 
112  /**
113  * 将prepared statement重置为初始化状态
114  * @param pStmt {sqlite3_stmt*} prepared statement
115  * @return {int} SQLITE_ROW, SQLITE_DONE 或 SQLITE_OK
116  */
117  int sqlite3_reset(sqlite3_stmt *pStmt);
118 
119  /**
120  * 释放 prepared statement 资源
121  * @param stmt {sqlite3_stmt*} prepared statement句柄
122  * @return {int} SQLITE_OK 或其他错误代码
123  */
124  int sqlite3_finalize(sqlite3_stmt *stmt);
125 
126  /**
127  * 绑定二进制数据
128  * @param stmt {sqlite3*} prepared statement
129  * @param iCol {int} 待绑定到sql中的参数索引
130  * @param value {const void*} 待绑定到sql中的参数数值
131  * @param n {int} 参数的字节长度
132  * @param destory {void(*)(void*)} 传入参数的析构函数
133  * @return {int} 成功返回 SQLITE_OK,否则返回相应的错误代码
134  */
135  int sqlite3_bind_blob(sqlite3_stmt *stmt, int iCol,
136  const void *value, int n, void(*destory)(void*));
137 
138  /**
139  * 绑定int类型数据
140  * @param stmt {sqlite3*} prepared statement
141  * @param iCol {int} 待绑定到sql中的参数索引
142  * @param value {int} 待绑定到sql中的参数数值
143  * @return {int} 成功返回 SQLITE_OK,否则返回相应的错误代码
144  */
145  int sqlite3_bind_int(sqlite3_stmt *stmt, int iCol, int value);
146 
147  /**
148  * 绑定int64数据
149  * @param stmt {sqlite3*} prepared statement
150  * @param iCol {int} 待绑定到sql中的参数索引
151  * @param value {long long int} 待绑定到sql中的参数数值
152  * @return {int} 成功返回 SQLITE_OK,否则返回相应的错误代码
153  */
154  int sqlite3_bind_int64(sqlite3_stmt* stmt, int iCol, long long int value);
155 
156  /**
157  * 绑定text数据
158  * @param stmt {sqlite3*} prepared statement
159  * @param iCol {int} 待绑定到sql中的参数索引
160  * @param value {const void*} 待绑定到sql中的参数数值
161  * @param n {int} 参数的字节长度
162  * @param destory {void(*)(void*)} 传入参数的析构函数
163  * @return {int} 成功返回 SQLITE_OK,否则返回相应的错误代码
164  */
165  int sqlite3_bind_text(sqlite3_stmt *stmt, int iCol,
166  const char *value, int n, void(*destory)(void*));
167 
168  /**
169  * 返回 prepared statement 结果集的列数
170  * @param stmt {sqlite3_stmt*} prepared statement
171  * @return {int} 列数量
172  */
173  int sqlite3_column_count(sqlite3_stmt *stmt);
174 
175  /**
176  * 返回查询结果的对应列的二进制结果信息
177  * @param stmt {sqlite3_stmt*} prepared statement
178  * @param iCol {int} 列索引
179  * @return {const void*} 数据指针
180  */
181  const void *sqlite3_column_blob(sqlite3_stmt *stmt, int iCol);
182 
183  /**
184  * 返回查询结果的对应列的int结果信息
185  * @param stmt {sqlite3_stmt*} prepared statement
186  * @param iCol {int} 列索引
187  * @return {int} 数据
188  */
189  int sqlite3_column_int(sqlite3_stmt *stmt, int iCol);
190 
191  /**
192  * 返回查询结果的对应列的int64结果信息
193  * @param stmt {sqlite3_stmt*} prepared statement
194  * @param iCol {int} 列索引
195  * @return {long long int} 数据
196  */
197  long long int sqlite3_column_int64(sqlite3_stmt *stmt, int iCol);
198 
199  /**
200  * 返回查询结果的对应列的 utf-8 text 结果信息
201  * @param stmt {sqlite3_stmt*} prepared statement
202  * @param iCol {int} 列索引
203  * @return {const unsigned char *} 数据指针
204  */
205  const unsigned char *sqlite3_column_text(sqlite3_stmt *stmt, int iCol);
206 
207  /**
208  * 返回查询结果的对应列的结果信息数据字节长度
209  * @param stmt {sqlite3_stmt*} prepared statement
210  * @param iCol {int} 列索引
211  * @return {const unsigned char *} 数据指针
212  */
213  int sqlite3_column_bytes(sqlite3_stmt *stmt, int iCol);
214 
215  /**
216  * 返回select结果集中特定列的名称
217  * @param stmt {sqlite3_stmt*} prepared statement
218  * @param iCol {int} 列索引
219  * @return {const char*} 列名
220  */
221  const char *sqlite3_column_name(sqlite3_stmt *stmt, int iCol);
222 
223  /**
224  * 执行单条sql语句
225  * @param sql {const char*} 待执行的sql语句
226  * @param callback {int (*)(void*,int,char**,char**)} callback函数
227  * @param arg {void*}callback函数的第一个参数
228  * @param errmsg {char**} 错误信息
229  * @return {int} SQLITE_OK 或其他错误码
230  */
231  int sqlite3_exec(const char *sql,
232  int(*callback)(void*,int,char**,char**), void *arg, char **errmsg);
233 
234  /**
235  * 为释放 errmsg 而添加的接口
236  * @param ptr {void*} 待释放数据指针
237  */
238  void sqlite3_free(void* ptr);
239 
240  /********************************************************************/
241  /* 以下为基类 db_handle 的虚接口 */
242  /********************************************************************/
243 
244  /**
245  * @override
246  */
247  const char* dbtype(void) const;
248 
249  /**
250  * @override
251  */
252  int get_errno(void) const;
253 
254  /**
255  * @override
256  */
257  const char* get_error(void) const;
258 
259  /**
260  * @override
261  */
262  bool dbopen(const char* charset = NULL);
263 
264  /**
265  * @override
266  */
267  bool is_opened(void) const;
268 
269  /**
270  * @override
271  */
272  bool close(void);
273 
274  /**
275  * @override
276  */
277  bool tbl_exists(const char* tbl_name);
278 
279  /**
280  * @override
281  */
282  bool sql_select(const char* sql, db_rows* result = NULL);
283 
284  /**
285  * @override
286  */
287  bool sql_update(const char* sql);
288 
289  /**
290  * @override
291  */
292  int affect_count(void) const;
293 
294  /**
295  * @override
296  */
297  bool begin_transaction(void);
298 
299  /**
300  * @override
301  */
302  bool commit(void);
303 
304  /**
305  * @override
306  */
307  bool set_busy_timeout(int nMillisecs);
308 
309 
310 private:
311  // sqlite 引擎
312  sqlite3* db_;
313 
314  // 数据存储文件
315  string dbfile_;
316 
317  // 字符集转码器
318  charset_conv* conv_;
319 
320  // 本地字符集
321  string charset_;
322 
323  // 真正执行SQL查询的函数
324  bool exec_sql(const char* sql, db_rows* result = NULL);
325 };
326 
327 } // namespace acl
328 
329 #endif // !defined(ACL_DB_DISABLE)
sqlite3 * get_conn(void) const
Definition: db_sqlite.hpp:70
struct sqlite3 sqlite3
Definition: db_sqlite.hpp:8
#define ACL_CPP_API
struct sqlite3_stmt sqlite3_stmt
Definition: db_sqlite.hpp:9