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();
+   

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 ? */
> 

[PHP-DEV] Transparent use of blobs in Interbase

2001-07-05 Thread Jeremy Bettis

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)


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 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [E