diff options
author | Dorin Marcoci <dorin.marcoci@marcodor.com> | 2016-11-04 13:15:01 +0200 |
---|---|---|
committer | Anatol Belski <ab@php.net> | 2016-11-05 22:49:16 +0100 |
commit | 3d73f718b2715c65be088ef6cb038d30e5d4bb86 (patch) | |
tree | 3135fc3e1bcacdf85312f65cfc4d1d30f3ac61be /ext/pdo_firebird/firebird_statement.c | |
parent | 3b78cabc881108a0c3e87037abd540e070c5a85b (diff) | |
download | php-git-3d73f718b2715c65be088ef6cb038d30e5d4bb86.tar.gz |
Fix blob parameters binding. Fixes: #73087, #61183, #71494
Adjusted formatting according to requirements
Test case for bug #73087
Diffstat (limited to 'ext/pdo_firebird/firebird_statement.c')
-rw-r--r-- | ext/pdo_firebird/firebird_statement.c | 30 |
1 files changed, 23 insertions, 7 deletions
diff --git a/ext/pdo_firebird/firebird_statement.c b/ext/pdo_firebird/firebird_statement.c index d6bfa021a5..994e92864c 100644 --- a/ext/pdo_firebird/firebird_statement.c +++ b/ext/pdo_firebird/firebird_statement.c @@ -413,6 +413,7 @@ static int firebird_bind_blob(pdo_stmt_t *stmt, ISC_QUAD *blob_id, zval *param) pdo_firebird_stmt *S = (pdo_firebird_stmt*)stmt->driver_data; pdo_firebird_db_handle *H = S->H; isc_blob_handle h = PDO_FIREBIRD_HANDLE_INITIALIZER; + zval data; zend_ulong put_cnt = 0, rem_cnt; unsigned short chunk_size; int result = 1; @@ -422,14 +423,16 @@ static int firebird_bind_blob(pdo_stmt_t *stmt, ISC_QUAD *blob_id, zval *param) return 0; } - SEPARATE_ZVAL(param); - convert_to_string_ex(param); + data = *param; - for (rem_cnt = Z_STRLEN_P(param); rem_cnt > 0; rem_cnt -= chunk_size) { + if (Z_TYPE_P(param) != IS_STRING) { + zval_copy_ctor(&data); + convert_to_string(&data); + } + for (rem_cnt = Z_STRLEN(data); rem_cnt > 0; rem_cnt -= chunk_size) { chunk_size = rem_cnt > USHRT_MAX ? USHRT_MAX : (unsigned short)rem_cnt; - - if (isc_put_segment(H->isc_status, &h, chunk_size, &Z_STRVAL_P(param)[put_cnt])) { + if (isc_put_segment(H->isc_status, &h, chunk_size, &Z_STRVAL(data)[put_cnt])) { RECORD_ERROR(stmt); result = 0; break; @@ -437,7 +440,9 @@ static int firebird_bind_blob(pdo_stmt_t *stmt, ISC_QUAD *blob_id, zval *param) put_cnt += chunk_size; } - zval_dtor(param); + if (Z_TYPE_P(param) != IS_STRING) { + zval_dtor(&data); + } if (isc_close_blob(H->isc_status, &h)) { RECORD_ERROR(stmt); @@ -542,8 +547,19 @@ static int firebird_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_dat S->H->last_app_error = "Cannot bind to array field"; return 0; - case SQL_BLOB: + case SQL_BLOB: { + if (Z_TYPE_P(parameter) == IS_NULL) { + /* Check if field allow NULL values */ + if (~var->sqltype & 1) { + strcpy(stmt->error_code, "HY105"); + S->H->last_app_error = "Parameter requires non-null value"; + return 0; + } + *var->sqlind = -1; + return 1; + } return firebird_bind_blob(stmt, (ISC_QUAD*)var->sqldata, parameter); + } } /* check if a NULL should be inserted */ |