mboeren Wed Oct 23 06:50:23 2002 EDT
Modified files:
/php4/ext/dbx dbx.c dbx_oci8.c howto_extend_dbx.html
Log:
Added Oracle (oci8) support
@Added Oracle (oci8) support to dbx module (Mc)
Index: php4/ext/dbx/dbx.c
diff -u php4/ext/dbx/dbx.c:1.38 php4/ext/dbx/dbx.c:1.39
--- php4/ext/dbx/dbx.c:1.38 Tue Jul 23 09:45:49 2002
+++ php4/ext/dbx/dbx.c Wed Oct 23 06:50:21 2002
@@ -20,7 +20,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: dbx.c,v 1.38 2002/07/23 13:45:49 sas Exp $ */
+/* $Id: dbx.c,v 1.39 2002/10/23 10:50:21 mboeren Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -213,7 +213,7 @@
php_info_print_table_start();
php_info_print_table_row(2, "dbx support", "enabled");
php_info_print_table_row(2, "dbx version", "1.0.0");
- php_info_print_table_row(2, "supported databases",
"MySQL\nODBC\nPostgreSQL\nMicrosoft SQL Server\nFrontBase\nOracle 8 (not
really)\nSybase-CT");
+ php_info_print_table_row(2, "supported databases",
+"MySQL\nODBC\nPostgreSQL\nMicrosoft SQL Server\nFrontBase\nOracle 8
+(oci8)\nSybase-CT");
php_info_print_table_end();
}
@@ -673,8 +673,7 @@
case DBX_PGSQL: return dbx_pgsql_connect(rv, host, db, username,
password, INTERNAL_FUNCTION_PARAM_PASSTHRU);
case DBX_MSSQL: return dbx_mssql_connect(rv, host, db, username,
password, INTERNAL_FUNCTION_PARAM_PASSTHRU);
case DBX_FBSQL: return dbx_fbsql_connect(rv, host, db, username,
password, INTERNAL_FUNCTION_PARAM_PASSTHRU);
- case DBX_OCI8: zend_error(E_WARNING, "dbx_connect: OCI8 extension is
still highly experimental!");
- return dbx_oci8_connect(rv, host, db, username, password,
INTERNAL_FUNCTION_PARAM_PASSTHRU);
+ case DBX_OCI8: return dbx_oci8_connect(rv, host, db, username,
+password, INTERNAL_FUNCTION_PARAM_PASSTHRU);
case DBX_SYBASECT: return dbx_sybasect_connect(rv, host, db, username,
password, INTERNAL_FUNCTION_PARAM_PASSTHRU);
}
zend_error(E_WARNING, "dbx_connect: not supported in this module");
@@ -690,8 +689,7 @@
case DBX_PGSQL: return dbx_pgsql_pconnect(rv, host, db, username,
password, INTERNAL_FUNCTION_PARAM_PASSTHRU);
case DBX_MSSQL: return dbx_mssql_pconnect(rv, host, db, username,
password, INTERNAL_FUNCTION_PARAM_PASSTHRU);
case DBX_FBSQL: return dbx_fbsql_pconnect(rv, host, db, username,
password, INTERNAL_FUNCTION_PARAM_PASSTHRU);
- case DBX_OCI8: zend_error(E_WARNING, "dbx_pconnect: OCI8 extension is
still highly experimental!");
- return dbx_oci8_pconnect(rv, host, db, username, password,
INTERNAL_FUNCTION_PARAM_PASSTHRU);
+ case DBX_OCI8: return dbx_oci8_pconnect(rv, host, db, username,
+password, INTERNAL_FUNCTION_PARAM_PASSTHRU);
case DBX_SYBASECT: return dbx_sybasect_pconnect(rv, host, db,
username, password, INTERNAL_FUNCTION_PARAM_PASSTHRU);
}
zend_error(E_WARNING, "dbx_pconnect: not supported in this module");
@@ -803,7 +801,7 @@
case DBX_PGSQL: return dbx_pgsql_error(rv, dbx_handle,
INTERNAL_FUNCTION_PARAM_PASSTHRU);
case DBX_MSSQL: return dbx_mssql_error(rv, dbx_handle,
INTERNAL_FUNCTION_PARAM_PASSTHRU);
case DBX_FBSQL: return dbx_fbsql_error(rv, dbx_handle,
INTERNAL_FUNCTION_PARAM_PASSTHRU);
- case DBX_OCI8: return dbx_oci8_error(rv, dbx_handle,
INTERNAL_FUNCTION_PARAM_PASSTHRU);
+ /* case DBX_OCI8: return dbx_oci8_error(rv, dbx_handle,
+INTERNAL_FUNCTION_PARAM_PASSTHRU); */
case DBX_SYBASECT: return dbx_sybasect_error(rv, dbx_handle,
INTERNAL_FUNCTION_PARAM_PASSTHRU);
}
zend_error(E_WARNING, "dbx_error: not supported in this module");
Index: php4/ext/dbx/dbx_oci8.c
diff -u php4/ext/dbx/dbx_oci8.c:1.5 php4/ext/dbx/dbx_oci8.c:1.6
--- php4/ext/dbx/dbx_oci8.c:1.5 Tue Dec 11 10:29:05 2001
+++ php4/ext/dbx/dbx_oci8.c Wed Oct 23 06:50:22 2002
@@ -20,7 +20,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: dbx_oci8.c,v 1.5 2001/12/11 15:29:05 sebastian Exp $ */
+/* $Id: dbx_oci8.c,v 1.6 2002/10/23 10:50:22 mboeren Exp $ */
#include "dbx.h"
#include "dbx_oci8.h"
@@ -71,6 +71,8 @@
int dbx_oci8_close(zval **rv, zval **dbx_handle, INTERNAL_FUNCTION_PARAMETERS)
{
/* returns 1 as long on success or 0 as long on failure */
+ /* actually, ocilogoff officially does nothing, so what should I return? */
+ /* I will just return NULL right now and change the test accordingly */
int number_of_arguments=1;
zval **arguments[1];
zval *returned_zval=NULL;
@@ -87,11 +89,12 @@
int dbx_oci8_query(zval **rv, zval **dbx_handle, zval **db_name, zval
**sql_statement, INTERNAL_FUNCTION_PARAMETERS)
{
- /* returns 1 as long or a result identifier as resource on success or 0 as
long on failure */
+ /* returns 1 as long or a result identifier as resource on success or 0 as
+long on failure */
int number_of_arguments=2;
zval **arguments[2];
zval *returned_zval=NULL;
zval *execute_zval=NULL;
+ zval *statementtype_zval=NULL;
arguments[0]=dbx_handle;
arguments[1]=sql_statement;
@@ -104,13 +107,36 @@
number_of_arguments=1;
arguments[0]=&returned_zval;
dbx_call_any_function(INTERNAL_FUNCTION_PARAM_PASSTHRU, "OCIExecute",
&execute_zval, number_of_arguments, arguments);
- /* OCIExecute returns a bool for success or failure???? */
- if (!execute_zval || Z_TYPE_P(execute_zval)!=IS_BOOL) {
+ /* OCIExecute returns a bool for success or failure */
+ if (!execute_zval || Z_TYPE_P(execute_zval)!=IS_BOOL ||
+Z_BVAL_P(execute_zval)==FALSE) {
if (execute_zval) zval_ptr_dtor(&execute_zval);
zval_ptr_dtor(&returned_zval);
return 0;
}
- MOVE_RETURNED_TO_RV(rv, returned_zval);
+ number_of_arguments=1;
+ arguments[0]=&returned_zval;
+ dbx_call_any_function(INTERNAL_FUNCTION_PARAM_PASSTHRU, "OCIStatementType",
+&statementtype_zval, number_of_arguments, arguments);
+ /* OCIStatementType returns a string. 'SELECT' means there are results */
+ if (!statementtype_zval || Z_TYPE_P(statementtype_zval)!=IS_STRING) {
+ if (statementtype_zval) zval_ptr_dtor(&statementtype_zval);
+ if (execute_zval) zval_ptr_dtor(&execute_zval);
+ zval_ptr_dtor(&returned_zval);
+ return 0;
+ }
+
+ if (!zend_binary_strcmp(Z_STRVAL_P(statementtype_zval),
+Z_STRLEN_P(statementtype_zval), "SELECT", sizeof("SELECT")-sizeof(""))) {
+ /* it is a select, so results are returned */
+ MOVE_RETURNED_TO_RV(rv, returned_zval);
+ } else {
+ /* it is not a select, so just return success */
+ zval_ptr_dtor(&returned_zval);
+ MAKE_STD_ZVAL(returned_zval);
+ ZVAL_BOOL(returned_zval, TRUE);
+ MOVE_RETURNED_TO_RV(rv, returned_zval);
+ }
+ if (statementtype_zval) zval_ptr_dtor(&statementtype_zval);
+ if (execute_zval) zval_ptr_dtor(&execute_zval);
+
return 1;
}
@@ -191,17 +217,19 @@
zval *zval_returned_array=NULL;
zval *returned_zval=NULL;
+ MAKE_STD_ZVAL(zval_returned_array); /* no value needed, it will be overwritten
+anyway */
MAKE_STD_ZVAL(zval_resulttype);
- ZVAL_LONG(zval_resulttype, OCI_NUM | OCI_RETURN_NULLS); /* no ASSOC, dbx
handles that part */
+ ZVAL_LONG(zval_resulttype, OCI_NUM | OCI_RETURN_NULLS | OCI_RETURN_LOBS); /*
+no ASSOC, dbx handles that part */
arguments[0]=result_handle;
arguments[1]=&zval_returned_array;
arguments[2]=&zval_resulttype;
dbx_call_any_function(INTERNAL_FUNCTION_PARAM_PASSTHRU, "OCIFetchInto",
&returned_zval, number_of_arguments, arguments);
- /* OCIFetchInto returns an integer, but the actual array is passed back in
arg[1] */
- /* I'm not sure how this will work, Thies, so this is something that should be
especially tested! */
- if (!returned_zval || Z_TYPE_P(returned_zval)!=IS_BOOL ||
Z_LVAL_P(returned_zval)==0) {
+ /* OCIFetchInto returns the number of columns as an integer on success and
+FALSE */
+ /* on failure. The actual array is passed back in arg[1] */
+ if (!returned_zval || Z_TYPE_P(returned_zval)!=IS_LONG ||
+Z_LVAL_P(returned_zval)==0) {
if (returned_zval) zval_ptr_dtor(&returned_zval);
FREE_ZVAL(zval_resulttype);
+ FREE_ZVAL(zval_returned_array);
return 0;
}
FREE_ZVAL(zval_resulttype);
@@ -213,6 +241,9 @@
int dbx_oci8_error(zval **rv, zval **dbx_handle, INTERNAL_FUNCTION_PARAMETERS)
{
/* returns string */
+ /* OCIError needs a statement handle most of the times, and I can only provide
+*/
+ /* a db-handle which is only needed some of the time. For now, I have disabled
+*/
+ /* the dbx_error for the oci8 extension */
int number_of_arguments=1;
zval **arguments[1];
zval *returned_zval=NULL;
Index: php4/ext/dbx/howto_extend_dbx.html
diff -u php4/ext/dbx/howto_extend_dbx.html:1.3 php4/ext/dbx/howto_extend_dbx.html:1.4
--- php4/ext/dbx/howto_extend_dbx.html:1.3 Thu Feb 28 09:44:27 2002
+++ php4/ext/dbx/howto_extend_dbx.html Wed Oct 23 06:50:22 2002
@@ -50,7 +50,7 @@
How-to code support for another database<br>
</div>
<div class="text">
-Every supported database module must be loaded by PHP before it can be used. Every
supported database module must be added to the dbx-module before it can be used.
Currently there is support for MySQL, PostgreSQL, Microsoft SQL Server, Frontbase,
Sybase-CT and ODBC, but it is not difficult to add support for more databases.<br>
+Every supported database module must be loaded by PHP before it can be used. Every
+supported database module must be added to the dbx-module before it can be used.
+Currently there is support for MySQL, PostgreSQL, Microsoft SQL Server, Frontbase,
+Sybase-CT, Oracle (oci8) and ODBC. It is not difficult to add support for more
+databases.<br>
<br>
The dbx module is found in de PHP ext/dbx folder. The support-code is found in the
same folder <br>
<br>
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php