char *nsql = NULL;
int nsql_len = 0;
int ret;
+ int server_version;
#endif
S->H = H;
goto end;
}
- /* TODO: add runtime check to determine if the server we are talking to supports
- * prepared statements; if it doesn't, we should set stmt->supports_placeholders
- * to PDO_PLACEHOLDER_NONE, and have the rest of the code look at S->stmt to
- * determine if we're using real prepared statements or the PDO emulated version */
#if HAVE_MYSQL_STMT_PREPARE
+ server_version = mysql_get_server_version(H->server);
+ if (server_version < 40100) {
+ goto fallback;
+ }
stmt->supports_placeholders = PDO_PLACEHOLDER_POSITIONAL;
ret = pdo_parse_params(stmt, (char*)sql, sql_len, &nsql, &nsql_len TSRMLS_CC);
((pdo_mysql_db_handle *)dbh->driver_data)->buffered = Z_BVAL_P(val);
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);
return 1;
default:
H->einfo.errcode = 0;
H->einfo.errmsg = NULL;
+ /* at the time of writing, the mysql documentation states:
+ * http://mysql.localhost.net.ar/doc/refman/5.0/en/query-cache-how.html
+ * "A query also is not cached under these conditions:
+ * ...
+ * It was issued as a prepared statement, even if no placeholders were employed."
+ *
+ * We default to emulating prepared statements
+ * in order to take advantage of the query cache
+FIXME: H->emulate_prepare = 1; a bit risky to do this so late in the RC, so defer it.
+ */
+
/* allocate an environment */
/* handle for the server */
char *init_cmd = NULL, *default_file = NULL, *default_group = NULL;
H->buffered = pdo_attr_lval(driver_options, PDO_MYSQL_ATTR_USE_BUFFERED_QUERY, 0 TSRMLS_CC);
- H->emulate_prepare = pdo_attr_lval(driver_options, PDO_MYSQL_ATTR_DIRECT_QUERY, 0 TSRMLS_CC);
+
+ 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);
+
H->max_buffer_size = pdo_attr_lval(driver_options, PDO_MYSQL_ATTR_MAX_BUFFER_SIZE, H->max_buffer_size TSRMLS_CC);
if (mysql_options(H->server, MYSQL_OPT_CONNECT_TIMEOUT, (const char *)&connect_timeout)) {
goto cleanup;
}
+#ifdef MYSQL_OPT_RECONNECT
+ /* since 5.0.3, the default for this option is 0 if not specified.
+ * we want the old behaviour */
+ {
+ 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);
if (init_cmd) {
if (mysql_options(H->server, MYSQL_INIT_COMMAND, (const char *)init_cmd)) {