cvs: php4 /ext/interbase interbase.c php_interbase.h

From: Date: Fri, 07 Jul 2000 12:06:05 +0000
Subject: cvs: php4 /ext/interbase interbase.c php_interbase.h
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-659@lists.php.net to get a copy of this message
jah Fri Jul 7 05:06:05 2000 EDT Modified files: /php4/ext/interbase interbase.c php_interbase.h Log: - Move away from encoding transaction number into link_id and use properly resources instead for both. - Some cleaning. Index: php4/ext/interbase/interbase.c diff -u php4/ext/interbase/interbase.c:1.38 php4/ext/interbase/interbase.c:1.39 --- php4/ext/interbase/interbase.c:1.38 Tue Jul 4 21:21:00 2000 +++ php4/ext/interbase/interbase.c Fri Jul 7 05:06:05 2000 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: interbase.c,v 1.38 2000/07/05 04:21:00 jah Exp $ */ +/* $Id: interbase.c,v 1.39 2000/07/07 12:06:05 jah Exp $ */ /* TODO: Arrays, roles? @@ -128,26 +128,41 @@ /* }}} */ -/* {{{ internal macros and structures */ +/* {{{ internal macros, functions and structures */ #define IB_STATUS (IBG(status)) -/* db_handle and transaction handle keep in one variable - link = db_handle * IBASE_TRANS_ON_LINK + trans_handle -*/ +/* Fill ib_link and trans_n with the correct database link and transaction slot number. */ -/* get link and transaction from long argument - */ -#define GET_LINK_TRANS(link_id, ib_link, trans_n) { \ - int type; \ - trans_n = link_id % IBASE_TRANS_ON_LINK; \ - link_id /= IBASE_TRANS_ON_LINK; \ - ib_link = (ibase_db_link *) zend_list_find(link_id, &type); \ - if (type!=IBG(le_link) && type!=IBG(le_plink)) { \ - _php_ibase_module_error("%d is not link or transaction index",link_id); \ - RETURN_FALSE; \ - }} - +static void get_link_trans(INTERNAL_FUNCTION_PARAMETERS, zval **link_id, ibase_db_link **ib_link, int *trans_n) { + int type; + void *resource = NULL; + ibase_tr_link *ib_trans; + IBLS_FETCH(); + + IBDEBUG("Transaction or database link?"); + if (Z_TYPE_PP(link_id) == IS_RESOURCE) { + int trans = IBG(le_trans); + + if (resource = zend_list_find(Z_LVAL_PP(link_id), &type)) { + IBDEBUG("Found in list"); + if (type == IBG(le_trans)) { + /* Transaction resource. Fetch it, database link resource + is stored in ib_trans->link_rsrc. */ + IBDEBUG("Type is le_trans"); + ZEND_FETCH_RESOURCE(ib_trans, ibase_tr_link *, link_id, -1, "InterBase transaction", IBG(le_trans)); + *trans_n = ib_trans->trans_num; + ZEND_FETCH_RESOURCE2(resource, ibase_db_link *, link_id, ib_trans->link_rsrc, "InterBase link", IBG(le_link), IBG(le_plink)); + } else { + IBDEBUG("Type is le_[p]link"); + /* Database link resource, use default transaction (=0). */ + *trans_n = 0; + ZEND_FETCH_RESOURCE2(resource, ibase_db_link *, link_id, -1, "InterBase link", IBG(le_link), IBG(le_plink)); + } + } + } + *ib_link = resource; +} #define RESET_ERRMSG { IBG(errmsg)[0] = '\0';} @@ -363,6 +378,7 @@ } else { /* Shouldn't be here unless query was select and had parameter placeholders, in which case ibase_execute handles this??? + (Testing seems to confirm the decision was a right one.) */ IBDEBUG("Closing statement handle..."); /* @@ -541,7 +557,7 @@ php_info_print_table_start(); php_info_print_table_row(2, "Interbase Support", "enabled"); - php_info_print_table_row(2, "Revision", "$Revision: 1.38 $"); + php_info_print_table_row(2, "Revision", "$Revision: 1.39 $"); #ifdef COMPILE_DL_INTERBASE php_info_print_table_row(2, "Dynamic Module", "yes"); #endif @@ -765,12 +781,9 @@ IBG(num_links)++; IBG(num_persistent)++; } - return_value->value.lval = IBASE_TRANS_ON_LINK * - zend_list_insert(ib_link, IBG(le_plink)); - return_value->type = IS_RESOURCE; - /* + ZEND_REGISTER_RESOURCE(return_value, ib_link, IBG(le_plink)); - */ + } else { list_entry *index_ptr, new_index_ptr; @@ -789,7 +802,7 @@ ptr = zend_list_find(xlink, &type); /* check if the xlink is still there */ if (ptr && (type==IBG(le_link) || type==IBG(le_plink))) { zend_list_addref(xlink); - return_value->value.lval = IBG(default_link) = xlink; + return_value->value.lval = xlink; return_value->type = IS_RESOURCE; IBG(default_link) = return_value->value.lval; efree(hashed_details); @@ -818,13 +831,8 @@ for (i = 0; i < IBASE_TRANS_ON_LINK; i++) ib_link->trans[i] = NULL; - /* add it to the list */ - return_value->value.lval = IBASE_TRANS_ON_LINK * - zend_list_insert(ib_link, IBG(le_link)); - return_value->type = IS_RESOURCE; - /* ZEND_REGISTER_RESOURCE(return_value, ib_link, IBG(le_link)); - */ + /* add it to the hash */ new_index_ptr.ptr = (void *) return_value->value.lval; new_index_ptr.type = le_index_ptr; @@ -835,6 +843,7 @@ IBG(num_links)++; } efree(hashed_details); + zend_list_addref(return_value->value.lval); IBG(default_link) = return_value->value.lval; } /* }}} */ @@ -864,7 +873,7 @@ { zval **link_arg; ibase_db_link *ib_link; - int link_id, trans_n; + int link_id; IBLS_FETCH(); RESET_ERRMSG; @@ -885,7 +894,7 @@ break; } - GET_LINK_TRANS(link_id, ib_link, trans_n); + ZEND_FETCH_RESOURCE2(ib_link, ibase_db_link *, link_arg, link_id, "InterBase link", IBG(le_link), IBG(le_plink)); zend_list_delete(link_id); RETURN_TRUE; } @@ -1196,7 +1205,7 @@ #else /* Once again, InterBase's internal parsing routines - seems to bea good solution... Might change this on + seems to be a good solution... Might change this on platforms that have strptime()? Code is there and works, but the functions existence is not yet tested... ask Sascha? @@ -1400,10 +1409,12 @@ PHP_FUNCTION(ibase_trans) { pval ***args; + zval **dummy; char tpb[20], *tpbp = NULL; long trans_argl = 0; - int tpb_len = 0, argn, link_id, trans_n; + int tpb_len = 0, argn, link_id, trans_n = 0, i; ibase_db_link *ib_link; + ibase_tr_link *ib_trans; IBLS_FETCH(); RESET_ERRMSG; @@ -1412,7 +1423,7 @@ /* TODO: multi-databases trans */ argn = ZEND_NUM_ARGS(); - if (argn < 0 || argn > 2) { + if (argn < 0 || argn > 20) { WRONG_PARAM_COUNT; } @@ -1423,29 +1434,24 @@ RETURN_FALSE; } - argn--; - convert_to_long_ex(args[argn]); /* last arg - trans_args */ - trans_argl = (*args[argn])->value.lval; - - /* TODO: multi - do { - link_id[argn] = args[argn]; - convert_to_long_ex(args[argn]); - GET_LINK_TRANS((*args[argn])->value.lval, ib_link[argn], trans_n); - } while(argn--); - */ - - if (argn) { - argn--; - convert_to_long_ex(args[argn]); - link_id = (*args[argn])->value.lval; + /* Handle all database links, although we don't support multibase + transactions yet, so only the last one is will be used. */ + for (i = argn-1; i > 0 && Z_TYPE_PP(args[i]) == IS_RESOURCE; i--) { + ZEND_FETCH_RESOURCE2(ib_link, ibase_db_link *, args[i], -1, "InterBase link", IBG(le_link), IBG(le_plink)); + link_id = Z_LVAL_PP(args[i]); } - + + /* First argument is transaction parameters */ + convert_to_long_ex(args[0]); + trans_argl = (*args[0])->value.lval; + efree(args); } - GET_LINK_TRANS(link_id, ib_link, trans_n); - + if (argn < 2) { + ZEND_FETCH_RESOURCE2(ib_link, ibase_db_link *, dummy, link_id, "InterBase link", IBG(le_link), IBG(le_plink)); + } + if (trans_argl ) { tpb[tpb_len++] = isc_tpb_version3; tpbp = tpb; @@ -1482,8 +1488,11 @@ _php_ibase_error(); RETURN_FALSE; } - return_value->value.lval = link_id * IBASE_TRANS_ON_LINK + trans_n; - return_value->type = IS_RESOURCE; + + ib_trans = (ibase_tr_link *) malloc(sizeof(ibase_tr_link)); + ib_trans->trans_num = trans_n; + ib_trans->link_rsrc = link_id; + ZEND_REGISTER_RESOURCE(return_value, ib_trans, IBG(le_trans)); } /* }}} */ @@ -1520,21 +1529,19 @@ switch (ZEND_NUM_ARGS()) { case 0: link_id = IBG(default_link); + ZEND_FETCH_RESOURCE2(ib_link, ibase_db_link *, link_trans_arg, link_id, "InterBase link", IBG(le_link), IBG(le_plink)); break; case 1: if (zend_get_parameters_ex(1, &link_trans_arg) == FAILURE) { RETURN_FALSE; } - convert_to_long_ex(link_trans_arg); - link_id = (*link_trans_arg)->value.lval; + get_link_trans(INTERNAL_FUNCTION_PARAM_PASSTHRU, link_trans_arg, &ib_link, &trans_n); break; default: WRONG_PARAM_COUNT; break; } - GET_LINK_TRANS(link_id, ib_link, trans_n); - if (commit) { if (isc_commit_transaction(IB_STATUS, &ib_link->trans[trans_n])) { _php_ibase_error(); @@ -1575,7 +1582,7 @@ Execute a query */ PHP_FUNCTION(ibase_query) { - pval ***args, **bind_args = NULL; + pval ***args, **bind_args = NULL, **dummy = NULL; int i, link_id = 0, trans_n = 0, bind_n = 0; char *query; ibase_db_link *ib_link; @@ -1597,15 +1604,13 @@ i = 0; if ((*args[i])->type == IS_RESOURCE) { /* link or transaction argument */ - convert_to_long_ex(args[i]); - link_id = (*args[i])->value.lval; + get_link_trans(INTERNAL_FUNCTION_PARAM_PASSTHRU, args[i], &ib_link, &trans_n); i++; /* next arg */ } else { link_id = IBG(default_link); + ZEND_FETCH_RESOURCE2(ib_link, ibase_db_link *, dummy, link_id, "InterBase link", IBG(le_link), IBG(le_plink)); } - GET_LINK_TRANS(link_id, ib_link, trans_n); - if ((*args[i])->type == IS_STRING) { /* query argument */ convert_to_string_ex(args[i]); query = (*args[i])->value.str.val; @@ -2120,21 +2125,19 @@ RETURN_FALSE; } link_id = IBG(default_link); + ZEND_FETCH_RESOURCE2(ib_link, ibase_db_link *, link_arg, link_id, "InterBase link", IBG(le_link), IBG(le_plink)); break; case 2: if (zend_get_parameters_ex(2, &link_arg, &query_arg) == FAILURE) { RETURN_FALSE; } - convert_to_long_ex(link_arg); - link_id = (*link_arg)->value.lval; + get_link_trans(INTERNAL_FUNCTION_PARAM_PASSTHRU, link_arg, &ib_link, &trans_n); break; default: WRONG_PARAM_COUNT; break; } - GET_LINK_TRANS(link_id, ib_link, trans_n); - convert_to_string_ex(query_arg); query = (*query_arg)->value.str.val; @@ -2459,8 +2462,8 @@ Create blob for adding data */ PHP_FUNCTION(ibase_blob_create) { - pval *link_arg; - int trans_n, link_id = 0; + zval **link_arg; + int trans_n = 0, link_id; ibase_db_link *ib_link; ibase_blob_handle *ib_blob; IBLS_FETCH(); @@ -2470,21 +2473,19 @@ switch (ZEND_NUM_ARGS()) { case 0: link_id = IBG(default_link); + ZEND_FETCH_RESOURCE2(ib_link, ibase_db_link *, link_arg, link_id, "InterBase link", IBG(le_link), IBG(le_plink)); break; case 1: - if (getParameters(ht, 1, &link_arg) == FAILURE) { + if (zend_get_parameters_ex(1, &link_arg) == FAILURE) { RETURN_FALSE; } - convert_to_long(link_arg); - link_id = link_arg->value.lval; + get_link_trans(INTERNAL_FUNCTION_PARAM_PASSTHRU, link_arg, &ib_link, &trans_n); break; default: WRONG_PARAM_COUNT; break; } - GET_LINK_TRANS(link_id, ib_link, trans_n); - /* open default transaction */ if(_php_ibase_def_trans(ib_link, trans_n) == FAILURE){ RETURN_FALSE; @@ -2819,7 +2820,7 @@ PHP_FUNCTION(ibase_blob_import) { zval **link_arg, **file_arg; - int trans_n, link_id = 0, file_id, size, b; + int trans_n, link_id = 0, size, b; int issock=0, socketd=0; ibase_blob_handle ib_blob; ibase_db_link *ib_link; @@ -2835,21 +2836,19 @@ RETURN_FALSE; } link_id = IBG(default_link); + ZEND_FETCH_RESOURCE2(ib_link, ibase_db_link *, link_arg, link_id, "InterBase link", IBG(le_link), IBG(le_plink)); break; case 2: if (zend_get_parameters_ex(2, &link_arg, &file_arg) == FAILURE) { RETURN_FALSE; } - convert_to_long_ex(link_arg); - link_id = (*link_arg)->value.lval; + get_link_trans(INTERNAL_FUNCTION_PARAM_PASSTHRU, link_arg, &ib_link, &trans_n); break; default: WRONG_PARAM_COUNT; break; } - GET_LINK_TRANS(link_id, ib_link, trans_n); - /* open default transaction */ if(_php_ibase_def_trans(ib_link, trans_n) == FAILURE){ RETURN_FALSE; @@ -2881,8 +2880,6 @@ _php_ibase_error(); RETURN_FALSE; } - - zend_list_delete(file_id); ib_blob.bl_handle = NULL; RETVAL_STRINGL((char *)&ib_blob, sizeof(ibase_blob_handle), 1); Index: php4/ext/interbase/php_interbase.h diff -u php4/ext/interbase/php_interbase.h:1.15 php4/ext/interbase/php_interbase.h:1.16 --- php4/ext/interbase/php_interbase.h:1.15 Tue Jul 4 21:21:00 2000 +++ php4/ext/interbase/php_interbase.h Fri Jul 7 05:06:05 2000 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_interbase.h,v 1.15 2000/07/05 04:21:00 jah Exp $ */ +/* $Id: php_interbase.h,v 1.16 2000/07/07 12:06:05 jah Exp $ */ #ifndef PHP_INTERBASE_H #define PHP_INTERBASE_H @@ -82,7 +82,7 @@ long num_links, num_persistent; long max_links, max_persistent; long allow_persistent; - int le_blob, le_link, le_plink, le_result, le_query; + int le_blob, le_link, le_plink, le_result, le_query, le_trans; char *default_user, *default_password; char *timestampformat; char *cfg_timestampformat; @@ -98,6 +98,11 @@ isc_db_handle link; int dialect; } ibase_db_link; + +typedef struct { + int trans_num; + int link_rsrc; +} ibase_tr_link; typedef struct { ISC_ARRAY_DESC ar_desc;

« previous php.cvs (#659) next »