Browse Source

mysqli_savepoint()/mysqli_release_savepoint()

pull/281/head
Andrey Hristov 13 years ago
parent
commit
43ecd8fe1b
  1. 4
      ext/mysqli/mysqli_api.c
  2. 22
      ext/mysqli/mysqli_fe.c
  3. 2
      ext/mysqli/mysqli_fe.h
  4. 71
      ext/mysqli/mysqli_nonapi.c
  5. 2
      ext/mysqli/tests/mysqli_class_mysqli_interface.phpt

4
ext/mysqli/mysqli_api.c

@ -714,7 +714,7 @@ PHP_FUNCTION(mysqli_commit)
#if !defined(MYSQLI_USE_MYSQLND)
if (mysqli_commit_or_rollback_libmysql(mysql->mysql, TRUE, flags, name)) {
#else
if (mysqlnd_commit(mysql->mysql, flags, name)) {
if (FAIL == mysqlnd_commit(mysql->mysql, flags, name)) {
#endif
RETURN_FALSE;
}
@ -1960,7 +1960,7 @@ PHP_FUNCTION(mysqli_rollback)
#if !defined(MYSQLI_USE_MYSQLND)
if (mysqli_commit_or_rollback_libmysql(mysql->mysql, FALSE, flags, name)) {
#else
if (mysqlnd_rollback(mysql->mysql, flags, name)) {
if (FAIL == mysqlnd_rollback(mysql->mysql, flags, name)) {
#endif
RETURN_FALSE;
}

22
ext/mysqli/mysqli_fe.c

@ -97,6 +97,24 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_mysqli_begin_transaction, 0, 0, 0)
ZEND_ARG_INFO(0, name)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_mysqli_savepoint, 0, 0, 2)
MYSQLI_ZEND_ARG_OBJ_INFO_LINK()
ZEND_ARG_INFO(0, name)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_mysqli_savepoint, 0, 0, 1)
ZEND_ARG_INFO(0, name)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_mysqli_release_savepoint, 0, 0, 2)
MYSQLI_ZEND_ARG_OBJ_INFO_LINK()
ZEND_ARG_INFO(0, name)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_mysqli_release_savepoint, 0, 0, 1)
ZEND_ARG_INFO(0, name)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_mysqli_commit, 0, 0, 1)
MYSQLI_ZEND_ARG_OBJ_INFO_LINK()
ZEND_ARG_INFO(0, flags)
@ -430,7 +448,9 @@ const zend_function_entry mysqli_functions[] = {
#if defined(MYSQLI_USE_MYSQLND)
PHP_FE(mysqli_reap_async_query, arginfo_mysqli_only_link)
#endif
PHP_FE(mysqli_release_savepoint, arginfo_mysqli_release_savepoint)
PHP_FE(mysqli_rollback, arginfo_mysqli_rollback)
PHP_FE(mysqli_savepoint, arginfo_mysqli_savepoint)
PHP_FE(mysqli_select_db, arginfo_mysqli_select_db)
#ifdef HAVE_MYSQLI_SET_CHARSET
PHP_FE(mysqli_set_charset, arginfo_mysqli_set_charset)
@ -528,7 +548,9 @@ const zend_function_entry mysqli_link_methods[] = {
#endif
PHP_FALIAS(escape_string, mysqli_real_escape_string, arginfo_class_mysqli_real_escape_string)
PHP_FALIAS(real_query, mysqli_real_query, arginfo_class_mysqli_query)
PHP_FALIAS(release_savepoint, mysqli_release_savepoint, arginfo_class_mysqli_release_savepoint)
PHP_FALIAS(rollback, mysqli_rollback, arginfo_class_mysqli_rollback)
PHP_FALIAS(savepoint, mysqli_savepoint, arginfo_class_mysqli_savepoint)
PHP_FALIAS(select_db,mysqli_select_db, arginfo_class_mysqli_select_db)
#ifdef HAVE_MYSQLI_SET_CHARSET
PHP_FALIAS(set_charset, mysqli_set_charset, arginfo_class_mysqli_set_charset)

2
ext/mysqli/mysqli_fe.h

@ -108,6 +108,8 @@ PHP_FUNCTION(mysqli_sqlstate);
PHP_FUNCTION(mysqli_ssl_set);
PHP_FUNCTION(mysqli_stat);
PHP_FUNCTION(mysqli_refresh);
PHP_FUNCTION(mysqli_savepoint);
PHP_FUNCTION(mysqli_release_savepoint);
PHP_FUNCTION(mysqli_stmt_affected_rows);
PHP_FUNCTION(mysqli_stmt_close);
PHP_FUNCTION(mysqli_stmt_data_seek);

71
ext/mysqli/mysqli_nonapi.c

@ -1112,7 +1112,7 @@ PHP_FUNCTION(mysqli_begin_transaction)
RETURN_FALSE;
}
#else
if (mysqlnd_begin_transaction(mysql->mysql, flags, name)) {
if (FAIL == mysqlnd_begin_transaction(mysql->mysql, flags, name)) {
RETURN_FALSE;
}
#endif
@ -1121,6 +1121,75 @@ PHP_FUNCTION(mysqli_begin_transaction)
/* }}} */
#if !defined(MYSQLI_USE_MYSQLND)
/* {{{ proto bool mysqli_savepoint_libmysql */
static int mysqli_savepoint_libmysql(MYSQL * conn, const char * const name, zend_bool release)
{
int ret;
char * query;
unsigned int query_len = spprintf(&query, 0, release? "RELEASE SAVEPOINT `%s`":"SAVEPOINT `%s`", name);
ret = mysql_real_query(conn, query, query_len);
efree(query);
return ret;
}
/* }}} */
#endif
/* {{{ proto bool mysqli_savepoint(object link, string name)
Starts a transaction */
PHP_FUNCTION(mysqli_savepoint)
{
MY_MYSQL *mysql;
zval *mysql_link;
char * name = NULL;
int name_len = 0;
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &mysql_link, mysqli_link_class_entry, &name, &name_len) == FAILURE) {
return;
}
MYSQLI_FETCH_RESOURCE_CONN(mysql, &mysql_link, MYSQLI_STATUS_VALID);
#if !defined(MYSQLI_USE_MYSQLND)
if (mysqli_savepoint_libmysql(mysql->mysql, name, FALSE)) {
#else
if (FAIL == mysqlnd_savepoint(mysql->mysql, name)) {
#endif
RETURN_FALSE;
}
RETURN_TRUE;
}
/* }}} */
/* {{{ proto bool mysqli_release_savepoint(object link, string name)
Starts a transaction */
PHP_FUNCTION(mysqli_release_savepoint)
{
MY_MYSQL *mysql;
zval *mysql_link;
char * name = NULL;
int name_len = 0;
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &mysql_link, mysqli_link_class_entry, &name, &name_len) == FAILURE) {
return;
}
MYSQLI_FETCH_RESOURCE_CONN(mysql, &mysql_link, MYSQLI_STATUS_VALID);
if (!name || !name_len) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Savepoint name not provided");
}
#if !defined(MYSQLI_USE_MYSQLND)
if (mysqli_savepoint_libmysql(mysql->mysql, name, TRUE)) {
#else
if (FAIL == mysqlnd_savepoint(mysql->mysql, name)) {
#endif
RETURN_FALSE;
}
RETURN_TRUE;
}
/* }}} */
/*
* Local variables:
* tab-width: 4

2
ext/mysqli/tests/mysqli_class_mysqli_interface.phpt

@ -47,6 +47,8 @@ require_once('skipifconnectfailure.inc');
'real_query' => true,
'refresh' => true,
'rollback' => true,
'release_savepoint' => true,
'savepoint' => true,
'select_db' => true,
'set_charset' => true,
'set_opt' => true,

Loading…
Cancel
Save