Hi,

Andi, thanks for the feedback. I've changed the patch to include emalloc
and efree.

I actually use PHP from the command line a lot and I've noticed that
warnings always get wrapped in <b>, so I figured it was ok to do HTML
here too.

I've modified the patch to also include an "offset" element in the array
returned by OCIError. This will allow someone to "roll their own" method
for displaying the error.

I've decided to leave the code that produces "sqltext" in, because I
have a feeling the lazy programmers (i.e. ME) will be happy with that
instead.

New patch attached.

Daniel

>
>-----Original Message-----
>From: Andi Gutmans [mailto:[EMAIL PROTECTED]] 
>Sent: Tuesday, March 12, 2002 13:08
>To: Walter A. Boring IV; [EMAIL PROTECTED]
>Subject: Re: [PHP-DEV] OCIError patch
>
>Hey,
>
>I'm not quite sure it's correct for the error message to print HTML
>itself. 
>It's probably more correct to do this from user land.
>In any case, you should not be using malloc()/free() but
>emalloc()/efree(). 
>If the request gets interrupted the memory will be freed if you're using
>
>emalloc().
>
>Andi
>
>At 12:59 12/03/2002 -0800, Walter A. Boring IV wrote:
>
>>Ahh.  very kewl patch Dan.
>>
>>Walt
>>
>>On Tue, 2002-03-12 at 12:48, Daniel Ceregatti wrote:
>>
>>>Hi,
>>>
>>>I wrote a small patch to oci8.c's OCIError function which places the
>>>following tag:
>>>
>>><span style="color:#FF0000; font-weight:bold">&lt;ERROR&gt;</span>
>>>
>>>just before an error in a sql statement and adds the modified
>>>
>statement
>
>>>text into a new element called "sqltext" to the array returned by
>>>OCIError, much the same way sqlplus adds an asterisk under an error.
>>>
>>>I find this very useful, and I'm hoping you will too. I've attached
>>>
>the
>
>>>patch.
>>>
>>>Thanks,
>>>
>>>Daniel Ceregatti
>>>----
>>>
>>>--- php-4.1.2/ext/oci8/oci8.c.orig    Tue Mar 12 11:56:17 2002
>>>+++ php-4.1.2/ext/oci8/oci8.c Tue Mar 12 12:23:35 2002
>>>@@ -4090,10 +4090,13 @@
>>>      zval **arg;
>>>      oci_statement *statement;
>>>      oci_connection *connection;
>>>-    text errbuf[512];
>>>-    sb4 errcode = 0;
>>>+     text errbuf[512];
>>>+     sb4 errcode = 0;
>>>      sword error = 0;
>>>      dvoid *errh = NULL;
>>>+     ub2 errorofs = 0;
>>>+     text *sqltext;
>>>+     char *retsql;
>>>
>>>      if (zend_get_parameters_ex(1, &arg) == SUCCESS) {
>>>              statement = (oci_statement *) zend_fetch_resource(arg 
>>>
>>TSRMLS_CC, -1, NULL, NULL, 1, le_stmt);
>>
>>>@@ -4130,10 +4133,33 @@
>>>                              (ub4) sizeof(errbuf),
>>>                              (ub4) OCI_HTYPE_ERROR));
>>>
>>>+     CALL_OCI_RETURN(statement->error, OCIAttrGet(
>>>+                             (dvoid *)statement->pStmt,
>>>+                             OCI_HTYPE_STMT,
>>>+                             (text *) &sqltext,
>>>+                             (ub4 *)0,
>>>+                             OCI_ATTR_STATEMENT,
>>>+                             statement->pError));
>>>+
>>>+     CALL_OCI_RETURN(statement->error, OCIAttrGet(
>>>+                             (dvoid *)statement->pStmt,
>>>+                             OCI_HTYPE_STMT,
>>>+                             (ub2 *)&errorofs,
>>>+                             (ub4 *)0,
>>>+                             OCI_ATTR_PARSE_ERROR_OFFSET,
>>>+                             statement->pError));
>>>+
>>>      if (errcode) {
>>>+             retsql = (char *) malloc (strlen (sqltext) + 100);
>>>+             memset (retsql, 0, strlen (sqltext) + 100);
>>>+             strncat (retsql, sqltext, (int) errorofs);
>>>+             strcat (retsql, "<span style=\"color:#FF0000; 
>>>
>>font-weight:bold\">&lt;ERROR&gt;</span>");
>>
>>>+             strcat (retsql, (char *) sqltext + (int) errorofs);
>>>              array_init(return_value);
>>>              add_assoc_long(return_value, "code", errcode);
>>>+             add_assoc_string(return_value, "sqltext", (char *) 
>>>
>>retsql, 1);
>>
>>>              add_assoc_string(return_value, "message", (char*)
>>>
>errbuf, 1);
>
>>>+             free (retsql);
>>>      } else {
>>>              RETURN_FALSE;
>>>      }
>>>
>>>----
>>>
>>>--
>>>PHP Development Mailing List <http://www.php.net/>
>>>To unsubscribe, visit: http://www.php.net/unsub.php
>>>
>>
>>--
>>PHP Development Mailing List <http://www.php.net/>
>>To unsubscribe, visit: http://www.php.net/unsub.php
>>
>
>
>

-- 

Daniel Ceregatti - Programmer
Omnis Networks, LLC

Q:      What's a WASP's idea of open-mindedness?
A:      Dating a Canadian.


--- php-4.1.2/ext/oci8/oci8.c.orig      Tue Mar 12 11:56:17 2002
+++ php-4.1.2/ext/oci8/oci8.c   Tue Mar 12 13:49:07 2002
@@ -4090,10 +4090,13 @@
        zval **arg;
        oci_statement *statement;
        oci_connection *connection;
-    text errbuf[512];
-    sb4 errcode = 0;
+       text errbuf[512];
+       sb4 errcode = 0;
        sword error = 0;
        dvoid *errh = NULL;
+       ub2 errorofs = 0;
+       text *sqltext;
+       char *retsql;
 
        if (zend_get_parameters_ex(1, &arg) == SUCCESS) {
                statement = (oci_statement *) zend_fetch_resource(arg TSRMLS_CC, -1, 
NULL, NULL, 1, le_stmt);
@@ -4130,10 +4133,34 @@
                                (ub4) sizeof(errbuf),
                                (ub4) OCI_HTYPE_ERROR));
 
+       CALL_OCI_RETURN(statement->error, OCIAttrGet(
+                               (dvoid *)statement->pStmt,
+                               OCI_HTYPE_STMT,
+                               (text *) &sqltext,
+                               (ub4 *)0,
+                               OCI_ATTR_STATEMENT,
+                               statement->pError));
+
+       CALL_OCI_RETURN(statement->error, OCIAttrGet(
+                               (dvoid *)statement->pStmt,
+                               OCI_HTYPE_STMT,
+                               (ub2 *)&errorofs,
+                               (ub4 *)0,
+                               OCI_ATTR_PARSE_ERROR_OFFSET,
+                               statement->pError));
+
        if (errcode) {
+               retsql = (char *) emalloc (strlen (sqltext) + 100);
+               memset (retsql, 0, strlen (sqltext) + 100);
+               strncat (retsql, sqltext, (int) errorofs);
+               strcat (retsql, "<span style=\"color:#FF0000; 
+font-weight:bold\">&lt;ERROR&gt;</span>");
+               strcat (retsql, (char *) sqltext + (int) errorofs);
                array_init(return_value);
                add_assoc_long(return_value, "code", errcode);
+               add_assoc_long(return_value, "offset", errorofs);
+               add_assoc_string(return_value, "sqltext", (char *) retsql, 1);
                add_assoc_string(return_value, "message", (char*) errbuf, 1);
+               efree (retsql);
        } else {
                RETURN_FALSE;
        }

-- 
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to