X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-pq;a=blobdiff_plain;f=src%2Fphp_pqconn.c;h=e730dcdb56cd3d40842b55ab0f56ffe25b8ca4a6;hp=916acdcbd3232345e26e1fd12c378a8458a4b19d;hb=d613997b3072b8093bca3fe9d8aca115e2a579aa;hpb=7e633cc0ddf139abbfc591b1e27d0bf9f17bebbf diff --git a/src/php_pqconn.c b/src/php_pqconn.c index 916acdc..e730dcd 100644 --- a/src/php_pqconn.c +++ b/src/php_pqconn.c @@ -349,6 +349,92 @@ static void php_pqconn_object_read_event_handlers(zval *object, void *o, zval *r zend_hash_apply_with_arguments(&obj->intern->eventhandlers TSRMLS_CC, apply_read_event_handlers, 1, Z_ARRVAL_P(return_value) TSRMLS_CC); } +static void php_pqconn_object_read_def_fetch_type(zval *object, void *o, zval *return_value TSRMLS_DC) +{ + php_pqconn_object_t *obj = o; + + RETVAL_LONG(obj->intern->default_fetch_type); +} +static void php_pqconn_object_write_def_fetch_type(zval *object, void *o, zval *value TSRMLS_DC) +{ + php_pqconn_object_t *obj = o; + zval *zft = value; + + if (Z_TYPE_P(zft) != IS_LONG) { + if (Z_REFCOUNT_P(zft) > 1) { + zval *tmp; + MAKE_STD_ZVAL(tmp); + ZVAL_ZVAL(tmp, zft, 1, 0); + convert_to_long(tmp); + zft = tmp; + } else { + convert_to_long_ex(&zft); + } + } + + obj->intern->default_fetch_type = Z_LVAL_P(zft) & 0x2; /* two bits only */ + + if (zft != value) { + zval_ptr_dtor(&zft); + } +} + +static void php_pqconn_object_read_def_txn_isolation(zval *object, void *o, zval *return_value TSRMLS_DC) +{ + php_pqconn_object_t *obj = o; + + RETVAL_LONG(obj->intern->default_txn_isolation); +} +static void php_pqconn_object_write_def_txn_isolation(zval *object, void *o, zval *value TSRMLS_DC) +{ + php_pqconn_object_t *obj = o; + zval *zti = value; + + if (Z_TYPE_P(zti) != IS_LONG) { + if (Z_REFCOUNT_P(zti) > 1) { + zval *tmp; + MAKE_STD_ZVAL(tmp); + ZVAL_ZVAL(tmp, zti, 1, 0); + convert_to_long(tmp); + zti = tmp; + } else { + convert_to_long_ex(&zti); + } + } + + obj->intern->default_txn_isolation = Z_LVAL_P(zti) & 0x2; /* two bits only */ + + if (zti != value) { + zval_ptr_dtor(&zti); + } +} + +static void php_pqconn_object_read_def_txn_readonly(zval *object, void *o, zval *return_value TSRMLS_DC) +{ + php_pqconn_object_t *obj = o; + + RETVAL_BOOL(obj->intern->default_txn_readonly); +} +static void php_pqconn_object_write_def_txn_readonly(zval *object, void *o, zval *value TSRMLS_DC) +{ + php_pqconn_object_t *obj = o; + + obj->intern->default_txn_readonly = zend_is_true(value); +} + +static void php_pqconn_object_read_def_txn_deferrable(zval *object, void *o, zval *return_value TSRMLS_DC) +{ + php_pqconn_object_t *obj = o; + + RETVAL_BOOL(obj->intern->default_txn_deferrable); +} +static void php_pqconn_object_write_def_txn_deferrable(zval *object, void *o, zval *value TSRMLS_DC) +{ + php_pqconn_object_t *obj = o; + + obj->intern->default_txn_deferrable = zend_is_true(value); +} + static STATUS php_pqconn_update_socket(zval *this_ptr, php_pqconn_object_t *obj TSRMLS_DC) { zval *zsocket, zmember; @@ -428,7 +514,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 +526,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); @@ -1559,8 +1645,10 @@ ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_start_transaction, 0, 0, 0) ZEND_END_ARG_INFO(); static PHP_METHOD(pqconn, startTransaction) { zend_error_handling zeh; - long isolation = PHP_PQTXN_READ_COMMITTED; - zend_bool readonly = 0, deferrable = 0; + php_pqconn_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC); + long isolation = obj->intern ? obj->intern->default_txn_isolation : PHP_PQTXN_READ_COMMITTED; + zend_bool readonly = obj->intern ? obj->intern->default_txn_readonly : 0; + zend_bool deferrable = obj->intern ? obj->intern->default_txn_deferrable : 0; STATUS rv; zend_replace_error_handling(EH_THROW, exce(EX_INVALID_ARGUMENT), &zeh TSRMLS_CC); @@ -1568,8 +1656,6 @@ static PHP_METHOD(pqconn, startTransaction) { zend_restore_error_handling(&zeh TSRMLS_CC); if (SUCCESS == rv) { - php_pqconn_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC); - rv = php_pqconn_start_transaction(getThis(), obj, isolation, readonly, deferrable TSRMLS_CC); if (SUCCESS == rv) { @@ -1595,16 +1681,17 @@ ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_start_transaction_async, 0, 0, 0) ZEND_END_ARG_INFO(); static PHP_METHOD(pqconn, startTransactionAsync) { zend_error_handling zeh; - long isolation = PHP_PQTXN_READ_COMMITTED; - zend_bool readonly = 0, deferrable = 0; + php_pqconn_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC); + long isolation = obj->intern ? obj->intern->default_txn_isolation : PHP_PQTXN_READ_COMMITTED; + zend_bool readonly = obj->intern ? obj->intern->default_txn_readonly : 0; + zend_bool deferrable = obj->intern ? obj->intern->default_txn_deferrable : 0; STATUS rv; zend_replace_error_handling(EH_THROW, exce(EX_INVALID_ARGUMENT), &zeh TSRMLS_CC); rv = zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|lbb", &isolation, &readonly, &deferrable); zend_restore_error_handling(&zeh TSRMLS_CC); - if (SUCCESS == rv) { - php_pqconn_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC); + if (SUCCESS == rv) { rv = php_pqconn_start_transaction_async(getThis(), obj, isolation, readonly, deferrable TSRMLS_CC); if (SUCCESS == rv) { @@ -1655,6 +1742,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) @@ -1689,12 +1800,11 @@ static int apply_set_converter(void *p TSRMLS_DC, int argc, va_list argv, zend_h HashTable *converters = va_arg(argv, HashTable *); tmp = *zoid; + Z_ADDREF_P(tmp); convert_to_long_ex(&tmp); Z_ADDREF_PP(zcnv); zend_hash_index_update(converters, Z_LVAL_P(tmp), zcnv, sizeof(zval *), NULL); - if (tmp != *zoid) { - zval_ptr_dtor(&tmp); - } + zval_ptr_dtor(&tmp); return ZEND_HASH_APPLY_KEEP; } @@ -1721,11 +1831,10 @@ static PHP_METHOD(pqconn, setConverter) { zend_call_method_with_0_params(&zcnv, NULL, NULL, "converttypes", &zoids); tmp = zoids; - convert_to_array_ex(&zoids); - zend_hash_apply_with_arguments(Z_ARRVAL_P(zoids) TSRMLS_CC, apply_set_converter, 2, &zcnv, &obj->intern->converters); - if (tmp != zoids) { - zval_ptr_dtor(&tmp); - } + Z_ADDREF_P(tmp); + convert_to_array_ex(&tmp); + zend_hash_apply_with_arguments(Z_ARRVAL_P(tmp) TSRMLS_CC, apply_set_converter, 2, &zcnv, &obj->intern->converters); + zval_ptr_dtor(&tmp); zval_ptr_dtor(&zoids); } } @@ -1758,6 +1867,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} @@ -1849,6 +1959,30 @@ PHP_MINIT_FUNCTION(pqconn) ph.read = php_pqconn_object_read_event_handlers; zend_hash_add(&php_pqconn_object_prophandlers, "eventHandlers", sizeof("eventHandlers"), (void *) &ph, sizeof(ph), NULL); + zend_declare_property_long(php_pqconn_class_entry, ZEND_STRL("defaultFetchType"), 0, ZEND_ACC_PUBLIC TSRMLS_CC); + ph.read = php_pqconn_object_read_def_fetch_type; + ph.write = php_pqconn_object_write_def_fetch_type; + zend_hash_add(&php_pqconn_object_prophandlers, "defaultFetchType", sizeof("defaultFetchType"), (void *) &ph, sizeof(ph), NULL); + ph.write = NULL; + + zend_declare_property_long(php_pqconn_class_entry, ZEND_STRL("defaultTransactionIsolation"), 0, ZEND_ACC_PUBLIC TSRMLS_CC); + ph.read = php_pqconn_object_read_def_txn_isolation; + ph.write = php_pqconn_object_write_def_txn_isolation; + zend_hash_add(&php_pqconn_object_prophandlers, "defaultTransactionIsolation", sizeof("defaultTransactionIsolation"), (void *) &ph, sizeof(ph), NULL); + ph.write = NULL; + + zend_declare_property_bool(php_pqconn_class_entry, ZEND_STRL("defaultTransactionReadonly"), 0, ZEND_ACC_PUBLIC TSRMLS_CC); + ph.read = php_pqconn_object_read_def_txn_readonly; + ph.write = php_pqconn_object_write_def_txn_readonly; + zend_hash_add(&php_pqconn_object_prophandlers, "defaultTransactionReadonly", sizeof("defaultTransactionReadonly"), (void *) &ph, sizeof(ph), NULL); + ph.write = NULL; + + zend_declare_property_bool(php_pqconn_class_entry, ZEND_STRL("defaultTransactionDeferrable"), 0, ZEND_ACC_PUBLIC TSRMLS_CC); + ph.read = php_pqconn_object_read_def_txn_deferrable; + ph.write = php_pqconn_object_write_def_txn_deferrable; + zend_hash_add(&php_pqconn_object_prophandlers, "defaultTransactionDeferrable", sizeof("defaultTransactionDeferrable"), (void *) &ph, sizeof(ph), NULL); + ph.write = NULL; + zend_declare_class_constant_long(php_pqconn_class_entry, ZEND_STRL("OK"), CONNECTION_OK TSRMLS_CC); zend_declare_class_constant_long(php_pqconn_class_entry, ZEND_STRL("BAD"), CONNECTION_BAD TSRMLS_CC); zend_declare_class_constant_long(php_pqconn_class_entry, ZEND_STRL("STARTED"), CONNECTION_STARTED TSRMLS_CC);