30#ifndef PDO_USE_MYSQLND
31#include <mysqld_error.h>
36# define pdo_mysql_init(persistent) mysqlnd_init(MYSQLND_CLIENT_NO_FLAG, persistent)
38# define pdo_mysql_init(persistent) mysql_init(NULL)
49 PDO_DBG_ENTER(
"_pdo_mysql_error");
50 PDO_DBG_INF_FMT(
"file=%s line=%d",
file,
line);
78 "Cannot execute queries while there are pending result sets. "
79 "Consider unsetting the previous PDOStatement or calling "
80 "PDOStatement::closeCursor()",
84 "Cannot execute queries while other unbuffered queries are active. "
85 "Consider using PDOStatement::fetchAll(). Alternatively, if your code "
86 "is only ever going to run against mysql, you may enable query "
87 "buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.",
90 }
else if (einfo->
errcode == 2057) {
92 "A stored procedure returning result sets of different size was called. "
93 "This is not supported by libmysql",
115 PDO_DBG_INF(
"Throwing exception");
129 PDO_DBG_ENTER(
"pdo_mysql_fetch_error_func");
130 PDO_DBG_INF_FMT(
"dbh=%p stmt=%p", dbh, stmt);
148static void mysql_handle_closer(
pdo_dbh_t *dbh)
152 PDO_DBG_ENTER(
"mysql_handle_closer");
153 PDO_DBG_INF_FMT(
"dbh=%p", dbh);
159 if (
H->einfo.errmsg) {
160 pefree(
H->einfo.errmsg, dbh->is_persistent);
161 H->einfo.errmsg =
NULL;
164 dbh->driver_data =
NULL;
178 PDO_DBG_ENTER(
"mysql_handle_preparer");
179 PDO_DBG_INF_FMT(
"dbh=%p", dbh);
183 stmt->driver_data =
S;
186 if (
H->emulate_prepare) {
191 if (server_version < 40100) {
200 }
else if (
ret == -1) {
202 strcpy(dbh->error_code, stmt->error_code);
209 zend_string_release(nsql);
216 zend_string_release(nsql);
229 zend_string_release(nsql);
235#ifdef PDO_USE_MYSQLND
238 S->params =
ecalloc(
S->num_params,
sizeof(MYSQL_BIND));
243 dbh->alloc_own_columns = 1;
261 PDO_DBG_ENTER(
"mysql_handle_doer");
262 PDO_DBG_INF_FMT(
"dbh=%p", dbh);
297 PDO_DBG_ENTER(
"pdo_mysql_last_insert_id");
302#if defined(PDO_USE_MYSQLND) || MYSQL_VERSION_ID < 50707 || defined(MARIADB_BASE_VERSION)
303# define mysql_real_escape_string_quote(mysql, to, from, length, quote) \
304 mysql_real_escape_string(mysql, to, from, length)
311 bool use_national_character_set = 0;
318 if (
H->assume_national_character_set_strings) {
319 use_national_character_set = 1;
322 use_national_character_set = 1;
325 use_national_character_set = 0;
329 PDO_DBG_ENTER(
"mysql_handle_quoter");
330 PDO_DBG_INF_FMT(
"dbh=%p", dbh);
331 PDO_DBG_INF_FMT(
"unquoted=%.*s", (
int)
ZSTR_LEN(unquoted),
ZSTR_VAL(unquoted));
334 3 + (use_national_character_set ? 1 : 0) + (use_binary ? 7 : 0),
false);
335 char *quoted =
ZSTR_VAL(quoted_str);
337 if (use_national_character_set) {
343 }
else if (use_binary) {
345 memcpy(quoted,
"_binary'", 8);
353 quoted[++quotedlen] =
'\'';
354 quoted[++quotedlen] =
'\0';
355 PDO_DBG_INF_FMT(
"quoted=%.*s", (
int)quotedlen, quoted);
357 quoted_str = zend_string_truncate(quoted_str, quotedlen,
false);
364static bool mysql_handle_begin(
pdo_dbh_t *dbh)
369 PDO_DBG_ENTER(
"mysql_handle_begin");
370 PDO_DBG_INF_FMT(
"dbh=%p", dbh);
380static bool mysql_handle_commit(
pdo_dbh_t *dbh)
382 PDO_DBG_ENTER(
"mysql_handle_commit");
383 PDO_DBG_INF_FMT(
"dbh=%p", dbh);
393static bool mysql_handle_rollback(
pdo_dbh_t *dbh)
395 PDO_DBG_ENTER(
"mysql_handle_rollback");
396 PDO_DBG_INF_FMT(
"dbh=%p", dbh);
406static inline int mysql_handle_autocommit(
pdo_dbh_t *dbh)
408 PDO_DBG_ENTER(
"mysql_handle_autocommit");
409 PDO_DBG_INF_FMT(
"dbh=%p", dbh);
410 PDO_DBG_INF_FMT(
"dbh->autocommit=%d", dbh->
auto_commit);
424 PDO_DBG_ENTER(
"pdo_mysql_set_attribute");
425 PDO_DBG_INF_FMT(
"dbh=%p", dbh);
436 if (!mysql_handle_autocommit(dbh)) {
473#ifdef PDO_USE_MYSQLND
478 unsigned int int_and_float_native = !bval;
512 PDO_DBG_ENTER(
"pdo_mysql_get_attribute");
513 PDO_DBG_INF_FMT(
"dbh=%p", dbh);
528#ifdef PDO_USE_MYSQLND
535 if ((tmp = (
char *)mysql_stat(
H->server))) {
562#ifndef PDO_USE_MYSQLND
572#if (MYSQL_VERSION_ID >= 80021 && !defined(MARIADB_BASE_VERSION)) || defined(PDO_USE_MYSQLND)
573 case PDO_MYSQL_ATTR_LOCAL_INFILE_DIRECTORY:
576#ifdef PDO_USE_MYSQLND
607 PDO_DBG_ENTER(
"pdo_mysql_check_liveness");
608 PDO_DBG_INF_FMT(
"dbh=%p", dbh);
618static void pdo_mysql_request_shutdown(
pdo_dbh_t *dbh)
620 PDO_DBG_ENTER(
"pdo_mysql_request_shutdown");
621 PDO_DBG_INF_FMT(
"dbh=%p", dbh);
623#ifdef PDO_USE_MYSQLND
632#ifdef PDO_USE_MYSQLND
633# define pdo_mysql_get_server_status(m) mysqlnd_get_server_status(m)
635# define pdo_mysql_get_server_status(m) (m)->server_status
639static bool pdo_mysql_in_transaction(
pdo_dbh_t *dbh)
642 PDO_DBG_ENTER(
"pdo_mysql_in_transaction");
650 mysql_handle_preparer,
655 mysql_handle_rollback,
656 pdo_mysql_set_attribute,
657 pdo_mysql_last_insert_id,
658 pdo_mysql_fetch_error_func,
659 pdo_mysql_get_attribute,
660 pdo_mysql_check_liveness,
662 pdo_mysql_request_shutdown,
663 pdo_mysql_in_transaction,
670# define PDO_DEFAULT_MYSQL_UNIX_ADDR NULL
672# define PDO_DEFAULT_MYSQL_UNIX_ADDR PDO_MYSQL_G(default_socket)
676static int pdo_mysql_handle_factory(
pdo_dbh_t *dbh,
zval *driver_options)
681 char *host =
NULL, *unix_socket =
NULL;
682 unsigned int port = 3306;
685 {
"charset",
NULL, 0 },
687 {
"host",
"localhost", 0 },
688 {
"port",
"3306", 0 },
691 {
"password",
NULL, 0 },
694#ifdef CLIENT_MULTI_RESULTS
698#ifdef PDO_USE_MYSQLND
699 size_t dbname_len = 0;
700 size_t password_len = 0;
703#ifdef CLIENT_MULTI_STATEMENTS
704 if (!driver_options) {
711 PDO_DBG_ENTER(
"pdo_mysql_handle_factory");
712 PDO_DBG_INF_FMT(
"dbh=%p", dbh);
713#ifdef CLIENT_MULTI_RESULTS
714 PDO_DBG_INF(
"multi results");
721 H->einfo.errcode = 0;
722 H->einfo.errmsg =
NULL;
731#ifdef PDO_USE_MYSQLND
746#ifndef PDO_USE_MYSQLND
747 H->max_buffer_size = 1024*1024;
750 H->assume_national_character_set_strings = 0;
751 H->buffered =
H->emulate_prepare = 1;
754 if (driver_options) {
757#ifndef PDO_USE_MYSQLND
764 H->emulate_prepare = pdo_attr_lval(driver_options,
766 H->emulate_prepare = pdo_attr_lval(driver_options,
769 H->assume_national_character_set_strings = pdo_attr_lval(driver_options,
772#ifndef PDO_USE_MYSQLND
791#ifndef PDO_USE_MYSQLND
792 if (
PG(open_basedir) &&
PG(open_basedir)[0] !=
'\0') {
798#if (MYSQL_VERSION_ID >= 80021 && !defined(MARIADB_BASE_VERSION)) || defined(PDO_USE_MYSQLND)
809#ifdef MYSQL_OPT_RECONNECT
828#ifndef PDO_USE_MYSQLND
863 if (ssl_key || ssl_cert || ssl_ca || ssl_capath || ssl_cipher) {
887#if MYSQL_VERSION_ID > 50605 || defined(PDO_USE_MYSQLND)
889 zend_string *public_key = pdo_attr_strval(driver_options, PDO_MYSQL_ATTR_SERVER_PUBLIC_KEY,
NULL);
901#ifdef PDO_USE_MYSQLND
903 zend_long ssl_verify_cert = pdo_attr_lval(driver_options,
904 PDO_MYSQL_ATTR_SSL_VERIFY_SERVER_CERT, -1);
905 if (ssl_verify_cert != -1) {
906 connect_opts |= ssl_verify_cert ?
915 unsigned int local_infile =
H->local_infile;
921#ifdef PDO_USE_MYSQLND
937 port = atoi(vars[3].
optval);
945 unix_socket = vars[4].
optval;
957#ifdef PDO_USE_MYSQLND
959 dbname_len =
strlen(dbname);
969 if (mysql_real_connect(
H->server, host, dbh->
username, dbh->
password, dbname, port, unix_socket, connect_opts) ==
NULL) {
976 mysql_handle_autocommit(dbh);
988 for (i = 0; i <
sizeof(vars)/
sizeof(vars[0]); i++) {
1002 pdo_mysql_handle_factory
file(string $filename, int $flags=0, $context=null)
PHPAPI int php_check_open_basedir(const char *path)
int _pdo_mysql_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, const char *file, int line)
#define pdo_mysql_get_server_status(m)
const pdo_driver_t pdo_mysql_driver
#define mysql_real_escape_string_quote(mysql, to, from, length, quote)
#define pdo_mysql_init(persistent)
#define PDO_DEFAULT_MYSQL_UNIX_ADDR
const struct pdo_stmt_methods mysql_stmt_methods
#define mysqlnd_restart_psession(conn)
#define mysqlnd_end_psession(conn)
#define mysqlnd_connect(conn, host, user, pass, pass_len, db, db_len, port, socket, mysql_flags, client_api_flags)
#define mysqlnd_stat(conn, msg)
#define CLIENT_SSL_DONT_VERIFY_SERVER_CERT
@ MYSQL_OPT_CONNECT_TIMEOUT
@ MYSQL_OPT_LOAD_DATA_LOCAL_DIR
@ MYSQLND_OPT_INT_AND_FLOAT_NATIVE
@ MYSQL_SERVER_PUBLIC_KEY
@ MYSQL_READ_DEFAULT_GROUP
@ MYSQL_READ_DEFAULT_FILE
#define CLIENT_MULTI_RESULTS
#define CLIENT_FOUND_ROWS
#define CLIENT_SSL_VERIFY_SERVER_CERT
#define CLIENT_MULTI_STATEMENTS
#define CLIENT_IGNORE_SPACE
#define SERVER_STATUS_IN_TRANS
#define MYSQLND_CLIENT_NO_FLAG
#define mysql_stmt_param_count(s)
#define mysql_autocommit(r, m)
#define mysql_free_result(r)
#define mysql_insert_id(r)
#define mysql_stmt_error(s)
#define mysql_sqlstate(r)
#define mysql_stmt_errno(s)
#define mysql_store_result(r)
#define mysql_more_results(r)
#define mysql_affected_rows(r)
#define mysql_ssl_set(c, key, cert, ca, capath, cipher)
#define mysql_stmt_close(s)
#define mysql_real_query(r, a, b)
#define mysql_options(c, a, v)
#define mysql_stmt_sqlstate(s)
#define mysql_get_host_info(r)
#define mysql_stmt_prepare(s, q, l)
#define mysql_rollback(r)
#define mysql_get_client_info()
#define mysql_stmt_init(r)
#define mysql_next_result(r)
#define mysql_get_server_info(r)
#define mysql_get_server_version(r)
PDO_API int php_pdo_parse_data_source(const char *data_source, zend_ulong data_source_len, struct pdo_data_src_parser *parsed, int nparams)
PDO_API bool pdo_get_long_param(zend_long *lval, zval *value)
PDO_API bool pdo_get_bool_param(bool *bval, zval *value)
void pdo_throw_exception(unsigned int driver_errcode, char *driver_errmsg, pdo_error_type *pdo_error)
unsigned const char * end
char * local_infile_directory
PDO_API int pdo_parse_params(pdo_stmt_t *stmt, zend_string *inquery, zend_string **outquery)
struct _pdo_dbh_t pdo_dbh_t
#define PDO_DRIVER_HEADER(name)
struct _pdo_stmt_t pdo_stmt_t
@ PDO_PARAM_EVT_FETCH_POST
@ PDO_PARAM_EVT_NORMALIZE
@ PDO_PARAM_EVT_FETCH_PRE
@ PDO_PARAM_EVT_EXEC_POST
@ PDO_PLACEHOLDER_POSITIONAL
@ PDO_ATTR_EMULATE_PREPARES
@ PDO_ATTR_DEFAULT_STR_PARAM
@ PDO_ATTR_MAX_COLUMN_LEN
@ PDO_ATTR_CONNECTION_STATUS
@ PDO_ATTR_SERVER_VERSION
@ PDO_ATTR_STRINGIFY_FETCHES
@ PDO_ATTR_FETCH_TABLE_NAMES
@ PDO_ATTR_CLIENT_VERSION
#define PDO_DBG_RETURN(value)
int pdo_mysql_scanner(pdo_scanner_t *s)
#define PDO_DBG_VOID_RETURN
#define pdo_mysql_error(s)
@ PDO_MYSQL_ATTR_SSL_CIPHER
@ PDO_MYSQL_ATTR_READ_DEFAULT_FILE
@ PDO_MYSQL_ATTR_SSL_CERT
@ PDO_MYSQL_ATTR_FOUND_ROWS
@ PDO_MYSQL_ATTR_DIRECT_QUERY
@ PDO_MYSQL_ATTR_MAX_BUFFER_SIZE
@ PDO_MYSQL_ATTR_READ_DEFAULT_GROUP
@ PDO_MYSQL_ATTR_COMPRESS
@ PDO_MYSQL_ATTR_LOCAL_INFILE
@ PDO_MYSQL_ATTR_USE_BUFFERED_QUERY
@ PDO_MYSQL_ATTR_IGNORE_SPACE
@ PDO_MYSQL_ATTR_INIT_COMMAND
@ PDO_MYSQL_ATTR_SSL_CAPATH
@ PDO_MYSQL_ATTR_MULTI_STATEMENTS
unsigned max_escaped_char_length
pdo_error_type error_code
unsigned alloc_own_columns
const struct pdo_dbh_methods * methods
pdo_error_type error_code
ZEND_API zend_result add_next_index_long(zval *arg, zend_long n)
ZEND_API zend_result add_next_index_string(zval *arg, const char *str)
#define ZVAL_STRING(z, s)
#define pestrdup(s, persistent)
#define ecalloc(nmemb, size)
#define pefree(ptr, persistent)
#define pecalloc(nmemb, size, persistent)
strcmp(string $string1, string $string2)
zend_string_release_ex(func->internal_function.function_name, 0)
struct _zend_string zend_string
ZEND_API zend_string *ZEND_FASTCALL zend_u64_to_str(uint64_t num)
#define ZSTR_INIT_LITERAL(s, persistent)
ZEND_RESULT_CODE zend_result