More divide & conquer

This commit is contained in:
Ard Biesheuvel 2004-04-05 13:22:34 +00:00
parent f9c5fc6ecb
commit 18fa461119
8 changed files with 2508 additions and 2415 deletions

View File

@ -53,6 +53,6 @@ if test "$PHP_INTERBASE" != "no"; then
PHP_ADD_LIBRARY_WITH_PATH($IBASE_LIBNAME, $IBASE_LIBDIR, INTERBASE_SHARED_LIBADD)
PHP_ADD_INCLUDE($IBASE_INCDIR)
AC_DEFINE(HAVE_IBASE,1,[ ])
PHP_NEW_EXTENSION(interbase, interbase.c ibase_service.c ibase_events.c ibase_blobs.c, $ext_shared)
PHP_NEW_EXTENSION(interbase, interbase.c ibase_query.c ibase_service.c ibase_events.c ibase_blobs.c, $ext_shared)
PHP_SUBST(INTERBASE_SHARED_LIBADD)
fi

View File

@ -9,7 +9,7 @@ if (PHP_INTERBASE != "no" || PHP_INTERBASE5 != "no") {
if (CHECK_HEADER_ADD_INCLUDE("ibase.h", "CFLAGS_INTERBASE", PHP_PHP_BUILD + "\\interbase\\include;" + PHP_INTERBASE) &&
(CHECK_LIB("fbclient_ms.lib", "interbase", PHP_PHP_BUILD + "\\interbase\\lib_ms;" + PHP_INTERBASE) ||
CHECK_LIB("gds32_ms.lib", "interbase", PHP_PHP_BUILD + "\\interbase\\lib_ms;" + PHP_INTERBASE))) {
EXTENSION("interbase", "interbase.c ibase_service.c ibase_events.c ibase_blobs.c");
EXTENSION("interbase", "interbase.c ibase_query.c ibase_service.c ibase_events.c ibase_blobs.c");
AC_DEFINE('HAVE_IBASE', 1, 'Have interbase library');
if (PHP_INTERBASE != "no") {

View File

@ -32,7 +32,30 @@
#define BLOB_CLOSE 1
#define BLOB_CANCEL 2
int _php_ibase_string_to_quad(char const *id, ISC_QUAD *qd) /* {{{ */
static int le_blob;
static void _php_ibase_free_blob(zend_rsrc_list_entry *rsrc TSRMLS_DC) /* {{{ */
{
ibase_blob *ib_blob = (ibase_blob *)rsrc->ptr;
if (ib_blob->bl_handle != NULL) { /* blob open*/
if (isc_cancel_blob(IB_STATUS, &ib_blob->bl_handle)) {
_php_ibase_module_error("You can lose data. Close any blob after reading from or "
"writing to it. Use ibase_blob_close() before calling ibase_close()" TSRMLS_CC);
}
}
efree(ib_blob);
}
/* }}} */
void php_ibase_blobs_minit(INIT_FUNC_ARGS) /* {{{ */
{
le_blob = zend_register_list_destructors_ex(_php_ibase_free_blob, NULL,
"interbase blob", module_number);
}
/* }}} */
PHPAPI int _php_ibase_string_to_quad(char const *id, ISC_QUAD *qd) /* {{{ */
{
/* shortcut for most common case */
if (sizeof(ISC_QUAD) == sizeof(ISC_UINT64)) {
@ -49,13 +72,13 @@ int _php_ibase_string_to_quad(char const *id, ISC_QUAD *qd) /* {{{ */
}
/* }}} */
char *_php_ibase_quad_to_string(ISC_QUAD const qd) /* {{{ */
PHPAPI char *_php_ibase_quad_to_string(ISC_QUAD const qd) /* {{{ */
{
char *result = (char *) emalloc(BLOB_ID_LEN+1);
/* shortcut for most common case */
if (sizeof(ISC_QUAD) == sizeof(ISC_UINT64)) {
sprintf(result, BLOB_ID_MASK, *(ISC_UINT64*)(void *) &qd);
sprintf(result, BLOB_ID_MASK, *(ISC_UINT64*)(void *) &qd);
} else {
ISC_UINT64 res = ((ISC_UINT64) qd.gds_quad_high << 0x20) | qd.gds_quad_low;
sprintf(result, BLOB_ID_MASK, res);
@ -73,25 +96,25 @@ typedef struct { /* {{{ */
/* }}} */
} IBASE_BLOBINFO;
int _php_ibase_blob_get(zval *return_value, ibase_blob *ib_blob, unsigned long max_len TSRMLS_DC) /* {{{ */
PHPAPI int _php_ibase_blob_get(zval *return_value, ibase_blob *ib_blob, unsigned long max_len TSRMLS_DC) /* {{{ */
{
if (ib_blob->bl_qd.gds_quad_high || ib_blob->bl_qd.gds_quad_low) { /*not null ?*/
ISC_STATUS stat;
char *bl_data;
unsigned long cur_len;
unsigned short seg_len;
bl_data = emalloc(max_len + 1);
for (cur_len = stat = 0; (stat == 0 || stat == isc_segment) && cur_len < max_len; cur_len += seg_len) {
unsigned short chunk_size = (max_len-cur_len) > USHRT_MAX ? USHRT_MAX
unsigned short chunk_size = (max_len-cur_len) > USHRT_MAX ? USHRT_MAX
: (unsigned short)(max_len-cur_len);
stat = isc_get_segment(IB_STATUS, &ib_blob->bl_handle, &seg_len, chunk_size, &bl_data[cur_len]);
stat = isc_get_segment(IB_STATUS, &ib_blob->bl_handle, &seg_len, chunk_size, &bl_data[cur_len]);
}
bl_data[cur_len] = '\0';
if (IB_STATUS[0] == 1 && (stat != 0 && stat != isc_segstr_eof && stat != isc_segment)) {
efree(bl_data);
@ -106,7 +129,7 @@ int _php_ibase_blob_get(zval *return_value, ibase_blob *ib_blob, unsigned long m
}
/* }}} */
int _php_ibase_blob_add(zval **string_arg, ibase_blob *ib_blob TSRMLS_DC) /* {{{ */
PHPAPI int _php_ibase_blob_add(zval **string_arg, ibase_blob *ib_blob TSRMLS_DC) /* {{{ */
{
unsigned long put_cnt = 0, rem_cnt;
unsigned short chunk_size;
@ -114,7 +137,7 @@ int _php_ibase_blob_add(zval **string_arg, ibase_blob *ib_blob TSRMLS_DC) /* {{{
convert_to_string_ex(string_arg);
for (rem_cnt = Z_STRLEN_PP(string_arg); rem_cnt > 0; rem_cnt -= chunk_size) {
chunk_size = rem_cnt > USHRT_MAX ? USHRT_MAX : (unsigned short)rem_cnt;
if (isc_put_segment(IB_STATUS, &ib_blob->bl_handle, chunk_size, &Z_STRVAL_PP(string_arg)[put_cnt] )) {
@ -124,7 +147,7 @@ int _php_ibase_blob_add(zval **string_arg, ibase_blob *ib_blob TSRMLS_DC) /* {{{
put_cnt += chunk_size;
}
return SUCCESS;
}
}
/* }}} */
static int _php_ibase_blob_info(isc_blob_handle bl_handle, IBASE_BLOBINFO *bl_info TSRMLS_DC) /* {{{ */
@ -135,7 +158,7 @@ static int _php_ibase_blob_info(isc_blob_handle bl_handle, IBASE_BLOBINFO *bl_in
isc_info_blob_total_length,
isc_info_blob_type
};
char bl_inf[sizeof(long)*8], *p;
bl_info->max_segment = 0;
@ -190,23 +213,23 @@ PHP_FUNCTION(ibase_blob_create)
ibase_blob *ib_blob;
RESET_ERRMSG;
if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &link)) {
RETURN_FALSE;
}
PHP_IBASE_LINK_TRANS(link, ib_link, trans);
ib_blob = (ibase_blob *) emalloc(sizeof(ibase_blob));
ib_blob->bl_handle = NULL;
ib_blob->type = BLOB_INPUT;
if (isc_create_blob(IB_STATUS, &ib_link->handle, &trans->handle, &ib_blob->bl_handle, &ib_blob->bl_qd)) {
_php_ibase_error(TSRMLS_C);
efree(ib_blob);
RETURN_FALSE;
}
ZEND_REGISTER_RESOURCE(return_value, ib_blob, le_blob);
}
/* }}} */
@ -226,7 +249,7 @@ PHP_FUNCTION(ibase_blob_open)
switch (ZEND_NUM_ARGS()) {
default:
WRONG_PARAM_COUNT;
WRONG_PARAM_COUNT;
case 1:
if (FAILURE == zend_parse_parameters(1 TSRMLS_CC, "s", &blob_id, &blob_id_len)) {
RETURN_FALSE;
@ -238,13 +261,13 @@ PHP_FUNCTION(ibase_blob_open)
}
break;
}
PHP_IBASE_LINK_TRANS(link, ib_link, trans);
ib_blob = (ibase_blob *) emalloc(sizeof(ibase_blob));
ib_blob->bl_handle = NULL;
ib_blob->type = BLOB_OUTPUT;
do {
if (! _php_ibase_string_to_quad(blob_id, &ib_blob->bl_qd)) {
_php_ibase_module_error("String is not a BLOB ID" TSRMLS_CC);
@ -256,7 +279,7 @@ PHP_FUNCTION(ibase_blob_open)
_php_ibase_error(TSRMLS_C);
break;
}
ZEND_REGISTER_RESOURCE(return_value, ib_blob, le_blob);
return;
@ -327,13 +350,13 @@ static void _php_ibase_blob_end(INTERNAL_FUNCTION_PARAMETERS, int bl_end) /* {{{
ibase_blob *ib_blob;
RESET_ERRMSG;
if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &blob_arg) == FAILURE) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(ib_blob, ibase_blob *, blob_arg, -1, "Interbase blob", le_blob);
ZEND_FETCH_RESOURCE(ib_blob, ibase_blob *, blob_arg, -1, "Interbase blob", le_blob);
if (bl_end == BLOB_CLOSE) { /* return id here */
if (ib_blob->bl_qd.gds_quad_high || ib_blob->bl_qd.gds_quad_low) { /*not null ?*/
@ -389,7 +412,7 @@ PHP_FUNCTION(ibase_blob_info)
switch (ZEND_NUM_ARGS()) {
default:
WRONG_PARAM_COUNT;
WRONG_PARAM_COUNT;
case 1:
if (FAILURE == zend_parse_parameters(1 TSRMLS_CC, "s", &blob_id, &blob_id_len)) {
RETURN_FALSE;
@ -431,7 +454,7 @@ PHP_FUNCTION(ibase_blob_info)
}
array_init(return_value);
add_index_long(return_value, 0, bl_info.total_length);
add_assoc_long(return_value, "length", bl_info.total_length);
@ -457,16 +480,16 @@ PHP_FUNCTION(ibase_blob_echo)
int blob_id_len;
zval *link = NULL;
ibase_db_link *ib_link;
ibase_trans *trans = NULL;
ibase_trans *trans = NULL;
ibase_blob ib_blob_id = { NULL, BLOB_OUTPUT };
char bl_data[IBASE_BLOB_SEG];
char bl_data[IBASE_BLOB_SEG];
unsigned short seg_len;
RESET_ERRMSG;
switch (ZEND_NUM_ARGS()) {
default:
WRONG_PARAM_COUNT;
WRONG_PARAM_COUNT;
case 1:
if (FAILURE == zend_parse_parameters(1 TSRMLS_CC, "s", &blob_id, &blob_id_len)) {
RETURN_FALSE;
@ -491,16 +514,16 @@ PHP_FUNCTION(ibase_blob_echo)
&ib_blob_id.bl_qd)) {
break;
}
while (!isc_get_segment(IB_STATUS, &ib_blob_id.bl_handle, &seg_len, sizeof(bl_data), bl_data)
|| IB_STATUS[1] == isc_segment) {
PHPWRITE(bl_data, seg_len);
}
if (IB_STATUS[0] && (IB_STATUS[1] != isc_segstr_eof)) {
break;
}
if (isc_close_blob(IB_STATUS, &ib_blob_id.bl_handle)) {
break;
}
@ -527,27 +550,27 @@ PHP_FUNCTION(ibase_blob_import)
RESET_ERRMSG;
if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|r",
if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|r",
(ZEND_NUM_ARGS()-1) ? &link : &file, &file)) {
RETURN_FALSE;
}
PHP_IBASE_LINK_TRANS(link, ib_link, trans);
php_stream_from_zval(stream, &file);
do {
if (isc_create_blob(IB_STATUS, &ib_link->handle, &trans->handle, &ib_blob.bl_handle,
&ib_blob.bl_qd)) {
break;
}
for (size = 0; (b = php_stream_read(stream, bl_data, sizeof(bl_data))); size += b) {
if (isc_put_segment(IB_STATUS, &ib_blob.bl_handle, b, bl_data)) {
break;
}
}
if (isc_close_blob(IB_STATUS, &ib_blob.bl_handle)) {
break;
}

View File

@ -29,13 +29,66 @@
#include "php_interbase.h"
#include "php_ibase_includes.h"
void _php_ibase_event_free(char *event_buf, char *result_buf) /* {{{ */
static int le_event;
static void _php_ibase_event_free(char *event_buf, char *result_buf) /* {{{ */
{
isc_free(event_buf);
isc_free(result_buf);
}
/* }}} */
PHPAPI void _php_ibase_free_event(ibase_event *event TSRMLS_DC) /* {{{ */
{
unsigned short i;
event->state = DEAD;
if (event->link != NULL) {
ibase_event **node;
if (event->link->handle != NULL &&
isc_cancel_events(IB_STATUS, &event->link->handle, &event->event_id)) {
_php_ibase_error(TSRMLS_C);
}
/* delete this event from the link struct */
for (node = &event->link->event_head; *node != event; node = &(*node)->event_next);
*node = event->event_next;
}
if (event->callback) {
zval_dtor(event->callback);
FREE_ZVAL(event->callback);
event->callback = NULL;
_php_ibase_event_free(event->event_buffer,event->result_buffer);
for (i = 0; i < event->event_count; ++i) {
efree(event->events[i]);
}
efree(event->events);
}
}
/* }}} */
static void _php_ibase_free_event_rsrc(zend_rsrc_list_entry *rsrc TSRMLS_DC) /* {{{ */
{
ibase_event *e = (ibase_event *) rsrc->ptr;
_php_ibase_free_event(e TSRMLS_CC);
efree(e);
}
/* }}} */
void php_ibase_events_minit(INIT_FUNC_ARGS) /* {{{ */
{
le_event = zend_register_list_destructors_ex(_php_ibase_free_event_rsrc, NULL,
"interbase event", module_number);
}
/* }}} */
static void _php_ibase_event_block(ibase_db_link *ib_link, unsigned short count, /* {{{ */
char **events, unsigned short *l, char **event_buf, char **result_buf)
{
@ -43,7 +96,7 @@ static void _php_ibase_event_block(ibase_db_link *ib_link, unsigned short count,
unsigned long dummy_count[15];
/**
* Unfortunately, there's no clean and portable way in C to pass arguments to
* Unfortunately, there's no clean and portable way in C to pass arguments to
* a variadic function if you don't know the number of arguments at compile time.
* (And even if there were a way, the Interbase API doesn't provide a version of
* this function that takes a va_list as an argument)
@ -52,8 +105,8 @@ static void _php_ibase_event_block(ibase_db_link *ib_link, unsigned short count,
* so we can work around it.
*/
*l = (unsigned short) isc_event_block(event_buf, result_buf, count, events[0],
events[1], events[2], events[3], events[4], events[5], events[6], events[7],
*l = (unsigned short) isc_event_block(event_buf, result_buf, count, events[0],
events[1], events[2], events[3], events[4], events[5], events[6], events[7],
events[8], events[9], events[10], events[11], events[12], events[13], events[14]);
/**
@ -78,7 +131,7 @@ PHP_FUNCTION(ibase_wait_event)
char *event_buffer, *result_buffer, *events[15];
unsigned short i = 0, event_count = 0, buffer_size;
unsigned long occurred_event[15];
RESET_ERRMSG;
/* no more than 15 events */
@ -102,8 +155,8 @@ PHP_FUNCTION(ibase_wait_event)
}
ZEND_FETCH_RESOURCE2(ib_link, ibase_db_link *, NULL, IBG(default_link), "InterBase link", le_link, le_plink);
}
}
for (; i < ZEND_NUM_ARGS(); ++i) {
convert_to_string_ex(args[i]);
events[event_count++] = Z_STRVAL_PP(args[i]);
@ -118,7 +171,7 @@ PHP_FUNCTION(ibase_wait_event)
_php_ibase_event_free(event_buffer,result_buffer);
RETURN_FALSE;
}
/* find out which event occurred */
isc_event_counts(occurred_event, buffer_size, event_buffer, result_buffer);
for (i = 0; i < event_count; ++i) {
@ -128,7 +181,7 @@ PHP_FUNCTION(ibase_wait_event)
RETURN_STRING(result,0);
}
}
/* If we reach this line, isc_wait_for_event() did return, but we don't know
which event fired. */
_php_ibase_event_free(event_buffer,result_buffer);
@ -141,10 +194,10 @@ static isc_callback _php_ibase_callback(ibase_event *event, /* {{{ */
{
/* this function is called asynchronously by the Interbase client library. */
TSRMLS_FETCH_FROM_CTX(event->thread_ctx);
/**
* The callback function is called when the event is first registered and when the event
* is cancelled. I consider this is a bug. By clearing event->callback first and setting
* is cancelled. I consider this is a bug. By clearing event->callback first and setting
* it to -1 later, we make sure nothing happens if no event was actually posted.
*/
switch (event->state) {
@ -155,16 +208,16 @@ static isc_callback _php_ibase_callback(ibase_event *event, /* {{{ */
default: /* == DEAD */
break;
case ACTIVE:
args[0] = &event_name;
args[1] = &link_id;
args[0] = &event_name;
args[1] = &link_id;
/* copy the updated results into the result buffer */
memcpy(event->result_buffer, result_buf, buffer_size);
INIT_ZVAL(event_name);
INIT_ZVAL(link_id);
ZVAL_RESOURCE(&link_id, event->link_res_id);
/* find out which event occurred */
isc_event_counts(occurred_event, buffer_size, event->event_buffer, event->result_buffer);
for (i = 0; i < event->event_count; ++i) {
@ -172,24 +225,24 @@ static isc_callback _php_ibase_callback(ibase_event *event, /* {{{ */
ZVAL_STRING(&event_name,event->events[i],0);
break;
}
}
}
/* call the callback provided by the user */
if (SUCCESS != call_user_function(EG(function_table), NULL,
if (SUCCESS != call_user_function(EG(function_table), NULL,
event->callback, &return_value, 2, args TSRMLS_CC)) {
_php_ibase_module_error("Error calling callback %s" TSRMLS_CC, Z_STRVAL_P(event->callback));
break;
}
if (Z_TYPE(return_value) == IS_BOOL && !Z_BVAL(return_value)) {
event->state = DEAD;
break;
}
}
case NEW:
/* re-register the event */
if (isc_que_events(IB_STATUS, &event->link->handle, &event->event_id, buffer_size,
if (isc_que_events(IB_STATUS, &event->link->handle, &event->event_id, buffer_size,
event->event_buffer,(isc_callback)_php_ibase_callback, (void *)event)) {
_php_ibase_error(TSRMLS_C);
}
event->state = ACTIVE;
@ -203,8 +256,8 @@ static isc_callback _php_ibase_callback(ibase_event *event, /* {{{ */
PHP_FUNCTION(ibase_set_event_handler)
{
/**
* The callback passed to this function should take an event name (string) and a
* link resource id (int) as arguments. The value returned from the function is
* The callback passed to this function should take an event name (string) and a
* link resource id (int) as arguments. The value returned from the function is
* used to determine if the event handler should remain set.
*/
@ -213,7 +266,7 @@ PHP_FUNCTION(ibase_set_event_handler)
ibase_event *event;
unsigned short i = 1, buffer_size;
int link_res_id;
RESET_ERRMSG;
/* no more than 15 events */
@ -231,7 +284,7 @@ PHP_FUNCTION(ibase_set_event_handler)
cb_arg = args[1];
i = 2;
ZEND_FETCH_RESOURCE2(ib_link, ibase_db_link *, args[0], -1,
ZEND_FETCH_RESOURCE2(ib_link, ibase_db_link *, args[0], -1,
"InterBase link", le_link, le_plink);
convert_to_long_ex(args[0]);
@ -245,18 +298,18 @@ PHP_FUNCTION(ibase_set_event_handler)
cb_arg = args[0];
ZEND_FETCH_RESOURCE2(ib_link, ibase_db_link *, NULL, IBG(default_link),
ZEND_FETCH_RESOURCE2(ib_link, ibase_db_link *, NULL, IBG(default_link),
"InterBase link", le_link, le_plink);
link_res_id = IBG(default_link);
}
}
/* get the callback */
if (!zend_is_callable(*cb_arg, 0, NULL)) {
_php_ibase_module_error("Callback argument %s is not a callable function"
TSRMLS_CC, Z_STRVAL_PP(cb_arg));
RETURN_FALSE;
}
/* allocate the event resource */
event = (ibase_event *) safe_emalloc(sizeof(ibase_event), 1, 0);
TSRMLS_SET_CTX(event->thread_ctx);
@ -270,28 +323,28 @@ PHP_FUNCTION(ibase_set_event_handler)
*event->callback = **cb_arg;
INIT_PZVAL(event->callback);
zval_copy_ctor(event->callback);
for (; i < ZEND_NUM_ARGS(); ++i) {
convert_to_string_ex(args[i]);
event->events[event->event_count++] = estrdup(Z_STRVAL_PP(args[i]));
}
/* fills the required data structure with information about the events */
_php_ibase_event_block(ib_link, event->event_count, event->events,
_php_ibase_event_block(ib_link, event->event_count, event->events,
&buffer_size, &event->event_buffer, &event->result_buffer);
/* now register the events with the Interbase API */
if (isc_que_events(IB_STATUS, &ib_link->handle, &event->event_id, buffer_size,
if (isc_que_events(IB_STATUS, &ib_link->handle, &event->event_id, buffer_size,
event->event_buffer,(isc_callback)_php_ibase_callback, (void *)event)) {
_php_ibase_error(TSRMLS_C);
efree(event);
RETURN_FALSE;
}
event->event_next = ib_link->event_head;
ib_link->event_head = event;
ZEND_REGISTER_RESOURCE(return_value, event, le_event);
zend_list_addref(Z_LVAL_P(return_value));
}
@ -302,14 +355,14 @@ PHP_FUNCTION(ibase_set_event_handler)
PHP_FUNCTION(ibase_free_event_handler)
{
zval *event_arg;
RESET_ERRMSG;
if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &event_arg)) {
ibase_event *event;
ZEND_FETCH_RESOURCE(event, ibase_event *, &event_arg, -1, "Interbase event", le_event);
event->state = DEAD;
zend_list_delete(Z_LVAL_P(event_arg));
@ -317,7 +370,7 @@ PHP_FUNCTION(ibase_free_event_handler)
} else {
RETURN_FALSE;
}
}
}
/* }}} */
#endif /* HAVE_IBASE */

2131
ext/interbase/ibase_query.c Normal file

File diff suppressed because it is too large Load Diff

View File

@ -29,6 +29,97 @@
#include "php_interbase.h"
#include "php_ibase_includes.h"
static int le_service;
static void _php_ibase_free_service(zend_rsrc_list_entry *rsrc TSRMLS_DC) /* {{{ */
{
ibase_service *sv = (ibase_service *) rsrc->ptr;
if (isc_service_detach(IB_STATUS, &sv->handle)) {
_php_ibase_error(TSRMLS_C);
}
if (sv->hostname) {
efree(sv->hostname);
}
if (sv->username) {
efree(sv->username);
}
efree(sv);
}
/* }}} */
void php_ibase_service_minit(INIT_FUNC_ARGS) /* {{{ */
{
le_service = zend_register_list_destructors_ex(_php_ibase_free_service, NULL,
"interbase service manager handle", module_number);
/* backup options */
REGISTER_LONG_CONSTANT("IBASE_BKP_IGNORE_CHECKSUMS", isc_spb_bkp_ignore_checksums, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_BKP_IGNORE_LIMBO", isc_spb_bkp_ignore_limbo, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_BKP_METADATA_ONLY", isc_spb_bkp_metadata_only, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_BKP_NO_GARBAGE_COLLECT", isc_spb_bkp_no_garbage_collect, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_BKP_OLD_DESCRIPTIONS", isc_spb_bkp_old_descriptions, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_BKP_NON_TRANSPORTABLE", isc_spb_bkp_non_transportable, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_BKP_CONVERT", isc_spb_bkp_convert, CONST_PERSISTENT);
/* restore options */
REGISTER_LONG_CONSTANT("IBASE_RES_DEACTIVATE_IDX", isc_spb_res_deactivate_idx, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_RES_NO_SHADOW", isc_spb_res_no_shadow, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_RES_NO_VALIDITY", isc_spb_res_no_validity, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_RES_ONE_AT_A_TIME", isc_spb_res_one_at_a_time, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_RES_REPLACE", isc_spb_res_replace, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_RES_CREATE", isc_spb_res_create, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_RES_USE_ALL_SPACE", isc_spb_res_use_all_space, CONST_PERSISTENT);
/* manage options */
REGISTER_LONG_CONSTANT("IBASE_PRP_PAGE_BUFFERS", isc_spb_prp_page_buffers, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_PRP_SWEEP_INTERVAL", isc_spb_prp_sweep_interval, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_PRP_SHUTDOWN_DB", isc_spb_prp_shutdown_db, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_PRP_DENY_NEW_TRANSACTIONS", isc_spb_prp_deny_new_transactions, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_PRP_DENY_NEW_ATTACHMENTS", isc_spb_prp_deny_new_attachments, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_PRP_RESERVE_SPACE", isc_spb_prp_reserve_space, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_PRP_RES_USE_FULL", isc_spb_prp_res_use_full, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_PRP_RES", isc_spb_prp_res, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_PRP_WRITE_MODE", isc_spb_prp_write_mode, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_PRP_WM_ASYNC", isc_spb_prp_wm_async, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_PRP_WM_SYNC", isc_spb_prp_wm_sync, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_PRP_ACCESS_MODE", isc_spb_prp_access_mode, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_PRP_AM_READONLY", isc_spb_prp_am_readonly, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_PRP_AM_READWRITE", isc_spb_prp_am_readwrite, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_PRP_SET_SQL_DIALECT", isc_spb_prp_set_sql_dialect, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_PRP_ACTIVATE", isc_spb_prp_activate, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_PRP_DB_ONLINE", isc_spb_prp_db_online, CONST_PERSISTENT);
/* repair options */
REGISTER_LONG_CONSTANT("IBASE_RPR_CHECK_DB", isc_spb_rpr_check_db, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_RPR_IGNORE_CHECKSUM", isc_spb_rpr_ignore_checksum, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_RPR_KILL_SHADOWS", isc_spb_rpr_kill_shadows, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_RPR_MEND_DB", isc_spb_rpr_mend_db, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_RPR_VALIDATE_DB", isc_spb_rpr_validate_db, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_RPR_FULL", isc_spb_rpr_full, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_RPR_SWEEP_DB", isc_spb_rpr_sweep_db, CONST_PERSISTENT);
/* db info arguments */
REGISTER_LONG_CONSTANT("IBASE_STS_DATA_PAGES", isc_spb_sts_data_pages, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_STS_DB_LOG", isc_spb_sts_db_log, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_STS_HDR_PAGES", isc_spb_sts_hdr_pages, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_STS_IDX_PAGES", isc_spb_sts_idx_pages, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_STS_SYS_RELATIONS", isc_spb_sts_sys_relations, CONST_PERSISTENT);
/* server info arguments */
REGISTER_LONG_CONSTANT("IBASE_SVC_SERVER_VERSION", isc_info_svc_server_version, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_SVC_IMPLEMENTATION", isc_info_svc_implementation, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_SVC_GET_ENV", isc_info_svc_get_env, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_SVC_GET_ENV_LOCK", isc_info_svc_get_env_lock, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_SVC_GET_ENV_MSG", isc_info_svc_get_env_msg, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_SVC_USER_DBPATH", isc_info_svc_user_dbpath, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_SVC_SVR_DB_INFO", isc_info_svc_svr_db_info, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_SVC_GET_USERS", isc_info_svc_get_users, CONST_PERSISTENT);
}
/* }}} */
static void _php_ibase_user(INTERNAL_FUNCTION_PARAMETERS, int operation) /* {{{ */
{
zval **args[8];
@ -38,7 +129,7 @@ static void _php_ibase_user(INTERNAL_FUNCTION_PARAMETERS, int operation) /* {{{
char spb_buffer[128], *spb = spb_buffer;
unsigned short spb_length;
isc_svc_handle service_handle = NULL;
RESET_ERRMSG;
switch (operation) {
@ -49,7 +140,7 @@ static void _php_ibase_user(INTERNAL_FUNCTION_PARAMETERS, int operation) /* {{{
WRONG_PARAM_COUNT;
}
break;
case isc_action_svc_delete_user:
/* 4 parameters for DELETE operation */
if (ZEND_NUM_ARGS() != 4) {
@ -161,7 +252,7 @@ static void _php_ibase_user(INTERNAL_FUNCTION_PARAMETERS, int operation) /* {{{
isc_service_detach(IB_STATUS, &service_handle);
}
}
RETURN_TRUE;
}
/* }}} */
@ -190,7 +281,7 @@ PHP_FUNCTION(ibase_delete_user)
}
/* }}} */
/* {{{ proto resource ibase_service_attach(string host, string dba_username, string dba_password)
/* {{{ proto resource ibase_service_attach(string host, string dba_username, string dba_password)
Connect to the service manager */
PHP_FUNCTION(ibase_service_attach)
{
@ -200,33 +291,33 @@ PHP_FUNCTION(ibase_service_attach)
isc_svc_handle handle = NULL;
RESET_ERRMSG;
if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sss",
if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sss",
&host, &hlen, &user, &ulen, &pass, &plen)) {
RETURN_FALSE;
}
/* construct the spb, hack the service name into it as well */
spb_len = snprintf(buf, sizeof(buf), "%c%c%c%c%s%c%c%s" "%s:service_mgr",
spb_len = snprintf(buf, sizeof(buf), "%c%c%c%c%s%c%c%s" "%s:service_mgr",
isc_spb_version, isc_spb_current_version, isc_spb_user_name, (char)ulen,
user, isc_spb_password, (char)plen, pass, host);
if (spb_len > sizeof(buf) || spb_len == -1) {
_php_ibase_module_error("Internal error: insufficient buffer space for SPB (%ld)"
_php_ibase_module_error("Internal error: insufficient buffer space for SPB (%ld)"
TSRMLS_CC, spb_len);
RETURN_FALSE;
}
spb_len -= hlen + 12;
loc = buf + spb_len; /* points to %s:service_mgr part */
/* attach to the service manager */
if (isc_service_attach(IB_STATUS, 0, loc, &handle, (unsigned short)spb_len, buf)) {
_php_ibase_error(TSRMLS_C);
RETURN_FALSE;
}
svm = (ibase_service*)emalloc(sizeof(ibase_service));
svm->handle = handle;
svm->hostname = estrdup(host);
@ -237,20 +328,20 @@ PHP_FUNCTION(ibase_service_attach)
}
/* }}} */
/* {{{ proto bool ibase_service_detach(resource service_handle)
/* {{{ proto bool ibase_service_detach(resource service_handle)
Disconnect from the service manager */
PHP_FUNCTION(ibase_service_detach)
{
zval *res;
RESET_ERRMSG;
if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &res)) {
RETURN_FALSE;
if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &res)) {
RETURN_FALSE;
}
zend_list_delete(Z_LVAL_P(res));
RETURN_TRUE;
}
/* }}} */
@ -259,7 +350,7 @@ static void _php_ibase_service_query(INTERNAL_FUNCTION_PARAMETERS, /* {{{ */
ibase_service *svm, char info_action)
{
static char spb[] = { isc_info_svc_timeout, 10, 0, 0, 0 };
char res_buf[400], *result, *heap_buf = NULL, *heap_p;
long heap_buf_size = 200, line_len;
@ -272,13 +363,13 @@ static void _php_ibase_service_query(INTERNAL_FUNCTION_PARAMETERS, /* {{{ */
RETURN_FALSE;
}
}
query_loop:
query_loop:
result = res_buf;
if (isc_service_query(IB_STATUS, &svm->handle, NULL, sizeof(spb), spb,
1, &info_action, sizeof(res_buf), res_buf)) {
_php_ibase_error(TSRMLS_C);
RETURN_FALSE;
}
@ -286,8 +377,8 @@ query_loop:
switch (*result++) {
default:
RETURN_FALSE;
case isc_info_svc_line:
case isc_info_svc_line:
if (! (line_len = isc_vax_integer(result, 2))) {
/* done */
if (heap_buf) {
@ -298,9 +389,9 @@ query_loop:
}
if (!heap_buf || (heap_p - heap_buf + line_len +2) > heap_buf_size) {
long res_size = heap_buf ? heap_p - heap_buf : 0;
while (heap_buf_size < (res_size + line_len +2)) {
heap_buf_size *= 2;
heap_buf_size *= 2;
}
heap_buf = (char*) erealloc(heap_buf, heap_buf_size);
heap_p = heap_buf + res_size;
@ -316,7 +407,7 @@ query_loop:
case isc_info_svc_get_env_lock:
case isc_info_svc_get_env_msg:
case isc_info_svc_user_dbpath:
RETURN_STRINGL(result + 2, isc_vax_integer(result, 2), 1);
RETURN_STRINGL(result + 2, isc_vax_integer(result, 2), 1);
case isc_info_svc_svr_db_info:
array_init(return_value);
@ -329,7 +420,7 @@ query_loop:
add_assoc_long(return_value, "attachments", isc_vax_integer(result,4));
result += 4;
break;
case isc_spb_num_db:
add_assoc_long(return_value, "databases", isc_vax_integer(result,4));
result += 4;
@ -342,16 +433,16 @@ query_loop:
}
} while (*result != isc_info_flag_end);
return;
case isc_info_svc_get_users: {
zval *user;
array_init(return_value);
while (*result != isc_info_end) {
switch (*result++) {
int len;
case isc_spb_sec_username:
/* it appears that the username is always first */
ALLOC_INIT_ZVAL(user);
@ -362,7 +453,7 @@ query_loop:
add_assoc_stringl(user, "user_name", result +2, len, 1);
result += len+2;
break;
case isc_spb_sec_firstname:
len = isc_vax_integer(result,2);
add_assoc_stringl(user, "first_name", result +2, len, 1);
@ -385,14 +476,14 @@ query_loop:
add_assoc_long(user, "user_id", isc_vax_integer(result, 4));
result += 4;
break;
case isc_spb_sec_groupid:
add_assoc_long(user, "group_id", isc_vax_integer(result, 4));
result += 4;
break;
}
}
return;
return;
}
}
}
@ -404,47 +495,47 @@ static void _php_ibase_backup_restore(INTERNAL_FUNCTION_PARAMETERS, char operati
/**
* It appears that the service API is a little bit confused about which flag
* to use for the source and destination in the case of a restore operation.
* When passing the backup file as isc_spb_dbname and the destination db as
* When passing the backup file as isc_spb_dbname and the destination db as
* bpk_file, things work well.
*/
zval *res;
char *db, *bk, buf[200];
char *db, *bk, buf[200];
long dblen, bklen, spb_len, opts = 0;
zend_bool verbose = 0;
ibase_service *svm;
RESET_ERRMSG;
if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rss|lb",
&res, &db, &dblen, &bk, &bklen, &opts, &verbose)) {
RETURN_FALSE;
&res, &db, &dblen, &bk, &bklen, &opts, &verbose)) {
RETURN_FALSE;
}
ZEND_FETCH_RESOURCE(svm, ibase_service *, &res, -1,
ZEND_FETCH_RESOURCE(svm, ibase_service *, &res, -1,
"Interbase service manager handle", le_service);
/* fill the param buffer */
spb_len = snprintf(buf, sizeof(buf), "%c%c%c%c%s%c%c%c%s%c%c%c%c%c",
operation, isc_spb_dbname, (char)dblen, (char)(dblen >> 8), db,
spb_len = snprintf(buf, sizeof(buf), "%c%c%c%c%s%c%c%c%s%c%c%c%c%c",
operation, isc_spb_dbname, (char)dblen, (char)(dblen >> 8), db,
isc_spb_bkp_file, (char)bklen, (char)(bklen >> 8), bk, isc_spb_options,
(char)opts,(char)(opts >> 8), (char)(opts >> 16), (char)(opts >> 24));
if (verbose) {
buf[spb_len++] = isc_spb_verbose;
}
if (spb_len > sizeof(buf) || spb_len <= 0) {
_php_ibase_module_error("Internal error: insufficient buffer space for SPB (%ld)"
_php_ibase_module_error("Internal error: insufficient buffer space for SPB (%ld)"
TSRMLS_CC, spb_len);
RETURN_FALSE;
}
/* now start the backup/restore job */
if (isc_service_start(IB_STATUS, &svm->handle, NULL, (unsigned short)spb_len, buf)) {
_php_ibase_error(TSRMLS_C);
RETURN_FALSE;
}
if (!verbose) {
RETURN_TRUE;
} else {
@ -475,22 +566,22 @@ static void _php_ibase_service_action(INTERNAL_FUNCTION_PARAMETERS, char svc_act
char buf[128], *db;
long action, spb_len, dblen, argument = 0;
ibase_service *svm;
RESET_ERRMSG;
if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rsl|l",
&res, &db, &dblen, &action, &argument)) {
RETURN_FALSE;
&res, &db, &dblen, &action, &argument)) {
RETURN_FALSE;
}
ZEND_FETCH_RESOURCE(svm, ibase_service *, &res, -1,
ZEND_FETCH_RESOURCE(svm, ibase_service *, &res, -1,
"Interbase service manager handle", le_service);
if (svc_action == isc_action_svc_db_stats) {
switch (action) {
default:
goto unknown_option;
case isc_spb_sts_data_pages:
case isc_spb_sts_db_log:
case isc_spb_sts_hdr_pages:
@ -502,10 +593,10 @@ static void _php_ibase_service_action(INTERNAL_FUNCTION_PARAMETERS, char svc_act
/* these actions all expect different types of arguments */
switch (action) {
default:
unknown_option:
unknown_option:
_php_ibase_module_error("Unrecognised option (%ld)" TSRMLS_CC, action);
RETURN_FALSE;
case isc_spb_rpr_check_db:
case isc_spb_rpr_ignore_checksum:
case isc_spb_rpr_kill_shadows:
@ -513,13 +604,13 @@ unknown_option:
case isc_spb_rpr_validate_db:
case isc_spb_rpr_sweep_db:
svc_action = isc_action_svc_repair;
case isc_spb_prp_activate:
case isc_spb_prp_db_online:
options_argument:
options_argument:
argument |= action;
action = isc_spb_options;
case isc_spb_prp_page_buffers:
case isc_spb_prp_sweep_interval:
case isc_spb_prp_shutdown_db:
@ -527,22 +618,22 @@ options_argument:
case isc_spb_prp_deny_new_attachments:
case isc_spb_prp_set_sql_dialect:
spb_len = snprintf(buf, sizeof(buf), "%c%c%c%c%s%c%c%c%c%c",
svc_action, isc_spb_dbname, (char)dblen, (char)(dblen >> 8), db,
svc_action, isc_spb_dbname, (char)dblen, (char)(dblen >> 8), db,
(char)action, (char)argument, (char)(argument >> 8), (char)(argument >> 16),
(char)(argument >> 24));
break;
case isc_spb_prp_reserve_space:
case isc_spb_prp_write_mode:
case isc_spb_prp_access_mode:
spb_len = snprintf(buf, sizeof(buf), "%c%c%c%c%s%c%c",
isc_action_svc_properties, isc_spb_dbname, (char)dblen, (char)(dblen >> 8),
isc_action_svc_properties, isc_spb_dbname, (char)dblen, (char)(dblen >> 8),
db, (char)action, (char)argument);
}
}
if (spb_len > sizeof(buf) || spb_len == -1) {
_php_ibase_module_error("Internal error: insufficient buffer space for SPB (%ld)"
_php_ibase_module_error("Internal error: insufficient buffer space for SPB (%ld)"
TSRMLS_CC, spb_len);
RETURN_FALSE;
}
@ -551,14 +642,14 @@ options_argument:
_php_ibase_error(TSRMLS_C);
RETURN_FALSE;
}
if (svc_action == isc_action_svc_db_stats) {
_php_ibase_service_query(INTERNAL_FUNCTION_PARAM_PASSTHRU, svm, isc_info_svc_line);
} else {
RETURN_TRUE;
}
}
/* }}} */
}
/* }}} */
/* {{{ proto bool ibase_maintain_db(resource service_handle, string db, int action [, int argument])
Execute a maintenance command on the database server */
@ -577,29 +668,33 @@ PHP_FUNCTION(ibase_db_info)
/* }}} */
/* {{{ proto string ibase_server_info(resource service_handle, int action)
Request information about a database */
Request information about a database server */
PHP_FUNCTION(ibase_server_info)
{
zval *res;
long action;
ibase_service *svm;
RESET_ERRMSG;
if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &res, &action)) {
RETURN_FALSE;
if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &res, &action)) {
RETURN_FALSE;
}
ZEND_FETCH_RESOURCE(svm, ibase_service *, &res, -1,
ZEND_FETCH_RESOURCE(svm, ibase_service *, &res, -1,
"Interbase service manager handle", le_service);
_php_ibase_service_query(INTERNAL_FUNCTION_PARAM_PASSTHRU, svm, (char)action);
}
/* }}} */
#else
void php_ibase_register_service_constants(INIT_FUNC_ARGS) { /* nop */ }
#endif /* HAVE_IBASE6_API */
/*
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4

File diff suppressed because it is too large Load Diff

View File

@ -46,8 +46,15 @@ typedef unsigned long long ISC_UINT64;
#define IB_STATUS (IBG(status))
extern int le_blob, le_link, le_plink, le_result, le_query, le_trans,
le_event, le_service;
#ifdef ZEND_DEBUG_
#define IBDEBUG(a) php_printf("::: %s (%d)\n", a, __LINE__);
#endif
#ifndef IBDEBUG
#define IBDEBUG(a)
#endif
extern int le_link, le_plink, le_trans;
#define IBASE_MSGSIZE 256
#define MAX_ERRMSG (IBASE_MSGSIZE*2)
@ -154,7 +161,7 @@ enum php_interbase_option {
PHP_IBASE_TIMESTAMP = 1,
PHP_IBASE_DATE = 2,
PHP_IBASE_TIME = 4,
/* transaction access mode */
/* transaction access mode */
PHP_IBASE_WRITE = 1,
PHP_IBASE_READ = 2,
/* transaction isolation level */
@ -190,14 +197,9 @@ typedef void (__stdcall *info_func_t)(char*);
typedef void (*info_func_t)(char*);
#endif
int _php_ibase_string_to_quad(char const *id, ISC_QUAD *qd);
char *_php_ibase_quad_to_string(ISC_QUAD const qd);
int _php_ibase_blob_get(zval *return_value, ibase_blob *ib_blob, unsigned long max_len TSRMLS_DC);
int _php_ibase_blob_add(zval **string_arg, ibase_blob *ib_blob TSRMLS_DC);
void _php_ibase_error(TSRMLS_D);
void _php_ibase_module_error(char * TSRMLS_DC, ...)
PHP_ATTRIBUTE_FORMAT(printf,1,PHP_ATTR_FMT_OFFSET +2);
PHPAPI void _php_ibase_error(TSRMLS_D);
PHPAPI void _php_ibase_module_error(char * TSRMLS_DC, ...)
PHP_ATTRIBUTE_FORMAT(printf,1,PHP_ATTR_FMT_OFFSET +2);
/* determine if a resource is a link or transaction handle */
#define PHP_IBASE_LINK_TRANS(pzval, lh, th) \
@ -208,12 +210,27 @@ void _php_ibase_module_error(char * TSRMLS_DC, ...)
_php_ibase_get_link_trans(INTERNAL_FUNCTION_PARAM_PASSTHRU, &pzval, &lh, &th); \
if (SUCCESS != _php_ibase_def_trans(lh, &th TSRMLS_CC)) { RETURN_FALSE; } \
} while (0)
int _php_ibase_def_trans(ibase_db_link *ib_link, ibase_trans **trans TSRMLS_DC);
void _php_ibase_get_link_trans(INTERNAL_FUNCTION_PARAMETERS, zval **link_id,
PHPAPI int _php_ibase_def_trans(ibase_db_link *ib_link, ibase_trans **trans TSRMLS_DC);
PHPAPI void _php_ibase_get_link_trans(INTERNAL_FUNCTION_PARAMETERS, zval **link_id,
ibase_db_link **ib_link, ibase_trans **trans);
void _php_ibase_event_free(char *event_buf, char *result_buf);
/* provided by ibase_query.c */
void php_ibase_query_minit(INIT_FUNC_ARGS);
/* provided by ibase_blobs.c */
void php_ibase_blobs_minit(INIT_FUNC_ARGS);
PHPAPI int _php_ibase_string_to_quad(char const *id, ISC_QUAD *qd);
PHPAPI char *_php_ibase_quad_to_string(ISC_QUAD const qd);
PHPAPI int _php_ibase_blob_get(zval *return_value, ibase_blob *ib_blob, unsigned long max_len TSRMLS_DC);
PHPAPI int _php_ibase_blob_add(zval **string_arg, ibase_blob *ib_blob TSRMLS_DC);
/* provided by ibase_events.c */
void php_ibase_events_minit(INIT_FUNC_ARGS);
PHPAPI void _php_ibase_free_event(ibase_event *event TSRMLS_DC);
/* provided by ibase_service.c */
void php_ibase_service_minit(INIT_FUNC_ARGS);
#ifndef max
#define max(a,b) ((a)>(b)?(a):(b))