2
+----------------------------------------------------------------------+
4
+----------------------------------------------------------------------+
5
| Copyright (c) 1997-2004 The PHP Group |
6
+----------------------------------------------------------------------+
7
| dbx module version 1.0 |
8
+----------------------------------------------------------------------+
9
| Copyright (c) 2001-2003 Guidance Rotterdam BV |
10
+----------------------------------------------------------------------+
11
| This source file is subject to version 3.0 of the PHP license, |
12
| that is bundled with this package in the file LICENSE, and is |
13
| available through the world-wide-web at the following url: |
14
| http://www.php.net/license/3_0.txt. |
15
| If you did not receive a copy of the PHP license and are unable to |
16
| obtain it through the world-wide-web, please send a note to |
17
| license@php.net so we can mail you a copy immediately. |
18
+----------------------------------------------------------------------+
19
| Author : Marc Boeren <marc@guidance.nl> |
20
+----------------------------------------------------------------------+
23
/* $Id: dbx.c,v 1.57 2004/01/08 08:15:09 andi Exp $ */
32
#include "ext/standard/info.h"
34
/* defines for supported databases */
42
#define DBX_SYBASECT 7
44
/* includes for supported databases */
46
#include "dbx_mysql.h"
48
#include "dbx_pgsql.h"
49
#include "dbx_mssql.h"
50
#include "dbx_fbsql.h"
52
#include "dbx_sybasect.h"
53
#include "dbx_sqlite.h"
55
/* support routines */
56
int module_exists(char *module_name)
58
zend_module_entry *zme;
60
r = zend_hash_find(&module_registry, module_name, strlen(module_name)+1, (void **) &zme);
64
int module_identifier_exists(long module_identifier)
66
switch (module_identifier) {
67
case DBX_MYSQL: return module_exists("mysql");
68
case DBX_ODBC: return module_exists("odbc");
69
case DBX_PGSQL: return module_exists("pgsql");
70
case DBX_MSSQL: return module_exists("mssql");
71
case DBX_FBSQL: return module_exists("fbsql");
72
case DBX_OCI8: return module_exists("oci8");
73
case DBX_SYBASECT: return module_exists("sybase_ct");
74
case DBX_SQLITE: return module_exists("sqlite");
79
int get_module_identifier(char *module_name)
81
if (!strcmp("mysql", module_name)) return DBX_MYSQL;
82
if (!strcmp("odbc", module_name)) return DBX_ODBC;
83
if (!strcmp("pgsql", module_name)) return DBX_PGSQL;
84
if (!strcmp("mssql", module_name)) return DBX_MSSQL;
85
if (!strcmp("fbsql", module_name)) return DBX_FBSQL;
86
if (!strcmp("oci8", module_name)) return DBX_OCI8;
87
if (!strcmp("sybase_ct", module_name)) return DBX_SYBASECT;
88
if (!strcmp("sqlite", module_name)) return DBX_SQLITE;
92
int split_dbx_handle_object(zval **dbx_object, zval ***pdbx_handle, zval ***pdbx_module, zval ***pdbx_database TSRMLS_DC)
94
convert_to_object_ex(dbx_object);
95
if (zend_hash_find(Z_OBJPROP_PP(dbx_object), "handle", 7, (void **) pdbx_handle)==FAILURE
96
|| zend_hash_find(Z_OBJPROP_PP(dbx_object), "module", 7, (void **) pdbx_module)==FAILURE
97
|| zend_hash_find(Z_OBJPROP_PP(dbx_object), "database", 9, (void **) pdbx_database)==FAILURE) {
103
int split_dbx_result_object(zval **dbx_result, zval ***pdbx_link, zval ***pdbx_handle, zval ***pdbx_flags, zval ***pdbx_info, zval ***pdbx_cols , zval ***pdbx_rows TSRMLS_DC)
105
convert_to_object_ex(dbx_result);
106
if (zend_hash_find(Z_OBJPROP_PP(dbx_result), "link", 5, (void **) pdbx_link)==FAILURE
107
|| zend_hash_find(Z_OBJPROP_PP(dbx_result), "handle", 7, (void **) pdbx_handle)==FAILURE
108
|| zend_hash_find(Z_OBJPROP_PP(dbx_result), "flags", 6, (void **) pdbx_flags)==FAILURE
109
|| zend_hash_find(Z_OBJPROP_PP(dbx_result), "info", 5, (void **) pdbx_info)==FAILURE
110
|| zend_hash_find(Z_OBJPROP_PP(dbx_result), "cols", 5, (void **) pdbx_cols)==FAILURE
111
|| zend_hash_find(Z_OBJPROP_PP(dbx_result), "rows", 5, (void **) pdbx_rows)==FAILURE) {
117
/* from dbx.h, to be used in support-files (dbx_mysql.c etc...) */
118
void dbx_call_any_function(INTERNAL_FUNCTION_PARAMETERS, char *function_name, zval **returnvalue, int number_of_arguments, zval ***params)
120
zval *zval_function_name;
122
MAKE_STD_ZVAL(zval_function_name);
123
ZVAL_STRING(zval_function_name, function_name, 1);
124
if (call_user_function_ex(EG(function_table), NULL, zval_function_name, returnvalue, number_of_arguments, params, 0, NULL TSRMLS_CC) == FAILURE) {
125
php_error_docref(NULL TSRMLS_CC, E_ERROR, "function '%s' not found", Z_STRVAL_P(zval_function_name));
127
zval_dtor(zval_function_name); /* to free stringvalue memory */
128
FREE_ZVAL(zval_function_name);
131
/* switch_dbx functions declarations
132
* each must be supported in the dbx_module files as dbx_module_function,
133
* e.g. switch_dbx_connect expects a dbx_mysql_connect in de dbx_mysql files
134
* all params except the dbx_module param are passed on
135
* each must return the expected zval *'s in the rv parameter, which are passed on unmodified
136
* do NOT use the return_value parameter from INTERNAL_FUNCTION_PARAMETERS
137
* you can additionally return 0 or 1 for failure or success which will also be returned by the switches
139
int switch_dbx_connect(zval **rv, zval **host, zval **db, zval **username, zval **password, INTERNAL_FUNCTION_PARAMETERS, zval **dbx_module);
140
/* returns connection handle as resource on success or 0 as long on failure */
141
int switch_dbx_pconnect(zval **rv, zval **host, zval **db, zval **username, zval **password, INTERNAL_FUNCTION_PARAMETERS, zval **dbx_module);
142
/* returns persistent connection handle as resource on success or 0 as long on failure */
143
int switch_dbx_close(zval **rv, zval **dbx_handle, INTERNAL_FUNCTION_PARAMETERS, zval **dbx_module);
144
/* returns 1 as long on success or 0 as long on failure */
145
int switch_dbx_query(zval **rv, zval **dbx_handle, zval **db_name, zval **sql_statement, INTERNAL_FUNCTION_PARAMETERS, zval **dbx_module);
146
/* returns 1 as long or result identifier as resource on success or 0 as long on failure */
147
int switch_dbx_getcolumncount(zval **rv, zval **result_handle, INTERNAL_FUNCTION_PARAMETERS, zval **dbx_module);
148
/* returns column-count as long on success or 0 as long on failure */
149
int switch_dbx_getcolumnname(zval **rv, zval **result_handle, long column_index, INTERNAL_FUNCTION_PARAMETERS, zval **dbx_module);
150
/* returns column-name as string on success or 0 as long on failure */
151
int switch_dbx_getcolumntype(zval **rv, zval **result_handle, long column_index, INTERNAL_FUNCTION_PARAMETERS, zval **dbx_module);
152
/* returns column-type as string on success or 0 as long on failure */
153
int switch_dbx_getrow(zval **rv, zval **result_handle, long row_number, INTERNAL_FUNCTION_PARAMETERS, zval **dbx_module);
154
/* returns array[0..columncount-1] as strings on success or 0 as long on failure */
155
int switch_dbx_error(zval **rv, zval **dbx_handle, INTERNAL_FUNCTION_PARAMETERS, zval **dbx_module);
157
int switch_dbx_esc(zval **rv, zval **dbx_handle, zval **string, INTERNAL_FUNCTION_PARAMETERS, zval **dbx_module);
158
/* returns escaped string */
160
/* Every user visible function must have an entry in dbx_functions[].
162
function_entry dbx_functions[] = {
163
ZEND_FE(dbx_connect, NULL)
164
ZEND_FE(dbx_close, NULL)
165
ZEND_FE(dbx_query, NULL)
166
ZEND_FE(dbx_fetch_row, NULL)
167
ZEND_FE(dbx_error, NULL)
168
ZEND_FE(dbx_escape_string, NULL)
170
ZEND_FE(dbx_sort, NULL)
171
ZEND_FE(dbx_compare, NULL)
173
{NULL, NULL, NULL} /* Must be the last line in dbx_functions[] */
176
zend_module_entry dbx_module_entry = {
177
STANDARD_MODULE_HEADER,
182
NULL, /*ZEND_RINIT(dbx), Replace with NULL if there's nothing to do at request start */
183
NULL, /*ZEND_RSHUTDOWN(dbx), Replace with NULL if there's nothing to do at request end */
186
STANDARD_MODULE_PROPERTIES
189
#ifdef COMPILE_DL_DBX
194
ZEND_INI_ENTRY("dbx.colnames_case", "unchanged", ZEND_INI_SYSTEM, NULL)
197
ZEND_MINIT_FUNCTION(dbx)
199
REGISTER_INI_ENTRIES();
201
REGISTER_LONG_CONSTANT("DBX_MYSQL", DBX_MYSQL, CONST_CS | CONST_PERSISTENT);
202
REGISTER_LONG_CONSTANT("DBX_ODBC", DBX_ODBC, CONST_CS | CONST_PERSISTENT);
203
REGISTER_LONG_CONSTANT("DBX_PGSQL", DBX_PGSQL, CONST_CS | CONST_PERSISTENT);
204
REGISTER_LONG_CONSTANT("DBX_MSSQL", DBX_MSSQL, CONST_CS | CONST_PERSISTENT);
205
REGISTER_LONG_CONSTANT("DBX_FBSQL", DBX_FBSQL, CONST_CS | CONST_PERSISTENT);
206
REGISTER_LONG_CONSTANT("DBX_OCI8", DBX_OCI8, CONST_CS | CONST_PERSISTENT);
207
REGISTER_LONG_CONSTANT("DBX_SYBASECT", DBX_SYBASECT, CONST_CS | CONST_PERSISTENT);
208
REGISTER_LONG_CONSTANT("DBX_SQLITE", DBX_SQLITE, CONST_CS | CONST_PERSISTENT);
210
REGISTER_LONG_CONSTANT("DBX_PERSISTENT", DBX_PERSISTENT, CONST_CS | CONST_PERSISTENT);
212
REGISTER_LONG_CONSTANT("DBX_RESULT_INFO", DBX_RESULT_INFO, CONST_CS | CONST_PERSISTENT);
213
REGISTER_LONG_CONSTANT("DBX_RESULT_INDEX", DBX_RESULT_INDEX, CONST_CS | CONST_PERSISTENT);
214
REGISTER_LONG_CONSTANT("DBX_RESULT_ASSOC", DBX_RESULT_ASSOC, CONST_CS | CONST_PERSISTENT);
215
REGISTER_LONG_CONSTANT("DBX_RESULT_UNBUFFERED", DBX_RESULT_UNBUFFERED, CONST_CS | CONST_PERSISTENT);
217
REGISTER_LONG_CONSTANT("DBX_COLNAMES_UNCHANGED", DBX_COLNAMES_UNCHANGED, CONST_CS | CONST_PERSISTENT);
218
REGISTER_LONG_CONSTANT("DBX_COLNAMES_UPPERCASE", DBX_COLNAMES_UPPERCASE, CONST_CS | CONST_PERSISTENT);
219
REGISTER_LONG_CONSTANT("DBX_COLNAMES_LOWERCASE", DBX_COLNAMES_LOWERCASE, CONST_CS | CONST_PERSISTENT);
221
REGISTER_LONG_CONSTANT("DBX_CMP_NATIVE", DBX_CMP_NATIVE, CONST_CS | CONST_PERSISTENT);
222
REGISTER_LONG_CONSTANT("DBX_CMP_TEXT", DBX_CMP_TEXT, CONST_CS | CONST_PERSISTENT);
223
REGISTER_LONG_CONSTANT("DBX_CMP_NUMBER", DBX_CMP_NUMBER, CONST_CS | CONST_PERSISTENT);
224
REGISTER_LONG_CONSTANT("DBX_CMP_ASC", DBX_CMP_ASC, CONST_CS | CONST_PERSISTENT);
225
REGISTER_LONG_CONSTANT("DBX_CMP_DESC", DBX_CMP_DESC, CONST_CS | CONST_PERSISTENT);
230
ZEND_MSHUTDOWN_FUNCTION(dbx)
232
UNREGISTER_INI_ENTRIES();
236
/* Remove if there's nothing to do at request start */
237
/*ZEND_RINIT_FUNCTION(dbx)
241
/* Remove if there's nothing to do at request end */
242
/*ZEND_RSHUTDOWN_FUNCTION(dbx)
246
ZEND_MINFO_FUNCTION(dbx)
248
php_info_print_table_start();
249
php_info_print_table_row(2, "dbx support", "enabled");
250
php_info_print_table_row(2, "dbx version", "1.1.0");
251
php_info_print_table_row(2, "supported databases", "MySQL\nODBC\nPostgreSQL\nMicrosoft SQL Server\nFrontBase\nOracle 8 (oci8)\nSybase-CT\nSQLite");
252
php_info_print_table_end();
253
DISPLAY_INI_ENTRIES();
258
actual implementation of the dbx functions
262
/* {{{ proto dbx_link_object dbx_connect(string module_name, string host, string db, string username, string password [, bool persistent])
263
Returns a dbx_link_object on success and returns 0 on failure */
264
ZEND_FUNCTION(dbx_connect)
266
int number_of_arguments=5;
270
long module_identifier;
276
if ( !(ZEND_NUM_ARGS()==number_of_arguments+1 || ZEND_NUM_ARGS()==number_of_arguments) || zend_get_parameters_array_ex(ZEND_NUM_ARGS(), arguments) == FAILURE) {
279
if (ZEND_NUM_ARGS()==number_of_arguments+1) {
280
convert_to_long_ex(arguments[5]);
281
if (Z_LVAL_PP(arguments[5])!=0) persistent=1;
284
if (Z_TYPE_PP(arguments[0]) == IS_LONG) {
285
if (!module_identifier_exists(Z_LVAL_PP(arguments[0]))) {
286
php_error_docref(NULL TSRMLS_CC, E_WARNING, "dbx: module '%ld' not loaded or not supported.", Z_LVAL_PP(arguments[0]));
289
module_identifier = Z_LVAL_PP(arguments[0]);
291
convert_to_string_ex(arguments[0]);
292
if (!module_exists(Z_STRVAL_PP(arguments[0]))) {
293
php_error_docref(NULL TSRMLS_CC, E_WARNING, "dbx: module '%s' not loaded.", Z_STRVAL_PP(arguments[0]));
296
module_identifier=get_module_identifier(Z_STRVAL_PP(arguments[0]));
297
if (!module_identifier) {
298
php_error_docref(NULL TSRMLS_CC, E_WARNING, "dbx: unsupported module '%s'.", Z_STRVAL_PP(arguments[0]));
303
MAKE_STD_ZVAL(dbx_module);
304
ZVAL_LONG(dbx_module, module_identifier);
305
MAKE_STD_ZVAL(rv_dbx_handle);
306
ZVAL_LONG(rv_dbx_handle, 0);
307
convert_to_string_ex(arguments[1]);
308
convert_to_string_ex(arguments[2]);
309
convert_to_string_ex(arguments[3]);
310
convert_to_string_ex(arguments[4]);
311
MAKE_STD_ZVAL(db_name);
312
ZVAL_STRING(db_name, Z_STRVAL_PP(arguments[2]), 1);
314
result = switch_dbx_pconnect(&rv_dbx_handle, arguments[1], arguments[2], arguments[3], arguments[4], INTERNAL_FUNCTION_PARAM_PASSTHRU, &dbx_module);
316
result = switch_dbx_connect(&rv_dbx_handle, arguments[1], arguments[2], arguments[3], arguments[4], INTERNAL_FUNCTION_PARAM_PASSTHRU, &dbx_module);
319
FREE_ZVAL(dbx_module);
320
zval_dtor(db_name); /* to free stringvalue memory */
322
FREE_ZVAL(rv_dbx_handle);
326
object_init(return_value);
328
zend_hash_update(Z_OBJPROP_P(return_value), "handle", 7, (void *)&(rv_dbx_handle), sizeof(zval *), NULL);
329
zend_hash_update(Z_OBJPROP_P(return_value), "module", 7, (void *)&(dbx_module), sizeof(zval *), NULL);
330
zend_hash_update(Z_OBJPROP_P(return_value), "database", 9, (void *)&(db_name), sizeof(zval *), NULL);
334
/* {{{ proto int dbx_close(dbx_link_object dbx_link)
335
Returns success or failure
337
ZEND_FUNCTION(dbx_close)
339
int number_of_arguments=1;
348
if (ZEND_NUM_ARGS() !=number_of_arguments || zend_get_parameters_array_ex(number_of_arguments, arguments) == FAILURE) {
351
if (!split_dbx_handle_object(arguments[0], &dbx_handle, &dbx_module, &dbx_database TSRMLS_CC)) {
352
php_error_docref(NULL TSRMLS_CC, E_WARNING, "not a valid dbx_handle-object...");
356
MAKE_STD_ZVAL(rv_success);
357
ZVAL_LONG(rv_success, 0);
359
result = switch_dbx_close(&rv_success, dbx_handle, INTERNAL_FUNCTION_PARAM_PASSTHRU, dbx_module);
361
result = (result && Z_LVAL_P(rv_success))?1:0;
362
FREE_ZVAL(rv_success);
364
RETURN_LONG(result?1:0);
368
/* {{{ proto dbx_result_object dbx_query(dbx_link_object dbx_link, string sql_statement [, int flags])
369
Returns a dbx_link_object on success and returns 0 on failure */
370
ZEND_FUNCTION(dbx_query)
372
int min_number_of_arguments=2;
373
int number_of_arguments=3;
380
zval *rv_result_handle;
381
zval *rv_column_count;
390
/* default values for colname-case */
391
char * colnames_case = INI_STR("dbx.colnames_case");
392
long colcase = DBX_COLNAMES_UNCHANGED;
393
if (!strcmp(colnames_case, "uppercase")) {
394
colcase = DBX_COLNAMES_UPPERCASE;
396
if (!strcmp(colnames_case, "lowercase")) {
397
colcase = DBX_COLNAMES_LOWERCASE;
400
if (ZEND_NUM_ARGS()<min_number_of_arguments || ZEND_NUM_ARGS()>number_of_arguments || zend_get_parameters_array_ex(ZEND_NUM_ARGS(), arguments) == FAILURE) {
403
if (!split_dbx_handle_object(arguments[0], &dbx_handle, &dbx_module, &dbx_database TSRMLS_CC)) {
404
php_error_docref(NULL TSRMLS_CC, E_WARNING, "not a valid dbx_handle-object...");
408
result_flags = DBX_RESULT_INFO | DBX_RESULT_INDEX | DBX_RESULT_ASSOC;
409
/* parameter overrides */
410
if (ZEND_NUM_ARGS()>2) {
411
convert_to_long_ex(arguments[2]);
412
query_flags = Z_LVAL_PP(arguments[2]);
413
/* fieldnames are needed for association! */
414
result_flags = (query_flags & DBX_RESULT_INFO) | (query_flags & DBX_RESULT_INDEX) | (query_flags & DBX_RESULT_ASSOC) | (query_flags & DBX_RESULT_UNBUFFERED);
415
if (result_flags & DBX_RESULT_ASSOC) {
416
result_flags |= DBX_RESULT_INFO;
418
if (!result_flags) result_flags = DBX_RESULT_INFO | DBX_RESULT_INDEX | DBX_RESULT_ASSOC;
419
if (result_flags == DBX_RESULT_UNBUFFERED) result_flags |= DBX_RESULT_INFO | DBX_RESULT_INDEX | DBX_RESULT_ASSOC;
420
/* override ini-setting for colcase */
421
if (query_flags & DBX_COLNAMES_UNCHANGED) {
422
colcase = DBX_COLNAMES_UNCHANGED;
424
if (query_flags & DBX_COLNAMES_UPPERCASE) {
425
colcase = DBX_COLNAMES_UPPERCASE;
427
if (query_flags & DBX_COLNAMES_LOWERCASE) {
428
colcase = DBX_COLNAMES_LOWERCASE;
431
MAKE_STD_ZVAL(rv_result_handle);
432
ZVAL_LONG(rv_result_handle, 0);
433
convert_to_string_ex(arguments[1]);
434
result = switch_dbx_query(&rv_result_handle, dbx_handle, dbx_database, arguments[1], INTERNAL_FUNCTION_PARAM_PASSTHRU, dbx_module);
435
/* boolean return value means either failure for any query or success for queries that don't return anything */
436
if (!result || (rv_result_handle && Z_TYPE_P(rv_result_handle)==IS_BOOL)) {
437
result = (result && Z_LVAL_P(rv_result_handle))?1:0;
438
FREE_ZVAL(rv_result_handle);
439
RETURN_LONG(result?1:0);
441
/* if you get here, the query succeeded and returned results, so we'll return them
442
* rv_result_handle holds a resource
444
/* init return_value as object (of rows) */
445
object_init(return_value);
447
zend_hash_update(Z_OBJPROP_P(return_value), "link", 5, (void *)(arguments[0]), sizeof(zval *), NULL);
448
/* need extra refcount here otherwise the link object is destroyed when the
449
* query resultobject is destroyed (or not assigned!)
451
zval_add_ref(arguments[0]);
452
/* add result_handle property to return_value */
453
zend_hash_update(Z_OBJPROP_P(return_value), "handle", 7, (void *)&(rv_result_handle), sizeof(zval *), NULL);
454
/* add flags property to return_value */
455
add_property_long(return_value, "flags", result_flags | colcase);
456
/* init info property as array and add to return_value as a property */
457
if (result_flags & DBX_RESULT_INFO) {
460
zend_hash_update(Z_OBJPROP_P(return_value), "info", 5, (void *)&(info), sizeof(zval *), NULL);
462
/* init data property as array and add to return_value as a property */
463
if (!(result_flags & DBX_RESULT_UNBUFFERED)) {
466
zend_hash_update(Z_OBJPROP_P(return_value), "data", 5, (void *)&(data), sizeof(zval *), NULL);
468
/* get columncount and add to returnvalue as property */
469
MAKE_STD_ZVAL(rv_column_count);
470
ZVAL_LONG(rv_column_count, 0);
471
result = switch_dbx_getcolumncount(&rv_column_count, &rv_result_handle, INTERNAL_FUNCTION_PARAM_PASSTHRU, dbx_module);
473
php_error_docref(NULL TSRMLS_CC, E_ERROR, "get column_count failed...");
474
FREE_ZVAL(rv_column_count);
477
zend_hash_update(Z_OBJPROP_P(return_value), "cols", 5, (void *)&(rv_column_count), sizeof(zval *), NULL);
478
/* fill the info array with columnnames and types (indexed and assoc) */
479
if (result_flags & DBX_RESULT_INFO) {
482
MAKE_STD_ZVAL(info_row_name);
483
MAKE_STD_ZVAL(info_row_type);
484
array_init(info_row_name);
485
array_init(info_row_type);
486
for (col_index=0; col_index<Z_LVAL_P(rv_column_count); ++col_index) {
487
zval *rv_column_name;
488
zval *rv_column_type;
490
MAKE_STD_ZVAL(rv_column_name);
491
ZVAL_LONG(rv_column_name, 0);
492
result = switch_dbx_getcolumnname(&rv_column_name, &rv_result_handle, col_index, INTERNAL_FUNCTION_PARAM_PASSTHRU, dbx_module);
493
/* modify case if requested */
494
if (colcase==DBX_COLNAMES_UPPERCASE) {
495
php_strtoupper(Z_STRVAL_P(rv_column_name), Z_STRLEN_P(rv_column_name));
497
if (colcase==DBX_COLNAMES_LOWERCASE) {
498
php_strtolower(Z_STRVAL_P(rv_column_name), Z_STRLEN_P(rv_column_name));
501
zend_hash_index_update(Z_ARRVAL_P(info_row_name), col_index, (void *)&(rv_column_name), sizeof(zval *), NULL);
503
FREE_ZVAL(rv_column_name);
506
MAKE_STD_ZVAL(rv_column_type);
507
ZVAL_LONG(rv_column_type, 0);
508
result = switch_dbx_getcolumntype(&rv_column_type, &rv_result_handle, col_index, INTERNAL_FUNCTION_PARAM_PASSTHRU, dbx_module);
510
zend_hash_index_update(Z_ARRVAL_P(info_row_type), col_index, (void *)&(rv_column_type), sizeof(zval *), NULL);
512
FREE_ZVAL(rv_column_type);
515
zend_hash_update(Z_ARRVAL_P(info), "name", 5, (void *) &info_row_name, sizeof(zval *), (void **) &inforow_ptr);
516
zend_hash_update(Z_ARRVAL_P(info), "type", 5, (void *) &info_row_type, sizeof(zval *), NULL);
518
/* fill each row array with fieldvalues (indexed (and assoc)) */
519
if (!(result_flags & DBX_RESULT_UNBUFFERED)) {
524
MAKE_STD_ZVAL(rv_row);
525
ZVAL_LONG(rv_row, 0);
526
result = switch_dbx_getrow(&rv_row, &rv_result_handle, row_count, INTERNAL_FUNCTION_PARAM_PASSTHRU, dbx_module);
528
zend_hash_index_update(Z_ARRVAL_P(data), row_count, (void *)&(rv_row), sizeof(zval *), (void **) &row_ptr);
529
/* associate results with fieldnames */
530
if (result_flags & DBX_RESULT_ASSOC) {
531
zval **columnname_ptr, **actual_ptr;
532
for (col_index=0; col_index<Z_LVAL_P(rv_column_count); ++col_index) {
533
zend_hash_index_find(Z_ARRVAL_PP(inforow_ptr), col_index, (void **) &columnname_ptr);
534
zend_hash_index_find(Z_ARRVAL_PP(row_ptr), col_index, (void **) &actual_ptr);
535
(*actual_ptr)->refcount+=1;
536
(*actual_ptr)->is_ref=1;
537
zend_hash_update(Z_ARRVAL_PP(row_ptr), Z_STRVAL_PP(columnname_ptr), Z_STRLEN_PP(columnname_ptr) + 1, actual_ptr, sizeof(zval *), NULL);
545
/* add row_count property */
546
add_property_long(return_value, "rows", row_count);
549
add_property_long(return_value, "rows", 0);
554
/* {{{ proto dbx_row dbx_fetch_row(dbx_query_object dbx_q)
555
Returns a row (index and assoc based on query) on success and returns 0 on failure or no more rows */
556
ZEND_FUNCTION(dbx_fetch_row)
558
int number_of_arguments=1;
561
zval **dbx_result_link;
562
zval **dbx_result_handle;
563
zval **dbx_result_flags;
564
zval **dbx_result_info;
565
zval **dbx_result_cols;
566
zval **dbx_result_rows;
579
if (ZEND_NUM_ARGS()!=number_of_arguments || zend_get_parameters_array_ex(ZEND_NUM_ARGS(), arguments) == FAILURE) {
582
if (!split_dbx_result_object(arguments[0], &dbx_result_link, &dbx_result_handle, &dbx_result_flags, &dbx_result_info, &dbx_result_cols, &dbx_result_rows TSRMLS_CC)) {
583
php_error_docref(NULL TSRMLS_CC, E_WARNING, "not a valid dbx_result-object...");
586
if (!split_dbx_handle_object(dbx_result_link, &dbx_handle, &dbx_module, &dbx_database TSRMLS_CC)) {
587
php_error_docref(NULL TSRMLS_CC, E_WARNING, "not a valid dbx_handle-object...");
592
result_flags = Z_LVAL_PP(dbx_result_flags);
593
col_count = Z_LVAL_PP(dbx_result_cols);
594
row_count = Z_LVAL_PP(dbx_result_rows);
596
/* find fieldnames (for assoc) */
597
if (result_flags & DBX_RESULT_ASSOC) {
598
zend_hash_find(Z_ARRVAL_PP(dbx_result_info), "name", 5, (void **) &inforow_ptr);
601
result = switch_dbx_getrow(&return_value, dbx_result_handle, row_count, INTERNAL_FUNCTION_PARAM_PASSTHRU, dbx_module);
603
/* associate results with fieldnames */
604
if (result_flags & DBX_RESULT_ASSOC) {
605
zval **columnname_ptr, **actual_ptr;
606
for (col_index=0; col_index<col_count; ++col_index) {
607
zend_hash_index_find(Z_ARRVAL_PP(inforow_ptr), col_index, (void **) &columnname_ptr);
608
zend_hash_index_find(Z_ARRVAL_P(return_value), col_index, (void **) &actual_ptr);
609
(*actual_ptr)->refcount+=1;
610
(*actual_ptr)->is_ref=1;
611
zend_hash_update(Z_ARRVAL_P(return_value), Z_STRVAL_PP(columnname_ptr), Z_STRLEN_PP(columnname_ptr) + 1, actual_ptr, sizeof(zval *), NULL);
615
add_property_long(*arguments[0], "rows", row_count);
621
/* {{{ proto string dbx_error(dbx_link_object dbx_link)
622
Returns success or failure
624
ZEND_FUNCTION(dbx_error)
626
int number_of_arguments=1;
635
if (ZEND_NUM_ARGS() !=number_of_arguments || zend_get_parameters_array_ex(number_of_arguments, arguments) == FAILURE) {
638
if (!split_dbx_handle_object(arguments[0], &dbx_handle, &dbx_module, &dbx_database TSRMLS_CC)) {
639
php_error_docref(NULL TSRMLS_CC, E_WARNING, "not a valid dbx_handle-object...");
643
MAKE_STD_ZVAL(rv_errormsg);
644
ZVAL_LONG(rv_errormsg, 0);
645
result = switch_dbx_error(&rv_errormsg, dbx_handle, INTERNAL_FUNCTION_PARAM_PASSTHRU, dbx_module);
647
FREE_ZVAL(rv_errormsg);
648
RETURN_STRING("", 1);
650
MOVE_RETURNED_TO_RV(&return_value, rv_errormsg);
654
/* {{{ proto string dbx_escape_string(dbx_link_object dbx_link, string sz)
655
Returns escaped string or NULL on error
657
ZEND_FUNCTION(dbx_escape_string)
659
int number_of_arguments=2;
668
if (ZEND_NUM_ARGS() !=number_of_arguments || zend_get_parameters_array_ex(number_of_arguments, arguments) == FAILURE) {
671
if (!split_dbx_handle_object(arguments[0], &dbx_handle, &dbx_module, &dbx_database TSRMLS_CC)) {
672
php_error_docref(NULL TSRMLS_CC, E_WARNING, "not a valid dbx_handle-object...");
675
convert_to_string_ex(arguments[1]);
679
result = switch_dbx_esc(&rv, dbx_handle, arguments[1], INTERNAL_FUNCTION_PARAM_PASSTHRU, dbx_module);
680
if (!result) { /* this will probably never happen */
684
MOVE_RETURNED_TO_RV(&return_value, rv);
689
* dbx functions that are database independent... like sorting result_objects!
692
/* {{{ proto int dbx_compare(array row_x, array row_y, string columnname [, int flags])
693
Returns row_y[columnname] - row_x[columnname], converted to -1, 0 or 1 */
694
ZEND_FUNCTION(dbx_compare)
696
int min_number_of_arguments=3;
697
int max_number_of_arguments=4;
698
int number_of_arguments=-1;
699
long comparison_direction=DBX_CMP_ASC;
700
long comparison_type=DBX_CMP_NATIVE;
707
number_of_arguments=ZEND_NUM_ARGS();
708
if (number_of_arguments<min_number_of_arguments || number_of_arguments>max_number_of_arguments || zend_get_parameters_array_ex(number_of_arguments, arguments) == FAILURE) {
712
if (Z_TYPE_PP(arguments[0]) != IS_ARRAY
713
|| Z_TYPE_PP(arguments[1]) != IS_ARRAY) {
714
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Wrong argument type for compare");
717
convert_to_string_ex(arguments[2]); /* field name */
718
comparison_type = DBX_CMP_NATIVE;
719
comparison_direction = DBX_CMP_ASC;
720
if (number_of_arguments>3) {
721
convert_to_long_ex(arguments[3]); /* comparison type and direction*/
723
if (Z_LVAL_PP(arguments[3]) & DBX_CMP_DESC) {
724
comparison_direction=DBX_CMP_DESC;
726
if (Z_LVAL_PP(arguments[3]) & DBX_CMP_ASC) {
727
comparison_direction=DBX_CMP_ASC;
730
if (Z_LVAL_PP(arguments[3]) & DBX_CMP_NUMBER) {
731
comparison_type=DBX_CMP_NUMBER;
733
if (Z_LVAL_PP(arguments[3]) & DBX_CMP_TEXT) {
734
comparison_type=DBX_CMP_TEXT;
736
if (Z_LVAL_PP(arguments[3]) & DBX_CMP_NATIVE) {
737
comparison_type=DBX_CMP_NATIVE;
741
if (zend_hash_find(Z_ARRVAL_PP(arguments[0]), Z_STRVAL_PP(arguments[2]), Z_STRLEN_PP(arguments[2])+1, (void **) &zv_a)==FAILURE
742
|| zend_hash_find(Z_ARRVAL_PP(arguments[1]), Z_STRVAL_PP(arguments[2]), Z_STRLEN_PP(arguments[2])+1, (void **) &zv_b)==FAILURE) {
743
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Field '%s' not available in result-object", Z_STRVAL_PP(arguments[2]));
747
switch (comparison_type) {
749
convert_to_string_ex(zv_a);
750
convert_to_string_ex(zv_b);
753
convert_to_double_ex(zv_a);
754
convert_to_double_ex(zv_b);
757
switch (Z_TYPE_PP(zv_a)) {
764
ltemp = Z_LVAL_PP(zv_a) - Z_LVAL_PP(zv_b);
765
result = (ltemp==0?0: (ltemp>0?1:-1));
768
dtemp = (Z_DVAL_PP(zv_a) - Z_DVAL_PP(zv_b));
769
result = (dtemp==0?0: (dtemp>0?1:-1));
772
ltemp = strcmp(Z_STRVAL_PP(zv_a), Z_STRVAL_PP(zv_b));
773
result = (ltemp==0?0: (ltemp>0?1:-1));
778
if (comparison_direction==DBX_CMP_DESC) RETURN_LONG(-result);
783
/* {{{ proto int dbx_sort(object dbx_result, string compare_function_name)
784
Returns 0 on failure, 1 on success */
785
ZEND_FUNCTION(dbx_sort)
787
int number_of_arguments=2;
791
if (ZEND_NUM_ARGS() !=number_of_arguments || zend_get_parameters_array_ex(number_of_arguments, arguments) == FAILURE) {
795
if (Z_TYPE_PP(arguments[0]) != IS_OBJECT
796
|| Z_TYPE_PP(arguments[1]) != IS_STRING) {
797
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Wrong argument type for sort");
801
if (zend_hash_find(Z_OBJPROP_PP(arguments[0]), "data", 5, (void **) &zval_data)==FAILURE
802
|| Z_TYPE_PP(zval_data) != IS_ARRAY) {
803
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Wrong argument type for sort");
807
arguments[0] = zval_data;
808
dbx_call_any_function(INTERNAL_FUNCTION_PARAM_PASSTHRU, "usort", &returned_zval, number_of_arguments, arguments);
809
zval_ptr_dtor(&returned_zval);
815
/***********************************/
818
* switch_dbx functions
820
int switch_dbx_connect(zval **rv, zval **host, zval **db, zval **username, zval **password, INTERNAL_FUNCTION_PARAMETERS, zval **dbx_module)
822
/* returns connection handle as resource on success or 0 as long on failure */
823
switch (Z_LVAL_PP(dbx_module)) {
824
case DBX_MYSQL: return dbx_mysql_connect(rv, host, db, username, password, INTERNAL_FUNCTION_PARAM_PASSTHRU);
825
case DBX_ODBC: return dbx_odbc_connect(rv, host, db, username, password, INTERNAL_FUNCTION_PARAM_PASSTHRU);
826
case DBX_PGSQL: return dbx_pgsql_connect(rv, host, db, username, password, INTERNAL_FUNCTION_PARAM_PASSTHRU);
827
case DBX_MSSQL: return dbx_mssql_connect(rv, host, db, username, password, INTERNAL_FUNCTION_PARAM_PASSTHRU);
828
case DBX_FBSQL: return dbx_fbsql_connect(rv, host, db, username, password, INTERNAL_FUNCTION_PARAM_PASSTHRU);
829
case DBX_OCI8: return dbx_oci8_connect(rv, host, db, username, password, INTERNAL_FUNCTION_PARAM_PASSTHRU);
830
case DBX_SYBASECT: return dbx_sybasect_connect(rv, host, db, username, password, INTERNAL_FUNCTION_PARAM_PASSTHRU);
831
case DBX_SQLITE: return dbx_sqlite_connect(rv, host, db, username, password, INTERNAL_FUNCTION_PARAM_PASSTHRU);
833
php_error_docref(NULL TSRMLS_CC, E_WARNING, "not supported in this module");
837
int switch_dbx_pconnect(zval **rv, zval **host, zval **db, zval **username, zval **password, INTERNAL_FUNCTION_PARAMETERS, zval **dbx_module)
839
/* returns persistent connection handle as resource on success or 0 as long on failure */
840
switch (Z_LVAL_PP(dbx_module)) {
841
case DBX_MYSQL: return dbx_mysql_pconnect(rv, host, db, username, password, INTERNAL_FUNCTION_PARAM_PASSTHRU);
842
case DBX_ODBC: return dbx_odbc_pconnect(rv, host, db, username, password, INTERNAL_FUNCTION_PARAM_PASSTHRU);
843
case DBX_PGSQL: return dbx_pgsql_pconnect(rv, host, db, username, password, INTERNAL_FUNCTION_PARAM_PASSTHRU);
844
case DBX_MSSQL: return dbx_mssql_pconnect(rv, host, db, username, password, INTERNAL_FUNCTION_PARAM_PASSTHRU);
845
case DBX_FBSQL: return dbx_fbsql_pconnect(rv, host, db, username, password, INTERNAL_FUNCTION_PARAM_PASSTHRU);
846
case DBX_OCI8: return dbx_oci8_pconnect(rv, host, db, username, password, INTERNAL_FUNCTION_PARAM_PASSTHRU);
847
case DBX_SYBASECT: return dbx_sybasect_pconnect(rv, host, db, username, password, INTERNAL_FUNCTION_PARAM_PASSTHRU);
848
case DBX_SQLITE: return dbx_sqlite_pconnect(rv, host, db, username, password, INTERNAL_FUNCTION_PARAM_PASSTHRU);
850
php_error_docref(NULL TSRMLS_CC, E_WARNING, "not supported in this module");
854
int switch_dbx_close(zval **rv, zval **dbx_handle, INTERNAL_FUNCTION_PARAMETERS, zval **dbx_module)
856
/* returns 1 as long on success or 0 as long on failure */
857
switch (Z_LVAL_PP(dbx_module)) {
858
case DBX_MYSQL: return dbx_mysql_close(rv, dbx_handle, INTERNAL_FUNCTION_PARAM_PASSTHRU);
859
case DBX_ODBC: return dbx_odbc_close(rv, dbx_handle, INTERNAL_FUNCTION_PARAM_PASSTHRU);
860
case DBX_PGSQL: return dbx_pgsql_close(rv, dbx_handle, INTERNAL_FUNCTION_PARAM_PASSTHRU);
861
case DBX_MSSQL: return dbx_mssql_close(rv, dbx_handle, INTERNAL_FUNCTION_PARAM_PASSTHRU);
862
case DBX_FBSQL: return dbx_fbsql_close(rv, dbx_handle, INTERNAL_FUNCTION_PARAM_PASSTHRU);
863
case DBX_OCI8: return dbx_oci8_close(rv, dbx_handle, INTERNAL_FUNCTION_PARAM_PASSTHRU);
864
case DBX_SYBASECT: return dbx_sybasect_close(rv, dbx_handle, INTERNAL_FUNCTION_PARAM_PASSTHRU);
865
case DBX_SQLITE: return dbx_sqlite_close(rv, dbx_handle, INTERNAL_FUNCTION_PARAM_PASSTHRU);
867
php_error_docref(NULL TSRMLS_CC, E_WARNING, "not supported in this module");
871
int switch_dbx_query(zval **rv, zval **dbx_handle, zval **db_name, zval **sql_statement, INTERNAL_FUNCTION_PARAMETERS, zval **dbx_module)
873
/* returns 1 as long or result identifier as resource on success or 0 as long on failure */
874
switch (Z_LVAL_PP(dbx_module)) {
875
case DBX_MYSQL: return dbx_mysql_query(rv, dbx_handle, db_name, sql_statement, INTERNAL_FUNCTION_PARAM_PASSTHRU);
876
case DBX_ODBC: return dbx_odbc_query(rv, dbx_handle, db_name, sql_statement, INTERNAL_FUNCTION_PARAM_PASSTHRU);
877
case DBX_PGSQL: return dbx_pgsql_query(rv, dbx_handle, db_name, sql_statement, INTERNAL_FUNCTION_PARAM_PASSTHRU);
878
case DBX_MSSQL: return dbx_mssql_query(rv, dbx_handle, db_name, sql_statement, INTERNAL_FUNCTION_PARAM_PASSTHRU);
879
case DBX_FBSQL: return dbx_fbsql_query(rv, dbx_handle, db_name, sql_statement, INTERNAL_FUNCTION_PARAM_PASSTHRU);
880
case DBX_OCI8: return dbx_oci8_query(rv, dbx_handle, db_name, sql_statement, INTERNAL_FUNCTION_PARAM_PASSTHRU);
881
case DBX_SYBASECT: return dbx_sybasect_query(rv, dbx_handle, db_name, sql_statement, INTERNAL_FUNCTION_PARAM_PASSTHRU);
882
case DBX_SQLITE: return dbx_sqlite_query(rv, dbx_handle, db_name, sql_statement, INTERNAL_FUNCTION_PARAM_PASSTHRU);
884
php_error_docref(NULL TSRMLS_CC, E_WARNING, "not supported in this module");
888
int switch_dbx_getcolumncount(zval **rv, zval **result_handle, INTERNAL_FUNCTION_PARAMETERS, zval **dbx_module)
890
/* returns column-count as long on success or 0 as long on failure */
891
switch (Z_LVAL_PP(dbx_module)) {
892
case DBX_MYSQL: return dbx_mysql_getcolumncount(rv, result_handle, INTERNAL_FUNCTION_PARAM_PASSTHRU);
893
case DBX_ODBC: return dbx_odbc_getcolumncount(rv, result_handle, INTERNAL_FUNCTION_PARAM_PASSTHRU);
894
case DBX_PGSQL: return dbx_pgsql_getcolumncount(rv, result_handle, INTERNAL_FUNCTION_PARAM_PASSTHRU);
895
case DBX_MSSQL: return dbx_mssql_getcolumncount(rv, result_handle, INTERNAL_FUNCTION_PARAM_PASSTHRU);
896
case DBX_FBSQL: return dbx_fbsql_getcolumncount(rv, result_handle, INTERNAL_FUNCTION_PARAM_PASSTHRU);
897
case DBX_OCI8: return dbx_oci8_getcolumncount(rv, result_handle, INTERNAL_FUNCTION_PARAM_PASSTHRU);
898
case DBX_SYBASECT: return dbx_sybasect_getcolumncount(rv, result_handle, INTERNAL_FUNCTION_PARAM_PASSTHRU);
899
case DBX_SQLITE: return dbx_sqlite_getcolumncount(rv, result_handle, INTERNAL_FUNCTION_PARAM_PASSTHRU);
901
php_error_docref(NULL TSRMLS_CC, E_WARNING, "not supported in this module");
905
int switch_dbx_getcolumnname(zval **rv, zval **result_handle, long column_index, INTERNAL_FUNCTION_PARAMETERS, zval **dbx_module)
907
/* returns column-name as string on success or 0 as long on failure */
908
switch (Z_LVAL_PP(dbx_module)) {
909
case DBX_MYSQL: return dbx_mysql_getcolumnname(rv, result_handle, column_index, INTERNAL_FUNCTION_PARAM_PASSTHRU);
910
case DBX_ODBC: return dbx_odbc_getcolumnname(rv, result_handle, column_index, INTERNAL_FUNCTION_PARAM_PASSTHRU);
911
case DBX_PGSQL: return dbx_pgsql_getcolumnname(rv, result_handle, column_index, INTERNAL_FUNCTION_PARAM_PASSTHRU);
912
case DBX_MSSQL: return dbx_mssql_getcolumnname(rv, result_handle, column_index, INTERNAL_FUNCTION_PARAM_PASSTHRU);
913
case DBX_FBSQL: return dbx_fbsql_getcolumnname(rv, result_handle, column_index, INTERNAL_FUNCTION_PARAM_PASSTHRU);
914
case DBX_OCI8: return dbx_oci8_getcolumnname(rv, result_handle, column_index, INTERNAL_FUNCTION_PARAM_PASSTHRU);
915
case DBX_SYBASECT: return dbx_sybasect_getcolumnname(rv, result_handle, column_index, INTERNAL_FUNCTION_PARAM_PASSTHRU);
916
case DBX_SQLITE: return dbx_sqlite_getcolumnname(rv, result_handle, column_index, INTERNAL_FUNCTION_PARAM_PASSTHRU);
918
php_error_docref(NULL TSRMLS_CC, E_WARNING, "not supported in this module");
922
int switch_dbx_getcolumntype(zval **rv, zval **result_handle, long column_index, INTERNAL_FUNCTION_PARAMETERS, zval **dbx_module)
924
/* returns column-type as string on success or 0 as long on failure */
925
switch (Z_LVAL_PP(dbx_module)) {
926
case DBX_MYSQL: return dbx_mysql_getcolumntype(rv, result_handle, column_index, INTERNAL_FUNCTION_PARAM_PASSTHRU);
927
case DBX_ODBC: return dbx_odbc_getcolumntype(rv, result_handle, column_index, INTERNAL_FUNCTION_PARAM_PASSTHRU);
928
case DBX_PGSQL: return dbx_pgsql_getcolumntype(rv, result_handle, column_index, INTERNAL_FUNCTION_PARAM_PASSTHRU);
929
case DBX_MSSQL: return dbx_mssql_getcolumntype(rv, result_handle, column_index, INTERNAL_FUNCTION_PARAM_PASSTHRU);
930
case DBX_FBSQL: return dbx_fbsql_getcolumntype(rv, result_handle, column_index, INTERNAL_FUNCTION_PARAM_PASSTHRU);
931
case DBX_OCI8: return dbx_oci8_getcolumntype(rv, result_handle, column_index, INTERNAL_FUNCTION_PARAM_PASSTHRU);
932
case DBX_SYBASECT: return dbx_sybasect_getcolumntype(rv, result_handle, column_index, INTERNAL_FUNCTION_PARAM_PASSTHRU);
933
case DBX_SQLITE: return dbx_sqlite_getcolumntype(rv, result_handle, column_index, INTERNAL_FUNCTION_PARAM_PASSTHRU);
935
php_error_docref(NULL TSRMLS_CC, E_WARNING, "not supported in this module");
939
int switch_dbx_getrow(zval **rv, zval **result_handle, long row_number, INTERNAL_FUNCTION_PARAMETERS, zval **dbx_module)
941
/* returns array[0..columncount-1] as strings on success or 0 as long on failure */
942
switch (Z_LVAL_PP(dbx_module)) {
943
case DBX_MYSQL: return dbx_mysql_getrow(rv, result_handle, row_number, INTERNAL_FUNCTION_PARAM_PASSTHRU);
944
case DBX_ODBC: return dbx_odbc_getrow(rv, result_handle, row_number, INTERNAL_FUNCTION_PARAM_PASSTHRU);
945
case DBX_PGSQL: return dbx_pgsql_getrow(rv, result_handle, row_number, INTERNAL_FUNCTION_PARAM_PASSTHRU);
946
case DBX_MSSQL: return dbx_mssql_getrow(rv, result_handle, row_number, INTERNAL_FUNCTION_PARAM_PASSTHRU);
947
case DBX_FBSQL: return dbx_fbsql_getrow(rv, result_handle, row_number, INTERNAL_FUNCTION_PARAM_PASSTHRU);
948
case DBX_OCI8: return dbx_oci8_getrow(rv, result_handle, row_number, INTERNAL_FUNCTION_PARAM_PASSTHRU);
949
case DBX_SYBASECT: return dbx_sybasect_getrow(rv, result_handle, row_number, INTERNAL_FUNCTION_PARAM_PASSTHRU);
950
case DBX_SQLITE: return dbx_sqlite_getrow(rv, result_handle, row_number, INTERNAL_FUNCTION_PARAM_PASSTHRU);
952
php_error_docref(NULL TSRMLS_CC, E_WARNING, "not supported in this module");
956
int switch_dbx_error(zval **rv, zval **dbx_handle, INTERNAL_FUNCTION_PARAMETERS, zval **dbx_module)
959
switch (Z_LVAL_PP(dbx_module)) {
960
case DBX_MYSQL: return dbx_mysql_error(rv, dbx_handle, INTERNAL_FUNCTION_PARAM_PASSTHRU);
961
case DBX_ODBC: return dbx_odbc_error(rv, dbx_handle, INTERNAL_FUNCTION_PARAM_PASSTHRU);
962
case DBX_PGSQL: return dbx_pgsql_error(rv, dbx_handle, INTERNAL_FUNCTION_PARAM_PASSTHRU);
963
case DBX_MSSQL: return dbx_mssql_error(rv, dbx_handle, INTERNAL_FUNCTION_PARAM_PASSTHRU);
964
case DBX_FBSQL: return dbx_fbsql_error(rv, dbx_handle, INTERNAL_FUNCTION_PARAM_PASSTHRU);
965
/* case DBX_OCI8: return dbx_oci8_error(rv, dbx_handle, INTERNAL_FUNCTION_PARAM_PASSTHRU); */
966
case DBX_SYBASECT: return dbx_sybasect_error(rv, dbx_handle, INTERNAL_FUNCTION_PARAM_PASSTHRU);
967
case DBX_SQLITE: return dbx_sqlite_error(rv, dbx_handle, INTERNAL_FUNCTION_PARAM_PASSTHRU);
969
php_error_docref(NULL TSRMLS_CC, E_WARNING, "not supported in this module");
973
int switch_dbx_esc(zval **rv, zval **dbx_handle, zval **string, INTERNAL_FUNCTION_PARAMETERS, zval **dbx_module)
975
/* returns escaped string */
976
switch (Z_LVAL_PP(dbx_module)) {
977
case DBX_MYSQL: return dbx_mysql_esc(rv, dbx_handle, string, INTERNAL_FUNCTION_PARAM_PASSTHRU);
978
case DBX_ODBC: return dbx_odbc_esc(rv, dbx_handle, string, INTERNAL_FUNCTION_PARAM_PASSTHRU);
979
case DBX_PGSQL: return dbx_pgsql_esc(rv, dbx_handle, string, INTERNAL_FUNCTION_PARAM_PASSTHRU);
980
case DBX_MSSQL: return dbx_mssql_esc(rv, dbx_handle, string, INTERNAL_FUNCTION_PARAM_PASSTHRU);
981
case DBX_FBSQL: return dbx_fbsql_esc(rv, dbx_handle, string, INTERNAL_FUNCTION_PARAM_PASSTHRU);
982
case DBX_OCI8: return dbx_oci8_esc(rv, dbx_handle, string, INTERNAL_FUNCTION_PARAM_PASSTHRU);
983
case DBX_SYBASECT: return dbx_sybasect_esc(rv, dbx_handle, string, INTERNAL_FUNCTION_PARAM_PASSTHRU);
984
case DBX_SQLITE: return dbx_sqlite_esc(rv, dbx_handle, string, INTERNAL_FUNCTION_PARAM_PASSTHRU);
986
php_error_docref(NULL TSRMLS_CC, E_WARNING, "not supported in this module");