summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArd Biesheuvel <abies@php.net>2003-09-04 14:18:39 +0000
committerArd Biesheuvel <abies@php.net>2003-09-04 14:18:39 +0000
commitcb8da7b090768802480d7555dbec0095e2c9bc79 (patch)
tree99534c300abe413831e4a0b088641757948e8bb0
parent6f998688b527bc9eda5e3d3c0f221a0366764a26 (diff)
downloadphp-git-cb8da7b090768802480d7555dbec0095e2c9bc79.tar.gz
Fix inter-op with IB < 6
Fixes for 64-bit archs
-rw-r--r--ext/interbase/interbase.c98
-rw-r--r--ext/interbase/php_interbase.h7
2 files changed, 67 insertions, 38 deletions
diff --git a/ext/interbase/interbase.c b/ext/interbase/interbase.c
index 48bb79206b..408586a8a6 100644
--- a/ext/interbase/interbase.c
+++ b/ext/interbase/interbase.c
@@ -39,7 +39,7 @@
#endif
#ifndef SQL_DIALECT_CURRENT
-#define SQL_DIALECT_CURRENT SQL_DIALECT_V5
+#define SQL_DIALECT_CURRENT 1 /* == SQL_DIALECT_V5 */
#endif
#ifdef ZEND_DEBUG_
@@ -53,11 +53,17 @@
#define SAFE_STRING(s) ((s)?(s):"")
#ifdef PHP_WIN32
-#define LL_MASK "I64"
-#define LL_LIT(lit) lit ## I64
+# ifndef ISC_UINT64
+# define ISC_UINT64 unsigned __int64
+# endif
+# define LL_MASK "I64"
+# define LL_LIT(lit) lit ## I64
#else
-#define LL_MASK "ll"
-#define LL_LIT(lit) lit ## ll
+# ifndef ISC_UINT64
+# define ISC_UINT64 unsigned long long int
+# endif
+# define LL_MASK "ll"
+# define LL_LIT(lit) lit ## ll
#endif
#define QUERY_RESULT 1
@@ -111,7 +117,6 @@ function_entry ibase_functions[] = {
PHP_FE(ibase_commit, NULL)
PHP_FE(ibase_rollback, NULL)
PHP_FE(ibase_commit_ret, NULL)
- PHP_FE(ibase_rollback_ret, NULL)
PHP_FE(ibase_blob_info, NULL)
PHP_FE(ibase_blob_create, NULL)
@@ -129,6 +134,8 @@ function_entry ibase_functions[] = {
PHP_FE(ibase_add_user, NULL)
PHP_FE(ibase_modify_user, NULL)
PHP_FE(ibase_delete_user, NULL)
+
+ PHP_FE(ibase_rollback_ret, NULL)
#endif
PHP_FE(ibase_wait_event, NULL)
PHP_FE(ibase_set_event_handler, NULL)
@@ -253,7 +260,7 @@ typedef struct {
} ISC_TEB;
typedef struct {
- ISC_USHORT vary_length;
+ unsigned short vary_length;
char vary_string[1];
} IBVARY;
@@ -293,6 +300,7 @@ typedef struct {
union {
short sval;
float fval;
+ ISC_LONG lval;
ISC_QUAD qval;
#ifdef ISC_TIMESTAMP
ISC_TIMESTAMP tsval;
@@ -312,7 +320,7 @@ static inline int _php_ibase_string_to_quad(char const *id, ISC_QUAD *qd)
ISC_UINT64 res;
if (sscanf(id, BLOB_ID_MASK, &res)) {
qd->gds_quad_high = (ISC_LONG) (res >> 0x20);
- qd->gds_quad_low = (ISC_ULONG) (res & 0xFFFFFFFF);
+ qd->gds_quad_low = (unsigned ISC_LONG) (res & 0xFFFFFFFF);
return 1;
}
return 0;
@@ -466,9 +474,6 @@ static void _php_ibase_free_result(zend_rsrc_list_entry *rsrc TSRMLS_DC)
IBDEBUG("Dropping statement handle (free_result dtor)...");
isc_dsql_free_statement(IB_STATUS, &ib_result->stmt, DSQL_drop);
}
- if (ib_result->out_array) {
- efree(ib_result->out_array);
- }
efree(ib_result);
}
}
@@ -1356,8 +1361,22 @@ static int _php_ibase_bind(XSQLDA *sqlda, zval **b_vars, BIND_BUF *buf, ibase_qu
break;
case SQL_LONG:
convert_to_long(b_var);
+#if (SIZEOF_LONG > 4)
+ /* ISC_LONG is always 32-bit */
+ if (Z_LVAL_P(b_var) > INT_MAX || Z_LVAL_P(b_var) < INT_MIN) {
+ _php_ibase_module_error("Parameter %d exceeds field width" TSRMLS_CC, i+1);
+ rv = FAILURE;
+ }
+#endif
+ buf[i].val.lval = (ISC_LONG) Z_LVAL_P(b_var);
+ var->sqldata = (void *) &buf[i].val.lval;
+ break;
+#if defined(SQL_INT64) && (SIZEOF_LONG == 8)
+ case SQL_INT64:
+ convert_to_long(b_var);
var->sqldata = (void *) &Z_LVAL_P(b_var);
break;
+#endif
case SQL_FLOAT:
convert_to_double(b_var);
buf[i].val.fval = (float) Z_DVAL_P(b_var);
@@ -1602,7 +1621,7 @@ static int _php_ibase_exec(INTERNAL_FUNCTION_PARAMETERS, ibase_result **ib_resul
/* allocate sqlda and output buffers */
if (ib_query->out_sqlda) { /* output variables in select, select for update */
IBDEBUG("Query wants XSQLDA for output");
- IB_RESULT = emalloc(sizeof(ibase_result));
+ IB_RESULT = emalloc(sizeof(ibase_result) + sizeof(ibase_array) * (ib_query->out_sqlda->sqld-1));
IB_RESULT->link = ib_query->link;
IB_RESULT->trans = ib_query->trans;
IB_RESULT->stmt = ib_query->stmt;
@@ -1615,10 +1634,7 @@ static int _php_ibase_exec(INTERNAL_FUNCTION_PARAMETERS, ibase_result **ib_resul
_php_ibase_alloc_xsqlda(out_sqlda);
if (ib_query->out_array) {
- IB_RESULT->out_array = safe_emalloc(sizeof(ibase_array), out_sqlda->sqld, 0);
- memcpy(IB_RESULT->out_array, ib_query->out_array, sizeof(ibase_array) * out_sqlda->sqld);
- } else {
- IB_RESULT->out_array = NULL;
+ memcpy(&IB_RESULT->out_array, ib_query->out_array, sizeof(ibase_array) * out_sqlda->sqld);
}
}
@@ -1949,9 +1965,11 @@ static void _php_ibase_trans_end(INTERNAL_FUNCTION_PARAMETERS, int commit)
case COMMIT:
result = isc_commit_transaction(IB_STATUS, &trans->handle);
break;
+#ifdef SQL_DIALECT_V6
case (ROLLBACK | RETAIN):
result = isc_rollback_retaining(IB_STATUS, &trans->handle);
break;
+#endif
case (COMMIT | RETAIN):
result = isc_commit_retaining(IB_STATUS, &trans->handle);
break;
@@ -1996,10 +2014,14 @@ PHP_FUNCTION(ibase_commit_ret)
/* {{{ proto bool ibase_rollback_ret( resource link_identifier )
Rollback transaction and retain the transaction context */
+#ifdef SQL_DIALECT_V6
+
PHP_FUNCTION(ibase_rollback_ret)
{
_php_ibase_trans_end(INTERNAL_FUNCTION_PARAM_PASSTHRU, ROLLBACK | RETAIN);
}
+
+#endif
/* }}} */
/* {{{ proto mixed ibase_query([resource link_identifier, [ resource link_identifier, ]] string query [, mixed bind_arg [, mixed bind_arg [, ...]]])
@@ -2295,8 +2317,32 @@ static int _php_ibase_var_zval(zval *val, void *data, int type, int len, int sca
case SQL_SHORT:
n = *(short *) data;
goto _sql_long;
+#ifdef SQL_INT64
+ case SQL_INT64:
+#if (SIZEOF_LONG >= 8)
+ n = *(long *) data;
+ goto _sql_long;
+#else
+ if (scale == 0) {
+ l = sprintf(string_data, "%.0" LL_MASK "d", *(ISC_INT64 *) data);
+ ZVAL_STRINGL(val,string_data,l,1);
+ } else {
+ ISC_INT64 n = *(ISC_INT64 *) data, f = scales[-scale];
+
+ if (n >= 0) {
+ l = sprintf(string_data, "%" LL_MASK "d.%0*" LL_MASK "d", n / f, -scale, n % f);
+ } else if (n < -f) {
+ l = sprintf(string_data, "%" LL_MASK "d.%0*" LL_MASK "d", n / f, -scale, -n % f);
+ } else {
+ l = sprintf(string_data, "-0.%0*" LL_MASK "d", -scale, -n % f);
+ }
+ ZVAL_STRINGL(val,string_data,l,1);
+ }
+ break;
+#endif
+#endif
case SQL_LONG:
- n = *(long *) data;
+ n = *(ISC_LONG *) data;
_sql_long:
if (scale == 0) {
ZVAL_LONG(val,n);
@@ -2319,24 +2365,6 @@ static int _php_ibase_var_zval(zval *val, void *data, int type, int len, int sca
case SQL_DOUBLE:
ZVAL_DOUBLE(val, *(double *) data);
break;
-#ifdef SQL_INT64
- case SQL_INT64:
- if (scale == 0) {
- l = sprintf(string_data, "%.0" LL_MASK "d", *(ISC_INT64 *) data);
- } else {
- ISC_INT64 n = *(ISC_INT64 *) data, f = scales[-scale];
-
- if (n >= 0) {
- l = sprintf(string_data, "%" LL_MASK "d.%0*" LL_MASK "d", n / f, -scale, n % f);
- } else if (n < -f) {
- l = sprintf(string_data, "%" LL_MASK "d.%0*" LL_MASK "d", n / f, -scale, -n % f);
- } else {
- l = sprintf(string_data, "-0.%0*" LL_MASK "d", -scale, -n % f);
- }
- }
- ZVAL_STRINGL(val,string_data,l,1);
- break;
-#endif
default: /* == any date/time type */
{
struct tm t;
diff --git a/ext/interbase/php_interbase.h b/ext/interbase/php_interbase.h
index b816ba1c82..6fc8f22896 100644
--- a/ext/interbase/php_interbase.h
+++ b/ext/interbase/php_interbase.h
@@ -64,7 +64,6 @@ PHP_FUNCTION(ibase_trans);
PHP_FUNCTION(ibase_commit);
PHP_FUNCTION(ibase_rollback);
PHP_FUNCTION(ibase_commit_ret);
-PHP_FUNCTION(ibase_rollback_ret);
PHP_FUNCTION(ibase_blob_create);
PHP_FUNCTION(ibase_blob_add);
@@ -79,6 +78,8 @@ PHP_FUNCTION(ibase_blob_import);
PHP_FUNCTION(ibase_add_user);
PHP_FUNCTION(ibase_modify_user);
PHP_FUNCTION(ibase_delete_user);
+
+PHP_FUNCTION(ibase_rollback_ret);
#endif
PHP_FUNCTION(ibase_errmsg);
PHP_FUNCTION(ibase_errcode);
@@ -120,7 +121,7 @@ typedef struct {
isc_tr_handle handle;
unsigned short link_cnt;
unsigned long affected_rows;
- ibase_db_link *db_link[1];
+ ibase_db_link *db_link[1]; /* last member */
} ibase_trans;
typedef struct tr_list {
@@ -147,7 +148,7 @@ typedef struct {
unsigned short type;
unsigned char has_more_rows, statement_type;
XSQLDA *out_sqlda;
- ibase_array *out_array;
+ ibase_array out_array[1]; /* last member */
} ibase_result;
typedef struct {