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));
}
}