abies           Thu Aug 14 06:55:02 2003 EDT

  Modified files:              
    /php-src/ext/interbase      php_interbase.h interbase.c 
  Log:
  Added ibase_wait_event()
  
  
Index: php-src/ext/interbase/php_interbase.h
diff -u php-src/ext/interbase/php_interbase.h:1.47 
php-src/ext/interbase/php_interbase.h:1.48
--- php-src/ext/interbase/php_interbase.h:1.47  Tue Aug 12 22:19:14 2003
+++ php-src/ext/interbase/php_interbase.h       Thu Aug 14 06:55:02 2003
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: php_interbase.h,v 1.47 2003/08/13 02:19:14 abies Exp $ */
+/* $Id: php_interbase.h,v 1.48 2003/08/14 10:55:02 abies Exp $ */
 
 #ifndef PHP_INTERBASE_H
 #define PHP_INTERBASE_H
@@ -89,6 +89,8 @@
 #endif
 PHP_FUNCTION(ibase_errmsg);
 PHP_FUNCTION(ibase_errcode);
+
+PHP_FUNCTION(ibase_wait_event);
 
 #define IBASE_MSGSIZE 256
 #define MAX_ERRMSG (IBASE_MSGSIZE*2)
Index: php-src/ext/interbase/interbase.c
diff -u php-src/ext/interbase/interbase.c:1.139 php-src/ext/interbase/interbase.c:1.140
--- php-src/ext/interbase/interbase.c:1.139     Wed Aug 13 06:35:14 2003
+++ php-src/ext/interbase/interbase.c   Thu Aug 14 06:55:02 2003
@@ -17,11 +17,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: interbase.c,v 1.139 2003/08/13 10:35:14 sniper Exp $ */
-
-
-/* TODO: Arrays, roles?
-A lot... */
+/* $Id: interbase.c,v 1.140 2003/08/14 10:55:02 abies Exp $ */
 
 /*
        Changes:
@@ -139,6 +135,7 @@
        PHP_FE(ibase_modify_user, NULL)
        PHP_FE(ibase_delete_user, NULL)
 #endif
+       PHP_FE(ibase_wait_event, NULL)
        {NULL, NULL, NULL}
 };
 
@@ -698,7 +695,7 @@
 
        php_info_print_table_start();
        php_info_print_table_row(2, "Interbase Support", "enabled");
-       php_info_print_table_row(2, "Revision", "$Revision: 1.139 $");
+       php_info_print_table_row(2, "Revision", "$Revision: 1.140 $");
 #ifdef COMPILE_DL_INTERBASE
        php_info_print_table_row(2, "Dynamic Module", "Yes");
 #endif
@@ -3798,6 +3795,117 @@
 }
 /* }}} */
 #endif /* SQL_DIALECT_V6 */
+
+/* {{{ _php_ibase_event_block() */
+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)
+{
+       ISC_STATUS dummy_result[20];
+
+       /**
+        * 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)
+        *
+        * In this case, the number of arguments is limited to 18 by the underlying 
API,
+        * 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], 
+               events[8], events[9], events[10], events[11], events[12], events[13], 
events[14]);
+
+       /**
+        * Currently, this is the only way to correctly initialize an event buffer.
+        * This is clearly something that should be fixed, cause the semantics of
+        * isc_wait_for_event() indicate that it blocks until an event occurs.
+        * If the Firebird people ever fix this, these lines should be removed,
+        * otherwise, events will have to fire twice before ibase_wait_event() returns.
+        */
+
+       isc_wait_for_event(dummy_result, &ib_link->handle, *l, *event_buf, 
*result_buf);
+       isc_event_counts(dummy_result, *l, *event_buf, *result_buf);
+}
+/* }}} */
+
+/* {{{ _php_ibase_event_free() */
+static void _php_ibase_event_free(char *event_buf, char *result_buf)
+{
+       isc_free(event_buf);
+       isc_free(result_buf);
+}
+/* }}} */
+
+/* {{{ proto string ibase_wait_event([resource link,] string event [, string event [, 
...]])
+   Waits for any one of the passed Interbase events to be posted by the database, and 
returns its name */
+PHP_FUNCTION(ibase_wait_event)
+{
+       zval ***args;
+       ibase_db_link *ib_link;
+       char *event_buffer, *result_buffer, *events[15];
+       unsigned short i = 0, event_count = 0, buffer_size;
+       ISC_STATUS occurred_event[15];
+       
+       RESET_ERRMSG;
+
+       /* no more than 15 events */
+       if (ZEND_NUM_ARGS() < 1 || ZEND_NUM_ARGS() > 16) {
+               WRONG_PARAM_COUNT;
+       }
+
+       args = (zval ***) safe_emalloc(sizeof(zval **), ZEND_NUM_ARGS(), 0);
+       if (zend_get_parameters_array_ex(ZEND_NUM_ARGS(), args) == FAILURE) {
+               efree(args);
+               RETURN_FALSE;
+       }
+
+       if (Z_TYPE_PP(args[0]) == IS_RESOURCE) {
+
+               ZEND_FETCH_RESOURCE2(ib_link, ibase_db_link *, args[0], -1, "InterBase 
link", le_link, le_plink);
+               i = 1;
+
+       } else if (ZEND_NUM_ARGS() > 15) {
+               efree(args);
+               WRONG_PARAM_COUNT;
+       }                               
+
+       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]);
+       }
+
+       /* fills the required data structure with information about the events */
+       _php_ibase_event_block(ib_link, event_count, events, &buffer_size, 
&event_buffer, &result_buffer);
+
+       /* now block until an event occurs */
+       if (isc_wait_for_event(IB_STATUS, &ib_link->handle, buffer_size, event_buffer, 
result_buffer)) {
+               _php_ibase_error(TSRMLS_C);
+               _php_ibase_event_free(event_buffer,result_buffer);
+               efree(args);
+               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) {
+               if (occurred_event[i]) {
+                       char *result = estrdup(events[i]);
+                       _php_ibase_event_free(event_buffer,result_buffer);
+                       efree(args);
+                       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);
+       efree(args);
+       RETURN_FALSE;
+}
+/* }}} */
 
 #endif /* HAVE_IBASE */
 



-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to