Browse Source

- 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
PECL
Timm Friebe 18 years ago
parent
commit
4a58de4c5c
  1. 589
      ext/sybase_ct/php_sybase_ct.c

589
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;
}
/* }}} */

Loading…
Cancel
Save