ID: 8346
Updated by: sniper
Reported By: [EMAIL PROTECTED]
Old-Status: Suspended
Status: Closed
Bug Type: ODBC related
Operating system: 
PHP Version: 4.0.3pl1
Assigned To: 
Comments:



Previous Comments:
---------------------------------------------------------------------------

[2001-06-11 10:14:15] [EMAIL PROTECTED]

this patch is a really bad idea.  

hopefully i'll have a better solution for you in the near future... i'm awaiting patch 
confirmation from some others before commiting it.

---------------------------------------------------------------------------

[2000-12-21 03:09:55] [EMAIL PROTECTED]

The change above have effect of disabling scrolling through lists. However retriving 
one record is not a problem.

Here's the script which demonstrates the bug:

<?
$myTable = "xxx";
$myDSN = odbc_connect("xxx", "xxx", "xxx");

for ($i = 0; $i < 100; $i++)
{
  for ($j = 0; $j < 10; $j++)
  {
    $myST = odbc_exec($myDSN, "SELECT * FROM $myTable WHERE 0=1");

    $n = odbc_num_fields($myST);
    for ($i = 1; $i <= $n; $i++)
      odbc_field_name($myST, $i);

    odbc_free_result($myST);
  }
}
?>

Output as follows:
<after a pause...>
test.php(9) : Warning - SQL error: [IBM][CLI Driver][DB2/6000] SQL0954C  Not enough 
storage is available in the application h
eap to process the statement.  SQLSTATE=57011
, SQL state 57011 in SQLExecDirect
test.php(11) : Warning - Supplied argument is not a valid ODBC result resource
test.php(15) : Warning - Supplied argument is not a valid ODBC result resource


---------------------------------------------------------------------------

[2000-12-21 01:48:35] [EMAIL PROTECTED]

When you execute a php script which uses odbc_exec for more than 946 times (milage may 
vary), the following error message is returned:

Warning - SQL error: [IBM][CLI Driver][DB2/6000] SQL0954C  Not enough storage is 
available in the application heap to process the statement.  SQLSTATE=57011

The following information is discovered in IBM DB2 CLI manual:

SQL_ATTR_CURSOR_TYPE (DB2 CLI v2) 
A 32-bit integer value that specifies the cursor type. The supported values are: 

SQL_CURSOR_FORWARD_ONLY = The cursor only scrolls forward. 
SQL_CURSOR_STATIC = The data in the result set is static. This is the default. 
SQL_CURSOR_KEYSET_DRIVEN = DB2 CLI supports a pure keyset cursor. The SQL_KEYSET_SIZE 
statement attribute is ignored. To limit the size of the keyset the application must 
limit the size of the result set by setting the SQL_ATTR_MAX_ROWS attribute to a value 
other than 0. 
This option cannot be specified for an open cursor. 

If the specified cursor type is not supported by the data source, CLI substitutes a 
different cursor type and returns SQLSTATE 01S02 (Option value changed). For a mixed 
or dynamic cursor, CLI substitutes, in order, a keyset-driven or static cursor. 

Note: The following value has also been defined by ODBC, but is not supported by DB2 
CLI: 
SQL_CURSOR_DYNAMIC 
If this values is used, DB2 CLI sets the statement attribute to SQL_CURSOR_STATIC 
SQL_CURSOR_FORWARD_ONLY and returns SQLSTATE 01S02 (Option value changed). In this 
case the application should call SQLGetStmtAttr() to query the actual value. 
 
The quick work around is to edit ext/odbc/php_odbc.c, and disable SQL_CURSOR_DYNAMIC, 
and to change all instances of SQL_CURSOR_DYNAMIC to SQL_CURSOR_FORWARD_ONLY.  It 
appear that DB2/CLI exhibits memory leak when statement type is set to 
SQL_CURSOR_DYNAMIC.

The diff follows:

--- php_odbc.c.orig     Thu Dec 21 00:44:49 2000
+++ php_odbc.c  Thu Dec 21 01:00:30 2000
@@ -354,7 +354,9 @@
        REGISTER_LONG_CONSTANT("SQL_CURSOR_TYPE", SQL_CURSOR_TYPE, CONST_PERSISTENT | 
CONST_CS);
        REGISTER_LONG_CONSTANT("SQL_CURSOR_FORWARD_ONLY", SQL_CURSOR_FORWARD_ONLY, 
CONST_PERSISTENT | CO
NST_CS);
        REGISTER_LONG_CONSTANT("SQL_CURSOR_KEYSET_DRIVEN", SQL_CURSOR_KEYSET_DRIVEN, 
CONST_PERSISTENT | 
CONST_CS);
+#ifndef HAVE_IBMDB2
        REGISTER_LONG_CONSTANT("SQL_CURSOR_DYNAMIC", SQL_CURSOR_DYNAMIC, 
CONST_PERSISTENT | CONST_CS);
+#endif
        REGISTER_LONG_CONSTANT("SQL_CURSOR_STATIC", SQL_CURSOR_STATIC, 
CONST_PERSISTENT | CONST_CS);
        
        REGISTER_LONG_CONSTANT("SQL_KEYSET_SIZE", SQL_KEYSET_SIZE, CONST_PERSISTENT | 
CONST_CS);
@@ -758,7 +760,11 @@
                        /* Try to set CURSOR_TYPE to dynamic. Driver will replace this 
with other
                           type if not possible.
                        */
+#ifdef HAVE_IBMDB2
+                       if (SQLSetStmtOption(result->stmt, SQL_CURSOR_TYPE, 
+SQL_CURSOR_FORWARD_ONLY)
+#else
                        if (SQLSetStmtOption(result->stmt, SQL_CURSOR_TYPE, 
SQL_CURSOR_DYNAMIC)
+#endif
                                == SQL_ERROR) {
                                odbc_sql_error(conn->henv, conn->hdbc, result->stmt, " 
SQLSetStmtOption"
);
                                SQLFreeStmt(result->stmt, SQL_DROP);
@@ -1085,7 +1091,11 @@
                        /* Try to set CURSOR_TYPE to dynamic. Driver will replace this 
with other
                           type if not possible.
                         */
+#ifdef HAVE_IBMDB2
+                       if (SQLSetStmtOption(result->stmt, SQL_CURSOR_TYPE, 
+SQL_CURSOR_FORWARD_ONLY)
+#else
                        if (SQLSetStmtOption(result->stmt, SQL_CURSOR_TYPE, 
SQL_CURSOR_DYNAMIC)
+#endif
                                == SQL_ERROR) {
                                odbc_sql_error(conn->henv, conn->hdbc, result->stmt, " 
SQLSetStmtOption"
);
                                SQLFreeStmt(result->stmt, SQL_DROP);


---------------------------------------------------------------------------



ATTENTION! Do NOT reply to this email!
To reply, use the web interface found at http://bugs.php.net/?id=8346&edit=2


-- 
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]

Reply via email to