From c5e31d5d4f67df1d1b6ac95d36f5b0c38afc866d Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Mon, 14 Jul 2014 18:21:46 +0200 Subject: [PATCH] unregister eventhandler --- TODO | 1 - src/php_pqconn.c | 29 +++++++++++++++++++++++++++-- tests/trans001.phpt | 5 ++--- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/TODO b/TODO index b05f093..be41c6c 100644 --- a/TODO +++ b/TODO @@ -1,7 +1,6 @@ * COPY: getAsync & putAsync * CURSOR: *Async() * fetchInto/fetchCtor? -* unregister event handler? * binary protocol? * parse explicit array dimension information in front of arrays * compat for box arrays diff --git a/src/php_pqconn.c b/src/php_pqconn.c index 916acdc..cb2d72f 100644 --- a/src/php_pqconn.c +++ b/src/php_pqconn.c @@ -428,7 +428,7 @@ static void php_pqconn_wakeup(php_persistent_handle_factory_t *f, void **handle // FIXME: ping server } -static inline PGresult *unlisten(php_pqconn_t *conn, const char *channel_str, size_t channel_len TSRMLS_DC) +static inline PGresult *unlisten(PGconn *conn, const char *channel_str, size_t channel_len TSRMLS_DC) { char *quoted_channel = PQescapeIdentifier(conn, channel_str, channel_len); PGresult *res = NULL; @@ -440,7 +440,7 @@ static inline PGresult *unlisten(php_pqconn_t *conn, const char *channel_str, si smart_str_appends(&cmd, quoted_channel); smart_str_0(&cmd); - res = PQexec(conn, cmd); + res = PQexec(conn, cmd.c); smart_str_free(&cmd); PQfreemem(quoted_channel); @@ -1655,6 +1655,30 @@ static PHP_METHOD(pqconn, trace) { } } +ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_off, 0, 0, 1) + ZEND_ARG_INFO(0, type) +ZEND_END_ARG_INFO(); +static PHP_METHOD(pqconn, off) { + zend_error_handling zeh; + char *type_str; + int type_len; + STATUS rv; + + zend_replace_error_handling(EH_THROW, exce(EX_INVALID_ARGUMENT), &zeh TSRMLS_CC); + rv = zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &type_str, &type_len); + zend_restore_error_handling(&zeh TSRMLS_CC); + + if (SUCCESS == rv) { + php_pqconn_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC); + + if (!obj->intern) { + throw_exce(EX_UNINITIALIZED TSRMLS_CC, "pq\\Connection not initialized"); + } else { + RETURN_BOOL(SUCCESS == zend_hash_del(&obj->intern->eventhandlers, type_str, type_len + 1)); + } + } +} + ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_on, 0, 0, 2) ZEND_ARG_INFO(0, type) ZEND_ARG_INFO(0, callable) @@ -1758,6 +1782,7 @@ static zend_function_entry php_pqconn_methods[] = { PHP_ME(pqconn, startTransaction, ai_pqconn_start_transaction, ZEND_ACC_PUBLIC) PHP_ME(pqconn, startTransactionAsync, ai_pqconn_start_transaction_async, ZEND_ACC_PUBLIC) PHP_ME(pqconn, trace, ai_pqconn_trace, ZEND_ACC_PUBLIC) + PHP_ME(pqconn, off, ai_pqconn_off, ZEND_ACC_PUBLIC) PHP_ME(pqconn, on, ai_pqconn_on, ZEND_ACC_PUBLIC) PHP_ME(pqconn, setConverter, ai_pqconn_set_converter, ZEND_ACC_PUBLIC) {0} diff --git a/tests/trans001.phpt b/tests/trans001.phpt index 5361798..c22f2a9 100644 --- a/tests/trans001.phpt +++ b/tests/trans001.phpt @@ -11,14 +11,13 @@ include "_setup.inc"; $c = new pq\Connection(PQ_DSN); $c->exec("DROP TABLE IF EXISTS test"); $c->on(pq\Connection::EVENT_NOTICE, function($c, $notice) { - if ($notice !== 'CREATE TABLE will create implicit sequence "test_id_seq" for serial column "test.id"') { - echo "Got notice: $notice\n"; - } + echo "Got notice: $notice\n"; }); var_dump($c->transactionStatus == pq\Connection::TRANS_IDLE); $t = new pq\Transaction($c); var_dump($t->connection->transactionStatus == pq\Connection::TRANS_INTRANS); $c->exec("DROP TABLE IF EXISTS test"); +$c->off(pq\Connection::EVENT_NOTICE); $c->exec("CREATE TABLE test (id serial, data text)"); $s = $c->prepare("test_insert", "INSERT INTO test (data) VALUES (\$1)", array((new pq\Types($c))["text"]->oid)); $s->exec(array("a")); -- 2.30.2