From 4d4167aa5e7f4f06a03326778ee19145f81c8d4f Mon Sep 17 00:00:00 2001 From: Calvin Buckley Date: Wed, 10 Sep 2025 14:13:18 -0300 Subject: [PATCH 01/12] Remove PHP 4 era crud --- pdo_ibm.c | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/pdo_ibm.c b/pdo_ibm.c index 5044a73..a4236d7 100644 --- a/pdo_ibm.c +++ b/pdo_ibm.c @@ -47,32 +47,26 @@ extern pdo_driver_t pdo_ibm_driver; /* the registration table */ /* {{{ pdo_ibm_deps */ -#if ZEND_MODULE_API_NO >= 20041225 static zend_module_dep pdo_ibm_deps[] = { ZEND_MOD_REQUIRED("pdo") {NULL, NULL, NULL} }; -#endif /* }}} */ /* {{{ pdo_ibm_module_entry */ zend_module_entry pdo_ibm_module_entry = { -#if ZEND_MODULE_API_NO >= 20041225 STANDARD_MODULE_HEADER_EX, NULL, pdo_ibm_deps, -#else - STANDARD_MODULE_HEADER, -#endif "pdo_ibm", NULL, PHP_MINIT(pdo_ibm), PHP_MSHUTDOWN(pdo_ibm), - PHP_RINIT(pdo_ibm), /* Replace with NULL if there's nothing to do at request start */ - PHP_RSHUTDOWN(pdo_ibm), /* Replace with NULL if there's nothing to do at request end */ + PHP_RINIT(pdo_ibm), + PHP_RSHUTDOWN(pdo_ibm), PHP_MINFO(pdo_ibm), - PDO_IBM_VERSION, /* Replace with version number for your extension */ + PDO_IBM_VERSION, STANDARD_MODULE_PROPERTIES }; /* }}} */ From 9b038cb7fbfc7cb3771c7165056bd75f24833876 Mon Sep 17 00:00:00 2001 From: Calvin Buckley Date: Wed, 10 Sep 2025 14:14:12 -0300 Subject: [PATCH 02/12] Bare minimum class stub for PDO in PHP 8.5 This should probably be extended to PHP 8.4 as well. Untested on i. --- pdo_ibm.c | 65 ++++++++++++++++++--------- pdo_ibm.stub.php | 66 +++++++++++++++++++++++++++ pdo_ibm_arginfo.h | 112 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 223 insertions(+), 20 deletions(-) create mode 100644 pdo_ibm.stub.php create mode 100644 pdo_ibm_arginfo.h diff --git a/pdo_ibm.c b/pdo_ibm.c index a4236d7..8670de3 100644 --- a/pdo_ibm.c +++ b/pdo_ibm.c @@ -30,6 +30,10 @@ #include "php_pdo_ibm.h" #include "php_pdo_ibm_int.h" +#if PHP_MAJOR_VERSION >= 8 +#include "pdo_ibm_arginfo.h" +#endif + /* If you declare any globals in php_pdo_ibm.h uncomment this: */ #ifdef PASE @@ -40,6 +44,7 @@ ZEND_DECLARE_MODULE_GLOBALS(pdo_ibm) static int le_pdo_ibm; extern pdo_driver_t pdo_ibm_driver; /* the registration table */ +static zend_class_entry *pdo_ibm_ce; #ifdef PASE /* PASE i5/OS start-up */ #include @@ -105,6 +110,19 @@ static void php_pdo_ibm_init_globals(zend_pdo_ibm_globals *pdo_ibm_globals) /* }}} */ #endif /* PASE */ +/* PDO_IBM used both SQL_ and I5_ as prefixes for constants */ +#if PHP_VERSION_ID >= 80500 +#define REGISTER_PDO_IBM_CLASS_CONST_LONG_DEPRECATED_ALIAS_85(base_name, value) \ + REGISTER_PDO_CLASS_CONST_LONG_DEPRECATED_ALIAS_85(base_name, "SQL_", "Pdo\\Ibm::", value) +#define REGISTER_PDO_IBM_I5_CLASS_CONST_LONG_DEPRECATED_ALIAS_85(base_name, value) \ + REGISTER_PDO_CLASS_CONST_LONG_DEPRECATED_ALIAS_85(base_name, "I5_", "Pdo\\Ibm::", value) +#else +#define REGISTER_PDO_IBM_CLASS_CONST_LONG_DEPRECATED_ALIAS_85(base_name, value) \ + REGISTER_PDO_CLASS_CONST_LONG("SQL_" base_name, value) +#define REGISTER_PDO_IBM_I5_CLASS_CONST_LONG_DEPRECATED_ALIAS_85(base_name, value) \ + REGISTER_PDO_CLASS_CONST_LONG("I5_" base_name, value) +#endif + /* {{{ PHP_MINIT_FUNCTION */ PHP_MINIT_FUNCTION(pdo_ibm) @@ -116,32 +134,39 @@ PHP_MINIT_FUNCTION(pdo_ibm) #endif #ifndef PASE /* i5/OS no support trusted */ - REGISTER_PDO_CLASS_CONST_LONG("SQL_ATTR_USE_TRUSTED_CONTEXT", (long) PDO_SQL_ATTR_USE_TRUSTED_CONTEXT); - REGISTER_PDO_CLASS_CONST_LONG("SQL_ATTR_TRUSTED_CONTEXT_USERID", (long) PDO_SQL_ATTR_TRUSTED_CONTEXT_USERID); - REGISTER_PDO_CLASS_CONST_LONG("SQL_ATTR_TRUSTED_CONTEXT_PASSWORD", (long) PDO_SQL_ATTR_TRUSTED_CONTEXT_PASSWORD); + REGISTER_PDO_IBM_CLASS_CONST_LONG_DEPRECATED_ALIAS_85("ATTR_USE_TRUSTED_CONTEXT", (long) PDO_SQL_ATTR_USE_TRUSTED_CONTEXT); + REGISTER_PDO_IBM_CLASS_CONST_LONG_DEPRECATED_ALIAS_85("ATTR_TRUSTED_CONTEXT_USERID", (long) PDO_SQL_ATTR_TRUSTED_CONTEXT_USERID); + REGISTER_PDO_IBM_CLASS_CONST_LONG_DEPRECATED_ALIAS_85("ATTR_TRUSTED_CONTEXT_PASSWORD", (long) PDO_SQL_ATTR_TRUSTED_CONTEXT_PASSWORD); #else /* PASE i5/OS introduced (1.3.4) */ - REGISTER_PDO_CLASS_CONST_LONG("I5_ATTR_DBC_SYS_NAMING", (long)PDO_I5_ATTR_DBC_SYS_NAMING); + REGISTER_PDO_IBM_I5_CLASS_CONST_LONG_DEPRECATED_ALIAS_85("ATTR_DBC_SYS_NAMING", (long)PDO_I5_ATTR_DBC_SYS_NAMING); - REGISTER_PDO_CLASS_CONST_LONG("I5_ATTR_COMMIT", (long)PDO_I5_ATTR_COMMIT); - REGISTER_PDO_CLASS_CONST_LONG("I5_TXN_NO_COMMIT", (long)PDO_I5_TXN_NO_COMMIT); - REGISTER_PDO_CLASS_CONST_LONG("I5_TXN_READ_UNCOMMITTED", (long)PDO_I5_TXN_READ_UNCOMMITTED); - REGISTER_PDO_CLASS_CONST_LONG("I5_TXN_READ_COMMITTED", (long)PDO_I5_TXN_READ_COMMITTED); - REGISTER_PDO_CLASS_CONST_LONG("I5_TXN_REPEATABLE_READ", (long)PDO_I5_TXN_REPEATABLE_READ); - REGISTER_PDO_CLASS_CONST_LONG("I5_TXN_SERIALIZABLE", (long)PDO_I5_TXN_SERIALIZABLE); - - REGISTER_PDO_CLASS_CONST_LONG("I5_ATTR_JOB_SORT", (long)PDO_I5_ATTR_JOB_SORT); - REGISTER_PDO_CLASS_CONST_LONG("I5_ATTR_DBC_LIBL", (long)PDO_I5_ATTR_DBC_LIBL); - REGISTER_PDO_CLASS_CONST_LONG("I5_ATTR_DBC_CURLIB", (long)PDO_I5_ATTR_DBC_CURLIB); + REGISTER_PDO_IBM_I5_CLASS_CONST_LONG_DEPRECATED_ALIAS_85("ATTR_COMMIT", (long)PDO_I5_ATTR_COMMIT); + REGISTER_PDO_IBM_I5_CLASS_CONST_LONG_DEPRECATED_ALIAS_85("TXN_NO_COMMIT", (long)PDO_I5_TXN_NO_COMMIT); + REGISTER_PDO_IBM_I5_CLASS_CONST_LONG_DEPRECATED_ALIAS_85("TXN_READ_UNCOMMITTED", (long)PDO_I5_TXN_READ_UNCOMMITTED); + REGISTER_PDO_IBM_I5_CLASS_CONST_LONG_DEPRECATED_ALIAS_85("TXN_READ_COMMITTED", (long)PDO_I5_TXN_READ_COMMITTED); + REGISTER_PDO_IBM_I5_CLASS_CONST_LONG_DEPRECATED_ALIAS_85("TXN_REPEATABLE_READ", (long)PDO_I5_TXN_REPEATABLE_READ); + REGISTER_PDO_IBM_I5_CLASS_CONST_LONG_DEPRECATED_ALIAS_85("TXN_SERIALIZABLE", (long)PDO_I5_TXN_SERIALIZABLE); + + REGISTER_PDO_IBM_I5_CLASS_CONST_LONG_DEPRECATED_ALIAS_85("ATTR_JOB_SORT", (long)PDO_I5_ATTR_JOB_SORT); + REGISTER_PDO_IBM_I5_CLASS_CONST_LONG_DEPRECATED_ALIAS_85("ATTR_DBC_LIBL", (long)PDO_I5_ATTR_DBC_LIBL); + REGISTER_PDO_IBM_I5_CLASS_CONST_LONG_DEPRECATED_ALIAS_85("ATTR_DBC_CURLIB", (long)PDO_I5_ATTR_DBC_CURLIB); #endif /* PASE */ /* Client information variables */ - REGISTER_PDO_CLASS_CONST_LONG("SQL_ATTR_INFO_USERID", (long) PDO_SQL_ATTR_INFO_USERID); - REGISTER_PDO_CLASS_CONST_LONG("SQL_ATTR_INFO_ACCTSTR", (long) PDO_SQL_ATTR_INFO_ACCTSTR); - REGISTER_PDO_CLASS_CONST_LONG("SQL_ATTR_INFO_APPLNAME", (long) PDO_SQL_ATTR_INFO_APPLNAME); - REGISTER_PDO_CLASS_CONST_LONG("SQL_ATTR_INFO_WRKSTNNAME", (long) PDO_SQL_ATTR_INFO_WRKSTNNAME); - + REGISTER_PDO_IBM_CLASS_CONST_LONG_DEPRECATED_ALIAS_85("ATTR_INFO_USERID", (long) PDO_SQL_ATTR_INFO_USERID); + REGISTER_PDO_IBM_CLASS_CONST_LONG_DEPRECATED_ALIAS_85("ATTR_INFO_ACCTSTR", (long) PDO_SQL_ATTR_INFO_ACCTSTR); + REGISTER_PDO_IBM_CLASS_CONST_LONG_DEPRECATED_ALIAS_85("ATTR_INFO_APPLNAME", (long) PDO_SQL_ATTR_INFO_APPLNAME); + REGISTER_PDO_IBM_CLASS_CONST_LONG_DEPRECATED_ALIAS_85("ATTR_INFO_WRKSTNNAME", (long) PDO_SQL_ATTR_INFO_WRKSTNNAME); + +#if PHP_VERSION_ID >= 80500 + pdo_ibm_ce = register_class_Pdo_Ibm(pdo_dbh_ce); + pdo_ibm_ce->create_object = pdo_dbh_new; + + return php_pdo_register_driver_specific_ce(&pdo_ibm_driver, pdo_ibm_ce); +#else php_pdo_register_driver(&pdo_ibm_driver); - return TRUE; + return TRUE; +#endif } /* }}} */ diff --git a/pdo_ibm.stub.php b/pdo_ibm.stub.php new file mode 100644 index 0000000..95003b3 --- /dev/null +++ b/pdo_ibm.stub.php @@ -0,0 +1,66 @@ + Date: Wed, 10 Sep 2025 14:40:52 -0300 Subject: [PATCH 03/12] Don't load arginfo for pre-8.5 for now --- pdo_ibm.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pdo_ibm.c b/pdo_ibm.c index 8670de3..394ff75 100644 --- a/pdo_ibm.c +++ b/pdo_ibm.c @@ -30,7 +30,8 @@ #include "php_pdo_ibm.h" #include "php_pdo_ibm_int.h" -#if PHP_MAJOR_VERSION >= 8 +/* The class constants are only useful on 8,4/8.5+ */ +#if PHP_VERSION_ID >= 80500 #include "pdo_ibm_arginfo.h" #endif From 924fbc6d4d8609650e82b21cb7d54b2da4f8c2ad Mon Sep 17 00:00:00 2001 From: Calvin Buckley Date: Wed, 10 Sep 2025 14:44:13 -0300 Subject: [PATCH 04/12] Include in PECL package --- package.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/package.xml b/package.xml index 3ba37fc..6b03a8e 100644 --- a/package.xml +++ b/package.xml @@ -142,6 +142,8 @@ Universal Database, IBM Cloudscape, Apache Derby databases and IDS (Informix Dat + + From 339dfb5762a327ef8234eff721752b4eb07788eb Mon Sep 17 00:00:00 2001 From: Calvin Buckley Date: Wed, 10 Sep 2025 14:51:11 -0300 Subject: [PATCH 05/12] Oops, still need to call this with the new PDO interface --- pdo_ibm.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pdo_ibm.c b/pdo_ibm.c index 394ff75..d0ee0d4 100644 --- a/pdo_ibm.c +++ b/pdo_ibm.c @@ -134,6 +134,10 @@ PHP_MINIT_FUNCTION(pdo_ibm) REGISTER_INI_ENTRIES(); #endif + if (FAILURE == php_pdo_register_driver(&pdo_ibm_driver)) { + return FAILURE; + } + #ifndef PASE /* i5/OS no support trusted */ REGISTER_PDO_IBM_CLASS_CONST_LONG_DEPRECATED_ALIAS_85("ATTR_USE_TRUSTED_CONTEXT", (long) PDO_SQL_ATTR_USE_TRUSTED_CONTEXT); REGISTER_PDO_IBM_CLASS_CONST_LONG_DEPRECATED_ALIAS_85("ATTR_TRUSTED_CONTEXT_USERID", (long) PDO_SQL_ATTR_TRUSTED_CONTEXT_USERID); @@ -165,7 +169,6 @@ PHP_MINIT_FUNCTION(pdo_ibm) return php_pdo_register_driver_specific_ce(&pdo_ibm_driver, pdo_ibm_ce); #else - php_pdo_register_driver(&pdo_ibm_driver); return TRUE; #endif } From ccfb0097dc3d77f238248549ae778d1fe537ee7a Mon Sep 17 00:00:00 2001 From: Calvin Buckley Date: Wed, 10 Sep 2025 15:03:11 -0300 Subject: [PATCH 06/12] Use driver specific class on 8.4 as well --- pdo_ibm.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pdo_ibm.c b/pdo_ibm.c index d0ee0d4..8a2870c 100644 --- a/pdo_ibm.c +++ b/pdo_ibm.c @@ -30,8 +30,8 @@ #include "php_pdo_ibm.h" #include "php_pdo_ibm_int.h" -/* The class constants are only useful on 8,4/8.5+ */ -#if PHP_VERSION_ID >= 80500 +/* The class constants are only useful on 8.4+ */ +#if PHP_VERSION_ID >= 80400 #include "pdo_ibm_arginfo.h" #endif @@ -163,7 +163,7 @@ PHP_MINIT_FUNCTION(pdo_ibm) REGISTER_PDO_IBM_CLASS_CONST_LONG_DEPRECATED_ALIAS_85("ATTR_INFO_APPLNAME", (long) PDO_SQL_ATTR_INFO_APPLNAME); REGISTER_PDO_IBM_CLASS_CONST_LONG_DEPRECATED_ALIAS_85("ATTR_INFO_WRKSTNNAME", (long) PDO_SQL_ATTR_INFO_WRKSTNNAME); -#if PHP_VERSION_ID >= 80500 +#if PHP_VERSION_ID >= 80400 pdo_ibm_ce = register_class_Pdo_Ibm(pdo_dbh_ce); pdo_ibm_ce->create_object = pdo_dbh_new; From d5a9e9f16a2e11ec67de42784d92016726ac21a5 Mon Sep 17 00:00:00 2001 From: Calvin Buckley Date: Wed, 10 Sep 2025 15:04:09 -0300 Subject: [PATCH 07/12] remove useless comment --- pdo_ibm.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/pdo_ibm.c b/pdo_ibm.c index 8a2870c..97cb3e0 100644 --- a/pdo_ibm.c +++ b/pdo_ibm.c @@ -35,8 +35,6 @@ #include "pdo_ibm_arginfo.h" #endif -/* If you declare any globals in php_pdo_ibm.h uncomment this: -*/ #ifdef PASE ZEND_DECLARE_MODULE_GLOBALS(pdo_ibm) #endif From 26d3204a5890524df2cd71cbe1afc3c80a02de8b Mon Sep 17 00:00:00 2001 From: Calvin Buckley Date: Thu, 11 Sep 2025 12:17:36 -0300 Subject: [PATCH 08/12] Correct spacing in stub --- pdo_ibm.stub.php | 80 ++++++++++++++++++++++++----------------------- pdo_ibm_arginfo.h | 2 +- 2 files changed, 42 insertions(+), 40 deletions(-) diff --git a/pdo_ibm.stub.php b/pdo_ibm.stub.php index 95003b3..2f23266 100644 --- a/pdo_ibm.stub.php +++ b/pdo_ibm.stub.php @@ -2,65 +2,67 @@ /** * @generate-class-entries + * + * This driver specific PDO class is only used for PHP 8.4+ */ namespace Pdo { - /** - * @strict-properties - * @not-serializable - */ - class Ibm extends \PDO - { - /** @cvalue PDO_SQL_ATTR_INFO_USERID */ - public const int ATTR_INFO_USERID = UNKNOWN; + /** + * @strict-properties + * @not-serializable + */ + class Ibm extends \PDO + { + /** @cvalue PDO_SQL_ATTR_INFO_USERID */ + public const int ATTR_INFO_USERID = UNKNOWN; - /** @cvalue PDO_SQL_ATTR_INFO_ACCTSTR */ - public const int ATTR_INFO_ACCTSTR = UNKNOWN; + /** @cvalue PDO_SQL_ATTR_INFO_ACCTSTR */ + public const int ATTR_INFO_ACCTSTR = UNKNOWN; - /** @cvalue PDO_SQL_ATTR_INFO_APPLNAME */ - public const int ATTR_INFO_APPLNAME = UNKNOWN; + /** @cvalue PDO_SQL_ATTR_INFO_APPLNAME */ + public const int ATTR_INFO_APPLNAME = UNKNOWN; - /** @cvalue PDO_SQL_ATTR_INFO_WRKSTNNAME */ - public const int ATTR_INFO_WRKSTNNAME = UNKNOWN; + /** @cvalue PDO_SQL_ATTR_INFO_WRKSTNNAME */ + public const int ATTR_INFO_WRKSTNNAME = UNKNOWN; #ifndef PASE - /** @cvalue PDO_SQL_ATTR_USE_TRUSTED_CONTEXT */ - public const int ATTR_USE_TRUSTED_CONTEXT = UNKNOWN; + /** @cvalue PDO_SQL_ATTR_USE_TRUSTED_CONTEXT */ + public const int ATTR_USE_TRUSTED_CONTEXT = UNKNOWN; - /** @cvalue PDO_SQL_ATTR_TRUSTED_CONTEXT_USERID */ - public const int ATTR_TRUSTED_CONTEXT_USERID = UNKNOWN; + /** @cvalue PDO_SQL_ATTR_TRUSTED_CONTEXT_USERID */ + public const int ATTR_TRUSTED_CONTEXT_USERID = UNKNOWN; - /** @cvalue PDO_SQL_ATTR_TRUSTED_CONTEXT_PASSWORD */ - public const int ATTR_TRUSTED_CONTEXT_PASSWORD = UNKNOWN; + /** @cvalue PDO_SQL_ATTR_TRUSTED_CONTEXT_PASSWORD */ + public const int ATTR_TRUSTED_CONTEXT_PASSWORD = UNKNOWN; #endif #ifdef PASE - /** @cvalue PDO_I5_ATTR_COMMIT */ - public const int ATTR_COMMIT = UNKNOWN; + /** @cvalue PDO_I5_ATTR_COMMIT */ + public const int ATTR_COMMIT = UNKNOWN; - /** @cvalue PDO_I5_TXN_NO_COMMIT */ - public const int TXN_NO_COMMIT = UNKNOWN; + /** @cvalue PDO_I5_TXN_NO_COMMIT */ + public const int TXN_NO_COMMIT = UNKNOWN; - /** @cvalue PDO_I5_TXN_READ_UNCOMMITTED */ - public const int TXN_READ_UNCOMMITTED = UNKNOWN; + /** @cvalue PDO_I5_TXN_READ_UNCOMMITTED */ + public const int TXN_READ_UNCOMMITTED = UNKNOWN; - /** @cvalue PDO_I5_TXN_READ_COMMITTED */ - public const int TXN_READ_COMMITTED = UNKNOWN; + /** @cvalue PDO_I5_TXN_READ_COMMITTED */ + public const int TXN_READ_COMMITTED = UNKNOWN; - /** @cvalue PDO_I5_TXN_REPEATABLE_READ */ - public const int TXN_REPEATABLE_READ = UNKNOWN; + /** @cvalue PDO_I5_TXN_REPEATABLE_READ */ + public const int TXN_REPEATABLE_READ = UNKNOWN; - /** @cvalue PDO_I5_TXN_SERIALIZABLE */ - public const int TXN_SERIALIZABLE = UNKNOWN; + /** @cvalue PDO_I5_TXN_SERIALIZABLE */ + public const int TXN_SERIALIZABLE = UNKNOWN; - /** @cvalue PDO_I5_ATTR_JOB_SORT */ - public const int ATTR_JOB_SORT = UNKNOWN; + /** @cvalue PDO_I5_ATTR_JOB_SORT */ + public const int ATTR_JOB_SORT = UNKNOWN; - /** @cvalue PDO_I5_ATTR_DBC_LIBL */ - public const int ATTR_DBC_LIBL = UNKNOWN; + /** @cvalue PDO_I5_ATTR_DBC_LIBL */ + public const int ATTR_DBC_LIBL = UNKNOWN; - /** @cvalue PDO_I5_ATTR_DBC_CURLIB */ - public const int ATTR_DBC_CURLIB = UNKNOWN; + /** @cvalue PDO_I5_ATTR_DBC_CURLIB */ + public const int ATTR_DBC_CURLIB = UNKNOWN; #endif - } + } } diff --git a/pdo_ibm_arginfo.h b/pdo_ibm_arginfo.h index 379e1d8..b8ab7eb 100644 --- a/pdo_ibm_arginfo.h +++ b/pdo_ibm_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: d973ffba51a2d0ff794d8b86edfdf13aafddb615 */ + * Stub hash: 427aa66f949b5916e4fe54c09da53fa2853479e5 */ static zend_class_entry *register_class_Pdo_Ibm(zend_class_entry *class_entry_PDO) { From eb96a7ceceb0618090b1770967ec55c36c4c0603 Mon Sep 17 00:00:00 2001 From: Calvin Buckley Date: Thu, 11 Sep 2025 12:26:36 -0300 Subject: [PATCH 09/12] Make test use driver's class constants on PHP 8.4+ Needed because on 8.5, the PDO ones trigger a deprecation message. IBM i specific tests also need this, but they don't run in CI yet. --- tests/fvt_client_info.phpt | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/tests/fvt_client_info.phpt b/tests/fvt_client_info.phpt index d44fee3..8d5ee86 100644 --- a/tests/fvt_client_info.phpt +++ b/tests/fvt_client_info.phpt @@ -11,22 +11,33 @@ pdo_ibm: Client Info { print "Attempting to connect..\n"; $this->connect(); + + // Use class constants in 8.4 or newer, 8.5 will show + // a deprecation message when using the PDO constants + $userID = version_compare(PHP_VERSION, '8.4.0') >= 0 + ? \PDO\Ibm::ATTR_INFO_USERID : PDO::SQL_ATTR_INFO_USERID; + $acctStr = version_compare(PHP_VERSION, '8.4.0') >= 0 + ? \PDO\Ibm::ATTR_INFO_ACCTSTR : PDO::SQL_ATTR_INFO_ACCTSTR; + $applName = version_compare(PHP_VERSION, '8.4.0') >= 0 + ? \PDO\Ibm::ATTR_INFO_APPLNAME : PDO::SQL_ATTR_INFO_APPLNAME; + $wrkstnName = version_compare(PHP_VERSION, '8.4.0') >= 0 + ? \PDO\Ibm::ATTR_INFO_WRKSTNNAME : PDO::SQL_ATTR_INFO_WRKSTNNAME; - var_dump($this->db->getAttribute(PDO::SQL_ATTR_INFO_USERID)); - var_dump($this->db->getAttribute(PDO::SQL_ATTR_INFO_ACCTSTR)); - var_dump($this->db->getAttribute(PDO::SQL_ATTR_INFO_APPLNAME)); + var_dump($this->db->getAttribute($userID)); + var_dump($this->db->getAttribute($acctStr)); + var_dump($this->db->getAttribute($applName)); // This will default to the hostname of the system nowadays. - var_dump($this->db->getAttribute(PDO::SQL_ATTR_INFO_WRKSTNNAME)); + var_dump($this->db->getAttribute($wrkstnName)); - $this->db->setAttribute(PDO::SQL_ATTR_INFO_USERID, "MyUser"); - $this->db->setAttribute(PDO::SQL_ATTR_INFO_ACCTSTR, "MyAccountString"); - $this->db->setAttribute(PDO::SQL_ATTR_INFO_APPLNAME, "MyApp"); - $this->db->setAttribute(PDO::SQL_ATTR_INFO_WRKSTNNAME, "MyWorkStation"); + $this->db->setAttribute($userID, "MyUser"); + $this->db->setAttribute($acctStr, "MyAccountString"); + $this->db->setAttribute($applName, "MyApp"); + $this->db->setAttribute($wrkstnName, "MyWorkStation"); - var_dump($this->db->getAttribute(PDO::SQL_ATTR_INFO_USERID)); - var_dump($this->db->getAttribute(PDO::SQL_ATTR_INFO_ACCTSTR)); - var_dump($this->db->getAttribute(PDO::SQL_ATTR_INFO_APPLNAME)); - var_dump($this->db->getAttribute(PDO::SQL_ATTR_INFO_WRKSTNNAME)); + var_dump($this->db->getAttribute($userID)); + var_dump($this->db->getAttribute($acctStr)); + var_dump($this->db->getAttribute($applName)); + var_dump($this->db->getAttribute($wrkstnName)); } } From 78bcc5764bd82224b68aae770659931701d9bc39 Mon Sep 17 00:00:00 2001 From: Calvin Buckley Date: Fri, 12 Sep 2025 10:35:06 -0300 Subject: [PATCH 10/12] Forgot ATTR_DBC_SYS_NAMING --- pdo_ibm.stub.php | 3 +++ pdo_ibm_arginfo.h | 8 +++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/pdo_ibm.stub.php b/pdo_ibm.stub.php index 2f23266..4a8da6e 100644 --- a/pdo_ibm.stub.php +++ b/pdo_ibm.stub.php @@ -36,6 +36,9 @@ class Ibm extends \PDO public const int ATTR_TRUSTED_CONTEXT_PASSWORD = UNKNOWN; #endif #ifdef PASE + /** @cvalue PDO_I5_ATTR_DBC_SYS_NAMING */ + public const int ATTR_DBC_SYS_NAMING = UNKNOWN; + /** @cvalue PDO_I5_ATTR_COMMIT */ public const int ATTR_COMMIT = UNKNOWN; diff --git a/pdo_ibm_arginfo.h b/pdo_ibm_arginfo.h index b8ab7eb..24b0464 100644 --- a/pdo_ibm_arginfo.h +++ b/pdo_ibm_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 427aa66f949b5916e4fe54c09da53fa2853479e5 */ + * Stub hash: e6e91d0261810097515617adf9364f2ddf293a43 */ static zend_class_entry *register_class_Pdo_Ibm(zend_class_entry *class_entry_PDO) { @@ -53,6 +53,12 @@ static zend_class_entry *register_class_Pdo_Ibm(zend_class_entry *class_entry_PD #endif #if defined(PASE) + zval const_ATTR_DBC_SYS_NAMING_value; + ZVAL_LONG(&const_ATTR_DBC_SYS_NAMING_value, PDO_I5_ATTR_DBC_SYS_NAMING); + zend_string *const_ATTR_DBC_SYS_NAMING_name = zend_string_init_interned("ATTR_DBC_SYS_NAMING", sizeof("ATTR_DBC_SYS_NAMING") - 1, 1); + zend_declare_typed_class_constant(class_entry, const_ATTR_DBC_SYS_NAMING_name, &const_ATTR_DBC_SYS_NAMING_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG)); + zend_string_release(const_ATTR_DBC_SYS_NAMING_name); + zval const_ATTR_COMMIT_value; ZVAL_LONG(&const_ATTR_COMMIT_value, PDO_I5_ATTR_COMMIT); zend_string *const_ATTR_COMMIT_name = zend_string_init_interned("ATTR_COMMIT", sizeof("ATTR_COMMIT") - 1, 1); From 2eb1d29dd9820318b35b946fa3fe5fbacb89b7a9 Mon Sep 17 00:00:00 2001 From: Calvin Buckley Date: Fri, 19 Sep 2025 14:36:50 -0300 Subject: [PATCH 11/12] Test driver subclasses on 8.4+ --- tests/fvt.inc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/fvt.inc b/tests/fvt.inc index c34d62c..8b19968 100644 --- a/tests/fvt.inc +++ b/tests/fvt.inc @@ -39,7 +39,10 @@ abstract class FVTTest public function connect($autoCommit=true, $useLibl=false, $useIsolation=false) { $options = array(PDO::ATTR_AUTOCOMMIT=>$autoCommit); - $this->db = new PDO($this->dsn, $this->user, $this->pass, $options); + // Use the driver subclass on PHP 8.4+ + $this->db = version_compare(PHP_VERSION, '8.4.0') >= 0 + ? PDO::construct($this->dsn, $this->user, $this->pass, $options) + : new PDO($this->dsn, $this->user, $this->pass, $options); $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $this->db->setAttribute(PDO::ATTR_CASE, PDO::CASE_UPPER); $this->db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, true); From ce26896bd55bc62712ca06b6002791f52dad1b4a Mon Sep 17 00:00:00 2001 From: Calvin Buckley Date: Fri, 19 Sep 2025 14:52:54 -0300 Subject: [PATCH 12/12] typo --- tests/fvt.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/fvt.inc b/tests/fvt.inc index 8b19968..8cd222b 100644 --- a/tests/fvt.inc +++ b/tests/fvt.inc @@ -41,7 +41,7 @@ abstract class FVTTest $options = array(PDO::ATTR_AUTOCOMMIT=>$autoCommit); // Use the driver subclass on PHP 8.4+ $this->db = version_compare(PHP_VERSION, '8.4.0') >= 0 - ? PDO::construct($this->dsn, $this->user, $this->pass, $options) + ? PDO::connect($this->dsn, $this->user, $this->pass, $options) : new PDO($this->dsn, $this->user, $this->pass, $options); $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $this->db->setAttribute(PDO::ATTR_CASE, PDO::CASE_UPPER);