summaryrefslogtreecommitdiff
path: root/ext/pdo_firebird/firebird_statement.c
diff options
context:
space:
mode:
authorArd Biesheuvel <abies@php.net>2004-06-13 23:24:31 +0000
committerArd Biesheuvel <abies@php.net>2004-06-13 23:24:31 +0000
commit2b214762073eff8b265a4aecdab3f315f646d248 (patch)
treebbf7b6dcb68b8ed84626c2c0746ecc8e6df57fda /ext/pdo_firebird/firebird_statement.c
parent1d7a4ed49291944270e9f95d21dac1d2fddc32ba (diff)
downloadphp-git-2b214762073eff8b265a4aecdab3f315f646d248.tar.gz
Release isc statement handle when dtor is called
Don't separate() bound zvals
Diffstat (limited to 'ext/pdo_firebird/firebird_statement.c')
-rw-r--r--ext/pdo_firebird/firebird_statement.c63
1 files changed, 37 insertions, 26 deletions
diff --git a/ext/pdo_firebird/firebird_statement.c b/ext/pdo_firebird/firebird_statement.c
index a3ab575aaa..5d6e86fe4e 100644
--- a/ext/pdo_firebird/firebird_statement.c
+++ b/ext/pdo_firebird/firebird_statement.c
@@ -53,8 +53,14 @@ static void free_sqlda(XSQLDA const *sqlda) /* {{{ */
static int firebird_stmt_dtor(pdo_stmt_t *stmt TSRMLS_DC) /* {{{ */
{
pdo_firebird_stmt *S = (pdo_firebird_stmt*)stmt->driver_data;
- int i;
+ int result = 1, i;
+ /* release the statement */
+ if (*S->name && isc_dsql_free_statement(S->H->isc_status, &S->stmt, DSQL_drop)) {
+ RECORD_ERROR(stmt);
+ result = 0;
+ }
+
/* clean up the fetch buffers if they have been used */
for (i = 0; i < S->out_sqlda.sqld; ++i) {
if (S->fetch_buf[i]) {
@@ -72,7 +78,7 @@ static int firebird_stmt_dtor(pdo_stmt_t *stmt TSRMLS_DC) /* {{{ */
free_sqlda(&S->out_sqlda);
efree(S);
- return 1;
+ return result;
}
/* }}} */
@@ -329,12 +335,10 @@ static int firebird_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_dat
}
switch (event_type) {
- zval *zparam;
char *value;
unsigned long value_len;
case PDO_PARAM_EVT_ALLOC:
-
if (param->is_param) {
/* allocate the parameter */
var->sqlind = (void*)emalloc(var->sqllen + 2*sizeof(short));
@@ -343,17 +347,26 @@ static int firebird_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_dat
break;
case PDO_PARAM_EVT_EXEC_PRE:
-
if (!param->is_param) {
break;
}
- zparam = param->parameter;
+ *var->sqlind = 0;
/* check if a NULL should be inserted */
- switch (Z_TYPE_P(zparam)) {
+ switch (Z_TYPE_P(param->parameter)) {
int force_null;
-
+
+ case IS_LONG:
+ var->sqltype = sizeof(long) == 8 ? SQL_INT64 : SQL_LONG;
+ var->sqldata = (void*)&Z_LVAL_P(param->parameter);
+ var->sqllen = sizeof(long);
+ break;
+ case IS_DOUBLE:
+ var->sqltype = SQL_DOUBLE;
+ var->sqldata = (void*)&Z_DVAL_P(param->parameter);
+ var->sqllen = sizeof(double);
+ break;
case IS_STRING:
force_null = 0;
@@ -367,30 +380,28 @@ static int firebird_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_dat
case SQL_TIMESTAMP:
case SQL_TYPE_DATE:
case SQL_TYPE_TIME:
- force_null = (Z_STRLEN_P(zparam) == 0);
+ force_null = (Z_STRLEN_P(param->parameter) == 0);
+ }
+ if (!force_null) {
+ var->sqltype = SQL_TEXT;
+ var->sqldata = Z_STRVAL_P(param->parameter);
+ var->sqllen = Z_STRLEN_P(param->parameter);
+ break;
}
- if (! force_null) break;
-
case IS_NULL:
/* complain if this field doesn't allow NULL values */
- if (! (var->sqltype & 1)) {
+ if (~var->sqltype & 1) {
stmt->error_code = PDO_ERR_CONSTRAINT;
+ S->H->last_app_error = "Parameter requires non-null value";
return 0;
}
*var->sqlind = -1;
- return 1;
+ break;
+ default:
+ stmt->error_code = PDO_ERR_NOT_IMPLEMENTED;
+ S->H->last_app_error = "Binding arrays/objects is not supported";
+ return 0;
}
-
- *var->sqlind = 0;
-
- SEPARATE_ZVAL(&zparam);
-
- convert_to_string(zparam);
-
- var->sqltype = SQL_TEXT;
- var->sqldata = Z_STRVAL_P(zparam);
- var->sqllen = Z_STRLEN_P(zparam);
-
break;
case PDO_PARAM_EVT_FETCH_POST:
@@ -449,7 +460,7 @@ static int firebird_stmt_set_attribute(pdo_stmt_t *stmt, long attr, zval *val TS
}
/* }}} */
-static int firebird_stmt_get_attribute(pdo_stmt_t *stmt, long attr, zval *val TSRMLS_DC)
+static int firebird_stmt_get_attribute(pdo_stmt_t *stmt, long attr, zval *val TSRMLS_DC) /* {{{ */
{
pdo_firebird_stmt *S = (pdo_firebird_stmt*)stmt->driver_data;
@@ -468,7 +479,7 @@ static int firebird_stmt_get_attribute(pdo_stmt_t *stmt, long attr, zval *val TS
}
/* }}} */
-struct pdo_stmt_methods firebird_stmt_methods = {
+struct pdo_stmt_methods firebird_stmt_methods = { /* {{{ */
firebird_stmt_dtor,
firebird_stmt_execute,
firebird_stmt_fetch,