abies Wed Aug 20 08:22:59 2003 EDT
Modified files:
/php-src/ext/interbase php_interbase.h interbase.c
Log:
Nuke link handle from BLOB id
# Now BLOB ids can survive disconnect/reconnect
Added link argument to ibase_blob_{open|info|echo}()
Index: php-src/ext/interbase/php_interbase.h
diff -u php-src/ext/interbase/php_interbase.h:1.53
php-src/ext/interbase/php_interbase.h:1.54
--- php-src/ext/interbase/php_interbase.h:1.53 Sun Aug 17 20:14:53 2003
+++ php-src/ext/interbase/php_interbase.h Wed Aug 20 08:22:58 2003
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: php_interbase.h,v 1.53 2003/08/18 00:14:53 abies Exp $ */
+/* $Id: php_interbase.h,v 1.54 2003/08/20 12:22:58 abies Exp $ */
#ifndef PHP_INTERBASE_H
#define PHP_INTERBASE_H
@@ -28,14 +28,6 @@
extern zend_module_entry ibase_module_entry;
#define phpext_interbase_ptr &ibase_module_entry
-#ifndef ISC_INT64_FORMAT
-#ifdef PHP_WIN32
-#define ISC_INT64_FORMAT "I64"
-#else
-#define ISC_INT64_FORMAT "ll"
-#endif
-#endif
-
PHP_MINIT_FUNCTION(ibase);
PHP_RINIT_FUNCTION(ibase);
PHP_MSHUTDOWN_FUNCTION(ibase);
@@ -97,6 +89,8 @@
#define IBASE_MSGSIZE 256
#define MAX_ERRMSG (IBASE_MSGSIZE*2)
+
+/* this value should never be > USHRT_MAX */
#define IBASE_BLOB_SEG 4096
ZEND_BEGIN_MODULE_GLOBALS(ibase)
@@ -114,7 +108,6 @@
char *cfg_timeformat;
char errmsg[MAX_ERRMSG];
long sql_code;
- HashTable blob_table;
ZEND_END_MODULE_GLOBALS(ibase)
typedef struct {
@@ -143,11 +136,10 @@
} ibase_array;
typedef struct {
- ibase_db_link *link;
isc_blob_handle bl_handle;
ISC_QUAD bl_qd;
unsigned short type;
-} ibase_blob_handle;
+} ibase_blob;
typedef struct {
ibase_db_link *link;
@@ -185,11 +177,6 @@
zval *callback;
void **thread_ctx;
} ibase_event;
-
-typedef struct _php_ibase_varchar {
- short var_len;
- char var_str[1];
-} IBASE_VCHAR;
enum php_interbase_option {
PHP_IBASE_DEFAULT = 0,
Index: php-src/ext/interbase/interbase.c
diff -u php-src/ext/interbase/interbase.c:1.153 php-src/ext/interbase/interbase.c:1.154
--- php-src/ext/interbase/interbase.c:1.153 Sun Aug 17 20:14:53 2003
+++ php-src/ext/interbase/interbase.c Wed Aug 20 08:22:58 2003
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: interbase.c,v 1.153 2003/08/18 00:14:53 abies Exp $ */
+/* $Id: interbase.c,v 1.154 2003/08/20 12:22:58 abies Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -51,8 +51,17 @@
#define SAFE_STRING(s) ((s)?(s):"")
+#ifdef PHP_WIN32
+#define LL_MASK "I64"
+#else
+#define LL_MASK "ll"
+#endif
+
#define BLOB_ID_LEN 18
-#define BLOB_ID_MASK "0x%08lx%08lx"
+#define BLOB_ID_MASK "0x%" LL_MASK "x"
+
+#define BLOB_INPUT 1
+#define BLOB_OUTPUT 2
/* {{{ extension definition structures */
function_entry ibase_functions[] = {
@@ -268,19 +277,33 @@
} BIND_BUF;
-/* get blob handle from argument
- * note: blob already open when handle active
- */
-static int _php_ibase_get_blob_handle(zval **blob_arg, ibase_blob_handle **blob_ptr
TSRMLS_DC)
+static inline int _php_ibase_string_to_quad(char const *id, ISC_QUAD *qd)
{
- int type;
- convert_to_long_ex(blob_arg);
- *blob_ptr = (ibase_blob_handle *) zend_list_find(Z_LVAL_PP(blob_arg), &type);
- if (type != le_blob) {
- _php_ibase_module_error("%d is not blob handle", Z_LVAL_PP(blob_arg));
- return FAILURE;
+ /* shortcut for most common case */
+ if (sizeof(ISC_QUAD) == sizeof(ISC_UINT64)) {
+ return sscanf(id, BLOB_ID_MASK, (ISC_UINT64 *) qd);
+ } else {
+ ISC_UINT64 res;
+ int n = sscanf(id, BLOB_ID_MASK, &res);
+ qd->gds_quad_high = (SLONG) (res >> 0x20);
+ qd->gds_quad_low = (ULONG) (res & 0xFFFFFFFF);
+ return n;
}
- return SUCCESS;
+}
+
+static inline char *_php_ibase_quad_to_string(ISC_QUAD const qd)
+{
+ char *result = (char *) emalloc(BLOB_ID_LEN+1);
+
+ /* shortcut for most common case */
+ if (sizeof(ISC_QUAD) == sizeof(ISC_UINT64)) {
+ sprintf(result, BLOB_ID_MASK, *(ISC_UINT64*) &qd);
+ } else {
+ ISC_UINT64 res = ((ISC_UINT64) qd.gds_quad_high << 0x20) |
qd.gds_quad_low;
+ sprintf(result, BLOB_ID_MASK, res);
+ }
+ result[BLOB_ID_LEN] = '\0';
+ return result;
}
/* blob information struct */
@@ -499,7 +522,7 @@
/* {{{ _php_ibase_free_blob() */
static void _php_ibase_free_blob(zend_rsrc_list_entry *rsrc TSRMLS_DC)
{
- ibase_blob_handle *ib_blob = (ibase_blob_handle *)rsrc->ptr;
+ ibase_blob *ib_blob = (ibase_blob *)rsrc->ptr;
if (ib_blob->bl_handle != NULL) { /* blob open*/
if (isc_cancel_blob(IB_STATUS, &ib_blob->bl_handle)) {
@@ -648,8 +671,6 @@
RESET_ERRMSG;
- zend_hash_init(&IBG(blob_table), 0, NULL, NULL, 0);
-
return SUCCESS;
}
@@ -676,8 +697,6 @@
}
IBG(timeformat) = NULL;
- zend_hash_destroy(&IBG(blob_table));
-
return SUCCESS;
}
@@ -687,7 +706,7 @@
php_info_print_table_start();
php_info_print_table_row(2, "Interbase Support", "enabled");
- php_info_print_table_row(2, "Revision", "$Revision: 1.153 $");
+ php_info_print_table_row(2, "Revision", "$Revision: 1.154 $");
#ifdef COMPILE_DL_INTERBASE
php_info_print_table_row(2, "Dynamic Module", "Yes");
#endif
@@ -1015,7 +1034,6 @@
}
ZEND_FETCH_RESOURCE2(ib_link, ibase_db_link *, link_arg, link_id, "InterBase
link", le_link, le_plink);
- zend_hash_clean(&IBG(blob_table)); /* TODO only remove entries that belong to
closed link */
zend_list_delete(link_id);
RETURN_TRUE;
}
@@ -1061,7 +1079,6 @@
}
zend_list_delete(link_id);
- zend_hash_clean(&IBG(blob_table)); /* TODO only remove entries that belong to
closed link */
RETURN_TRUE;
}
/* }}} */
@@ -1277,7 +1294,7 @@
/* }}} */
/* ((( _php_ibase_blob_add */
-static int _php_ibase_blob_add(zval **string_arg, ibase_blob_handle *ib_blob
TSRMLS_DC)
+static int _php_ibase_blob_add(zval **string_arg, ibase_blob *ib_blob TSRMLS_DC)
{
unsigned long put_cnt = 0, rem_cnt;
unsigned short chunk_size;
@@ -1453,39 +1470,30 @@
#endif
break;
case SQL_BLOB:
- {
- ibase_blob_handle *blob;
- convert_to_string(b_var);
+ convert_to_string(b_var);
- if (Z_STRLEN_P(b_var) != BLOB_ID_LEN ||
-
zend_hash_find(&IBG(blob_table),Z_STRVAL_P(b_var),Z_STRLEN_P(b_var),(void **) &blob)
!= SUCCESS) {
-
- ibase_blob_handle ib_blob;
-
- ib_blob.link = ib_query->link;
- ib_blob.bl_handle = NULL;
-
- if (isc_create_blob(IB_STATUS,
&ib_blob.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;
- }
-
- if (isc_close_blob(IB_STATUS,
&ib_blob.bl_handle)) {
- _php_ibase_error(TSRMLS_C);
- return FAILURE;
- }
- buf[i].val.qval = ib_blob.bl_qd;
- var->sqldata = (void ISC_FAR *)
&buf[i].val.qval;
+ 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, {0, 0},
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;
+ }
- } else {
- var->sqldata = (void ISC_FAR *)
&blob->bl_qd;
+ if (isc_close_blob(IB_STATUS,
&ib_blob.bl_handle)) {
+ _php_ibase_error(TSRMLS_C);
+ return FAILURE;
}
+ buf[i].val.qval = ib_blob.bl_qd;
}
+ var->sqldata = (void ISC_FAR *) &buf[i].val.qval;
break;
case SQL_ARRAY:
_php_ibase_module_error("Binding arrays not supported
yet");
@@ -2307,18 +2315,16 @@
switch (type & ~1) {
case SQL_VARYING:
- len = ((IBASE_VCHAR *) data)->var_len;
- data = ((IBASE_VCHAR *) data)->var_str;
+ len = ((PARAMVARY *) data)->vary_length;
+ data = ((PARAMVARY *) data)->vary_string;
/* fallout */
case SQL_TEXT:
- Z_STRVAL_P(val) = (char *) safe_emalloc(sizeof(char), (len +
1), 0);
- memcpy(Z_STRVAL_P(val), data, len);
- Z_STRVAL_P(val)[len] = '\0';
if (PG(magic_quotes_runtime)) {
- Z_STRVAL_P(val) = php_addslashes(Z_STRVAL_P(val), len,
&len, 1 TSRMLS_CC);
+ Z_STRVAL_P(val) = php_addslashes(data, len,
&Z_STRLEN_P(val), 0 TSRMLS_CC);
+ Z_TYPE_P(val) = IS_STRING;
+ } else {
+ ZVAL_STRINGL(val,(char *) data,len,1);
}
- Z_TYPE_P(val) = IS_STRING;
- Z_STRLEN_P(val) = len;
break;
case SQL_LONG:
case SQL_SHORT:
@@ -2376,17 +2382,17 @@
f *= 10;
}
if (n >= 0) {
- Z_STRLEN_P(val) = sprintf(string_data, "%"
ISC_INT64_FORMAT "d.%0*" ISC_INT64_FORMAT "d",
+ Z_STRLEN_P(val) = sprintf(string_data, "%" LL_MASK
"d.%0*" LL_MASK "d",
(ISC_INT64) n / f, -scale, (ISC_INT64) n % f );
} else if ((n/f) != 0) {
- Z_STRLEN_P(val) = sprintf(string_data, "%"
ISC_INT64_FORMAT "d.%0*" ISC_INT64_FORMAT "d",
+ Z_STRLEN_P(val) = sprintf(string_data, "%" LL_MASK
"d.%0*" LL_MASK "d",
(ISC_INT64) n / f, -scale, (ISC_INT64) -(n % f) );
} else {
- Z_STRLEN_P(val) = sprintf(string_data, "%s.%0*"
ISC_INT64_FORMAT "d",
+ Z_STRLEN_P(val) = sprintf(string_data, "%s.%0*"
LL_MASK "d",
"-0", -scale, (ISC_INT64) -(n % f) );
}
} else {
- Z_STRLEN_P(val) = sprintf(string_data, "%.0"
ISC_INT64_FORMAT "d",
+ Z_STRLEN_P(val) = sprintf(string_data, "%.0" LL_MASK
"d",
*(ISC_INT64 *) data);
}
@@ -2507,7 +2513,7 @@
/* {{{ _php_ibase_blob_get */
-static int _php_ibase_blob_get(zval *return_value, ibase_blob_handle *ib_blob,
unsigned long max_len TSRMLS_DC)
+static int _php_ibase_blob_get(zval *return_value, ibase_blob *ib_blob, unsigned long
max_len TSRMLS_DC)
{
if (ib_blob->bl_qd.gds_quad_high || ib_blob->bl_qd.gds_quad_low) { /*not null
?*/
@@ -2602,32 +2608,18 @@
zval tmp;
switch (var->sqltype & ~1) {
- case SQL_VARYING:
- case SQL_TEXT:
- case SQL_SHORT:
- case SQL_LONG:
- case SQL_FLOAT:
- case SQL_DOUBLE:
-#ifdef SQL_INT64
- case SQL_INT64:
-#endif
-#ifndef SQL_TIMESTAMP
- case SQL_DATE:
-#else
- case SQL_TIMESTAMP:
- case SQL_TYPE_DATE:
- case SQL_TYPE_TIME:
-#endif
+
+ default:
_php_ibase_var_zval(&tmp, var->sqldata,
var->sqltype, var->sqllen, var->sqlscale, flag TSRMLS_CC);
break;
case SQL_BLOB:
if (flag & PHP_IBASE_FETCH_BLOBS) { /* fetch
blob contents into hash */
-
- ibase_blob_handle blob_handle;
+
+ ibase_blob blob_handle;
unsigned long max_len = 0;
static char bl_items[] =
{isc_info_blob_total_length};
char bl_info[20], *p;
-
+
blob_handle.bl_handle = NULL;
blob_handle.bl_qd = *(ISC_QUAD ISC_FAR
*) var->sqldata;
@@ -2643,8 +2635,9 @@
/* find total length of blob's data */
for (p = bl_info; *p != isc_info_end
&& p < bl_info + sizeof(bl_info);) {
- unsigned short item_len, item
= *p++;
-
+ unsigned short item_len;
+ char item = *p++;
+
item_len = (unsigned short)
isc_vax_integer(p, 2);
p += 2;
if (item ==
isc_info_blob_total_length) {
@@ -2668,19 +2661,14 @@
_php_ibase_error(TSRMLS_C);
RETURN_FALSE;
}
-
+
} else { /* blob id only */
- char result[BLOB_ID_LEN];
- ibase_blob_handle ib_blob = {
ib_result->link, NULL, *(ISC_QUAD ISC_FAR *) var->sqldata };
-
- sprintf(result, BLOB_ID_MASK,
ib_blob.bl_qd.gds_quad_high, ib_blob.bl_qd.gds_quad_low);
- zend_hash_update(&IBG(blob_table),
result, BLOB_ID_LEN, &ib_blob, sizeof(ibase_blob_handle), NULL);
- ZVAL_STRINGL(&tmp, result,
BLOB_ID_LEN,1);
+ ISC_QUAD bl_qd = *(ISC_QUAD ISC_FAR *)
var->sqldata;
+
ZVAL_STRINGL(&tmp,_php_ibase_quad_to_string(bl_qd), BLOB_ID_LEN, 0);
}
break;
case SQL_ARRAY: {
- /* TODO array can be *huge* so only fetch it
if asked to */
- /* if (flag & PHP_IBASE_FETCH_ARRAYS) { */
+ if (flag & PHP_IBASE_FETCH_ARRAYS) { /* array
can be *huge* so only fetch if asked */
ISC_QUAD ar_qd = *(ISC_QUAD ISC_FAR *)
var->sqldata;
ibase_array *ib_array =
&ib_result->out_array[arr_cnt];
void *ar_data;
@@ -2700,14 +2688,13 @@
RETURN_FALSE;
}
efree(ar_data);
- /*
- } else {
-
- }*/
+
+ } else { /* blob id only */
+ ISC_QUAD ar_qd = *(ISC_QUAD ISC_FAR *)
var->sqldata;
+
ZVAL_STRINGL(&tmp,_php_ibase_quad_to_string(ar_qd), BLOB_ID_LEN, 0);
+ }
}
break;
- default:
- break;
} /* switch */
if (fetch_type & FETCH_ROW) {
@@ -3295,16 +3282,12 @@
/* {{{ proto int ibase_blob_create([resource link_identifier])
Create blob for adding data */
-
-#define BLOB_INPUT 1
-#define BLOB_OUTPUT 2
-
PHP_FUNCTION(ibase_blob_create)
{
zval **link_arg;
ibase_db_link *ib_link;
ibase_trans *trans = NULL;
- ibase_blob_handle *ib_blob;
+ ibase_blob *ib_blob;
RESET_ERRMSG;
@@ -3328,60 +3311,74 @@
RETURN_FALSE;
}
- ib_blob = (ibase_blob_handle *) emalloc(sizeof(ibase_blob_handle));
- ib_blob->link = ib_link;
+ ib_blob = (ibase_blob *) emalloc(sizeof(ibase_blob));
ib_blob->bl_handle = NULL;
ib_blob->type = BLOB_INPUT;
- if (isc_create_blob(IB_STATUS, &ib_blob->link->handle, &trans->handle,
&ib_blob->bl_handle, &ib_blob->bl_qd)) {
- efree(ib_blob);
+ if (isc_create_blob(IB_STATUS, &ib_link->handle, &trans->handle,
&ib_blob->bl_handle, &ib_blob->bl_qd)) {
_php_ibase_error(TSRMLS_C);
+ efree(ib_blob);
RETURN_FALSE;
}
-
- RETURN_LONG(zend_list_insert(ib_blob, le_blob));
+
+ ZEND_REGISTER_RESOURCE(return_value, ib_blob, le_blob);
}
/* }}} */
-/* {{{ proto int ibase_blob_open(string blob_id)
+/* {{{ proto int ibase_blob_open([ resource link_identifier, ] string blob_id)
Open blob for retrieving data parts */
PHP_FUNCTION(ibase_blob_open)
{
- zval **blob_arg;
- ibase_blob_handle *ib_blob, *ib_blob_id;
+ zval **blob_arg, **link_arg;
+ ibase_db_link *link;
ibase_trans *trans = NULL;
+ ibase_blob *ib_blob;
RESET_ERRMSG;
- if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &blob_arg) == FAILURE) {
- WRONG_PARAM_COUNT;
+ switch (ZEND_NUM_ARGS()) {
+
+ case 1:
+ if (zend_get_parameters_ex(1, &blob_arg) != SUCCESS) {
+ WRONG_PARAM_COUNT;
+ }
+ ZEND_FETCH_RESOURCE2(link, ibase_db_link *, NULL,
IBG(default_link), "InterBase link", le_link, le_plink);
+ break;
+ case 2:
+ if (zend_get_parameters_ex(2, &link_arg, &blob_arg) !=
SUCCESS) {
+ WRONG_PARAM_COUNT;
+ }
+ _php_ibase_get_link_trans(INTERNAL_FUNCTION_PARAM_PASSTHRU,
link_arg, &link, &trans);
+ break;
+ default:
+ WRONG_PARAM_COUNT;
}
- ib_blob = (ibase_blob_handle *) emalloc(sizeof(ibase_blob_handle));
-
convert_to_string_ex(blob_arg);
+
+ ib_blob = (ibase_blob *) emalloc(sizeof(ibase_blob));
+ ib_blob->bl_handle = NULL;
+ ib_blob->type = BLOB_OUTPUT;
- if (zend_hash_find(&IBG(blob_table), Z_STRVAL_PP(blob_arg),
Z_STRLEN_PP(blob_arg), (void **) &ib_blob_id) != SUCCESS) {
+ if (! _php_ibase_string_to_quad(Z_STRVAL_PP(blob_arg), &(ib_blob->bl_qd))) {
+ _php_ibase_module_error("String is not a BLOB ID");
efree(ib_blob);
RETURN_FALSE;
}
-
- *ib_blob = *ib_blob_id;
- ib_blob->bl_handle = NULL;
- ib_blob->type = BLOB_OUTPUT;
/* open default transaction */
- if (_php_ibase_def_trans(ib_blob->link, &trans TSRMLS_CC) == FAILURE) {
+ if (_php_ibase_def_trans(link, &trans TSRMLS_CC) == FAILURE) {
+ efree(ib_blob);
RETURN_FALSE;
}
- if (isc_open_blob(IB_STATUS, &ib_blob->link->handle, &trans->handle,
&ib_blob->bl_handle, &ib_blob->bl_qd)) {
- efree(ib_blob);
+ if (isc_open_blob(IB_STATUS, &link->handle, &trans->handle,
&ib_blob->bl_handle, &ib_blob->bl_qd)) {
_php_ibase_error(TSRMLS_C);
+ efree(ib_blob);
RETURN_FALSE;
}
- RETURN_LONG(zend_list_insert(ib_blob, le_blob));
+ ZEND_REGISTER_RESOURCE(return_value, ib_blob, le_blob);
}
/* }}} */
@@ -3390,7 +3387,7 @@
PHP_FUNCTION(ibase_blob_add)
{
zval **blob_arg, **string_arg;
- ibase_blob_handle *ib_blob;
+ ibase_blob *ib_blob;
RESET_ERRMSG;
@@ -3398,14 +3395,13 @@
WRONG_PARAM_COUNT;
}
- if (_php_ibase_get_blob_handle(blob_arg, &ib_blob TSRMLS_CC) != SUCCESS) {
- RETURN_FALSE;
- }
+ ZEND_FETCH_RESOURCE(ib_blob, ibase_blob *, blob_arg, -1, "Interbase blob",
le_blob);
if (ib_blob->type != BLOB_INPUT) {
_php_ibase_module_error("BLOB is not open for input");
RETURN_FALSE;
}
+
if (_php_ibase_blob_add(string_arg, ib_blob TSRMLS_CC) != SUCCESS) {
RETURN_FALSE;
}
@@ -3417,7 +3413,7 @@
PHP_FUNCTION(ibase_blob_get)
{
zval **blob_arg, **len_arg;
- ibase_blob_handle *ib_blob;
+ ibase_blob *ib_blob;
RESET_ERRMSG;
@@ -3425,9 +3421,7 @@
WRONG_PARAM_COUNT;
}
- if (_php_ibase_get_blob_handle(blob_arg, &ib_blob TSRMLS_CC) != SUCCESS) {
- RETURN_FALSE;
- }
+ ZEND_FETCH_RESOURCE(ib_blob, ibase_blob *, blob_arg, -1, "Interbase blob",
le_blob);
if (ib_blob->type != BLOB_OUTPUT) {
_php_ibase_module_error("BLOB is not open for output");
@@ -3450,8 +3444,7 @@
static void _php_ibase_blob_end(INTERNAL_FUNCTION_PARAMETERS, int bl_end)
{
zval **blob_arg;
- ibase_blob_handle *ib_blob;
- char *result;
+ ibase_blob *ib_blob;
RESET_ERRMSG;
@@ -3459,9 +3452,7 @@
WRONG_PARAM_COUNT;
}
- if (_php_ibase_get_blob_handle(blob_arg, &ib_blob TSRMLS_CC) != SUCCESS) {
- RETURN_FALSE;
- }
+ ZEND_FETCH_RESOURCE(ib_blob, ibase_blob *, blob_arg, -1, "Interbase blob",
le_blob);
if (bl_end == BLOB_CLOSE) { /* return id here */
@@ -3473,13 +3464,7 @@
}
ib_blob->bl_handle = NULL;
- result = (char *) emalloc(BLOB_ID_LEN+1);
- sprintf(result, BLOB_ID_MASK, ib_blob->bl_qd.gds_quad_high,
ib_blob->bl_qd.gds_quad_low);
- result[BLOB_ID_LEN] = '\0';
- if (ib_blob->type == BLOB_INPUT) {
- zend_hash_update(&IBG(blob_table), result, BLOB_ID_LEN,
ib_blob, sizeof(ibase_blob_handle), NULL);
- }
- RETVAL_STRINGL(result, BLOB_ID_LEN, 0);
+ RETVAL_STRINGL(_php_ibase_quad_to_string(ib_blob->bl_qd), BLOB_ID_LEN,
0);
} else { /* discard created blob */
if (isc_cancel_blob(IB_STATUS, &ib_blob->bl_handle)) {
_php_ibase_error(TSRMLS_C);
@@ -3508,46 +3493,61 @@
}
/* }}} */
-/* {{{ proto object ibase_blob_info(string blob_id_str)
+/* {{{ proto object ibase_blob_info([ resource link_identifier, ] string blob_id_str)
Return blob length and other useful info */
PHP_FUNCTION(ibase_blob_info)
{
- zval **blob_arg, **result_var;
- ibase_blob_handle *ib_blob_id;
+ zval **blob_arg, **link_arg, **result_var;
+ ibase_db_link *link;
ibase_trans *trans = NULL;
+ ibase_blob ib_blob = { NULL, { 0, 0 }, BLOB_INPUT };
IBASE_BLOBINFO bl_info;
RESET_ERRMSG;
- if (ZEND_NUM_ARGS() !=1 || zend_get_parameters_ex(1, &blob_arg) == FAILURE) {
- WRONG_PARAM_COUNT;
+ switch (ZEND_NUM_ARGS()) {
+
+ case 1:
+ if (zend_get_parameters_ex(1, &blob_arg) != SUCCESS) {
+ WRONG_PARAM_COUNT;
+ }
+ ZEND_FETCH_RESOURCE2(link, ibase_db_link *, NULL,
IBG(default_link), "InterBase link", le_link, le_plink);
+ break;
+ case 2:
+ if (zend_get_parameters_ex(2, &link_arg, &blob_arg) !=
SUCCESS) {
+ WRONG_PARAM_COUNT;
+ }
+ _php_ibase_get_link_trans(INTERNAL_FUNCTION_PARAM_PASSTHRU,
link_arg, &link, &trans);
+ break;
+ default:
+ WRONG_PARAM_COUNT;
}
-
- if (zend_hash_find(&IBG(blob_table), Z_STRVAL_PP(blob_arg),
Z_STRLEN_PP(blob_arg), (void **) &ib_blob_id) != SUCCESS) {
+
+ convert_to_string_ex(blob_arg);
+
+ if (! _php_ibase_string_to_quad(Z_STRVAL_PP(blob_arg), &(ib_blob.bl_qd))) {
+ _php_ibase_module_error("Unrecognized BLOB ID");
RETURN_FALSE;
}
-
+
/* open default transaction */
- if (_php_ibase_def_trans(ib_blob_id->link, &trans TSRMLS_CC) == FAILURE) {
+ if (_php_ibase_def_trans(link, &trans TSRMLS_CC) == FAILURE) {
RETURN_FALSE;
}
- array_init(return_value);
-
- if (ib_blob_id->bl_qd.gds_quad_high || ib_blob_id->bl_qd.gds_quad_low) { /*
not null ? */
- if (isc_open_blob(IB_STATUS, &ib_blob_id->link->handle,
&trans->handle, &ib_blob_id->bl_handle, &ib_blob_id->bl_qd)) {
+ if (ib_blob.bl_qd.gds_quad_high || ib_blob.bl_qd.gds_quad_low) { /* not null ?
*/
+ if (isc_open_blob(IB_STATUS, &link->handle, &trans->handle,
&ib_blob.bl_handle, &ib_blob.bl_qd)) {
_php_ibase_error(TSRMLS_C);
RETURN_FALSE;
}
- if (_php_ibase_blob_info(ib_blob_id->bl_handle, &bl_info TSRMLS_CC)) {
+ if (_php_ibase_blob_info(ib_blob.bl_handle, &bl_info TSRMLS_CC)) {
RETURN_FALSE;
}
- if (isc_close_blob(IB_STATUS, &ib_blob_id->bl_handle)) {
+ if (isc_close_blob(IB_STATUS, &ib_blob.bl_handle)) {
_php_ibase_error(TSRMLS_C);
RETURN_FALSE;
}
- ib_blob_id->bl_handle = NULL;
} else { /* null blob, all values to zero */
bl_info.max_segment = 0;
bl_info.num_segments = 0;
@@ -3555,6 +3555,8 @@
bl_info.bl_stream = 0;
}
+ array_init(return_value);
+
/* FIXME */
add_get_index_long(return_value, 0, bl_info.total_length, (void **)
&result_var);
/*
@@ -3576,44 +3578,62 @@
zend_hash_pointer_update(Z_ARRVAL_P(return_value), "stream", sizeof("stream"),
result_var);
*/
- add_get_index_long(return_value, 4, (!ib_blob_id->bl_qd.gds_quad_high &&
!ib_blob_id->bl_qd.gds_quad_low), (void **) &result_var);
+ add_get_index_long(return_value, 4, (!ib_blob.bl_qd.gds_quad_high &&
!ib_blob.bl_qd.gds_quad_low), (void **) &result_var);
/*
zend_hash_pointer_update(Z_ARRVAL_P(return_value), "isnull", sizeof("isnull"),
result_var);
*/
}
/* }}} */
-/* {{{ proto bool ibase_blob_echo(string blob_id_str)
+/* {{{ proto bool ibase_blob_echo([ resource link_identifier, ] string blob_id_str)
Output blob contents to browser */
PHP_FUNCTION(ibase_blob_echo)
{
- zval **blob_arg;
- char bl_data[IBASE_BLOB_SEG];
- unsigned short seg_len;
- ibase_blob_handle *ib_blob_id;
+ zval **blob_arg, **link_arg;
+ ibase_db_link *link;
ibase_trans *trans = NULL;
+ ibase_blob ib_blob_id = { NULL, { 0, 0 }, 0 };
+ char bl_data[IBASE_BLOB_SEG];
+ unsigned short seg_len;
RESET_ERRMSG;
- if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &blob_arg) == FAILURE) {
- WRONG_PARAM_COUNT;
+ switch (ZEND_NUM_ARGS()) {
+
+ case 1:
+ if (zend_get_parameters_ex(1, &blob_arg) != SUCCESS) {
+ WRONG_PARAM_COUNT;
+ }
+ ZEND_FETCH_RESOURCE2(link, ibase_db_link *, NULL,
IBG(default_link), "InterBase link", le_link, le_plink);
+ break;
+ case 2:
+ if (zend_get_parameters_ex(2, &link_arg, &blob_arg) !=
SUCCESS) {
+ WRONG_PARAM_COUNT;
+ }
+ _php_ibase_get_link_trans(INTERNAL_FUNCTION_PARAM_PASSTHRU,
link_arg, &link, &trans);
+ break;
+ default:
+ WRONG_PARAM_COUNT;
}
- if (zend_hash_find(&IBG(blob_table), Z_STRVAL_PP(blob_arg),
Z_STRLEN_PP(blob_arg), (void **) &ib_blob_id) != SUCCESS) {
+ convert_to_string_ex(blob_arg);
+
+ if (! _php_ibase_string_to_quad(Z_STRVAL_PP(blob_arg), &(ib_blob_id.bl_qd))) {
+ _php_ibase_module_error("Unrecognized BLOB ID");
RETURN_FALSE;
}
-
+
/* open default transaction */
- if (_php_ibase_def_trans(ib_blob_id->link, &trans TSRMLS_CC) == FAILURE) {
+ if (_php_ibase_def_trans(link, &trans TSRMLS_CC) == FAILURE) {
RETURN_FALSE;
}
- if (isc_open_blob(IB_STATUS, &ib_blob_id->link->handle, &trans->handle,
&ib_blob_id->bl_handle, &ib_blob_id->bl_qd)) {
+ if (isc_open_blob(IB_STATUS, &link->handle, &trans->handle,
&ib_blob_id.bl_handle, &ib_blob_id.bl_qd)) {
_php_ibase_error(TSRMLS_C);
RETURN_FALSE;
}
- while (!isc_get_segment(IB_STATUS, &ib_blob_id->bl_handle, &seg_len,
sizeof(bl_data), bl_data) || IB_STATUS[1] == isc_segment) {
+ while (!isc_get_segment(IB_STATUS, &ib_blob_id.bl_handle, &seg_len,
sizeof(bl_data), bl_data) || IB_STATUS[1] == isc_segment) {
PHPWRITE(bl_data, seg_len);
}
@@ -3622,12 +3642,10 @@
RETURN_FALSE;
}
- if (isc_close_blob(IB_STATUS, &ib_blob_id->bl_handle)) {
+ if (isc_close_blob(IB_STATUS, &ib_blob_id.bl_handle)) {
_php_ibase_error(TSRMLS_C);
RETURN_FALSE;
}
- ib_blob_id->bl_handle = NULL;
-
RETURN_TRUE;
}
/* }}} */
@@ -3639,15 +3657,10 @@
zval **link_arg, **file_arg;
int link_id = 0, size;
unsigned short b;
- ibase_blob_handle ib_blob = { NULL, NULL, { 0, 0 }, 0 };
+ ibase_blob ib_blob = { NULL, { 0, 0 }, 0 };
ibase_db_link *ib_link;
ibase_trans *trans = NULL;
-#if (IBASE_BLOB_SEG > USHRT_MAX)
- char bl_data[USHRT_MAX]; /* should never be > 64k */
-#else
char bl_data[IBASE_BLOB_SEG];
-#endif
- char result[BLOB_ID_LEN];
php_stream *stream;
RESET_ERRMSG;
@@ -3678,9 +3691,7 @@
php_stream_from_zval(stream, file_arg);
- ib_blob.link = ib_link;
-
- if (isc_create_blob(IB_STATUS, &ib_blob.link->handle, &trans->handle,
&ib_blob.bl_handle, &ib_blob.bl_qd)) {
+ if (isc_create_blob(IB_STATUS, &ib_link->handle, &trans->handle,
&ib_blob.bl_handle, &ib_blob.bl_qd)) {
_php_ibase_error(TSRMLS_C);
RETURN_FALSE;
}
@@ -3700,9 +3711,7 @@
RETURN_FALSE;
}
- sprintf(result, BLOB_ID_MASK, ib_blob.bl_qd.gds_quad_high,
ib_blob.bl_qd.gds_quad_low);
- zend_hash_update(&IBG(blob_table), result, BLOB_ID_LEN, &ib_blob,
sizeof(ibase_blob_handle), NULL);
- RETURN_STRINGL(result, BLOB_ID_LEN, 1);
+ RETURN_STRINGL( _php_ibase_quad_to_string(ib_blob.bl_qd), BLOB_ID_LEN, 0);
}
/* }}} */
@@ -3886,6 +3895,7 @@
unsigned short *l, char **event_buf, char **result_buf)
{
ISC_STATUS dummy_result[20];
+ unsigned long dummy_count[15];
/**
* Unfortunately, there's no clean and portable way in C to pass arguments to
@@ -3910,7 +3920,7 @@
*/
isc_wait_for_event(dummy_result, &ib_link->handle, *l, *event_buf,
*result_buf);
- isc_event_counts(dummy_result, *l, *event_buf, *result_buf);
+ isc_event_counts(dummy_count, *l, *event_buf, *result_buf);
}
/* }}} */
@@ -3922,7 +3932,7 @@
ibase_db_link *ib_link;
char *event_buffer, *result_buffer, *events[15];
unsigned short i = 0, event_count = 0, buffer_size;
- ISC_STATUS occurred_event[15];
+ unsigned long occurred_event[15];
RESET_ERRMSG;
@@ -4001,7 +4011,7 @@
if (event->callback != NULL) {
unsigned short i;
- ISC_STATUS occurred_event[15];
+ unsigned long occurred_event[15];
zval event_name, link_id, return_value, *args[2] = { &event_name,
&link_id };
/* copy the updated results into the result buffer */
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php