abies Sun Mar 7 09:25:09 2004 EDT
Modified files:
/php-src/ext/interbase interbase.c
Log:
Added missing support for binding timestamps
# Returning timestamps was already supported
http://cvs.php.net/diff.php/php-src/ext/interbase/interbase.c?r1=1.203&r2=1.204&ty=u
Index: php-src/ext/interbase/interbase.c
diff -u php-src/ext/interbase/interbase.c:1.203 php-src/ext/interbase/interbase.c:1.204
--- php-src/ext/interbase/interbase.c:1.203 Fri Feb 20 05:59:23 2004
+++ php-src/ext/interbase/interbase.c Sun Mar 7 09:25:08 2004
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: interbase.c,v 1.203 2004/02/20 10:59:23 abies Exp $ */
+/* $Id: interbase.c,v 1.204 2004/03/07 14:25:08 abies Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -30,7 +30,7 @@
#include "php.h"
-#define FILE_REVISION "$Revision: 1.203 $"
+#define FILE_REVISION "$Revision: 1.204 $"
#if HAVE_IBASE
@@ -252,7 +252,7 @@
float fval;
ISC_LONG lval;
ISC_QUAD qval;
-#ifdef ISC_TIMESTAMP
+#ifdef SQL_TIMESTAMP
ISC_TIMESTAMP tsval;
ISC_DATE dtval;
ISC_TIME tmval;
@@ -796,7 +796,7 @@
break;
}
info_func = (void (__stdcall *)(char*))GetProcAddress(l,
"isc_get_client_version");
-#endif
+#endif
if (info_func) {
info_func(s = tmp);
} else {
@@ -1026,7 +1026,7 @@
zval **link_arg = NULL;
ibase_db_link *ib_link;
int link_id;
-
+
RESET_ERRMSG;
switch (ZEND_NUM_ARGS()) {
@@ -1200,7 +1200,7 @@
/* calculate elements count */
for (dim = 0; dim < ar_desc->array_desc_dimensions; dim++) {
- ar_size *= 1 +
ar_desc->array_desc_bounds[dim].array_bound_upper
+ ar_size *= 1 +
ar_desc->array_desc_bounds[dim].array_bound_upper
-ar_desc->array_desc_bounds[dim].array_bound_lower;
}
IB_ARRAY[i].ar_size = IB_ARRAY[i].el_size * ar_size;
@@ -1347,8 +1347,8 @@
{
subval = &pnull_val;
}
-
- if (_php_ibase_bind_array(*subval, buf, slice_size, array,
dim+1 TSRMLS_CC) == FAILURE)
+
+ if (_php_ibase_bind_array(*subval, buf, slice_size, array,
dim+1 TSRMLS_CC) == FAILURE)
{
return FAILURE;
}
@@ -1549,16 +1549,16 @@
XSQLVAR *var = sqlda->sqlvar;
for (i = 0; i < sqlda->sqld; ++var, ++i) { /* bound vars */
-
+
zval *b_var = b_vars[i];
var->sqlind = &buf[i].sqlind;
-
+
if (Z_TYPE_P(b_var) == IS_NULL) {
- if ((var->sqltype & 1) != 1) {
- _php_ibase_module_error("Parameter %d must have a
value" TSRMLS_CC, i+1);
- rv = FAILURE;
- }
+ if ((var->sqltype & 1) != 1) {
+ _php_ibase_module_error("Parameter %d must have a
value" TSRMLS_CC, i+1);
+ rv = FAILURE;
+ }
buf[i].sqlind = -1;
} else {
buf[i].sqlind = 0;
@@ -1570,8 +1570,10 @@
*/
var->sqltype = SQL_TEXT;
}
-
+
switch (var->sqltype & ~1) {
+ struct tm t;
+
case SQL_SHORT:
convert_to_long(b_var);
if (Z_LVAL_P(b_var) > SHRT_MAX ||
Z_LVAL_P(b_var) < SHRT_MIN) {
@@ -1608,80 +1610,91 @@
convert_to_double(b_var);
var->sqldata = (void *) &Z_DVAL_P(b_var);
break;
+
+ case SQL_DATE: /* == SQL_TIMESTAMP: */
+#ifdef SQL_TIMESTAMP
+ case SQL_TYPE_DATE:
+ case SQL_TYPE_TIME:
+#endif
+ if (Z_TYPE_P(b_var) == IS_LONG) {
+ /* insert timestamp directly */
+ gmtime_r(&Z_LVAL_P(b_var),&t);
+ } else {
+#ifndef HAVE_STRPTIME
#ifndef SQL_TIMESTAMP
- case SQL_DATE:
- convert_to_string(b_var);
- {
- struct tm t;
-#ifdef HAVE_STRPTIME
- strptime(Z_STRVAL_P(b_var),
IBG(timestampformat), &t);
-#else
- /* Parsing doesn't seem to happen with
older versions... */
int n;
-
+
t.tm_year = t.tm_mon = t.tm_mday =
t.tm_hour = t.tm_min = t.tm_sec = 0;
-
+
n = sscanf(Z_STRVAL_P(b_var),
"%d%*[/]%d%*[/]%d %d%*[:]%d%*[:]%d",
&t.tm_mon, &t.tm_mday,
&t.tm_year, &t.tm_hour, &t.tm_min, &t.tm_sec);
-
+
if (n != 3 && n != 6) {
_php_ibase_module_error("Parameter %d: invalid date/time format "
"(expected 3 or 6
fields, got %d. Use format m/d/Y H:i:s. You gave '%s')"
TSRMLS_CC, i+1, n,
Z_STRVAL_P(b_var));
rv = FAILURE;
+ break;
}
t.tm_year -= 1900;
t.tm_mon--;
+#else
+ goto php_ibase_bind_default; /* let IB
string handling take over */
#endif
- isc_encode_date(&t, &buf[i].val.qval);
- var->sqldata = (void *)
(&buf[i].val.qval);
- }
#else
-#ifdef HAVE_STRPTIME
- case SQL_TIMESTAMP:
- case SQL_TYPE_DATE:
- case SQL_TYPE_TIME:
- {
- struct tm t;
-
convert_to_string(b_var);
-
+
switch (var->sqltype & ~1) {
- case SQL_TIMESTAMP:
+ default: /* == case
SQL_TIMESTAMP/SQL_DATE: */
strptime(Z_STRVAL_P(b_var), IBG(timestampformat), &t);
-
isc_encode_timestamp(&t, &buf[i].val.tsval);
- var->sqldata = (void
*) (&buf[i].val.tsval);
break;
case SQL_TYPE_DATE:
strptime(Z_STRVAL_P(b_var), IBG(dateformat), &t);
-
isc_encode_sql_date(&t, &buf[i].val.dtval);
- var->sqldata = (void
*) (&buf[i].val.dtval);
break;
case SQL_TYPE_TIME:
strptime(Z_STRVAL_P(b_var), IBG(timeformat), &t);
-
isc_encode_sql_time(&t, &buf[i].val.tmval);
- var->sqldata = (void
*) (&buf[i].val.tmval);
break;
}
- }
#endif
+ }
+
+#ifndef SQL_TIMESTAMP
+ isc_encode_date(&t, &buf[i].val.qval);
+ var->sqldata = (void *) (&buf[i].val.qval);
+#else
+ switch (var->sqltype & ~1) {
+ default: /* == case SQL_TIMESTAMP */
+ isc_encode_timestamp(&t,
&buf[i].val.tsval);
+ var->sqldata = (void *)
(&buf[i].val.tsval);
+ break;
+ case SQL_TYPE_DATE:
+ strptime(Z_STRVAL_P(b_var),
IBG(dateformat), &t);
+ isc_encode_sql_date(&t,
&buf[i].val.dtval);
+ var->sqldata = (void *)
(&buf[i].val.dtval);
+ break;
+ case SQL_TYPE_TIME:
+ strptime(Z_STRVAL_P(b_var),
IBG(timeformat), &t);
+ isc_encode_sql_time(&t,
&buf[i].val.tmval);
+ var->sqldata = (void *)
(&buf[i].val.tmval);
+ break;
#endif
+ }
break;
case SQL_BLOB:
-
+
convert_to_string(b_var);
-
+
if (Z_STRLEN_P(b_var) != BLOB_ID_LEN ||
!_php_ibase_string_to_quad(Z_STRVAL_P(b_var), &buf[i].val.qval)) {
-
+
ibase_blob ib_blob = { NULL,
BLOB_INPUT };
-
+
if (isc_create_blob(IB_STATUS,
&ib_query->link->handle,
&ib_query->trans->handle, &ib_blob.bl_handle, &ib_blob.bl_qd)) {
_php_ibase_error(TSRMLS_C);
return FAILURE;
}
-
+
if (_php_ibase_blob_add(&b_var,
&ib_blob TSRMLS_CC) != SUCCESS) {
return FAILURE;
}
@@ -1737,6 +1750,7 @@
var->sqldata = (void *) &buf[i].val.qval;
break;
default:
+php_ibase_bind_default:
convert_to_string(b_var);
var->sqldata = Z_STRVAL_P(b_var);
var->sqllen = Z_STRLEN_P(b_var);-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
