summaryrefslogtreecommitdiff
path: root/ext/sybase_ct
diff options
context:
space:
mode:
authorTimm Friebe <thekid@php.net>2008-06-24 16:33:17 +0000
committerTimm Friebe <thekid@php.net>2008-06-24 16:33:17 +0000
commit4a58de4c5cc4452fb8fd37d547035cee31318d01 (patch)
treef396c63f2fde99639cd8792cac5596ad91e62c13 /ext/sybase_ct
parent7939a8347e9aafb500becc78b52e4c8eeea70c80 (diff)
downloadphp-git-4a58de4c5cc4452fb8fd37d547035cee31318d01.tar.gz
- Migrated all zend_get_parameters_ex calls to zend_parse_parameters()
- Fixed prototype declarations to use the type resource instead of int - Fixed sybase_close() not to crash when no connection was previously open
Diffstat (limited to 'ext/sybase_ct')
-rw-r--r--ext/sybase_ct/php_sybase_ct.c589
1 files changed, 258 insertions, 331 deletions
diff --git a/ext/sybase_ct/php_sybase_ct.c b/ext/sybase_ct/php_sybase_ct.c
index 1e38da1076..181852448a 100644
--- a/ext/sybase_ct/php_sybase_ct.c
+++ b/ext/sybase_ct/php_sybase_ct.c
@@ -204,7 +204,6 @@ static void _close_sybase_link(zend_rsrc_list_entry *rsrc TSRMLS_DC)
zval_ptr_dtor(&sybase_ptr->callback_name);
sybase_ptr->callback_name= NULL;
}
-
zend_hash_apply(&EG(regular_list), (apply_func_t) _clean_invalid_results TSRMLS_CC);
/* Non-persistent connections will always be connected or we wouldn't
@@ -285,47 +284,55 @@ static CS_RETCODE CS_PUBLIC _client_message_handler(CS_CONTEXT *context, CS_CONN
static int _call_message_handler(zval *callback_name, CS_SERVERMSG *srvmsg TSRMLS_DC)
{
int handled = 0;
+ zval *msgnumber, *severity, *state, *line, *text, *retval = NULL;
+ zval **args[5];
- if (callback_name) {
- zval *msgnumber, *severity, *state, *line, *text, *retval = NULL;
- zval **args[5];
+ /* Border case - empty fcall */
+ if (NULL == callback_name) return 0;
- MAKE_STD_ZVAL(msgnumber);
- ZVAL_LONG(msgnumber, srvmsg->msgnumber);
- args[0] = &msgnumber;
+ /* Build arguments */
+ MAKE_STD_ZVAL(msgnumber);
+ ZVAL_LONG(msgnumber, srvmsg->msgnumber);
+ args[0] = &msgnumber;
- MAKE_STD_ZVAL(severity);
- ZVAL_LONG(severity, srvmsg->severity);
- args[1] = &severity;
+ MAKE_STD_ZVAL(severity);
+ ZVAL_LONG(severity, srvmsg->severity);
+ args[1] = &severity;
- MAKE_STD_ZVAL(state);
- ZVAL_LONG(state, srvmsg->state);
- args[2] = &state;
+ MAKE_STD_ZVAL(state);
+ ZVAL_LONG(state, srvmsg->state);
+ args[2] = &state;
- MAKE_STD_ZVAL(line);
- ZVAL_LONG(line, srvmsg->line);
- args[3] = &line;
+ MAKE_STD_ZVAL(line);
+ ZVAL_LONG(line, srvmsg->line);
+ args[3] = &line;
- MAKE_STD_ZVAL(text);
- ZVAL_STRING(text, srvmsg->text, 1);
- args[4] = &text;
-
- if (call_user_function_ex(EG(function_table), NULL, callback_name, &retval, 5, args, 0, NULL TSRMLS_CC) == FAILURE) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase: Cannot call the messagehandler %s", Z_STRVAL_P(callback_name));
- }
+ MAKE_STD_ZVAL(text);
+ ZVAL_STRING(text, srvmsg->text, 1);
+ args[4] = &text;
- if (retval) {
- handled= ((Z_TYPE_P(retval) != IS_BOOL) || (Z_BVAL_P(retval) != 0));
- zval_ptr_dtor(&retval);
- }
+ if (call_user_function_ex(EG(function_table), NULL, callback_name, &retval, 5, args, 0, NULL TSRMLS_CC) == FAILURE) {
+ zval expr_copy;
+ int use_copy;
+
+ zend_make_printable_zval(callback_name, &expr_copy, &use_copy);
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase: Cannot call the messagehandler %s", Z_STRVAL(expr_copy));
+ zval_dtor(&expr_copy);
+ }
- zval_ptr_dtor(&msgnumber);
- zval_ptr_dtor(&severity);
- zval_ptr_dtor(&state);
- zval_ptr_dtor(&line);
- zval_ptr_dtor(&text);
+ if (retval) {
+ handled = ((Z_TYPE_P(retval) != IS_BOOL) || (Z_BVAL_P(retval) != 0));
+ zval_ptr_dtor(&retval);
+ } else {
+ handled = 0;
}
+ zval_ptr_dtor(&msgnumber);
+ zval_ptr_dtor(&severity);
+ zval_ptr_dtor(&state);
+ zval_ptr_dtor(&line);
+ zval_ptr_dtor(&text);
+
return handled;
}
@@ -600,7 +607,7 @@ static void php_sybase_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
int len;
sybase_link *sybase_ptr;
- host= user= passwd= charset= appname= NULL;
+ host= user= passwd= charset= appname= NULL;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|sssss", &host, &len, &user, &len, &passwd, &len, &charset, &len, &appname, &len) == FAILURE) {
return;
}
@@ -790,38 +797,40 @@ PHP_FUNCTION(sybase_pconnect)
/* }}} */
+inline static int php_sybase_connection_id(zval *sybase_link_index, int *id TSRMLS_DC)
+{
+ if (NULL == sybase_link_index) {
+ if (-1 == SybCtG(default_link)) {
+ return FAILURE;
+ }
+ *id = SybCtG(default_link);
+ } else {
+ *id = -1; /* explicit resource number */
+ }
+ return SUCCESS;
+}
-/* {{{ proto bool sybase_close([int link_id])
+/* {{{ proto bool sybase_close([resource link_id])
Close Sybase connection */
PHP_FUNCTION(sybase_close)
{
- zval **sybase_link_index = 0;
- int id;
+ zval *sybase_link_index = NULL;
sybase_link *sybase_ptr;
+ int id;
- switch (ZEND_NUM_ARGS()) {
- case 0:
- id = SybCtG(default_link);
- break;
- case 1:
- if (zend_get_parameters_ex(1, &sybase_link_index) == FAILURE) {
- RETURN_FALSE;
- }
- id = -1;
- break;
- default:
- WRONG_PARAM_COUNT;
- break;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &sybase_link_index) == FAILURE) {
+ return;
}
- ZEND_FETCH_RESOURCE2(sybase_ptr, sybase_link *, sybase_link_index, id, "Sybase-Link", le_link, le_plink);
-
- if (id == -1) { /* explicit resource number */
- zend_list_delete(Z_RESVAL_PP(sybase_link_index));
+ if (php_sybase_connection_id(sybase_link_index, &id TSRMLS_CC) == FAILURE) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase: No connection to close");
+ RETURN_FALSE;
}
- if (id != -1 || (sybase_link_index && Z_RESVAL_PP(sybase_link_index)==SybCtG(default_link))) {
- zend_list_delete(SybCtG(default_link));
+ ZEND_FETCH_RESOURCE2(sybase_ptr, sybase_link *, &sybase_link_index, id, "Sybase-Link", le_link, le_plink);
+
+ zend_list_delete(Z_RESVAL_P(sybase_link_index));
+ if (Z_RESVAL_P(sybase_link_index) == SybCtG(default_link)) {
SybCtG(default_link) = -1;
}
@@ -906,40 +915,28 @@ static int exec_cmd(sybase_link *sybase_ptr, char *cmdbuf)
}
-/* {{{ proto bool sybase_select_db(string database [, int link_id])
+/* {{{ proto bool sybase_select_db(string database [, resource link_id])
Select Sybase database */
PHP_FUNCTION(sybase_select_db)
{
- zval **db, **sybase_link_index;
- int id;
- char *cmdbuf;
- sybase_link *sybase_ptr;
+ zval *sybase_link_index = NULL;
+ char *db, *cmdbuf;
+ int id, len;
+ sybase_link *sybase_ptr;
- switch(ZEND_NUM_ARGS()) {
- case 1:
- if (zend_get_parameters_ex(1, &db) == FAILURE) {
- RETURN_FALSE;
- }
- id = php_sybase_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
- CHECK_LINK(id);
- break;
- case 2:
- if (zend_get_parameters_ex(2, &db, &sybase_link_index) == FAILURE) {
- RETURN_FALSE;
- }
- id = -1;
- break;
- default:
- WRONG_PARAM_COUNT;
- break;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|r", &db, &len, &sybase_link_index) == FAILURE) {
+ return;
}
- ZEND_FETCH_RESOURCE2(sybase_ptr, sybase_link *, sybase_link_index, id, "Sybase-Link", le_link, le_plink);
+ if (php_sybase_connection_id(sybase_link_index, &id TSRMLS_CC) == FAILURE) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase: No connection");
+ RETURN_FALSE;
+ }
- convert_to_string_ex(db);
- spprintf(&cmdbuf, 0, "use %s", Z_STRVAL_PP(db)); /* SAFE */
+ ZEND_FETCH_RESOURCE2(sybase_ptr, sybase_link *, &sybase_link_index, id, "Sybase-Link", le_link, le_plink);
- if (exec_cmd(sybase_ptr, cmdbuf)==FAILURE) {
+ spprintf(&cmdbuf, 4 + len + 1, "use %s", db);
+ if (exec_cmd(sybase_ptr, cmdbuf) == FAILURE) {
efree(cmdbuf);
RETURN_FALSE;
} else {
@@ -1119,7 +1116,7 @@ static int php_sybase_fetch_result_row (sybase_result *result, int numrows)
/* This indicates anything else, return it as string */
ZVAL_STRINGL(&result->data[i][j], result->tmp_buffer[j], result->lengths[j]- 1, 1);
break;
- }
+ }
}
}
}
@@ -1280,9 +1277,10 @@ static sybase_result * php_sybase_fetch_result_set (sybase_link *sybase_ptr, int
static void php_sybase_query (INTERNAL_FUNCTION_PARAMETERS, int buffered)
{
- zval **query, **sybase_link_index=NULL;
- zval **store_mode= NULL;
- int id, deadlock_count, store;
+ zval *sybase_link_index = NULL;
+ zend_bool store = 1;
+ char *query;
+ int len, id, deadlock_count;
sybase_link *sybase_ptr;
sybase_result *result;
CS_INT restype;
@@ -1293,41 +1291,21 @@ static void php_sybase_query (INTERNAL_FUNCTION_PARAMETERS, int buffered)
Q_FAILURE, /* Failure, no results. */
} status;
- store= 1;
- switch(ZEND_NUM_ARGS()) {
- case 1:
- if (zend_get_parameters_ex(1, &query)==FAILURE) {
- RETURN_FALSE;
- }
- id = SybCtG(default_link);
- break;
- case 2:
- if (zend_get_parameters_ex(2, &query, &sybase_link_index)==FAILURE) {
- RETURN_FALSE;
- }
- id = -1;
- break;
- case 3:
- if (zend_get_parameters_ex(3, &query, &sybase_link_index, &store_mode)==FAILURE) {
- RETURN_FALSE;
- }
- if (!buffered) {
- php_error_docref(NULL TSRMLS_CC, E_NOTICE, "cannot use non-storing mode with buffered queries");
- store = 1;
- } else {
- convert_to_long_ex(store_mode);
- store= (Z_LVAL_PP(store_mode) != 0);
- }
- id = -1;
- break;
- default:
- WRONG_PARAM_COUNT;
- break;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|rb", &query, &len, &sybase_link_index, &store) == FAILURE) {
+ return;
}
- ZEND_FETCH_RESOURCE2(sybase_ptr, sybase_link *, sybase_link_index, id, "Sybase-Link", le_link, le_plink);
+ if (!store && !buffered) {
+ php_error_docref(NULL TSRMLS_CC, E_NOTICE, "cannot use non-storing mode with buffered queries");
+ store = 1;
+ }
- convert_to_string_ex(query);
+ if (php_sybase_connection_id(sybase_link_index, &id TSRMLS_CC) == FAILURE) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase: No connection to close");
+ RETURN_FALSE;
+ }
+
+ ZEND_FETCH_RESOURCE2(sybase_ptr, sybase_link *, &sybase_link_index, id, "Sybase-Link", le_link, le_plink);
/* Fail if we already marked this connection dead. */
if (sybase_ptr->dead) {
@@ -1377,7 +1355,7 @@ static void php_sybase_query (INTERNAL_FUNCTION_PARAMETERS, int buffered)
/* On Solaris 11.5, ct_command() can be moved outside the
* loop, but not on Linux 11.0.
*/
- if (ct_command(sybase_ptr->cmd, CS_LANG_CMD, Z_STRVAL_PP(query), CS_NULLTERM, CS_UNUSED)!=CS_SUCCEED) {
+ if (ct_command(sybase_ptr->cmd, CS_LANG_CMD, query, CS_NULLTERM, CS_UNUSED)!=CS_SUCCEED) {
/* If this didn't work, the connection is screwed but
* ct-lib might not set CS_CONSTAT_DEAD. So set our own
* flag. This happens sometimes when the database is restarted
@@ -1557,7 +1535,7 @@ static void php_sybase_query (INTERNAL_FUNCTION_PARAMETERS, int buffered)
sybase_ptr->active_result_index= buffered ? id : 0;
}
-/* {{{ proto int sybase_query(string query [, int link_id])
+/* {{{ proto int sybase_query(string query [, resource link_id])
Send Sybase query */
PHP_FUNCTION(sybase_query)
{
@@ -1565,29 +1543,24 @@ PHP_FUNCTION(sybase_query)
}
/* }}} */
-/* {{{ proto int sybase_unbuffered_query(string query [, int link_id])
+/* {{{ proto int sybase_unbuffered_query(string query [, resource link_id])
Send Sybase query */
PHP_FUNCTION(sybase_unbuffered_query)
{
php_sybase_query(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
}
-/* {{{ proto bool sybase_free_result(int result)
+/* {{{ proto bool sybase_free_result(resource result)
Free result memory */
PHP_FUNCTION(sybase_free_result)
{
- zval **sybase_result_index;
+ zval *sybase_result_index = NULL;
sybase_result *result;
- if (ZEND_NUM_ARGS() !=1 || zend_get_parameters_ex(1, &sybase_result_index) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
-
- if (Z_TYPE_PP(sybase_result_index) == IS_RESOURCE && Z_LVAL_PP(sybase_result_index) == 0) {
- RETURN_FALSE;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &sybase_result_index) == FAILURE) {
+ return;
}
-
- ZEND_FETCH_RESOURCE(result, sybase_result *, sybase_result_index, -1, "Sybase result", le_result);
+ ZEND_FETCH_RESOURCE(result, sybase_result *, &sybase_result_index, -1, "Sybase result", le_result);
/* Did we fetch up until the end? */
if (result->last_retcode != CS_END_DATA && result->last_retcode != CS_END_RESULTS) {
@@ -1596,7 +1569,7 @@ PHP_FUNCTION(sybase_free_result)
php_sybase_finish_results(result TSRMLS_CC);
}
- zend_list_delete(Z_LVAL_PP(sybase_result_index));
+ zend_list_delete(Z_LVAL_P(sybase_result_index));
RETURN_TRUE;
}
@@ -1610,18 +1583,17 @@ PHP_FUNCTION(sybase_get_last_message)
}
/* }}} */
-/* {{{ proto int sybase_num_rows(int result)
+/* {{{ proto int sybase_num_rows(resource result)
Get number of rows in result */
PHP_FUNCTION(sybase_num_rows)
{
- zval **sybase_result_index;
+ zval *sybase_result_index = NULL;
sybase_result *result;
- if (ZEND_NUM_ARGS() !=1 || zend_get_parameters_ex(1, &sybase_result_index) == FAILURE) {
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &sybase_result_index) == FAILURE) {
+ return;
}
-
- ZEND_FETCH_RESOURCE(result, sybase_result *, sybase_result_index, -1, "Sybase result", le_result);
+ ZEND_FETCH_RESOURCE(result, sybase_result *, &sybase_result_index, -1, "Sybase result", le_result);
Z_LVAL_P(return_value) = result->num_rows;
Z_TYPE_P(return_value) = IS_LONG;
@@ -1629,18 +1601,17 @@ PHP_FUNCTION(sybase_num_rows)
/* }}} */
-/* {{{ proto int sybase_num_fields(int result)
+/* {{{ proto int sybase_num_fields(resource result)
Get number of fields in result */
PHP_FUNCTION(sybase_num_fields)
{
- zval **sybase_result_index;
+ zval *sybase_result_index = NULL;
sybase_result *result;
- if (ZEND_NUM_ARGS() !=1 || zend_get_parameters_ex(1, &sybase_result_index) == FAILURE) {
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &sybase_result_index) == FAILURE) {
+ return;
}
-
- ZEND_FETCH_RESOURCE(result, sybase_result *, sybase_result_index, -1, "Sybase result", le_result);
+ ZEND_FETCH_RESOURCE(result, sybase_result *, &sybase_result_index, -1, "Sybase result", le_result);
Z_LVAL_P(return_value) = result->num_fields;
Z_TYPE_P(return_value) = IS_LONG;
@@ -1648,20 +1619,19 @@ PHP_FUNCTION(sybase_num_fields)
/* }}} */
-/* {{{ proto array sybase_fetch_row(int result)
+/* {{{ proto array sybase_fetch_row(resource result)
Get row as enumerated array */
PHP_FUNCTION(sybase_fetch_row)
{
- zval **sybase_result_index;
+ zval *sybase_result_index = NULL;
int i;
sybase_result *result;
zval *field_content;
- if (ZEND_NUM_ARGS() !=1 || zend_get_parameters_ex(1, &sybase_result_index) == FAILURE) {
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &sybase_result_index) == FAILURE) {
+ return;
}
-
- ZEND_FETCH_RESOURCE(result, sybase_result *, sybase_result_index, -1, "Sybase result", le_result);
+ ZEND_FETCH_RESOURCE(result, sybase_result *, &sybase_result_index, -1, "Sybase result", le_result);
/* Unbuffered? */
if (result->last_retcode != CS_END_DATA && result->last_retcode != CS_END_RESULTS) {
@@ -1688,17 +1658,16 @@ PHP_FUNCTION(sybase_fetch_row)
static void php_sybase_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, int numerics)
{
- zval **sybase_result_index;
+ zval *sybase_result_index = NULL;
sybase_result *result;
int i, j;
zval *tmp;
char name[32];
- if (ZEND_NUM_ARGS() !=1 || zend_get_parameters_ex(1, &sybase_result_index) == FAILURE) {
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &sybase_result_index) == FAILURE) {
+ return;
}
-
- ZEND_FETCH_RESOURCE(result, sybase_result *, sybase_result_index, -1, "Sybase result", le_result);
+ ZEND_FETCH_RESOURCE(result, sybase_result *, &sybase_result_index, -1, "Sybase result", le_result);
/* Unbuffered ? Fetch next row */
if (result->last_retcode != CS_END_DATA && result->last_retcode != CS_END_RESULTS) {
@@ -1738,54 +1707,58 @@ static void php_sybase_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, int numerics)
}
-/* {{{ proto object sybase_fetch_object(int result [, mixed object])
+/* {{{ proto object sybase_fetch_object(resource result [, mixed object])
Fetch row as object */
PHP_FUNCTION(sybase_fetch_object)
{
- zval **object= NULL;
- zval *sybase_result_index;
- zend_class_entry *ce= NULL;
+ zval *object = NULL;
+ zval *sybase_result_index = NULL;
+ zend_class_entry *ce = NULL;
+ sybase_result *result;
/* Was a second parameter given? */
- if (2 == ZEND_NUM_ARGS()) {
- if (zend_get_parameters_ex(2, &sybase_result_index, &object) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
-
- switch (Z_TYPE_PP(object)) {
- case IS_OBJECT:
- ce = Z_OBJCE_PP(object);
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|z", &sybase_result_index, &object) == FAILURE) {
+ return;
+ }
+ ZEND_FETCH_RESOURCE(result, sybase_result *, &sybase_result_index, -1, "Sybase result", le_result);
+
+ ce = ZEND_STANDARD_CLASS_DEF_PTR;
+ if (NULL != object) {
+ switch (Z_TYPE_P(object)) {
+ case IS_OBJECT: {
+ ce = Z_OBJCE_P(object);
break;
- case IS_NULL:
+ }
+
+ case IS_NULL: {
+ /* Use default (ZEND_STANDARD_CLASS_DEF_PTR) */
break;
+ }
+
default: {
zend_class_entry **pce = NULL;
+ convert_to_string(object);
- convert_to_string_ex(object);
- if (zend_lookup_class(Z_STRVAL_PP(object), Z_STRLEN_PP(object), &pce TSRMLS_CC) == FAILURE) {
- php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Sybase: Class %s has not been declared", Z_STRVAL_PP(object));
+ if (zend_lookup_class(Z_STRVAL_P(object), Z_STRLEN_P(object), &pce TSRMLS_CC) == FAILURE) {
+ php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Sybase: Class %s has not been declared", Z_STRVAL_P(object));
+ /* Use default (ZEND_STANDARD_CLASS_DEF_PTR) */
} else {
ce = *pce;
}
}
}
-
- /* Reset no. of arguments to 1 so that we can use INTERNAL_FUNCTION_PARAM_PASSTHRU */
- ht= 1;
}
-
+
+ /* Reset no. of arguments to 1 so that we can use INTERNAL_FUNCTION_PARAM_PASSTHRU */
+ ht= 1;
php_sybase_fetch_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
- if (Z_TYPE_P(return_value)==IS_ARRAY) {
- object_and_properties_init(
- return_value,
- ce ? ce : ZEND_STANDARD_CLASS_DEF_PTR,
- Z_ARRVAL_P(return_value)
- );
+ if (Z_TYPE_P(return_value) == IS_ARRAY) {
+ object_and_properties_init(return_value, ce, Z_ARRVAL_P(return_value));
}
}
/* }}} */
-/* {{{ proto array sybase_fetch_array(int result)
+/* {{{ proto array sybase_fetch_array(resource result)
Fetch row as array */
PHP_FUNCTION(sybase_fetch_array)
{
@@ -1793,7 +1766,7 @@ PHP_FUNCTION(sybase_fetch_array)
}
/* }}} */
-/* {{{ proto array sybase_fetch_assoc(int result)
+/* {{{ proto array sybase_fetch_assoc(resource result)
Fetch row as array without numberic indices */
PHP_FUNCTION(sybase_fetch_assoc)
{
@@ -1801,33 +1774,30 @@ PHP_FUNCTION(sybase_fetch_assoc)
}
/* }}} */
-/* {{{ proto bool sybase_data_seek(int result, int offset)
+/* {{{ proto bool sybase_data_seek(resource result, int offset)
Move internal row pointer */
PHP_FUNCTION(sybase_data_seek)
{
- zval **sybase_result_index, **offset;
+ zval *sybase_result_index = NULL;
+ long offset;
sybase_result *result;
- if (ZEND_NUM_ARGS()!=2 || zend_get_parameters_ex(2, &sybase_result_index, &offset)==FAILURE) {
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &sybase_result_index, &offset) == FAILURE) {
+ return;
}
-
-
- ZEND_FETCH_RESOURCE(result, sybase_result *, sybase_result_index, -1, "Sybase result", le_result);
-
- convert_to_long_ex(offset);
+ ZEND_FETCH_RESOURCE(result, sybase_result *, &sybase_result_index, -1, "Sybase result", le_result);
/* Unbuffered ? */
- if (result->last_retcode != CS_END_DATA && result->last_retcode != CS_END_RESULTS && Z_LVAL_PP(offset)>=result->num_rows) {
- php_sybase_fetch_result_row(result, Z_LVAL_PP(offset)+ 1);
+ if (result->last_retcode != CS_END_DATA && result->last_retcode != CS_END_RESULTS && offset >= result->num_rows) {
+ php_sybase_fetch_result_row(result, offset+ 1);
}
- if (Z_LVAL_PP(offset)<0 || Z_LVAL_PP(offset)>=result->num_rows) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase: Bad row offset %ld, must be betweem 0 and %d", Z_LVAL_PP(offset), result->num_rows - 1);
+ if (offset < 0 || offset >= result->num_rows) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase: Bad row offset %ld, must be betweem 0 and %d", offset, result->num_rows - 1);
RETURN_FALSE;
}
- result->cur_row = Z_LVAL_PP(offset);
+ result->cur_row = offset;
RETURN_TRUE;
}
/* }}} */
@@ -1876,42 +1846,26 @@ static char *php_sybase_get_field_name(CS_INT type)
}
-/* {{{ proto object sybase_fetch_field(int result [, int offset])
+/* {{{ proto object sybase_fetch_field(resource result [, int offset])
Get field information */
PHP_FUNCTION(sybase_fetch_field)
{
- zval **sybase_result_index, **offset;
- int field_offset;
+ zval *sybase_result_index = NULL;
+ long field_offset = -1;
sybase_result *result;
- switch (ZEND_NUM_ARGS()) {
- case 1:
- if (zend_get_parameters_ex(1, &sybase_result_index) == FAILURE) {
- RETURN_FALSE;
- }
- field_offset=-1;
- break;
- case 2:
- if (zend_get_parameters_ex(2, &sybase_result_index, &offset) == FAILURE) {
- RETURN_FALSE;
- }
- convert_to_long_ex(offset);
- field_offset = Z_LVAL_PP(offset);
- break;
- default:
- WRONG_PARAM_COUNT;
- break;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|l", &sybase_result_index, &field_offset) == FAILURE) {
+ return;
}
+ ZEND_FETCH_RESOURCE(result, sybase_result *, &sybase_result_index, -1, "Sybase result", le_result);
- ZEND_FETCH_RESOURCE(result, sybase_result *, sybase_result_index, -1, "Sybase result", le_result);
-
- if (field_offset==-1) {
+ if (field_offset == -1) {
field_offset = result->cur_field;
result->cur_field++;
}
- if (field_offset<0 || field_offset >= result->num_fields) {
- if (ZEND_NUM_ARGS()==2) { /* field specified explicitly */
+ if (field_offset < 0 || field_offset >= result->num_fields) {
+ if (ZEND_NUM_ARGS() == 2) { /* field specified explicitly */
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase: Bad column offset");
}
RETURN_FALSE;
@@ -1928,24 +1882,20 @@ PHP_FUNCTION(sybase_fetch_field)
/* }}} */
-/* {{{ proto bool sybase_field_seek(int result, int offset)
+/* {{{ proto bool sybase_field_seek(resource result, int offset)
Set field offset */
PHP_FUNCTION(sybase_field_seek)
{
- zval **sybase_result_index, **offset;
- int field_offset;
+ zval *sybase_result_index = NULL;
+ long field_offset;
sybase_result *result;
- if (ZEND_NUM_ARGS() !=2 || zend_get_parameters_ex(2, &sybase_result_index, &offset) == FAILURE) {
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &sybase_result_index, &field_offset) == FAILURE) {
+ return;
}
+ ZEND_FETCH_RESOURCE(result, sybase_result *, &sybase_result_index, -1, "Sybase result", le_result);
- ZEND_FETCH_RESOURCE(result, sybase_result *, sybase_result_index, -1, "Sybase result", le_result);
-
- convert_to_long_ex(offset);
- field_offset = Z_LVAL_PP(offset);
-
- if (field_offset<0 || field_offset >= result->num_fields) {
+ if (field_offset < 0 || field_offset >= result->num_fields) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase: Bad column offset");
RETURN_FALSE;
}
@@ -1956,89 +1906,81 @@ PHP_FUNCTION(sybase_field_seek)
/* }}} */
-/* {{{ proto string sybase_result(int result, int row, mixed field)
+/* {{{ proto string sybase_result(resource result, int row, mixed field)
Get result data */
PHP_FUNCTION(sybase_result)
{
- zval **row, **field, **sybase_result_index;
- int field_offset=0;
+ zval *field;
+ zval *sybase_result_index = NULL;
+ long row;
+ int field_offset = 0;
sybase_result *result;
- if (ZEND_NUM_ARGS() !=3 || zend_get_parameters_ex(3, &sybase_result_index, &row, &field)==FAILURE) {
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlz", &sybase_result_index, &row, &field) == FAILURE) {
+ return;
}
-
-
- ZEND_FETCH_RESOURCE(result, sybase_result *, sybase_result_index, -1, "Sybase result", le_result);
-
- convert_to_long_ex(row);
+ ZEND_FETCH_RESOURCE(result, sybase_result *, &sybase_result_index, -1, "Sybase result", le_result);
/* Unbuffered ? */
- if (result->last_retcode != CS_END_DATA && result->last_retcode != CS_END_RESULTS && Z_LVAL_PP(row) >= result->num_rows) {
- php_sybase_fetch_result_row(result, Z_LVAL_PP(row));
+ if (result->last_retcode != CS_END_DATA && result->last_retcode != CS_END_RESULTS && row >= result->num_rows) {
+ php_sybase_fetch_result_row(result, row);
}
- if (Z_LVAL_PP(row) < 0 || Z_LVAL_PP(row) >= result->num_rows) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase: Bad row offset (%ld)", Z_LVAL_PP(row));
+ if (row < 0 || row >= result->num_rows) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase: Bad row offset (%ld)", row);
RETURN_FALSE;
}
- switch(Z_TYPE_PP(field)) {
+ switch(Z_TYPE_P(field)) {
case IS_STRING: {
int i;
- for (i=0; i<result->num_fields; i++) {
- if (!strcasecmp(result->fields[i].name, Z_STRVAL_PP(field))) {
+ for (i = 0; i < result->num_fields; i++) {
+ if (strcasecmp(result->fields[i].name, Z_STRVAL_P(field)) == 0) {
field_offset = i;
break;
}
}
- if (i>=result->num_fields) { /* no match found */
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase: %s field not found in result", Z_STRVAL_PP(field));
+ if (i >= result->num_fields) { /* no match found */
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase: %s field not found in result", Z_STRVAL_P(field));
RETURN_FALSE;
}
break;
}
default:
- convert_to_long_ex(field);
- field_offset = Z_LVAL_PP(field);
- if (field_offset<0 || field_offset>=result->num_fields) {
+ convert_to_long(field);
+ field_offset = Z_LVAL_P(field);
+ if (field_offset < 0 || field_offset >= result->num_fields) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase: Bad column offset specified");
RETURN_FALSE;
}
break;
}
- *return_value = result->data[Z_LVAL_PP(row)][field_offset];
+ *return_value = result->data[row][field_offset];
zval_copy_ctor(return_value);
}
/* }}} */
-/* {{{ proto int sybase_affected_rows([int link_id])
+/* {{{ proto int sybase_affected_rows([resource link_id])
Get number of affected rows in last query */
PHP_FUNCTION(sybase_affected_rows)
{
- zval **sybase_link_index;
+ zval *sybase_link_index = NULL;
sybase_link *sybase_ptr;
int id;
- switch(ZEND_NUM_ARGS()) {
- case 0:
- id = php_sybase_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
- break;
- case 1:
- if (zend_get_parameters_ex(1, &sybase_link_index) == FAILURE) {
- RETURN_FALSE;
- }
- id = -1;
- break;
- default:
- WRONG_PARAM_COUNT;
- break;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &sybase_link_index) == FAILURE) {
+ return;
+ }
+
+ if (php_sybase_connection_id(sybase_link_index, &id TSRMLS_CC) == FAILURE) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase: No connection");
+ RETURN_FALSE;
}
- ZEND_FETCH_RESOURCE2(sybase_ptr, sybase_link *, sybase_link_index, id, "Sybase-Link", le_link, le_plink);
+ ZEND_FETCH_RESOURCE2(sybase_ptr, sybase_link *, &sybase_link_index, id, "Sybase-Link", le_link, le_plink);
Z_LVAL_P(return_value) = sybase_ptr->affected_rows;
Z_TYPE_P(return_value) = IS_LONG;
@@ -2073,13 +2015,13 @@ PHP_MINFO_FUNCTION(sybase)
Sets minimum client severity */
PHP_FUNCTION(sybase_min_client_severity)
{
- zval **severity;
+ long severity;
- if (ZEND_NUM_ARGS() !=1 || zend_get_parameters_ex(1, &severity) == FAILURE) {
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &severity) == FAILURE) {
+ return;
}
- convert_to_long_ex(severity);
- SybCtG(min_client_severity) = Z_LVAL_PP(severity);
+
+ SybCtG(min_client_severity) = severity;
}
/* }}} */
@@ -2088,13 +2030,13 @@ PHP_FUNCTION(sybase_min_client_severity)
Sets minimum server severity */
PHP_FUNCTION(sybase_min_server_severity)
{
- zval **severity;
+ long severity;
- if (ZEND_NUM_ARGS() !=1 || zend_get_parameters_ex(1, &severity) == FAILURE) {
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &severity) == FAILURE) {
+ return;
}
- convert_to_long_ex(severity);
- SybCtG(min_server_severity) = Z_LVAL_PP(severity);
+
+ SybCtG(min_server_severity) = severity;
}
/* }}} */
@@ -2102,13 +2044,13 @@ PHP_FUNCTION(sybase_min_server_severity)
Sets deadlock retry count */
PHP_FUNCTION(sybase_deadlock_retry_count)
{
- zval **retry_count;
+ long retry_count;
- if (ZEND_NUM_ARGS() !=1 || zend_get_parameters_ex(1, &retry_count) == FAILURE) {
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &retry_count) == FAILURE) {
+ return;
}
- convert_to_long_ex(retry_count);
- SybCtG(deadlock_retry_count) = Z_LVAL_PP(retry_count);
+
+ SybCtG(deadlock_retry_count) = retry_count;
}
/* }}} */
@@ -2118,62 +2060,47 @@ PHP_FUNCTION(sybase_deadlock_retry_count)
If error_func is NULL the handler will be deleted */
PHP_FUNCTION(sybase_set_message_handler)
{
- zval **callback, **param, **sybase_link_index= NULL;
- char *name;
+ zend_fcall_info fci = empty_fcall_info;
+ zend_fcall_info_cache cache = empty_fcall_info_cache;
+ zval *sybase_link_index= NULL;
sybase_link *sybase_ptr;
+ zval **callback;
+ int id;
- switch (ZEND_NUM_ARGS()) {
- case 1: /* Default message handler */
- if (zend_get_parameters_ex(1, &param) == FAILURE) {
- RETURN_FALSE;
- }
- callback = &SybCtG(callback_name);
- break;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "f!|r", &fci, &cache, &sybase_link_index) == FAILURE) {
+ return;
+ }
- case 2: /* Connection-based message handler */
- if (zend_get_parameters_ex(2, &param, &sybase_link_index) == FAILURE) {
- RETURN_FALSE;
- }
- ZEND_FETCH_RESOURCE2(sybase_ptr, sybase_link *, sybase_link_index, -1, "Sybase-Link", le_link, le_plink);
- callback = &sybase_ptr->callback_name;
- break;
+ if (php_sybase_connection_id(sybase_link_index, &id TSRMLS_CC) == FAILURE) {
- default:
- WRONG_PARAM_COUNT;
+ /* Doesn't matter if we're not connected yet, use default */
+ callback= &SybCtG(callback_name);
+ } else if (-1 == id) {
+
+ /* Connection-based message handler */
+ ZEND_FETCH_RESOURCE2(sybase_ptr, sybase_link *, &sybase_link_index, id, "Sybase-Link", le_link, le_plink);
+ callback= &sybase_ptr->callback_name;
+ } else {
+
+ /* Default message handler */
+ callback= &SybCtG(callback_name);
}
-
- /* Clean out old callback */
+
+ /* Clean old callback */
if (*callback) {
zval_ptr_dtor(callback);
*callback = NULL;
}
- switch (Z_TYPE_PP(param)) {
- case IS_NULL:
- /* Return TRUE to indicate we deleted the message handler */
- RETURN_TRUE;
- break;
-
- case IS_ARRAY:
- case IS_STRING:
- /* Either "function", array("class", "function") or array($object, "function") */
- if (!zend_is_callable(*param, 0, &name)) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "First argumented is expected to be a valid callback, '%s' was given", name);
- efree(name);
- RETURN_FALSE;
- }
- efree(name);
- break;
-
- default:
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "First argumented is expected to be either NULL, an array or string, %s given", zend_zval_type_name(*param));
- RETURN_FALSE;
+ if (ZEND_FCI_INITIALIZED(fci)) {
+ ALLOC_ZVAL(*callback);
+ **callback = *fci.function_name;
+ INIT_PZVAL(*callback);
+ zval_copy_ctor(*callback);
+ } else {
+ callback= NULL;
}
-
- ALLOC_ZVAL(*callback);
- **callback = **param;
- INIT_PZVAL(*callback);
- zval_copy_ctor(*callback);
+
RETURN_TRUE;
}
/* }}} */