CVS update: php3/functions
| From: | andrew | Date: | Sun, 31 Jan 1999 10:33:10 +0000 |
| Subject: | CVS update: php3/functions | ||
| Groups: | php.dev | ||
| Request: | Send a blank email to php-dev+get-3797@lists.php.net to get a copy of this message | ||
Date: Sunday January 31, 1999 @ 5:33
Author: andrew
Update of /repository/php3/functions
In directory asf:/u/temp/cvs-serv15034/php3/functions
Modified Files:
interbase.c php3_interbase.h
Log Message:
Add InterBase blob support. Blobs read only yet.
Add ibase_errmsg() user-level function.
Index: php3/functions/interbase.c
diff -c php3/functions/interbase.c:1.9 php3/functions/interbase.c:1.10
*** php3/functions/interbase.c:1.9 Sat Jan 23 09:45:22 1999
--- php3/functions/interbase.c Sun Jan 31 05:33:09 1999
***************
*** 28,34 ****
+----------------------------------------------------------------------+
*/
! /* $Id: interbase.c,v 1.9 1999/01/23 14:45:22 eschmid Exp $ */
/* TODO: A lot... */
--- 28,34 ----
+----------------------------------------------------------------------+
*/
! /* $Id: interbase.c,v 1.10 1999/01/31 10:33:09 andrew Exp $ */
/* TODO: A lot... */
***************
*** 56,68 ****
{"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}
};
php3_module_entry ibase_module_entry =
--- 56,82 ----
{"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},
!
! {"ibase_blob_info", php3_ibase_blob_info, NULL},
! {"ibase_blob_create", php3_ibase_blob_create, NULL},
! {"ibase_blob_add", php3_ibase_blob_add, NULL},
! {"ibase_blob_cancel", php3_ibase_blob_cancel, NULL},
! {"ibase_blob_close", php3_ibase_blob_close, NULL},
! {"ibase_blob_open", php3_ibase_blob_open, NULL},
! {"ibase_blob_get", php3_ibase_blob_get, NULL},
! {"ibase_blob_echo", php3_ibase_blob_echo, NULL},
! {"ibase_blob_import", php3_ibase_blob_import, NULL},
!
! {"ibase_errmsg", php3_ibase_errmsg, NULL},
! {NULL, NULL, NULL}
};
php3_module_entry ibase_module_entry =
***************
*** 78,83 ****
--- 92,102 ----
};
/* }}} */
+ /* {{{ prototype for blob destructor */
+ static void _php3_ibase_free_blob(ibase_blob_handle *ib_blob);
+ /* }}} */
+
+
/* {{{ thread safety stuff */
#if defined(THREAD_SAFE)
typedef ibase_global_struct{
***************
*** 96,128 ****
ibase_module php3_ibase_module;
#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);
--- 115,180 ----
ibase_module php3_ibase_module;
#endif
/* }}} */
+
+
+
+ #define RESET_ERRMSG { IBASE_GLOBAL(php3_ibase_module).errmsg[0] = '\0';}
+ #define TEST_ERRMSG ( IBASE_GLOBAL(php3_ibase_module).errmsg[0] != '\0')
+
+ /* {{{ proto string ibase_errmsg()
+ Return error message */
+ void php3_ibase_errmsg(INTERNAL_FUNCTION_PARAMETERS)
+ {
+ char *errmsg = IBASE_GLOBAL(php3_ibase_module).errmsg;
+ IBASE_TLS_VARS;
+ if(errmsg[0]){
+ RETURN_STRING(errmsg,1);
+ }
+ RETURN_FALSE;
+ }
+ /* }}} */
! /* {{{ _php3_ibase_error(ISC_STATUS *status)
! print interbase error and save it for ibase_errmsg() */
! static void _php3_ibase_error(ISC_STATUS *status)
{
! char *s, *errmsg = IBASE_GLOBAL(php3_ibase_module).errmsg;
! s = errmsg;
! while((s - errmsg) < MAX_ERRMSG - (IBASE_MSGSIZE + 2) && isc_interprete(s,
&status)){
! strcat(errmsg, " ");
! s = errmsg + strlen(errmsg);
}
! php3_error(E_WARNING, "InterBase: %s",errmsg);
! }
! /* }}} */
!
! /* {{{ _php3_module_error(char *msg, ...)
! print php interbase module error and save it for ibase_errmsg() */
! static void _php3_module_error(char *msg, ...)
! {
! char *errmsg = IBASE_GLOBAL(php3_ibase_module).errmsg;
! va_list ap;
! int len;
!
! va_start(ap, msg);
! len = vsnprintf(errmsg, MAX_ERRMSG - 1, msg, ap);
! va_end(ap);
! errmsg[len] = '\0';
!
! php3_error(E_WARNING, "InterBase module: %s",errmsg);
}
/* }}} */
/* {{{ _php3_ibase_rollback_trans() */
static void _php3_ibase_rollback_trans(ibase_trans *ib_trans)
{
ISC_STATUS status[20];
IBASE_TLS_VARS;
if(ib_trans->trans != NULL){
if(isc_rollback_transaction(status, &ib_trans->trans)){
! _php3_ibase_error(status);
}
}
efree(ib_trans);
***************
*** 137,143 ****
if(link->default_trans != NULL){
if(isc_rollback_transaction(status, &link->default_trans)){
! _php3_isc_interprete(status);
}
}
isc_detach_database(status, &link->link);
--- 189,195 ----
if(link->default_trans != NULL){
if(isc_rollback_transaction(status, &link->default_trans)){
! _php3_ibase_error(status);
}
}
isc_detach_database(status, &link->link);
***************
*** 154,166 ****
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);
}
/* }}} */
--- 206,218 ----
if(link->default_trans != NULL){
if(isc_rollback_transaction(status, &link->default_trans)){
! _php3_ibase_error(status);
}
}
isc_detach_database(status, &link->link);
php3_ibase_module.num_persistent--;
php3_ibase_module.num_links--;
! free(link);
}
/* }}} */
***************
*** 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++) {
--- 223,230 ----
ISC_STATUS status[20];
IBASE_TLS_VARS;
! if (result->trans_single) { /*FIXME : commit or rollback?*/
! isc_commit_transaction(status, &result->trans_handle);
}
if (result->sqlda != NULL) {
for (i = 0; i < result->sqlda->sqld; i++) {
***************
*** 192,199 ****
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) {
--- 244,251 ----
int i;
ISC_STATUS status[20];
! if (query->trans_single) { /*FIXME : commit or rollback?*/
! isc_commit_transaction(status, &query->trans_handle);
}
if (query->sqlda != NULL) {
if (query->alloced) {
***************
*** 238,243 ****
--- 290,296 ----
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_blob = register_list_destructors(_php3_ibase_free_blob, 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;
***************
*** 250,255 ****
--- 303,309 ----
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));
+ IBASE_GLOBAL(php3_ibase_module).errmsg = emalloc(sizeof(char)*MAX_ERRMSG);
return SUCCESS;
}
***************
*** 265,270 ****
--- 319,325 ----
IBASE_TLS_VARS;
efree(IBASE_GLOBAL(php3_ibase_module).timeformat);
+ efree(IBASE_GLOBAL(php3_ibase_module).errmsg);
return SUCCESS;
}
***************
*** 280,286 ****
char dpb_buffer[256], *dpb, *p;
int dpb_length, len;
ISC_STATUS status[20];
- char msg[512];
dpb = dpb_buffer;
--- 335,340 ----
***************
*** 328,338 ****
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;
--- 382,389 ----
dpb_length = dpb - dpb_buffer;
! if(isc_attach_database(status, strlen(server), server, db, dpb_length, dpb_buffer)){
! _php3_ibase_error(status);
return 1;
}
return 0;
***************
*** 350,357 ****
char *hashed_details;
int hashed_details_length;
ibase_db_link *ib_link;
! IBASE_TLS_VARS;
!
ib_uname = IBASE_GLOBAL(php3_ibase_module).default_user;
ib_passwd = IBASE_GLOBAL(php3_ibase_module).default_password;
ib_uname_len = ib_uname ? strlen(ib_uname) : 0;
--- 401,410 ----
char *hashed_details;
int hashed_details_length;
ibase_db_link *ib_link;
! IBASE_TLS_VARS;
!
! RESET_ERRMSG;
!
ib_uname = IBASE_GLOBAL(php3_ibase_module).default_user;
ib_passwd = IBASE_GLOBAL(php3_ibase_module).default_password;
ib_uname_len = ib_uname ? strlen(ib_uname) : 0;
***************
*** 418,429 ****
list_entry new_le;
if (IBASE_GLOBAL(php3_ibase_module).max_links!=-1 &&
IBASE_GLOBAL(php3_ibase_module).num_links>=IBASE_GLOBAL(php3_ibase_module).max_links) {
! php3_error(E_WARNING,"InterBase: Too many open links (%d)",
IBASE_GLOBAL(php3_ibase_module).num_links);
efree(hashed_details);
RETURN_FALSE;
}
if (IBASE_GLOBAL(php3_ibase_module).max_persistent!=-1 &&
IBASE_GLOBAL(php3_ibase_module).num_persistent>=IBASE_GLOBAL(php3_ibase_module).max_persistent) {
! php3_error(E_WARNING,"InterBase: Too many open persistent links (%d)",
IBASE_GLOBAL(php3_ibase_module).num_persistent);
efree(hashed_details);
RETURN_FALSE;
}
--- 471,482 ----
list_entry new_le;
if (IBASE_GLOBAL(php3_ibase_module).max_links!=-1 &&
IBASE_GLOBAL(php3_ibase_module).num_links>=IBASE_GLOBAL(php3_ibase_module).max_links) {
! _php3_module_error("Too many open links (%d)",
IBASE_GLOBAL(php3_ibase_module).num_links);
efree(hashed_details);
RETURN_FALSE;
}
if (IBASE_GLOBAL(php3_ibase_module).max_persistent!=-1 &&
IBASE_GLOBAL(php3_ibase_module).num_persistent>=IBASE_GLOBAL(php3_ibase_module).max_persistent) {
! _php3_module_error("Too many open persistent links (%d)",
IBASE_GLOBAL(php3_ibase_module).num_persistent);
efree(hashed_details);
RETURN_FALSE;
}
***************
*** 462,469 ****
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) {
--- 515,522 ----
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 ib_link sits.
! * if it doesn't, open a new 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) {
***************
*** 485,491 ****
}
}
if (IBASE_GLOBAL(php3_ibase_module).max_links!=-1 &&
IBASE_GLOBAL(php3_ibase_module).num_links>=IBASE_GLOBAL(php3_ibase_module).max_links) {
! php3_error(E_WARNING,"InterBase: Too many open links (%d)",
IBASE_GLOBAL(php3_ibase_module).num_links);
efree(hashed_details);
RETURN_FALSE;
}
--- 538,544 ----
}
}
if (IBASE_GLOBAL(php3_ibase_module).max_links!=-1 &&
IBASE_GLOBAL(php3_ibase_module).num_links>=IBASE_GLOBAL(php3_ibase_module).max_links) {
! _php3_module_error("Too many open links (%d)",
IBASE_GLOBAL(php3_ibase_module).num_links);
efree(hashed_details);
RETURN_FALSE;
}
***************
*** 541,549 ****
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;
--- 594,603 ----
pval *link_arg;
ibase_db_link *ib_link;
int link_id, type;
IBASE_TLS_VARS;
+ RESET_ERRMSG;
+
switch (ARG_COUNT(ht)) {
case 0:
link_id = IBASE_GLOBAL(php3_ibase_module).default_link;
***************
*** 562,568 ****
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;
}
--- 616,622 ----
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_module_error("%d is not link index",link_id);
RETURN_FALSE;
}
***************
*** 583,595 ****
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;
}
--- 637,649 ----
if (isc_dsql_allocate_statement(status, &db, query_handle)) {
efree(isqlda);
! _php3_ibase_error(status);
return NULL;
}
if (isc_dsql_prepare(status, &tr, query_handle, 0, query, 1, isqlda)) {
efree(isqlda);
! _php3_ibase_error(status);
return NULL;
}
***************
*** 601,607 ****
if (isc_dsql_describe_bind(status, query_handle, 1, isqlda)) {
efree(isqlda);
! _php3_isc_interprete(status);
return NULL;
}
--- 655,661 ----
if (isc_dsql_describe_bind(status, query_handle, 1, isqlda)) {
efree(isqlda);
! _php3_ibase_error(status);
return NULL;
}
***************
*** 611,617 ****
isqlda->version = SQLDA_VERSION1;
if (isc_dsql_describe(status, query_handle, 1, isqlda)) {
efree(isqlda);
! _php3_isc_interprete(status);
return NULL;
}
return isqlda;
--- 665,671 ----
isqlda->version = SQLDA_VERSION1;
if (isc_dsql_describe(status, query_handle, 1, isqlda)) {
efree(isqlda);
! _php3_ibase_error(status);
return NULL;
}
return isqlda;
***************
*** 654,660 ****
if (isc_dsql_describe(status, &query_handle, 1, osqlda)) {
efree(osqlda);
! _php3_isc_interprete(status);
return NULL;
}
--- 708,714 ----
if (isc_dsql_describe(status, &query_handle, 1, osqlda)) {
efree(osqlda);
! _php3_ibase_error(status);
return NULL;
}
***************
*** 664,670 ****
osqlda->version = SQLDA_VERSION1;
if (isc_dsql_describe(status, &query_handle, 1, osqlda)) {
efree(osqlda);
! _php3_isc_interprete(status);
return NULL;
}
}
--- 718,724 ----
osqlda->version = SQLDA_VERSION1;
if (isc_dsql_describe(status, &query_handle, 1, osqlda)) {
efree(osqlda);
! _php3_ibase_error(status);
return NULL;
}
}
***************
*** 705,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;
--- 759,765 ----
if (isqlda == NULL) {
if (isc_dsql_execute(status, &tr_handle, &query_handle, 1, NULL)) {
efree(osqlda);
! _php3_ibase_error(status);
return NULL;
} else {
return osqlda;
***************
*** 714,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;
--- 768,774 ----
} else {
if (isc_dsql_execute2(status, &tr_handle, &query_handle, 1, isqlda, osqlda)) {
efree(osqlda);
! _php3_ibase_error(status);
return NULL;
} else {
return osqlda;
***************
*** 724,755 ****
} 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) {
- if(0) {
- isc_commit_transaction(status, tr_handle);
- } else {
- isc_rollback_transaction(status, tr_handle);
- }
- }
- */
}
return NULL;
}
/* }}} */
/* {{{ 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;
--- 778,814 ----
} else {
/* Not select */
if (isc_dsql_execute(status, &tr_handle, &query_handle, 1, isqlda)) {
! _php3_ibase_error(status);
return NULL;
}
}
return NULL;
}
/* }}} */
+
+ #define GET_TRANS_ARG(trans_arg,trans_ptr) { \
+ int type; \
+ convert_to_long(trans_arg); \
+ trans_ptr = (ibase_trans *) php3_list_find(trans_arg->value.lval, &type);\
+ if (type!=IBASE_GLOBAL(php3_ibase_module).le_trans) {\
+ _php3_module_error("%d is not transaction index",trans_arg->value.lval);\
+ RETURN_FALSE;\
+ } \
+ }
+
+ #define TRANS_HANDLE(ib_trans,ib_link) \
+ (ib_trans ? ib_trans->trans : (ib_link->default_trans ? ib_link->default_trans : 0))
+
+
/* {{{ 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;
ibase_db_link *ib_link;
ibase_trans *ib_trans;
isc_tr_handle tr_handle = NULL;
***************
*** 757,762 ****
--- 816,823 ----
IBASE_TLS_VARS;
+ RESET_ERRMSG;
+
switch (ARG_COUNT(ht)) {
case 0:
link_id = IBASE_GLOBAL(php3_ibase_module).default_link;
***************
*** 784,816 ****
}
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;
--- 845,877 ----
}
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_module_error("%d is not link index",link_id);
RETURN_FALSE;
}
if(trans_args){
tpb[tpb_len++] = isc_tpb_version3;
! tpbp = tpb;
! if(strstr(trans_args,"DEFAULT")||strstr(trans_args,"default")){
trans_def = 1;
if(ib_link->default_trans != NULL){
! _php3_module_error("default transaction already started");
RETURN_FALSE;
}
}
/* access mode */
! if(strstr(trans_args,"READ")||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")||strstr(trans_args,"commited"))
tpb[tpb_len++] = isc_tpb_read_committed;
! else if (strstr(trans_args,"CONSISTENCY")||strstr(trans_args,"consistency"))
tpb[tpb_len++] = isc_tpb_consistency;
else
tpb[tpb_len++] = isc_tpb_concurrency;
/* lock resolution */
! if(strstr(trans_args,"NOWAIT")||strstr(trans_args,"nowait"))
tpb[tpb_len++] = isc_tpb_nowait;
else
tpb[tpb_len++] = isc_tpb_wait;
***************
*** 818,824 ****
}
if (isc_start_transaction(status, &tr_handle, 1, &ib_link->link, tpb_len, tpbp)) {
! _php3_isc_interprete(status);
RETURN_FALSE;
}
--- 879,885 ----
}
if (isc_start_transaction(status, &tr_handle, 1, &ib_link->link, tpb_len, tpbp)) {
! _php3_ibase_error(status);
RETURN_FALSE;
}
***************
*** 842,851 ****
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:
--- 903,915 ----
pval *trans_arg;
int trans_id, type;
ibase_db_link *ib_link;
! ibase_trans *ib_trans = NULL;
isc_tr_handle tr_handle;
ISC_STATUS status[20];
! IBASE_TLS_VARS;
!
!
! RESET_ERRMSG;
switch (ARG_COUNT(ht)) {
case 0:
***************
*** 872,899 ****
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;
}
--- 936,963 ----
ib_link = NULL; /* manual transaction */
tr_handle = ib_trans->trans;
}else{
! _php3_module_error("%d is not link or transaction index",trans_id);
RETURN_FALSE;
}
if (commit) {
if(isc_commit_transaction(status, &tr_handle)){
! _php3_ibase_error(status);
! RETURN_FALSE;
}
}else{
if(isc_rollback_transaction(status, &tr_handle)){
! _php3_ibase_error(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;
}
***************
*** 903,909 ****
Commit transaction */
void php3_ibase_commit(INTERNAL_FUNCTION_PARAMETERS)
{
! _php3_ibase_trans_end(INTERNAL_FUNCTION_PARAM_PASSTHRU, COMMIT);
}
/* }}} */
--- 967,973 ----
Commit transaction */
void php3_ibase_commit(INTERNAL_FUNCTION_PARAMETERS)
{
! _php3_ibase_trans_end(INTERNAL_FUNCTION_PARAM_PASSTHRU, COMMIT);
}
/* }}} */
***************
*** 915,935 ****
}
/* }}} */
! /* {{{ 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];
XSQLDA *isqlda, *osqlda;
ibase_result_handle *ibase_result;
! IBASE_TLS_VARS;
switch (ARG_COUNT(ht)) {
case 1:
if (getParameters(ht, 1, &query_arg) == FAILURE) {
--- 979,1001 ----
}
/* }}} */
! /* {{{ proto int ibase_query([int link_identifier, ]string query[, trans])
! Execute a query (without parameter placeholders). */
void php3_ibase_query(INTERNAL_FUNCTION_PARAMETERS)
{
pval *link_arg, *query_arg, *trans_arg;
! int link_id, type, trans_single = 0;
ibase_db_link *ib_link;
ibase_trans *ib_trans;
! isc_tr_handle trans_handle = NULL;
isc_stmt_handle query_handle = NULL;
ISC_STATUS status[20];
XSQLDA *isqlda, *osqlda;
ibase_result_handle *ibase_result;
! IBASE_TLS_VARS;
+ RESET_ERRMSG;
+
switch (ARG_COUNT(ht)) {
case 1:
if (getParameters(ht, 1, &query_arg) == FAILURE) {
***************
*** 949,957 ****
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;
--- 1015,1022 ----
RETURN_FALSE;
}
convert_to_long(link_arg);
! link_id = link_arg->value.lval;
! GET_TRANS_ARG(trans_arg,ib_trans);
break;
default:
WRONG_PARAM_COUNT;
***************
*** 960,1012 ****
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;
}
! osqlda = _php3_ibase_execute(tr_handle, query_handle, isqlda, status);
if (osqlda != NULL) {
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;
}
--- 1025,1075 ----
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_module_error("%d is not link index",link_id);
RETURN_FALSE;
! }
! trans_handle = TRANS_HANDLE(ib_trans,ib_link);
!
! trans_single = (trans_handle == NULL);
! if(trans_single){
! if (isc_start_transaction(status, &trans_handle, 1, &ib_link->link, 0, NULL)) {
! _php3_ibase_error(status);
! RETURN_FALSE;
! }
! }
!
convert_to_string(query_arg);
! isqlda = _php3_ibase_prepare(ib_link->link, trans_handle, &query_handle,
query_arg->value.str.val);
! if(TEST_ERRMSG){
! RETURN_FALSE;
! }
if (isqlda != NULL) {
! if(trans_single)
! isc_rollback_transaction(status, &trans_handle);
isc_dsql_free_statement(status, &query_handle, DSQL_drop);
! _php3_module_error("ibase_query doesn't support parameter placeholders in
query");
RETURN_FALSE;
}
! osqlda = _php3_ibase_execute(trans_handle, query_handle, isqlda, status);
if (osqlda != NULL) {
ibase_result = (ibase_result_handle *) emalloc(sizeof(ibase_result_handle));
ibase_result->result = query_handle;
ibase_result->sqlda = osqlda;
! ibase_result->trans_handle = trans_handle;
! ibase_result->trans_single = trans_single;
! ibase_result->link = ib_link->link;
! RETURN_LONG(php3_list_insert(ibase_result, php3_ibase_module.le_result));
} else {
! if (trans_single) {
! if (status[0] && status[1]) {
! isc_rollback_transaction(status, &trans_handle);
isc_dsql_free_statement(status, &query_handle, DSQL_drop);
RETURN_FALSE;
} else {
! isc_commit_transaction(status, &trans_handle);
isc_dsql_free_statement(status, &query_handle, DSQL_drop);
RETURN_TRUE;
}
***************
*** 1015,1025 ****
}
/* }}} */
/* {{{ _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];
--- 1078,1089 ----
}
/* }}} */
+
/* {{{ _php3_ibase_fetch_hash() */
static void _php3_ibase_fetch_hash(INTERNAL_FUNCTION_PARAMETERS)
{
! pval *result_arg, *blflag_arg;
! int type, blobchar = 0, i, collen;
char string_data[255], *char_data;
ibase_result_handle *ibase_result;
ISC_STATUS status[20];
***************
*** 1027,1047 ****
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;
}
if (ibase_result->sqlda == NULL) {
! php3_error(E_WARNING,"InterBase: trying to fetch results from a non-select query");
RETURN_FALSE;
}
--- 1091,1132 ----
IBASE_VCHAR *vchar;
IBASE_TLS_VARS;
+ RESET_ERRMSG;
! switch(ARG_COUNT(ht)){
! case 1:
! if (ARG_COUNT(ht)==1 && getParameters(ht, 1, &result_arg)==FAILURE) {
! RETURN_FALSE;
! }
! break;
! case 2:
! if(ARG_COUNT(ht)==2 && getParameters(ht, 2, &result_arg,
&blflag_arg)==FAILURE) {
! RETURN_FALSE;
! }
! convert_to_string(blflag_arg);
! if(strcasecmp(blflag_arg->value.str.val,"TEXT")){ /* FIXME: need? */
! _php3_module_error("invalid blob flag '%s'",
blflag_arg->value.str.val);
! RETURN_FALSE;
! }else{
! blobchar = 1;
! }
! break;
! default:
! WRONG_PARAM_COUNT;
! break;
!
! }
!
! convert_to_long(result_arg);
! ibase_result = (ibase_result_handle *) php3_list_find(result_arg->value.lval, &type);
if (type!=IBASE_GLOBAL(php3_ibase_module).le_result) {
! _php3_module_error("%d is not result index", result_arg->value.lval);
RETURN_FALSE;
}
if (ibase_result->sqlda == NULL) {
! _php3_module_error("trying to fetch results from a non-select query");
RETURN_FALSE;
}
***************
*** 1062,1073 ****
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:
--- 1147,1158 ----
if (php3_ini.magic_quotes_runtime) {
int newlen;
char *tmp = _php3_addslashes(char_data, collen, &newlen, 0);
! efree(char_data);
! add_get_index_stringl(return_value, i, tmp, newlen, (void **) &result_arg, 0);
} else {
! add_get_index_stringl(return_value, i, char_data, collen, (void **) &result_arg, 0);
}
! _php3_hash_pointer_update(return_value->value.ht, var->aliasname,
var->aliasname_length+1, result_arg);
}
break;
case SQL_VARYING:
***************
*** 1078,1095 ****
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) {
--- 1163,1180 ----
if (php3_ini.magic_quotes_runtime) {
int newlen;
char *tmp = _php3_addslashes(char_data, collen, &newlen, 0);
! efree(char_data);
! add_get_index_stringl(return_value, i, tmp, newlen, (void **) &result_arg, 0);
} else {
! add_get_index_stringl(return_value, i, char_data, collen, (void **) &result_arg, 0);
}
! _php3_hash_pointer_update(return_value->value.ht, var->aliasname,
var->aliasname_length+1, result_arg);
}
break;
case SQL_SHORT:
collen = sprintf(string_data, "%d", *(short *)(var->sqldata));
! add_get_index_stringl(return_value, i, string_data, collen, (void **) &result_arg, 1);
! _php3_hash_pointer_update(return_value->value.ht, var->aliasname,
var->aliasname_length+1, result_arg);
break;
case SQL_LONG:
if (var->sqlscale) {
***************
*** 1104,1116 ****
} 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) {
--- 1189,1201 ----
} else {
collen = sprintf(string_data, "%ld", *(long *)(var->sqldata));
}
! add_get_index_stringl(return_value, i, string_data, collen, (void **) &result_arg, 1);
! _php3_hash_pointer_update(return_value->value.ht, var->aliasname,
var->aliasname_length+1, result_arg);
break;
case SQL_FLOAT:
collen = sprintf(string_data, "%f", *(float *)(var->sqldata));
! add_get_index_stringl(return_value, i, string_data, collen, (void **) &result_arg, 1);
! _php3_hash_pointer_update(return_value->value.ht, var->aliasname,
var->aliasname_length+1, result_arg);
break;
case SQL_DOUBLE:
if (var->sqlscale) {
***************
*** 1118,1125 ****
} 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;
--- 1203,1210 ----
} else {
collen = sprintf(string_data, "%f", *(double *)(var->sqldata));
}
! add_get_index_stringl(return_value, i, string_data, collen, (void **) &result_arg, 1);
! _php3_hash_pointer_update(return_value->value.ht, var->aliasname,
var->aliasname_length+1, result_arg);
break;
case SQL_DATE: {
struct tm t;
***************
*** 1134,1152 ****
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:
case SQL_ARRAY:
{
/* 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:
--- 1219,1301 ----
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_arg, 1);
! _php3_hash_pointer_update(return_value->value.ht, var->aliasname,
var->aliasname_length+1, result_arg);
}
break;
! case SQL_BLOB:
! if(blobchar){
! int stat;
! isc_blob_handle bl_handle = NULL;
! ISC_LONG bl_len = 0, cur_len = 0, max_len;
! char bl_items[1], *bl_data, bl_info[20], *p;
!
! if(isc_open_blob(status, &ibase_result->link,
&ibase_result->trans_handle, &bl_handle, (ISC_QUAD ISC_FAR *) var->sqldata)){
! _php3_ibase_error(status);
! RETURN_FALSE;
! }
!
! bl_items[0] = isc_info_blob_total_length;
!
if(isc_blob_info(status,&bl_handle,sizeof(bl_items),bl_items,sizeof(bl_info),bl_info)){
! _php3_ibase_error(status);
! RETURN_FALSE;
! }
! /* find total length of blob's data */
! for (p = bl_info; *p != isc_info_end && p <
bl_info+sizeof(bl_info);){
! int item_len, item = *p++;
! item_len = (short)isc_vax_integer(p, 2);
! p += 2;
! if (item == isc_info_blob_total_length)
! bl_len = isc_vax_integer(p, item_len);
! p += item_len;
! }
!
! bl_data = emalloc(bl_len+1);
!
! for(cur_len = stat = 0; stat == 0 && cur_len < max_len; ){
! unsigned short seg_len, max_seg = max_len-cur_len > USHRT_MAX ?
USHRT_MAX : max_len-cur_len;
! stat = isc_get_segment(status, &bl_handle, &seg_len, max_seg,
&bl_data[cur_len]);
! cur_len += seg_len;
! if(cur_len > max_len){ /* never!*/
! efree(bl_data);
! _php3_module_error("php module internal error in %s
%d",__FILE__,__LINE__);
! RETURN_FALSE;
! }
! }
!
! if (status[0] && (status[1] != isc_segstr_eof)){
! efree(bl_data);
! _php3_ibase_error(status);
! RETURN_FALSE;
! }
! bl_data[cur_len] = '\0';
! if(isc_close_blob(status, &bl_handle)){
! efree(bl_data);
! _php3_ibase_error(status);
! RETURN_FALSE;
! }
! add_get_index_stringl(return_value, i, bl_data, cur_len, (void **)
&result_arg, 0);
! _php3_hash_pointer_update(return_value->value.ht, var->aliasname,
var->aliasname_length+1, result_arg);
! }else{ /* blob id only */
! /* return string
! "db_handle:trans_handle:blob_quad_high:blob_quad_low"
! */
! ISC_QUAD *bl_qd = (ISC_QUAD ISC_FAR *) var->sqldata;
!
! collen = sprintf(string_data, "%p:%p:%lx:%lx",
ibase_result->link,ibase_result->trans_handle,
! bl_qd->gds_quad_high, bl_qd->gds_quad_low);
! add_get_index_stringl(return_value, i, string_data, collen, (void **)
&result_arg, 1);
! _php3_hash_pointer_update(return_value->value.ht, var->aliasname,
var->aliasname_length+1, result_arg);
! }
! break;
case SQL_ARRAY:
{
/* 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_arg, 1);
! _php3_hash_pointer_update(return_value->value.ht, var->aliasname,
var->aliasname_length+1, result_arg);
}
break;
default:
***************
*** 1159,1174 ****
}
/* }}} */
! /* {{{ 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 object 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);
--- 1308,1323 ----
}
/* }}} */
! /* {{{ proto array ibase_fetch_row(int result [,blob_flag])
! Fetch a row with blob's body from the results of a query. */
void php3_ibase_fetch_row(INTERNAL_FUNCTION_PARAMETERS)
{
_php3_ibase_fetch_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU);
}
/* }}} */
! /* {{{ proto object ibase_fetch_object(int result [,blob_flag])
! Fetch a object with blob's body from the results of a query. */
void php3_ibase_fetch_object(INTERNAL_FUNCTION_PARAMETERS)
{
_php3_ibase_fetch_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU);
***************
*** 1178,1183 ****
--- 1327,1333 ----
}
/* }}} */
+
/* {{{ proto int ibase_free_result(int result)
Free the memory used by a result. */
void php3_ibase_free_result(INTERNAL_FUNCTION_PARAMETERS)
***************
*** 1187,1192 ****
--- 1337,1344 ----
int type;
IBASE_TLS_VARS;
+ RESET_ERRMSG;
+
if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &result_var)==FAILURE) {
WRONG_PARAM_COUNT;
}
***************
*** 1199,1205 ****
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);
--- 1351,1357 ----
ibase_result = (ibase_result_handle *) php3_list_find(result_var->value.lval,&type);
if (type!=IBASE_GLOBAL(php3_ibase_module).le_result) {
! _php3_module_error("%d is not result index",result_var->value.lval);
RETURN_FALSE;
}
php3_list_delete(result_var->value.lval);
***************
*** 1221,1226 ****
--- 1373,1380 ----
ibase_query_handle *ibase_query;
IBASE_TLS_VARS;
+ RESET_ERRMSG;
+
switch (ARG_COUNT(ht)) {
case 1:
if (getParameters(ht, 1, &query) == FAILURE) {
***************
*** 1242,1248 ****
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;
}
--- 1396,1402 ----
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_module_error("%d is not link index", id);
RETURN_FALSE;
}
***************
*** 1250,1256 ****
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;
}
}
--- 1404,1410 ----
if (1/*!IBASE_GLOBAL(php3_ibase_module).manualtransactions*/) {
if (isc_start_transaction(status, &tr_handle, 1, &db_handle, 0, NULL)) {
! _php3_ibase_error(status);
RETURN_FALSE;
}
}
***************
*** 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;
--- 1413,1419 ----
ibase_query = (ibase_query_handle *) emalloc(sizeof(ibase_query_handle));
ibase_query->query = query_handle;
ibase_query->sqlda = isqlda;
! ibase_query->trans_handle = 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;
***************
*** 1275,1280 ****
--- 1429,1436 ----
int type;
IBASE_TLS_VARS;
+ RESET_ERRMSG;
+
if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &query)==FAILURE) {
WRONG_PARAM_COUNT;
}
***************
*** 1287,1298 ****
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;
}
if (ibase_query->sqlda == NULL) {
! php3_error(E_WARNING,"InterBase: trying to bind a query having no parameter
placeholders");
RETURN_FALSE;
}
--- 1443,1454 ----
ibase_query = (ibase_query_handle *) php3_list_find(query->value.lval,&type);
if (type!=IBASE_GLOBAL(php3_ibase_module).le_query) {
! _php3_module_error("%d is not query index",query->value.lval);
RETURN_FALSE;
}
if (ibase_query->sqlda == NULL) {
! _php3_module_error("trying to bind a query having no parameter placeholders");
RETURN_FALSE;
}
***************
*** 1338,1343 ****
--- 1494,1501 ----
XSQLDA *osqlda;
IBASE_TLS_VARS;
+ RESET_ERRMSG;
+
if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &query)==FAILURE) {
WRONG_PARAM_COUNT;
}
***************
*** 1350,1361 ****
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;
}
/* 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;
--- 1508,1519 ----
ibase_query = (ibase_query_handle *) php3_list_find(query->value.lval,&type);
if (type!=IBASE_GLOBAL(php3_ibase_module).le_query) {
! _php3_module_error("%d is not query index", query->value.lval);
RETURN_FALSE;
}
/* FIXME: manual and other trans todo...*/
! osqlda = _php3_ibase_execute(ibase_query->trans_handle, 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;
***************
*** 1373,1378 ****
--- 1531,1538 ----
int type;
IBASE_TLS_VARS;
+ RESET_ERRMSG;
+
if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &query_arg)==FAILURE) {
WRONG_PARAM_COUNT;
}
***************
*** 1385,1391 ****
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);
--- 1545,1551 ----
ibase_query = (ibase_query_handle *) php3_list_find(query_arg->value.lval, &type);
if (type!=IBASE_GLOBAL(php3_ibase_module).le_query) {
! _php3_module_error("%d is not query index", query_arg->value.lval);
RETURN_FALSE;
}
php3_list_delete(query_arg->value.lval);
***************
*** 1393,1398 ****
--- 1553,1559 ----
}
/* }}} */
+
/* {{{ proto int ibase_timefmt(string format)
Sets the format of datetime columns returned from queries. Still nonfunctional. */
void php3_ibase_timefmt(INTERNAL_FUNCTION_PARAMETERS)
***************
*** 1400,1405 ****
--- 1561,1568 ----
pval *fmt;
IBASE_TLS_VARS;
+ RESET_ERRMSG;
+
#if HAVE_STRFTIME
if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &fmt)==FAILURE) {
WRONG_PARAM_COUNT;
***************
*** 1409,1420 ****
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)
--- 1572,1584 ----
IBASE_GLOBAL(php3_ibase_module).timeformat = estrndup(fmt->value.str.val,
fmt->value.str.len);
RETURN_TRUE;
#else
! _php3_module_error("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)
***************
*** 1423,1428 ****
--- 1587,1594 ----
int type;
ibase_result_handle *ibase_result;
+ RESET_ERRMSG;
+
if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &result)==FAILURE) {
WRONG_PARAM_COUNT;
}
***************
*** 1431,1450 ****
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)
--- 1597,1616 ----
ibase_result = (ibase_result_handle *) php3_list_find(result->value.lval, &type);
if (type!=IBASE_GLOBAL(php3_ibase_module).le_result) {
! _php3_module_error("%d is not result index", result->value.lval);
RETURN_FALSE;
}
if (ibase_result->sqlda == NULL) {
! _php3_module_error("trying to get num fields from a non-select query");
RETURN_FALSE;
}
! RETURN_LONG(ibase_result->sqlda->sqld);
}
/* }}} */
+
/* {{{ proto array ibase_field_info(int result, int field_number)
Get information about a field */
void php3_ibase_field_info(INTERNAL_FUNCTION_PARAMETERS)
***************
*** 1454,1461 ****
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;
--- 1620,1628 ----
ibase_result_handle *ibase_result;
char buf[30], *s;
XSQLVAR *var;
! IBASE_TLS_VARS;
!
! RESET_ERRMSG;
if (ARG_COUNT(ht)!=2 || getParameters(ht, 2, &result, &field)==FAILURE) {
WRONG_PARAM_COUNT;
***************
*** 1465,1476 ****
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;
}
--- 1632,1643 ----
ibase_result = (ibase_result_handle *) php3_list_find(result->value.lval, &type);
if (type!=IBASE_GLOBAL(php3_ibase_module).le_result) {
! _php3_module_error("%d is not result index", result->value.lval);
RETURN_FALSE;
}
if (ibase_result->sqlda == NULL) {
! _php3_module_error("trying to get field info from a non-select query");
RETURN_FALSE;
}
***************
*** 1486,1522 ****
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);
}
/* }}} */
#endif
/*
--- 1653,2233 ----
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->aliasname, var->aliasname_length, (void **)
&result, 1);
+ _php3_hash_pointer_update(return_value->value.ht, "alias", sizeof(char)*6, result);
! add_get_index_stringl(return_value, 2, 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, 3, 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, 4, s, strlen(s), (void **) &result, 1);
_php3_hash_pointer_update(return_value->value.ht, "type", sizeof(char)*5, result);
+
+ }
+ /* }}} */
+
+
+ /* begin blobs *********************************************/
+
+ #define IBASE_BLOB_SEG 4096
+
+ /* get string blob identifier from argument
+ format: database_link:transaction_handle:gds_quad_high:gds_quad_low
+ */
+ #define GET_BLOB_STR_ARG(blob_arg, link, trans_handle, bl_qd) \
+ if(blob_arg->type != IS_STRING || \
+ sscanf(blob_arg->value.str.val,"%p%*[:]%p%*[:]%lx%*[:]%lx", \
+ &link,&trans_handle,&bl_qd.gds_quad_high,&bl_qd.gds_quad_low) != 4){
\
+ _php3_module_error("invalid blob id string"); \
+ RETURN_FALSE; \
+ }
+
+
+ /* get blob handle from argument
+ note: blob already open when handle active
+ */
+ #define GET_BLOB_HANDLE_ARG(blob_arg, blob_ptr) \
+ { \
+ int type; \
+ convert_to_long(blob_arg); \
+ blob_ptr = (ibase_blob_handle *) php3_list_find(blob_arg->value.lval, &type); \
+ if (type!=IBASE_GLOBAL(php3_ibase_module).le_blob) { \
+ _php3_module_error("%d is not blob handle",blob_arg->value.lval); \
+ RETURN_FALSE; \
+ } \
+ }
+
+
+ /* internal struct */
+ typedef struct {
+ ISC_LONG max_segment; /* Length of longest segment */
+ ISC_LONG num_segments; /* Total number of segments */
+ ISC_LONG total_length; /* Total length of blob */
+ int bl_stream; /* blob is stream ? */
+ }IBASE_BLOBINFO;
+
+
+ /* {{{ int _php3_ibase_blob_info(isc_blob_handle bl_handle,IBASE_BLOBINFO *bl_info)*/
+ static int _php3_ibase_blob_info(isc_blob_handle bl_handle,IBASE_BLOBINFO *bl_info)
+ {
+ ISC_STATUS status[20];
+
+ static char bl_items[] = {
+ isc_info_blob_num_segments,
+ isc_info_blob_max_segment,
+ isc_info_blob_total_length,
+ isc_info_blob_type
+ };
+
+ char bl_inf[sizeof(long)*8], *p;
+
+ bl_info->max_segment = 0;
+ bl_info->num_segments = 0;
+ bl_info->total_length = 0;
+ bl_info->bl_stream = 0;
+
+ if(isc_blob_info(status,&bl_handle,sizeof(bl_items),bl_items,sizeof(bl_inf),bl_inf)){
+ _php3_ibase_error(status);
+ return -1;
+ }
+
+ for (p = bl_inf; *p != isc_info_end && p < bl_inf+sizeof(bl_inf);){
+ int item_len, item = *p++;
+ item_len = (short)isc_vax_integer(p, 2);
+ p += 2;
+ switch(item){
+ case isc_info_blob_num_segments:
+ bl_info->num_segments = isc_vax_integer(p, item_len);
+ break;
+ case isc_info_blob_max_segment:
+ bl_info->max_segment = isc_vax_integer(p, item_len);
+ break;
+ case isc_info_blob_total_length:
+ bl_info->total_length = isc_vax_integer(p, item_len);
+ break;
+ case isc_info_blob_type:
+ bl_info->bl_stream = isc_vax_integer(p, item_len);
+ break;
+ case isc_info_end:
+ break;
+ case isc_info_truncated:
+ case isc_info_error: /* hmm. don't think so...*/
+ _php3_ibase_error(status);
+ return -1;
+ }/*switch*/
+ p += item_len;
+ }/*for*/
+ return 0;
+ }
+ /* }}} */
+
+ /* {{{ _php3_ibase_free_blob() ibase_blob_handle destructor */
+ static void _php3_ibase_free_blob(ibase_blob_handle *ib_blob)
+ {
+ ISC_STATUS status[20];
+ IBASE_TLS_VARS;
+
+ if(ib_blob->bl_handle != NULL){ /* blob open*/
+ if(isc_cancel_blob(status, &ib_blob->bl_handle)){
+ _php3_ibase_error(status);
+ }
+ }
+ efree(ib_blob);
+ }
+ /* }}} */
+
+
+ /* {{{ proto int ibase_blob_create([[int link_identifier ], int trans_arg])
+ Create blob for adding data */
+ void php3_ibase_blob_create(INTERNAL_FUNCTION_PARAMETERS)
+ {
+ pval *link_arg,*trans_arg;
+ int type, link_id = 0;
+ ISC_STATUS status[20];
+ ibase_db_link *ib_link;
+ ibase_trans *ib_trans = NULL;
+ ibase_blob_handle *ib_blob;
+ IBASE_TLS_VARS;
+
+ RESET_ERRMSG;
+
+ 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;
+ }
+ GET_TRANS_ARG(trans_arg, ib_trans);
+ link_id = IBASE_GLOBAL(php3_ibase_module).default_link;
+ 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;
+ GET_TRANS_ARG(trans_arg, ib_trans);
+ 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_module_error("%d is not link index",link_id);
+ RETURN_FALSE;
+ }
+
+ ib_blob = (ibase_blob_handle *) emalloc(sizeof(ibase_blob_handle));
+ ib_blob->trans_handle = ib_trans ? ib_trans->trans : ib_link->default_trans;
+ ib_blob->link = ib_link->link;
+ ib_blob->bl_handle = NULL;
+
+ if (isc_create_blob(status, &ib_blob->link, &ib_blob->trans_handle,
&ib_blob->bl_handle,&ib_blob->bl_qd)){
+ efree(ib_blob);
+ _php3_ibase_error(status);
+ RETURN_FALSE;
+ }
+
+ RETURN_LONG(php3_list_insert(ib_blob, IBASE_GLOBAL(php3_ibase_module).le_blob));
+ }
+ /* }}} */
+
+
+ /* {{{ proto int ibase_blob_open(string blob_id)
+ Open blob for retriving data parts */
+ void php3_ibase_blob_open(INTERNAL_FUNCTION_PARAMETERS)
+ {
+ pval *blob_arg;
+ ISC_STATUS status[20];
+ ibase_blob_handle *ib_blob;
+ IBASE_TLS_VARS;
+
+ RESET_ERRMSG;
+
+ if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &blob_arg)==FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+
+ ib_blob = (ibase_blob_handle *) emalloc(sizeof(ibase_blob_handle));
+
+ GET_BLOB_STR_ARG(blob_arg,ib_blob->link,ib_blob->trans_handle,ib_blob->bl_qd)
+
+ ib_blob->bl_handle = NULL;
+ if (isc_open_blob(status, &ib_blob->link, &ib_blob->trans_handle,
&ib_blob->bl_handle, &ib_blob->bl_qd)){
+ efree(ib_blob);
+ _php3_ibase_error(status);
+ RETURN_FALSE;
+ }
+
+ RETURN_LONG(php3_list_insert(ib_blob, IBASE_GLOBAL(php3_ibase_module).le_blob));
+ }
+ /* }}} */
+
+
+ /* {{{ proto int ibase_blob_put(int blob_id, string data)
+ Add data into created blob */
+ void php3_ibase_blob_add(INTERNAL_FUNCTION_PARAMETERS)
+ {
+ pval *blob_arg,*string_arg;
+ ISC_STATUS status[20];
+ ibase_blob_handle *ib_blob;
+ IBASE_TLS_VARS;
+
+ RESET_ERRMSG;
+
+ if (ARG_COUNT(ht)!=2 || getParameters(ht, 2, &blob_arg, &string_arg)==FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+
+ GET_BLOB_HANDLE_ARG(blob_arg, ib_blob);
+
+ convert_to_string(string_arg);
+
+ if (isc_put_segment(status, &ib_blob->bl_handle, string_arg->value.str.len,
string_arg->value.str.val)){
+ _php3_ibase_error(status);
+ RETURN_FALSE;
+ }
+ RETURN_TRUE;
+ }
+ /* }}} */
+
+
+ /* {{{ proto string ibase_blob_get(int blob_id, int len)
+ Get len bytes data from open blob */
+ void php3_ibase_blob_get(INTERNAL_FUNCTION_PARAMETERS)
+ {
+ pval *blob_arg, *len_arg;
+ int stat;
+ char *bl_data;
+ unsigned short max_len = 0, cur_len, seg_len;
+ ISC_STATUS status[20];
+ ibase_blob_handle *ib_blob;
+ IBASE_TLS_VARS;
+
+ RESET_ERRMSG;
+
+ if(ARG_COUNT(ht) != 2 || getParameters(ht, 2, &blob_arg, &len_arg) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+
+ convert_to_long(len_arg);
+ max_len = len_arg->value.lval;
+
+ GET_BLOB_HANDLE_ARG(blob_arg, ib_blob);
+
+ bl_data = emalloc(max_len+1);
+
+ for(cur_len = stat = 0; stat == 0; ){
+ stat = isc_get_segment(status, &ib_blob->bl_handle, &seg_len, max_len-cur_len,
&bl_data[cur_len]);
+ cur_len += seg_len;
+ if(cur_len > max_len){ /* never!*/
+ efree(bl_data);
+ _php3_module_error("php module internal error in %s %d",__FILE__,__LINE__);
+ RETURN_FALSE;
+ }
+ }
+
+ bl_data[cur_len] = '\0';
+ if (status[0] && (status[1] != isc_segstr_eof && status[1] != isc_segment)){
+ efree(bl_data);
+ _php3_ibase_error(status);
+ RETURN_FALSE;
+ }
+ RETURN_STRINGL(bl_data,cur_len,0);
+ }
+ /* }}} */
+
+
+ #define BLOB_CLOSE 1
+ #define BLOB_CANCEL 2
+
+ /* {{{ int ibase_blob_close(int blob_id)
+ Close or Cancel created or Close open blob */
+ static void _php3_ibase_blob_end(INTERNAL_FUNCTION_PARAMETERS, int bl_end)
+ {
+ pval *blob_arg;
+ ISC_STATUS status[20];
+ ibase_blob_handle *ib_blob;
+ char string_data[80];
+ IBASE_TLS_VARS;
+
+ RESET_ERRMSG;
+
+ if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &blob_arg)==FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+
+ GET_BLOB_HANDLE_ARG(blob_arg, ib_blob);
+
+ if(bl_end == BLOB_CLOSE){ /* return string id here */
+ if (isc_close_blob(status, &ib_blob->bl_handle)){
+ _php3_ibase_error(status);
+ RETURN_FALSE;
+ }
+ ib_blob->bl_handle = NULL;
+ sprintf(string_data, "%p:%p:%lx:%lx", ib_blob->link,ib_blob->trans_handle,
+ ib_blob->bl_qd.gds_quad_high, ib_blob->bl_qd.gds_quad_low);
+ php3_list_delete(blob_arg->value.lval);
+ RETURN_STRING(string_data,1);
+ }else{ /* discard created blob */
+ if (isc_cancel_blob(status, &ib_blob->bl_handle)){
+ _php3_ibase_error(status);
+ RETURN_FALSE;
+ }
+ ib_blob->bl_handle = NULL;
+ php3_list_delete(blob_arg->value.lval);
+ RETURN_TRUE;
+ }
+ }
+ /* }}} */
+
+
+ /* {{{ proto int ibase_blob_close(int blob_id)
+ Close blob */
+ void php3_ibase_blob_close(INTERNAL_FUNCTION_PARAMETERS)
+ {
+ _php3_ibase_blob_end(INTERNAL_FUNCTION_PARAM_PASSTHRU,BLOB_CLOSE);
+ }
+ /* }}} */
+
+
+ /* {{{ proto int ibase_blob_cancel(int blob_id)
+ Cancel creating blob */
+ void php3_ibase_blob_cancel(INTERNAL_FUNCTION_PARAMETERS)
+ {
+ _php3_ibase_blob_end(INTERNAL_FUNCTION_PARAM_PASSTHRU,BLOB_CANCEL);
}
/* }}} */
+
+ /* {{{ proto object ibase_blob_info(string blob_id_str)
+ Return blob length and other useful info */
+ void php3_ibase_blob_info(INTERNAL_FUNCTION_PARAMETERS)
+ {
+ pval *blob_arg, *result_var;
+ ISC_STATUS status[20];
+ isc_tr_handle trans_handle;
+ isc_db_handle link;
+ isc_blob_handle bl_handle = NULL;
+ ISC_QUAD bl_qd;
+ IBASE_BLOBINFO bl_info;
+ IBASE_TLS_VARS;
+
+ RESET_ERRMSG;
+
+ if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &blob_arg)==FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+
+ GET_BLOB_STR_ARG(blob_arg,link,trans_handle,bl_qd);
+
+ if (isc_open_blob(status, &link, &trans_handle, &bl_handle, &bl_qd)){
+ _php3_ibase_error(status);
+ RETURN_FALSE;
+ }
+
+ if (array_init(return_value)==FAILURE){
+ RETURN_FALSE;
+ }
+
+ if(_php3_ibase_blob_info(bl_handle,&bl_info)){
+ RETURN_FALSE;
+ }
+
+ add_get_index_long(return_value, 0, bl_info.total_length, (void **)&result_var);
+ _php3_hash_pointer_update(return_value->value.ht, "length",
sizeof("length"), result_var);
+
+ add_get_index_long(return_value, 1, bl_info.num_segments, (void **)&result_var);
+ _php3_hash_pointer_update(return_value->value.ht, "numseg",
sizeof("numseg"), result_var);
+
+ add_get_index_long(return_value, 2, bl_info.max_segment, (void **)&result_var);
+ _php3_hash_pointer_update(return_value->value.ht, "maxseg",
sizeof("maxseg"), result_var);
+
+ add_get_index_long(return_value, 3, bl_info.bl_stream, (void **)&result_var);
+ _php3_hash_pointer_update(return_value->value.ht, "stream",
sizeof("stream"), result_var);
+ }
+ /* }}} */
+
+
+ /* {{{ proto int ibase_blob_echo(string blob_id_str)
+ Output blob contents to browser */
+ void php3_ibase_blob_echo(INTERNAL_FUNCTION_PARAMETERS)
+ {
+ pval *blob_arg;
+ char bl_data[IBASE_BLOB_SEG];
+ unsigned short seg_len;
+ ISC_STATUS status[20];
+ isc_tr_handle trans_handle;
+ isc_db_handle link;
+ isc_blob_handle bl_handle = NULL;
+ ISC_QUAD bl_qd;
+ IBASE_TLS_VARS;
+
+ RESET_ERRMSG;
+
+ if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &blob_arg)==FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+
+ GET_BLOB_STR_ARG(blob_arg, link,trans_handle,bl_qd);
+
+ if (!php3_header()) {
+ RETURN_FALSE;
+ }
+
+ if (isc_open_blob(status, &link, &trans_handle, &bl_handle,&bl_qd)){
+ _php3_ibase_error(status);
+ RETURN_FALSE;
+ }
+
+ while(!isc_get_segment(status, &bl_handle, &seg_len, sizeof(bl_data), bl_data)
+ || status[1] == isc_segment){
+ PHPWRITE(bl_data,seg_len);
+ }
+
+ if (status[0] && (status[1] != isc_segstr_eof)){
+ _php3_ibase_error(status);
+ RETURN_FALSE;
+ }
+
+ if (isc_close_blob(status, &bl_handle)){
+ _php3_ibase_error(status);
+ RETURN_FALSE;
+ }
+
+ RETURN_TRUE;
+ }
+ /* }}} */
+
+
+ /* from file.c. I'm not sure, this variables always initialized? */
+ extern int le_fp,le_pp;
+ extern int wsa_fp;
+
+ /* {{{ proto string ibase_blob_import([link_id, ] file_id [, trans_id])
+ Create blob, copy file in it, and close it*/
+ void php3_ibase_blob_import(INTERNAL_FUNCTION_PARAMETERS)
+ {
+ pval *link_arg, *file_arg, *trans_arg;
+ int type, link_id = 0, file_id, size, b;
+ int issock=0, socketd=0, *sock;
+ ISC_STATUS status[20];
+ ISC_QUAD bl_qd;
+ isc_tr_handle trans_handle = NULL;
+ isc_blob_handle bl_handle = NULL;
+ ibase_db_link *ib_link;
+ ibase_trans *ib_trans = NULL;
+ char string_data[80],
+ bl_data[IBASE_BLOB_SEG]; /* FIXME? blob_seg_size parameter? */
+ FILE *fp;
+ IBASE_TLS_VARS;
+
+ RESET_ERRMSG;
+
+ switch (ARG_COUNT(ht)) {
+ case 1:
+ if (getParameters(ht, 1, &file_arg) == FAILURE) {
+ RETURN_FALSE;
+ }
+ link_id = IBASE_GLOBAL(php3_ibase_module).default_link;
+ break;
+ case 2:
+ if (getParameters(ht, 2, &link_arg, &file_arg) == FAILURE) {
+ RETURN_FALSE;
+ }
+ convert_to_long(link_arg);
+ link_id = link_arg->value.lval;
+ break;
+ case 3:
+ if (getParameters(ht, 3, &link_arg, &file_arg, &trans_arg) == FAILURE) {
+ RETURN_FALSE;
+ }
+ convert_to_long(link_arg);
+ link_id = link_arg->value.lval;
+ GET_TRANS_ARG(trans_arg, ib_trans);
+ break;
+ default:
+ WRONG_PARAM_COUNT;
+ break;
+ }
+
+ convert_to_long(file_arg);
+ file_id = file_arg->value.lval;
+ fp = php3_list_find(file_id,&type);
+ if (type==GLOBAL(wsa_fp)){
+ issock=1;
+ sock = php3_list_find(file_id,&type);
+ socketd=*sock;
+ }
+ if ((!fp || (type!=GLOBAL(le_fp) && type!=GLOBAL(le_pp))) && (!socketd ||
type!=GLOBAL(wsa_fp))) {
+ _php3_module_error("Unable to find file identifier %d",file_id);
+ RETURN_FALSE;
+ }
+
+ 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_module_error("%d is not link index",link_id);
+ RETURN_FALSE;
+ }
+
+ trans_handle = ib_trans ? ib_trans->trans : ib_link->default_trans;
+
+ if (isc_create_blob(status, &ib_link->link, &trans_handle,
&bl_handle,&bl_qd)){
+ _php3_ibase_error(status);
+ RETURN_FALSE;
+ }
+
+ size = 0;
+ while(issock?(b=SOCK_FGETS(bl_data,sizeof(bl_data),socketd)):(b = fread(bl_data, 1,
sizeof(bl_data), fp)) > 0) {
+ if (isc_put_segment(status, &bl_handle, b, bl_data)){
+ _php3_ibase_error(status);
+ RETURN_FALSE;
+ }
+ size += b ;
+ }
+
+ if (isc_close_blob(status, &bl_handle)){
+ _php3_ibase_error(status);
+ RETURN_FALSE;
+ }
+
+ sprintf(string_data, "%p:%p:%lx:%lx", ib_link->link,trans_handle,
+ bl_qd.gds_quad_high, bl_qd.gds_quad_low);
+
+ php3_list_delete(file_id);
+ RETURN_STRING(string_data,1);
+ }
+ /* }}} */
+
+
+ /* end blobs **********************************************/
+
+
#endif
/*
***************
*** 1525,1527 ****
--- 2236,2239 ----
* c-basic-offset: 4
* End:
*/
+
Index: php3/functions/php3_interbase.h
diff -c php3/functions/php3_interbase.h:1.4 php3/functions/php3_interbase.h:1.5
*** php3/functions/php3_interbase.h:1.4 Thu Jan 7 03:58:08 1999
--- php3/functions/php3_interbase.h Sun Jan 31 05:33:10 1999
***************
*** 28,34 ****
+----------------------------------------------------------------------+
*/
! /* $Id: php3_interbase.h,v 1.4 1999/01/07 08:58:08 jah Exp $ */
#ifndef _PHP3_IBASE_H
#define _PHP3_IBASE_H
--- 28,34 ----
+----------------------------------------------------------------------+
*/
! /* $Id: php3_interbase.h,v 1.5 1999/01/31 10:33:10 andrew Exp $ */
#ifndef _PHP3_IBASE_H
#define _PHP3_IBASE_H
***************
*** 60,83 ****
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 {
--- 60,98 ----
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);
+
+ extern void php3_ibase_blob_create(INTERNAL_FUNCTION_PARAMETERS);
+ extern void php3_ibase_blob_add(INTERNAL_FUNCTION_PARAMETERS);
+ extern void php3_ibase_blob_cancel(INTERNAL_FUNCTION_PARAMETERS);
+ extern void php3_ibase_blob_open(INTERNAL_FUNCTION_PARAMETERS);
+ extern void php3_ibase_blob_get(INTERNAL_FUNCTION_PARAMETERS);
+ extern void php3_ibase_blob_close(INTERNAL_FUNCTION_PARAMETERS);
+ extern void php3_ibase_blob_echo(INTERNAL_FUNCTION_PARAMETERS);
+ extern void php3_ibase_blob_info(INTERNAL_FUNCTION_PARAMETERS);
+ extern void php3_ibase_blob_import(INTERNAL_FUNCTION_PARAMETERS);
! extern void php3_ibase_errmsg(INTERNAL_FUNCTION_PARAMETERS);
+ #define IBASE_MSGSIZE 256
+ #define MAX_ERRMSG (IBASE_MSGSIZE*2)
+
typedef struct {
long default_link;
long num_links, num_persistent;
long max_links, max_persistent;
long allow_persistent;
! int le_blob, le_trans, le_link, le_plink, le_result, le_query;
char *default_user, *default_password;
char *timeformat;
! char *cfg_timeformat;
! char *errmsg;
} ibase_module;
typedef struct {
***************
*** 89,103 ****
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;
--- 104,128 ----
isc_db_handle link;
} ibase_db_link;
+ typedef struct {
+ isc_tr_handle trans_handle;
+ isc_db_handle link;
+ ISC_QUAD bl_qd;
+ isc_blob_handle bl_handle;
+ } ibase_blob_handle;
+
typedef struct _php3_ibase_result {
isc_stmt_handle result;
! isc_tr_handle trans_handle;
! int trans_single; /* commit transaction when free result */
! isc_db_handle link; /* db link for this result */
XSQLDA *sqlda;
} ibase_result_handle;
typedef struct _php3_ibase_query {
isc_stmt_handle query;
! isc_tr_handle trans_handle;
! int trans_single; /* commit transaction when free query */
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