mirror of
https://github.com/php/php-src.git
synced 2024-09-22 10:27:25 +00:00
More divide & conquer
This commit is contained in:
parent
f9c5fc6ecb
commit
18fa461119
@ -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
|
||||
|
@ -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") {
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
2131
ext/interbase/ibase_query.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -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
@ -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))
|
||||
|
Loading…
Reference in New Issue
Block a user