]> granicus.if.org Git - php/commitdiff
Added a database member to the dbx_link object. Since e.g. mysql reuses
authorMarc Boeren <mboeren@php.net>
Wed, 11 Apr 2001 08:14:57 +0000 (08:14 +0000)
committerMarc Boeren <mboeren@php.net>
Wed, 11 Apr 2001 08:14:57 +0000 (08:14 +0000)
connections, two or more dbx_link objects may share the connection
identifier. The database name is used in the dbx_query, where it calls
mysql_db_query instead of mysql_query.
This means the database name has to be passed around to all dbx_xxx_query
functions, hence the update on all the files. (Mc)
# Thanks to Christian Rabe for all the input on this issue!

ext/dbx/dbx.c
ext/dbx/dbx_mysql.c
ext/dbx/dbx_mysql.h
ext/dbx/dbx_odbc.c
ext/dbx/dbx_odbc.h
ext/dbx/dbx_pgsql.c
ext/dbx/dbx_pgsql.h
ext/dbx/php_dbx.h

index 5e3b5fe1aa090644cd49cdbc895a0862b0e96c21..093829570f01cd9073b8b1f6eb7e93d7929e26b9 100644 (file)
@@ -51,9 +51,11 @@ int get_module_identifier(char * module_name) {
     return DBX_UNKNOWN;
     }
 
-int split_dbx_handle_object(zval ** dbx_object, zval *** pdbx_handle, zval *** pdbx_module) {
+int split_dbx_handle_object(zval ** dbx_object, zval *** pdbx_handle, zval *** pdbx_module, zval *** pdbx_database) {
     convert_to_object_ex(dbx_object);
-    if (zend_hash_find((*dbx_object)->value.obj.properties, "handle", 7, (void **) pdbx_handle)==FAILURE || zend_hash_find((*dbx_object)->value.obj.properties, "module", 7, (void **) pdbx_module)==FAILURE) {
+    if (zend_hash_find((*dbx_object)->value.obj.properties, "handle", 7, (void **) pdbx_handle)==FAILURE
+    || zend_hash_find((*dbx_object)->value.obj.properties, "module", 7, (void **) pdbx_module)==FAILURE
+    || zend_hash_find((*dbx_object)->value.obj.properties, "database", 9, (void **) pdbx_database)==FAILURE) {
         return 0;
         }
     return 1;
@@ -85,7 +87,7 @@ int switch_dbx_pconnect(zval ** rv, zval ** host, zval ** db, zval ** username,
     /*/ returns persistent connection handle as resource on success or 0 as long on failure /*/
 int switch_dbx_close(zval ** rv, zval ** dbx_handle, INTERNAL_FUNCTION_PARAMETERS, zval ** dbx_module);
     /*/ returns 1 as long on success or 0 as long on failure /*/
-int switch_dbx_query(zval ** rv, zval ** dbx_handle, zval ** sql_statement, INTERNAL_FUNCTION_PARAMETERS, zval ** dbx_module);
+int switch_dbx_query(zval ** rv, zval ** dbx_handle, zval ** db_name, zval ** sql_statement, INTERNAL_FUNCTION_PARAMETERS, zval ** dbx_module);
     /*/ returns 1 as long or result identifier as resource on success or 0 as long on failure /*/
 int switch_dbx_getcolumncount(zval ** rv, zval ** result_handle, INTERNAL_FUNCTION_PARAMETERS, zval ** dbx_module);
     /*/ returns column-count as long on success or 0 as long on failure /*/
@@ -97,26 +99,7 @@ int switch_dbx_getrow(zval ** rv, zval ** result_handle, long row_number, INTERN
     /*/ returns array[0..columncount-1] as strings on success or 0 as long on failure /*/
 int switch_dbx_error(zval ** rv, zval ** dbx_handle, INTERNAL_FUNCTION_PARAMETERS, zval ** dbx_module);
     /*/ returns string /*/
-/*
-#ifdef ZTS
-int dbx_globals_id;
-#else
-ZEND_DBX_API zend_dbx_globals dbx_globals;
-#endif
-*/
-/* If you declare any globals in php_dbx.h uncomment this: */
-/* ZEND_DECLARE_MODULE_GLOBALS(dbx) */
-/* True global resources - no need for thread safety here */
-/*
-static int le_dbx;
-*/
-/*
-static void zend_dbx_init_globals(PGLS_D)
-{
-       DBXG(row_count) = 0;
-       DBXG(num_rows) = 0;
-}
-*/
+
 /* Every user visible function must have an entry in dbx_functions[].
 */
 function_entry dbx_functions[] = {
@@ -129,8 +112,6 @@ function_entry dbx_functions[] = {
     ZEND_FE(dbx_cmp_asc,    NULL)
     ZEND_FE(dbx_cmp_desc,    NULL)
 
-    ZEND_FE(dbx_test,      NULL)
-
        {NULL, NULL, NULL}      /* Must be the last line in dbx_functions[] */
     };
 
@@ -149,19 +130,8 @@ zend_module_entry dbx_module_entry = {
 ZEND_GET_MODULE(dbx)
 #endif
 
-/*/ZEND_INI_BEGIN()
-/ /    ZEND_INI_ENTRY("dbx.defaulttype", "mysql", ZEND_INI_SYSTEM, NULL)
-/ /ZEND_INI_END()
-/*/
 ZEND_MINIT_FUNCTION(dbx)
 {
-/*
-#ifdef ZTS
-       dbx_globals_id = ts_allocate_id(sizeof(zend_dbx_globals), (ts_allocate_ctor) zend_dbx_init_globals, NULL);
-#else
-       zend_dbx_init_globals(DBXLS_C);
-#endif
-*/
 /*/    REGISTER_INI_ENTRIES(); /*/
 
     REGISTER_LONG_CONSTANT("DBX_PERSISTENT", DBX_PERSISTENT, CONST_CS | CONST_PERSISTENT);
@@ -218,6 +188,7 @@ ZEND_FUNCTION(dbx_connect)
     int result;
     long module_identifier;
     zval * dbx_module;
+    zval * db_name;
     zval * rv_dbx_handle;
     int persistent=0;
 
@@ -248,6 +219,8 @@ ZEND_FUNCTION(dbx_connect)
     convert_to_string_ex(arguments[2]);
     convert_to_string_ex(arguments[3]);
     convert_to_string_ex(arguments[4]);
+    MAKE_STD_ZVAL(db_name); 
+    ZVAL_STRING(db_name, (*arguments[2])->value.str.val, 1);
     if (persistent) {
         result = switch_dbx_pconnect(&rv_dbx_handle, arguments[1], arguments[2], arguments[3], arguments[4], INTERNAL_FUNCTION_PARAM_PASSTHRU, &dbx_module);
         }
@@ -256,6 +229,7 @@ ZEND_FUNCTION(dbx_connect)
         }
     if (!result) {
         FREE_ZVAL(dbx_module);
+        FREE_ZVAL(db_name);
         FREE_ZVAL(rv_dbx_handle);
         RETURN_LONG(0);
         }
@@ -263,12 +237,14 @@ ZEND_FUNCTION(dbx_connect)
     if (object_init(return_value) != SUCCESS) {
         zend_error(E_ERROR, "dbx: unable to create resulting object...");
         FREE_ZVAL(dbx_module);
+        FREE_ZVAL(db_name);
         FREE_ZVAL(rv_dbx_handle);
         RETURN_LONG(0);
         }
 
     zend_hash_update(return_value->value.obj.properties, "handle", 7, (void *)&(rv_dbx_handle), sizeof(zval *), NULL);
     zend_hash_update(return_value->value.obj.properties, "module", 7, (void *)&(dbx_module), sizeof(zval *), NULL);
+    zend_hash_update(return_value->value.obj.properties, "database", 9, (void *)&(db_name), sizeof(zval *), NULL);
 }
 /* }}} */
 
@@ -282,12 +258,13 @@ ZEND_FUNCTION(dbx_close)
     int result;
     zval ** dbx_handle;
     zval ** dbx_module;
+    zval ** dbx_database;
     zval * rv_success;
 
     if (ZEND_NUM_ARGS() !=number_of_arguments || zend_get_parameters_array_ex(number_of_arguments, arguments) == FAILURE) {
                WRONG_PARAM_COUNT;
            }
-    if (!split_dbx_handle_object(arguments[0], &dbx_handle, &dbx_module)) {
+    if (!split_dbx_handle_object(arguments[0], &dbx_handle, &dbx_module, &dbx_database)) {
         zend_error(E_WARNING, "dbx_close: not a valid dbx_handle-object...");
         RETURN_LONG(0);
         }
@@ -319,27 +296,24 @@ ZEND_FUNCTION(dbx_query)
     int result;
     zval ** dbx_handle;
     zval ** dbx_module;
+    zval ** dbx_database;
     zval * rv_result_handle;
     zval * rv_column_count;
     long col_index;
     long row_count;
     zval * info;
     long info_flags;
-/*/    long result_row_offset; /*/
-/*/    long result_row_count; /*/
     zval * data;
 
     if (ZEND_NUM_ARGS()<min_number_of_arguments || ZEND_NUM_ARGS()>number_of_arguments || zend_get_parameters_array_ex(ZEND_NUM_ARGS(), arguments) == FAILURE) {
                WRONG_PARAM_COUNT;
            }
-    if (!split_dbx_handle_object(arguments[0], &dbx_handle, &dbx_module)) {
+    if (!split_dbx_handle_object(arguments[0], &dbx_handle, &dbx_module, &dbx_database)) {
         zend_error(E_WARNING, "dbx_query: not a valid dbx_handle-object...");
         RETURN_LONG(0);
         }
     /*/ default values /*/
     info_flags = DBX_RESULT_INFO | DBX_RESULT_INDEX | DBX_RESULT_ASSOC;
-/*/    result_row_offset = 0; /*/
-/*/    result_row_count = -1; /*/
     /*/ parameter overrides /*/
     if (ZEND_NUM_ARGS()>2) {
         convert_to_long_ex(arguments[2]);
@@ -349,20 +323,10 @@ ZEND_FUNCTION(dbx_query)
             info_flags |= DBX_RESULT_INFO;
             }
         }
- /*/
-/ /    if (ZEND_NUM_ARGS()>3) {
-/ /        convert_to_long_ex(arguments[3]);
-/ /        result_row_offset = (*arguments[3])->value.lval;
-/ /        }
-/ /    if (ZEND_NUM_ARGS()>4) {
-/ /        convert_to_long_ex(arguments[4]);
-/ /        result_row_count = (*arguments[4])->value.lval;
-/ /        }
- /*/
     MAKE_STD_ZVAL(rv_result_handle); 
     ZVAL_LONG(rv_result_handle, 0);
     convert_to_string_ex(arguments[1]);
-    result = switch_dbx_query(&rv_result_handle, dbx_handle, arguments[1], INTERNAL_FUNCTION_PARAM_PASSTHRU, dbx_module);
+    result = switch_dbx_query(&rv_result_handle, dbx_handle, dbx_database, arguments[1], INTERNAL_FUNCTION_PARAM_PASSTHRU, dbx_module);
     /*/ boolean return value means either failure for any query or success for queries that don't return anything  /*/
     if (!result || (rv_result_handle && rv_result_handle->type==IS_BOOL)) {
         result = (result && rv_result_handle->value.lval)?1:0;
@@ -463,7 +427,6 @@ ZEND_FUNCTION(dbx_query)
         ZVAL_LONG(rv_row, 0);
         result = switch_dbx_getrow(&rv_row, &rv_result_handle, row_count, INTERNAL_FUNCTION_PARAM_PASSTHRU, dbx_module);
         if (result) {
-/*/            if (row_count>=result_row_offset && (result_row_count==-1 || row_count<result_row_offset+result_row_count)) { /*/
                 zval ** row_ptr;
                 zend_hash_index_update(data->value.ht, row_count, (void *)&(rv_row), sizeof(zval *), (void **) &row_ptr);
                 /*/ associate results with fieldnames /*/
@@ -480,12 +443,6 @@ ZEND_FUNCTION(dbx_query)
                         zend_assign_to_variable_reference(NULL, reference_ptr, actual_ptr, NULL ELS_CC);
                         }
                     }
- /*/
-/ /                }
-/ /            else {
-/ /                FREE_ZVAL(rv_row);
-/ /                }
- /*/
             ++row_count;
             }
         else {
@@ -508,12 +465,13 @@ ZEND_FUNCTION(dbx_error)
     int result;
     zval ** dbx_handle;
     zval ** dbx_module;
+    zval ** dbx_database;
     zval * rv_errormsg;
 
     if (ZEND_NUM_ARGS() !=number_of_arguments || zend_get_parameters_array_ex(number_of_arguments, arguments) == FAILURE) {
                WRONG_PARAM_COUNT;
            }
-    if (!split_dbx_handle_object(arguments[0], &dbx_handle, &dbx_module)) {
+    if (!split_dbx_handle_object(arguments[0], &dbx_handle, &dbx_module, &dbx_database)) {
         zend_error(E_WARNING, "dbx_error: not a valid dbx_handle-object...");
         RETURN_LONG(0);
         }
@@ -528,6 +486,7 @@ ZEND_FUNCTION(dbx_error)
     MOVE_RETURNED_TO_RV(&return_value, rv_errormsg);
 }
 /* }}} */
+
 /*/
 / /       dbx functions that are database independent... like sorting result_objects!
 /*/
@@ -685,18 +644,6 @@ ZEND_FUNCTION(dbx_sort)
 
 /***********************************/
 
-/* {{{ proto long dbx_test(???)
-   */
-ZEND_FUNCTION(dbx_test)
-{
-}
-/* }}} */
-
-
-
-
-
-
 /*/
 / / switch_dbx functions
 /*/
@@ -733,12 +680,12 @@ int switch_dbx_close(zval ** rv, zval ** dbx_handle, INTERNAL_FUNCTION_PARAMETER
     return 0;
     }
 
-int switch_dbx_query(zval ** rv, zval ** dbx_handle, zval ** sql_statement, INTERNAL_FUNCTION_PARAMETERS, zval ** dbx_module) {
+int switch_dbx_query(zval ** rv, zval ** dbx_handle, zval ** db_name, zval ** sql_statement, INTERNAL_FUNCTION_PARAMETERS, zval ** dbx_module) {
     /*/ returns 1 as long or result identifier as resource on success or 0 as long on failure /*/
     switch ((*dbx_module)->value.lval) {
-        case DBX_MYSQL: return dbx_mysql_query(rv, dbx_handle, sql_statement, INTERNAL_FUNCTION_PARAM_PASSTHRU);        
-        case DBX_ODBC: return dbx_odbc_query(rv, dbx_handle, sql_statement, INTERNAL_FUNCTION_PARAM_PASSTHRU);        
-        case DBX_PGSQL: return dbx_pgsql_query(rv, dbx_handle, sql_statement, INTERNAL_FUNCTION_PARAM_PASSTHRU);        
+        case DBX_MYSQL: return dbx_mysql_query(rv, dbx_handle, db_name, sql_statement, INTERNAL_FUNCTION_PARAM_PASSTHRU);        
+        case DBX_ODBC: return dbx_odbc_query(rv, dbx_handle, db_name, sql_statement, INTERNAL_FUNCTION_PARAM_PASSTHRU);        
+        case DBX_PGSQL: return dbx_pgsql_query(rv, dbx_handle, db_name, sql_statement, INTERNAL_FUNCTION_PARAM_PASSTHRU);        
         }
     zend_error(E_WARNING, "dbx_query: not supported in this module");
     return 0;
index 0d2d300424ba33b3c2599fb1e17896cf16d6f099..3366be3c2db90b79e5f7e55aea3db34b1bf65738 100644 (file)
@@ -94,15 +94,16 @@ int dbx_mysql_close(zval ** rv, zval ** dbx_handle, INTERNAL_FUNCTION_PARAMETERS
     return 1;
     }
 
-int dbx_mysql_query(zval ** rv, zval ** dbx_handle, zval ** sql_statement, INTERNAL_FUNCTION_PARAMETERS) {
+int dbx_mysql_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 /*/
-    int number_of_arguments=2;
-    zval ** arguments[2];
+    int number_of_arguments=3;
+    zval ** arguments[3];
     zval * returned_zval=NULL;
 
-    arguments[0]=sql_statement;
-    arguments[1]=dbx_handle;
-    dbx_call_any_function(INTERNAL_FUNCTION_PARAM_PASSTHRU, "mysql_query", &returned_zval, number_of_arguments, arguments);
+    arguments[0]=db_name;
+    arguments[1]=sql_statement;
+    arguments[2]=dbx_handle;
+    dbx_call_any_function(INTERNAL_FUNCTION_PARAM_PASSTHRU, "mysql_db_query", &returned_zval, number_of_arguments, arguments);
     /*/ mysql_query returns a bool for success or failure, or a result_identifier for select statements /*/
     if (!returned_zval || (returned_zval->type!=IS_BOOL && returned_zval->type!=IS_RESOURCE)) {
         if (returned_zval) zval_ptr_dtor(&returned_zval);
index 1f36383cfe52ec6fd14f87f7ca72c875be617d12..4a3b49aafb5ee1d29c2a3e5d38ee338d014a6a98 100644 (file)
@@ -35,7 +35,7 @@ int dbx_mysql_pconnect(zval ** rv, zval ** host, zval ** db, zval ** username, z
     /*/ returns persistent connection handle as resource on success or 0 as long on failure /*/
 int dbx_mysql_close(zval ** rv, zval ** dbx_handle, INTERNAL_FUNCTION_PARAMETERS);
     /*/ returns 1 as long on success or 0 as long on failure /*/
-int dbx_mysql_query(zval ** rv, zval ** dbx_handle, zval ** sql_statement, INTERNAL_FUNCTION_PARAMETERS);
+int dbx_mysql_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 /*/
 int dbx_mysql_getcolumncount(zval ** rv, zval ** result_handle, INTERNAL_FUNCTION_PARAMETERS);
     /*/ returns column-count as long on success or 0 as long on failure /*/
index f13c0fcb06a8b07ce06a8aa056a5de36d17adabd..3e4d0ef39a4073731d290374cf77e43f1c32739b 100644 (file)
@@ -78,13 +78,14 @@ int dbx_odbc_close(zval ** rv, zval ** dbx_handle, INTERNAL_FUNCTION_PARAMETERS)
     return 1;
     }
 
-int dbx_odbc_query(zval ** rv, zval ** dbx_handle, zval ** sql_statement, INTERNAL_FUNCTION_PARAMETERS) {
+int dbx_odbc_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 /*/
     int number_of_arguments=2;
     zval ** arguments[2];
     zval * queryresult_zval=NULL;
     zval * num_fields_zval=NULL;
 
+    // db_name is not used in this function
     arguments[0]=dbx_handle;
     arguments[1]=sql_statement;
     dbx_call_any_function(INTERNAL_FUNCTION_PARAM_PASSTHRU, "odbc_exec", &queryresult_zval, number_of_arguments, arguments);
index ffa20f4b8b4bc20240ce2ac251a862f1d93e7696..895545e5f834d1946fa9a8783c61264ea4057e0a 100644 (file)
@@ -35,7 +35,7 @@ int dbx_odbc_pconnect(zval ** rv, zval ** host, zval ** db, zval ** username, zv
     /*/ returns persisten connection handle as resource on success or 0 as long on failure /*/
 int dbx_odbc_close(zval ** rv, zval ** dbx_handle, INTERNAL_FUNCTION_PARAMETERS);
     /*/ returns 1 as long on success or 0 as long on failure /*/
-int dbx_odbc_query(zval ** rv, zval ** dbx_handle, zval ** sql_statement, INTERNAL_FUNCTION_PARAMETERS);
+int dbx_odbc_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 /*/
 int dbx_odbc_getcolumncount(zval ** rv, zval ** result_handle, INTERNAL_FUNCTION_PARAMETERS);
     /*/ returns column-count as long on success or 0 as long on failure /*/
index 2f6b6ec5145c41dcf694ade76cc59fea999e5110..ecafaa18b96dc824b4679a81fd26487ab920873b 100644 (file)
@@ -138,13 +138,14 @@ int dbx_pgsql_close(zval ** rv, zval ** dbx_handle, INTERNAL_FUNCTION_PARAMETERS
     return 1;
 }
 
-int dbx_pgsql_query(zval ** rv, zval ** dbx_handle, zval ** sql_statement, INTERNAL_FUNCTION_PARAMETERS) {
+int dbx_pgsql_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 */
     int nargs=2;
     zval **args[2];
     zval *returned_zval=NULL, *num_rows_zval=NULL;
 
+    // db_name is not used in this function
     args[0]=dbx_handle;
     args[1]=sql_statement;
     dbx_call_any_function(INTERNAL_FUNCTION_PARAM_PASSTHRU, "pg_exec", &returned_zval, nargs, args);
index 6c267fa2195eca048f3dc84837bb029e69efa680..80668c9bb419775a095690adf7d964ba9830f6aa 100644 (file)
@@ -31,7 +31,7 @@ int dbx_pgsql_pconnect(zval ** rv, zval ** host, zval ** db, zval ** username, z
     /*/ returns persistent connection handle as resource on success or 0 as long on failure /*/
 int dbx_pgsql_close(zval ** rv, zval ** dbx_handle, INTERNAL_FUNCTION_PARAMETERS);
     /*/ returns 1 as long on success or 0 as long on failure /*/
-int dbx_pgsql_query(zval ** rv, zval ** dbx_handle, zval ** sql_statement, INTERNAL_FUNCTION_PARAMETERS);
+int dbx_pgsql_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 /*/
 int dbx_pgsql_getcolumncount(zval ** rv, zval ** result_handle, INTERNAL_FUNCTION_PARAMETERS);
     /*/ returns column-count as long on success or 0 as long on failure /*/
index 6240b953fc8a8ce11ebedccc52c8c4ec2bef6f08..80300e740256dbda43bb34cbc7768d3ef8a46b46 100644 (file)
@@ -52,18 +52,16 @@ ZEND_FUNCTION(dbx_sort);
 ZEND_FUNCTION(dbx_cmp_asc);
 ZEND_FUNCTION(dbx_cmp_desc);
 
-ZEND_FUNCTION(dbx_test);
-
 /* 
        Declare any global variables you may need between the BEGIN
        and END macros here:     
 */
+
 /*
 ZEND_BEGIN_MODULE_GLOBALS(dbx)
-        int row_count;
-        int num_rows;
 ZEND_END_MODULE_GLOBALS(dbx)
 */
+
 /* In every function that needs to use variables in php_dbx_globals,
    do call dbxLS_FETCH(); after declaring other variables used by
    that function, and always refer to them as dbxG(variable).