acl  3.5.3.0
db_service.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../acl_cpp_define.hpp"
3 #include <list>
4 #include "../ipc/ipc_service.hpp"
5 #include "../stdlib/string.hpp"
6 
7 #if !defined(ACL_DB_DISABLE)
8 
9 namespace acl {
10 
11 typedef enum
12 {
16 } db_status;
17 
18 //////////////////////////////////////////////////////////////////////////
19 
20 class db_rows;
21 
23 {
24 public:
25  db_query(void) {}
26  virtual ~db_query(void) {}
27 
28  virtual void on_error(db_status status) = 0;
29  virtual void on_ok(const db_rows* rows, int affected) = 0;
30 
31  /**
32  * 当任务处理完毕或出错时,内部处理过程会自动调用 destroy 接口,
33  * 子类可以在该接口内进行一些释放过程,尤其当该对象是动态创建时,
34  * 子类应该在该函数内 delete this 以删除自己,因为该函数最终肯定
35  * 会被调用,所以子类不应在其它地方进行析构操作
36  */
37  virtual void destroy(void) {}
38 protected:
39 private:
40 };
41 
42 //////////////////////////////////////////////////////////////////////////
43 
44 class db_handle;
45 class aio_socket_stream;
46 
47 /**
48  * 数据库服务类,该类是一个异步数据库操作管理类,该类对象所在的线程必须是
49  * 一个非阻塞的线程过程
50  */
52 {
53 public:
54  /**
55  * 当为 sqlite 数据库时的构造函数
56  * @param dblimit {size_t} 数据库连接池的个数限制
57  * @param nthread {int} 子线程池的最大线程数
58  * @param win32_gui {bool} 是否是窗口类的消息,如果是,则内部的
59  * 通讯模式自动设置为基于 _WIN32 的消息,否则依然采用通用的套接
60  * 口通讯方式
61  */
62  db_service(size_t dblimit = 100, int nthread = 2, bool win32_gui = false);
63  virtual ~db_service(void);
64 
65  /**
66  * 异步执行 SQL 查询语句
67  * @param sql {const char*} 要执行的标准 SQL 语句
68  * @param query {db_query*} 用来接收执行结果的类对象
69  */
70  void sql_select(const char* sql, db_query* query);
71 
72  /**
73  * 异步执行 SQL 更新语句
74  * @param sql {const char*} 要执行的标准 SQL 语句
75  * @param query {db_query*} 用来接收执行结果的类对象
76  */
77  void sql_update(const char* sql, db_query* query);
78 
79  /**
80  * 向数据库连接池中添加连接对象
81  * @param db {db_handle*} 数据库连接对象
82  */
83  void push_back(db_handle* db);
84 protected:
85  /**
86  * 需要子类实现此函数用来创建数据库对象
87  * @return {db_handle*}
88  */
89  virtual db_handle* db_create() = 0;
90 
91  /**
92  * 基类虚函数,当有新连接到达时基类回调此函数
93  * @param client {aio_socket_stream*} 接收到的新的客户端连接
94  */
95  virtual void on_accept(aio_socket_stream* client);
96 
97 #if defined(_WIN32) || defined(_WIN64)
98  /**
99  * 基类虚函数,当收到来自于子线程的 win32 消息时的回调函数
100  * @param hWnd {HWND} 窗口句柄
101  * @param msg {UINT} 用户自定义消息号
102  * @param wParam {WPARAM} 参数
103  * @param lParam {LPARAM} 参数
104  */
105  virtual void win32_proc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
106 #endif
107 
108 private:
109  // 数据库引擎池
110  std::list<db_handle*> dbpool_;
111 
112  // 数据库连接池的个数限制
113  size_t dblimit_;
114 
115  // 当前数据库连接池的个数
116  size_t dbsize_;
117 };
118 
119 } // namespace acl
120 
121 #endif // !defined(ACL_DB_DISABLE)
db_status
Definition: db_service.hpp:11
virtual ~db_query(void)
Definition: db_service.hpp:26
virtual void destroy(void)
Definition: db_service.hpp:37
#define ACL_CPP_API