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 + + diff --git a/pdo_ibm.c b/pdo_ibm.c index 5044a73..97cb3e0 100644 --- a/pdo_ibm.c +++ b/pdo_ibm.c @@ -30,8 +30,11 @@ #include "php_pdo_ibm.h" #include "php_pdo_ibm_int.h" -/* If you declare any globals in php_pdo_ibm.h uncomment this: -*/ +/* The class constants are only useful on 8.4+ */ +#if PHP_VERSION_ID >= 80400 +#include "pdo_ibm_arginfo.h" +#endif + #ifdef PASE ZEND_DECLARE_MODULE_GLOBALS(pdo_ibm) #endif @@ -40,6 +43,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 @@ -47,32 +51,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 }; /* }}} */ @@ -111,6 +109,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) @@ -121,33 +132,43 @@ 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_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); - - php_pdo_register_driver(&pdo_ibm_driver); - return TRUE; + 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 >= 80400 + 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 + return TRUE; +#endif } /* }}} */ diff --git a/pdo_ibm.stub.php b/pdo_ibm.stub.php new file mode 100644 index 0000000..4a8da6e --- /dev/null +++ b/pdo_ibm.stub.php @@ -0,0 +1,71 @@ +$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::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); $this->db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, true); 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)); } }