|
|
|
@ -34,6 +34,99 @@ |
|
|
|
#include "php_mysqli_structs.h" |
|
|
|
#include "mysqli_priv.h" |
|
|
|
|
|
|
|
|
|
|
|
#if !defined(MYSQLI_USE_MYSQLND) |
|
|
|
/* {{{ mysqli_tx_cor_options_to_string */ |
|
|
|
static void mysqli_tx_cor_options_to_string(const MYSQL * const conn, smart_str * str, const unsigned int mode) |
|
|
|
{ |
|
|
|
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); |
|
|
|
} |
|
|
|
/* }}} */ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* {{{ 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) |
|
|
|
{ |
|
|
|
int ret; |
|
|
|
smart_str tmp_str = {0, 0, 0}; |
|
|
|
mysqli_tx_cor_options_to_string(conn, &tmp_str, mode); |
|
|
|
smart_str_0(&tmp_str); |
|
|
|
|
|
|
|
{ |
|
|
|
char * query; |
|
|
|
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; |
|
|
|
} |
|
|
|
++p_orig; |
|
|
|
} |
|
|
|
*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); |
|
|
|
} |
|
|
|
return ret; |
|
|
|
} |
|
|
|
/* }}} */ |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
/* {{{ proto mixed mysqli_affected_rows(object link) |
|
|
|
Get number of affected rows in previous MySQL operation */ |
|
|
|
PHP_FUNCTION(mysqli_affected_rows) |
|
|
|
@ -637,99 +730,6 @@ PHP_FUNCTION(mysqli_close) |
|
|
|
/* }}} */ |
|
|
|
|
|
|
|
|
|
|
|
#if !defined(MYSQLI_USE_MYSQLND) |
|
|
|
/* {{{ mysqli_tx_cor_options_to_string */ |
|
|
|
static void mysqli_tx_cor_options_to_string(const MYSQL * const conn, smart_str * str, const unsigned int mode) |
|
|
|
{ |
|
|
|
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); |
|
|
|
} |
|
|
|
/* }}} */ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* {{{ 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) |
|
|
|
{ |
|
|
|
int ret; |
|
|
|
smart_str tmp_str = {0, 0, 0}; |
|
|
|
mysqli_tx_cor_options_to_string(conn, &tmp_str, mode); |
|
|
|
smart_str_0(&tmp_str); |
|
|
|
|
|
|
|
{ |
|
|
|
char * query; |
|
|
|
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); |
|
|
|
} |
|
|
|
return ret; |
|
|
|
} |
|
|
|
/* }}} */ |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
/* {{{ proto bool mysqli_commit(object link[, int flags [, string name ]]) |
|
|
|
|