Merge pull request #49 from m6w6/issue-verprop
authorRemi Collet <remi@remirepo.net>
Thu, 15 Jun 2023 12:04:56 +0000 (14:04 +0200)
committerGitHub <noreply@github.com>
Thu, 15 Jun 2023 12:04:56 +0000 (14:04 +0200)
version properties

config9.m4
package.xml
src/php_pq_misc.c
src/php_pq_misc.h
src/php_pq_module.c
src/php_pqconn.c
tests/_skipif.inc
tests/basic003.phpt [new file with mode: 0644]
tests/gh-issue047_jsonb.phpt

index d3fb2b27aba1fa43bcc7866f9ade27f673c3e41d..d845e282d4652f321c27b1bf8d637656b80058ee 100644 (file)
@@ -99,6 +99,8 @@ if test "$PHP_PQ" != "no"; then
        PHP_SUBST(PQ_SHARED_LIBADD)
 
        PQ_CHECK_FUNC(PQlibVersion)
+       PQ_CHECK_FUNC(PQprotocolVersion)
+       PQ_CHECK_FUNC(PQserverVersion)
        PQ_CHECK_FUNC(PQconninfo)
        PQ_CHECK_FUNC(PQsetSingleRowMode)
 
index 402e0db8e4bf283b0fd14d71d05d0472708d74ba..1c7ba19e50e6b9a156bf17d1963200801aa3e604 100644 (file)
     <file role="test" name="async010.phpt" />
     <file role="test" name="basic001.phpt" />
     <file role="test" name="basic002.phpt" />
+    <file role="test" name="basic003.phpt" />
     <file role="test" name="bound002.phpt" />
     <file role="test" name="callback001.phpt" />
     <file role="test" name="callback002.phpt" />
index 9acef342576603ac693610a7224da8d66b6ac0bd..4d251d2b5415c1b0846a2a1dd89969a296ee416b 100644 (file)
 #undef PHP_PQ_TYPE
 #include "php_pq_type.h"
 
+/* convert version to string */
+extern void php_pq_version_to_string(int version, char *buffer, int len) {
+       if (version < 100000) {
+               slprintf(buffer, len, "%d.%d.%d", version/10000, version/100%100, version%100);
+       } else { /* since version 10 */
+               slprintf(buffer, len, "%d.%d", version/10000, version%100);
+       }
+}
 
 /* clear result object associated with a result handle */
 void php_pqres_clear(PGresult *r) {
index 34ab6c1bf9c285f5a75c18883abb3cc07ca46787..dab24ec7d1ee7231d34ca33778e9a1ecbc5b51d5 100644 (file)
@@ -33,6 +33,8 @@ extern PGresult *php_pq_exec_params(PGconn *conn, const char *command, int nPara
 extern PGresult *php_pq_prepare(PGconn *conn, const char *stmtName, const char *query, int nParams, const Oid *paramTypes);
 extern PGresult *php_pq_exec_prepared(PGconn *conn, const char *stmtName, int nParams, const char *const * paramValues, const int *paramLengths, const int *paramFormats, int resultFormat);
 
+/* convert version to string */
+extern void php_pq_version_to_string(int version, char *buffer, int len);
 
 /* trim LF from EOL */
 extern char *php_pq_rtrim(char *e);
@@ -99,6 +101,9 @@ extern int php_pq_compare_index(const void *lptr, const void *rptr);
                 ZEND_BEGIN_ARG_INFO_EX(name, 0, return_reference, required_num_args)
 #endif
 
+#ifndef ZEND_ACC_READONLY
+#define ZEND_ACC_READONLY 0
+#endif
 
 extern PHP_MINIT_FUNCTION(pq_misc);
 
index cd992172d9e524bc9c6ccdd15d151fcdf43c806e..7385b0b378f234f861da3c0b8cb161432c6b11c6 100644 (file)
@@ -105,7 +105,7 @@ static PHP_MINFO_FUNCTION(pq)
        php_info_print_table_header(3, "Used Library", "Compiled", "Linked");
 #ifdef HAVE_PQLIBVERSION
        libpq_v = PQlibVersion();
-       slprintf(libpq_version, sizeof(libpq_version), "%d.%d.%d", libpq_v/10000%100, libpq_v/100%100, libpq_v%100);
+       php_pq_version_to_string(libpq_v, libpq_version, sizeof(libpq_version));
 #endif
        php_info_print_table_row(3, "libpq", PHP_PQ_LIBVERSION, libpq_version);
        php_info_print_table_end();
index 6278323627ebad84f102a12de5a0f6f2eb827f76..19ea6f05ebcaebd0abb059d475c7bad802f29128 100644 (file)
@@ -491,6 +491,34 @@ static void php_pqconn_object_write_def_auto_conv(void *o, zval *value)
        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;
@@ -2131,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);
index 9bf235c5fa17ec595b7fcd8bd6939e8ba4a48656..0391d77e059a5fd4359defca669f6961a639a934 100644 (file)
@@ -6,7 +6,10 @@ _ext("pq");
 include "_setup.inc";
 defined("PQ_DSN") or die("skip PQ_DSN undefined");
 try {
-       new pq\Connection(PQ_DSN);
+       $c = new pq\Connection(PQ_DSN);
+       if (defined("SERVER_MIN") && version_compare(SERVER_MIN, $c->serverVersion) > 0) {
+               die("skip server {$c->serverVersion} is too old, needed " . SERVER_MIN);
+       }
 } catch (pq\Exception $e) {
        die("skip could not connect to PQ_DSN ".$e->getMessage());
 }
diff --git a/tests/basic003.phpt b/tests/basic003.phpt
new file mode 100644 (file)
index 0000000..4645e8c
--- /dev/null
@@ -0,0 +1,22 @@
+--TEST--
+basic functionality
+--SKIPIF--
+<?php include "_skipif.inc"; ?>
+--FILE--
+<?php
+echo "Test\n";
+include "_setup.inc";
+
+$c = new pq\Connection(PQ_DSN);
+
+var_dump($c->libraryVersion);
+var_dump($c->protocolVersion);
+var_dump($c->serverVersion);
+?>
+DONE
+--EXPECTF--
+Test
+string(%d) "%s"
+int(%d)
+string(%d) "%s"
+DONE
index 1f049d495d71d8e2c00fa3f47b9b81780f2ad45e..5e145fb0bd692541f40edddb9ec56f2e1e38f730 100644 (file)
@@ -2,6 +2,7 @@
 json conv broken since 2.2.1
 --SKIPIF--
 <?php
+define("SERVER_MIN", "9.4");
 include "_skipif.inc";
 ?>
 --INI--