X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-pq;a=blobdiff_plain;f=src%2Fphp_pqconn.c;h=19ea6f05ebcaebd0abb059d475c7bad802f29128;hp=f66ae0cb0a3d275401d01c27595b3d6b52cd5d38;hb=HEAD;hpb=868303fdfb0322ada371db96cba7cb91c7b254dc diff --git a/src/php_pqconn.c b/src/php_pqconn.c index f66ae0c..19ea6f0 100644 --- a/src/php_pqconn.c +++ b/src/php_pqconn.c @@ -42,7 +42,7 @@ static void php_pq_callback_hash_dtor(zval *p) } /* -static void php_pqconn_del_eventhandler(php_pqconn_object_t *obj, const char *type_str, size_t type_len, ulong id) +static void php_pqconn_del_eventhandler(php_pqconn_object_t *obj, const char *type_str, size_t type_len, unsigned long id) { zval **evhs; @@ -107,21 +107,21 @@ static zend_object *php_pqconn_create_object(zend_class_entry *class_type) return &php_pqconn_create_object_ex(class_type, NULL)->zo; } -static void php_pqconn_object_read_status(zval *object, void *o, zval *return_value) +static void php_pqconn_object_read_status(void *o, zval *return_value) { php_pqconn_object_t *obj = o; RETVAL_LONG(PQstatus(obj->intern->conn)); } -static void php_pqconn_object_read_transaction_status(zval *object, void *o, zval *return_value) +static void php_pqconn_object_read_transaction_status(void *o, zval *return_value) { php_pqconn_object_t *obj = o; RETVAL_LONG(PQtransactionStatus(obj->intern->conn)); } -static void php_pqconn_object_read_error_message(zval *object, void *o, zval *return_value) +static void php_pqconn_object_read_error_message(void *o, zval *return_value) { php_pqconn_object_t *obj = o; char *error = PHP_PQerrorMessage(obj->intern->conn); @@ -176,21 +176,21 @@ void php_pqconn_notify_listeners(php_pqconn_object_t *obj) } } -static void php_pqconn_object_read_busy(zval *object, void *o, zval *return_value) +static void php_pqconn_object_read_busy(void *o, zval *return_value) { php_pqconn_object_t *obj = o; RETVAL_BOOL(PQisBusy(obj->intern->conn)); } -static void php_pqconn_object_read_encoding(zval *object, void *o, zval *return_value) +static void php_pqconn_object_read_encoding(void *o, zval *return_value) { php_pqconn_object_t *obj = o; RETVAL_STRING(pg_encoding_to_char(PQclientEncoding(obj->intern->conn))); } -static void php_pqconn_object_write_encoding(zval *object, void *o, zval *value) +static void php_pqconn_object_write_encoding(void *o, zval *value) { php_pqconn_object_t *obj = o; zend_string *zenc = zval_get_string(value); @@ -202,35 +202,35 @@ static void php_pqconn_object_write_encoding(zval *object, void *o, zval *value) zend_string_release(zenc); } -static void php_pqconn_object_read_unbuffered(zval *object, void *o, zval *return_value) +static void php_pqconn_object_read_unbuffered(void *o, zval *return_value) { php_pqconn_object_t *obj = o; RETVAL_BOOL(obj->intern->unbuffered); } -static void php_pqconn_object_write_unbuffered(zval *object, void *o, zval *value) +static void php_pqconn_object_write_unbuffered(void *o, zval *value) { php_pqconn_object_t *obj = o; obj->intern->unbuffered = z_is_true(value); } -static void php_pqconn_object_read_nonblocking(zval *object, void *o, zval *return_value) +static void php_pqconn_object_read_nonblocking(void *o, zval *return_value) { php_pqconn_object_t *obj = o; RETVAL_BOOL(PQisnonblocking(obj->intern->conn)); } -static void php_pqconn_object_write_nonblocking(zval *object, void *o, zval *value) +static void php_pqconn_object_write_nonblocking(void *o, zval *value) { php_pqconn_object_t *obj = o; PQsetnonblocking(obj->intern->conn, z_is_true(value)); } -static void php_pqconn_object_read_db(zval *object, void *o, zval *return_value) +static void php_pqconn_object_read_db(void *o, zval *return_value) { php_pqconn_object_t *obj = o; char *db = PQdb(obj->intern->conn); @@ -242,7 +242,7 @@ static void php_pqconn_object_read_db(zval *object, void *o, zval *return_value) } } -static void php_pqconn_object_read_user(zval *object, void *o, zval *return_value) +static void php_pqconn_object_read_user(void *o, zval *return_value) { php_pqconn_object_t *obj = o; char *user = PQuser(obj->intern->conn); @@ -254,7 +254,7 @@ static void php_pqconn_object_read_user(zval *object, void *o, zval *return_valu } } -static void php_pqconn_object_read_pass(zval *object, void *o, zval *return_value) +static void php_pqconn_object_read_pass(void *o, zval *return_value) { php_pqconn_object_t *obj = o; char *pass = PQpass(obj->intern->conn); @@ -266,7 +266,7 @@ static void php_pqconn_object_read_pass(zval *object, void *o, zval *return_valu } } -static void php_pqconn_object_read_host(zval *object, void *o, zval *return_value) +static void php_pqconn_object_read_host(void *o, zval *return_value) { php_pqconn_object_t *obj = o; char *host = PQhost(obj->intern->conn); @@ -278,7 +278,7 @@ static void php_pqconn_object_read_host(zval *object, void *o, zval *return_valu } } -static void php_pqconn_object_read_port(zval *object, void *o, zval *return_value) +static void php_pqconn_object_read_port(void *o, zval *return_value) { php_pqconn_object_t *obj = o; char *port = PQport(obj->intern->conn); @@ -291,7 +291,7 @@ static void php_pqconn_object_read_port(zval *object, void *o, zval *return_valu } #if HAVE_PQCONNINFO -static void php_pqconn_object_read_params(zval *object, void *o, zval *return_value) +static void php_pqconn_object_read_params(void *o, zval *return_value) { php_pqconn_object_t *obj = o; PQconninfoOption *ptr, *params = PQconninfo(obj->intern->conn); @@ -311,7 +311,7 @@ static void php_pqconn_object_read_params(zval *object, void *o, zval *return_va } #endif -static void php_pqconn_object_read_options(zval *object, void *o, zval *return_value) +static void php_pqconn_object_read_options(void *o, zval *return_value) { php_pqconn_object_t *obj = o; char *options = PQoptions(obj->intern->conn); @@ -350,7 +350,7 @@ static int apply_read_callbacks(zval *p, int argc, va_list argv, zend_hash_key * return ZEND_HASH_APPLY_KEEP; } -static void php_pqconn_object_read_event_handlers(zval *object, void *o, zval *return_value) +static void php_pqconn_object_read_event_handlers(void *o, zval *return_value) { php_pqconn_object_t *obj = o; @@ -358,7 +358,7 @@ static void php_pqconn_object_read_event_handlers(zval *object, void *o, zval *r zend_hash_apply_with_arguments(&obj->intern->eventhandlers, apply_read_callbacks, 1, Z_ARRVAL_P(return_value)); } -static void php_pqconn_object_gc_event_handlers(zval *object, void *o, zval *return_value) +static void php_pqconn_object_gc_event_handlers(void *o, zval *return_value) { php_pqconn_object_t *obj = o; zval *evhs; @@ -378,7 +378,7 @@ static void php_pqconn_object_gc_event_handlers(zval *object, void *o, zval *ret ZEND_HASH_FOREACH_END(); } -static void php_pqconn_object_read_listeners(zval *object, void *o, zval *return_value) +static void php_pqconn_object_read_listeners(void *o, zval *return_value) { php_pqconn_object_t *obj = o; @@ -386,7 +386,7 @@ static void php_pqconn_object_read_listeners(zval *object, void *o, zval *return zend_hash_apply_with_arguments(&obj->intern->listeners, apply_read_callbacks, 1, Z_ARRVAL_P(return_value)); } -static void php_pqconn_object_gc_listeners(zval *object, void *o, zval *return_value) +static void php_pqconn_object_gc_listeners(void *o, zval *return_value) { php_pqconn_object_t *obj = o; zval *listeners; @@ -406,7 +406,7 @@ static void php_pqconn_object_gc_listeners(zval *object, void *o, zval *return_v ZEND_HASH_FOREACH_END(); } -static void php_pqconn_object_read_converters(zval *object, void *o, zval *return_value) +static void php_pqconn_object_read_converters(void *o, zval *return_value) { php_pqconn_object_t *obj = o; @@ -414,7 +414,7 @@ static void php_pqconn_object_read_converters(zval *object, void *o, zval *retur zend_hash_copy(Z_ARRVAL_P(return_value), &obj->intern->converters, zval_add_ref); } -static void php_pqconn_object_gc_converters(zval *object, void *o, zval *return_value) +static void php_pqconn_object_gc_converters(void *o, zval *return_value) { php_pqconn_object_t *obj = o; zval *converter; @@ -426,71 +426,99 @@ static void php_pqconn_object_gc_converters(zval *object, void *o, zval *return_ ZEND_HASH_FOREACH_END(); } -static void php_pqconn_object_read_def_fetch_type(zval *object, void *o, zval *return_value) +static void php_pqconn_object_read_def_fetch_type(void *o, zval *return_value) { 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) +static void php_pqconn_object_write_def_fetch_type(void *o, zval *value) { php_pqconn_object_t *obj = o; obj->intern->default_fetch_type = zval_get_long(value) & 0x3; /* two bits only */ } -static void php_pqconn_object_read_def_txn_isolation(zval *object, void *o, zval *return_value) +static void php_pqconn_object_read_def_txn_isolation(void *o, zval *return_value) { 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) +static void php_pqconn_object_write_def_txn_isolation(void *o, zval *value) { php_pqconn_object_t *obj = o; obj->intern->default_txn_isolation = zval_get_long(value) & 0x3; /* two bits only */ } -static void php_pqconn_object_read_def_txn_readonly(zval *object, void *o, zval *return_value) +static void php_pqconn_object_read_def_txn_readonly(void *o, zval *return_value) { 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) +static void php_pqconn_object_write_def_txn_readonly(void *o, zval *value) { php_pqconn_object_t *obj = o; obj->intern->default_txn_readonly = z_is_true(value); } -static void php_pqconn_object_read_def_txn_deferrable(zval *object, void *o, zval *return_value) +static void php_pqconn_object_read_def_txn_deferrable(void *o, zval *return_value) { 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) +static void php_pqconn_object_write_def_txn_deferrable(void *o, zval *value) { php_pqconn_object_t *obj = o; obj->intern->default_txn_deferrable = zend_is_true(value); } -static void php_pqconn_object_read_def_auto_conv(zval *object, void *o, zval *return_value) +static void php_pqconn_object_read_def_auto_conv(void *o, zval *return_value) { php_pqconn_object_t *obj = o; RETVAL_LONG(obj->intern->default_auto_convert); } -static void php_pqconn_object_write_def_auto_conv(zval*object, void *o, zval *value) +static void php_pqconn_object_write_def_auto_conv(void *o, zval *value) { php_pqconn_object_t *obj = o; obj->intern->default_auto_convert = zval_get_long(value) & PHP_PQRES_CONV_ALL; } +#ifdef HAVE_PQLIBVERSION +static void php_pqconn_object_read_lib_version(void *o, zval *return_value) +{ + char ver[16]; + + php_pq_version_to_string(PQlibVersion(), ver, sizeof(ver)); + RETVAL_STRING(ver); +} +#endif +#ifdef HAVE_PQPROTOCOLVERSION +static void php_pqconn_object_read_protocol_version(void *o, zval *return_value) +{ + php_pqconn_object_t *obj = o; + + RETVAL_LONG(PQprotocolVersion(obj->intern->conn)); +} +#endif +#ifdef HAVE_PQSERVERVERSION +static void php_pqconn_object_read_server_version(void *o, zval *return_value) +{ + php_pqconn_object_t *obj = o; + char ver[16]; + + php_pq_version_to_string(PQserverVersion(obj->intern->conn), ver, sizeof(ver)); + RETVAL_STRING(ver); +} +#endif + static ZEND_RESULT_CODE php_pqconn_update_socket(zval *zobj, php_pqconn_object_t *obj) { zval zsocket, zmember; @@ -514,7 +542,11 @@ static ZEND_RESULT_CODE php_pqconn_update_socket(zval *zobj, php_pqconn_object_t ZVAL_NULL(&zsocket); retval = FAILURE; } - zend_get_std_object_handlers()->write_property(zobj, &zmember, &zsocket, NULL); +#if PHP_VERSION_ID >= 80000 + zend_std_write_property(Z_OBJ_P(zobj), Z_STR(zmember), &zsocket, NULL); +#else + zend_std_write_property(zobj, &zmember, &zsocket, NULL); +#endif zval_ptr_dtor(&zsocket); zval_ptr_dtor(&zmember); @@ -586,7 +618,7 @@ static inline PGresult *unlisten(PGconn *conn, const char *channel_str, size_t c smart_str_appends(&cmd, quoted_channel); smart_str_0(&cmd); - res = PQexec(conn, smart_str_v(&cmd)); + res = php_pq_exec(conn, smart_str_v(&cmd)); smart_str_free(&cmd); PQfreemem(quoted_channel); @@ -870,7 +902,7 @@ static PHP_METHOD(pqconn, listen) { zend_error_handling zeh; char *channel_str = NULL; size_t channel_len = 0; - php_pq_callback_t listener = {{0}}; + php_pq_callback_t listener = PHP_PQ_CALLBACK_INIT; ZEND_RESULT_CODE rv; zend_replace_error_handling(EH_THROW, exce(EX_INVALID_ARGUMENT), &zeh); @@ -924,7 +956,7 @@ static PHP_METHOD(pqconn, listenAsync) { zend_error_handling zeh; char *channel_str = NULL; size_t channel_len = 0; - php_pq_callback_t listener = {{0}}; + php_pq_callback_t listener = PHP_PQ_CALLBACK_INIT; ZEND_RESULT_CODE rv; zend_replace_error_handling(EH_THROW, exce(EX_INVALID_ARGUMENT), &zeh); @@ -986,7 +1018,7 @@ static PHP_METHOD(pqconn, notify) { PGresult *res; char *params[2] = {channel_str, message_str}; - res = PQexecParams(obj->intern->conn, "select pg_notify($1, $2)", 2, NULL, (const char *const*) params, NULL, NULL, 0); + res = php_pq_exec_params(obj->intern->conn, "select pg_notify($1, $2)", 2, NULL, (const char *const*) params, NULL, NULL, 0); if (!res) { throw_exce(EX_RUNTIME, "Failed to notify listeners (%s)", PHP_PQerrorMessage(obj->intern->conn)); @@ -1165,7 +1197,7 @@ ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_exec_async, 0, 0, 1) ZEND_END_ARG_INFO(); static PHP_METHOD(pqconn, execAsync) { zend_error_handling zeh; - php_pq_callback_t resolver = {{0}}; + php_pq_callback_t resolver = PHP_PQ_CALLBACK_INIT; char *query_str; size_t query_len; ZEND_RESULT_CODE rv; @@ -1220,7 +1252,7 @@ static PHP_METHOD(pqconn, execParams) { php_pq_params_t *params; params = php_pq_params_init(&obj->intern->converters, ztypes ? Z_ARRVAL_P(ztypes) : NULL, Z_ARRVAL_P(zparams)); - res = PQexecParams(obj->intern->conn, query_str, params->param.count, params->type.oids, (const char *const*) params->param.strings, NULL, NULL, 0); + res = php_pq_exec_params(obj->intern->conn, query_str, params->param.count, params->type.oids, (const char *const*) params->param.strings, NULL, NULL, 0); php_pq_params_free(¶ms); if (!res) { @@ -1246,7 +1278,7 @@ ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_exec_params_async, 0, 0, 2) ZEND_END_ARG_INFO(); static PHP_METHOD(pqconn, execParamsAsync) { zend_error_handling zeh; - php_pq_callback_t resolver = {{0}}; + php_pq_callback_t resolver = PHP_PQ_CALLBACK_INIT; char *query_str; size_t query_len; zval *zparams; @@ -1831,7 +1863,7 @@ static PHP_METHOD(pqconn, on) { zend_error_handling zeh; char *type_str; size_t type_len; - php_pq_callback_t cb = {{0}}; + php_pq_callback_t cb = PHP_PQ_CALLBACK_INIT; ZEND_RESULT_CODE rv; zend_replace_error_handling(EH_THROW, exce(EX_INVALID_ARGUMENT), &zeh); @@ -1892,7 +1924,7 @@ static PHP_METHOD(pqconn, setConverter) { struct apply_set_converter_arg arg = {NULL}; ZVAL_NULL(&zoids); - zend_call_method_with_0_params(zcnv, NULL, NULL, "converttypes", &zoids); + php_pq_call_method(zcnv, "converttypes", 0, &zoids); ZVAL_DUP(&tmp, &zoids); convert_to_array(&tmp); @@ -1930,7 +1962,7 @@ static PHP_METHOD(pqconn, unsetConverter) { struct apply_set_converter_arg arg = {NULL}; ZVAL_NULL(&zoids); - zend_call_method_with_0_params(zcnv, NULL, NULL, "converttypes", &zoids); + php_pq_call_method(zcnv, "converttypes", 0, &zoids); ZVAL_DUP(&tmp, &zoids); convert_to_array(&tmp); @@ -1947,7 +1979,7 @@ static PHP_METHOD(pqconn, unsetConverter) { } static zend_function_entry php_pqconn_methods[] = { - PHP_ME(pqconn, __construct, ai_pqconn_construct, ZEND_ACC_PUBLIC|ZEND_ACC_CTOR) + PHP_ME(pqconn, __construct, ai_pqconn_construct, ZEND_ACC_PUBLIC) PHP_ME(pqconn, reset, ai_pqconn_reset, ZEND_ACC_PUBLIC) PHP_ME(pqconn, resetAsync, ai_pqconn_reset_async, ZEND_ACC_PUBLIC) PHP_ME(pqconn, poll, ai_pqconn_poll, ZEND_ACC_PUBLIC) @@ -2004,7 +2036,7 @@ PHP_MINIT_FUNCTION(pqconn) php_pqconn_object_handlers.read_property = php_pq_object_read_prop; php_pqconn_object_handlers.write_property = php_pq_object_write_prop; php_pqconn_object_handlers.clone_obj = NULL; - php_pqconn_object_handlers.get_property_ptr_ptr = NULL; + php_pqconn_object_handlers.get_property_ptr_ptr = php_pq_object_get_prop_ptr_null; php_pqconn_object_handlers.get_gc = php_pq_object_get_gc; php_pqconn_object_handlers.get_properties = php_pq_object_properties; php_pqconn_object_handlers.get_debug_info = php_pq_object_debug_info; @@ -2127,6 +2159,24 @@ PHP_MINIT_FUNCTION(pqconn) zend_hash_str_add_mem(&php_pqconn_object_prophandlers, "defaultAutoConvert", sizeof("defaultAutoConvert")-1, (void *) &ph, sizeof(ph)); ph.write = NULL; +#ifdef HAVE_PQLIBVERSION + zend_declare_property_null(php_pqconn_class_entry, ZEND_STRL("libraryVersion"), ZEND_ACC_PUBLIC|ZEND_ACC_READONLY); + ph.read = php_pqconn_object_read_lib_version; + zend_hash_str_add_mem(&php_pqconn_object_prophandlers, ZEND_STRL("libraryVersion"), (void *) &ph, sizeof(ph)); +#endif + +#ifdef HAVE_PQPROTOCOLVERSION + zend_declare_property_null(php_pqconn_class_entry, ZEND_STRL("protocolVersion"), ZEND_ACC_PUBLIC|ZEND_ACC_READONLY); + ph.read = php_pqconn_object_read_protocol_version; + zend_hash_str_add_mem(&php_pqconn_object_prophandlers, ZEND_STRL("protocolVersion"), (void *) &ph, sizeof(ph)); +#endif + +#ifdef HAVE_PQSERVERVERSION + zend_declare_property_null(php_pqconn_class_entry, ZEND_STRL("serverVersion"), ZEND_ACC_PUBLIC|ZEND_ACC_READONLY); + ph.read = php_pqconn_object_read_server_version; + zend_hash_str_add_mem(&php_pqconn_object_prophandlers, ZEND_STRL("serverVersion"), (void *) &ph, sizeof(ph)); +#endif + zend_declare_class_constant_long(php_pqconn_class_entry, ZEND_STRL("OK"), CONNECTION_OK); zend_declare_class_constant_long(php_pqconn_class_entry, ZEND_STRL("BAD"), CONNECTION_BAD); zend_declare_class_constant_long(php_pqconn_class_entry, ZEND_STRL("STARTED"), CONNECTION_STARTED); @@ -2135,6 +2185,15 @@ PHP_MINIT_FUNCTION(pqconn) zend_declare_class_constant_long(php_pqconn_class_entry, ZEND_STRL("AUTH_OK"), CONNECTION_AUTH_OK); zend_declare_class_constant_long(php_pqconn_class_entry, ZEND_STRL("SSL_STARTUP"), CONNECTION_SSL_STARTUP); zend_declare_class_constant_long(php_pqconn_class_entry, ZEND_STRL("SETENV"), CONNECTION_SETENV); +#ifdef HAVE_CONNECTION_CHECK_WRITABLE + zend_declare_class_constant_long(php_pqconn_class_entry, ZEND_STRL("CHECK_WRITABLE"), CONNECTION_CHECK_WRITABLE); +#endif +#ifdef HAVE_CONNECTION_CONSUME + zend_declare_class_constant_long(php_pqconn_class_entry, ZEND_STRL("CONSUME"), CONNECTION_CONSUME); +#endif +#ifdef HAVE_CONNECTION_GSS_STARTUP + zend_declare_class_constant_long(php_pqconn_class_entry, ZEND_STRL("GSS_STARTUP"), CONNECTION_GSS_STARTUP); +#endif zend_declare_class_constant_long(php_pqconn_class_entry, ZEND_STRL("TRANS_IDLE"), PQTRANS_IDLE); zend_declare_class_constant_long(php_pqconn_class_entry, ZEND_STRL("TRANS_ACTIVE"), PQTRANS_ACTIVE);