mirror of
https://github.com/php/php-src.git
synced 2025-08-16 05:58:45 +02:00
Fix problem with mysqli_commt()/mysqli_rollback()
This commit is contained in:
parent
c4145619be
commit
d63ed101ee
4 changed files with 142 additions and 39 deletions
|
@ -643,24 +643,24 @@ static void mysqli_tx_cor_options_to_string(const MYSQL * const conn, smart_str
|
|||
{
|
||||
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, " ", 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, " ", 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, " ", 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, " ", sizeof(" ") - 1);
|
||||
}
|
||||
smart_str_appendl(str, "NO RELEASE", sizeof("NO RELEASE") - 1);
|
||||
}
|
||||
|
@ -669,6 +669,7 @@ static void mysqli_tx_cor_options_to_string(const MYSQL * const conn, smart_str
|
|||
/* }}} */
|
||||
|
||||
|
||||
|
||||
/* {{{ proto bool mysqli_commit_or_rollback_libmysql */
|
||||
static int mysqli_commit_or_rollback_libmysql(MYSQL * conn, zend_bool commit, const unsigned int mode, const char * const name)
|
||||
{
|
||||
|
@ -678,25 +679,60 @@ static int mysqli_commit_or_rollback_libmysql(MYSQL * conn, zend_bool commit, co
|
|||
smart_str_0(&tmp_str);
|
||||
|
||||
{
|
||||
char * commented_name = NULL;
|
||||
unsigned int commented_name_len = name? spprintf(&commented_name, 0, " /*%s*/", name):0;
|
||||
char * query;
|
||||
unsigned int query_len = spprintf(&query, 0, (commit? "COMMIT%s %s":"ROLLBACK%s %s"),
|
||||
commented_name? commented_name:"", tmp_str.c? tmp_str.c:"");
|
||||
char * name_esc = NULL;
|
||||
size_t query_len;
|
||||
|
||||
if (name) {
|
||||
const char * p_orig = name;
|
||||
char * p_copy;
|
||||
p_copy = name_esc = emalloc(strlen(name) + 1 + 2 + 2 + 1); /* space, open, close, NullS */
|
||||
*p_copy++ = ' ';
|
||||
*p_copy++ = '/';
|
||||
*p_copy++ = '*';
|
||||
while (1) {
|
||||
register char v = *p_orig;
|
||||
if (v == 0) {
|
||||
break;
|
||||
}
|
||||
if ((v >= '0' && v <= '9') ||
|
||||
(v >= 'a' && v <= 'z') ||
|
||||
(v >= 'A' && v <= 'Z') ||
|
||||
v == '-' ||
|
||||
v == '_' ||
|
||||
v == ' ' ||
|
||||
v == '=')
|
||||
{
|
||||
*p_copy = v;
|
||||
} else {
|
||||
*p_copy = '?';
|
||||
}
|
||||
++p_orig;
|
||||
++p_copy;
|
||||
}
|
||||
*p_copy++ = '*';
|
||||
*p_copy++ = '/';
|
||||
*p_copy++ = 0;
|
||||
}
|
||||
|
||||
query_len = spprintf(&query, 0, (commit? "COMMIT%s %s":"ROLLBACK%s %s"),
|
||||
name_esc? name_esc:"", tmp_str.c? tmp_str.c:"");
|
||||
smart_str_free(&tmp_str);
|
||||
if (name_esc) {
|
||||
efree(name_esc);
|
||||
name_esc = NULL;
|
||||
}
|
||||
|
||||
ret = mysql_real_query(conn, query, query_len);
|
||||
efree(query);
|
||||
if (commented_name) {
|
||||
efree(commented_name);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
/* }}} */
|
||||
#endif
|
||||
|
||||
|
||||
/* {{{ proto bool mysqli_commit(object link)
|
||||
/* {{{ proto bool mysqli_commit(object link[, int flags [, string name ]])
|
||||
Commit outstanding actions and close transaction */
|
||||
PHP_FUNCTION(mysqli_commit)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue