Skip to content

Commit a7618b2

Browse files
committed
refactor: improve on PDO database implementation
Signed-off-by: otengkwame <developerkwame@gmail.com>
1 parent 493fd38 commit a7618b2

3 files changed

Lines changed: 57 additions & 16 deletions

File tree

CodeIgniter/Framework/database/drivers/pdo/subdrivers/pdo_mysql_driver.php

Lines changed: 49 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -118,10 +118,42 @@ public function __construct($params)
118118
* Database connection
119119
*
120120
* @param bool $persistent
121-
* @return object
121+
* @return mixed
122122
*/
123123
public function db_connect($persistent = false)
124124
{
125+
126+
if (PHP_VERSION_ID >= 80400 && class_exists('\Pdo\Mysql')) {
127+
$CONST_PREFIX = \Pdo\Mysql::class . '::';
128+
$ATTR_INIT_COMMAND_NAME = $CONST_PREFIX . 'ATTR_INIT_COMMAND';
129+
$ATTR_COMPRESS_NAME = $CONST_PREFIX . 'ATTR_COMPRESS';
130+
$ATTR_SSL_KEY_NAME = $CONST_PREFIX . 'ATTR_SSL_KEY';
131+
$ATTR_SSL_CERT_NAME = $CONST_PREFIX . 'ATTR_SSL_CERT';
132+
$ATTR_SSL_CA_NAME = $CONST_PREFIX . 'ATTR_SSL_CA';
133+
$ATTR_SSL_CAPATH_NAME = $CONST_PREFIX . 'ATTR_SSL_CAPATH';
134+
$ATTR_SSL_CIPHER_NAME = $CONST_PREFIX . 'ATTR_SSL_CIPHER';
135+
$ATTR_SSL_VERIFY_SERVER_CERT_NAME = $CONST_PREFIX . 'ATTR_SSL_VERIFY_SERVER_CERT';
136+
} else {
137+
$CONST_PREFIX = \PDO::class . '::';
138+
$ATTR_INIT_COMMAND_NAME = $CONST_PREFIX . 'MYSQL_ATTR_INIT_COMMAND';
139+
$ATTR_COMPRESS_NAME = $CONST_PREFIX . 'MYSQL_ATTR_COMPRESS';
140+
$ATTR_SSL_KEY_NAME = $CONST_PREFIX . 'MYSQL_ATTR_SSL_KEY';
141+
$ATTR_SSL_CERT_NAME = $CONST_PREFIX . 'MYSQL_ATTR_SSL_CERT';
142+
$ATTR_SSL_CA_NAME = $CONST_PREFIX . 'MYSQL_ATTR_SSL_CA';
143+
$ATTR_SSL_CAPATH_NAME = $CONST_PREFIX . 'MYSQL_ATTR_SSL_CAPATH';
144+
$ATTR_SSL_CIPHER_NAME = $CONST_PREFIX . 'MYSQL_ATTR_SSL_CIPHER';
145+
$ATTR_SSL_VERIFY_SERVER_CERT_NAME = $CONST_PREFIX . 'MYSQL_ATTR_SSL_VERIFY_SERVER_CERT';
146+
}
147+
148+
$ATTR_INIT_COMMAND = constant($ATTR_INIT_COMMAND_NAME);
149+
$ATTR_COMPRESS = constant($ATTR_COMPRESS_NAME);
150+
$ATTR_SSL_KEY = constant($ATTR_SSL_KEY_NAME);
151+
$ATTR_SSL_CERT = constant($ATTR_SSL_CERT_NAME);
152+
$ATTR_SSL_CA = constant($ATTR_SSL_CA_NAME);
153+
$ATTR_SSL_CAPATH = constant($ATTR_SSL_CAPATH_NAME);
154+
$ATTR_SSL_CIPHER = constant($ATTR_SSL_CIPHER_NAME);
155+
$ATTR_SSL_VERIFY_SERVER_CERT = constant($ATTR_SSL_VERIFY_SERVER_CERT_NAME) ?? -1;
156+
125157
if (isset($this->stricton)) {
126158
if ($this->stricton) {
127159
$sql = 'CONCAT(@@sql_mode, ",", "STRICT_ALL_TABLES")';
@@ -137,28 +169,30 @@ public function db_connect($persistent = false)
137169
}
138170

139171
if (! empty($sql)) {
140-
if (empty($this->options[PDO::MYSQL_ATTR_INIT_COMMAND])) {
141-
$this->options[PDO::MYSQL_ATTR_INIT_COMMAND] = 'SET SESSION sql_mode = ' . $sql;
172+
if (empty($this->options[$ATTR_INIT_COMMAND])) {
173+
$this->options[$ATTR_INIT_COMMAND] = 'SET SESSION sql_mode = ' . $sql;
142174
} else {
143-
$this->options[PDO::MYSQL_ATTR_INIT_COMMAND] .= ', @@session.sql_mode = ' . $sql;
175+
$this->options[$ATTR_INIT_COMMAND] .= ', @@session.sql_mode = ' . $sql;
144176
}
145177
}
146178
}
147179

180+
148181
if ($this->compress === true) {
149-
$this->options[PDO::MYSQL_ATTR_COMPRESS] = true;
182+
$this->options[$ATTR_COMPRESS] = true;
150183
}
151184

152185
if (is_array($this->encrypt)) {
153-
$ssl = [];
154-
empty($this->encrypt['ssl_key']) or $ssl[PDO::MYSQL_ATTR_SSL_KEY] = $this->encrypt['ssl_key'];
155-
empty($this->encrypt['ssl_cert']) or $ssl[PDO::MYSQL_ATTR_SSL_CERT] = $this->encrypt['ssl_cert'];
156-
empty($this->encrypt['ssl_ca']) or $ssl[PDO::MYSQL_ATTR_SSL_CA] = $this->encrypt['ssl_ca'];
157-
empty($this->encrypt['ssl_capath']) or $ssl[PDO::MYSQL_ATTR_SSL_CAPATH] = $this->encrypt['ssl_capath'];
158-
empty($this->encrypt['ssl_cipher']) or $ssl[PDO::MYSQL_ATTR_SSL_CIPHER] = $this->encrypt['ssl_cipher'];
159-
160-
if (defined('PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT') && isset($this->encrypt['ssl_verify'])) {
161-
$ssl[PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT] = $this->encrypt['ssl_verify'];
186+
$ssl = array();
187+
empty($this->encrypt['ssl_key']) or $ssl[$ATTR_SSL_KEY] = $this->encrypt['ssl_key'];
188+
empty($this->encrypt['ssl_cert']) or $ssl[$ATTR_SSL_CERT] = $this->encrypt['ssl_cert'];
189+
empty($this->encrypt['ssl_ca']) or $ssl[$ATTR_SSL_CA] = $this->encrypt['ssl_ca'];
190+
empty($this->encrypt['ssl_capath']) or $ssl[$ATTR_SSL_CAPATH] = $this->encrypt['ssl_capath'];
191+
empty($this->encrypt['ssl_cipher']) or $ssl[$ATTR_SSL_CIPHER] = $this->encrypt['ssl_cipher'];
192+
193+
194+
if ($ATTR_SSL_VERIFY_SERVER_CERT !== -1 && isset($this->encrypt['ssl_verify'])) {
195+
$ssl[$ATTR_SSL_VERIFY_SERVER_CERT] = $this->encrypt['ssl_verify'];
162196
}
163197

164198
// DO NOT use array_merge() here!
@@ -293,7 +327,7 @@ protected function _list_columns($table = '')
293327
* Returns an object with field data
294328
*
295329
* @param string $table
296-
* @return array
330+
* @return array|bool
297331
*/
298332
public function field_data($table)
299333
{

CodeIgniter/Framework/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ public function __construct(&$db)
100100
parent::__construct($db);
101101

102102
if (version_compare($this->db->version(), '9.0', '>')) {
103-
$this->create_table_if = 'CREATE TABLE IF NOT EXISTS';
103+
$this->_create_table_if = 'CREATE TABLE IF NOT EXISTS';
104104
}
105105
}
106106

CodeIgniter/Framework/database/drivers/postgre/postgre_forge.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,13 @@ class CI_DB_postgre_forge extends CI_DB_forge
7575
*/
7676
protected $_null = 'null';
7777

78+
/**
79+
* CREATE TABLE IF statement
80+
*
81+
* @var string
82+
*/
83+
protected $_create_table_if = 'CREATE TABLE IF NOT EXISTS';
84+
7885
// --------------------------------------------------------------------
7986

8087
/**

0 commit comments

Comments
 (0)