32# define pdo_mysql_stmt_execute_prepared(stmt) pdo_mysql_stmt_execute_prepared_mysqlnd(stmt)
34# define pdo_mysql_stmt_execute_prepared(stmt) pdo_mysql_stmt_execute_prepared_libmysql(stmt)
40#ifndef PDO_USE_MYSQLND
41 if (
S->bound_result) {
45 for (
unsigned i = 0; i < column_count; i++) {
46 efree(
S->bound_result[i].buffer);
52 S->bound_result =
NULL;
57 for (
unsigned i = 0; i < column_count; i++) {
58 zval_ptr_dtor_nogc(&
S->current_row[i]);
61 S->current_row =
NULL;
69static int pdo_mysql_stmt_dtor(
pdo_stmt_t *stmt)
73 PDO_DBG_ENTER(
"pdo_mysql_stmt_dtor");
74 PDO_DBG_INF_FMT(
"stmt=%p",
S->stmt);
76 pdo_mysql_free_result(
S);
77 if (
S->einfo.errmsg) {
78 pefree(
S->einfo.errmsg, stmt->dbh->is_persistent);
79 S->einfo.errmsg =
NULL;
86#ifndef PDO_USE_MYSQLND
98 if (!
S->done && !
Z_ISUNDEF(stmt->database_object_handle)
119static void pdo_mysql_stmt_set_row_count(
pdo_stmt_t *stmt)
129static int pdo_mysql_fill_stmt_from_result(
pdo_stmt_t *stmt)
134 PDO_DBG_ENTER(
"pdo_mysql_fill_stmt_from_result");
145 if (
NULL ==
S->result) {
162static bool pdo_mysql_stmt_after_execute_prepared(
pdo_stmt_t *stmt) {
166#ifdef PDO_USE_MYSQLND
188 int calc_max_length =
H->buffered &&
S->max_length == 1;
203 switch (
S->fields[i].type) {
205 S->bound_result[i].buffer_length = MAX_MEDIUMINT_WIDTH + 1;
208 S->bound_result[i].buffer_length = MAX_INT_WIDTH + 1;
211 S->bound_result[i].buffer_length = MAX_BIGINT_WIDTH + 1;
214 S->bound_result[i].buffer_length = MAX_TINYINT_WIDTH + 1;
217 S->bound_result[i].buffer_length = MAX_SMALLINT_WIDTH + 1;
220 S->bound_result[i].buffer_length =
221 S->fields[i].max_length?
S->fields[i].max_length:
224 if (
S->bound_result[i].buffer_length >
H->max_buffer_size) {
225 S->bound_result[i].buffer_length =
H->max_buffer_size;
234 S->bound_result[i].buffer_length = 128;
237 S->out_length[i] = 0;
239 S->bound_result[i].buffer =
emalloc(
S->bound_result[i].buffer_length);
240 S->bound_result[i].is_null = &
S->out_null[i];
241 S->bound_result[i].length = &
S->out_length[i];
260 pdo_mysql_stmt_set_row_count(stmt);
264#ifndef PDO_USE_MYSQLND
265static int pdo_mysql_stmt_execute_prepared_libmysql(
pdo_stmt_t *stmt)
269 PDO_DBG_ENTER(
"pdo_mysql_stmt_execute_prepared_libmysql");
274 memset(
S->params, 0,
S->num_params *
sizeof(MYSQL_BIND));
289#ifdef PDO_USE_MYSQLND
290static int pdo_mysql_stmt_execute_prepared_mysqlnd(
pdo_stmt_t *stmt)
294 PDO_DBG_ENTER(
"pdo_mysql_stmt_execute_prepared_mysqlnd");
306static int pdo_mysql_stmt_execute(
pdo_stmt_t *stmt)
310 PDO_DBG_ENTER(
"pdo_mysql_stmt_execute");
311 PDO_DBG_INF_FMT(
"stmt=%p",
S->stmt);
314 pdo_mysql_free_result(
S);
318 uint32_t num_bound_params =
320 if (num_bound_params < (uint32_t)
S->num_params) {
322 PDO_DBG_ERR(
"too few parameters bound");
339static int pdo_mysql_stmt_next_rowset(
pdo_stmt_t *stmt)
343 PDO_DBG_ENTER(
"pdo_mysql_stmt_next_rowset");
344 PDO_DBG_INF_FMT(
"stmt=%p",
S->stmt);
347 pdo_mysql_free_result(
S);
369static const char *
const pdo_param_event_names[] =
371 "PDO_PARAM_EVT_ALLOC",
372 "PDO_PARAM_EVT_FREE",
373 "PDO_PARAM_EVT_EXEC_PRE",
374 "PDO_PARAM_EVT_EXEC_POST",
375 "PDO_PARAM_EVT_FETCH_PRE",
376 "PDO_PARAM_EVT_FETCH_POST",
377 "PDO_PARAM_EVT_NORMALIZE",
380#ifndef PDO_USE_MYSQLND
381static unsigned char libmysql_false_buffer = 0;
382static unsigned char libmysql_true_buffer = 1;
388#ifndef PDO_USE_MYSQLND
393 PDO_DBG_ENTER(
"pdo_mysql_stmt_param_hook");
394 PDO_DBG_INF_FMT(
"stmt=%p",
S->stmt);
395 PDO_DBG_INF_FMT(
"event = %s", pdo_param_event_names[event_type]);
396 if (
S->stmt && param->is_param) {
397 switch (event_type) {
400 if (param->paramno < 0 || param->paramno >=
S->num_params) {
405#ifndef PDO_USE_MYSQLND
406 b = &
S->params[param->paramno];
407 param->driver_data = b;
408 b->is_null = &
S->in_null[param->paramno];
409 b->length = &
S->in_length[param->paramno];
415 if (!
Z_ISREF(param->parameter)) {
416 parameter = ¶m->parameter;
418 parameter =
Z_REFVAL(param->parameter);
421#ifdef PDO_USE_MYSQLND
433 b->buffer_length = 0;
443 PDO_DBG_INF(
"PDO_PARAM_LOB");
444 if (!
Z_ISREF(param->parameter)) {
445 parameter = ¶m->parameter;
447 parameter =
Z_REFVAL(param->parameter);
467#ifdef PDO_USE_MYSQLND
469 PDO_DBG_INF_FMT(
"param->parameter->type=%d",
Z_TYPE(param->parameter));
470 if (!
Z_ISREF(param->parameter)) {
471 parameter = ¶m->parameter;
473 parameter =
Z_REFVAL(param->parameter);
480#if SIZEOF_ZEND_LONG==8
482#elif SIZEOF_ZEND_LONG==4
499 PDO_DBG_INF_FMT(
"param->parameter->type=%d",
Z_TYPE(param->parameter));
500 if (!
Z_ISREF(param->parameter)) {
501 parameter = ¶m->parameter;
503 parameter =
Z_REFVAL(param->parameter);
515 b->buffer = &libmysql_false_buffer;
520 b->buffer = &libmysql_true_buffer;
559#ifdef PDO_USE_MYSQLND
560 bool fetched_anything;
562 PDO_DBG_ENTER(
"pdo_mysql_stmt_fetch");
563 PDO_DBG_INF_FMT(
"stmt=%p",
S->stmt);
579 if (!fetched_anything) {
583 if (!
S->current_row) {
587 zval_ptr_dtor_nogc(&
S->current_row[i]);
595 ret = mysql_stmt_fetch(
S->stmt);
597# ifdef MYSQL_DATA_TRUNCATED
626static int pdo_mysql_stmt_describe(
pdo_stmt_t *stmt,
int colno)
632 PDO_DBG_ENTER(
"pdo_mysql_stmt_describe");
633 PDO_DBG_INF_FMT(
"stmt=%p",
S->stmt);
651 if (
S->H->fetch_table_names) {
652 cols[i].
name =
strpprintf(0,
"%s.%s",
S->fields[i].table,
S->fields[i].name);
654#ifdef PDO_USE_MYSQLND
655 cols[i].
name = zend_string_copy(
S->fields[i].sname);
657 cols[i].
name = zend_string_init(
S->fields[i].name,
S->fields[i].name_length, 0);
662 cols[i].
maxlen =
S->fields[i].length;
668static int pdo_mysql_stmt_get_col(
673 PDO_DBG_ENTER(
"pdo_mysql_stmt_get_col");
674 PDO_DBG_INF_FMT(
"stmt=%p",
S->stmt);
683#ifdef PDO_USE_MYSQLND
692 if (
S->out_null[colno]) {
696 size_t length =
S->out_length[colno];
697 if (length >
S->bound_result[colno].buffer_length) {
700 length =
S->out_length[colno] =
S->bound_result[colno].buffer_length;
706 if (
S->current_data ==
NULL) {
709 if (
S->current_data[colno]) {
716static char *type_to_name_native(
int type)
718#define PDO_MYSQL_NATIVE_TYPE_NAME(x) case FIELD_TYPE_##x: return #x;
723#ifdef FIELD_TYPE_TINY
736#ifdef FIELD_TYPE_NEWDECIMAL
739#ifdef FIELD_TYPE_GEOMETRY
743#ifdef FIELD_TYPE_YEAR
749#ifdef FIELD_TYPE_NEWDATE
762#undef PDO_MYSQL_NATIVE_TYPE_NAME
772 PDO_DBG_ENTER(
"pdo_mysql_stmt_col_meta");
773 PDO_DBG_INF_FMT(
"stmt=%p",
S->stmt);
785 F =
S->fields + colno;
805 str = type_to_name_native(
F->type);
818#if SIZEOF_ZEND_LONG==8
830 add_assoc_string(
return_value,
"table", (
char *) (
F->table?
F->table :
""));
835static int pdo_mysql_stmt_cursor_closer(
pdo_stmt_t *stmt)
839 PDO_DBG_ENTER(
"pdo_mysql_stmt_cursor_closer");
840 PDO_DBG_INF_FMT(
"stmt=%p",
S->stmt);
843 pdo_mysql_free_result(
S);
865 pdo_mysql_stmt_execute,
866 pdo_mysql_stmt_fetch,
867 pdo_mysql_stmt_describe,
868 pdo_mysql_stmt_get_col,
869 pdo_mysql_stmt_param_hook,
872 pdo_mysql_stmt_col_meta,
873 pdo_mysql_stmt_next_rowset,
874 pdo_mysql_stmt_cursor_closer
memset(ptr, 0, type->size)
#define pdo_mysql_stmt_execute_prepared(stmt)
const struct pdo_stmt_methods mysql_stmt_methods
#define PDO_MYSQL_NATIVE_TYPE_NAME(x)
#define mysqlnd_stmt_bind_one_result(s, no)
#define mysqlnd_fetch_row_zval(result, row_ptr, fetched)
#define mysqlnd_stmt_fetch(stmt, fetched)
#define mysqlnd_stmt_result_metadata(stmt)
#define mysqlnd_stmt_bind_one_param(stmt, n, z, t)
#define FIELD_TYPE_LONGLONG
#define MULTIPLE_KEY_FLAG
@ STMT_ATTR_UPDATE_MAX_LENGTH
#define mysql_stmt_store_result(s)
#define mysql_stmt_execute(s)
#define mysql_stmt_attr_set(s, a, v)
#define mysql_use_result(r)
#define mysql_free_result(r)
#define mysql_fetch_row(r)
#define mysql_stmt_bind_param(s, b)
#define mysql_num_rows(r)
#define mysql_stmt_errno(s)
#define mysql_store_result(r)
#define mysql_more_results(r)
#define mysql_affected_rows(r)
#define mysql_fetch_lengths(r)
#define mysql_stmt_free_result(s)
#define MYSQL_DATA_TRUNCATED
#define mysql_stmt_close(s)
#define mysql_real_query(r, a, b)
#define mysql_stmt_field_count(s)
#define mysql_stmt_bind_result(s, b)
#define mysql_stmt_affected_rows(s)
#define mysql_next_result(r)
#define mysql_num_fields(r)
#define mysql_stmt_result_metadata(s)
#define mysql_stmt_next_result(s)
#define mysql_fetch_fields(r)
void pdo_raise_impl_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, pdo_error_type sqlstate, const char *supp)
PDO_API void php_pdo_stmt_set_column_count(pdo_stmt_t *stmt, int new_count)
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
#define PDO_PARAM_TYPE(x)
#define PDO_DBG_RETURN(value)
#define PDO_MYSQL_PARAM_BIND
#define pdo_mysql_error_stmt(s)
struct _php_stream php_stream
#define PHP_STREAM_COPY_ALL
#define php_stream_copy_to_mem(src, maxlen, persistent)
#define php_stream_from_zval_no_verify(xstr, pzval)
zend_string * active_query_string
pdo_error_type error_code
struct pdo_column_data * columns
ZEND_API zend_result add_next_index_string(zval *arg, const char *str)
#define ZVAL_STRINGL_FAST(z, s, l)
#define ecalloc(nmemb, size)
#define pefree(ptr, persistent)
struct _zend_string zend_string
#define ZSTR_EMPTY_ALLOC()
#define Z_STRVAL_P(zval_p)
#define IS_OBJ_FREE_CALLED
#define Z_STRLEN_P(zval_p)
#define Z_OBJ_HANDLE(zval)
#define ZVAL_COPY_VALUE(z, v)
ZEND_API void zval_ptr_dtor(zval *zval_ptr)