mirror of
https://github.com/php/php-src.git
synced 2024-09-22 10:27:25 +00:00
Add support for commit and rollback options.
Add support for explicitly starting a transaction - modes also available. Using the API makes the life of load balancer mysqlnd plugins easier/possible.
This commit is contained in:
parent
0547a36e95
commit
9fb0dba4be
@ -2617,16 +2617,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, set_autocommit)(MYSQLND_CONN_DATA * conn, unsi
|
||||
static enum_func_status
|
||||
MYSQLND_METHOD(mysqlnd_conn_data, tx_commit)(MYSQLND_CONN_DATA * conn TSRMLS_DC)
|
||||
{
|
||||
size_t this_func = STRUCT_OFFSET(struct st_mysqlnd_conn_data_methods, tx_commit);
|
||||
enum_func_status ret = FAIL;
|
||||
DBG_ENTER("mysqlnd_conn_data::tx_commit");
|
||||
|
||||
if (PASS == conn->m->local_tx_start(conn, this_func TSRMLS_CC)) {
|
||||
ret = conn->m->query(conn, "COMMIT", sizeof("COMMIT") - 1 TSRMLS_CC);
|
||||
conn->m->local_tx_end(conn, this_func, ret TSRMLS_CC);
|
||||
}
|
||||
|
||||
DBG_RETURN(ret);
|
||||
return conn->m->tx_commit_or_rollback(conn, TRUE, TRANS_COR_NO_OPT, NULL TSRMLS_CC);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
@ -2635,12 +2626,70 @@ MYSQLND_METHOD(mysqlnd_conn_data, tx_commit)(MYSQLND_CONN_DATA * conn TSRMLS_DC)
|
||||
static enum_func_status
|
||||
MYSQLND_METHOD(mysqlnd_conn_data, tx_rollback)(MYSQLND_CONN_DATA * conn TSRMLS_DC)
|
||||
{
|
||||
size_t this_func = STRUCT_OFFSET(struct st_mysqlnd_conn_data_methods, tx_rollback);
|
||||
return conn->m->tx_commit_or_rollback(conn, FALSE, TRANS_COR_NO_OPT, NULL TSRMLS_CC);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
/* {{{ mysqlnd_tx_cor_options_to_string */
|
||||
static void
|
||||
MYSQLND_METHOD(mysqlnd_conn_data, tx_cor_options_to_string)(const MYSQLND_CONN_DATA * const conn, smart_str * str, const unsigned int mode TSRMLS_DC)
|
||||
{
|
||||
if (mode & TRANS_COR_AND_CHAIN && !(mode & TRANS_COR_AND_NO_CHAIN)) {
|
||||
if (str->len) {
|
||||
smart_str_appendl(str, ", ", sizeof(", ") - 1);
|
||||
}
|
||||
smart_str_appendl(str, "AND CHAIN", sizeof("AND CHAIN") - 1);
|
||||
} else if (mode & TRANS_COR_AND_NO_CHAIN && !(mode & TRANS_COR_AND_CHAIN)) {
|
||||
if (str->len) {
|
||||
smart_str_appendl(str, ", ", sizeof(", ") - 1);
|
||||
}
|
||||
smart_str_appendl(str, "AND NO CHAIN", sizeof("AND NO CHAIN") - 1);
|
||||
}
|
||||
|
||||
if (mode & TRANS_COR_RELEASE && !(mode & TRANS_COR_NO_RELEASE)) {
|
||||
if (str->len) {
|
||||
smart_str_appendl(str, ", ", sizeof(", ") - 1);
|
||||
}
|
||||
smart_str_appendl(str, "RELEASE", sizeof("RELEASE") - 1);
|
||||
} else if (mode & TRANS_COR_NO_RELEASE && !(mode & TRANS_COR_RELEASE)) {
|
||||
if (str->len) {
|
||||
smart_str_appendl(str, ", ", sizeof(", ") - 1);
|
||||
}
|
||||
smart_str_appendl(str, "NO RELEASE", sizeof("NO RELEASE") - 1);
|
||||
}
|
||||
smart_str_0(str);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
/* {{{ mysqlnd_conn_data::tx_commit_ex */
|
||||
static enum_func_status
|
||||
MYSQLND_METHOD(mysqlnd_conn_data, tx_commit_or_rollback)(MYSQLND_CONN_DATA * conn, const zend_bool commit, const unsigned int flags, const char * const name TSRMLS_DC)
|
||||
{
|
||||
size_t this_func = STRUCT_OFFSET(struct st_mysqlnd_conn_data_methods, tx_commit_or_rollback);
|
||||
enum_func_status ret = FAIL;
|
||||
DBG_ENTER("mysqlnd_conn_data::tx_rollback");
|
||||
DBG_ENTER("mysqlnd_conn_data::tx_commit_or_rollback");
|
||||
|
||||
if (PASS == conn->m->local_tx_start(conn, this_func TSRMLS_CC)) {
|
||||
ret = conn->m->query(conn, "ROLLBACK", sizeof("ROLLBACK") - 1 TSRMLS_CC);
|
||||
do {
|
||||
smart_str tmp_str = {0, 0, 0};
|
||||
conn->m->tx_cor_options_to_string(conn, &tmp_str, flags TSRMLS_CC);
|
||||
smart_str_0(&tmp_str);
|
||||
|
||||
{
|
||||
char * query;
|
||||
unsigned int query_len = mnd_sprintf(&query, 0, (commit? "COMMIT %s":"ROLLBACK %s"), tmp_str.c? tmp_str.c:"");
|
||||
smart_str_free(&tmp_str);
|
||||
|
||||
if (!query) {
|
||||
SET_OOM_ERROR(*conn->error_info);
|
||||
break;
|
||||
}
|
||||
ret = conn->m->query(conn, query, query_len TSRMLS_CC);
|
||||
mnd_sprintf_free(query);
|
||||
}
|
||||
} while (0);
|
||||
conn->m->local_tx_end(conn, this_func, ret TSRMLS_CC);
|
||||
}
|
||||
|
||||
@ -2649,6 +2698,66 @@ MYSQLND_METHOD(mysqlnd_conn_data, tx_rollback)(MYSQLND_CONN_DATA * conn TSRMLS_D
|
||||
/* }}} */
|
||||
|
||||
|
||||
/* {{{ mysqlnd_conn_data::tx_begin */
|
||||
static enum_func_status
|
||||
MYSQLND_METHOD(mysqlnd_conn_data, tx_begin)(MYSQLND_CONN_DATA * conn, const unsigned int mode, const char * const name TSRMLS_DC)
|
||||
{
|
||||
size_t this_func = STRUCT_OFFSET(struct st_mysqlnd_conn_data_methods, tx_begin);
|
||||
enum_func_status ret = FAIL;
|
||||
DBG_ENTER("mysqlnd_conn_data::tx_begin");
|
||||
|
||||
if (PASS == conn->m->local_tx_start(conn, this_func TSRMLS_CC)) {
|
||||
do {
|
||||
smart_str tmp_str = {0, 0, 0};
|
||||
if (mode & TRANS_START_WITH_CONSISTENT_SNAPSHOT) {
|
||||
if (tmp_str.len) {
|
||||
smart_str_appendl(&tmp_str, ", ", sizeof(", ") - 1);
|
||||
}
|
||||
smart_str_appendl(&tmp_str, "WITH CONSISTENT SNAPSHOT", sizeof("WITH CONSISTENT SNAPSHOT") - 1);
|
||||
}
|
||||
if (mode & TRANS_START_READ_WRITE) {
|
||||
if (tmp_str.len) {
|
||||
smart_str_appendl(&tmp_str, ", ", sizeof(", ") - 1);
|
||||
}
|
||||
smart_str_appendl(&tmp_str, "READ WRITE", sizeof("READ WRITE") - 1);
|
||||
}
|
||||
if (mode & TRANS_START_READ_ONLY) {
|
||||
if (tmp_str.len) {
|
||||
smart_str_appendl(&tmp_str, ", ", sizeof(", ") - 1);
|
||||
}
|
||||
smart_str_appendl(&tmp_str, "READ ONLY", sizeof("READ ONLY") - 1);
|
||||
}
|
||||
smart_str_0(&tmp_str);
|
||||
|
||||
{
|
||||
char * commented_name = NULL;
|
||||
unsigned int commented_name_len = name? mnd_sprintf(&commented_name, 0, " /*%s*/", name):0;
|
||||
char * query;
|
||||
unsigned int query_len = mnd_sprintf(&query, 0, "START TRANSACTION%s %s", commented_name? commented_name:"", tmp_str.c? tmp_str.c:"");
|
||||
smart_str_free(&tmp_str);
|
||||
|
||||
if (!query) {
|
||||
SET_OOM_ERROR(*conn->error_info);
|
||||
break;
|
||||
}
|
||||
ret = conn->m->query(conn, query, query_len TSRMLS_CC);
|
||||
mnd_sprintf_free(query);
|
||||
if (commented_name) {
|
||||
mnd_sprintf_free(commented_name);
|
||||
}
|
||||
}
|
||||
} while (0);
|
||||
conn->m->local_tx_end(conn, this_func, ret TSRMLS_CC);
|
||||
}
|
||||
|
||||
DBG_RETURN(ret);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
typedef enum_func_status (*func_mysqlnd_conn_data__)(MYSQLND_CONN_DATA * conn, const unsigned int flags, const char * const name TSRMLS_DC);
|
||||
|
||||
|
||||
/* {{{ mysqlnd_conn_data::local_tx_start */
|
||||
static enum_func_status
|
||||
MYSQLND_METHOD(mysqlnd_conn_data, local_tx_start)(MYSQLND_CONN_DATA * conn, size_t this_func TSRMLS_DC)
|
||||
@ -2763,6 +2872,10 @@ MYSQLND_CLASS_METHODS_START(mysqlnd_conn_data)
|
||||
MYSQLND_METHOD(mysqlnd_conn_data, set_autocommit),
|
||||
MYSQLND_METHOD(mysqlnd_conn_data, tx_commit),
|
||||
MYSQLND_METHOD(mysqlnd_conn_data, tx_rollback),
|
||||
MYSQLND_METHOD(mysqlnd_conn_data, tx_begin),
|
||||
MYSQLND_METHOD(mysqlnd_conn_data, tx_commit_or_rollback),
|
||||
MYSQLND_METHOD(mysqlnd_conn_data, tx_cor_options_to_string),
|
||||
|
||||
MYSQLND_METHOD(mysqlnd_conn_data, local_tx_start),
|
||||
MYSQLND_METHOD(mysqlnd_conn_data, local_tx_end),
|
||||
MYSQLND_METHOD(mysqlnd_conn_data, execute_init_commands),
|
||||
|
@ -108,6 +108,18 @@
|
||||
|
||||
#define MYSQLND_NET_FLAG_USE_COMPRESSION 1
|
||||
|
||||
|
||||
#define TRANS_START_NO_OPT 0
|
||||
#define TRANS_START_WITH_CONSISTENT_SNAPSHOT 1
|
||||
#define TRANS_START_READ_WRITE 2
|
||||
#define TRANS_START_READ_ONLY 4
|
||||
|
||||
#define TRANS_COR_NO_OPT 0
|
||||
#define TRANS_COR_AND_CHAIN 1
|
||||
#define TRANS_COR_AND_NO_CHAIN 2
|
||||
#define TRANS_COR_RELEASE 4
|
||||
#define TRANS_COR_NO_RELEASE 8
|
||||
|
||||
typedef enum mysqlnd_extension
|
||||
{
|
||||
MYSQLND_MYSQL = 0,
|
||||
|
@ -23,6 +23,8 @@
|
||||
#ifndef MYSQLND_STRUCTS_H
|
||||
#define MYSQLND_STRUCTS_H
|
||||
|
||||
#include "ext/standard/php_smart_str.h"
|
||||
|
||||
#define MYSQLND_TYPEDEFED_METHODS
|
||||
|
||||
#define MYSQLND_CLASS_METHOD_TABLE_NAME(class) mysqlnd_##class##_methods
|
||||
@ -31,6 +33,7 @@
|
||||
#define MYSQLND_CLASS_METHODS_START(class) MYSQLND_CLASS_METHOD_TABLE_NAME_FORWARD(class) = {
|
||||
#define MYSQLND_CLASS_METHODS_END }
|
||||
|
||||
|
||||
typedef struct st_mysqlnd_memory_pool MYSQLND_MEMORY_POOL;
|
||||
typedef struct st_mysqlnd_memory_pool_chunk MYSQLND_MEMORY_POOL_CHUNK;
|
||||
typedef struct st_mysqlnd_memory_pool_chunk_llist MYSQLND_MEMORY_POOL_CHUNK_LLIST;
|
||||
@ -480,6 +483,9 @@ typedef MYSQLND_RES * (*func_mysqlnd_conn_data__result_init)(unsigned int fiel
|
||||
typedef enum_func_status (*func_mysqlnd_conn_data__set_autocommit)(MYSQLND_CONN_DATA * conn, unsigned int mode TSRMLS_DC);
|
||||
typedef enum_func_status (*func_mysqlnd_conn_data__tx_commit)(MYSQLND_CONN_DATA * conn TSRMLS_DC);
|
||||
typedef enum_func_status (*func_mysqlnd_conn_data__tx_rollback)(MYSQLND_CONN_DATA * conn TSRMLS_DC);
|
||||
typedef enum_func_status (*func_mysqlnd_conn_data__tx_begin)(MYSQLND_CONN_DATA * conn, const unsigned int mode, const char * const name TSRMLS_DC);
|
||||
typedef enum_func_status (*func_mysqlnd_conn_data__tx_commit_or_rollback)(MYSQLND_CONN_DATA * conn, const zend_bool commit, const unsigned int flags, const char * const name TSRMLS_DC);
|
||||
typedef void (*func_mysqlnd_conn_data__tx_cor_options_to_string)(const MYSQLND_CONN_DATA * const conn, smart_str * tmp_str, const unsigned int mode TSRMLS_DC);
|
||||
|
||||
typedef enum_func_status (*func_mysqlnd_conn_data__local_tx_start)(MYSQLND_CONN_DATA * conn, size_t this_func TSRMLS_DC);
|
||||
typedef enum_func_status (*func_mysqlnd_conn_data__local_tx_end)(MYSQLND_CONN_DATA * conn, size_t this_func, enum_func_status status TSRMLS_DC);
|
||||
@ -566,6 +572,9 @@ struct st_mysqlnd_conn_data_methods
|
||||
func_mysqlnd_conn_data__set_autocommit set_autocommit;
|
||||
func_mysqlnd_conn_data__tx_commit tx_commit;
|
||||
func_mysqlnd_conn_data__tx_rollback tx_rollback;
|
||||
func_mysqlnd_conn_data__tx_begin tx_begin;
|
||||
func_mysqlnd_conn_data__tx_commit_or_rollback tx_commit_or_rollback;
|
||||
func_mysqlnd_conn_data__tx_cor_options_to_string tx_cor_options_to_string;
|
||||
|
||||
func_mysqlnd_conn_data__local_tx_start local_tx_start;
|
||||
func_mysqlnd_conn_data__local_tx_end local_tx_end;
|
||||
|
Loading…
Reference in New Issue
Block a user