Skip to content

Commit ae1cd8e

Browse files
committed
- Add mysqlnd support for PDO_mysql, fixes at least bug#41997,#42499,
pecl#12794, pecl#12401 # Running the tests: # (Note: Doesn't work currnetly on HEAD, see: # http://news.php.net/php.qa/64378) # # PDO_MYSQL_TEST_DSN - DSN # For example: mysql:dbname=test;host=localhost;port=3306 # # PDO_MYSQL_TEST_HOST - database host # PDO_MYSQL_TEST_DB - database (schema) name # PDO_MYSQL_TEST_SOCKET - database server socket # PDO_MYSQL_TEST_ENGINE - storage engine to use # PDO_MYSQL_TEST_USER - database user # PDO_MYSQL_TEST_PASS - database user password # PDO_MYSQL_TEST_CHARSET - database charset # # NOTE: if any of PDO_MYSQL_TEST_[HOST|DB|SOCKET|ENGINE|CHARSET] is # part of PDO_MYSQL_TEST_DSN, the values must match. That is, for example, # for PDO_MYSQL_TEST_DSN = mysql:dbname=test you MUST set PDO_MYSQL_TEST_DB=test.
1 parent 0df974b commit ae1cd8e

File tree

105 files changed

+10847
-433
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

105 files changed

+10847
-433
lines changed

ext/pdo/pdo_stmt.c

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -538,6 +538,20 @@ static inline void fetch_value(pdo_stmt_t *stmt, zval *dest, int colno, int *typ
538538
stmt->methods->get_col(stmt, colno, &value, &value_len, &caller_frees TSRMLS_CC);
539539

540540
switch (type) {
541+
case PDO_PARAM_ZVAL:
542+
if (value && value_len == sizeof(zval)) {
543+
int need_copy = (new_type != PDO_PARAM_ZVAL || stmt->dbh->stringify) ? 1 : 0;
544+
zval *zv = *(zval**)value;
545+
ZVAL_ZVAL(dest, zv, need_copy, 1);
546+
} else {
547+
ZVAL_NULL(dest);
548+
}
549+
550+
if (Z_TYPE_P(dest) == IS_NULL) {
551+
type = new_type;
552+
}
553+
break;
554+
541555
case PDO_PARAM_INT:
542556
if (value && value_len == sizeof(long)) {
543557
ZVAL_LONG(dest, *(long*)value);
@@ -1879,7 +1893,10 @@ static PHP_METHOD(PDOStatement, getColumnMeta)
18791893
add_assoc_string(return_value, "name", col->name, 1);
18801894
add_assoc_long(return_value, "len", col->maxlen); /* FIXME: unsigned ? */
18811895
add_assoc_long(return_value, "precision", col->precision);
1882-
add_assoc_long(return_value, "pdo_type", col->param_type);
1896+
if (col->param_type != PDO_PARAM_ZVAL) {
1897+
/* if param_type is PDO_PARAM_ZVAL the driver has to provide correct data */
1898+
add_assoc_long(return_value, "pdo_type", col->param_type);
1899+
}
18831900
}
18841901
/* }}} */
18851902

ext/pdo/php_pdo_driver.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ PDO_API char *php_pdo_int64_to_str(pdo_int64_t i64 TSRMLS_DC);
4545
# define FALSE 0
4646
#endif
4747

48-
#define PDO_DRIVER_API 20061209
48+
#define PDO_DRIVER_API 20080721
4949

5050
enum pdo_param_type {
5151
PDO_PARAM_NULL,
@@ -68,7 +68,12 @@ enum pdo_param_type {
6868
PDO_PARAM_STMT, /* hierarchical result set */
6969

7070
/* get_col ptr should point to a zend_bool */
71-
PDO_PARAM_BOOL
71+
PDO_PARAM_BOOL,
72+
73+
/* get_col ptr should point to a zval*
74+
and the driver is responsible for adding correct type information to get_column_meta()
75+
*/
76+
PDO_PARAM_ZVAL
7277
};
7378

7479
/* magic flag to denote a parameter as being input/output */

ext/pdo_mysql/CREDITS

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
mySQL driver for PDO
2-
George Schlossnagle, Wez Furlong, Ilia Alshanetsky
3-
1+
MySQL driver for PDO
2+
George Schlossnagle, Wez Furlong, Ilia Alshanetsky, Johannes Schlueter
3+

ext/pdo_mysql/config.m4

Lines changed: 134 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -2,68 +2,143 @@ dnl
22
dnl $Id$
33
dnl
44

5-
if test "$PHP_PDO" != "no"; then
6-
7-
AC_DEFUN([PDO_MYSQL_LIB_CHK], [
8-
str="$PDO_MYSQL_DIR/$1/libmysqlclient.*"
9-
for j in `echo $str`; do
10-
if test -r $j; then
11-
PDO_MYSQL_LIB_DIR=$MYSQL_DIR/$1
12-
break 2
13-
fi
14-
done
15-
])
16-
5+
dnl TODO Rename when moving to pdo_mysql
176
PHP_ARG_WITH(pdo-mysql, for MySQL support for PDO,
18-
[ --with-pdo-mysql[=DIR] PDO: MySQL support. DIR is the MySQL base directory])
7+
[ --with-pdo-mysql[=DIR] PDO: MySQL support. DIR is the MySQL base directoy
8+
If mysqlnd is passed as DIR, the MySQL native
9+
native driver will be used [/usr/local]])
10+
11+
if test -z "$PHP_ZLIB_DIR"; then
12+
PHP_ARG_WITH(zlib-dir, for the location of libz,
13+
[ --with-zlib-dir[=DIR] PDO_MySQL: Set the path to libz install prefix], no, no)
14+
fi
1915

2016
if test "$PHP_PDO_MYSQL" != "no"; then
21-
AC_DEFINE(HAVE_MYSQL, 1, [Whether you have MySQL])
17+
PHP_MYSQLND_ENABLED=yes
2218

23-
for i in $PHP_PDO_MYSQL /usr/local /usr ; do
24-
PDO_MYSQL_DIR=$i
25-
PDO_MYSQL_CONFIG=$PDO_MYSQL_DIR/bin/mysql_config
26-
if test -r $i/include/mysql; then
27-
PDO_MYSQL_INC_DIR=$i/include/mysql
28-
else
29-
PDO_MYSQL_INC_DIR=$i/include
30-
fi
31-
if test -r $i/lib/mysql; then
32-
PDO_MYSQL_LIB_DIR=$i/lib/mysql
19+
AC_DEFUN([PDO_MYSQL_LIB_CHK], [
20+
str="$PDO_MYSQL_DIR/$1/libmysqlclient*"
21+
for j in `echo $str`; do
22+
if test -r $j; then
23+
PDO_MYSQL_LIB_DIR=$PDO_MYSQL_DIR/$1
24+
break 2
25+
fi
26+
done
27+
])
28+
29+
if test "$PHP_PDO_MYSQL" = "mysqlnd"; then
30+
dnl enables build of mysqnd library
31+
PHP_MYSQL_ENABLED=yes
32+
AC_DEFINE([PDO_USE_MYSQLND], 1, [Whether pdo_mysql uses mysqlnd])
33+
else
34+
AC_DEFINE(HAVE_MYSQL, 1, [Whether you have MySQL])
35+
AC_MSG_CHECKING([for mysql_config])
36+
37+
if test -f $PHP_PDO_MYSQL && test -x $PHP_PDO_MYSQL ; then
38+
PDO_MYSQL_CONFIG=$PHP_PDO_MYSQL
39+
elif test "$PHP_PDO_MYSQL" != "yes"; then
40+
if test -d "$PHP_PDO_MYSQL" ; then
41+
if test -x "$PHP_PDO_MYSQL/bin/mysql_config" ; then
42+
PDO_MYSQL_CONFIG="$PHP_PDO_MYSQL/bin/mysql_config"
43+
else
44+
PDO_MYSQL_DIR="$PHP_PDO_MYSQL"
45+
fi
46+
else
47+
AC_MSG_RESULT([$PHP_PDO_MYSQL is not a directory])
48+
AC_MSG_ERROR([can not find mysql under the "$PHP_PDO_MYSQL" that you specified])
49+
fi
3350
else
34-
PDO_MYSQL_LIB_DIR=$i/lib
35-
fi
36-
if test -x $PDO_MYSQL_CONFIG; then
37-
break
51+
for i in /usr/local /usr ; do
52+
if test -x "$i/bin/mysql_config" ; then
53+
PDO_MYSQL_CONFIG="$i/bin/mysql_config"
54+
break;
55+
fi
56+
if test -r $i/include/mysql/mysql.h || test -r $i/include/mysql.h ; then
57+
PDO_MYSQL_DIR="$i"
58+
break;
59+
fi
60+
done
3861
fi
39-
done
4062

41-
if test -z "$PDO_MYSQL_DIR"; then
42-
AC_MSG_ERROR([Cannot find MySQL header files under $PHP_MYSQL.
43-
Note that the MySQL client library is not bundled anymore!])
44-
fi
63+
if test -n "$PDO_MYSQL_CONFIG" && test -x "$PDO_MYSQL_CONFIG" ; then
64+
AC_MSG_RESULT($PDO_MYSQL_CONFIG)
65+
if test "x$SED" = "x"; then
66+
AC_PATH_PROG(SED, sed)
67+
fi
4568

46-
if test -x $PDO_MYSQL_CONFIG; then
47-
PDO_MYSQL_SOCKET=`$PDO_MYSQL_CONFIG --socket`
48-
fi
69+
if test "$enable_maintainer_zts" = "yes"; then
70+
PDO_MYSQL_LIBNAME=mysqlclient_r
71+
PDO_MYSQL_LIBS=`$PDO_MYSQL_CONFIG --libs_r | $SED -e "s/'//g"`
72+
else
73+
PDO_MYSQL_LIBNAME=mysqlclient
74+
PDO_MYSQL_LIBS=`$PDO_MYSQL_CONFIG --libs | $SED -e "s/'//g"`
75+
fi
76+
PDO_MYSQL_INCLUDE=`$PDO_MYSQL_CONFIG --cflags | $SED -e "s/'//g"`
77+
PDO_MYSQL_SOCKET=`$PDO_MYSQL_CONFIG --socket`
78+
elif test -z "$PDO_MYSQL_DIR"; then
79+
AC_MSG_RESULT([not found])
80+
AC_MSG_ERROR([Cannot find MySQL header files under $PDO_MYSQL_DIR])
81+
else
82+
AC_MSG_RESULT([not found])
83+
AC_MSG_CHECKING([for mysql install under $PDO_MYSQL_DIR])
84+
if test -r $PDO_MYSQL_DIR/include/mysql; then
85+
PDO_MYSQL_INC_DIR=$PDO_MYSQL_DIR/include/mysql
86+
else
87+
PDO_MYSQL_INC_DIR=$PDO_MYSQL_DIR/include
88+
fi
89+
if test -r $PDO_MYSQL_DIR/$PHP_LIBDIR/mysql; then
90+
PDO_MYSQL_LIB_DIR=$PDO_MYSQL_DIR/$PHP_LIBDIR/mysql
91+
else
92+
PDO_MYSQL_LIB_DIR=$PDO_MYSQL_DIR/$PHP_LIBDIR
93+
fi
94+
95+
if test -r "$PDO_MYSQL_LIB_DIR"; then
96+
AC_MSG_RESULT([libs under $PDO_MYSQL_LIB_DIR; seems promising])
97+
else
98+
AC_MSG_RESULT([can not find it])
99+
AC_MSG_ERROR([Unable to find your mysql installation])
100+
fi
101+
102+
PHP_ADD_INCLUDE($PDO_MYSQL_INC_DIR)
103+
PDO_MYSQL_INCLUDE=-I$PDO_MYSQL_INC_DIR
104+
fi
49105

50-
if test "$PHP_MYSQL_SOCK" != "no" && test "$PHP_MYSQL_SOCK" != "yes"; then
51-
AC_DEFINE_UNQUOTED(PDO_MYSQL_UNIX_ADDR, "$PHP_MYSQL_SOCK", [ ])
52-
else
53106
AC_DEFINE_UNQUOTED(PDO_MYSQL_UNIX_ADDR, "$PDO_MYSQL_SOCKET", [ ])
54-
fi
55107

56-
PHP_ADD_LIBRARY_WITH_PATH(mysqlclient, $PDO_MYSQL_LIB_DIR, PDO_MYSQL_SHARED_LIBADD)
57-
PHP_ADD_INCLUDE($PDO_MYSQL_INC_DIR)
58-
if test -x $PDO_MYSQL_CONFIG; then
59-
PDO_MYSQL_LIBS=`$PDO_MYSQL_CONFIG --libs`
60-
PHP_SUBST_OLD(PDO_MYSQL_LIBS)
61-
fi
108+
PHP_CHECK_LIBRARY($PDO_MYSQL_LIBNAME, mysql_query,
109+
[
110+
PHP_EVAL_INCLINE($PDO_MYSQL_INCLUDE)
111+
PHP_EVAL_LIBLINE($PDO_MYSQL_LIBS, PDO_MYSQL_SHARED_LIBADD)
112+
],[
113+
if test "$PHP_ZLIB_DIR" != "no"; then
114+
PHP_ADD_LIBRARY_WITH_PATH(z, $PHP_ZLIB_DIR, PDO_MYSQL_SHARED_LIBADD)
115+
PHP_CHECK_LIBRARY($PDO_MYSQL_LIBNAME, mysql_query, [], [
116+
AC_MSG_ERROR([PDO_MYSQL configure failed. Please check config.log for more information.])
117+
], [
118+
-L$PHP_ZLIB_DIR/$PHP_LIBDIR -L$PDO_MYSQL_LIB_DIR
119+
])
120+
PDO_MYSQL_LIBS="$PDO_MYSQL_LIBS -L$PHP_ZLIB_DIR/$PHP_LIBDIR -lz"
121+
else
122+
PHP_ADD_LIBRARY(z,, PDO_MYSQL_SHARED_LIBADD)
123+
PHP_CHECK_LIBRARY($PDO_MYSQL_LIBNAME, mysql_query, [], [
124+
AC_MSG_ERROR([Try adding --with-zlib-dir=<DIR>. Please check config.log for more information.])
125+
], [
126+
-L$PDO_MYSQL_LIB_DIR
127+
])
128+
PDO_MYSQL_LIBS="$PDO_MYSQL_LIBS -lz"
129+
fi
62130
63-
_SAVE_LDFLAGS=$LDFLAGS
64-
LDFLAGS="$LDFLAGS $PDO_MYSQL_LIBS"
65-
AC_CHECK_FUNCS([mysql_commit mysql_stmt_prepare mysql_next_result mysql_sqlstate])
66-
LDFLAGS=$_SAVE_LDFLAGS
131+
PHP_EVAL_INCLINE($PDO_MYSQL_INCLUDE)
132+
PHP_EVAL_LIBLINE($PDO_MYSQL_LIBS, PDO_MYSQL_SHARED_LIBADD)
133+
],[
134+
$PDO_MYSQL_LIBS
135+
])
136+
137+
_SAVE_LIBS=$LIBS
138+
LIBS="$LIBS $PDO_MYSQL_LIBS"
139+
AC_CHECK_FUNCS([mysql_commit mysql_stmt_prepare mysql_next_result mysql_sqlstate])
140+
LIBS=$_SAVE_LIBS
141+
fi
67142

68143
ifdef([PHP_CHECK_PDO_INCLUDES],
69144
[
@@ -82,18 +157,19 @@ Note that the MySQL client library is not bundled anymore!])
82157
AC_MSG_RESULT($pdo_inc_path)
83158
])
84159

85-
PHP_NEW_EXTENSION(pdo_mysql, pdo_mysql.c mysql_driver.c mysql_statement.c, $ext_shared,,-I$pdo_inc_path)
160+
161+
dnl fix after renaming to pdo_mysql
162+
PHP_NEW_EXTENSION(pdo_mysql, pdo_mysql.c mysql_driver.c mysql_statement.c, $ext_shared,,-I$pdo_inc_path -I)
86163
ifdef([PHP_ADD_EXTENSION_DEP],
87164
[
88-
PHP_ADD_EXTENSION_DEP(pdo_mysql, pdo)
165+
PHP_ADD_EXTENSION_DEP(pdo_mysql, pdo)
166+
if test "$PHP_MYSQL" = "mysqlnd"; then
167+
PHP_ADD_EXTENSION_DEP(pdo_mysql, mysqlnd)
168+
fi
89169
])
90170
PDO_MYSQL_MODULE_TYPE=external
91-
PDO_MYSQL_INCLUDE=-I$PDO_MYSQL_INC_DIR
92-
93-
PHP_SUBST(PDO_MYSQL_SHARED_LIBADD)
171+
94172
PHP_SUBST_OLD(PDO_MYSQL_MODULE_TYPE)
95-
PHP_SUBST_OLD(PDO_MYSQL_LIBS)
96-
PHP_SUBST_OLD(PDO_MYSQL_INCLUDE)
97173
fi
98174

99-
fi
175+
dnl vim: se ts=2 sw=2 et:

ext/pdo_mysql/config.w32

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,17 @@
44
ARG_WITH("pdo-mysql", "MySQL support for PDO", "no");
55

66
if (PHP_PDO_MYSQL != "no") {
7-
if (CHECK_LIB("libmysql.lib", "pdo_mysql", PHP_PDO_MYSQL) &&
8-
CHECK_HEADER_ADD_INCLUDE("mysql.h", "CFLAGS_PDO_MYSQL", PHP_PHP_BUILD + "\\include\\mysql;" + PHP_PDO_MYSQL)) {
7+
if (PHP_PDO_MYSQL == "yes" || PHP_PDO_MYSQL == "mysqlnd") {
8+
AC_DEFINE('PDO_USE_MYSQLND', 1, 'Using MySQL native driver');
9+
STDOUT.WriteLine("INFO: mysqlnd build");
910
EXTENSION("pdo_mysql", "pdo_mysql.c mysql_driver.c mysql_statement.c");
11+
ADD_EXTENSION_DEP('pdo_mysql', 'pdo');
1012
} else {
11-
WARNING("pdo_mysql not enabled; libraries and headers not found");
13+
if (CHECK_LIB("libmysql.lib", "pdo_mysql", PHP_PDO_MYSQL) &&
14+
CHECK_HEADER_ADD_INCLUDE("mysql.h", "CFLAGS_PDO_MYSQL", PHP_PHP_BUILD + "\\include\\mysql;" + PHP_PDO_MYSQL)) {
15+
EXTENSION("pdo_mysql", "pdo_mysql.c mysql_driver.c mysql_statement.c");
16+
} else {
17+
WARNING("pdo_mysql not enabled; libraries and headers not found");
18+
}
1219
}
13-
ADD_EXTENSION_DEP('pdo_mysql', 'pdo');
1420
}

0 commit comments

Comments
 (0)