thekid          Mon Nov 10 11:49:06 2008 UTC

  Modified files:              
    /php-src/ext/sybase_ct      php_sybase_ct.c 
  Log:
  - MFB: Added optional parameter "new" to sybase_connect()
  - MFB: Fixed crash in sybase_unbuffered_query()
  - MFB: Migrated to new parameter parsing API
  - MFB: Made sybase_fetch_*() functions also read rows with CS_ROW_FAIL
  - MFB: Adjusted function protos to use "resource" instead of "int"
  # Forgot the bunnies. Sorry.
  
  
http://cvs.php.net/viewvc.cgi/php-src/ext/sybase_ct/php_sybase_ct.c?r1=1.125&r2=1.126&diff_format=u
Index: php-src/ext/sybase_ct/php_sybase_ct.c
diff -u php-src/ext/sybase_ct/php_sybase_ct.c:1.125 
php-src/ext/sybase_ct/php_sybase_ct.c:1.126
--- php-src/ext/sybase_ct/php_sybase_ct.c:1.125 Sun Nov  2 21:10:11 2008
+++ php-src/ext/sybase_ct/php_sybase_ct.c       Mon Nov 10 11:49:06 2008
@@ -18,7 +18,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: php_sybase_ct.c,v 1.125 2008/11/02 21:10:11 felipe Exp $ */
+/* $Id: php_sybase_ct.c,v 1.126 2008/11/10 11:49:06 thekid Exp $ */
 
 
 #ifdef HAVE_CONFIG_H
@@ -49,6 +49,7 @@
        ZEND_ARG_INFO(0, password)
        ZEND_ARG_INFO(0, charset)
        ZEND_ARG_INFO(0, appname)
+       ZEND_ARG_INFO(0, new)
 ZEND_END_ARG_INFO()
 
 static
@@ -273,6 +274,21 @@
 #define efree_n(x)  { efree(x); x = NULL; }
 #define efree_if(x) if (x) efree_n(x)
 
+#ifdef PHP_SYBASE_DEBUG
+#define FREE_SYBASE_RESULT(result)                                             
               \
+       if (result) {                                                           
                  \
+           fprintf(stderr, "_free_sybase_result(%p) called from line #%d\n", 
result, __LINE__);  \
+               fflush(stderr);                                                 
                      \
+               _free_sybase_result(result);                                    
                      \
+               result = NULL;                                                  
                      \
+       }
+#else
+#define FREE_SYBASE_RESULT(result)                                             
               \
+       if (result) {                                                           
                  \
+               _free_sybase_result(result);                                    
                      \
+               result = NULL;                                                  
                      \
+       }
+#endif
 static void _free_sybase_result(sybase_result *result)
 {
        int i, j;
@@ -326,7 +342,7 @@
                php_sybase_finish_results(result TSRMLS_CC);
        }
 
-       _free_sybase_result(result);
+       FREE_SYBASE_RESULT(result);
 }
 
 static void _close_sybase_link(zend_rsrc_list_entry *rsrc TSRMLS_DC)
@@ -339,7 +355,6 @@
                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
@@ -420,47 +435,55 @@
 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];
-
-               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(state);
-               ZVAL_LONG(state, srvmsg->state);
-               args[2] = &state;
-
-               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));
-               }
+       /* Border case - empty fcall */
+       if (NULL == callback_name) return 0;
 
-               if (retval) {
-                       handled= ((Z_TYPE_P(retval) != IS_BOOL) || 
(Z_BVAL_P(retval) != 0));
-                       zval_ptr_dtor(&retval);
-               }
+       /* 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(state);
+       ZVAL_LONG(state, srvmsg->state);
+       args[2] = &state;
+
+       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) {
+               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;
 }
 
@@ -731,99 +754,30 @@
 {
        char *user, *passwd, *host, *charset, *appname;
        char *hashed_details;
-       int hashed_details_length;
+       int hashed_details_length, len;
+       zend_bool new = 0;
        sybase_link *sybase_ptr;
 
-       switch(ZEND_NUM_ARGS()) {
-               case 0: /* defaults */
-                       host=user=passwd=charset=appname=NULL;
-                       hashed_details_length=6+5;
-                       hashed_details = (char *) 
emalloc(hashed_details_length+1);
-                       strcpy(hashed_details, "sybase_____");
-                       break;
-               case 1: {
-                               zval **yyhost;
-
-                               if (zend_get_parameters_ex(1, &yyhost) == 
FAILURE) {
-                                       RETURN_FALSE;
-                               }
-                               convert_to_string_ex(yyhost);
-                               host = Z_STRVAL_PP(yyhost);
-                               user=passwd=charset=appname=NULL;
-                               hashed_details_length = 
spprintf(&hashed_details, 0, "sybase_%s____", Z_STRVAL_PP(yyhost));
-                       }
-                       break;
-               case 2: {
-                               zval **yyhost, **yyuser;
-
-                               if (zend_get_parameters_ex(2, &yyhost, &yyuser) 
== FAILURE) {
-                                       RETURN_FALSE;
-                               }
-                               convert_to_string_ex(yyhost);
-                               convert_to_string_ex(yyuser);
-                               host = Z_STRVAL_PP(yyhost);
-                               user = Z_STRVAL_PP(yyuser);
-                               passwd=charset=appname=NULL;
-                               hashed_details_length = 
spprintf(&hashed_details, 0, "sybase_%s_%s___", Z_STRVAL_PP(yyhost), 
Z_STRVAL_PP(yyuser));
-                       }
-                       break;
-               case 3: {
-                               zval **yyhost, **yyuser, **yypasswd;
-
-                               if (zend_get_parameters_ex(3, &yyhost, &yyuser, 
&yypasswd) == FAILURE) {
-                                       RETURN_FALSE;
-                               }
-                               convert_to_string_ex(yyhost);
-                               convert_to_string_ex(yyuser);
-                               convert_to_string_ex(yypasswd);
-                               host = Z_STRVAL_PP(yyhost);
-                               user = Z_STRVAL_PP(yyuser);
-                               passwd = Z_STRVAL_PP(yypasswd);
-                               charset=appname=NULL;
-                               hashed_details_length = 
spprintf(&hashed_details, 0, "sybase_%s_%s_%s__", Z_STRVAL_PP(yyhost), 
Z_STRVAL_PP(yyuser), Z_STRVAL_PP(yypasswd));
-                       }
-                       break;
-               case 4: {
-                               zval **yyhost, **yyuser, **yypasswd, 
**yycharset;
-
-                               if (zend_get_parameters_ex(4, &yyhost, &yyuser, 
&yypasswd, &yycharset) == FAILURE) {
-                                       RETURN_FALSE;
-                               }
-                               convert_to_string_ex(yyhost);
-                               convert_to_string_ex(yyuser);
-                               convert_to_string_ex(yypasswd);
-                               convert_to_string_ex(yycharset);
-                               host = Z_STRVAL_PP(yyhost);
-                               user = Z_STRVAL_PP(yyuser);
-                               passwd = Z_STRVAL_PP(yypasswd);
-                               charset = Z_STRVAL_PP(yycharset);
-                               appname=NULL;
-                               hashed_details_length = 
spprintf(&hashed_details, 0, "sybase_%s_%s_%s_%s_", Z_STRVAL_PP(yyhost), 
Z_STRVAL_PP(yyuser), Z_STRVAL_PP(yypasswd), Z_STRVAL_PP(yycharset));
-                       }
-                       break;
-               case 5: {
-                               zval **yyhost, **yyuser, **yypasswd, 
**yycharset, **yyappname;
-
-                               if (zend_get_parameters_ex(5, &yyhost, &yyuser, 
&yypasswd, &yycharset, &yyappname) == FAILURE) {
-                                       RETURN_FALSE;
-                               }
-                               convert_to_string_ex(yyhost);
-                               convert_to_string_ex(yyuser);
-                               convert_to_string_ex(yypasswd);
-                               convert_to_string_ex(yycharset);
-                               convert_to_string_ex(yyappname);
-                               host = Z_STRVAL_PP(yyhost);
-                               user = Z_STRVAL_PP(yyuser);
-                               passwd = Z_STRVAL_PP(yypasswd);
-                               charset = Z_STRVAL_PP(yycharset);
-                               appname = Z_STRVAL_PP(yyappname);
-                               hashed_details_length = 
spprintf(&hashed_details, 0, "sybase_%s_%s_%s_%s_%s", Z_STRVAL_PP(yyhost), 
Z_STRVAL_PP(yyuser), Z_STRVAL_PP(yypasswd), Z_STRVAL_PP(yycharset), 
Z_STRVAL_PP(yyappname));
-                       }
-                       break;
-               default:
-                       WRONG_PARAM_COUNT;
-                       break;
+       host= user= passwd= charset= appname= NULL;
+       if (persistent) {
+               if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, 
"|s!s!s!s!s!", &host, &len, &user, &len, &passwd, &len, &charset, &len, 
&appname, &len) == FAILURE) {
+                       return;
+               }
+       } else {
+               if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, 
"|s!s!s!s!s!b", &host, &len, &user, &len, &passwd, &len, &charset, &len, 
&appname, &len, &new) == FAILURE) {
+                       return;
+               }
        }
+       hashed_details_length = spprintf(
+               &hashed_details, 
+               0, 
+               "sybase_%s_%s_%s_%s_%s",
+               host ? host : "", 
+               user ? user : "", 
+               passwd ? passwd : "", 
+               charset ? charset : "", 
+               appname ? appname : ""
+       );
 
        if (!SybCtG(allow_persistent)) {
                persistent=0;
@@ -918,7 +872,7 @@
                 * if it doesn't, open a new sybase link, add it to the 
resource list,
                 * and add a pointer to it with hashed_details as the key.
                 */
-               if (zend_hash_find(&EG(regular_list), hashed_details, 
hashed_details_length+1, (void **) &index_ptr)==SUCCESS) {
+               if (!new && zend_hash_find(&EG(regular_list), hashed_details, 
hashed_details_length+1, (void **) &index_ptr)==SUCCESS) {
                        int type, link;
                        void *ptr;
 
@@ -982,7 +936,7 @@
 }
 
 
-/* {{{ proto int sybase_connect([string host [, string user [, string password 
[, string charset [, string appname]]]]])
+/* {{{ proto int sybase_connect([string host [, string user [, string password 
[, string charset [, string appname [, bool new]]]]]])
    Open Sybase server connection */
 PHP_FUNCTION(sybase_connect)
 {
@@ -1000,37 +954,42 @@
 
 /* }}} */
 
+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_FETCH_RESOURCE2(sybase_ptr, sybase_link *, &sybase_link_index, id, 
"Sybase-Link", le_link, le_plink);
+
+       if (id == -1) {
+               zend_list_delete(Z_RESVAL_P(sybase_link_index));
+       }
+       if (id != -1 || (sybase_link_index && Z_RESVAL_P(sybase_link_index) == 
SybCtG(default_link))) {
                zend_list_delete(SybCtG(default_link));
                SybCtG(default_link) = -1;
        }
@@ -1116,40 +1075,28 @@
 }
 
 
-/* {{{ 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 {
@@ -1244,8 +1191,6 @@
                        
                case CS_CANCELED:
                default:
-                       _free_sybase_result(result);
-                       result = NULL;
                        retcode = CS_FAIL;
                        break;
        }
@@ -1278,7 +1223,7 @@
        }
        
        if (numrows!=-1) numrows+= result->num_rows;
-       while ((retcode=ct_fetch(result->sybase_ptr->cmd, CS_UNUSED, CS_UNUSED, 
CS_UNUSED, NULL))==CS_SUCCEED) {
+       while ((retcode=ct_fetch(result->sybase_ptr->cmd, CS_UNUSED, CS_UNUSED, 
CS_UNUSED, NULL))==CS_SUCCEED || retcode == CS_ROW_FAIL) {
                result->num_rows++;
                i= result->store ? result->num_rows- 1 : 0;
                if (i >= result->blocks_initialized*SYBASE_ROWS_BLOCK) {
@@ -1329,7 +1274,7 @@
                                                /* This indicates anything 
else, return it as string */
                                                
ZVAL_STRINGL(&result->data[i][j], result->tmp_buffer[j], result->lengths[j]- 1, 
1);
                                                break;
-                                       }          
+                                       }
                                }
                        }
                }
@@ -1351,7 +1296,7 @@
                        break;
                        
                default:
-                       _free_sybase_result(result);
+                       FREE_SYBASE_RESULT(result);
                        result = NULL;
                        retcode = CS_FAIL;              /* Just to be sure */
                        break;
@@ -1490,9 +1435,10 @@
 
 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;
@@ -1503,41 +1449,21 @@
                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;
+       }
+
+       if (!store && !buffered) {
+               php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Sybase:  Cannot use 
non-storing mode with buffered queries");
+               store = 1;
        }
 
-       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(query);
+       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) {
@@ -1548,7 +1474,7 @@
        if (sybase_ptr->active_result_index) {
                zval *tmp = NULL;
                
-               php_error_docref(NULL TSRMLS_CC, E_NOTICE, "called without 
first fetching all rows from a previous unbuffered query");
+               php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Sybase:  Called 
without first fetching all rows from a previous unbuffered query");
                if (sybase_ptr->cmd) {
                        ct_cancel(NULL, sybase_ptr->cmd, CS_CANCEL_ALL);
                }
@@ -1560,17 +1486,9 @@
                INIT_PZVAL(tmp);
                ZEND_FETCH_RESOURCE(result, sybase_result *, &tmp, -1, "Sybase 
result", le_result);
                
-               /* Causes the following segfault:
-                  Program received signal SIGSEGV, Segmentation fault.
-                  0x8144380 in _efree (ptr=0x81fe024, 
__zend_filename=0x81841a0 "php4/ext/sybase_ct/php_sybase_ct.c", 
-                  __zend_lineno=946, __zend_orig_filename=0x0, 
__zend_orig_lineno=0) at php4/Zend/zend_alloc.c:229
-                  php4/Zend/zend_alloc.c:229:7284:beg:0x8144380
-               */
-               #if O_TIMM
                if (result) {
                        php_sybase_finish_results(result TSRMLS_CC);
                }
-               #endif
                
                zval_ptr_dtor(&tmp);
                zend_list_delete(sybase_ptr->active_result_index);
@@ -1587,7 +1505,7 @@
                /* 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
@@ -1725,9 +1643,7 @@
                /* Retry deadlocks up until deadlock_retry_count times */       
        
                if (sybase_ptr->deadlock && SybCtG(deadlock_retry_count) != -1 
&& ++deadlock_count > SybCtG(deadlock_retry_count)) {
                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase:  
Retried deadlock %d times [max: %ld], giving up", deadlock_count- 1, 
SybCtG(deadlock_retry_count));
-                       if (result != NULL) {
-                               _free_sybase_result(result);
-                       }
+                       FREE_SYBASE_RESULT(result);
                        break;
                }
 
@@ -1746,9 +1662,7 @@
                 * optimization, we could try not to fetch results in known
                 * deadlock conditions, but deadlock is (should be) rare.
                 */
-               if (result != NULL) {
-                       _free_sybase_result(result);
-               }
+               FREE_SYBASE_RESULT(result);
        }
 
        if (status == Q_SUCCESS) {
@@ -1756,9 +1670,7 @@
        }
 
        if (status == Q_FAILURE) {
-               if (result != NULL) {
-                       _free_sybase_result(result);
-               }
+               FREE_SYBASE_RESULT(result);
                RETURN_FALSE;
        }
 
@@ -1767,7 +1679,7 @@
        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)
 {
@@ -1775,29 +1687,24 @@
 }
 /* }}} */
 
-/* {{{ 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) {
@@ -1806,7 +1713,7 @@
                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;
 }
 
@@ -1820,18 +1727,17 @@
 }
 /* }}} */
 
-/* {{{ 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;
@@ -1839,18 +1745,17 @@
 
 /* }}} */
 
-/* {{{ 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;
@@ -1858,20 +1763,19 @@
 
 /* }}} */
 
-/* {{{ 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) {
@@ -1898,17 +1802,16 @@
 
 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) {
@@ -1944,54 +1847,58 @@
 }
 
 
-/* {{{ 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)
 {
@@ -1999,7 +1906,7 @@
 }
 /* }}} */
 
-/* {{{ 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)
 {
@@ -2007,33 +1914,30 @@
 }
 /* }}} */
 
-/* {{{ 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;
 }
 /* }}} */
@@ -2082,42 +1986,26 @@
 }
 
 
-/* {{{ 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;
@@ -2134,24 +2022,20 @@
 /* }}} */
 
 
-/* {{{ 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;
        }
@@ -2162,89 +2046,81 @@
 /* }}} */
 
 
-/* {{{ 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;
@@ -2279,13 +2155,13 @@
    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;
 }
 /* }}} */
 
@@ -2294,13 +2170,13 @@
    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;
 }
 /* }}} */
 
@@ -2308,13 +2184,13 @@
    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;
 }
 /* }}} */
 
@@ -2324,62 +2200,47 @@
    If error_func is NULL the handler will be deleted */
 PHP_FUNCTION(sybase_set_message_handler)
 {
-       zval **callback, **param, **sybase_link_index= NULL;
-       zval 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 TSRMLS_CC)) {
-                               php_error_docref(NULL TSRMLS_CC, E_WARNING, 
"First argumented is expected to be a valid callback, '%R' was given", 
Z_TYPE(name), Z_UNIVAL(name));
-                               zval_dtor(&name);
-                               RETURN_FALSE;
-                       }
-                       zval_dtor(&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;
 }
 /* }}} */

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to