Re: [PHP-DEV] Transparent use of blobs in Interbase

2001-07-06 Thread derick

Hello,

On Thu, 5 Jul 2001, Jeremy Bettis wrote:

 This patch will make it so that no special effort is required to use blobs
 in interbase.  Since the blob functions don't seem to work right anyway, I
 see no reason that you should not include this patch.  (patch against
 current cvs)

Can you send this patch to the list as an attachment? It's a little messed
up due to line endings.

Derick



 Index: ext/interbase/interbase.c
 ===
 RCS file: /repository/php4/ext/interbase/interbase.c,v
 retrieving revision 1.58
 diff -u -r1.58 interbase.c
 --- ext/interbase/interbase.c 2001/06/09 09:30:42 1.58
 +++ ext/interbase/interbase.c 2001/07/05 19:12:46
 @@ -25,6 +25,15 @@

  /*
   Changes:
 + 2001-06-13: Jeremy Bettis [EMAIL PROTECTED]
 + - Return the text of blobs in _php_ibase_fetch_hash, not the blob
 +   handles, even if the BLOB is not of TEXT type
 +  2001-05-31: Jeremy Bettis [EMAIL PROTECTED]
 +   - If a blob handle was expected and something else was
 + received create a blob and add the value to it.
 +   - If the incoming argument to a bind parameter is NULL
 + then store a NULL in the database.
 +   - More verbose date errors.
1999-09-21: Ivo Panacek [EMAIL PROTECTED]
 - added COMPILE_DL section
 - more verbose php_info_ibase function
 @@ -1130,7 +1139,7 @@

  /* {{{ _php_ibase_bind()
 Bind parameter placeholders in a previously prepared query */
 -static int _php_ibase_bind(XSQLDA *sqlda, pval **b_vars, BIND_BUF *buf)
 +static int _php_ibase_bind(XSQLDA *sqlda, pval **b_vars, BIND_BUF *buf,
 ibase_query *ib_query)
  {
   XSQLVAR *var;
   pval *b_var;
 @@ -1143,6 +1152,15 @@
var-sqlind  = buf[i].sqlind;
b_var = b_vars[i];

 +  if (b_var-type == IS_NULL) {
 +   static char nothing[64];
 +   static short null_flag = -1;
 +   var-sqldata = nothing;
 +   var-sqltype |= 1;
 +   var-sqlind = null_flag;
 +   if (var-sqllen  64)
 +var-sqllen = 64;
 +  } else
switch(var-sqltype  ~1) {
 case SQL_TEXT:  /* direct to variable */
 case SQL_VARYING:
 @@ -1220,7 +1238,7 @@
   n = sscanf(b_var-value.str.val,%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(invalid date/time format);
 +  _php_ibase_module_error(invalid date/time format: Expected 3 or 6
 fields, got %d. Use format m/d/Y H:i:s. You gave '%s', n,
 b_var-value.str.val);
return FAILURE;
   }
   t.tm_year -= 1900;
 @@ -1278,12 +1296,36 @@
   if (b_var-type != IS_STRING
|| b_var-value.str.len != sizeof(ibase_blob_handle)
|| ((ibase_blob_handle *)(b_var-value.str.val))-bl_handle != 0) {
 +  IBLS_FETCH();
 +  ibase_blob_handle *ib_blob;
 +  ib_blob = (ibase_blob_handle *) emalloc(sizeof(ibase_blob_handle));
 +  ib_blob-trans_handle = ib_query-trans;
 +  ib_blob-link = ib_query-link;
 +  ib_blob-bl_handle = NULL;
 +  if (isc_create_blob(IB_STATUS, ib_blob-link,
 ib_blob-trans_handle, ib_blob-bl_handle, ib_blob-bl_qd)) {
 +   efree(ib_blob);
 +   _php_ibase_error();
 +   return FAILURE;
 +  }
 +  convert_to_string(b_var);
 +  if (isc_put_segment(IB_STATUS, ib_blob-bl_handle, (unsigned short)
 b_var-value.str.len, b_var-value.str.val)) {
 +   _php_ibase_error();
 +   return FAILURE;
 +  }
 +  if (isc_close_blob(IB_STATUS, ib_blob-bl_handle)) {
 +   _php_ibase_error();
 +   return FAILURE;
 +  }
 +  ib_blob_id = ib_blob;
 +  var-sqldata = (void ISC_FAR *)ib_blob_id-bl_qd;
 +/*
_php_ibase_module_error(invalid blob id string);
return FAILURE;
 +*/
 + } else {
 +  ib_blob_id = (ibase_blob_handle *)b_var-value.str.val;
 +  var-sqldata = (void ISC_FAR *)ib_blob_id-bl_qd;
   }
 - ib_blob_id = (ibase_blob_handle *)b_var-value.str.val;
 -
 - var-sqldata = (void ISC_FAR *)ib_blob_id-bl_qd;
  }
 break;
 case SQL_ARRAY:
 @@ -1395,7 +1437,7 @@
in_sqlda = emalloc(XSQLDA_LENGTH(ib_query-in_sqlda-sqld));
memcpy(in_sqlda, ib_query-in_sqlda,
 XSQLDA_LENGTH(ib_query-in_sqlda-sqld));
bind_buf = emalloc(sizeof(BIND_BUF) * ib_query-in_sqlda-sqld);
 -  if (_php_ibase_bind(in_sqlda, args, bind_buf) == FAILURE) {
 +  if (_php_ibase_bind(in_sqlda, args, bind_buf, ib_query) == FAILURE) {
 IBDEBUG(Could not bind input XSQLDA... (_php_ibase_exec));
 goto _php_ibase_exec_error;
}
 @@ -1961,7 +2003,7 @@
   _php_ibase_var_pval(tmp, var-sqldata, var-sqltype, var-sqllen,
 var-sqlscale, flag);
   break;
  case SQL_BLOB:
 - if (flag  PHP_IBASE_TEXT) { /* text ? */
 + if (1 /*flag  PHP_IBASE_TEXT*/) { /* text ? */
int stat;
isc_blob_handle bl_handle = NULL;
ISC_LONG max_len = 0, cur_len = 0;


 --
 Jeremy Bettis
 [EMAIL PROTECTED]



 --
 PHP Development Mailing List http://www.php.net/
 To 

Re: [PHP-DEV] Transparent use of blobs in Interbase

2001-07-06 Thread Jeremy Bettis

 Can you send this patch to the list as an attachment? It's a little messed
 up due to line endings.

Here you are.


Index: ext/interbase/interbase.c
===
RCS file: /repository/php4/ext/interbase/interbase.c,v
retrieving revision 1.58
diff -u -r1.58 interbase.c
--- ext/interbase/interbase.c   2001/06/09 09:30:42 1.58
+++ ext/interbase/interbase.c   2001/07/06 14:59:01
@@ -25,6 +25,15 @@
 
 /*
Changes:
+   2001-06-13: Jeremy Bettis [EMAIL PROTECTED]
+   - Return the text of blobs in _php_ibase_fetch_hash, not the blob
+ handles, even if the BLOB is not of TEXT type
+   2001-05-31: Jeremy Bettis [EMAIL PROTECTED]
+   - If a blob handle was expected and something else was
+ received create a blob and add the value to it.
+   - If the incoming argument to a bind parameter is NULL
+ then store a NULL in the database.
+   - More verbose date errors.
1999-09-21: Ivo Panacek [EMAIL PROTECTED]
- added COMPILE_DL section
- more verbose php_info_ibase function
@@ -1130,7 +1139,7 @@
 
 /* {{{ _php_ibase_bind()
Bind parameter placeholders in a previously prepared query */
-static int _php_ibase_bind(XSQLDA *sqlda, pval **b_vars, BIND_BUF *buf)
+static int _php_ibase_bind(XSQLDA *sqlda, pval **b_vars, BIND_BUF *buf, ibase_query 
+*ib_query)
 {
XSQLVAR *var;
pval *b_var;
@@ -1143,6 +1152,15 @@
var-sqlind  = buf[i].sqlind;
b_var = b_vars[i];

+   if (b_var-type == IS_NULL) {
+   static char nothing[64];
+   static short null_flag = -1;
+   var-sqldata = nothing;
+   var-sqltype |= 1;
+   var-sqlind = null_flag;
+   if (var-sqllen  64)
+   var-sqllen = 64;
+   } else
switch(var-sqltype  ~1) {
case SQL_TEXT: /* direct to variable */
case SQL_VARYING:
@@ -1220,7 +1238,7 @@
n = 
sscanf(b_var-value.str.val,%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(invalid 
date/time format);
+   _php_ibase_module_error(invalid 
+date/time format: Expected 3 or 6 fields, got %d. Use format m/d/Y H:i:s. You gave 
+'%s', n, b_var-value.str.val);
return FAILURE;
}
t.tm_year -= 1900;
@@ -1278,12 +1296,36 @@
if (b_var-type != IS_STRING
|| b_var-value.str.len != 
sizeof(ibase_blob_handle)
|| ((ibase_blob_handle 
*)(b_var-value.str.val))-bl_handle != 0) {
+   IBLS_FETCH();
+   ibase_blob_handle *ib_blob;
+   ib_blob = (ibase_blob_handle *) 
+emalloc(sizeof(ibase_blob_handle));
+   ib_blob-trans_handle = 
+ib_query-trans;
+   ib_blob-link = ib_query-link;
+   ib_blob-bl_handle = NULL;
+   if (isc_create_blob(IB_STATUS, 
+ib_blob-link, ib_blob-trans_handle, ib_blob-bl_handle, ib_blob-bl_qd)) {
+   efree(ib_blob);
+   _php_ibase_error();
+   return FAILURE;
+   }
+   convert_to_string(b_var);
+   if (isc_put_segment(IB_STATUS, 
+ib_blob-bl_handle, (unsigned short) b_var-value.str.len, b_var-value.str.val)) {
+   _php_ibase_error();
+   return FAILURE;
+   }
+   if (isc_close_blob(IB_STATUS, 
+ib_blob-bl_handle)) {
+   _php_ibase_error();
+   return FAILURE;
+