Skip to content

Commit 8bd3101

Browse files
author
ubuntu14
committed
add transaction API in db_handle and db_mysql
1 parent d1fe096 commit 8bd3101

File tree

9 files changed

+116
-26
lines changed

9 files changed

+116
-26
lines changed

lib_acl_cpp/changes.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
�޸���ʷ�б���
22

33
------------------------------------------------------------------------
4+
347) 2015.8.19
5+
347.1) feature: db_handle/db_mysql ֧�������ύ�ӿ�
6+
47
346) 2015.8.18
58
346.1) feature: http_client/http_request ���ڶ�ȡѹ��������ʱ�����Զ�����
69
��ʱ�������Ϊ 0 ��������Խ���ʹ�ø��Ӷ�

lib_acl_cpp/include/acl_cpp/db/db_handle.hpp

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -63,15 +63,15 @@ class ACL_CPP_API db_row
6363
* 从查询结果的记录行中取得对应下标的整数类型的字段值
6464
* @param ifield {size_t} 下标值
6565
* @param null_value {int} 当结果为空时,返回此值表示未有相应结果
66-
* @return {int} 当返回值与用户输入的 null_value 值相同时表明没有查到结果
66+
* @return {int} 当返回值与用户输入的 null_value 相同表明没有查到结果
6767
*/
6868
int field_int(size_t ifield, int null_value = 0) const;
6969

7070
/**
7171
* 从查询结果的记录行中取得字段名的整数类型的字段值
7272
* @param name {const char*} 下标值
7373
* @param null_value {int} 当结果为空时,返回此值表示未有相应结果
74-
* @return {int} 当返回值与用户输入的 null_value 值相同时表明没有查到结果
74+
* @return {int} 当返回值与用户输入的 null_value 相同表明没有查到结果
7575
*/
7676
int field_int(const char* name, int null_value = 0) const;
7777

@@ -80,39 +80,45 @@ class ACL_CPP_API db_row
8080
* 从查询结果的记录行中取得对应下标的整数类型的字段值
8181
* @param ifield {size_t} 下标值
8282
* @param null_value {acl_int64} 当结果为空时,返回此值表示未有相应结果
83-
* @return {acl_int64} 当返回值与用户输入的 null_value 值相同时表明没有查到结果
83+
* @return {acl_int64} 当返回值与用户输入的 null_value 值相同时表明
84+
* 没有查到结果
8485
*/
8586
#if defined(_WIN32) || defined(_WIN64)
8687
__int64 field_int64(size_t ifield, __int64 null_value = 0) const;
8788
#else
88-
long long int field_int64(size_t ifield, long long int null_value = 0) const;
89+
long long int field_int64(size_t ifield,
90+
long long int null_value = 0) const;
8991
#endif
9092

9193
/**
9294
* 从查询结果的记录行中取得字段名的整数类型的字段值
9395
* @param name {const char*} 下标值
9496
* @param null_value {acl_int64} 当结果为空时,返回此值表示未有相应结果
95-
* @return {acl_int64} 当返回值与用户输入的 null_value 值相同时表明没有查到结果
97+
* @return {acl_int64} 当返回值与用户输入的 null_value 值相同时表明
98+
* 没有查到结果
9699
*/
97100
#if defined(_WIN32) || defined(_WIN64)
98101
__int64 field_int64(const char* name, __int64 null_value = 0) const;
99102
#else
100-
long long int field_int64(const char* name, long long int null_value = 0) const;
103+
long long int field_int64(const char* name,
104+
long long int null_value = 0) const;
101105
#endif
102106

103107
/**
104108
* 从查询结果的记录行中取得字段名的浮点类型的字段值
105109
* @param ifield {size_t} 下标值
106110
* @param null_value {double} 当结果为空时,返回此值表示未有相应结果
107-
* @return {double} 当返回值与用户输入的 null_value 值相同时表明没有查到结果
111+
* @return {double} 当返回值与用户输入的 null_value 值相同时表明没有
112+
* 查到结果
108113
*/
109114
double field_double(size_t ifield, double null_value = 0.0) const;
110115

111116
/**
112117
* 从查询结果的记录行中取得字段名的浮点类型的字段值
113118
* @param name {const char*} 下标值
114119
* @param null_value {double} 当结果为空时,返回此值表示未有相应结果
115-
* @return {double} 当返回值与用户输入的 null_value 值相同时表明没有查到结果
120+
* @return {double} 当返回值与用户输入的 null_value 值相同时表明没有
121+
* 查到结果
116122
*/
117123
double field_double(const char* name, double null_value = 0.0) const;
118124

@@ -312,16 +318,28 @@ class ACL_CPP_API db_handle : public connect_client
312318
virtual bool sql_update(const char* sql) = 0;
313319

314320
/**
315-
* 更安全易用的查询过程,调用此函数功能等同于 sql_select,只是查询对象 query
316-
* 构建的 sql 语句是安全的,可以防止 sql 注入
321+
* 开始执行事务
322+
* @return {bool}
323+
*/
324+
virtual bool begin_transaction() { return false; }
325+
326+
/**
327+
* 提交事务
328+
* @return {bool}
329+
*/
330+
virtual bool commit() { return false; }
331+
332+
/**
333+
* 更安全易用的查询过程,调用此函数功能等同于 sql_select,只是查询
334+
* 对象 query 构建的 sql 语句是安全的,可以防止 sql 注入
317335
* @param query {query&}
318336
* @return {bool} 执行是否成功
319337
*/
320338
bool exec_select(query& query);
321339

322340
/**
323-
* 更安全易用的更新过程,调用此函数功能等同于 sql_update,只是查询对象 query
324-
* 构建的 sql 语句是安全的,可以防止 sql 注入
341+
* 更安全易用的更新过程,调用此函数功能等同于 sql_update,只是查询
342+
* 对象 query 构建的 sql 语句是安全的,可以防止 sql 注入
325343
* @param query {query&}
326344
* @return {bool} 执行是否成功
327345
*/
@@ -372,9 +390,9 @@ class ACL_CPP_API db_handle : public connect_client
372390
const std::vector<db_row*>* get_rows() const;
373391

374392
/**
375-
* 获得执行 SQL 语句后的第一行结果,这对于唯一键的数据查询时显得比较便捷些
376-
* @return {const db_row*} 返回空表示查询结果为空,如果返回结果非空,则必须
377-
* 调用 free_result() 函数来释放中间的结果内存,否则会引起内存泄露
393+
* 获得执行 SQL 语句后的第一行结果,针对唯一键的数据查询比较方便
394+
* @return {const db_row*} 返回空表示查询结果为空,否则, 则必须调用
395+
* free_result() 函数来释放中间的结果内存,否则会引起内存泄露
378396
*/
379397
const db_row* get_first_row() const;
380398

lib_acl_cpp/include/acl_cpp/db/db_mysql.hpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class ACL_CPP_API db_mysql : public db_handle
3838
}
3939

4040
/********************************************************************/
41-
/* 以下为基类 db_handle 的虚接口 */
41+
/* 以下为基类 db_handle 的虚接口 */
4242
/********************************************************************/
4343

4444
/**
@@ -106,6 +106,19 @@ class ACL_CPP_API db_mysql : public db_handle
106106
*/
107107
int affect_count() const;
108108

109+
/**
110+
* 基类 db_handle 的虚函数,用来表示事务的开始,注意若要使用事务方式,
111+
* 则需要在 db_mysql 的构造函数中传入的参数 auto_commit 为 false
112+
* @return {bool}
113+
*/
114+
bool begin_transaction();
115+
116+
/**
117+
* 基类 db_handle 的虚函数,用来表示事务的结束
118+
* @return {bool}
119+
*/
120+
bool commit();
121+
109122
private:
110123
char* dbaddr_; // 数据库监听地址
111124
char* dbname_; // 数据库名

lib_acl_cpp/samples/db/mysql_manager/main.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,7 @@ int main(void)
386386
acl::db_handle::set_loadpath(path);
387387

388388
acl::string dbaddr("127.0.0.1:3306");
389-
acl::string dbname("acl_db"), dbuser("root"), dbpass("111111");
389+
acl::string dbname("acl_db"), dbuser("root"), dbpass;
390390

391391
out.format("Enter dbaddr [default: %s]: ", dbaddr.c_str());
392392
if (in.gets(line) && !line.empty())

lib_acl_cpp/samples/db/mysql_pool/main.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -362,7 +362,7 @@ int main(void)
362362
acl::db_handle::set_loadpath(path);
363363

364364
acl::string dbaddr("127.0.0.1:3306");
365-
acl::string dbname("acl_db"), dbuser("root"), dbpass("111111");
365+
acl::string dbname("acl_db"), dbuser("root"), dbpass;
366366

367367
out.format("Enter dbaddr [default: %s]: ", dbaddr.c_str());
368368
if (in.gets(line) && !line.empty())

lib_acl_cpp/samples/db/mysql_query/main.cpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,12 @@ static bool tbl_create(const char* dbaddr, const char* dbname,
9898
// 添加表数据
9999
static bool tbl_insert(acl::db_handle& db, int n)
100100
{
101+
if (db.begin_transaction() == false)
102+
{
103+
printf("begin transaction false: %s\r\n", db.get_error());
104+
return false;
105+
}
106+
101107
acl::query query;
102108
query.create_sql("insert into group_tbl(group_name, uvip_tbl,"
103109
" update_date) values(:group, :test, :date)")
@@ -108,6 +114,12 @@ static bool tbl_insert(acl::db_handle& db, int n)
108114
if (db.exec_update(query) == false)
109115
return (false);
110116

117+
if (db.commit() == false)
118+
{
119+
printf("commit error: %s\r\n", db.get_error());
120+
return false;
121+
}
122+
111123
const acl::db_rows* result = db.get_result();
112124
if (result)
113125
{
@@ -263,7 +275,7 @@ int main(void)
263275
acl::db_handle::set_loadpath(path);
264276

265277
acl::string dbaddr("127.0.0.1:3306");
266-
acl::string dbname("acl_db"), dbuser("root"), dbpass("111111");
278+
acl::string dbname("acl_db"), dbuser("root"), dbpass;
267279

268280
out.format("Enter dbaddr [default: %s]: ", dbaddr.c_str());
269281
if (in.gets(line) && !line.empty())
@@ -316,7 +328,7 @@ int main(void)
316328

317329
//////////////////////////////////////////////////////////////////////
318330

319-
acl::db_mysql db(dbaddr, dbname, dbuser, dbpass);
331+
acl::db_mysql db(dbaddr, dbname, dbuser, dbpass, 0, false);
320332
int max = 100;
321333

322334
// 先打开数据库连接

lib_acl_cpp/src/db/db_mysql.cpp

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,22 +67,25 @@ static mysql_character_set_name_fn __mysql_character_set_name = NULL;
6767
static acl_pthread_once_t __mysql_once = ACL_PTHREAD_ONCE_INIT;
6868
static ACL_DLL_HANDLE __mysql_dll = NULL;
6969

70+
static acl::string __mysql_path;
71+
7072
// 程序退出释放动态加载的库
7173
static void __mysql_dll_unload(void)
7274
{
7375
if (__mysql_dll != NULL)
7476
{
7577
acl_dlclose(__mysql_dll);
7678
__mysql_dll = NULL;
77-
logger("libmysql.dll unload ok");
79+
logger("%s unload ok", __mysql_path.c_str());
7880
}
7981
}
8082

8183
// 动态加载 libmysql.dll 库
8284
static void __mysql_dll_load(void)
8385
{
8486
if (__mysql_dll != NULL)
85-
logger_fatal("__mysql_dll not null");
87+
logger_fatal("mysql(%s) to be loaded again!",
88+
__mysql_path.c_str());
8689

8790
const char* path;
8891
const char* ptr = acl::db_handle::get_loadpath();
@@ -100,6 +103,8 @@ static void __mysql_dll_load(void)
100103
if (__mysql_dll == NULL)
101104
logger_fatal("load %s error: %s", path, acl_last_serror());
102105

106+
__mysql_path = path;
107+
103108
__mysql_libversion = (mysql_libversion_fn)
104109
acl_dlsym(__mysql_dll, "mysql_get_client_version");
105110
if (__mysql_libversion == NULL)
@@ -615,6 +620,28 @@ int db_mysql::affect_count() const
615620
return (int) __mysql_affected_rows(conn_);
616621
}
617622

623+
bool db_mysql::begin_transaction()
624+
{
625+
const char* sql = "start transaction";
626+
if (sql_update(sql) == false)
627+
{
628+
logger_error("%s error: %s", sql, get_error());
629+
return false;
630+
}
631+
return true;
632+
}
633+
634+
bool db_mysql::commit()
635+
{
636+
const char* sql = "commit";
637+
if (sql_update(sql) == false)
638+
{
639+
logger_error("%s error: %s", sql, get_error());
640+
return false;
641+
}
642+
return true;
643+
}
644+
618645
} // namespace acl
619646

620647
#else
@@ -668,6 +695,16 @@ bool db_mysql::sql_update(const char*)
668695
return false;
669696
}
670697

698+
bool db_mysql::begin_transaction()
699+
{
700+
return false;
701+
}
702+
703+
bool db_mysql::commit()
704+
{
705+
return false;
706+
}
707+
671708
int db_mysql::affect_count() const
672709
{
673710
return 0;

lib_acl_cpp/src/db/db_sqlite.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242

4343
static acl_pthread_once_t __sqlite_once = ACL_PTHREAD_ONCE_INIT;
4444
static ACL_DLL_HANDLE __sqlite_dll = NULL;
45+
static acl::string __sqlite_path;
4546

4647
// 程序退出释放动态加载的库
4748
static void __sqlite_dll_unload(void)
@@ -50,15 +51,19 @@
5051
{
5152
acl_dlclose(__sqlite_dll);
5253
__sqlite_dll = NULL;
53-
logger("sqlite3.dll unload ok");
54+
logger("%s unload ok", __sqlite_path.c_str());
5455
}
5556
}
5657

5758
// 动态加载 sqlite3.dll 库
5859
static void __sqlite_dll_load(void)
5960
{
6061
if (__sqlite_dll != NULL)
61-
logger_fatal("__sqlite_dll not null");
62+
{
63+
logger_warn("sqlite(%s) to be loaded again!",
64+
__sqlite_path.c_str());
65+
return;
66+
}
6267

6368
const char* path;
6469
const char* ptr = acl::db_handle::get_loadpath();
@@ -75,6 +80,8 @@
7580
if (__sqlite_dll == NULL)
7681
logger_fatal("load %s error: %s", path, acl_last_serror());
7782

83+
__sqlite_path = path;
84+
7885
__sqlite3_libversion = (sqlite3_libversion_fn)
7986
acl_dlsym(__sqlite_dll, "sqlite3_libversion");
8087
if (__sqlite3_libversion == NULL)

lib_acl_cpp/src/http/HttpServletResponse.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -157,8 +157,8 @@ bool HttpServletResponse::sendHeader(void)
157157

158158
header_->set_content_type(buf);
159159

160-
// 虽然服务端在响应头中设置了 gzip 压缩方式,但如果请求端不接收
161-
// gzip 压缩数据,则需要从响应头中禁止
160+
// 虽然服务端在响应头中设置了 gzip 压缩方式,但如果请求端不接收
161+
// gzip 压缩数据,则需要从响应头中禁止
162162
if (header_->is_transfer_gzip() && request_)
163163
{
164164
bool accept_gzip = false;

0 commit comments

Comments
 (0)