diff options
Diffstat (limited to 'ext/pdo_mysql')
26 files changed, 733 insertions, 499 deletions
diff --git a/ext/pdo_mysql/config.m4 b/ext/pdo_mysql/config.m4 index f237f413be..c165fb6b51 100755 --- a/ext/pdo_mysql/config.m4 +++ b/ext/pdo_mysql/config.m4 @@ -13,6 +13,18 @@ if test -z "$PHP_ZLIB_DIR"; then fi if test "$PHP_PDO_MYSQL" != "no"; then + dnl This depends on ext/mysqli/config.m4 providing the + dnl PHP_MYSQL_SOCKET_SEARCH macro and --with-mysql-sock configure option. + AC_MSG_CHECKING([for MySQL UNIX socket location]) + if test "$PHP_MYSQL_SOCK" != "no" && test "$PHP_MYSQL_SOCK" != "yes"; then + MYSQL_SOCK=$PHP_MYSQL_SOCK + AC_DEFINE_UNQUOTED(PHP_MYSQL_UNIX_SOCK_ADDR, "$MYSQL_SOCK", [ ]) + AC_MSG_RESULT([$MYSQL_SOCK]) + elif test "$PHP_MYSQL_SOCK" = "yes"; then + PHP_MYSQL_SOCKET_SEARCH + else + AC_MSG_RESULT([no]) + fi if test "$PHP_PDO" = "no" && test "$ext_shared" = "no"; then AC_MSG_ERROR([PDO is not enabled! Add --enable-pdo to your configure line.]) @@ -130,8 +142,8 @@ if test "$PHP_PDO_MYSQL" != "no"; then pdo_cv_inc_path=$abs_srcdir/ext elif test -f $abs_srcdir/ext/pdo/php_pdo_driver.h; then pdo_cv_inc_path=$abs_srcdir/ext - elif test -f $prefix/include/php/ext/pdo/php_pdo_driver.h; then - pdo_cv_inc_path=$prefix/include/php/ext + elif test -f $phpincludedir/ext/pdo/php_pdo_driver.h; then + pdo_cv_inc_path=$phpincludedir/ext else AC_MSG_ERROR([Cannot find php_pdo_driver.h.]) fi @@ -144,7 +156,7 @@ if test "$PHP_PDO_MYSQL" != "no"; then fi dnl fix after renaming to pdo_mysql - PHP_NEW_EXTENSION(pdo_mysql, pdo_mysql.c mysql_driver.c mysql_statement.c, $ext_shared,,-I$pdo_cv_inc_path -I) + PHP_NEW_EXTENSION(pdo_mysql, pdo_mysql.c mysql_driver.c mysql_statement.c, $ext_shared,,-I$pdo_cv_inc_path -I -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1) ifdef([PHP_ADD_EXTENSION_DEP], [ PHP_ADD_EXTENSION_DEP(pdo_mysql, pdo) diff --git a/ext/pdo_mysql/config.w32 b/ext/pdo_mysql/config.w32 index da085dc569..f150916b2a 100644 --- a/ext/pdo_mysql/config.w32 +++ b/ext/pdo_mysql/config.w32 @@ -12,7 +12,7 @@ if (PHP_PDO_MYSQL != "no") { } else { if (CHECK_LIB("libmysql.lib", "pdo_mysql", PHP_PDO_MYSQL) && CHECK_HEADER_ADD_INCLUDE("mysql.h", "CFLAGS_PDO_MYSQL", PHP_PHP_BUILD + "\\include\\mysql;" + PHP_PDO_MYSQL)) { - EXTENSION("pdo_mysql", "pdo_mysql.c mysql_driver.c mysql_statement.c"); + EXTENSION("pdo_mysql", "pdo_mysql.c mysql_driver.c mysql_statement.c", null, "/DZEND_ENABLE_STATIC_TSRMLS_CACHE=1"); } else { WARNING("pdo_mysql not enabled; libraries and headers not found"); } diff --git a/ext/pdo_mysql/mysql_driver.c b/ext/pdo_mysql/mysql_driver.c index e82fdf46db..f09bc05314 100644 --- a/ext/pdo_mysql/mysql_driver.c +++ b/ext/pdo_mysql/mysql_driver.c @@ -1,6 +1,6 @@ /* +----------------------------------------------------------------------+ - | PHP Version 5 | + | PHP Version 7 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2016 The PHP Group | +----------------------------------------------------------------------+ @@ -43,10 +43,10 @@ #endif /* {{{ _pdo_mysql_error */ -int _pdo_mysql_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, const char *file, int line TSRMLS_DC) +int _pdo_mysql_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, const char *file, int line) { pdo_mysql_db_handle *H = (pdo_mysql_db_handle *)dbh->driver_data; - pdo_error_type *pdo_err; + pdo_error_type *pdo_err; pdo_mysql_error_info *einfo; pdo_mysql_stmt *S = NULL; @@ -105,7 +105,7 @@ int _pdo_mysql_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, const char *file, int lin if (!dbh->methods) { PDO_DBG_INF("Throwing exception"); - zend_throw_exception_ex(php_pdo_get_exception(), einfo->errcode TSRMLS_CC, "SQLSTATE[%s] [%d] %s", + zend_throw_exception_ex(php_pdo_get_exception(), einfo->errcode, "SQLSTATE[%s] [%d] %s", *pdo_err, einfo->errcode, einfo->errmsg); } @@ -114,7 +114,7 @@ int _pdo_mysql_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, const char *file, int lin /* }}} */ /* {{{ pdo_mysql_fetch_error_func */ -static int pdo_mysql_fetch_error_func(pdo_dbh_t *dbh, pdo_stmt_t *stmt, zval *info TSRMLS_DC) +static int pdo_mysql_fetch_error_func(pdo_dbh_t *dbh, pdo_stmt_t *stmt, zval *info) { pdo_mysql_db_handle *H = (pdo_mysql_db_handle *)dbh->driver_data; pdo_mysql_error_info *einfo = &H->einfo; @@ -130,7 +130,7 @@ static int pdo_mysql_fetch_error_func(pdo_dbh_t *dbh, pdo_stmt_t *stmt, zval *in if (einfo->errcode) { add_next_index_long(info, einfo->errcode); - add_next_index_string(info, einfo->errmsg, 1); + add_next_index_string(info, einfo->errmsg); } PDO_DBG_RETURN(1); @@ -138,20 +138,18 @@ static int pdo_mysql_fetch_error_func(pdo_dbh_t *dbh, pdo_stmt_t *stmt, zval *in /* }}} */ /* {{{ mysql_handle_closer */ -static int mysql_handle_closer(pdo_dbh_t *dbh TSRMLS_DC) +static int mysql_handle_closer(pdo_dbh_t *dbh) { pdo_mysql_db_handle *H = (pdo_mysql_db_handle *)dbh->driver_data; - + PDO_DBG_ENTER("mysql_handle_closer"); PDO_DBG_INF_FMT("dbh=%p", dbh); if (H) { if (H->server) { mysql_close(H->server); - H->server = NULL; } if (H->einfo.errmsg) { pefree(H->einfo.errmsg, dbh->is_persistent); - H->einfo.errmsg = NULL; } pefree(H, dbh->is_persistent); dbh->driver_data = NULL; @@ -161,18 +159,18 @@ static int mysql_handle_closer(pdo_dbh_t *dbh TSRMLS_DC) /* }}} */ /* {{{ mysql_handle_preparer */ -static int mysql_handle_preparer(pdo_dbh_t *dbh, const char *sql, long sql_len, pdo_stmt_t *stmt, zval *driver_options TSRMLS_DC) +static int mysql_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_len, pdo_stmt_t *stmt, zval *driver_options) { pdo_mysql_db_handle *H = (pdo_mysql_db_handle *)dbh->driver_data; pdo_mysql_stmt *S = ecalloc(1, sizeof(pdo_mysql_stmt)); char *nsql = NULL; - int nsql_len = 0; + size_t nsql_len = 0; int ret; int server_version; - + PDO_DBG_ENTER("mysql_handle_preparer"); PDO_DBG_INF_FMT("dbh=%p", dbh); - PDO_DBG_INF_FMT("sql=%.*s", sql_len, sql); + PDO_DBG_INF_FMT("sql=%.*s", (int)sql_len, sql); S->H = H; stmt->driver_data = S; @@ -187,7 +185,7 @@ static int mysql_handle_preparer(pdo_dbh_t *dbh, const char *sql, long sql_len, goto fallback; } stmt->supports_placeholders = PDO_PLACEHOLDER_POSITIONAL; - ret = pdo_parse_params(stmt, (char*)sql, sql_len, &nsql, &nsql_len TSRMLS_CC); + ret = pdo_parse_params(stmt, (char*)sql, sql_len, &nsql, &nsql_len); if (ret == 1) { /* query was rewritten */ @@ -206,7 +204,7 @@ static int mysql_handle_preparer(pdo_dbh_t *dbh, const char *sql, long sql_len, } PDO_DBG_RETURN(0); } - + if (mysql_stmt_prepare(S->stmt, sql, sql_len)) { /* TODO: might need to pull statement specific info here? */ /* if the query isn't supported by the protocol, fallback to emulation */ @@ -235,30 +233,30 @@ static int mysql_handle_preparer(pdo_dbh_t *dbh, const char *sql, long sql_len, #else S->params = ecalloc(S->num_params, sizeof(MYSQL_BIND)); S->in_null = ecalloc(S->num_params, sizeof(my_bool)); - S->in_length = ecalloc(S->num_params, sizeof(unsigned long)); + S->in_length = ecalloc(S->num_params, sizeof(zend_ulong)); #endif } dbh->alloc_own_columns = 1; - S->max_length = pdo_attr_lval(driver_options, PDO_ATTR_MAX_COLUMN_LEN, 0 TSRMLS_CC); + S->max_length = pdo_attr_lval(driver_options, PDO_ATTR_MAX_COLUMN_LEN, 0); PDO_DBG_RETURN(1); fallback: end: stmt->supports_placeholders = PDO_PLACEHOLDER_NONE; - + PDO_DBG_RETURN(1); } /* }}} */ /* {{{ mysql_handle_doer */ -static long mysql_handle_doer(pdo_dbh_t *dbh, const char *sql, long sql_len TSRMLS_DC) +static zend_long mysql_handle_doer(pdo_dbh_t *dbh, const char *sql, size_t sql_len) { pdo_mysql_db_handle *H = (pdo_mysql_db_handle *)dbh->driver_data; PDO_DBG_ENTER("mysql_handle_doer"); PDO_DBG_INF_FMT("dbh=%p", dbh); - PDO_DBG_INF_FMT("sql=%.*s", sql_len, sql); + PDO_DBG_INF_FMT("sql=%.*s", (int)sql_len, sql); if (mysql_real_query(H->server, sql, sql_len)) { pdo_mysql_error(dbh); @@ -288,10 +286,10 @@ static long mysql_handle_doer(pdo_dbh_t *dbh, const char *sql, long sql_len TSRM /* }}} */ /* {{{ pdo_mysql_last_insert_id */ -static char *pdo_mysql_last_insert_id(pdo_dbh_t *dbh, const char *name, unsigned int *len TSRMLS_DC) +static char *pdo_mysql_last_insert_id(pdo_dbh_t *dbh, const char *name, size_t *len) { pdo_mysql_db_handle *H = (pdo_mysql_db_handle *)dbh->driver_data; - char *id = php_pdo_int64_to_str(mysql_insert_id(H->server) TSRMLS_CC); + char *id = php_pdo_int64_to_str(mysql_insert_id(H->server)); PDO_DBG_ENTER("pdo_mysql_last_insert_id"); *len = strlen(id); PDO_DBG_RETURN(id); @@ -299,58 +297,58 @@ static char *pdo_mysql_last_insert_id(pdo_dbh_t *dbh, const char *name, unsigned /* }}} */ /* {{{ mysql_handle_quoter */ -static int mysql_handle_quoter(pdo_dbh_t *dbh, const char *unquoted, int unquotedlen, char **quoted, int *quotedlen, enum pdo_param_type paramtype TSRMLS_DC) +static int mysql_handle_quoter(pdo_dbh_t *dbh, const char *unquoted, size_t unquotedlen, char **quoted, size_t *quotedlen, enum pdo_param_type paramtype ) { pdo_mysql_db_handle *H = (pdo_mysql_db_handle *)dbh->driver_data; PDO_DBG_ENTER("mysql_handle_quoter"); PDO_DBG_INF_FMT("dbh=%p", dbh); - PDO_DBG_INF_FMT("unquoted=%.*s", unquotedlen, unquoted); + PDO_DBG_INF_FMT("unquoted=%.*s", (int)unquotedlen, unquoted); *quoted = safe_emalloc(2, unquotedlen, 3); *quotedlen = mysql_real_escape_string(H->server, *quoted + 1, unquoted, unquotedlen); (*quoted)[0] =(*quoted)[++*quotedlen] = '\''; (*quoted)[++*quotedlen] = '\0'; - PDO_DBG_INF_FMT("quoted=%.*s", *quotedlen, *quoted); + PDO_DBG_INF_FMT("quoted=%.*s", (int)*quotedlen, *quoted); PDO_DBG_RETURN(1); } /* }}} */ /* {{{ mysql_handle_begin */ -static int mysql_handle_begin(pdo_dbh_t *dbh TSRMLS_DC) +static int mysql_handle_begin(pdo_dbh_t *dbh) { PDO_DBG_ENTER("mysql_handle_quoter"); PDO_DBG_INF_FMT("dbh=%p", dbh); - PDO_DBG_RETURN(0 <= mysql_handle_doer(dbh, ZEND_STRL("START TRANSACTION") TSRMLS_CC)); + PDO_DBG_RETURN(0 <= mysql_handle_doer(dbh, ZEND_STRL("START TRANSACTION"))); } /* }}} */ /* {{{ mysql_handle_commit */ -static int mysql_handle_commit(pdo_dbh_t *dbh TSRMLS_DC) +static int mysql_handle_commit(pdo_dbh_t *dbh) { PDO_DBG_ENTER("mysql_handle_commit"); PDO_DBG_INF_FMT("dbh=%p", dbh); #if MYSQL_VERSION_ID >= 40100 || defined(PDO_USE_MYSQLND) PDO_DBG_RETURN(0 <= mysql_commit(((pdo_mysql_db_handle *)dbh->driver_data)->server)); #else - PDO_DBG_RETURN(0 <= mysql_handle_doer(dbh, ZEND_STRL("COMMIT") TSRMLS_CC)); + PDO_DBG_RETURN(0 <= mysql_handle_doer(dbh, ZEND_STRL("COMMIT"))); #endif } /* }}} */ /* {{{ mysql_handle_rollback */ -static int mysql_handle_rollback(pdo_dbh_t *dbh TSRMLS_DC) +static int mysql_handle_rollback(pdo_dbh_t *dbh) { PDO_DBG_ENTER("mysql_handle_rollback"); PDO_DBG_INF_FMT("dbh=%p", dbh); #if MYSQL_VERSION_ID >= 40100 || defined(PDO_USE_MYSQLND) PDO_DBG_RETURN(0 <= mysql_rollback(((pdo_mysql_db_handle *)dbh->driver_data)->server)); #else - PDO_DBG_RETURN(0 <= mysql_handle_doer(dbh, ZEND_STRL("ROLLBACK") TSRMLS_CC)); + PDO_DBG_RETURN(0 <= mysql_handle_doer(dbh, ZEND_STRL("ROLLBACK"))); #endif } /* }}} */ /* {{{ mysql_handle_autocommit */ -static inline int mysql_handle_autocommit(pdo_dbh_t *dbh TSRMLS_DC) +static inline int mysql_handle_autocommit(pdo_dbh_t *dbh) { PDO_DBG_ENTER("mysql_handle_autocommit"); PDO_DBG_INF_FMT("dbh=%p", dbh); @@ -359,49 +357,51 @@ static inline int mysql_handle_autocommit(pdo_dbh_t *dbh TSRMLS_DC) PDO_DBG_RETURN(0 <= mysql_autocommit(((pdo_mysql_db_handle *)dbh->driver_data)->server, dbh->auto_commit)); #else if (dbh->auto_commit) { - PDO_DBG_RETURN(0 <= mysql_handle_doer(dbh, ZEND_STRL("SET AUTOCOMMIT=1") TSRMLS_CC)); + PDO_DBG_RETURN(0 <= mysql_handle_doer(dbh, ZEND_STRL("SET AUTOCOMMIT=1"))); } else { - PDO_DBG_RETURN(0 <= mysql_handle_doer(dbh, ZEND_STRL("SET AUTOCOMMIT=0") TSRMLS_CC)); + PDO_DBG_RETURN(0 <= mysql_handle_doer(dbh, ZEND_STRL("SET AUTOCOMMIT=0"))); } #endif } /* }}} */ /* {{{ pdo_mysql_set_attribute */ -static int pdo_mysql_set_attribute(pdo_dbh_t *dbh, long attr, zval *val TSRMLS_DC) +static int pdo_mysql_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *val) { + zend_long lval = zval_get_long(val); + zend_bool bval = lval? 1 : 0; PDO_DBG_ENTER("pdo_mysql_set_attribute"); PDO_DBG_INF_FMT("dbh=%p", dbh); PDO_DBG_INF_FMT("attr=%l", attr); switch (attr) { - case PDO_ATTR_AUTOCOMMIT: - convert_to_boolean(val); - - /* ignore if the new value equals the old one */ - if (dbh->auto_commit ^ Z_BVAL_P(val)) { - dbh->auto_commit = Z_BVAL_P(val); - mysql_handle_autocommit(dbh TSRMLS_CC); + case PDO_ATTR_AUTOCOMMIT: + /* ignore if the new value equals the old one */ + if (dbh->auto_commit ^ bval) { + dbh->auto_commit = bval; + mysql_handle_autocommit(dbh); } PDO_DBG_RETURN(1); case PDO_MYSQL_ATTR_USE_BUFFERED_QUERY: - ((pdo_mysql_db_handle *)dbh->driver_data)->buffered = Z_BVAL_P(val); + /* ignore if the new value equals the old one */ + ((pdo_mysql_db_handle *)dbh->driver_data)->buffered = bval; PDO_DBG_RETURN(1); case PDO_MYSQL_ATTR_DIRECT_QUERY: case PDO_ATTR_EMULATE_PREPARES: - ((pdo_mysql_db_handle *)dbh->driver_data)->emulate_prepare = Z_BVAL_P(val); + /* ignore if the new value equals the old one */ + ((pdo_mysql_db_handle *)dbh->driver_data)->emulate_prepare = bval; PDO_DBG_RETURN(1); case PDO_ATTR_FETCH_TABLE_NAMES: - ((pdo_mysql_db_handle *)dbh->driver_data)->fetch_table_names = Z_BVAL_P(val); + ((pdo_mysql_db_handle *)dbh->driver_data)->fetch_table_names = bval; PDO_DBG_RETURN(1); #ifndef PDO_USE_MYSQLND case PDO_MYSQL_ATTR_MAX_BUFFER_SIZE: - if (Z_LVAL_P(val) < 0) { + if (lval < 0) { /* TODO: Johannes, can we throw a warning here? */ ((pdo_mysql_db_handle *)dbh->driver_data)->max_buffer_size = 1024*1024; PDO_DBG_INF_FMT("Adjusting invalid buffer size to =%l", ((pdo_mysql_db_handle *)dbh->driver_data)->max_buffer_size); } else { - ((pdo_mysql_db_handle *)dbh->driver_data)->max_buffer_size = Z_LVAL_P(val); + ((pdo_mysql_db_handle *)dbh->driver_data)->max_buffer_size = lval; } PDO_DBG_RETURN(1); break; @@ -414,7 +414,7 @@ static int pdo_mysql_set_attribute(pdo_dbh_t *dbh, long attr, zval *val TSRMLS_D /* }}} */ /* {{{ pdo_mysql_get_attribute */ -static int pdo_mysql_get_attribute(pdo_dbh_t *dbh, long attr, zval *return_value TSRMLS_DC) +static int pdo_mysql_get_attribute(pdo_dbh_t *dbh, zend_long attr, zval *return_value) { pdo_mysql_db_handle *H = (pdo_mysql_db_handle *)dbh->driver_data; @@ -423,26 +423,26 @@ static int pdo_mysql_get_attribute(pdo_dbh_t *dbh, long attr, zval *return_value PDO_DBG_INF_FMT("attr=%l", attr); switch (attr) { case PDO_ATTR_CLIENT_VERSION: - ZVAL_STRING(return_value, (char *)mysql_get_client_info(), 1); + ZVAL_STRING(return_value, (char *)mysql_get_client_info()); break; case PDO_ATTR_SERVER_VERSION: - ZVAL_STRING(return_value, (char *)mysql_get_server_info(H->server), 1); + ZVAL_STRING(return_value, (char *)mysql_get_server_info(H->server)); break; case PDO_ATTR_CONNECTION_STATUS: - ZVAL_STRING(return_value, (char *)mysql_get_host_info(H->server), 1); + ZVAL_STRING(return_value, (char *)mysql_get_host_info(H->server)); break; case PDO_ATTR_SERVER_INFO: { - char *tmp; #if defined(PDO_USE_MYSQLND) - unsigned int tmp_len; + zend_string *tmp; - if (mysqlnd_stat(H->server, &tmp, &tmp_len) == PASS) { - ZVAL_STRINGL(return_value, tmp, tmp_len, 0); + if (mysqlnd_stat(H->server, &tmp) == PASS) { + ZVAL_STR(return_value, tmp); #else + char *tmp; if ((tmp = (char *)mysql_stat(H->server))) { - ZVAL_STRING(return_value, tmp, 1); + ZVAL_STRING(return_value, tmp); #endif } else { pdo_mysql_error(dbh); @@ -453,7 +453,7 @@ static int pdo_mysql_get_attribute(pdo_dbh_t *dbh, long attr, zval *return_value case PDO_ATTR_AUTOCOMMIT: ZVAL_LONG(return_value, dbh->auto_commit); break; - + case PDO_MYSQL_ATTR_USE_BUFFERED_QUERY: ZVAL_LONG(return_value, H->buffered); break; @@ -470,7 +470,7 @@ static int pdo_mysql_get_attribute(pdo_dbh_t *dbh, long attr, zval *return_value #endif default: - PDO_DBG_RETURN(0); + PDO_DBG_RETURN(0); } PDO_DBG_RETURN(1); @@ -478,7 +478,7 @@ static int pdo_mysql_get_attribute(pdo_dbh_t *dbh, long attr, zval *return_value /* }}} */ /* {{{ pdo_mysql_check_liveness */ -static int pdo_mysql_check_liveness(pdo_dbh_t *dbh TSRMLS_DC) +static int pdo_mysql_check_liveness(pdo_dbh_t *dbh) { pdo_mysql_db_handle *H = (pdo_mysql_db_handle *)dbh->driver_data; #if MYSQL_VERSION_ID <= 32230 @@ -507,7 +507,7 @@ static int pdo_mysql_check_liveness(pdo_dbh_t *dbh TSRMLS_DC) signal(SIGPIPE, handler); #endif /* end mysql_ping() */ PDO_DBG_RETURN(SUCCESS); -} +} /* }}} */ /* {{{ mysql_methods */ @@ -534,7 +534,7 @@ static struct pdo_dbh_methods mysql_methods = { #endif /* {{{ pdo_mysql_handle_factory */ -static int pdo_mysql_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_DC) +static int pdo_mysql_handle_factory(pdo_dbh_t *dbh, zval *driver_options) { pdo_mysql_db_handle *H; int i, ret = 0; @@ -554,14 +554,14 @@ static int pdo_mysql_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_ #endif ; #if defined(PDO_USE_MYSQLND) - int dbname_len = 0; - int password_len = 0; + size_t dbname_len = 0; + size_t password_len = 0; #endif #ifdef CLIENT_MULTI_STATEMENTS if (!driver_options) { connect_opts |= CLIENT_MULTI_STATEMENTS; - } else if (pdo_attr_lval(driver_options, PDO_MYSQL_ATTR_MULTI_STATEMENTS, 1 TSRMLS_CC)) { + } else if (pdo_attr_lval(driver_options, PDO_MYSQL_ATTR_MULTI_STATEMENTS, 1)) { connect_opts |= CLIENT_MULTI_STATEMENTS; } #endif @@ -586,7 +586,7 @@ static int pdo_mysql_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_ pdo_mysql_error(dbh); goto cleanup; } - + dbh->driver_data = H; #ifndef PDO_USE_MYSQLND @@ -597,30 +597,30 @@ static int pdo_mysql_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_ /* handle MySQL options */ if (driver_options) { - long connect_timeout = pdo_attr_lval(driver_options, PDO_ATTR_TIMEOUT, 30 TSRMLS_CC); - long local_infile = pdo_attr_lval(driver_options, PDO_MYSQL_ATTR_LOCAL_INFILE, 0 TSRMLS_CC); - char *init_cmd = NULL; + zend_long connect_timeout = pdo_attr_lval(driver_options, PDO_ATTR_TIMEOUT, 30); + zend_long local_infile = pdo_attr_lval(driver_options, PDO_MYSQL_ATTR_LOCAL_INFILE, 0); + zend_string *init_cmd = NULL; #ifndef PDO_USE_MYSQLND - char *default_file = NULL, *default_group = NULL; + zend_string *default_file = NULL, *default_group = NULL; #endif - long compress = 0; - char *ssl_key = NULL, *ssl_cert = NULL, *ssl_ca = NULL, *ssl_capath = NULL, *ssl_cipher = NULL; - H->buffered = pdo_attr_lval(driver_options, PDO_MYSQL_ATTR_USE_BUFFERED_QUERY, 1 TSRMLS_CC); + zend_long compress = 0; + zend_string *ssl_key = NULL, *ssl_cert = NULL, *ssl_ca = NULL, *ssl_capath = NULL, *ssl_cipher = NULL; + H->buffered = pdo_attr_lval(driver_options, PDO_MYSQL_ATTR_USE_BUFFERED_QUERY, 1); H->emulate_prepare = pdo_attr_lval(driver_options, - PDO_MYSQL_ATTR_DIRECT_QUERY, H->emulate_prepare TSRMLS_CC); - H->emulate_prepare = pdo_attr_lval(driver_options, - PDO_ATTR_EMULATE_PREPARES, H->emulate_prepare TSRMLS_CC); + PDO_MYSQL_ATTR_DIRECT_QUERY, H->emulate_prepare); + H->emulate_prepare = pdo_attr_lval(driver_options, + PDO_ATTR_EMULATE_PREPARES, H->emulate_prepare); #ifndef PDO_USE_MYSQLND - H->max_buffer_size = pdo_attr_lval(driver_options, PDO_MYSQL_ATTR_MAX_BUFFER_SIZE, H->max_buffer_size TSRMLS_CC); + H->max_buffer_size = pdo_attr_lval(driver_options, PDO_MYSQL_ATTR_MAX_BUFFER_SIZE, H->max_buffer_size); #endif - if (pdo_attr_lval(driver_options, PDO_MYSQL_ATTR_FOUND_ROWS, 0 TSRMLS_CC)) { + if (pdo_attr_lval(driver_options, PDO_MYSQL_ATTR_FOUND_ROWS, 0)) { connect_opts |= CLIENT_FOUND_ROWS; } - if (pdo_attr_lval(driver_options, PDO_MYSQL_ATTR_IGNORE_SPACE, 0 TSRMLS_CC)) { + if (pdo_attr_lval(driver_options, PDO_MYSQL_ATTR_IGNORE_SPACE, 0)) { connect_opts |= CLIENT_IGNORE_SPACE; } @@ -633,7 +633,7 @@ static int pdo_mysql_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_ #if PHP_API_VERSION < 20100412 if ((PG(open_basedir) && PG(open_basedir)[0] != '\0') || PG(safe_mode)) #else - if (PG(open_basedir) && PG(open_basedir)[0] != '\0') + if (PG(open_basedir) && PG(open_basedir)[0] != '\0') #endif { local_infile = 0; @@ -651,41 +651,41 @@ static int pdo_mysql_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_ * mysqlnd doesn't support reconnect, thus we don't have "|| defined(PDO_USE_MYSQLND)" */ { - long reconnect = 1; + zend_long reconnect = 1; mysql_options(H->server, MYSQL_OPT_RECONNECT, (const char*)&reconnect); } #endif - init_cmd = pdo_attr_strval(driver_options, PDO_MYSQL_ATTR_INIT_COMMAND, NULL TSRMLS_CC); + init_cmd = pdo_attr_strval(driver_options, PDO_MYSQL_ATTR_INIT_COMMAND, NULL); if (init_cmd) { - if (mysql_options(H->server, MYSQL_INIT_COMMAND, (const char *)init_cmd)) { - str_efree(init_cmd); + if (mysql_options(H->server, MYSQL_INIT_COMMAND, (const char *)ZSTR_VAL(init_cmd))) { + zend_string_release(init_cmd); pdo_mysql_error(dbh); goto cleanup; } - str_efree(init_cmd); + zend_string_release(init_cmd); } -#ifndef PDO_USE_MYSQLND - default_file = pdo_attr_strval(driver_options, PDO_MYSQL_ATTR_READ_DEFAULT_FILE, NULL TSRMLS_CC); +#ifndef PDO_USE_MYSQLND + default_file = pdo_attr_strval(driver_options, PDO_MYSQL_ATTR_READ_DEFAULT_FILE, NULL); if (default_file) { - if (mysql_options(H->server, MYSQL_READ_DEFAULT_FILE, (const char *)default_file)) { - str_efree(default_file); + if (mysql_options(H->server, MYSQL_READ_DEFAULT_FILE, (const char *)ZSTR_VAL(default_file))) { + zend_string_release(default_file); pdo_mysql_error(dbh); goto cleanup; } - str_efree(default_file); + zend_string_release(default_file); } - - default_group= pdo_attr_strval(driver_options, PDO_MYSQL_ATTR_READ_DEFAULT_GROUP, NULL TSRMLS_CC); + + default_group = pdo_attr_strval(driver_options, PDO_MYSQL_ATTR_READ_DEFAULT_GROUP, NULL); if (default_group) { - if (mysql_options(H->server, MYSQL_READ_DEFAULT_GROUP, (const char *)default_group)) { - str_efree(default_group); + if (mysql_options(H->server, MYSQL_READ_DEFAULT_GROUP, (const char *)ZSTR_VAL(default_group))) { + zend_string_release(default_group); pdo_mysql_error(dbh); goto cleanup; } - str_efree(default_group); + zend_string_release(default_group); } #endif - compress = pdo_attr_lval(driver_options, PDO_MYSQL_ATTR_COMPRESS, 0 TSRMLS_CC); + compress = pdo_attr_lval(driver_options, PDO_MYSQL_ATTR_COMPRESS, 0); if (compress) { if (mysql_options(H->server, MYSQL_OPT_COMPRESS, 0)) { pdo_mysql_error(dbh); @@ -693,41 +693,46 @@ static int pdo_mysql_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_ } } - ssl_key = pdo_attr_strval(driver_options, PDO_MYSQL_ATTR_SSL_KEY, NULL TSRMLS_CC); - ssl_cert = pdo_attr_strval(driver_options, PDO_MYSQL_ATTR_SSL_CERT, NULL TSRMLS_CC); - ssl_ca = pdo_attr_strval(driver_options, PDO_MYSQL_ATTR_SSL_CA, NULL TSRMLS_CC); - ssl_capath = pdo_attr_strval(driver_options, PDO_MYSQL_ATTR_SSL_CAPATH, NULL TSRMLS_CC); - ssl_cipher = pdo_attr_strval(driver_options, PDO_MYSQL_ATTR_SSL_CIPHER, NULL TSRMLS_CC); - + ssl_key = pdo_attr_strval(driver_options, PDO_MYSQL_ATTR_SSL_KEY, NULL); + ssl_cert = pdo_attr_strval(driver_options, PDO_MYSQL_ATTR_SSL_CERT, NULL); + ssl_ca = pdo_attr_strval(driver_options, PDO_MYSQL_ATTR_SSL_CA, NULL); + ssl_capath = pdo_attr_strval(driver_options, PDO_MYSQL_ATTR_SSL_CAPATH, NULL); + ssl_cipher = pdo_attr_strval(driver_options, PDO_MYSQL_ATTR_SSL_CIPHER, NULL); + if (ssl_key || ssl_cert || ssl_ca || ssl_capath || ssl_cipher) { - mysql_ssl_set(H->server, ssl_key, ssl_cert, ssl_ca, ssl_capath, ssl_cipher); + mysql_ssl_set(H->server, + ssl_key? ZSTR_VAL(ssl_key) : NULL, + ssl_cert? ZSTR_VAL(ssl_cert) : NULL, + ssl_ca? ZSTR_VAL(ssl_ca) : NULL, + ssl_capath? ZSTR_VAL(ssl_capath) : NULL, + ssl_cipher? ZSTR_VAL(ssl_cipher) : NULL); if (ssl_key) { - str_efree(ssl_key); + zend_string_release(ssl_key); } if (ssl_cert) { - str_efree(ssl_cert); + zend_string_release(ssl_cert); } if (ssl_ca) { - str_efree(ssl_ca); + zend_string_release(ssl_ca); } if (ssl_capath) { - str_efree(ssl_capath); + zend_string_release(ssl_capath); } if (ssl_cipher) { - str_efree(ssl_cipher); + zend_string_release(ssl_cipher); } } #if MYSQL_VERSION_ID > 50605 || defined(PDO_USE_MYSQLND) { - char *public_key = pdo_attr_strval(driver_options, PDO_MYSQL_ATTR_SERVER_PUBLIC_KEY, NULL TSRMLS_CC); + zend_string *public_key = pdo_attr_strval(driver_options, PDO_MYSQL_ATTR_SERVER_PUBLIC_KEY, NULL); if (public_key) { - if (mysql_options(H->server, MYSQL_SERVER_PUBLIC_KEY, public_key)) { + if (mysql_options(H->server, MYSQL_SERVER_PUBLIC_KEY, ZSTR_VAL(public_key))) { pdo_mysql_error(dbh); - str_efree(public_key); + zend_string_release(public_key); goto cleanup; } - str_efree(public_key); + zend_string_release(public_key); } } #endif @@ -741,7 +746,7 @@ static int pdo_mysql_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_ #endif dbname = vars[1].optval; - host = vars[2].optval; + host = vars[2].optval; if(vars[3].optval) { port = atoi(vars[3].optval); } @@ -749,10 +754,10 @@ static int pdo_mysql_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_ #ifdef PHP_WIN32 if (vars[2].optval && !strcmp(".", vars[2].optval)) { #else - if (vars[2].optval && !strcmp("localhost", vars[2].optval)) { + if (vars[2].optval && !strcmp("localhost", vars[2].optval)) { #endif - unix_socket = vars[4].optval; - } + unix_socket = vars[4].optval; + } /* TODO: - Check zval cache + ZTS */ #ifdef PDO_USE_MYSQLND @@ -765,7 +770,7 @@ static int pdo_mysql_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_ } if (mysqlnd_connect(H->server, host, dbh->username, dbh->password, password_len, dbname, dbname_len, - port, unix_socket, connect_opts, MYSQLND_CLIENT_NO_FLAG TSRMLS_CC) == NULL) { + port, unix_socket, connect_opts, MYSQLND_CLIENT_NO_FLAG) == NULL) { #else if (mysql_real_connect(H->server, host, dbh->username, dbh->password, dbname, port, unix_socket, connect_opts) == NULL) { #endif @@ -774,7 +779,7 @@ static int pdo_mysql_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_ } if (!dbh->auto_commit) { - mysql_handle_autocommit(dbh TSRMLS_CC); + mysql_handle_autocommit(dbh); } H->attached = 1; @@ -784,14 +789,14 @@ static int pdo_mysql_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_ dbh->methods = &mysql_methods; ret = 1; - + cleanup: for (i = 0; i < sizeof(vars)/sizeof(vars[0]); i++) { if (vars[i].freeme) { efree(vars[i].optval); } } - + dbh->methods = &mysql_methods; PDO_DBG_RETURN(ret); diff --git a/ext/pdo_mysql/mysql_statement.c b/ext/pdo_mysql/mysql_statement.c index 1b8f37af20..4a2146dd16 100644 --- a/ext/pdo_mysql/mysql_statement.c +++ b/ext/pdo_mysql/mysql_statement.c @@ -1,6 +1,6 @@ /* +----------------------------------------------------------------------+ - | PHP Version 5 | + | PHP Version 7 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2016 The PHP Group | +----------------------------------------------------------------------+ @@ -33,18 +33,18 @@ #include "php_pdo_mysql_int.h" #ifdef PDO_USE_MYSQLND -# define pdo_mysql_stmt_execute_prepared(stmt) pdo_mysql_stmt_execute_prepared_mysqlnd(stmt TSRMLS_CC) +# define pdo_mysql_stmt_execute_prepared(stmt) pdo_mysql_stmt_execute_prepared_mysqlnd(stmt) # define pdo_free_bound_result(res) zval_dtor(res.zv) # define pdo_mysql_stmt_close(stmt) mysqlnd_stmt_close(stmt, 0) #else -# define pdo_mysql_stmt_execute_prepared(stmt) pdo_mysql_stmt_execute_prepared_libmysql(stmt TSRMLS_CC) +# define pdo_mysql_stmt_execute_prepared(stmt) pdo_mysql_stmt_execute_prepared_libmysql(stmt) # define pdo_free_bound_result(res) efree(res.buffer) # define pdo_mysql_stmt_close(stmt) mysql_stmt_close(stmt) #endif -static int pdo_mysql_stmt_dtor(pdo_stmt_t *stmt TSRMLS_DC) /* {{{ */ +static int pdo_mysql_stmt_dtor(pdo_stmt_t *stmt) /* {{{ */ { pdo_mysql_stmt *S = (pdo_mysql_stmt*)stmt->driver_data; @@ -88,8 +88,9 @@ static int pdo_mysql_stmt_dtor(pdo_stmt_t *stmt TSRMLS_DC) /* {{{ */ } #endif - - if (S->H->server) { + if (!Z_ISUNDEF(stmt->database_object_handle) + && IS_OBJ_VALID(EG(objects_store).object_buckets[Z_OBJ_HANDLE(stmt->database_object_handle)]) + && (!(GC_FLAGS(Z_OBJ(stmt->database_object_handle)) & IS_OBJ_FREE_CALLED))) { while (mysql_more_results(S->H->server)) { MYSQL_RES *res; if (mysql_next_result(S->H->server) != 0) { @@ -114,18 +115,18 @@ static int pdo_mysql_stmt_dtor(pdo_stmt_t *stmt TSRMLS_DC) /* {{{ */ } /* }}} */ -static void pdo_mysql_stmt_set_row_count(pdo_stmt_t *stmt TSRMLS_DC) /* {{{ */ +static void pdo_mysql_stmt_set_row_count(pdo_stmt_t *stmt) /* {{{ */ { - long row_count; + zend_long row_count; pdo_mysql_stmt *S = stmt->driver_data; - row_count = (long) mysql_stmt_affected_rows(S->stmt); - if (row_count != (long)-1) { + row_count = (zend_long) mysql_stmt_affected_rows(S->stmt); + if (row_count != (zend_long)-1) { stmt->row_count = row_count; } } /* }}} */ -static int pdo_mysql_fill_stmt_from_result(pdo_stmt_t *stmt TSRMLS_DC) /* {{{ */ +static int pdo_mysql_fill_stmt_from_result(pdo_stmt_t *stmt) /* {{{ */ { pdo_mysql_stmt *S = (pdo_mysql_stmt*)stmt->driver_data; pdo_mysql_db_handle *H = S->H; @@ -146,12 +147,12 @@ static int pdo_mysql_fill_stmt_from_result(pdo_stmt_t *stmt TSRMLS_DC) /* {{{ */ PDO_DBG_RETURN(0); } - stmt->row_count = (long) mysql_num_rows(S->result); + stmt->row_count = (zend_long) mysql_num_rows(S->result); stmt->column_count = (int) mysql_num_fields(S->result); S->fields = mysql_fetch_fields(S->result); } else { /* this was a DML or DDL query (INSERT, UPDATE, DELETE, ... */ - stmt->row_count = (long) row_count; + stmt->row_count = (zend_long) row_count; } PDO_DBG_RETURN(1); @@ -159,7 +160,7 @@ static int pdo_mysql_fill_stmt_from_result(pdo_stmt_t *stmt TSRMLS_DC) /* {{{ */ /* }}} */ #ifndef PDO_USE_MYSQLND -static int pdo_mysql_stmt_execute_prepared_libmysql(pdo_stmt_t *stmt TSRMLS_DC) /* {{{ */ +static int pdo_mysql_stmt_execute_prepared_libmysql(pdo_stmt_t *stmt) /* {{{ */ { pdo_mysql_stmt *S = stmt->driver_data; pdo_mysql_db_handle *H = S->H; @@ -200,7 +201,7 @@ static int pdo_mysql_stmt_execute_prepared_libmysql(pdo_stmt_t *stmt TSRMLS_DC) stmt->column_count = (int)mysql_num_fields(S->result); S->bound_result = ecalloc(stmt->column_count, sizeof(MYSQL_BIND)); S->out_null = ecalloc(stmt->column_count, sizeof(my_bool)); - S->out_length = ecalloc(stmt->column_count, sizeof(unsigned long)); + S->out_length = ecalloc(stmt->column_count, sizeof(zend_ulong)); /* summon memory to hold the row */ for (i = 0; i < stmt->column_count; i++) { @@ -263,14 +264,14 @@ static int pdo_mysql_stmt_execute_prepared_libmysql(pdo_stmt_t *stmt TSRMLS_DC) } } - pdo_mysql_stmt_set_row_count(stmt TSRMLS_CC); + pdo_mysql_stmt_set_row_count(stmt); PDO_DBG_RETURN(1); } /* }}} */ #endif #ifdef PDO_USE_MYSQLND -static int pdo_mysql_stmt_execute_prepared_mysqlnd(pdo_stmt_t *stmt TSRMLS_DC) /* {{{ */ +static int pdo_mysql_stmt_execute_prepared_mysqlnd(pdo_stmt_t *stmt) /* {{{ */ { pdo_mysql_stmt *S = stmt->driver_data; pdo_mysql_db_handle *H = S->H; @@ -306,13 +307,13 @@ static int pdo_mysql_stmt_execute_prepared_mysqlnd(pdo_stmt_t *stmt TSRMLS_DC) / } } - pdo_mysql_stmt_set_row_count(stmt TSRMLS_CC); + pdo_mysql_stmt_set_row_count(stmt); PDO_DBG_RETURN(1); } /* }}} */ #endif -static int pdo_mysql_stmt_execute(pdo_stmt_t *stmt TSRMLS_DC) /* {{{ */ +static int pdo_mysql_stmt_execute(pdo_stmt_t *stmt) /* {{{ */ { pdo_mysql_stmt *S = (pdo_mysql_stmt*)stmt->driver_data; pdo_mysql_db_handle *H = S->H; @@ -334,15 +335,17 @@ static int pdo_mysql_stmt_execute(pdo_stmt_t *stmt TSRMLS_DC) /* {{{ */ PDO_DBG_RETURN(0); } - PDO_DBG_RETURN(pdo_mysql_fill_stmt_from_result(stmt TSRMLS_CC)); + PDO_DBG_RETURN(pdo_mysql_fill_stmt_from_result(stmt)); } /* }}} */ -static int pdo_mysql_stmt_next_rowset(pdo_stmt_t *stmt TSRMLS_DC) /* {{{ */ +static int pdo_mysql_stmt_next_rowset(pdo_stmt_t *stmt) /* {{{ */ { pdo_mysql_stmt *S = (pdo_mysql_stmt*)stmt->driver_data; pdo_mysql_db_handle *H = S->H; - long row_count; +#if PDO_USE_MYSQLND + zend_long row_count; +#endif PDO_DBG_ENTER("pdo_mysql_stmt_next_rowset"); PDO_DBG_INF_FMT("stmt=%p", S->stmt); @@ -391,8 +394,8 @@ static int pdo_mysql_stmt_next_rowset(pdo_stmt_t *stmt TSRMLS_DC) /* {{{ */ } } } - row_count = (long) mysql_stmt_affected_rows(S->stmt); - if (row_count != (long)-1) { + row_count = (zend_long) mysql_stmt_affected_rows(S->stmt); + if (row_count != (zend_long)-1) { stmt->row_count = row_count; } PDO_DBG_RETURN(1); @@ -402,7 +405,9 @@ static int pdo_mysql_stmt_next_rowset(pdo_stmt_t *stmt TSRMLS_DC) /* {{{ */ /* ensure that we free any previous unfetched results */ #ifndef PDO_USE_MYSQLND if (S->stmt) { - stmt->column_count = (int)mysql_num_fields(S->result); + if (S->result) { + stmt->column_count = (int)mysql_num_fields(S->result); + } mysql_stmt_free_result(S->stmt); } #endif @@ -413,21 +418,21 @@ static int pdo_mysql_stmt_next_rowset(pdo_stmt_t *stmt TSRMLS_DC) /* {{{ */ if (!mysql_more_results(H->server)) { /* No more results */ - PDO_DBG_RETURN(0); + PDO_DBG_RETURN(0); } #if PDO_USE_MYSQLND if (mysql_next_result(H->server) == FAIL) { pdo_mysql_error_stmt(stmt); PDO_DBG_RETURN(0); } else { - PDO_DBG_RETURN(pdo_mysql_fill_stmt_from_result(stmt TSRMLS_CC)); + PDO_DBG_RETURN(pdo_mysql_fill_stmt_from_result(stmt)); } #else if (mysql_next_result(H->server) > 0) { pdo_mysql_error_stmt(stmt); PDO_DBG_RETURN(0); } else { - PDO_DBG_RETURN(pdo_mysql_fill_stmt_from_result(stmt TSRMLS_CC)); + PDO_DBG_RETURN(pdo_mysql_fill_stmt_from_result(stmt)); } #endif } @@ -446,8 +451,9 @@ static const char * const pdo_param_event_names[] = }; -static int pdo_mysql_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_data *param, enum pdo_param_event event_type TSRMLS_DC) /* {{{ */ +static int pdo_mysql_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_data *param, enum pdo_param_event event_type) /* {{{ */ { + zval *parameter; #ifndef PDO_USE_MYSQLND PDO_MYSQL_PARAM_BIND *b; #endif @@ -483,17 +489,21 @@ static int pdo_mysql_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_da PDO_DBG_RETURN(0); } + if (!Z_ISREF(param->parameter)) { + parameter = ¶m->parameter; + } else { + parameter = Z_REFVAL(param->parameter); + } + #if PDO_USE_MYSQLND - if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_NULL || - Z_TYPE_P(param->parameter) == IS_NULL) { - mysqlnd_stmt_bind_one_param(S->stmt, param->paramno, param->parameter, MYSQL_TYPE_NULL); + if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_NULL || (Z_TYPE_P(parameter) == IS_NULL)) { + mysqlnd_stmt_bind_one_param(S->stmt, param->paramno, parameter, MYSQL_TYPE_NULL); PDO_DBG_RETURN(1); } #else b = (PDO_MYSQL_PARAM_BIND*)param->driver_data; *b->is_null = 0; - if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_NULL || - Z_TYPE_P(param->parameter) == IS_NULL) { + if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_NULL || Z_TYPE_P(parameter) == IS_NULL) { *b->is_null = 1; b->buffer_type = MYSQL_TYPE_STRING; b->buffer = NULL; @@ -508,16 +518,20 @@ static int pdo_mysql_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_da PDO_DBG_RETURN(0); case PDO_PARAM_LOB: PDO_DBG_INF("PDO_PARAM_LOB"); - if (Z_TYPE_P(param->parameter) == IS_RESOURCE) { - php_stream *stm; - php_stream_from_zval_no_verify(stm, ¶m->parameter); + if (!Z_ISREF(param->parameter)) { + parameter = ¶m->parameter; + } else { + parameter = Z_REFVAL(param->parameter); + } + if (Z_TYPE_P(parameter) == IS_RESOURCE) { + php_stream *stm = NULL; + php_stream_from_zval_no_verify(stm, parameter); if (stm) { - SEPARATE_ZVAL_IF_NOT_REF(¶m->parameter); - Z_TYPE_P(param->parameter) = IS_STRING; - Z_STRLEN_P(param->parameter) = php_stream_copy_to_mem(stm, - &Z_STRVAL_P(param->parameter), PHP_STREAM_COPY_ALL, 0); + zend_string *mem = php_stream_copy_to_mem(stm, PHP_STREAM_COPY_ALL, 0); + zval_ptr_dtor(parameter); + ZVAL_STR(parameter, mem ? mem : ZSTR_EMPTY_ALLOC()); } else { - pdo_raise_impl_error(stmt->dbh, stmt, "HY105", "Expected a stream resource" TSRMLS_CC); + pdo_raise_impl_error(stmt->dbh, stmt, "HY105", "Expected a stream resource"); return 0; } } @@ -529,20 +543,25 @@ static int pdo_mysql_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_da #if PDO_USE_MYSQLND /* Is it really correct to check the zval's type? - But well, that's what the old code below does, too */ - PDO_DBG_INF_FMT("param->parameter->type=%d", Z_TYPE_P(param->parameter)); - switch (Z_TYPE_P(param->parameter)) { + PDO_DBG_INF_FMT("param->parameter->type=%d", Z_TYPE(param->parameter)); + if (!Z_ISREF(param->parameter)) { + parameter = ¶m->parameter; + } else { + parameter = Z_REFVAL(param->parameter); + } + switch (Z_TYPE_P(parameter)) { case IS_STRING: - mysqlnd_stmt_bind_one_param(S->stmt, param->paramno, param->parameter, MYSQL_TYPE_VAR_STRING); + mysqlnd_stmt_bind_one_param(S->stmt, param->paramno, parameter, MYSQL_TYPE_VAR_STRING); break; case IS_LONG: -#if SIZEOF_LONG==8 - mysqlnd_stmt_bind_one_param(S->stmt, param->paramno, param->parameter, MYSQL_TYPE_LONGLONG); -#elif SIZEOF_LONG==4 - mysqlnd_stmt_bind_one_param(S->stmt, param->paramno, param->parameter, MYSQL_TYPE_LONG); +#if SIZEOF_ZEND_LONG==8 + mysqlnd_stmt_bind_one_param(S->stmt, param->paramno, parameter, MYSQL_TYPE_LONGLONG); +#elif SIZEOF_ZEND_LONG==4 + mysqlnd_stmt_bind_one_param(S->stmt, param->paramno, parameter, MYSQL_TYPE_LONG); #endif /* SIZEOF_LONG */ break; case IS_DOUBLE: - mysqlnd_stmt_bind_one_param(S->stmt, param->paramno, param->parameter, MYSQL_TYPE_DOUBLE); + mysqlnd_stmt_bind_one_param(S->stmt, param->paramno, parameter, MYSQL_TYPE_DOUBLE); break; default: PDO_DBG_RETURN(0); @@ -550,23 +569,28 @@ static int pdo_mysql_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_da PDO_DBG_RETURN(1); #else - PDO_DBG_INF_FMT("param->parameter->type=%d", Z_TYPE_P(param->parameter)); - switch (Z_TYPE_P(param->parameter)) { + PDO_DBG_INF_FMT("param->parameter->type=%d", Z_TYPE(param->parameter)); + if (!Z_ISREF(param->parameter)) { + parameter = ¶m->parameter; + } else { + parameter = Z_REFVAL(param->parameter); + } + switch (Z_TYPE_P(parameter)) { case IS_STRING: b->buffer_type = MYSQL_TYPE_STRING; - b->buffer = Z_STRVAL_P(param->parameter); - b->buffer_length = Z_STRLEN_P(param->parameter); - *b->length = Z_STRLEN_P(param->parameter); + b->buffer = Z_STRVAL_P(parameter); + b->buffer_length = Z_STRLEN_P(parameter); + *b->length = Z_STRLEN_P(parameter); PDO_DBG_RETURN(1); case IS_LONG: b->buffer_type = MYSQL_TYPE_LONG; - b->buffer = &Z_LVAL_P(param->parameter); + b->buffer = &Z_LVAL_P(parameter); PDO_DBG_RETURN(1); case IS_DOUBLE: b->buffer_type = MYSQL_TYPE_DOUBLE; - b->buffer = &Z_DVAL_P(param->parameter); + b->buffer = &Z_DVAL_P(parameter); PDO_DBG_RETURN(1); default: @@ -587,7 +611,7 @@ static int pdo_mysql_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_da } /* }}} */ -static int pdo_mysql_stmt_fetch(pdo_stmt_t *stmt, enum pdo_fetch_orientation ori, long offset TSRMLS_DC) /* {{{ */ +static int pdo_mysql_stmt_fetch(pdo_stmt_t *stmt, enum pdo_fetch_orientation ori, zend_long offset) /* {{{ */ { pdo_mysql_stmt *S = (pdo_mysql_stmt*)stmt->driver_data; #if PDO_USE_MYSQLND @@ -651,7 +675,7 @@ static int pdo_mysql_stmt_fetch(pdo_stmt_t *stmt, enum pdo_fetch_orientation ori } /* }}} */ -static int pdo_mysql_stmt_describe(pdo_stmt_t *stmt, int colno TSRMLS_DC) /* {{{ */ +static int pdo_mysql_stmt_describe(pdo_stmt_t *stmt, int colno) /* {{{ */ { pdo_mysql_stmt *S = (pdo_mysql_stmt*)stmt->driver_data; struct pdo_column_data *cols = stmt->columns; @@ -675,15 +699,11 @@ static int pdo_mysql_stmt_describe(pdo_stmt_t *stmt, int colno TSRMLS_DC) /* {{{ PDO_DBG_RETURN(1); } for (i = 0; i < stmt->column_count; i++) { - int namelen; if (S->H->fetch_table_names) { - namelen = spprintf(&cols[i].name, 0, "%s.%s", S->fields[i].table, S->fields[i].name); - cols[i].namelen = namelen; + cols[i].name = strpprintf(0, "%s.%s", S->fields[i].table, S->fields[i].name); } else { - namelen = strlen(S->fields[i].name); - cols[i].namelen = namelen; - cols[i].name = estrndup(S->fields[i].name, namelen); + cols[i].name = zend_string_init(S->fields[i].name, S->fields[i].name_length, 0); } cols[i].precision = S->fields[i].decimals; @@ -702,7 +722,7 @@ static int pdo_mysql_stmt_describe(pdo_stmt_t *stmt, int colno TSRMLS_DC) /* {{{ } /* }}} */ -static int pdo_mysql_stmt_get_col(pdo_stmt_t *stmt, int colno, char **ptr, unsigned long *len, int *caller_frees TSRMLS_DC) /* {{{ */ +static int pdo_mysql_stmt_get_col(pdo_stmt_t *stmt, int colno, char **ptr, size_t *len, int *caller_frees) /* {{{ */ { pdo_mysql_stmt *S = (pdo_mysql_stmt*)stmt->driver_data; @@ -725,7 +745,7 @@ static int pdo_mysql_stmt_get_col(pdo_stmt_t *stmt, int colno, char **ptr, unsig } #if PDO_USE_MYSQLND if (S->stmt) { - Z_ADDREF_P(S->stmt->data->result_bind[colno].zv); + Z_TRY_ADDREF(S->stmt->data->result_bind[colno].zv); *ptr = (char*)&S->stmt->data->result_bind[colno].zv; *len = sizeof(zval); PDO_DBG_RETURN(1); @@ -803,11 +823,11 @@ static char *type_to_name_native(int type) /* {{{ */ #undef PDO_MYSQL_NATIVE_TYPE_NAME } /* }}} */ -static int pdo_mysql_stmt_col_meta(pdo_stmt_t *stmt, long colno, zval *return_value TSRMLS_DC) /* {{{ */ +static int pdo_mysql_stmt_col_meta(pdo_stmt_t *stmt, zend_long colno, zval *return_value) /* {{{ */ { pdo_mysql_stmt *S = (pdo_mysql_stmt*)stmt->driver_data; const MYSQL_FIELD *F; - zval *flags; + zval flags; char *str; PDO_DBG_ENTER("pdo_mysql_stmt_col_meta"); @@ -821,32 +841,31 @@ static int pdo_mysql_stmt_col_meta(pdo_stmt_t *stmt, long colno, zval *return_va } array_init(return_value); - MAKE_STD_ZVAL(flags); - array_init(flags); + array_init(&flags); F = S->fields + colno; if (F->def) { - add_assoc_string(return_value, "mysql:def", F->def, 1); + add_assoc_string(return_value, "mysql:def", F->def); } if (IS_NOT_NULL(F->flags)) { - add_next_index_string(flags, "not_null", 1); + add_next_index_string(&flags, "not_null"); } if (IS_PRI_KEY(F->flags)) { - add_next_index_string(flags, "primary_key", 1); + add_next_index_string(&flags, "primary_key"); } if (F->flags & MULTIPLE_KEY_FLAG) { - add_next_index_string(flags, "multiple_key", 1); + add_next_index_string(&flags, "multiple_key"); } if (F->flags & UNIQUE_KEY_FLAG) { - add_next_index_string(flags, "unique_key", 1); + add_next_index_string(&flags, "unique_key"); } if (IS_BLOB(F->flags)) { - add_next_index_string(flags, "blob", 1); + add_next_index_string(&flags, "blob"); } str = type_to_name_native(F->type); if (str) { - add_assoc_string(return_value, "native_type", str, 1); + add_assoc_string(return_value, "native_type", str); } #ifdef PDO_USE_MYSQLND @@ -868,12 +887,13 @@ static int pdo_mysql_stmt_col_meta(pdo_stmt_t *stmt, long colno, zval *return_va } #endif - add_assoc_zval(return_value, "flags", flags); - add_assoc_string(return_value, "table", (char *) (F->table?F->table:""), 1); + add_assoc_zval(return_value, "flags", &flags); + add_assoc_string(return_value, "table", (char *) (F->table?F->table : "")); + PDO_DBG_RETURN(SUCCESS); } /* }}} */ -static int pdo_mysql_stmt_cursor_closer(pdo_stmt_t *stmt TSRMLS_DC) /* {{{ */ +static int pdo_mysql_stmt_cursor_closer(pdo_stmt_t *stmt) /* {{{ */ { pdo_mysql_stmt *S = (pdo_mysql_stmt*)stmt->driver_data; diff --git a/ext/pdo_mysql/pdo_mysql.c b/ext/pdo_mysql/pdo_mysql.c index 643321830b..7ed1647d8a 100644 --- a/ext/pdo_mysql/pdo_mysql.c +++ b/ext/pdo_mysql/pdo_mysql.c @@ -1,6 +1,6 @@ /* +----------------------------------------------------------------------+ - | PHP Version 5 | + | PHP Version 7 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2016 The PHP Group | +----------------------------------------------------------------------+ @@ -32,6 +32,9 @@ #include "php_pdo_mysql_int.h" #ifdef COMPILE_DL_PDO_MYSQL +#ifdef ZTS +ZEND_TSRMLS_CACHE_DEFINE() +#endif ZEND_GET_MODULE(pdo_mysql) #endif @@ -42,7 +45,7 @@ ZEND_DECLARE_MODULE_GLOBALS(pdo_mysql) With libmysql `mysql_config --socket` will fill PDO_MYSQL_UNIX_ADDR and the user can use --with-mysql-sock=SOCKET which will fill PDO_MYSQL_UNIX_ADDR. If both aren't set we're using mysqlnd and use - /tmp/mysql.sock as default on *nix and NULL for Windows (default + /tmp/mysql.sock as default on *nix and NULL for Windows (default named pipe name is set in mysqlnd). */ #ifndef PDO_MYSQL_UNIX_ADDR @@ -59,18 +62,18 @@ ZEND_DECLARE_MODULE_GLOBALS(pdo_mysql) #ifdef PDO_USE_MYSQLND #include "ext/mysqlnd/mysqlnd_reverse_api.h" -static MYSQLND * pdo_mysql_convert_zv_to_mysqlnd(zval * zv TSRMLS_DC) +static MYSQLND * pdo_mysql_convert_zv_to_mysqlnd(zval * zv) { - if (Z_TYPE_P(zv) == IS_OBJECT && instanceof_function(Z_OBJCE_P(zv), php_pdo_get_dbh_ce() TSRMLS_CC)) { - pdo_dbh_t * dbh = zend_object_store_get_object(zv TSRMLS_CC); + if (Z_TYPE_P(zv) == IS_OBJECT && instanceof_function(Z_OBJCE_P(zv), php_pdo_get_dbh_ce())) { + pdo_dbh_t * dbh = Z_PDO_DBH_P(zv); if (!dbh) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to retrieve handle from object store"); + php_error_docref(NULL, E_WARNING, "Failed to retrieve handle from object store"); return NULL; } if (dbh->driver != &pdo_mysql_driver) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Provided PDO instance is not using MySQL but %s", dbh->driver->driver_name); + php_error_docref(NULL, E_WARNING, "Provided PDO instance is not using MySQL but %s", dbh->driver->driver_name); return NULL; } @@ -98,38 +101,38 @@ PHP_INI_BEGIN() PHP_INI_END() /* }}} */ -/* true global environment */ - +/* true global environment */ + /* {{{ PHP_MINIT_FUNCTION */ static PHP_MINIT_FUNCTION(pdo_mysql) { REGISTER_INI_ENTRIES(); - REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_USE_BUFFERED_QUERY", (long)PDO_MYSQL_ATTR_USE_BUFFERED_QUERY); - REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_LOCAL_INFILE", (long)PDO_MYSQL_ATTR_LOCAL_INFILE); - REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_INIT_COMMAND", (long)PDO_MYSQL_ATTR_INIT_COMMAND); + REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_USE_BUFFERED_QUERY", (zend_long)PDO_MYSQL_ATTR_USE_BUFFERED_QUERY); + REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_LOCAL_INFILE", (zend_long)PDO_MYSQL_ATTR_LOCAL_INFILE); + REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_INIT_COMMAND", (zend_long)PDO_MYSQL_ATTR_INIT_COMMAND); #ifndef PDO_USE_MYSQLND - REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_MAX_BUFFER_SIZE", (long)PDO_MYSQL_ATTR_MAX_BUFFER_SIZE); - REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_READ_DEFAULT_FILE", (long)PDO_MYSQL_ATTR_READ_DEFAULT_FILE); - REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_READ_DEFAULT_GROUP", (long)PDO_MYSQL_ATTR_READ_DEFAULT_GROUP); + REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_MAX_BUFFER_SIZE", (zend_long)PDO_MYSQL_ATTR_MAX_BUFFER_SIZE); + REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_READ_DEFAULT_FILE", (zend_long)PDO_MYSQL_ATTR_READ_DEFAULT_FILE); + REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_READ_DEFAULT_GROUP", (zend_long)PDO_MYSQL_ATTR_READ_DEFAULT_GROUP); #endif - REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_COMPRESS", (long)PDO_MYSQL_ATTR_COMPRESS); - REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_DIRECT_QUERY", (long)PDO_MYSQL_ATTR_DIRECT_QUERY); - REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_FOUND_ROWS", (long)PDO_MYSQL_ATTR_FOUND_ROWS); - REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_IGNORE_SPACE", (long)PDO_MYSQL_ATTR_IGNORE_SPACE); - REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_SSL_KEY", (long)PDO_MYSQL_ATTR_SSL_KEY); - REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_SSL_CERT", (long)PDO_MYSQL_ATTR_SSL_CERT); - REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_SSL_CA", (long)PDO_MYSQL_ATTR_SSL_CA); - REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_SSL_CAPATH", (long)PDO_MYSQL_ATTR_SSL_CAPATH); - REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_SSL_CIPHER", (long)PDO_MYSQL_ATTR_SSL_CIPHER); + REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_COMPRESS", (zend_long)PDO_MYSQL_ATTR_COMPRESS); + REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_DIRECT_QUERY", (zend_long)PDO_MYSQL_ATTR_DIRECT_QUERY); + REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_FOUND_ROWS", (zend_long)PDO_MYSQL_ATTR_FOUND_ROWS); + REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_IGNORE_SPACE", (zend_long)PDO_MYSQL_ATTR_IGNORE_SPACE); + REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_SSL_KEY", (zend_long)PDO_MYSQL_ATTR_SSL_KEY); + REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_SSL_CERT", (zend_long)PDO_MYSQL_ATTR_SSL_CERT); + REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_SSL_CA", (zend_long)PDO_MYSQL_ATTR_SSL_CA); + REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_SSL_CAPATH", (zend_long)PDO_MYSQL_ATTR_SSL_CAPATH); + REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_SSL_CIPHER", (zend_long)PDO_MYSQL_ATTR_SSL_CIPHER); #if MYSQL_VERSION_ID > 50605 || defined(PDO_USE_MYSQLND) - REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_SERVER_PUBLIC_KEY", (long)PDO_MYSQL_ATTR_SERVER_PUBLIC_KEY); + REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_SERVER_PUBLIC_KEY", (zend_long)PDO_MYSQL_ATTR_SERVER_PUBLIC_KEY); #endif - REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_MULTI_STATEMENTS", (long)PDO_MYSQL_ATTR_MULTI_STATEMENTS); + REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_MULTI_STATEMENTS", (zend_long)PDO_MYSQL_ATTR_MULTI_STATEMENTS); #ifdef PDO_USE_MYSQLND - mysqlnd_reverse_api_register_api(&pdo_mysql_reverse_api TSRMLS_CC); + mysqlnd_reverse_api_register_api(&pdo_mysql_reverse_api); #endif return php_pdo_register_driver(&pdo_mysql_driver); @@ -171,16 +174,16 @@ static PHP_MINFO_FUNCTION(pdo_mysql) /* {{{ PHP_RINIT_FUNCTION */ static PHP_RINIT_FUNCTION(pdo_mysql) -{ +{ if (PDO_MYSQL_G(debug)) { - MYSQLND_DEBUG *dbg = mysqlnd_debug_init(mysqlnd_debug_std_no_trace_funcs TSRMLS_CC); + MYSQLND_DEBUG *dbg = mysqlnd_debug_init(mysqlnd_debug_std_no_trace_funcs); if (!dbg) { return FAILURE; } dbg->m->set_mode(dbg, PDO_MYSQL_G(debug)); PDO_MYSQL_G(dbg) = dbg; } - + return SUCCESS; } /* }}} */ @@ -206,6 +209,9 @@ static PHP_RSHUTDOWN_FUNCTION(pdo_mysql) */ static PHP_GINIT_FUNCTION(pdo_mysql) { +#if defined(COMPILE_DL_PDO_MYSQL) && defined(ZTS) +ZEND_TSRMLS_CACHE_UPDATE(); +#endif #ifndef PHP_WIN32 pdo_mysql_globals->default_socket = NULL; #endif @@ -250,7 +256,7 @@ zend_module_entry pdo_mysql_module_entry = { NULL, #endif PHP_MINFO(pdo_mysql), - "1.0.2", + PHP_PDO_MYSQL_VERSION, PHP_MODULE_GLOBALS(pdo_mysql), PHP_GINIT(pdo_mysql), NULL, diff --git a/ext/pdo_mysql/php_pdo_mysql.h b/ext/pdo_mysql/php_pdo_mysql.h index f299e18ba2..b922f76add 100644 --- a/ext/pdo_mysql/php_pdo_mysql.h +++ b/ext/pdo_mysql/php_pdo_mysql.h @@ -1,6 +1,6 @@ /* +----------------------------------------------------------------------+ - | PHP Version 5 | + | PHP Version 7 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2016 The PHP Group | +----------------------------------------------------------------------+ @@ -24,6 +24,9 @@ extern zend_module_entry pdo_mysql_module_entry; #define phpext_pdo_mysql_ptr &pdo_mysql_module_entry +#include "php_version.h" +#define PHP_PDO_MYSQL_VERSION PHP_VERSION + #ifdef PHP_WIN32 #define PHP_PDO_MYSQL_API __declspec(dllexport) #else diff --git a/ext/pdo_mysql/php_pdo_mysql_int.h b/ext/pdo_mysql/php_pdo_mysql_int.h index 8427f43384..a4290fdaf3 100644 --- a/ext/pdo_mysql/php_pdo_mysql_int.h +++ b/ext/pdo_mysql/php_pdo_mysql_int.h @@ -1,6 +1,6 @@ /* +----------------------------------------------------------------------+ - | PHP Version 5 | + | PHP Version 7 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2016 The PHP Group | +----------------------------------------------------------------------+ @@ -43,7 +43,12 @@ #define PDO_DBG_ERR(msg) do { if (dbg_skip_trace == FALSE) PDO_MYSQL_G(dbg)->m->log(PDO_MYSQL_G(dbg), __LINE__, __FILE__, -1, "error: ", (msg)); } while (0) #define PDO_DBG_INF_FMT(...) do { if (dbg_skip_trace == FALSE) PDO_MYSQL_G(dbg)->m->log_va(PDO_MYSQL_G(dbg), __LINE__, __FILE__, -1, "info : ", __VA_ARGS__); } while (0) #define PDO_DBG_ERR_FMT(...) do { if (dbg_skip_trace == FALSE) PDO_MYSQL_G(dbg)->m->log_va(PDO_MYSQL_G(dbg), __LINE__, __FILE__, -1, "error: ", __VA_ARGS__); } while (0) -#define PDO_DBG_ENTER(func_name) zend_bool dbg_skip_trace = TRUE; if (PDO_MYSQL_G(dbg)) dbg_skip_trace = !PDO_MYSQL_G(dbg)->m->func_enter(PDO_MYSQL_G(dbg), __LINE__, __FILE__, func_name, strlen(func_name)); +#define PDO_DBG_ENTER(func_name) \ + zend_bool dbg_skip_trace = TRUE; \ + ((void) dbg_skip_trace); \ + if (PDO_MYSQL_G(dbg)) \ + dbg_skip_trace = !PDO_MYSQL_G(dbg)->m->func_enter(PDO_MYSQL_G(dbg), __LINE__, __FILE__, func_name, strlen(func_name)); + #define PDO_DBG_RETURN(value) do { if (PDO_MYSQL_G(dbg)) PDO_MYSQL_G(dbg)->m->func_leave(PDO_MYSQL_G(dbg), __LINE__, __FILE__, 0); return (value); } while (0) #define PDO_DBG_VOID_RETURN do { if (PDO_MYSQL_G(dbg)) PDO_MYSQL_G(dbg)->m->func_leave(PDO_MYSQL_G(dbg), __LINE__, __FILE__, 0); return; } while (0) @@ -81,11 +86,10 @@ ZEND_BEGIN_MODULE_GLOBALS(pdo_mysql) ZEND_END_MODULE_GLOBALS(pdo_mysql) ZEND_EXTERN_MODULE_GLOBALS(pdo_mysql) +#define PDO_MYSQL_G(v) ZEND_MODULE_GLOBALS_ACCESSOR(pdo_mysql, v) -#ifdef ZTS -#define PDO_MYSQL_G(v) TSRMG(pdo_mysql_globals_id, zend_pdo_mysql_globals *, v) -#else -#define PDO_MYSQL_G(v) (pdo_mysql_globals.v) +#if defined(ZTS) && defined(COMPILE_DL_PDO_MYSQL) +ZEND_TSRMLS_CACHE_EXTERN() #endif @@ -104,9 +108,9 @@ typedef struct { unsigned buffered:1; unsigned emulate_prepare:1; unsigned fetch_table_names:1; - unsigned _reserved:31; + unsigned _reserved:31; #if !PDO_USE_MYSQLND - unsigned long max_buffer_size; + zend_ulong max_buffer_size; #endif pdo_mysql_error_info einfo; @@ -118,38 +122,38 @@ typedef struct { typedef struct { pdo_mysql_db_handle *H; - MYSQL_RES *result; - const MYSQL_FIELD *fields; - MYSQL_ROW current_data; + MYSQL_RES *result; + const MYSQL_FIELD *fields; + MYSQL_ROW current_data; #if PDO_USE_MYSQLND - unsigned long *current_lengths; + zend_ulong *current_lengths; #else - long *current_lengths; + zend_long *current_lengths; #endif - pdo_mysql_error_info einfo; + pdo_mysql_error_info einfo; #if PDO_USE_MYSQLND - MYSQLND_STMT *stmt; + MYSQLND_STMT *stmt; #else - MYSQL_STMT *stmt; -#endif - int num_params; + MYSQL_STMT *stmt; +#endif + int num_params; PDO_MYSQL_PARAM_BIND *params; #ifndef PDO_USE_MYSQLND - my_bool *in_null; - unsigned long *in_length; + my_bool *in_null; + zend_ulong *in_length; #endif PDO_MYSQL_PARAM_BIND *bound_result; - my_bool *out_null; - unsigned long *out_length; - unsigned int params_given; - unsigned max_length:1; + my_bool *out_null; + zend_ulong *out_length; + unsigned int params_given; + unsigned max_length:1; } pdo_mysql_stmt; extern pdo_driver_t pdo_mysql_driver; -extern int _pdo_mysql_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, const char *file, int line TSRMLS_DC); -#define pdo_mysql_error(s) _pdo_mysql_error(s, NULL, __FILE__, __LINE__ TSRMLS_CC) -#define pdo_mysql_error_stmt(s) _pdo_mysql_error(stmt->dbh, stmt, __FILE__, __LINE__ TSRMLS_CC) +extern int _pdo_mysql_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, const char *file, int line); +#define pdo_mysql_error(s) _pdo_mysql_error(s, NULL, __FILE__, __LINE__) +#define pdo_mysql_error_stmt(s) _pdo_mysql_error(stmt->dbh, stmt, __FILE__, __LINE__) extern struct pdo_stmt_methods mysql_stmt_methods; diff --git a/ext/pdo_mysql/php_pdo_mysql_sqlstate.h b/ext/pdo_mysql/php_pdo_mysql_sqlstate.h index 70fc95ef74..8f8ccc0116 100644 --- a/ext/pdo_mysql/php_pdo_mysql_sqlstate.h +++ b/ext/pdo_mysql/php_pdo_mysql_sqlstate.h @@ -1,646 +1,646 @@ /* DO NOT EDIT THIS FILE!!! It is auto generated by get_error_codes.php */ -#ifdef ER_DUP_KEY +#ifdef ER_DUP_KEY case ER_DUP_KEY : return "23000"; #endif -#ifdef ER_OUTOFMEMORY +#ifdef ER_OUTOFMEMORY case ER_OUTOFMEMORY : return "HY001"; #endif -#ifdef ER_OUT_OF_SORTMEMORY +#ifdef ER_OUT_OF_SORTMEMORY case ER_OUT_OF_SORTMEMORY : return "HY001"; #endif -#ifdef ER_CON_COUNT_ERROR +#ifdef ER_CON_COUNT_ERROR case ER_CON_COUNT_ERROR : return "08004"; #endif -#ifdef ER_BAD_HOST_ERROR +#ifdef ER_BAD_HOST_ERROR case ER_BAD_HOST_ERROR : return "08S01"; #endif -#ifdef ER_HANDSHAKE_ERROR +#ifdef ER_HANDSHAKE_ERROR case ER_HANDSHAKE_ERROR : return "08S01"; #endif -#ifdef ER_DBACCESS_DENIED_ERROR +#ifdef ER_DBACCESS_DENIED_ERROR case ER_DBACCESS_DENIED_ERROR : return "42000"; #endif -#ifdef ER_ACCESS_DENIED_ERROR +#ifdef ER_ACCESS_DENIED_ERROR case ER_ACCESS_DENIED_ERROR : return "28000"; #endif -#ifdef ER_NO_DB_ERROR +#ifdef ER_NO_DB_ERROR case ER_NO_DB_ERROR : return "3D000"; #endif -#ifdef ER_UNKNOWN_COM_ERROR +#ifdef ER_UNKNOWN_COM_ERROR case ER_UNKNOWN_COM_ERROR : return "08S01"; #endif -#ifdef ER_BAD_NULL_ERROR +#ifdef ER_BAD_NULL_ERROR case ER_BAD_NULL_ERROR : return "23000"; #endif -#ifdef ER_BAD_DB_ERROR +#ifdef ER_BAD_DB_ERROR case ER_BAD_DB_ERROR : return "42000"; #endif -#ifdef ER_TABLE_EXISTS_ERROR +#ifdef ER_TABLE_EXISTS_ERROR case ER_TABLE_EXISTS_ERROR : return "42S01"; #endif -#ifdef ER_BAD_TABLE_ERROR +#ifdef ER_BAD_TABLE_ERROR case ER_BAD_TABLE_ERROR : return "42S02"; #endif -#ifdef ER_NON_UNIQ_ERROR +#ifdef ER_NON_UNIQ_ERROR case ER_NON_UNIQ_ERROR : return "23000"; #endif -#ifdef ER_SERVER_SHUTDOWN +#ifdef ER_SERVER_SHUTDOWN case ER_SERVER_SHUTDOWN : return "08S01"; #endif -#ifdef ER_BAD_FIELD_ERROR +#ifdef ER_BAD_FIELD_ERROR case ER_BAD_FIELD_ERROR : return "42S22"; #endif -#ifdef ER_WRONG_FIELD_WITH_GROUP +#ifdef ER_WRONG_FIELD_WITH_GROUP case ER_WRONG_FIELD_WITH_GROUP : return "42000"; #endif -#ifdef ER_WRONG_GROUP_FIELD +#ifdef ER_WRONG_GROUP_FIELD case ER_WRONG_GROUP_FIELD : return "42000"; #endif -#ifdef ER_WRONG_SUM_SELECT +#ifdef ER_WRONG_SUM_SELECT case ER_WRONG_SUM_SELECT : return "42000"; #endif -#ifdef ER_WRONG_VALUE_COUNT +#ifdef ER_WRONG_VALUE_COUNT case ER_WRONG_VALUE_COUNT : return "21S01"; #endif -#ifdef ER_TOO_LONG_IDENT +#ifdef ER_TOO_LONG_IDENT case ER_TOO_LONG_IDENT : return "42000"; #endif -#ifdef ER_DUP_FIELDNAME +#ifdef ER_DUP_FIELDNAME case ER_DUP_FIELDNAME : return "42S21"; #endif -#ifdef ER_DUP_KEYNAME +#ifdef ER_DUP_KEYNAME case ER_DUP_KEYNAME : return "42000"; #endif -#ifdef ER_DUP_ENTRY +#ifdef ER_DUP_ENTRY case ER_DUP_ENTRY : return "23000"; #endif -#ifdef ER_WRONG_FIELD_SPEC +#ifdef ER_WRONG_FIELD_SPEC case ER_WRONG_FIELD_SPEC : return "42000"; #endif -#ifdef ER_PARSE_ERROR +#ifdef ER_PARSE_ERROR case ER_PARSE_ERROR : return "42000"; #endif -#ifdef ER_EMPTY_QUERY +#ifdef ER_EMPTY_QUERY case ER_EMPTY_QUERY : return "42000"; #endif -#ifdef ER_NONUNIQ_TABLE +#ifdef ER_NONUNIQ_TABLE case ER_NONUNIQ_TABLE : return "42000"; #endif -#ifdef ER_INVALID_DEFAULT +#ifdef ER_INVALID_DEFAULT case ER_INVALID_DEFAULT : return "42000"; #endif -#ifdef ER_MULTIPLE_PRI_KEY +#ifdef ER_MULTIPLE_PRI_KEY case ER_MULTIPLE_PRI_KEY : return "42000"; #endif -#ifdef ER_TOO_MANY_KEYS +#ifdef ER_TOO_MANY_KEYS case ER_TOO_MANY_KEYS : return "42000"; #endif -#ifdef ER_TOO_MANY_KEY_PARTS +#ifdef ER_TOO_MANY_KEY_PARTS case ER_TOO_MANY_KEY_PARTS : return "42000"; #endif -#ifdef ER_TOO_LONG_KEY +#ifdef ER_TOO_LONG_KEY case ER_TOO_LONG_KEY : return "42000"; #endif -#ifdef ER_KEY_COLUMN_DOES_NOT_EXITS +#ifdef ER_KEY_COLUMN_DOES_NOT_EXITS case ER_KEY_COLUMN_DOES_NOT_EXITS : return "42000"; #endif -#ifdef ER_BLOB_USED_AS_KEY +#ifdef ER_BLOB_USED_AS_KEY case ER_BLOB_USED_AS_KEY : return "42000"; #endif -#ifdef ER_TOO_BIG_FIELDLENGTH +#ifdef ER_TOO_BIG_FIELDLENGTH case ER_TOO_BIG_FIELDLENGTH : return "42000"; #endif -#ifdef ER_WRONG_AUTO_KEY +#ifdef ER_WRONG_AUTO_KEY case ER_WRONG_AUTO_KEY : return "42000"; #endif -#ifdef ER_FORCING_CLOSE +#ifdef ER_FORCING_CLOSE case ER_FORCING_CLOSE : return "08S01"; #endif -#ifdef ER_IPSOCK_ERROR +#ifdef ER_IPSOCK_ERROR case ER_IPSOCK_ERROR : return "08S01"; #endif -#ifdef ER_NO_SUCH_INDEX +#ifdef ER_NO_SUCH_INDEX case ER_NO_SUCH_INDEX : return "42S12"; #endif -#ifdef ER_WRONG_FIELD_TERMINATORS +#ifdef ER_WRONG_FIELD_TERMINATORS case ER_WRONG_FIELD_TERMINATORS : return "42000"; #endif -#ifdef ER_BLOBS_AND_NO_TERMINATED +#ifdef ER_BLOBS_AND_NO_TERMINATED case ER_BLOBS_AND_NO_TERMINATED : return "42000"; #endif -#ifdef ER_CANT_REMOVE_ALL_FIELDS +#ifdef ER_CANT_REMOVE_ALL_FIELDS case ER_CANT_REMOVE_ALL_FIELDS : return "42000"; #endif -#ifdef ER_CANT_DROP_FIELD_OR_KEY +#ifdef ER_CANT_DROP_FIELD_OR_KEY case ER_CANT_DROP_FIELD_OR_KEY : return "42000"; #endif -#ifdef ER_BLOB_CANT_HAVE_DEFAULT +#ifdef ER_BLOB_CANT_HAVE_DEFAULT case ER_BLOB_CANT_HAVE_DEFAULT : return "42000"; #endif -#ifdef ER_WRONG_DB_NAME +#ifdef ER_WRONG_DB_NAME case ER_WRONG_DB_NAME : return "42000"; #endif -#ifdef ER_WRONG_TABLE_NAME +#ifdef ER_WRONG_TABLE_NAME case ER_WRONG_TABLE_NAME : return "42000"; #endif -#ifdef ER_TOO_BIG_SELECT +#ifdef ER_TOO_BIG_SELECT case ER_TOO_BIG_SELECT : return "42000"; #endif -#ifdef ER_UNKNOWN_PROCEDURE +#ifdef ER_UNKNOWN_PROCEDURE case ER_UNKNOWN_PROCEDURE : return "42000"; #endif -#ifdef ER_WRONG_PARAMCOUNT_TO_PROCEDURE +#ifdef ER_WRONG_PARAMCOUNT_TO_PROCEDURE case ER_WRONG_PARAMCOUNT_TO_PROCEDURE : return "42000"; #endif -#ifdef ER_UNKNOWN_TABLE +#ifdef ER_UNKNOWN_TABLE case ER_UNKNOWN_TABLE : return "42S02"; #endif -#ifdef ER_FIELD_SPECIFIED_TWICE +#ifdef ER_FIELD_SPECIFIED_TWICE case ER_FIELD_SPECIFIED_TWICE : return "42000"; #endif -#ifdef ER_UNSUPPORTED_EXTENSION +#ifdef ER_UNSUPPORTED_EXTENSION case ER_UNSUPPORTED_EXTENSION : return "42000"; #endif -#ifdef ER_TABLE_MUST_HAVE_COLUMNS +#ifdef ER_TABLE_MUST_HAVE_COLUMNS case ER_TABLE_MUST_HAVE_COLUMNS : return "42000"; #endif -#ifdef ER_UNKNOWN_CHARACTER_SET +#ifdef ER_UNKNOWN_CHARACTER_SET case ER_UNKNOWN_CHARACTER_SET : return "42000"; #endif -#ifdef ER_TOO_BIG_ROWSIZE +#ifdef ER_TOO_BIG_ROWSIZE case ER_TOO_BIG_ROWSIZE : return "42000"; #endif -#ifdef ER_WRONG_OUTER_JOIN +#ifdef ER_WRONG_OUTER_JOIN case ER_WRONG_OUTER_JOIN : return "42000"; #endif -#ifdef ER_NULL_COLUMN_IN_INDEX +#ifdef ER_NULL_COLUMN_IN_INDEX case ER_NULL_COLUMN_IN_INDEX : return "42000"; #endif -#ifdef ER_PASSWORD_ANONYMOUS_USER +#ifdef ER_PASSWORD_ANONYMOUS_USER case ER_PASSWORD_ANONYMOUS_USER : return "42000"; #endif -#ifdef ER_PASSWORD_NOT_ALLOWED +#ifdef ER_PASSWORD_NOT_ALLOWED case ER_PASSWORD_NOT_ALLOWED : return "42000"; #endif -#ifdef ER_PASSWORD_NO_MATCH +#ifdef ER_PASSWORD_NO_MATCH case ER_PASSWORD_NO_MATCH : return "42000"; #endif -#ifdef ER_WRONG_VALUE_COUNT_ON_ROW +#ifdef ER_WRONG_VALUE_COUNT_ON_ROW case ER_WRONG_VALUE_COUNT_ON_ROW : return "21S01"; #endif -#ifdef ER_INVALID_USE_OF_NULL +#ifdef ER_INVALID_USE_OF_NULL case ER_INVALID_USE_OF_NULL : return "22004"; #endif -#ifdef ER_REGEXP_ERROR +#ifdef ER_REGEXP_ERROR case ER_REGEXP_ERROR : return "42000"; #endif -#ifdef ER_MIX_OF_GROUP_FUNC_AND_FIELDS +#ifdef ER_MIX_OF_GROUP_FUNC_AND_FIELDS case ER_MIX_OF_GROUP_FUNC_AND_FIELDS : return "42000"; #endif -#ifdef ER_NONEXISTING_GRANT +#ifdef ER_NONEXISTING_GRANT case ER_NONEXISTING_GRANT : return "42000"; #endif -#ifdef ER_TABLEACCESS_DENIED_ERROR +#ifdef ER_TABLEACCESS_DENIED_ERROR case ER_TABLEACCESS_DENIED_ERROR : return "42000"; #endif -#ifdef ER_COLUMNACCESS_DENIED_ERROR +#ifdef ER_COLUMNACCESS_DENIED_ERROR case ER_COLUMNACCESS_DENIED_ERROR : return "42000"; #endif -#ifdef ER_ILLEGAL_GRANT_FOR_TABLE +#ifdef ER_ILLEGAL_GRANT_FOR_TABLE case ER_ILLEGAL_GRANT_FOR_TABLE : return "42000"; #endif -#ifdef ER_GRANT_WRONG_HOST_OR_USER +#ifdef ER_GRANT_WRONG_HOST_OR_USER case ER_GRANT_WRONG_HOST_OR_USER : return "42000"; #endif -#ifdef ER_NO_SUCH_TABLE +#ifdef ER_NO_SUCH_TABLE case ER_NO_SUCH_TABLE : return "42S02"; #endif -#ifdef ER_NONEXISTING_TABLE_GRANT +#ifdef ER_NONEXISTING_TABLE_GRANT case ER_NONEXISTING_TABLE_GRANT : return "42000"; #endif -#ifdef ER_NOT_ALLOWED_COMMAND +#ifdef ER_NOT_ALLOWED_COMMAND case ER_NOT_ALLOWED_COMMAND : return "42000"; #endif -#ifdef ER_SYNTAX_ERROR +#ifdef ER_SYNTAX_ERROR case ER_SYNTAX_ERROR : return "42000"; #endif -#ifdef ER_ABORTING_CONNECTION +#ifdef ER_ABORTING_CONNECTION case ER_ABORTING_CONNECTION : return "08S01"; #endif -#ifdef ER_NET_PACKET_TOO_LARGE +#ifdef ER_NET_PACKET_TOO_LARGE case ER_NET_PACKET_TOO_LARGE : return "08S01"; #endif -#ifdef ER_NET_READ_ERROR_FROM_PIPE +#ifdef ER_NET_READ_ERROR_FROM_PIPE case ER_NET_READ_ERROR_FROM_PIPE : return "08S01"; #endif -#ifdef ER_NET_FCNTL_ERROR +#ifdef ER_NET_FCNTL_ERROR case ER_NET_FCNTL_ERROR : return "08S01"; #endif -#ifdef ER_NET_PACKETS_OUT_OF_ORDER +#ifdef ER_NET_PACKETS_OUT_OF_ORDER case ER_NET_PACKETS_OUT_OF_ORDER : return "08S01"; #endif -#ifdef ER_NET_UNCOMPRESS_ERROR +#ifdef ER_NET_UNCOMPRESS_ERROR case ER_NET_UNCOMPRESS_ERROR : return "08S01"; #endif -#ifdef ER_NET_READ_ERROR +#ifdef ER_NET_READ_ERROR case ER_NET_READ_ERROR : return "08S01"; #endif -#ifdef ER_NET_READ_INTERRUPTED +#ifdef ER_NET_READ_INTERRUPTED case ER_NET_READ_INTERRUPTED : return "08S01"; #endif -#ifdef ER_NET_ERROR_ON_WRITE +#ifdef ER_NET_ERROR_ON_WRITE case ER_NET_ERROR_ON_WRITE : return "08S01"; #endif -#ifdef ER_NET_WRITE_INTERRUPTED +#ifdef ER_NET_WRITE_INTERRUPTED case ER_NET_WRITE_INTERRUPTED : return "08S01"; #endif -#ifdef ER_TOO_LONG_STRING +#ifdef ER_TOO_LONG_STRING case ER_TOO_LONG_STRING : return "42000"; #endif -#ifdef ER_TABLE_CANT_HANDLE_BLOB +#ifdef ER_TABLE_CANT_HANDLE_BLOB case ER_TABLE_CANT_HANDLE_BLOB : return "42000"; #endif -#ifdef ER_TABLE_CANT_HANDLE_AUTO_INCREMENT +#ifdef ER_TABLE_CANT_HANDLE_AUTO_INCREMENT case ER_TABLE_CANT_HANDLE_AUTO_INCREMENT : return "42000"; #endif -#ifdef ER_WRONG_COLUMN_NAME +#ifdef ER_WRONG_COLUMN_NAME case ER_WRONG_COLUMN_NAME : return "42000"; #endif -#ifdef ER_WRONG_KEY_COLUMN +#ifdef ER_WRONG_KEY_COLUMN case ER_WRONG_KEY_COLUMN : return "42000"; #endif -#ifdef ER_DUP_UNIQUE +#ifdef ER_DUP_UNIQUE case ER_DUP_UNIQUE : return "23000"; #endif -#ifdef ER_BLOB_KEY_WITHOUT_LENGTH +#ifdef ER_BLOB_KEY_WITHOUT_LENGTH case ER_BLOB_KEY_WITHOUT_LENGTH : return "42000"; #endif -#ifdef ER_PRIMARY_CANT_HAVE_NULL +#ifdef ER_PRIMARY_CANT_HAVE_NULL case ER_PRIMARY_CANT_HAVE_NULL : return "42000"; #endif -#ifdef ER_TOO_MANY_ROWS +#ifdef ER_TOO_MANY_ROWS case ER_TOO_MANY_ROWS : return "42000"; #endif -#ifdef ER_REQUIRES_PRIMARY_KEY +#ifdef ER_REQUIRES_PRIMARY_KEY case ER_REQUIRES_PRIMARY_KEY : return "42000"; #endif -#ifdef ER_KEY_DOES_NOT_EXITS +#ifdef ER_KEY_DOES_NOT_EXITS case ER_KEY_DOES_NOT_EXITS : return "42000"; #endif -#ifdef ER_CHECK_NO_SUCH_TABLE +#ifdef ER_CHECK_NO_SUCH_TABLE case ER_CHECK_NO_SUCH_TABLE : return "42000"; #endif -#ifdef ER_CHECK_NOT_IMPLEMENTED +#ifdef ER_CHECK_NOT_IMPLEMENTED case ER_CHECK_NOT_IMPLEMENTED : return "42000"; #endif -#ifdef ER_CANT_DO_THIS_DURING_AN_TRANSACTION +#ifdef ER_CANT_DO_THIS_DURING_AN_TRANSACTION case ER_CANT_DO_THIS_DURING_AN_TRANSACTION : return "25000"; #endif -#ifdef ER_NEW_ABORTING_CONNECTION +#ifdef ER_NEW_ABORTING_CONNECTION case ER_NEW_ABORTING_CONNECTION : return "08S01"; #endif -#ifdef ER_MASTER_NET_READ +#ifdef ER_MASTER_NET_READ case ER_MASTER_NET_READ : return "08S01"; #endif -#ifdef ER_MASTER_NET_WRITE +#ifdef ER_MASTER_NET_WRITE case ER_MASTER_NET_WRITE : return "08S01"; #endif -#ifdef ER_TOO_MANY_USER_CONNECTIONS +#ifdef ER_TOO_MANY_USER_CONNECTIONS case ER_TOO_MANY_USER_CONNECTIONS : return "42000"; #endif -#ifdef ER_READ_ONLY_TRANSACTION +#ifdef ER_READ_ONLY_TRANSACTION case ER_READ_ONLY_TRANSACTION : return "25000"; #endif -#ifdef ER_NO_PERMISSION_TO_CREATE_USER +#ifdef ER_NO_PERMISSION_TO_CREATE_USER case ER_NO_PERMISSION_TO_CREATE_USER : return "42000"; #endif -#ifdef ER_LOCK_DEADLOCK +#ifdef ER_LOCK_DEADLOCK case ER_LOCK_DEADLOCK : return "40001"; #endif -#ifdef ER_NO_REFERENCED_ROW +#ifdef ER_NO_REFERENCED_ROW case ER_NO_REFERENCED_ROW : return "23000"; #endif -#ifdef ER_ROW_IS_REFERENCED +#ifdef ER_ROW_IS_REFERENCED case ER_ROW_IS_REFERENCED : return "23000"; #endif -#ifdef ER_CONNECT_TO_MASTER +#ifdef ER_CONNECT_TO_MASTER case ER_CONNECT_TO_MASTER : return "08S01"; #endif -#ifdef ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT +#ifdef ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT case ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT : return "21000"; #endif -#ifdef ER_USER_LIMIT_REACHED +#ifdef ER_USER_LIMIT_REACHED case ER_USER_LIMIT_REACHED : return "42000"; #endif -#ifdef ER_SPECIFIC_ACCESS_DENIED_ERROR +#ifdef ER_SPECIFIC_ACCESS_DENIED_ERROR case ER_SPECIFIC_ACCESS_DENIED_ERROR : return "42000"; #endif -#ifdef ER_NO_DEFAULT +#ifdef ER_NO_DEFAULT case ER_NO_DEFAULT : return "42000"; #endif -#ifdef ER_WRONG_VALUE_FOR_VAR +#ifdef ER_WRONG_VALUE_FOR_VAR case ER_WRONG_VALUE_FOR_VAR : return "42000"; #endif -#ifdef ER_WRONG_TYPE_FOR_VAR +#ifdef ER_WRONG_TYPE_FOR_VAR case ER_WRONG_TYPE_FOR_VAR : return "42000"; #endif -#ifdef ER_CANT_USE_OPTION_HERE +#ifdef ER_CANT_USE_OPTION_HERE case ER_CANT_USE_OPTION_HERE : return "42000"; #endif -#ifdef ER_NOT_SUPPORTED_YET +#ifdef ER_NOT_SUPPORTED_YET case ER_NOT_SUPPORTED_YET : return "42000"; #endif -#ifdef ER_WRONG_FK_DEF +#ifdef ER_WRONG_FK_DEF case ER_WRONG_FK_DEF : return "42000"; #endif -#ifdef ER_OPERAND_COLUMNS +#ifdef ER_OPERAND_COLUMNS case ER_OPERAND_COLUMNS : return "21000"; #endif -#ifdef ER_SUBQUERY_NO_1_ROW +#ifdef ER_SUBQUERY_NO_1_ROW case ER_SUBQUERY_NO_1_ROW : return "21000"; #endif -#ifdef ER_ILLEGAL_REFERENCE +#ifdef ER_ILLEGAL_REFERENCE case ER_ILLEGAL_REFERENCE : return "42S22"; #endif -#ifdef ER_DERIVED_MUST_HAVE_ALIAS +#ifdef ER_DERIVED_MUST_HAVE_ALIAS case ER_DERIVED_MUST_HAVE_ALIAS : return "42000"; #endif -#ifdef ER_SELECT_REDUCED +#ifdef ER_SELECT_REDUCED case ER_SELECT_REDUCED : return "01000"; #endif -#ifdef ER_TABLENAME_NOT_ALLOWED_HERE +#ifdef ER_TABLENAME_NOT_ALLOWED_HERE case ER_TABLENAME_NOT_ALLOWED_HERE : return "42000"; #endif -#ifdef ER_NOT_SUPPORTED_AUTH_MODE +#ifdef ER_NOT_SUPPORTED_AUTH_MODE case ER_NOT_SUPPORTED_AUTH_MODE : return "08004"; #endif -#ifdef ER_SPATIAL_CANT_HAVE_NULL +#ifdef ER_SPATIAL_CANT_HAVE_NULL case ER_SPATIAL_CANT_HAVE_NULL : return "42000"; #endif -#ifdef ER_COLLATION_CHARSET_MISMATCH +#ifdef ER_COLLATION_CHARSET_MISMATCH case ER_COLLATION_CHARSET_MISMATCH : return "42000"; #endif -#ifdef ER_WARN_TOO_FEW_RECORDS +#ifdef ER_WARN_TOO_FEW_RECORDS case ER_WARN_TOO_FEW_RECORDS : return "01000"; #endif -#ifdef ER_WARN_TOO_MANY_RECORDS +#ifdef ER_WARN_TOO_MANY_RECORDS case ER_WARN_TOO_MANY_RECORDS : return "01000"; #endif -#ifdef ER_WARN_NULL_TO_NOTNULL +#ifdef ER_WARN_NULL_TO_NOTNULL case ER_WARN_NULL_TO_NOTNULL : return "22004"; #endif -#ifdef ER_WARN_DATA_OUT_OF_RANGE +#ifdef ER_WARN_DATA_OUT_OF_RANGE case ER_WARN_DATA_OUT_OF_RANGE : return "22003"; #endif -#ifdef ER_WRONG_NAME_FOR_INDEX +#ifdef ER_WRONG_NAME_FOR_INDEX case ER_WRONG_NAME_FOR_INDEX : return "42000"; #endif -#ifdef ER_WRONG_NAME_FOR_CATALOG +#ifdef ER_WRONG_NAME_FOR_CATALOG case ER_WRONG_NAME_FOR_CATALOG : return "42000"; #endif -#ifdef ER_UNKNOWN_STORAGE_ENGINE +#ifdef ER_UNKNOWN_STORAGE_ENGINE case ER_UNKNOWN_STORAGE_ENGINE : return "42000"; #endif -#ifdef ER_TRUNCATED_WRONG_VALUE +#ifdef ER_TRUNCATED_WRONG_VALUE case ER_TRUNCATED_WRONG_VALUE : return "22007"; #endif -#ifdef ER_SP_NO_RECURSIVE_CREATE +#ifdef ER_SP_NO_RECURSIVE_CREATE case ER_SP_NO_RECURSIVE_CREATE : return "2F003"; #endif -#ifdef ER_SP_ALREADY_EXISTS +#ifdef ER_SP_ALREADY_EXISTS case ER_SP_ALREADY_EXISTS : return "42000"; #endif -#ifdef ER_SP_DOES_NOT_EXIST +#ifdef ER_SP_DOES_NOT_EXIST case ER_SP_DOES_NOT_EXIST : return "42000"; #endif -#ifdef ER_SP_LILABEL_MISMATCH +#ifdef ER_SP_LILABEL_MISMATCH case ER_SP_LILABEL_MISMATCH : return "42000"; #endif -#ifdef ER_SP_LABEL_REDEFINE +#ifdef ER_SP_LABEL_REDEFINE case ER_SP_LABEL_REDEFINE : return "42000"; #endif -#ifdef ER_SP_LABEL_MISMATCH +#ifdef ER_SP_LABEL_MISMATCH case ER_SP_LABEL_MISMATCH : return "42000"; #endif -#ifdef ER_SP_UNINIT_VAR +#ifdef ER_SP_UNINIT_VAR case ER_SP_UNINIT_VAR : return "01000"; #endif -#ifdef ER_SP_BADSELECT +#ifdef ER_SP_BADSELECT case ER_SP_BADSELECT : return "0A000"; #endif -#ifdef ER_SP_BADRETURN +#ifdef ER_SP_BADRETURN case ER_SP_BADRETURN : return "42000"; #endif -#ifdef ER_SP_BADSTATEMENT +#ifdef ER_SP_BADSTATEMENT case ER_SP_BADSTATEMENT : return "0A000"; #endif -#ifdef ER_UPDATE_LOG_DEPRECATED_IGNORED +#ifdef ER_UPDATE_LOG_DEPRECATED_IGNORED case ER_UPDATE_LOG_DEPRECATED_IGNORED : return "42000"; #endif -#ifdef ER_UPDATE_LOG_DEPRECATED_TRANSLATED +#ifdef ER_UPDATE_LOG_DEPRECATED_TRANSLATED case ER_UPDATE_LOG_DEPRECATED_TRANSLATED : return "42000"; #endif -#ifdef ER_QUERY_INTERRUPTED +#ifdef ER_QUERY_INTERRUPTED case ER_QUERY_INTERRUPTED : return "70100"; #endif -#ifdef ER_SP_WRONG_NO_OF_ARGS +#ifdef ER_SP_WRONG_NO_OF_ARGS case ER_SP_WRONG_NO_OF_ARGS : return "42000"; #endif -#ifdef ER_SP_COND_MISMATCH +#ifdef ER_SP_COND_MISMATCH case ER_SP_COND_MISMATCH : return "42000"; #endif -#ifdef ER_SP_NORETURN +#ifdef ER_SP_NORETURN case ER_SP_NORETURN : return "42000"; #endif -#ifdef ER_SP_NORETURNEND +#ifdef ER_SP_NORETURNEND case ER_SP_NORETURNEND : return "2F005"; #endif -#ifdef ER_SP_BAD_CURSOR_QUERY +#ifdef ER_SP_BAD_CURSOR_QUERY case ER_SP_BAD_CURSOR_QUERY : return "42000"; #endif -#ifdef ER_SP_BAD_CURSOR_SELECT +#ifdef ER_SP_BAD_CURSOR_SELECT case ER_SP_BAD_CURSOR_SELECT : return "42000"; #endif -#ifdef ER_SP_CURSOR_MISMATCH +#ifdef ER_SP_CURSOR_MISMATCH case ER_SP_CURSOR_MISMATCH : return "42000"; #endif -#ifdef ER_SP_CURSOR_ALREADY_OPEN +#ifdef ER_SP_CURSOR_ALREADY_OPEN case ER_SP_CURSOR_ALREADY_OPEN : return "24000"; #endif -#ifdef ER_SP_CURSOR_NOT_OPEN +#ifdef ER_SP_CURSOR_NOT_OPEN case ER_SP_CURSOR_NOT_OPEN : return "24000"; #endif -#ifdef ER_SP_UNDECLARED_VAR +#ifdef ER_SP_UNDECLARED_VAR case ER_SP_UNDECLARED_VAR : return "42000"; #endif -#ifdef ER_SP_FETCH_NO_DATA +#ifdef ER_SP_FETCH_NO_DATA case ER_SP_FETCH_NO_DATA : return "02000"; #endif -#ifdef ER_SP_DUP_PARAM +#ifdef ER_SP_DUP_PARAM case ER_SP_DUP_PARAM : return "42000"; #endif -#ifdef ER_SP_DUP_VAR +#ifdef ER_SP_DUP_VAR case ER_SP_DUP_VAR : return "42000"; #endif -#ifdef ER_SP_DUP_COND +#ifdef ER_SP_DUP_COND case ER_SP_DUP_COND : return "42000"; #endif -#ifdef ER_SP_DUP_CURS +#ifdef ER_SP_DUP_CURS case ER_SP_DUP_CURS : return "42000"; #endif -#ifdef ER_SP_SUBSELECT_NYI +#ifdef ER_SP_SUBSELECT_NYI case ER_SP_SUBSELECT_NYI : return "0A000"; #endif -#ifdef ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG +#ifdef ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG case ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG : return "0A000"; #endif -#ifdef ER_SP_VARCOND_AFTER_CURSHNDLR +#ifdef ER_SP_VARCOND_AFTER_CURSHNDLR case ER_SP_VARCOND_AFTER_CURSHNDLR : return "42000"; #endif -#ifdef ER_SP_CURSOR_AFTER_HANDLER +#ifdef ER_SP_CURSOR_AFTER_HANDLER case ER_SP_CURSOR_AFTER_HANDLER : return "42000"; #endif -#ifdef ER_SP_CASE_NOT_FOUND +#ifdef ER_SP_CASE_NOT_FOUND case ER_SP_CASE_NOT_FOUND : return "20000"; #endif -#ifdef ER_DIVISION_BY_ZERO +#ifdef ER_DIVISION_BY_ZERO case ER_DIVISION_BY_ZERO : return "22012"; #endif -#ifdef ER_ILLEGAL_VALUE_FOR_TYPE +#ifdef ER_ILLEGAL_VALUE_FOR_TYPE case ER_ILLEGAL_VALUE_FOR_TYPE : return "22007"; #endif -#ifdef ER_PROCACCESS_DENIED_ERROR +#ifdef ER_PROCACCESS_DENIED_ERROR case ER_PROCACCESS_DENIED_ERROR : return "42000"; #endif -#ifdef ER_XAER_NOTA +#ifdef ER_XAER_NOTA case ER_XAER_NOTA : return "XAE04"; #endif -#ifdef ER_XAER_INVAL +#ifdef ER_XAER_INVAL case ER_XAER_INVAL : return "XAE05"; #endif -#ifdef ER_XAER_RMFAIL +#ifdef ER_XAER_RMFAIL case ER_XAER_RMFAIL : return "XAE07"; #endif -#ifdef ER_XAER_OUTSIDE +#ifdef ER_XAER_OUTSIDE case ER_XAER_OUTSIDE : return "XAE09"; #endif -#ifdef ER_XAER_RMERR +#ifdef ER_XAER_RMERR case ER_XAER_RMERR : return "XAE03"; #endif -#ifdef ER_XA_RBROLLBACK +#ifdef ER_XA_RBROLLBACK case ER_XA_RBROLLBACK : return "XA100"; #endif -#ifdef ER_NONEXISTING_PROC_GRANT +#ifdef ER_NONEXISTING_PROC_GRANT case ER_NONEXISTING_PROC_GRANT : return "42000"; #endif -#ifdef ER_DATA_TOO_LONG +#ifdef ER_DATA_TOO_LONG case ER_DATA_TOO_LONG : return "22001"; #endif -#ifdef ER_SP_BAD_SQLSTATE +#ifdef ER_SP_BAD_SQLSTATE case ER_SP_BAD_SQLSTATE : return "42000"; #endif -#ifdef ER_CANT_CREATE_USER_WITH_GRANT +#ifdef ER_CANT_CREATE_USER_WITH_GRANT case ER_CANT_CREATE_USER_WITH_GRANT : return "42000"; #endif -#ifdef ER_SP_DUP_HANDLER +#ifdef ER_SP_DUP_HANDLER case ER_SP_DUP_HANDLER : return "42000"; #endif -#ifdef ER_SP_NOT_VAR_ARG +#ifdef ER_SP_NOT_VAR_ARG case ER_SP_NOT_VAR_ARG : return "42000"; #endif -#ifdef ER_SP_NO_RETSET +#ifdef ER_SP_NO_RETSET case ER_SP_NO_RETSET : return "0A000"; #endif -#ifdef ER_CANT_CREATE_GEOMETRY_OBJECT +#ifdef ER_CANT_CREATE_GEOMETRY_OBJECT case ER_CANT_CREATE_GEOMETRY_OBJECT : return "22003"; #endif -#ifdef ER_TOO_BIG_SCALE +#ifdef ER_TOO_BIG_SCALE case ER_TOO_BIG_SCALE : return "42000"; #endif -#ifdef ER_TOO_BIG_PRECISION +#ifdef ER_TOO_BIG_PRECISION case ER_TOO_BIG_PRECISION : return "42000"; #endif -#ifdef ER_M_BIGGER_THAN_D +#ifdef ER_M_BIGGER_THAN_D case ER_M_BIGGER_THAN_D : return "42000"; #endif -#ifdef ER_TOO_LONG_BODY +#ifdef ER_TOO_LONG_BODY case ER_TOO_LONG_BODY : return "42000"; #endif -#ifdef ER_TOO_BIG_DISPLAYWIDTH +#ifdef ER_TOO_BIG_DISPLAYWIDTH case ER_TOO_BIG_DISPLAYWIDTH : return "42000"; #endif -#ifdef ER_XAER_DUPID +#ifdef ER_XAER_DUPID case ER_XAER_DUPID : return "XAE08"; #endif -#ifdef ER_DATETIME_FUNCTION_OVERFLOW +#ifdef ER_DATETIME_FUNCTION_OVERFLOW case ER_DATETIME_FUNCTION_OVERFLOW : return "22008"; #endif -#ifdef ER_ROW_IS_REFERENCED_2 +#ifdef ER_ROW_IS_REFERENCED_2 case ER_ROW_IS_REFERENCED_2 : return "23000"; #endif -#ifdef ER_NO_REFERENCED_ROW_2 +#ifdef ER_NO_REFERENCED_ROW_2 case ER_NO_REFERENCED_ROW_2 : return "23000"; #endif -#ifdef ER_SP_BAD_VAR_SHADOW +#ifdef ER_SP_BAD_VAR_SHADOW case ER_SP_BAD_VAR_SHADOW : return "42000"; #endif -#ifdef ER_SP_WRONG_NAME +#ifdef ER_SP_WRONG_NAME case ER_SP_WRONG_NAME : return "42000"; #endif -#ifdef ER_SP_NO_AGGREGATE +#ifdef ER_SP_NO_AGGREGATE case ER_SP_NO_AGGREGATE : return "42000"; #endif -#ifdef ER_MAX_PREPARED_STMT_COUNT_REACHED +#ifdef ER_MAX_PREPARED_STMT_COUNT_REACHED case ER_MAX_PREPARED_STMT_COUNT_REACHED : return "42000"; #endif -#ifdef ER_NON_GROUPING_FIELD_USED +#ifdef ER_NON_GROUPING_FIELD_USED case ER_NON_GROUPING_FIELD_USED : return "42000"; #endif -#ifdef ER_FOREIGN_DUPLICATE_KEY +#ifdef ER_FOREIGN_DUPLICATE_KEY case ER_FOREIGN_DUPLICATE_KEY : return "23000"; #endif -#ifdef ER_CANT_CHANGE_TX_ISOLATION +#ifdef ER_CANT_CHANGE_TX_ISOLATION case ER_CANT_CHANGE_TX_ISOLATION : return "25001"; #endif -#ifdef ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +#ifdef ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT case ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT : return "42000"; #endif -#ifdef ER_WRONG_PARAMETERS_TO_NATIVE_FCT +#ifdef ER_WRONG_PARAMETERS_TO_NATIVE_FCT case ER_WRONG_PARAMETERS_TO_NATIVE_FCT : return "42000"; #endif -#ifdef ER_WRONG_PARAMETERS_TO_STORED_FCT +#ifdef ER_WRONG_PARAMETERS_TO_STORED_FCT case ER_WRONG_PARAMETERS_TO_STORED_FCT : return "42000"; #endif -#ifdef ER_DUP_ENTRY_WITH_KEY_NAME +#ifdef ER_DUP_ENTRY_WITH_KEY_NAME case ER_DUP_ENTRY_WITH_KEY_NAME : return "23000"; #endif -#ifdef ER_XA_RBTIMEOUT +#ifdef ER_XA_RBTIMEOUT case ER_XA_RBTIMEOUT : return "XA106"; #endif -#ifdef ER_XA_RBDEADLOCK +#ifdef ER_XA_RBDEADLOCK case ER_XA_RBDEADLOCK : return "XA102"; #endif -#ifdef ER_FUNC_INEXISTENT_NAME_COLLISION +#ifdef ER_FUNC_INEXISTENT_NAME_COLLISION case ER_FUNC_INEXISTENT_NAME_COLLISION : return "42000"; #endif -#ifdef ER_DUP_SIGNAL_SET +#ifdef ER_DUP_SIGNAL_SET case ER_DUP_SIGNAL_SET : return "42000"; #endif -#ifdef ER_SIGNAL_WARN +#ifdef ER_SIGNAL_WARN case ER_SIGNAL_WARN : return "01000"; #endif -#ifdef ER_SIGNAL_NOT_FOUND +#ifdef ER_SIGNAL_NOT_FOUND case ER_SIGNAL_NOT_FOUND : return "02000"; #endif -#ifdef ER_SIGNAL_EXCEPTION +#ifdef ER_SIGNAL_EXCEPTION case ER_SIGNAL_EXCEPTION : return "HY000"; #endif -#ifdef ER_RESIGNAL_WITHOUT_ACTIVE_HANDLER +#ifdef ER_RESIGNAL_WITHOUT_ACTIVE_HANDLER case ER_RESIGNAL_WITHOUT_ACTIVE_HANDLER : return "0K000"; #endif -#ifdef ER_SPATIAL_MUST_HAVE_GEOM_COL +#ifdef ER_SPATIAL_MUST_HAVE_GEOM_COL case ER_SPATIAL_MUST_HAVE_GEOM_COL : return "42000"; #endif -#ifdef ER_DATA_OUT_OF_RANGE +#ifdef ER_DATA_OUT_OF_RANGE case ER_DATA_OUT_OF_RANGE : return "22003"; #endif diff --git a/ext/pdo_mysql/tests/bug54929.phpt b/ext/pdo_mysql/tests/bug54929.phpt index 84b9e7d04f..0a111d8935 100644 --- a/ext/pdo_mysql/tests/bug54929.phpt +++ b/ext/pdo_mysql/tests/bug54929.phpt @@ -54,7 +54,7 @@ array(3) { [1]=> int(1064) [2]=> - string(149) "You have an error in your SQL syntax; check the manual that corresponds to your %s server version for the right syntax to use near '--'' at line 1" + string(%d) "You have an error in your SQL syntax; check the manual that corresponds to your %s server version for the right syntax to use near '--'' at line 1" } array(1) { ["f1"]=> diff --git a/ext/pdo_mysql/tests/bug63176.phpt b/ext/pdo_mysql/tests/bug63176.phpt index ee928c093d..c5be644450 100644 --- a/ext/pdo_mysql/tests/bug63176.phpt +++ b/ext/pdo_mysql/tests/bug63176.phpt @@ -47,8 +47,8 @@ object(ModelA)#%d (1) { } object(ModelA)#%d (1) { ["db"]=> - object(PDO2)#%d (1) { - ["transLevel":protected]=> + object(PDO3)#%d (1) { + ["tomato":protected]=> NULL } } diff --git a/ext/pdo_mysql/tests/bug70272.phpt b/ext/pdo_mysql/tests/bug70272.phpt new file mode 100644 index 0000000000..cd9b9d7da2 --- /dev/null +++ b/ext/pdo_mysql/tests/bug70272.phpt @@ -0,0 +1,31 @@ +--TEST-- +Bug #70272 (Segfault in pdo_mysql) +--SKIPIF-- +<?php +require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'skipif.inc'); +require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc'); +MySQLPDOTest::skip(); +?> +--INI-- +report_memleaks=off +--FILE-- +<?php +$a = new Stdclass(); +$a->a = &$a; +require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc'); + +$dummy = new StdClass(); + +$db = PDOTest::test_factory(dirname(__FILE__) . '/common.phpt'); +$dummy = NULL; + +$a->c = $db; +$a->b = $db->prepare("select 1"); +$a->d = $db->prepare("select 2"); +$a->e = $db->prepare("select 3"); +$a->f = $db->prepare("select 4"); +gc_disable(); +?> +okey +--EXPECT-- +okey diff --git a/ext/pdo_mysql/tests/bug70862.phpt b/ext/pdo_mysql/tests/bug70862.phpt new file mode 100644 index 0000000000..4a3a618854 --- /dev/null +++ b/ext/pdo_mysql/tests/bug70862.phpt @@ -0,0 +1,46 @@ +--TEST-- +MySQL Prepared Statements and BLOBs +--SKIPIF-- +<?php +require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'skipif.inc'); +require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc'); +MySQLPDOTest::skip(); +?> +--FILE-- +<?php + require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc'); + $db = MySQLPDOTest::factory(); + + $db->exec('DROP TABLE IF EXISTS test'); + $db->exec(sprintf('CREATE TABLE test(id INT, label BLOB)')); + + $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 0); + $db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, true); + + class HelloWrapper { + public function stream_open() { return true; } + public function stream_eof() { return true; } + public function stream_read() { return NULL; } + public function stream_stat() { return array(); } + } + stream_wrapper_register("hello", "HelloWrapper"); + + $f = fopen("hello://there", "r"); + + $stmt = $db->prepare('INSERT INTO test(id, label) VALUES (1, :para)'); + $stmt->bindParam(":para", $f, PDO::PARAM_LOB); + $stmt->execute(); + + var_dump($f); + + print "done!"; +?> +--CLEAN-- +<?php +require dirname(__FILE__) . '/mysql_pdo_test.inc'; +$db = MySQLPDOTest::factory(); +$db->exec('DROP TABLE IF EXISTS test'); +?> +--EXPECTF-- +string(0) "" +done! diff --git a/ext/pdo_mysql/tests/bug_37445.phpt b/ext/pdo_mysql/tests/bug_37445.phpt index 8e915332d4..c9400717b4 100644 --- a/ext/pdo_mysql/tests/bug_37445.phpt +++ b/ext/pdo_mysql/tests/bug_37445.phpt @@ -17,4 +17,7 @@ $stmt = $db->prepare("SELECT 1"); $stmt->bindParam(':a', 'b'); ?> --EXPECTF-- -Fatal error: Cannot pass parameter 2 by reference in %sbug_37445.php on line %d +Fatal error: Uncaught Error: Cannot pass parameter 2 by reference in %sbug_37445.php:%d +Stack trace: +#0 {main} + thrown in %sbug_37445.php on line %d diff --git a/ext/pdo_mysql/tests/config.inc b/ext/pdo_mysql/tests/config.inc index 2530442c0e..f5ea020b78 100644 --- a/ext/pdo_mysql/tests/config.inc +++ b/ext/pdo_mysql/tests/config.inc @@ -49,4 +49,4 @@ if (!function_exists('sys_get_temp_dir')) { return FALSE; } } -?>
\ No newline at end of file +?> diff --git a/ext/pdo_mysql/tests/pdo_mysql___construct.phpt b/ext/pdo_mysql/tests/pdo_mysql___construct.phpt index 0cabfe6aa3..219678c671 100644 --- a/ext/pdo_mysql/tests/pdo_mysql___construct.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql___construct.phpt @@ -28,8 +28,11 @@ MySQLPDOTest::skip(); try { - if (NULL !== ($db = @new PDO())) - printf("[001] Too few parameters\n"); + try { + if (NULL !== ($db = @new PDO())) + printf("[001] Too few parameters\n"); + } catch (TypeError $ex) { + } print tryandcatch(2, '$db = new PDO(chr(0));'); print tryandcatch(3, '$db = new PDO("a" . chr(0) . "b");'); diff --git a/ext/pdo_mysql/tests/pdo_mysql___construct_options.phpt b/ext/pdo_mysql/tests/pdo_mysql___construct_options.phpt index 8cd028fc53..62051d7ae2 100644 --- a/ext/pdo_mysql/tests/pdo_mysql___construct_options.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql___construct_options.phpt @@ -67,8 +67,11 @@ MySQLPDOTest::skip(); PDO::MYSQL_ATTR_INIT_COMMAND => '', ); - if (NULL !== ($db = @new PDO($dsn, $user, $pass, 'wrong type'))) - printf("[001] Expecting NULL got %s/%s\n", gettype($db), $db); + try { + if (NULL !== ($db = @new PDO($dsn, $user, $pass, 'wrong type'))) + printf("[001] Expecting NULL got %s/%s\n", gettype($db), $db); + } catch (TypeError $e) { + } if (!is_object($db = new PDO($dsn, $user, $pass, array()))) printf("[002] Expecting object got %s/%s¸\n", gettype($db), $db); diff --git a/ext/pdo_mysql/tests/pdo_mysql___construct_uri-win32.phpt b/ext/pdo_mysql/tests/pdo_mysql___construct_uri-win32.phpt new file mode 100644 index 0000000000..b4609b1629 --- /dev/null +++ b/ext/pdo_mysql/tests/pdo_mysql___construct_uri-win32.phpt @@ -0,0 +1,79 @@ +--TEST-- +MySQL PDO->__construct() - URI +--SKIPIF-- +<?php +if (substr(PHP_OS, 0, 3) != 'WIN') { + die('skip only for Windows'); +} +require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'skipif.inc'); +require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc'); +MySQLPDOTest::skip(); +?> +--FILE-- +<?php + require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc'); + + try { + + if ($tmp = MySQLPDOTest::getTempDir()) { + + $file = $tmp . DIRECTORY_SEPARATOR . 'pdomuri.tst'; + $dsn = MySQLPDOTest::getDSN(); + $user = PDO_MYSQL_TEST_USER; + $pass = PDO_MYSQL_TEST_PASS; + $uri = sprintf('uri:file:%s', $file); + + if ($fp = @fopen($file, 'w')) { + // ok, great we can create a file with a DSN in it + fwrite($fp, $dsn); + fclose($fp); + clearstatcache(); + assert(file_exists($file)); + try { + $db = new PDO($uri, $user, $pass); + } catch (PDOException $e) { + printf("[002] URI=%s, DSN=%s, File=%s (%d bytes, '%s'), %s\n", + $uri, $dsn, + $file, filesize($file), file_get_contents($file), + $e->getMessage()); + } + unlink($file); + } + + if ($fp = @fopen($file, 'w')) { + fwrite($fp, sprintf('mysql:dbname=letshopeinvalid;%s%s', + chr(0), $dsn)); + fclose($fp); + clearstatcache(); + assert(file_exists($file)); + try { + $db = new PDO($uri, $user, $pass); + } catch (PDOException $e) { + printf("[003] URI=%s, DSN=%s, File=%s (%d bytes, '%s'), chr(0) test, %s\n", + $uri, $dsn, + $file, filesize($file), file_get_contents($file), + $e->getMessage()); + } + unlink($file); + } + + } + + /* TODO: safe mode */ + + } catch (PDOException $e) { + printf("[001] %s, [%s] %s\n", + $e->getMessage(), + (is_object($db)) ? $db->errorCode() : 'n/a', + (is_object($db)) ? implode(' ', $db->errorInfo()) : 'n/a'); + } + + print "done!"; +?> +--EXPECTF-- +Warning: PDO::__construct(file:%spdomuri.tst): failed to open stream: Invalid argument in %s on line %d +[002] URI=uri:file:%spdomuri.tst, DSN=mysql%sdbname=%s, File=%spdomuri.tst (%d bytes, 'mysql%sdbname=%s'), invalid data source URI + +Warning: PDO::__construct(file:%spdomuri.tst): failed to open stream: Invalid argument in %s on line %d +[003] URI=uri:file:%spdomuri.tst, DSN=mysql%sdbname=%s, File=%spdomuri.tst (%d bytes, 'mysql%sdbname=letshopeinvalid%s'), chr(0) test, invalid data source URI +done! diff --git a/ext/pdo_mysql/tests/pdo_mysql___construct_uri.phpt b/ext/pdo_mysql/tests/pdo_mysql___construct_uri.phpt index 7e92ff2e9a..0b1cf3fe65 100644 --- a/ext/pdo_mysql/tests/pdo_mysql___construct_uri.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql___construct_uri.phpt @@ -2,6 +2,9 @@ MySQL PDO->__construct() - URI --SKIPIF-- <?php +if (substr(PHP_OS, 0, 3) == 'WIN') { + die('skip not for Windows'); +} require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'skipif.inc'); require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc'); MySQLPDOTest::skip(); @@ -68,9 +71,9 @@ MySQLPDOTest::skip(); print "done!"; ?> --EXPECTF-- -Warning: PDO::__construct(%s +Warning: PDO::__construct(file:/tmp/pdomuri.tst): failed to open stream: No such file or directory in %s on line %d [002] URI=uri:file:%spdomuri.tst, DSN=mysql%sdbname=%s, File=%spdomuri.tst (%d bytes, 'mysql%sdbname=%s'), invalid data source URI -Warning: PDO::__construct(%s +Warning: PDO::__construct(file:/tmp/pdomuri.tst): failed to open stream: No such file or directory in %s on line %d [003] URI=uri:file:%spdomuri.tst, DSN=mysql%sdbname=%s, File=%spdomuri.tst (%d bytes, 'mysql%sdbname=letshopeinvalid%s'), chr(0) test, invalid data source URI done! diff --git a/ext/pdo_mysql/tests/pdo_mysql_attr_statement_class.phpt b/ext/pdo_mysql/tests/pdo_mysql_attr_statement_class.phpt index 631a918dd0..fb336ba627 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_attr_statement_class.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_attr_statement_class.phpt @@ -152,4 +152,8 @@ array(1) { } } -Fatal error: Cannot instantiate abstract class mystatement6 in %s on line %d
\ No newline at end of file +Fatal error: Uncaught Error: Cannot instantiate abstract class mystatement6 in %s:%d +Stack trace: +#0 %s(%d): PDO->query('SELECT id, labe...') +#1 {main} + thrown in %s on line %d
\ No newline at end of file diff --git a/ext/pdo_mysql/tests/pdo_mysql_connect_charset.phpt b/ext/pdo_mysql/tests/pdo_mysql_connect_charset.phpt index 22d36183cb..fb7e9a9d0a 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_connect_charset.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_connect_charset.phpt @@ -30,4 +30,4 @@ MySQLPDOTest::skip(); }
?>
--EXPECTF--
-done!
\ No newline at end of file +done!
diff --git a/ext/pdo_mysql/tests/pdo_mysql_get_attribute.phpt b/ext/pdo_mysql/tests/pdo_mysql_get_attribute.phpt index c992d3acf9..49bd5551ac 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_get_attribute.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_get_attribute.phpt @@ -102,5 +102,4 @@ require dirname(__FILE__) . '/mysql_pdo_test.inc'; MySQLPDOTest::dropTestTable(); ?> --EXPECTF-- -[001] Call to PDO::setAttribute(int attribute, mixed value) has changed the type of value from integer to boolean, test will not work properly -done!
\ No newline at end of file +done! diff --git a/ext/pdo_mysql/tests/pdo_mysql_prepare_native_clear_error.phpt b/ext/pdo_mysql/tests/pdo_mysql_prepare_native_clear_error.phpt index 224684b878..140359afc1 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_prepare_native_clear_error.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_prepare_native_clear_error.phpt @@ -93,4 +93,7 @@ array(1) { Warning: PDO::prepare(): SQLSTATE[42S22]: Column not found: 1054 Unknown column 'unknown_column' in 'field list' in %s on line %d -Fatal error: Call to a member function execute() on boolean in %s on line %d +Fatal error: Uncaught Error: Call to a member function execute() on boolean in %s:%d +Stack trace: +#0 {main} + thrown in %s on line %d diff --git a/ext/pdo_mysql/tests/pdo_mysql_prepare_native_mixed_style.phpt b/ext/pdo_mysql/tests/pdo_mysql_prepare_native_mixed_style.phpt index b7b0ab6294..ad710dcc15 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_prepare_native_mixed_style.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_prepare_native_mixed_style.phpt @@ -36,4 +36,7 @@ Warning: PDO::prepare(): SQLSTATE[HY093]: Invalid parameter number: mixed named Warning: PDO::prepare(): SQLSTATE[HY093]: Invalid parameter number in %s on line %d -Fatal error: Call to a member function execute() on boolean in %s on line %d +Fatal error: Uncaught Error: Call to a member function execute() on boolean in %s:%d +Stack trace: +#0 {main} + thrown in %s on line %d diff --git a/ext/pdo_mysql/tests/pdo_mysql_stmt_errorcode.phpt b/ext/pdo_mysql/tests/pdo_mysql_stmt_errorcode.phpt index c16ce5dd1c..0e27b0119c 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_stmt_errorcode.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_stmt_errorcode.phpt @@ -56,4 +56,7 @@ Testing native PS... Warning: PDO::prepare(): SQLSTATE[42S02]: Base table or view not found: 1146 Table '%s.ihopeitdoesnotexist' doesn't exist in %s on line %d -Fatal error: Call to a member function execute() on boolean in %s on line %d +Fatal error: Uncaught Error: Call to a member function execute() on boolean in %s:%d +Stack trace: +#0 {main} + thrown in %s on line %d diff --git a/ext/pdo_mysql/tests/pdo_mysql_stmt_getcolumnmeta.phpt b/ext/pdo_mysql/tests/pdo_mysql_stmt_getcolumnmeta.phpt index d2097f1162..72b53156a2 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_stmt_getcolumnmeta.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_stmt_getcolumnmeta.phpt @@ -38,7 +38,7 @@ try { if (false !== ($tmp = @$stmt->getColumnMeta(-1))) printf("[004] Expecting false got %s\n", var_export($tmp, true)); - // Warning: PDOStatement::getColumnMeta() expects parameter 1 to be long, array given in + // Warning: PDOStatement::getColumnMeta() expects parameter 1 to be integer, array given in if (false !== ($tmp = @$stmt->getColumnMeta(array()))) printf("[005] Expecting false got %s\n", var_export($tmp, true)); diff --git a/ext/pdo_mysql/tests/pdo_mysql_stmt_multiquery.phpt b/ext/pdo_mysql/tests/pdo_mysql_stmt_multiquery.phpt index 52ecc912d4..db92e40a93 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_stmt_multiquery.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_stmt_multiquery.phpt @@ -99,4 +99,8 @@ Native Prepared Statements... Warning: PDO::query(): SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your %s server version for the right syntax to use near '%SSELECT label FROM test ORDER BY id ASC LIMIT 1' at line %d in %s on line %d -Fatal error: Call to a member function errorInfo() on boolean in %s on line %d +Fatal error: Uncaught Error: Call to a member function errorInfo() on boolean in %s:%d +Stack trace: +#0 %s(%d): mysql_stmt_multiquery_wrong_usage(Object(PDO)) +#1 {main} + thrown in %s on line %d
\ No newline at end of file |