CVS update: php3/functions
| From: | jah | Date: | Thu, 07 Jan 1999 08:58:08 +0000 |
| Subject: | CVS update: php3/functions | ||
| Groups: | php.dev | ||
| Request: | Send a blank email to php-dev+get-3358@lists.php.net to get a copy of this message | ||
Date: Thursday January 7, 1999 @ 3:58
Author: jah
Update of /repository/php3/functions
In directory asf:/u/temp/cvs-serv8331/functions
Modified Files:
interbase.c php3_interbase.h
Log Message:
ibase_timefmt now working. Rewrote the code attaching to database based on
code by Colovic Igor <cigor@EUnet.yu>. A whole lot new functionality thanks
to Andrew Avdeev <andy@simgts.mv.ru>.
Index: php3/functions/interbase.c
diff -c php3/functions/interbase.c:1.7 php3/functions/interbase.c:1.8
*** php3/functions/interbase.c:1.7 Fri Jan 1 12:59:12 1999
--- php3/functions/interbase.c Thu Jan 7 03:58:08 1999
***************
*** 24,34 ****
| contact core@php.net. |
+----------------------------------------------------------------------+
| Authors: Jouni Ahto <jah@cultnet.fi> |
! | |
+----------------------------------------------------------------------+
*/
! /* $Id: interbase.c,v 1.7 1999/01/01 17:59:12 zeev Exp $ */
/* TODO: A lot... */
--- 24,34 ----
| contact core@php.net. |
+----------------------------------------------------------------------+
| Authors: Jouni Ahto <jah@cultnet.fi> |
! | Andrew Avdeev <andy@simgts.mv.ru> |
+----------------------------------------------------------------------+
*/
! /* $Id: interbase.c,v 1.8 1999/01/07 08:58:08 jah Exp $ */
/* TODO: A lot... */
***************
*** 50,61 ****
--- 50,67 ----
{"ibase_close", php3_ibase_close, NULL},
{"ibase_query", php3_ibase_query, NULL},
{"ibase_fetch_row", php3_ibase_fetch_row, NULL},
+ {"ibase_fetch_object", php3_ibase_fetch_object,NULL},
{"ibase_free_result", php3_ibase_free_result, NULL},
{"ibase_prepare", php3_ibase_prepare, NULL},
{"ibase_bind", php3_ibase_bind, NULL},
{"ibase_execute", php3_ibase_execute, NULL},
{"ibase_free_query", php3_ibase_free_query, NULL},
{"ibase_timefmt", php3_ibase_timefmt, NULL},
+ {"ibase_num_fields", php3_ibase_num_fields, NULL},
+ {"ibase_field_info", php3_ibase_field_info, NULL},
+ {"ibase_trans", php3_ibase_trans, NULL},
+ {"ibase_commit", php3_ibase_commit, NULL},
+ {"ibase_rollback", php3_ibase_rollback, NULL},
{NULL, NULL, NULL}
};
***************
*** 67,73 ****
NULL,
php3_rinit_ibase,
NULL,
! php3_info_ibase,
STANDARD_MODULE_PROPERTIES
};
/* }}} */
--- 73,79 ----
NULL,
php3_rinit_ibase,
NULL,
! /*php3_info_ibase*/ NULL,
STANDARD_MODULE_PROPERTIES
};
/* }}} */
***************
*** 75,88 ****
/* {{{ thread safety stuff */
#if defined(THREAD_SAFE)
typedef ibase_global_struct{
! ibase_module php3_ibase_module;
} ibase_global_struct;
#define IBASE_GLOBAL(a) ibase_globals->a
#define IBASE_TLS_VARS \
! ibase_global_struct *ibase_globals; \
! ibase_globals=TlsGetValue(IBASETls);
#else
#define IBASE_GLOBAL(a) a
--- 81,94 ----
/* {{{ thread safety stuff */
#if defined(THREAD_SAFE)
typedef ibase_global_struct{
! ibase_module php3_ibase_module;
} ibase_global_struct;
#define IBASE_GLOBAL(a) ibase_globals->a
#define IBASE_TLS_VARS \
! ibase_global_struct *ibase_globals; \
! ibase_globals=TlsGetValue(IBASETls);
#else
#define IBASE_GLOBAL(a) a
***************
*** 91,116 ****
#endif
/* }}} */
/* {{{ _php3_ibase_close_link() */
! static void _php3_ibase_close_link(isc_db_handle db)
{
ISC_STATUS status[20];
IBASE_TLS_VARS;
! isc_detach_database(status, &db);
IBASE_GLOBAL(php3_ibase_module).num_links--;
}
/* }}} */
/* {{{ _php3_ibase_close_plink() */
! static void _php3_ibase_close_plink(isc_db_handle db)
{
ISC_STATUS status[20];
IBASE_TLS_VARS;
! isc_detach_database(status, &db);
php3_ibase_module.num_persistent--;
php3_ibase_module.num_links--;
}
/* }}} */
--- 97,166 ----
#endif
/* }}} */
+ /* {{{ print interbase error */
+ static void _php3_isc_interprete(ISC_STATUS *status)
+ {
+ #define IB_MSGSIZE 256
+ char msg[IB_MSGSIZE*3], *s;
+
+ s = msg;
+ while((s - msg) < IB_MSGSIZE + 2 && isc_interprete(s, &status)){
+ strcat(msg, " ");
+ s = msg + strlen(msg);
+ }
+ php3_error(E_WARNING, "InterBase: %s",msg);
+ #undef IB_MSGSIZE
+ }
+ /* }}} */
+
+ /* {{{ _php3_ibase_rollback_trans() */
+ static void _php3_ibase_rollback_trans(ibase_trans *ib_trans)
+ {
+ isc_tr_handle trans;
+ ISC_STATUS status[20];
+ IBASE_TLS_VARS;
+
+ if(ib_trans->trans != NULL){
+ if(isc_rollback_transaction(status, &ib_trans->trans)){
+ _php3_isc_interprete(status);
+ }
+ }
+ efree(ib_trans);
+ }
+ /* }}} */
+
/* {{{ _php3_ibase_close_link() */
! static void _php3_ibase_close_link(ibase_db_link *link)
{
ISC_STATUS status[20];
IBASE_TLS_VARS;
! if(link->default_trans != NULL){
! if(isc_rollback_transaction(status, &link->default_trans)){
! _php3_isc_interprete(status);
! }
! }
! isc_detach_database(status, &link->link);
IBASE_GLOBAL(php3_ibase_module).num_links--;
+ efree(link);
}
/* }}} */
/* {{{ _php3_ibase_close_plink() */
! static void _php3_ibase_close_plink(ibase_db_link *link)
{
ISC_STATUS status[20];
IBASE_TLS_VARS;
! if(link->default_trans != NULL){
! if(isc_rollback_transaction(status, &link->default_trans)){
! _php3_isc_interprete(status);
! }
! }
! isc_detach_database(status, &link->link);
php3_ibase_module.num_persistent--;
php3_ibase_module.num_links--;
+ efree(link);
}
/* }}} */
***************
*** 121,128 ****
ISC_STATUS status[20];
IBASE_TLS_VARS;
! if (!IBASE_GLOBAL(php3_ibase_module).manualtransactions && result->commitok) {
! isc_commit_transaction(status, &result->trans);
}
if (result->sqlda != NULL) {
for (i = 0; i < result->sqlda->sqld; i++) {
--- 171,178 ----
ISC_STATUS status[20];
IBASE_TLS_VARS;
! if (result->result_trans != NULL) { /*FIXME : commit or rollback?*/
! isc_commit_transaction(status, &result->result_trans);
}
if (result->sqlda != NULL) {
for (i = 0; i < result->sqlda->sqld; i++) {
***************
*** 142,147 ****
--- 192,200 ----
int i;
ISC_STATUS status[20];
+ if (query->query_trans != NULL) { /*FIXME : commit or rollback?*/
+ isc_commit_transaction(status, &query->query_trans);
+ }
if (query->sqlda != NULL) {
if (query->alloced) {
for (i = 0; i < query->sqlda->sqld; i++) {
***************
*** 170,181 ****
if (cfg_get_long("ibase.max_links", &IBASE_GLOBAL(php3_ibase_module).max_links) ==
FAILURE) {
IBASE_GLOBAL(php3_ibase_module).max_links = -1;
}
- /*
- if (cfg_get_long("ibase.manualtransactions",
&IBASE_GLOBAL(php3_ibase_module).manualtransactions) == FAILURE) {
- IBASE_GLOBAL(php3_ibase_module).manualtransactions = 0;
- }
- */
- IBASE_GLOBAL(php3_ibase_module).manualtransactions = 0;
if (cfg_get_string("ibase.default_user",
&IBASE_GLOBAL(php3_ibase_module).default_user) == FAILURE
|| IBASE_GLOBAL(php3_ibase_module).default_user[0] == 0) {
IBASE_GLOBAL(php3_ibase_module).default_user = "";
--- 223,228 ----
***************
*** 185,195 ****
IBASE_GLOBAL(php3_ibase_module).default_password = "";
}
if (cfg_get_string("ibase.timeformat", &IBASE_GLOBAL(php3_ibase_module).timeformat)
== FAILURE) {
! IBASE_GLOBAL(php3_ibase_module).timeformat = "%Y-%m-%d %H:%M:%S";
}
IBASE_GLOBAL(php3_ibase_module).num_persistent=0;
IBASE_GLOBAL(php3_ibase_module).le_result = register_list_destructors(_php3_ibase_free_result,
NULL);
IBASE_GLOBAL(php3_ibase_module).le_query = register_list_destructors(_php3_ibase_free_query,
NULL);
IBASE_GLOBAL(php3_ibase_module).le_link = register_list_destructors(_php3_ibase_close_link,
NULL);
IBASE_GLOBAL(php3_ibase_module).le_plink = register_list_destructors(NULL,
_php3_ibase_close_plink);
return SUCCESS;
--- 232,243 ----
IBASE_GLOBAL(php3_ibase_module).default_password = "";
}
if (cfg_get_string("ibase.timeformat", &IBASE_GLOBAL(php3_ibase_module).timeformat)
== FAILURE) {
! IBASE_GLOBAL(php3_ibase_module).cfg_timeformat = "%Y-%m-%d %H:%M:%S";
}
IBASE_GLOBAL(php3_ibase_module).num_persistent=0;
IBASE_GLOBAL(php3_ibase_module).le_result = register_list_destructors(_php3_ibase_free_result,
NULL);
IBASE_GLOBAL(php3_ibase_module).le_query = register_list_destructors(_php3_ibase_free_query,
NULL);
+ IBASE_GLOBAL(php3_ibase_module).le_trans = register_list_destructors(_php3_ibase_rollback_trans,
NULL);
IBASE_GLOBAL(php3_ibase_module).le_link = register_list_destructors(_php3_ibase_close_link,
NULL);
IBASE_GLOBAL(php3_ibase_module).le_plink = register_list_destructors(NULL,
_php3_ibase_close_plink);
return SUCCESS;
***************
*** 199,206 ****
{
IBASE_TLS_VARS;
! IBASE_GLOBAL(php3_ibase_module).default_link=-1;
IBASE_GLOBAL(php3_ibase_module).num_links = php3_ibase_module.num_persistent;
return SUCCESS;
}
--- 247,255 ----
{
IBASE_TLS_VARS;
! IBASE_GLOBAL(php3_ibase_module).default_link= -1;
IBASE_GLOBAL(php3_ibase_module).num_links = php3_ibase_module.num_persistent;
+ IBASE_GLOBAL(php3_ibase_module).timeformat =
estrndup(IBASE_GLOBAL(php3_ibase_module).cfg_timeformat,
strlen(IBASE_GLOBAL(php3_ibase_module).cfg_timeformat));
return SUCCESS;
}
***************
*** 209,219 ****
int php3_mfinish_ibase(void)
{
}
int php3_rfinish_ibase(void)
{
}
- */
void php3_info_ibase(void)
{
--- 258,272 ----
int php3_mfinish_ibase(void)
{
}
+ */
int php3_rfinish_ibase(void)
{
+ IBASE_TLS_VARS;
+
+ efree(IBASE_GLOBAL(php3_ibase_module).timeformat);
+ return SUCCESS;
}
void php3_info_ibase(void)
{
***************
*** 222,261 ****
/* }}} */
/* {{{ _php_ibase_attach_db() */
! static int _php_ibase_attach_db(char *server, char *uname, int uname_len, char *passwd, int
passwd_len, isc_db_handle *db)
{
ISC_STATUS status[20];
! int db_parbuf_len = 4;
! short foo = 4;
! char dpb[255], *db_parbuf;
! if (uname_len) {
! db_parbuf_len += uname_len + 2;
}
! if (passwd_len) {
! db_parbuf_len += passwd_len + 2;
}
! db_parbuf = dpb;
! *db_parbuf++ = isc_dpb_version1;
! *db_parbuf++ = isc_dpb_num_buffers;
! *db_parbuf++ = 1;
! *db_parbuf++ = 90;
! if (uname_len) {
! if (passwd_len) {
! isc_expand_dpb(&db_parbuf, &foo, isc_dpb_user_name, uname, isc_dpb_password, passwd,
NULL);
! } else {
! isc_expand_dpb(&db_parbuf, &foo, isc_dpb_user_name, uname, NULL);
}
}
! isc_attach_database(status, strlen(server), server, db, db_parbuf_len, dpb);
if (status[0] == 1 && status[1]) {
! php3_error(E_WARNING,"Unable to connect to InterBase server: %s", "XXX");
! return 1;
}
return 0;
}
--- 275,339 ----
/* }}} */
/* {{{ _php_ibase_attach_db() */
! static int _php_ibase_attach_db(char *server, char *uname, char *passwd, char *charset, int
buffers, char *role, isc_db_handle *db)
{
+ char dpb_buffer[256], *dpb, *p;
+ int dpb_length, len;
ISC_STATUS status[20];
! char msg[512];
! dpb = dpb_buffer;
!
! *dpb++ = isc_dpb_version1;
!
! if (uname != NULL && (len = strlen(uname))) {
! *dpb++ = isc_dpb_user_name;
! *dpb++ = len;
! for (p = uname; *p;) {
! *dpb++ = *p++;
! }
}
! if (passwd != NULL && (len = strlen(passwd))) {
! *dpb++ = isc_dpb_password;
! *dpb++ = strlen(passwd);
! for (p = passwd; *p;) {
! *dpb++ = *p++;
! }
}
! if (charset != NULL && (len = strlen(charset))) {
! *dpb++ = isc_dpb_lc_ctype;
! *dpb++ = strlen(charset);
! for (p = charset; *p;) {
! *dpb++ = *p++;
! }
! }
! if (buffers) {
! *dpb++ = isc_dpb_num_buffers;
! *dpb++ = 1;
! *dpb++ = buffers;
! }
!
! #ifdef isc_dpb_sql_role_name
! if (role != NULL && (len = strlen(role))) {
! *dpb++ = isc_dpb_sql_role_name;
! *dpb++ = strlen(role);
! for (p = role; *p;) {
! *dpb++ = *p++;
}
}
+ #endif
+
+ dpb_length = dpb - dpb_buffer;
! isc_attach_database(status, strlen(server), server, db, dpb_length, dpb_buffer);
if (status[0] == 1 && status[1]) {
! _php3_isc_interprete(status);
! php3_error(E_WARNING,"Unable to connect to InterBase server: %s", msg);
! return 1;
}
return 0;
}
***************
*** 271,276 ****
--- 349,355 ----
isc_db_handle db_handle = NULL;
char *hashed_details;
int hashed_details_length;
+ ibase_db_link *ib_link;
IBASE_TLS_VARS;
ib_uname = IBASE_GLOBAL(php3_ibase_module).default_user;
***************
*** 349,366 ****
RETURN_FALSE;
}
! /* create the link */
! if (_php_ibase_attach_db(ib_server, ib_uname, ib_uname_len, ib_passwd, ib_passwd_len,
&db_handle)) {
efree(hashed_details);
RETURN_FALSE;
}
/* hash it up */
new_le.type = php3_ibase_module.le_plink;
! new_le.ptr = db_handle;
if (_php3_hash_update(plist, hashed_details, hashed_details_length+1, (void *) &new_le,
sizeof(list_entry), NULL)==FAILURE) {
efree(hashed_details);
RETURN_FALSE;
}
IBASE_GLOBAL(php3_ibase_module).num_links++;
--- 428,449 ----
RETURN_FALSE;
}
! /* create the ib_link */
! if (_php_ibase_attach_db(ib_server, ib_uname, ib_passwd, NULL, 0, NULL, &db_handle)) {
efree(hashed_details);
RETURN_FALSE;
}
+ ib_link = (ibase_db_link *) malloc(sizeof(ibase_db_link));
+ ib_link->link = db_handle;
+ ib_link->default_trans = NULL;
/* hash it up */
new_le.type = php3_ibase_module.le_plink;
! new_le.ptr = ib_link;
if (_php3_hash_update(plist, hashed_details, hashed_details_length+1, (void *) &new_le,
sizeof(list_entry), NULL)==FAILURE) {
efree(hashed_details);
+ efree(ib_link);
RETURN_FALSE;
}
IBASE_GLOBAL(php3_ibase_module).num_links++;
***************
*** 369,399 ****
if (le->type != IBASE_GLOBAL(php3_ibase_module).le_plink) {
RETURN_FALSE;
}
! /* TODO: ensure that the link did not die */
!
! db_handle = (isc_db_handle) le->ptr;
}
! return_value->value.lval = php3_list_insert(db_handle,
IBASE_GLOBAL(php3_ibase_module).le_plink);
return_value->type = IS_LONG;
} else {
list_entry *index_ptr, new_index_ptr;
/* first we check the hash for the hashed_details key. if it exists,
! * it should point us to the right offset where the actual pgsql link sits.
! * if it doesn't, open a new pgsql link, add it to the resource list,
* and add a pointer to it with hashed_details as the key.
*/
if (_php3_hash_find(list,hashed_details,hashed_details_length+1,(void **)
&index_ptr)==SUCCESS) {
! int type,link;
void *ptr;
if (index_ptr->type != le_index_ptr) {
RETURN_FALSE;
}
! link = (int) index_ptr->ptr;
! ptr = php3_list_find(link,&type); /* check if the link is still there */
if (ptr && (type==IBASE_GLOBAL(php3_ibase_module).le_link ||
type==IBASE_GLOBAL(php3_ibase_module).le_plink)) {
! return_value->value.lval = IBASE_GLOBAL(php3_ibase_module).default_link = link;
return_value->type = IS_LONG;
efree(hashed_details);
return;
--- 452,482 ----
if (le->type != IBASE_GLOBAL(php3_ibase_module).le_plink) {
RETURN_FALSE;
}
! /* TODO: ensure that the ib_link did not die */
! ib_link = (ibase_db_link *) le->ptr;
! ib_link->default_trans = NULL;
}
! return_value->value.lval = php3_list_insert(ib_link,
IBASE_GLOBAL(php3_ibase_module).le_plink);
return_value->type = IS_LONG;
} else {
list_entry *index_ptr, new_index_ptr;
/* first we check the hash for the hashed_details key. if it exists,
! * it should point us to the right offset where the actual pgsql ib_link sits.
! * if it doesn't, open a new pgsql ib_link, add it to the resource list,
* and add a pointer to it with hashed_details as the key.
*/
if (_php3_hash_find(list,hashed_details,hashed_details_length+1,(void **)
&index_ptr)==SUCCESS) {
! int type,xlink;
void *ptr;
if (index_ptr->type != le_index_ptr) {
RETURN_FALSE;
}
! xlink = (int) index_ptr->ptr;
! ptr = php3_list_find(xlink,&type); /* check if the xlink is still there */
if (ptr && (type==IBASE_GLOBAL(php3_ibase_module).le_link ||
type==IBASE_GLOBAL(php3_ibase_module).le_plink)) {
! return_value->value.lval = IBASE_GLOBAL(php3_ibase_module).default_link = xlink;
return_value->type = IS_LONG;
efree(hashed_details);
return;
***************
*** 406,420 ****
efree(hashed_details);
RETURN_FALSE;
}
! /* create the link */
! if (_php_ibase_attach_db(ib_server, ib_uname, ib_uname_len, ib_passwd, ib_passwd_len,
&db_handle)) {
efree(hashed_details);
RETURN_FALSE;
}
/* add it to the list */
! return_value->value.lval = php3_list_insert(db_handle,
IBASE_GLOBAL(php3_ibase_module).le_link);
return_value->type = IS_LONG;
/* add it to the hash */
--- 489,507 ----
efree(hashed_details);
RETURN_FALSE;
}
! /* create the ib_link */
! if (_php_ibase_attach_db(ib_server, ib_uname, ib_passwd, NULL, 0, NULL, &db_handle)) {
efree(hashed_details);
RETURN_FALSE;
}
+ ib_link = (ibase_db_link *) emalloc(sizeof(ibase_db_link));
+ ib_link->link = db_handle;
+ ib_link->default_trans = NULL;
+
/* add it to the list */
! return_value->value.lval = php3_list_insert(ib_link,
IBASE_GLOBAL(php3_ibase_module).le_link);
return_value->type = IS_LONG;
/* add it to the hash */
***************
*** 451,484 ****
Close an InterBase connection */
void php3_ibase_close(INTERNAL_FUNCTION_PARAMETERS)
{
! pval *ibase_link;
! int id, type;
isc_db_handle db_handle;
IBASE_TLS_VARS;
switch (ARG_COUNT(ht)) {
case 0:
! id = IBASE_GLOBAL(php3_ibase_module).default_link;
break;
case 1:
! if (getParameters(ht, 1, &ibase_link) == FAILURE) {
RETURN_FALSE;
}
! convert_to_long(ibase_link);
! id = ibase_link->value.lval;
break;
default:
WRONG_PARAM_COUNT;
break;
}
! db_handle = (isc_db_handle) php3_list_find(id, &type);
if (type!=IBASE_GLOBAL(php3_ibase_module).le_link &&
type!=IBASE_GLOBAL(php3_ibase_module).le_plink) {
! php3_error(E_WARNING, "%d is not an InterBase link index",id);
RETURN_FALSE;
}
! php3_list_delete(ibase_link->value.lval);
RETURN_TRUE;
}
/* }}} */
--- 538,572 ----
Close an InterBase connection */
void php3_ibase_close(INTERNAL_FUNCTION_PARAMETERS)
{
! pval *link_arg;
! ibase_db_link *ib_link;
! int link_id, type;
isc_db_handle db_handle;
IBASE_TLS_VARS;
switch (ARG_COUNT(ht)) {
case 0:
! link_id = IBASE_GLOBAL(php3_ibase_module).default_link;
break;
case 1:
! if (getParameters(ht, 1, &link_arg) == FAILURE) {
RETURN_FALSE;
}
! convert_to_long(link_arg);
! link_id = link_arg->value.lval;
break;
default:
WRONG_PARAM_COUNT;
break;
}
! ib_link = (ibase_db_link *) php3_list_find(link_id, &type);
if (type!=IBASE_GLOBAL(php3_ibase_module).le_link &&
type!=IBASE_GLOBAL(php3_ibase_module).le_plink) {
! php3_error(E_WARNING, "%d is not an InterBase link index",link_id);
RETURN_FALSE;
}
! php3_list_delete(link_id);
RETURN_TRUE;
}
/* }}} */
***************
*** 490,505 ****
XSQLDA *isqlda;
isqlda = (XSQLDA *) emalloc(XSQLDA_LENGTH(0));
! isqlda->sqln = 0;
! isqlda->version = SQLDA_VERSION1;
if (isc_dsql_allocate_statement(status, &db, query_handle)) {
! php3_error(E_WARNING, "InterBase: couldn't allocate space for query");
return NULL;
}
if (isc_dsql_prepare(status, &tr, query_handle, 0, query, 1, isqlda)) {
! php3_error(E_WARNING, "InterBase: couldn't prepare query");
return NULL;
}
--- 578,595 ----
XSQLDA *isqlda;
isqlda = (XSQLDA *) emalloc(XSQLDA_LENGTH(0));
! isqlda->sqln = 0;
! isqlda->version = SQLDA_VERSION1;
if (isc_dsql_allocate_statement(status, &db, query_handle)) {
! efree(isqlda);
! _php3_isc_interprete(status);
return NULL;
}
if (isc_dsql_prepare(status, &tr, query_handle, 0, query, 1, isqlda)) {
! efree(isqlda);
! _php3_isc_interprete(status);
return NULL;
}
***************
*** 510,516 ****
if (isc_dsql_describe_bind(status, query_handle, 1, isqlda)) {
! php3_error(E_WARNING, "InterBase: couldn't describe placeholders in query");
}
if (isqlda->sqld > 1) {
--- 600,608 ----
if (isc_dsql_describe_bind(status, query_handle, 1, isqlda)) {
! efree(isqlda);
! _php3_isc_interprete(status);
! return NULL;
}
if (isqlda->sqld > 1) {
***************
*** 518,524 ****
isqlda->sqln = isqlda->sqld;
isqlda->version = SQLDA_VERSION1;
if (isc_dsql_describe(status, query_handle, 1, isqlda)) {
! php3_error(E_WARNING, "InterBase: couldn't describe query");
}
return isqlda;
} else if (isqlda->sqld == 1) {
--- 610,618 ----
isqlda->sqln = isqlda->sqld;
isqlda->version = SQLDA_VERSION1;
if (isc_dsql_describe(status, query_handle, 1, isqlda)) {
! efree(isqlda);
! _php3_isc_interprete(status);
! return NULL;
}
return isqlda;
} else if (isqlda->sqld == 1) {
***************
*** 536,543 ****
int i, coltype;
static char query_info[] = { isc_info_sql_stmt_type };
char info_buffer[18];
! short l;
! long query_type;
XSQLDA *osqlda;
/*
--- 630,637 ----
int i, coltype;
static char query_info[] = { isc_info_sql_stmt_type };
char info_buffer[18];
! short l;
! long query_type;
XSQLDA *osqlda;
/*
***************
*** 559,565 ****
osqlda->version = SQLDA_VERSION1;
if (isc_dsql_describe(status, &query_handle, 1, osqlda)) {
! php3_error(E_WARNING, "InterBase: couldn't describe query");
}
if (osqlda->sqld) {
--- 653,661 ----
osqlda->version = SQLDA_VERSION1;
if (isc_dsql_describe(status, &query_handle, 1, osqlda)) {
! efree(osqlda);
! _php3_isc_interprete(status);
! return NULL;
}
if (osqlda->sqld) {
***************
*** 567,573 ****
osqlda->sqln = osqlda->sqld;
osqlda->version = SQLDA_VERSION1;
if (isc_dsql_describe(status, &query_handle, 1, osqlda)) {
! php3_error(E_WARNING, "InterBase: couldn't describe query");
}
}
for (i = 0; i < osqlda->sqld; i++) {
--- 663,671 ----
osqlda->sqln = osqlda->sqld;
osqlda->version = SQLDA_VERSION1;
if (isc_dsql_describe(status, &query_handle, 1, osqlda)) {
! efree(osqlda);
! _php3_isc_interprete(status);
! return NULL;
}
}
for (i = 0; i < osqlda->sqld; i++) {
***************
*** 606,612 ****
}
if (isqlda == NULL) {
if (isc_dsql_execute(status, &tr_handle, &query_handle, 1, NULL)) {
! php3_error(E_WARNING, "InterBase: couldn't execute query");
return NULL;
} else {
return osqlda;
--- 704,711 ----
}
if (isqlda == NULL) {
if (isc_dsql_execute(status, &tr_handle, &query_handle, 1, NULL)) {
! efree(osqlda);
! _php3_isc_interprete(status);
return NULL;
} else {
return osqlda;
***************
*** 614,620 ****
} else {
if (isc_dsql_execute2(status, &tr_handle, &query_handle, 1, isqlda, osqlda)) {
! php3_error(E_WARNING, "InterBase: couldn't execute query");
return NULL;
} else {
return osqlda;
--- 713,720 ----
} else {
if (isc_dsql_execute2(status, &tr_handle, &query_handle, 1, isqlda, osqlda)) {
! efree(osqlda);
! _php3_isc_interprete(status);
return NULL;
} else {
return osqlda;
***************
*** 624,630 ****
} else {
/* Not select */
if (isc_dsql_execute(status, &tr_handle, &query_handle, 1, isqlda)) {
! php3_error(E_WARNING, "InterBase: couldn't execute query");
}
/*
if (!php3_ibase_module.manualtransactions) {
--- 724,732 ----
} else {
/* Not select */
if (isc_dsql_execute(status, &tr_handle, &query_handle, 1, isqlda)) {
! efree(osqlda);
! _php3_isc_interprete(status);
! return NULL;
}
/*
if (!php3_ibase_module.manualtransactions) {
***************
*** 641,653 ****
}
/* }}} */
/* {{{ proto int ibase_query([int link_identifier, ]string query)
Execute a query (without parameter placeholders). */
void php3_ibase_query(INTERNAL_FUNCTION_PARAMETERS)
{
! pval *query, *ibase_link;
! int id, type;
! isc_db_handle db_handle;
isc_tr_handle tr_handle = NULL;
isc_stmt_handle query_handle = NULL;
ISC_STATUS status[20];
--- 743,928 ----
}
/* }}} */
+ /* {{{ proto int ibase_trans([int link_identifier, ][string trans_args])
+ Start transaction */
+ void php3_ibase_trans(INTERNAL_FUNCTION_PARAMETERS)
+ {
+ pval *link_arg, *trans_arg;
+ char tpb[20], *tpbp = NULL, *trans_args = NULL;
+ int tpb_len = 0, link_id, trans_id, type, trans_def = 0, slot;
+ ibase_db_link *ib_link;
+ ibase_trans *ib_trans;
+ isc_tr_handle tr_handle = NULL;
+ ISC_STATUS status[20];
+ IBASE_TLS_VARS;
+
+
+ switch (ARG_COUNT(ht)) {
+ case 0:
+ link_id = IBASE_GLOBAL(php3_ibase_module).default_link;
+ break;
+ case 1:
+ if (getParameters(ht, 1, &trans_arg) == FAILURE) {
+ RETURN_FALSE;
+ }
+ link_id = IBASE_GLOBAL(php3_ibase_module).default_link;
+ convert_to_string(trans_arg);
+ trans_args = trans_arg->value.str.val;
+ break;
+ case 2:
+ if (getParameters(ht, 2, &link_arg, &trans_arg) == FAILURE) {
+ RETURN_FALSE;
+ }
+ convert_to_long(link_arg);
+ link_id = link_arg->value.lval;
+ convert_to_string(trans_arg);
+ trans_args = trans_arg->value.str.val;
+ break;
+ default:
+ WRONG_PARAM_COUNT;
+ break;
+ }
+ ib_link = (ibase_db_link *) php3_list_find(link_id, &type);
+ if (type!=IBASE_GLOBAL(php3_ibase_module).le_link &&
type!=IBASE_GLOBAL(php3_ibase_module).le_plink) {
+ php3_error(E_WARNING, "%d is not an InterBase link index",link_id);
+ RETURN_FALSE;
+ }
+ if(trans_args){
+ tpb[tpb_len++] = isc_tpb_version3;
+ tpbp = tpb;
+ if(strstr(trans_args,"DEFAULT")){
+ trans_def = 1;
+ if(ib_link->default_trans != NULL){
+ php3_error(E_WARNING, "InterBase: DEFAULT transaction already started");
+ RETURN_FALSE;
+ }
+ }
+ /* access mode */
+ if(strstr(trans_args,"READ")) /* READ ONLY TRANSACTION */
+ tpb[tpb_len++] = isc_tpb_read;
+ else
+ tpb[tpb_len++] = isc_tpb_write;
+ /* isolation level */
+ if(strstr(trans_args,"COMMITED"))
+ tpb[tpb_len++] = isc_tpb_read_committed;
+ else if (strstr(trans_args,"CONSISTENCY"))
+ tpb[tpb_len++] = isc_tpb_consistency;
+ else
+ tpb[tpb_len++] = isc_tpb_concurrency;
+ /* lock resolution */
+ if(strstr(trans_args,"NOWAIT"))
+ tpb[tpb_len++] = isc_tpb_nowait;
+ else
+ tpb[tpb_len++] = isc_tpb_wait;
+
+ }
+
+ if (isc_start_transaction(status, &tr_handle, 1, &ib_link->link, tpb_len, tpbp)) {
+ _php3_isc_interprete(status);
+ RETURN_FALSE;
+ }
+
+ if(trans_def){
+ ib_link->default_trans = tr_handle;
+ RETURN_TRUE;
+ }else{
+ ib_trans = (ibase_trans *) emalloc(sizeof(ibase_trans));
+ ib_trans->trans = tr_handle;
+ trans_id = php3_list_insert(ib_trans, IBASE_GLOBAL(php3_ibase_module).le_trans);
+ RETURN_LONG(trans_id);
+ }
+ }
+ /* }}} */
+
+ /* {{{ _php3_ibase_trans_end() */
+ #define COMMIT 1
+ #define ROLLBACK 0
+ static void _php3_ibase_trans_end(INTERNAL_FUNCTION_PARAMETERS, int commit)
+ {
+ pval *trans_arg;
+ int trans_id, type;
+ ibase_db_link *ib_link;
+ ibase_trans *ib_trans;
+ isc_tr_handle tr_handle;
+ ISC_STATUS status[20];
+ IBASE_TLS_VARS;
+
+ switch (ARG_COUNT(ht)) {
+ case 0:
+ trans_id = IBASE_GLOBAL(php3_ibase_module).default_link;
+ break;
+ case 1:
+ if (getParameters(ht, 1, &trans_arg) == FAILURE) {
+ RETURN_FALSE;
+ }
+ convert_to_long(trans_arg);
+ trans_id = trans_arg->value.lval;
+ break;
+ default:
+ WRONG_PARAM_COUNT;
+ break;
+ }
+ ib_trans = (ibase_trans *) php3_list_find(trans_id, &type);
+ ib_link = (ibase_db_link *)ib_trans;
+ if (type==IBASE_GLOBAL(php3_ibase_module).le_link ||
type==IBASE_GLOBAL(php3_ibase_module).le_plink) {
+ ib_link = (ibase_db_link *)ib_trans; /* default transaction */
+ ib_trans = NULL;
+ tr_handle = ib_link->default_trans;
+ }else if (type==IBASE_GLOBAL(php3_ibase_module).le_trans){
+ ib_link = NULL; /* manual transaction */
+ tr_handle = ib_trans->trans;
+ }else{
+ php3_error(E_WARNING, "%d is not an InterBase link or transaction index",trans_id);
+ RETURN_FALSE;
+ }
+
+ if (commit) {
+ if(isc_commit_transaction(status, &tr_handle)){
+ _php3_isc_interprete(status);
+ RETURN_FALSE;
+ }
+ }else{
+ if(isc_rollback_transaction(status, &tr_handle)){
+ _php3_isc_interprete(status);
+ RETURN_FALSE;
+ }
+ }
+
+ if(ib_link){ /* default transaction */
+ ib_link->default_trans = NULL;
+ }else{ /* manual transaction */
+ ib_trans->trans = NULL; /* already commited or rolled...*/
+ php3_list_delete(trans_id);
+ }
+
+ RETURN_TRUE;
+ }
+ /* }}} */
+
+ /* {{{ proto int ibase_commit([int link_identifier, ] int trans_number)
+ Commit transaction */
+ void php3_ibase_commit(INTERNAL_FUNCTION_PARAMETERS)
+ {
+ _php3_ibase_trans_end(INTERNAL_FUNCTION_PARAM_PASSTHRU, COMMIT);
+ }
+ /* }}} */
+
+ /* {{{ proto int ibase_rollback([int link_identifier, ] int trans_number)
+ Roolback transaction */
+ void php3_ibase_rollback(INTERNAL_FUNCTION_PARAMETERS)
+ {
+ _php3_ibase_trans_end(INTERNAL_FUNCTION_PARAM_PASSTHRU, ROLLBACK);
+ }
+ /* }}} */
+
/* {{{ proto int ibase_query([int link_identifier, ]string query)
Execute a query (without parameter placeholders). */
void php3_ibase_query(INTERNAL_FUNCTION_PARAMETERS)
{
! pval *link_arg, *query_arg, *trans_arg;
! int link_id, trans_id = 0, type, trans_query = 0;
! ibase_db_link *ib_link;
! ibase_trans *ib_trans;
isc_tr_handle tr_handle = NULL;
isc_stmt_handle query_handle = NULL;
ISC_STATUS status[20];
***************
*** 657,697 ****
switch (ARG_COUNT(ht)) {
case 1:
! if (getParameters(ht, 1, &query) == FAILURE) {
RETURN_FALSE;
}
! id = IBASE_GLOBAL(php3_ibase_module).default_link;
break;
case 2:
! if (getParameters(ht, 2, &ibase_link, &query) == FAILURE) {
RETURN_FALSE;
}
! convert_to_long(ibase_link);
! id = ibase_link->value.lval;
break;
default:
WRONG_PARAM_COUNT;
break;
}
! db_handle = (isc_db_handle) php3_list_find(id, &type);
if (type!=IBASE_GLOBAL(php3_ibase_module).le_link &&
type!=IBASE_GLOBAL(php3_ibase_module).le_plink) {
! php3_error(E_WARNING, "%d is not an InterBase link index", id);
RETURN_FALSE;
}
-
- convert_to_string(query);
! if (!IBASE_GLOBAL(php3_ibase_module).manualtransactions) {
! if (isc_start_transaction(status, &tr_handle, 1, &db_handle, 0, NULL)) {
! php3_error(E_WARNING, "InterBase: couldn't start transaction");
RETURN_FALSE;
}
! }
! isqlda = _php3_ibase_prepare(db_handle, tr_handle, &query_handle, query->value.str.val);
if (isqlda != NULL) {
! isc_rollback_transaction(status, &tr_handle);
isc_dsql_free_statement(status, &query_handle, DSQL_drop);
php3_error(E_WARNING, "InterBase: ibase_query doesn't support parameter placeholders
in query");
RETURN_FALSE;
--- 932,991 ----
switch (ARG_COUNT(ht)) {
case 1:
! if (getParameters(ht, 1, &query_arg) == FAILURE) {
RETURN_FALSE;
}
! link_id = IBASE_GLOBAL(php3_ibase_module).default_link;
break;
case 2:
! if (getParameters(ht, 2, &link_arg, &query_arg) == FAILURE) {
RETURN_FALSE;
}
! convert_to_long(link_arg);
! link_id = link_arg->value.lval;
! break;
! case 3:
! if (getParameters(ht, 3, &link_arg, &query_arg, &trans_arg) == FAILURE) {
! RETURN_FALSE;
! }
! convert_to_long(link_arg);
! link_id = link_arg->value.lval;
! convert_to_long(trans_arg);
! trans_id = trans_arg->value.lval;
break;
default:
WRONG_PARAM_COUNT;
break;
}
! ib_link = (ibase_db_link *) php3_list_find(link_id, &type);
if (type!=IBASE_GLOBAL(php3_ibase_module).le_link &&
type!=IBASE_GLOBAL(php3_ibase_module).le_plink) {
! php3_error(E_WARNING, "%d is not an InterBase link index",link_id);
RETURN_FALSE;
}
! if(trans_id != 0){ /* manual transaction */
! ib_trans = (ibase_trans *) php3_list_find(trans_id, &type);
! if (type!=IBASE_GLOBAL(php3_ibase_module).le_trans) {
! php3_error(E_WARNING, "%d is not an InterBase transaction index",trans_id);
RETURN_FALSE;
}
! tr_handle = ib_trans->trans;
! }else if (ib_link->default_trans == NULL) { /* separate transaction */
! trans_query = 1;
! if (isc_start_transaction(status, &tr_handle, 1, &ib_link->link, 0, NULL)) {
! _php3_isc_interprete(status);
! RETURN_FALSE;
! }
! } else
! tr_handle = ib_link->default_trans;
!
! convert_to_string(query_arg);
! isqlda = _php3_ibase_prepare(ib_link->link, tr_handle, &query_handle,
query_arg->value.str.val);
if (isqlda != NULL) {
! if(trans_query)
! isc_rollback_transaction(status, &tr_handle);
isc_dsql_free_statement(status, &query_handle, DSQL_drop);
php3_error(E_WARNING, "InterBase: ibase_query doesn't support parameter placeholders
in query");
RETURN_FALSE;
***************
*** 702,758 ****
ibase_result = (ibase_result_handle *) emalloc(sizeof(ibase_result_handle));
ibase_result->result = query_handle;
ibase_result->sqlda = osqlda;
! ibase_result->trans = tr_handle;
! ibase_result->commitok = 1;
return_value->value.lval = php3_list_insert(ibase_result, php3_ibase_module.le_result);
return_value->type = IS_LONG;
} else {
! if (status[0] == 1 && status[1]) {
! if (!IBASE_GLOBAL(php3_ibase_module).manualtransactions) {
isc_rollback_transaction(status, &tr_handle);
isc_dsql_free_statement(status, &query_handle, DSQL_drop);
RETURN_FALSE;
! }
! } else {
! if (!IBASE_GLOBAL(php3_ibase_module).manualtransactions) {
isc_commit_transaction(status, &tr_handle);
isc_dsql_free_statement(status, &query_handle, DSQL_drop);
! RETURN_FALSE;
}
}
}
}
/* }}} */
! /* {{{ proto int ibase_fetch_row(int result)
! Fetch a row from the results of a query. */
! void php3_ibase_fetch_row(INTERNAL_FUNCTION_PARAMETERS)
{
! pval *result;
! pval *pval_ptr;
! int type;
! int i, coltype, collen;
! char string_data[255];
! char *fieldname;
! char *char_data;
! /*
! struct tm t;
! */
ibase_result_handle *ibase_result;
ISC_STATUS status[20];
XSQLVAR *var;
IBASE_VCHAR *vchar;
IBASE_TLS_VARS;
! if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &result)==FAILURE) {
WRONG_PARAM_COUNT;
}
! convert_to_long(result);
! ibase_result = (ibase_result_handle *) php3_list_find(result->value.lval, &type);
if (type!=IBASE_GLOBAL(php3_ibase_module).le_result) {
! php3_error(E_WARNING,"%d is not an InterBase result index", result->value.lval);
RETURN_FALSE;
}
--- 996,1042 ----
ibase_result = (ibase_result_handle *) emalloc(sizeof(ibase_result_handle));
ibase_result->result = query_handle;
ibase_result->sqlda = osqlda;
! ibase_result->result_trans = trans_query ? tr_handle : 0;
return_value->value.lval = php3_list_insert(ibase_result, php3_ibase_module.le_result);
return_value->type = IS_LONG;
} else {
! if (trans_query) {
! if (status[0] == 1 && status[1]) {
isc_rollback_transaction(status, &tr_handle);
isc_dsql_free_statement(status, &query_handle, DSQL_drop);
RETURN_FALSE;
! } else {
isc_commit_transaction(status, &tr_handle);
isc_dsql_free_statement(status, &query_handle, DSQL_drop);
! RETURN_TRUE;
}
}
}
}
/* }}} */
! /* {{{ _php3_ibase_fetch_hash() */
! static void _php3_ibase_fetch_hash(INTERNAL_FUNCTION_PARAMETERS)
{
! pval *result_var;
! int type, i, collen;
! char string_data[255], *char_data;
ibase_result_handle *ibase_result;
ISC_STATUS status[20];
XSQLVAR *var;
IBASE_VCHAR *vchar;
IBASE_TLS_VARS;
!
! if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &result_var)==FAILURE) {
WRONG_PARAM_COUNT;
}
! convert_to_long(result_var);
! ibase_result = (ibase_result_handle *) php3_list_find(result_var->value.lval, &type);
if (type!=IBASE_GLOBAL(php3_ibase_module).le_result) {
! php3_error(E_WARNING,"%d is not an InterBase result index",
result_var->value.lval);
RETURN_FALSE;
}
***************
*** 761,866 ****
RETURN_FALSE;
}
- var = ibase_result->sqlda->sqlvar;
-
if (isc_dsql_fetch(status, &ibase_result->result, 1, ibase_result->sqlda) != 100L) {
if (array_init(return_value)==FAILURE) {
RETURN_FALSE;
}
! for (i = 0; i < ibase_result->sqlda->sqld; i++) {
! var[i].sqlname[var[i].sqlname_length] = '\0';
! fieldname = var[i].sqlname;
! if (*var[i].sqlind < 0) {
! /* XXX. Column is NULL. This is not the best idea to do, think something... */
! add_get_index_stringl(return_value, i, NULL, 0, (void **) &pval_ptr, 1);
! _php3_hash_pointer_update(return_value->value.ht, fieldname, var[i].sqlname_length+1,
pval_ptr);
continue;
! }
! coltype = var[i].sqltype & ~1;
! switch(coltype) {
case SQL_TEXT:
{
! int len = var[i].sqllen;
! char_data = (char *)emalloc(sizeof(char)*(var[i].sqllen));
! collen = sprintf(char_data, "%*.*s", len, len,
ibase_result->sqlda->sqlvar[i].sqldata);
if (php3_ini.magic_quotes_runtime) {
int newlen;
char *tmp = _php3_addslashes(char_data, collen, &newlen, 0);
! add_get_index_stringl(return_value, i, tmp, newlen, (void **) &pval_ptr, 0);
} else {
! add_get_index_stringl(return_value, i, char_data, collen, (void **) &pval_ptr, 1);
}
! _php3_hash_pointer_update(return_value->value.ht, fieldname, var[i].sqlname_length+1,
pval_ptr);
efree(char_data);
}
break;
case SQL_VARYING:
{
! vchar = (IBASE_VCHAR *) var[i].sqldata;
! char_data = (char *)emalloc(sizeof(char)*(vchar->var_len));
collen = sprintf(char_data, "%*.*s", vchar->var_len, vchar->var_len,
vchar->var_str);
if (php3_ini.magic_quotes_runtime) {
int newlen;
char *tmp = _php3_addslashes(char_data, collen, &newlen, 0);
! add_get_index_stringl(return_value, i, tmp, newlen, (void **) &pval_ptr, 0);
} else {
! add_get_index_stringl(return_value, i, char_data, collen, (void **) &pval_ptr, 1);
}
! _php3_hash_pointer_update(return_value->value.ht, fieldname, var[i].sqlname_length+1,
pval_ptr);
efree(char_data);
}
break;
case SQL_SHORT:
! collen = sprintf(string_data, "%d", *(short *)(var[i].sqldata));
! add_get_index_stringl(return_value, i, string_data, collen, (void **) &pval_ptr, 1);
! _php3_hash_pointer_update(return_value->value.ht, fieldname, var[i].sqlname_length+1,
pval_ptr);
break;
case SQL_LONG:
! if (var[i].sqlscale) {
int j, f = 1;
float n;
! n = *(long *)(var[i].sqldata);
! for (j = 0; j < -var[i].sqlscale; j++)
f *= 10;
n /= f;
! collen = sprintf(string_data, "%.*f", -var[i].sqlscale, n);
} else {
! collen = sprintf(string_data, "%ld", *(long *)(var[i].sqldata));
}
! add_get_index_stringl(return_value, i, string_data, collen, (void **) &pval_ptr, 1);
! _php3_hash_pointer_update(return_value->value.ht, fieldname, var[i].sqlname_length+1,
pval_ptr);
break;
case SQL_FLOAT:
! collen = sprintf(string_data, "%f", *(float *)(var[i].sqldata));
! add_get_index_stringl(return_value, i, string_data, collen, (void **) &pval_ptr, 1);
! _php3_hash_pointer_update(return_value->value.ht, fieldname, var[i].sqlname_length+1,
pval_ptr);
break;
case SQL_DOUBLE:
! if (ibase_result->sqlda->sqlvar[i].sqlscale) {
! collen = sprintf(string_data, "%.*f", -var[i].sqlscale, *(double
*)(var[i].sqldata));
} else {
! collen = sprintf(string_data, "%f", *(double *)(var[i].sqldata));
}
! add_get_index_stringl(return_value, i, string_data, collen, (void **) &pval_ptr, 1);
! _php3_hash_pointer_update(return_value->value.ht, fieldname, var[i].sqlname_length+1,
pval_ptr);
break;
case SQL_DATE: {
! struct tm *t;
! t = emalloc(sizeof(struct tm));
! isc_decode_date((ISC_QUAD *) var[i].sqldata, t);
! /*
#if HAVE_STRFTIME
! collen = (int) strftime(string_data, 255, IBASE_GLOBAL(php3_ibase_module).timeformat, t);
#else
! */
! collen = sprintf(string_data, "%4d-%02d-%02d %02d:%02d:%02d", t->tm_year+1900,
t->tm_mon+1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);
! /* #endif */
! add_get_index_stringl(return_value, i, string_data, collen, (void **) &pval_ptr, 1);
! _php3_hash_pointer_update(return_value->value.ht, fieldname, var[i].sqlname_length+1,
pval_ptr);
! efree(t);
}
break;
case SQL_BLOB:
--- 1045,1141 ----
RETURN_FALSE;
}
if (isc_dsql_fetch(status, &ibase_result->result, 1, ibase_result->sqlda) != 100L) {
if (array_init(return_value)==FAILURE) {
RETURN_FALSE;
}
! var = ibase_result->sqlda->sqlvar;
! for (i = 0; i < ibase_result->sqlda->sqld; i++, var++) {
! if (*var->sqlind == -1) /* in SQL null, in PHP variable not set */
continue;
! switch(var->sqltype & ~1) {
case SQL_TEXT:
{
! char_data = (char *)emalloc(sizeof(char)*(var->sqllen+1));
! collen = sprintf(char_data, "%*.*s", var->sqllen, var->sqllen,
var->sqldata);
if (php3_ini.magic_quotes_runtime) {
int newlen;
char *tmp = _php3_addslashes(char_data, collen, &newlen, 0);
! add_get_index_stringl(return_value, i, tmp, newlen, (void **) &result_var, 0);
} else {
! add_get_index_stringl(return_value, i, char_data, collen, (void **) &result_var, 1);
}
! _php3_hash_pointer_update(return_value->value.ht, var->sqlname,
var->sqlname_length+1, result_var);
efree(char_data);
}
break;
case SQL_VARYING:
{
! vchar = (IBASE_VCHAR *) var->sqldata;
! char_data = (char *)emalloc(sizeof(char)*(vchar->var_len+1));
collen = sprintf(char_data, "%*.*s", vchar->var_len, vchar->var_len,
vchar->var_str);
if (php3_ini.magic_quotes_runtime) {
int newlen;
char *tmp = _php3_addslashes(char_data, collen, &newlen, 0);
! add_get_index_stringl(return_value, i, tmp, newlen, (void **) &result_var, 0);
} else {
! add_get_index_stringl(return_value, i, char_data, collen, (void **) &result_var, 1);
}
! _php3_hash_pointer_update(return_value->value.ht, var->sqlname,
var->sqlname_length+1, result_var);
efree(char_data);
}
break;
case SQL_SHORT:
! collen = sprintf(string_data, "%d", *(short *)(var->sqldata));
! add_get_index_stringl(return_value, i, string_data, collen, (void **) &result_var, 1);
! _php3_hash_pointer_update(return_value->value.ht, var->sqlname,
var->sqlname_length+1, result_var);
break;
case SQL_LONG:
! if (var->sqlscale) {
int j, f = 1;
float n;
! n = *(long *)(var->sqldata);
! for (j = 0; j < -var->sqlscale; j++)
f *= 10;
n /= f;
! collen = sprintf(string_data, "%.*f", -var->sqlscale, n);
} else {
! collen = sprintf(string_data, "%ld", *(long *)(var->sqldata));
}
! add_get_index_stringl(return_value, i, string_data, collen, (void **) &result_var, 1);
! _php3_hash_pointer_update(return_value->value.ht, var->sqlname,
var->sqlname_length+1, result_var);
break;
case SQL_FLOAT:
! collen = sprintf(string_data, "%f", *(float *)(var->sqldata));
! add_get_index_stringl(return_value, i, string_data, collen, (void **) &result_var, 1);
! _php3_hash_pointer_update(return_value->value.ht, var->sqlname,
var->sqlname_length+1, result_var);
break;
case SQL_DOUBLE:
! if (var->sqlscale) {
! collen = sprintf(string_data, "%.*f", -var->sqlscale, *(double
*)(var->sqldata));
} else {
! collen = sprintf(string_data, "%f", *(double *)(var->sqldata));
}
! add_get_index_stringl(return_value, i, string_data, collen, (void **) &result_var, 1);
! _php3_hash_pointer_update(return_value->value.ht, var->sqlname,
var->sqlname_length+1, result_var);
break;
case SQL_DATE: {
! struct tm t;
! isc_decode_date((ISC_QUAD *) var->sqldata, &t);
!
#if HAVE_STRFTIME
! collen = (int) strftime(string_data, 255, IBASE_GLOBAL(php3_ibase_module).timeformat,
&t);
#else
! if(!t.tm_hour && !t.tm_min && !t.tm_sec)
! collen = sprintf(string_data, "%4d-%02d-%02d", t.tm_year+1900, t.tm_mon+1,
t.tm_mday);
! else
! collen = sprintf(string_data, "%4d-%02d-%02d %02d:%02d:%02d", t.tm_year+1900,
t.tm_mon+1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec);
! #endif
! add_get_index_stringl(return_value, i, string_data, collen, (void **) &result_var, 1);
! _php3_hash_pointer_update(return_value->value.ht, var->sqlname,
var->sqlname_length+1, result_var);
}
break;
case SQL_BLOB:
***************
*** 868,877 ****
{
/* TODO, currently just show the id */
ISC_QUAD bid;
! bid = *(ISC_QUAD ISC_FAR *) var[i].sqldata;
sprintf(string_data, "%lx:%lx", bid.isc_quad_high, bid.isc_quad_low);
! add_get_index_stringl(return_value, i, string_data, collen, (void **) &pval_ptr, 1);
! _php3_hash_pointer_update(return_value->value.ht, fieldname, var[i].sqlname_length+1,
pval_ptr);
}
break;
default:
--- 1143,1152 ----
{
/* TODO, currently just show the id */
ISC_QUAD bid;
! bid = *(ISC_QUAD ISC_FAR *) var->sqldata;
sprintf(string_data, "%lx:%lx", bid.isc_quad_high, bid.isc_quad_low);
! add_get_index_stringl(return_value, i, string_data, collen, (void **) &result_var, 1);
! _php3_hash_pointer_update(return_value->value.ht, var->sqlname,
var->sqlname_length+1, result_var);
}
break;
default:
***************
*** 884,914 ****
}
/* }}} */
/* {{{ proto int ibase_free_result(int result)
Free the memory used by a result. */
void php3_ibase_free_result(INTERNAL_FUNCTION_PARAMETERS)
{
! pval *result;
ibase_result_handle *ibase_result;
int type;
IBASE_TLS_VARS;
! if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &result)==FAILURE) {
WRONG_PARAM_COUNT;
}
! convert_to_long(result);
! if (result->value.lval==0) {
RETURN_FALSE;
}
! ibase_result = (ibase_result_handle *) php3_list_find(result->value.lval,&type);
if (type!=IBASE_GLOBAL(php3_ibase_module).le_result) {
! php3_error(E_WARNING,"%d is not an InterBase result index",result->value.lval);
RETURN_FALSE;
}
! php3_list_delete(result->value.lval);
RETURN_TRUE;
}
/* }}} */
--- 1159,1208 ----
}
/* }}} */
+ /* {{{ proto array ibase_fetch_row(int result)
+ Fetch a row from the results of a query. */
+ void php3_ibase_fetch_row(INTERNAL_FUNCTION_PARAMETERS)
+ {
+ _php3_ibase_fetch_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU);
+ }
+ /* }}} */
+
+ /* {{{ proto array ibase_fetch_object(int result)
+ Fetch a object from the results of a query. */
+ void php3_ibase_fetch_object(INTERNAL_FUNCTION_PARAMETERS)
+ {
+ _php3_ibase_fetch_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU);
+ if (return_value->type==IS_ARRAY) {
+ return_value->type = IS_OBJECT;
+ }
+ }
+ /* }}} */
+
/* {{{ proto int ibase_free_result(int result)
Free the memory used by a result. */
void php3_ibase_free_result(INTERNAL_FUNCTION_PARAMETERS)
{
! pval *result_var;
ibase_result_handle *ibase_result;
int type;
IBASE_TLS_VARS;
! if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &result_var)==FAILURE) {
WRONG_PARAM_COUNT;
}
! convert_to_long(result_var);
! if (result_var->value.lval==0) {
RETURN_FALSE;
}
! ibase_result = (ibase_result_handle *) php3_list_find(result_var->value.lval,&type);
if (type!=IBASE_GLOBAL(php3_ibase_module).le_result) {
! php3_error(E_WARNING,"%d is not an InterBase result index",result_var->value.lval);
RETURN_FALSE;
}
! php3_list_delete(result_var->value.lval);
RETURN_TRUE;
}
/* }}} */
***************
*** 954,962 ****
convert_to_string(query);
! if (!IBASE_GLOBAL(php3_ibase_module).manualtransactions) {
if (isc_start_transaction(status, &tr_handle, 1, &db_handle, 0, NULL)) {
! php3_error(E_WARNING, "InterBase: couldn't start transaction");
RETURN_FALSE;
}
}
--- 1248,1256 ----
convert_to_string(query);
! if (1/*!IBASE_GLOBAL(php3_ibase_module).manualtransactions*/) {
if (isc_start_transaction(status, &tr_handle, 1, &db_handle, 0, NULL)) {
! _php3_isc_interprete(status);
RETURN_FALSE;
}
}
***************
*** 965,971 ****
ibase_query = (ibase_query_handle *) emalloc(sizeof(ibase_query_handle));
ibase_query->query = query_handle;
ibase_query->sqlda = isqlda;
! ibase_query->trans = tr_handle;
ibase_query->alloced = 0;
return_value->value.lval = php3_list_insert(ibase_query, php3_ibase_module.le_query);
return_value->type = IS_LONG;
--- 1259,1265 ----
ibase_query = (ibase_query_handle *) emalloc(sizeof(ibase_query_handle));
ibase_query->query = query_handle;
ibase_query->sqlda = isqlda;
! ibase_query->query_trans = tr_handle;
ibase_query->alloced = 0;
return_value->value.lval = php3_list_insert(ibase_query, php3_ibase_module.le_query);
return_value->type = IS_LONG;
***************
*** 1060,1066 ****
RETURN_FALSE;
}
! osqlda = _php3_ibase_execute(ibase_query->trans, ibase_query->query, ibase_query->sqlda,
status);
ibase_result = (ibase_result_handle *) emalloc(sizeof(ibase_result_handle));
ibase_result->result = ibase_query->query;
ibase_result->sqlda = osqlda;
--- 1354,1361 ----
RETURN_FALSE;
}
! /* FIXME: manual and other trans todo...*/
! osqlda = _php3_ibase_execute(ibase_query->query_trans, ibase_query->query,
ibase_query->sqlda, status);
ibase_result = (ibase_result_handle *) emalloc(sizeof(ibase_result_handle));
ibase_result->result = ibase_query->query;
ibase_result->sqlda = osqlda;
***************
*** 1073,1099 ****
Free memory used by a query */
void php3_ibase_free_query(INTERNAL_FUNCTION_PARAMETERS)
{
! pval *query;
ibase_query_handle *ibase_query;
int type;
IBASE_TLS_VARS;
! if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &query)==FAILURE) {
WRONG_PARAM_COUNT;
}
! convert_to_long(query);
! if (query->value.lval==0) {
RETURN_FALSE;
}
! ibase_query = (ibase_query_handle *) php3_list_find(query->value.lval, &type);
if (type!=IBASE_GLOBAL(php3_ibase_module).le_query) {
! php3_error(E_WARNING,"%d is not an InterBase query index", query->value.lval);
RETURN_FALSE;
}
! php3_list_delete(query->value.lval);
RETURN_TRUE;
}
/* }}} */
--- 1368,1394 ----
Free memory used by a query */
void php3_ibase_free_query(INTERNAL_FUNCTION_PARAMETERS)
{
! pval *query_arg;
ibase_query_handle *ibase_query;
int type;
IBASE_TLS_VARS;
! if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &query_arg)==FAILURE) {
WRONG_PARAM_COUNT;
}
! convert_to_long(query_arg);
! if (query_arg->value.lval==0) {
RETURN_FALSE;
}
! ibase_query = (ibase_query_handle *) php3_list_find(query_arg->value.lval, &type);
if (type!=IBASE_GLOBAL(php3_ibase_module).le_query) {
! php3_error(E_WARNING,"%d is not an InterBase query index", query_arg->value.lval);
RETURN_FALSE;
}
! php3_list_delete(query_arg->value.lval);
RETURN_TRUE;
}
/* }}} */
***************
*** 1102,1121 ****
Sets the format of datetime columns returned from queries. Still nonfunctional. */
void php3_ibase_timefmt(INTERNAL_FUNCTION_PARAMETERS)
{
! pval *pmode;
IBASE_TLS_VARS;
#if HAVE_STRFTIME
! if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &pmode)==FAILURE) {
WRONG_PARAM_COUNT;
}
! convert_to_string(pmode);
!
RETURN_TRUE;
#else
php3_error(E_WARNING,"InterBase: ibase_timefmt not supported on this platform");
RETURN_FALSE;
#endif
}
/* }}} */
--- 1397,1519 ----
Sets the format of datetime columns returned from queries. Still nonfunctional. */
void php3_ibase_timefmt(INTERNAL_FUNCTION_PARAMETERS)
{
! pval *fmt;
IBASE_TLS_VARS;
#if HAVE_STRFTIME
! if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &fmt)==FAILURE) {
WRONG_PARAM_COUNT;
}
! convert_to_string(fmt);
! efree(IBASE_GLOBAL(php3_ibase_module).timeformat);
! IBASE_GLOBAL(php3_ibase_module).timeformat = estrndup(fmt->value.str.val,
fmt->value.str.len);
RETURN_TRUE;
#else
php3_error(E_WARNING,"InterBase: ibase_timefmt not supported on this platform");
RETURN_FALSE;
#endif
+ }
+ /* }}} */
+
+ /* {{{ proto int ibase_num_fields(int result)
+ Get the number of fields in result */
+ void php3_ibase_num_fields(INTERNAL_FUNCTION_PARAMETERS)
+ {
+ pval *result;
+ int type;
+ ibase_result_handle *ibase_result;
+
+ if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &result)==FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+
+ convert_to_long(result);
+ ibase_result = (ibase_result_handle *) php3_list_find(result->value.lval, &type);
+
+ if (type!=IBASE_GLOBAL(php3_ibase_module).le_result) {
+ php3_error(E_WARNING,"%d is not an InterBase result index", result->value.lval);
+ RETURN_FALSE;
+ }
+
+ if (ibase_result->sqlda == NULL) {
+ php3_error(E_WARNING,"InterBase: trying to get num fields from a non-select query");
+ RETURN_FALSE;
+ }
+
+ return_value->value.lval = ibase_result->sqlda->sqld;
+ return_value->type = IS_LONG;
+ }
+ /* }}} */
+
+ /* {{{ proto array ibase_field_info(int result, int field_number)
+ Get information about a field */
+ void php3_ibase_field_info(INTERNAL_FUNCTION_PARAMETERS)
+ {
+ pval *result, *field;
+ int type, len;
+ ibase_result_handle *ibase_result;
+ char buf[30], *s;
+ XSQLVAR *var;
+ IBASE_VCHAR *vchar;
+ IBASE_TLS_VARS;
+
+ if (ARG_COUNT(ht)!=2 || getParameters(ht, 2, &result, &field)==FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+
+ convert_to_long(result);
+ ibase_result = (ibase_result_handle *) php3_list_find(result->value.lval, &type);
+
+ if (type!=IBASE_GLOBAL(php3_ibase_module).le_result) {
+ php3_error(E_WARNING,"%d is not an InterBase result index", result->value.lval);
+ RETURN_FALSE;
+ }
+
+ if (ibase_result->sqlda == NULL) {
+ php3_error(E_WARNING,"InterBase: trying to get field info from a non-select query");
+ RETURN_FALSE;
+ }
+
+ convert_to_long(field);
+
+ if (field->value.lval<0 || field->value.lval>=ibase_result->sqlda->sqld)
+ RETURN_FALSE;
+
+ if (array_init(return_value)==FAILURE)
+ RETURN_FALSE;
+
+ var = ibase_result->sqlda->sqlvar + field->value.lval;
+
+ add_get_index_stringl(return_value, 0, var->sqlname, var->sqlname_length, (void **)
&result, 1);
+ _php3_hash_pointer_update(return_value->value.ht, "name", sizeof(char)*5, result);
+
+ add_get_index_stringl(return_value, 1, var->relname, var->relname_length, (void **)
&result, 1);
+ _php3_hash_pointer_update(return_value->value.ht, "relation", sizeof(char)*9,
result);
+
+ len = sprintf(buf, "%d", var->sqllen);
+ add_get_index_stringl(return_value, 2, buf, len, (void **) &result, 1);
+ _php3_hash_pointer_update(return_value->value.ht, "length", sizeof(char)*7, result);
+
+ switch (var->sqltype & ~1){
+ case SQL_TEXT: s = "TEXT"; break;
+ case SQL_VARYING: s = "VARYING"; break;
+ case SQL_SHORT: s = "SHORT"; break;
+ case SQL_LONG: s = "LONG"; break;
+ case SQL_FLOAT: s = "FLOAT"; break;
+ case SQL_DOUBLE: s = "DOUBLE"; break;
+ case SQL_D_FLOAT: s = "D_FLOAT"; break;
+ case SQL_DATE: s = "DATE"; break;
+ case SQL_BLOB: s = "BLOB"; break;
+ case SQL_ARRAY: s = "ARRAY"; break;
+ case SQL_QUAD: s = "QUAD"; break;
+ default:
+ sprintf(buf,"unknown (%d)", var->sqltype & ~1);
+ s = buf;
+ break;
+ }
+ add_get_index_stringl(return_value, 3, s, strlen(s), (void **) &result, 1);
+ _php3_hash_pointer_update(return_value->value.ht, "type", sizeof(char)*5, result);
+
}
/* }}} */
Index: php3/functions/php3_interbase.h
diff -c php3/functions/php3_interbase.h:1.3 php3/functions/php3_interbase.h:1.4
*** php3/functions/php3_interbase.h:1.3 Fri Jan 1 12:59:15 1999
--- php3/functions/php3_interbase.h Thu Jan 7 03:58:08 1999
***************
*** 24,34 ****
| contact core@php.net. |
+----------------------------------------------------------------------+
| Authors: Jouni Ahto <jah@cultnet.fi> |
! | |
+----------------------------------------------------------------------+
*/
! /* $Id: php3_interbase.h,v 1.3 1999/01/01 17:59:15 zeev Exp $ */
#ifndef _PHP3_IBASE_H
#define _PHP3_IBASE_H
--- 24,34 ----
| contact core@php.net. |
+----------------------------------------------------------------------+
| Authors: Jouni Ahto <jah@cultnet.fi> |
! | Andrew Avdeev <andy@simgts.mv.ru> |
+----------------------------------------------------------------------+
*/
! /* $Id: php3_interbase.h,v 1.4 1999/01/07 08:58:08 jah Exp $ */
#ifndef _PHP3_IBASE_H
#define _PHP3_IBASE_H
***************
*** 53,86 ****
extern void php3_ibase_close(INTERNAL_FUNCTION_PARAMETERS);
extern void php3_ibase_query(INTERNAL_FUNCTION_PARAMETERS);
extern void php3_ibase_fetch_row(INTERNAL_FUNCTION_PARAMETERS);
extern void php3_ibase_free_result(INTERNAL_FUNCTION_PARAMETERS);
extern void php3_ibase_prepare(INTERNAL_FUNCTION_PARAMETERS);
extern void php3_ibase_bind(INTERNAL_FUNCTION_PARAMETERS);
extern void php3_ibase_execute(INTERNAL_FUNCTION_PARAMETERS);
extern void php3_ibase_free_query(INTERNAL_FUNCTION_PARAMETERS);
extern void php3_ibase_timefmt(INTERNAL_FUNCTION_PARAMETERS);
typedef struct {
long default_link;
long num_links, num_persistent;
long max_links, max_persistent;
long allow_persistent;
! int le_link, le_plink, le_result, le_query;
char *default_user, *default_password;
- long manualtransactions;
char *timeformat;
} ibase_module;
typedef struct _php3_ibase_result {
isc_stmt_handle result;
! isc_tr_handle trans;
XSQLDA *sqlda;
- int commitok;
} ibase_result_handle;
typedef struct _php3_ibase_query {
isc_stmt_handle query;
! isc_tr_handle trans;
XSQLDA *sqlda;
int alloced;
} ibase_query_handle;
--- 53,103 ----
extern void php3_ibase_close(INTERNAL_FUNCTION_PARAMETERS);
extern void php3_ibase_query(INTERNAL_FUNCTION_PARAMETERS);
extern void php3_ibase_fetch_row(INTERNAL_FUNCTION_PARAMETERS);
+ extern void php3_ibase_fetch_object(INTERNAL_FUNCTION_PARAMETERS);
extern void php3_ibase_free_result(INTERNAL_FUNCTION_PARAMETERS);
extern void php3_ibase_prepare(INTERNAL_FUNCTION_PARAMETERS);
extern void php3_ibase_bind(INTERNAL_FUNCTION_PARAMETERS);
extern void php3_ibase_execute(INTERNAL_FUNCTION_PARAMETERS);
extern void php3_ibase_free_query(INTERNAL_FUNCTION_PARAMETERS);
extern void php3_ibase_timefmt(INTERNAL_FUNCTION_PARAMETERS);
+ extern void php3_ibase_num_fields(INTERNAL_FUNCTION_PARAMETERS);
+ extern void php3_ibase_field_info(INTERNAL_FUNCTION_PARAMETERS);
+ extern void php3_ibase_trans(INTERNAL_FUNCTION_PARAMETERS);
+ extern void php3_ibase_commit(INTERNAL_FUNCTION_PARAMETERS);
+ extern void php3_ibase_rollback(INTERNAL_FUNCTION_PARAMETERS);
+ /* transactions per connect */
+ #define IBASE_MAXTRANS 10
+
typedef struct {
long default_link;
long num_links, num_persistent;
long max_links, max_persistent;
long allow_persistent;
! int le_trans, le_link, le_plink, le_result, le_query;
char *default_user, *default_password;
char *timeformat;
+ char *cfg_timeformat;
} ibase_module;
+ typedef struct {
+ isc_tr_handle trans;
+ } ibase_trans;
+
+ typedef struct {
+ isc_tr_handle default_trans; /* default transaction*/
+ isc_db_handle link;
+ } ibase_db_link;
+
typedef struct _php3_ibase_result {
isc_stmt_handle result;
! isc_tr_handle result_trans; /* transaction only for this result */
XSQLDA *sqlda;
} ibase_result_handle;
typedef struct _php3_ibase_query {
isc_stmt_handle query;
! isc_tr_handle query_trans;
XSQLDA *sqlda;
int alloced;
} ibase_query_handle;
--
PHP Development Mailing List http://www.php.net/
To unsubscribe send an empty message to php-dev-unsubscribe@lists.php.net
For help: php-dev-help@lists.php.net