summaryrefslogtreecommitdiff
path: root/lib/Minz/ModelPdo.php
diff options
context:
space:
mode:
authorGravatar Alexandre Alapetite <alexandre@alapetite.fr> 2019-10-31 18:15:47 +0100
committerGravatar GitHub <noreply@github.com> 2019-10-31 18:15:47 +0100
commit3aa66f317b496ccd9a2df914bbc747c52081a7ad (patch)
tree6a3f3f74899801abdca00546e213dfdc141c53cf /lib/Minz/ModelPdo.php
parent82611c9622ed23b0e9fcf5f9f651ddffa1fd7706 (diff)
parentfcae48f313d399050cb15f37a8a73ae52fc67796 (diff)
Merge pull request #2599 from FreshRSS/dev1.15.0
FreshRSS 1.15
Diffstat (limited to 'lib/Minz/ModelPdo.php')
-rw-r--r--lib/Minz/ModelPdo.php152
1 files changed, 93 insertions, 59 deletions
diff --git a/lib/Minz/ModelPdo.php b/lib/Minz/ModelPdo.php
index 733982c14..69785c253 100644
--- a/lib/Minz/ModelPdo.php
+++ b/lib/Minz/ModelPdo.php
@@ -6,43 +6,35 @@
/**
* La classe Model_sql représente le modèle interragissant avec les bases de données
- * Seul la connexion MySQL est prise en charge pour le moment
*/
class Minz_ModelPdo {
/**
* Partage la connexion à la base de données entre toutes les instances.
*/
- public static $useSharedBd = true;
- private static $sharedBd = null;
+ public static $usesSharedPdo = true;
+ private static $sharedPdo = null;
private static $sharedPrefix;
private static $sharedCurrentUser;
- protected static $sharedDbType;
-
- /**
- * $bd variable représentant la base de données
- */
- protected $bd;
+ protected $pdo;
protected $current_user;
- protected $prefix;
-
- public function dbType() {
- return self::$sharedDbType;
- }
/**
* Créé la connexion à la base de données à l'aide des variables
* HOST, BASE, USER et PASS définies dans le fichier de configuration
*/
- public function __construct($currentUser = null) {
+ public function __construct($currentUser = null, $currentPdo = null) {
if ($currentUser === null) {
$currentUser = Minz_Session::param('currentUser');
}
- if (self::$useSharedBd && self::$sharedBd != null &&
- ($currentUser == null || $currentUser === self::$sharedCurrentUser)) {
- $this->bd = self::$sharedBd;
- $this->prefix = self::$sharedPrefix;
+ if ($currentPdo != null) {
+ $this->pdo = $currentPdo;
+ return;
+ }
+ if (self::$usesSharedPdo && self::$sharedPdo != null &&
+ ($currentUser == '' || $currentUser === self::$sharedCurrentUser)) {
+ $this->pdo = self::$sharedPdo;
$this->current_user = self::$sharedCurrentUser;
return;
}
@@ -52,34 +44,40 @@ class Minz_ModelPdo {
$conf = Minz_Configuration::get('system');
$db = $conf->db;
- $driver_options = isset($conf->db['pdo_options']) && is_array($conf->db['pdo_options']) ? $conf->db['pdo_options'] : array();
+ $driver_options = isset($db['pdo_options']) && is_array($db['pdo_options']) ? $db['pdo_options'] : [];
$dbServer = parse_url('db://' . $db['host']);
+ $dsn = '';
+ $dsnParams = empty($db['connection_uri_params']) ? '' : (';' . $db['connection_uri_params']);
try {
switch ($db['type']) {
case 'mysql':
- $string = 'mysql:host=' . (empty($dbServer['host']) ? $db['host'] : $dbServer['host']) . ';dbname=' . $db['base'] . ';charset=utf8mb4';
+ $dsn = 'mysql:host=' . (empty($dbServer['host']) ? $db['host'] : $dbServer['host']) . ';charset=utf8mb4';
+ if (!empty($db['base'])) {
+ $dsn .= ';dbname=' . $db['base'];
+ }
if (!empty($dbServer['port'])) {
- $string .= ';port=' . $dbServer['port'];
+ $dsn .= ';port=' . $dbServer['port'];
}
$driver_options[PDO::MYSQL_ATTR_INIT_COMMAND] = 'SET NAMES utf8mb4';
- $this->prefix = $db['prefix'] . $currentUser . '_';
- $this->bd = new MinzPDOMySql($string, $db['user'], $db['password'], $driver_options);
+ $this->pdo = new MinzPDOMySql($dsn . $dsnParams, $db['user'], $db['password'], $driver_options);
+ $this->pdo->setPrefix($db['prefix'] . $currentUser . '_');
break;
case 'sqlite':
- $string = 'sqlite:' . join_path(DATA_PATH, 'users', $currentUser, 'db.sqlite');
- $this->prefix = '';
- $this->bd = new MinzPDOSQLite($string, $db['user'], $db['password'], $driver_options);
- $this->bd->exec('PRAGMA foreign_keys = ON;');
+ $dsn = 'sqlite:' . join_path(DATA_PATH, 'users', $currentUser, 'db.sqlite');
+ $this->pdo = new MinzPDOSQLite($dsn . $dsnParams, $db['user'], $db['password'], $driver_options);
+ $this->pdo->setPrefix('');
break;
case 'pgsql':
- $string = 'pgsql:host=' . (empty($dbServer['host']) ? $db['host'] : $dbServer['host']) . ';dbname=' . $db['base'];
+ $dsn = 'pgsql:host=' . (empty($dbServer['host']) ? $db['host'] : $dbServer['host']);
+ if (!empty($db['base'])) {
+ $dsn .= ';dbname=' . $db['base'];
+ }
if (!empty($dbServer['port'])) {
- $string .= ';port=' . $dbServer['port'];
+ $dsn .= ';port=' . $dbServer['port'];
}
- $this->prefix = $db['prefix'] . $currentUser . '_';
- $this->bd = new MinzPDOPGSQL($string, $db['user'], $db['password'], $driver_options);
- $this->bd->exec("SET NAMES 'UTF8';");
+ $this->pdo = new MinzPDOPGSQL($dsn . $dsnParams, $db['user'], $db['password'], $driver_options);
+ $this->pdo->setPrefix($db['prefix'] . $currentUser . '_');
break;
default:
throw new Minz_PDOConnectionException(
@@ -88,86 +86,122 @@ class Minz_ModelPdo {
);
break;
}
- self::$sharedBd = $this->bd;
- self::$sharedDbType = $db['type'];
- self::$sharedPrefix = $this->prefix;
+ self::$sharedPdo = $this->pdo;
} catch (Exception $e) {
throw new Minz_PDOConnectionException(
- $string,
+ $dsn . $dsnParams,
$db['user'], Minz_Exception::ERROR
);
}
}
public function beginTransaction() {
- $this->bd->beginTransaction();
+ $this->pdo->beginTransaction();
}
public function inTransaction() {
- return $this->bd->inTransaction(); //requires PHP >= 5.3.3
+ return $this->pdo->inTransaction();
}
public function commit() {
- $this->bd->commit();
+ $this->pdo->commit();
}
public function rollBack() {
- $this->bd->rollBack();
+ $this->pdo->rollBack();
}
public static function clean() {
- self::$sharedBd = null;
- self::$sharedPrefix = '';
+ self::$sharedPdo = null;
+ self::$sharedCurrentUser = '';
}
+}
- public function disableBuffering() {
- if ((self::$sharedDbType === 'mysql') && defined('PDO::MYSQL_ATTR_USE_BUFFERED_QUERY')) {
- $this->bd->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
- }
+abstract class MinzPDO extends PDO {
+ public function __construct($dsn, $username = null, $passwd = null, $options = null) {
+ parent::__construct($dsn, $username, $passwd, $options);
+ $this->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
+ }
+
+ abstract public function dbType();
+
+ private $prefix = '';
+ public function prefix() { return $this->prefix; }
+ public function setPrefix($prefix) { $this->prefix = $prefix; }
+
+ private function autoPrefix($sql) {
+ return str_replace('`_', '`' . $this->prefix, $sql);
}
-}
-class MinzPDO extends PDO {
- private static function check($statement) {
+ protected function preSql($statement) {
if (preg_match('/^(?:UPDATE|INSERT|DELETE)/i', $statement)) {
invalidateHttpCache();
}
+ return $this->autoPrefix($statement);
}
- protected function compatibility($statement) {
- return $statement;
+ public function lastInsertId($name = null) {
+ if ($name != null) {
+ $name = $this->preSql($name);
+ }
+ return parent::lastInsertId($name);
}
public function prepare($statement, $driver_options = array()) {
- MinzPDO::check($statement);
- $statement = $this->compatibility($statement);
+ $statement = $this->preSql($statement);
return parent::prepare($statement, $driver_options);
}
public function exec($statement) {
- MinzPDO::check($statement);
- $statement = $this->compatibility($statement);
+ $statement = $this->preSql($statement);
return parent::exec($statement);
}
public function query($statement) {
- MinzPDO::check($statement);
- $statement = $this->compatibility($statement);
+ $statement = $this->preSql($statement);
return parent::query($statement);
}
}
class MinzPDOMySql extends MinzPDO {
+ public function __construct($dsn, $username = null, $passwd = null, $options = null) {
+ parent::__construct($dsn, $username, $passwd, $options);
+ $this->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
+ }
+
+ public function dbType() {
+ return 'mysql';
+ }
+
public function lastInsertId($name = null) {
return parent::lastInsertId(); //We discard the name, only used by PostgreSQL
}
}
class MinzPDOSQLite extends MinzPDO {
+ public function __construct($dsn, $username = null, $passwd = null, $options = null) {
+ parent::__construct($dsn, $username, $passwd, $options);
+ $this->exec('PRAGMA foreign_keys = ON;');
+ }
+
+ public function dbType() {
+ return 'sqlite';
+ }
+
public function lastInsertId($name = null) {
return parent::lastInsertId(); //We discard the name, only used by PostgreSQL
}
}
class MinzPDOPGSQL extends MinzPDO {
- protected function compatibility($statement) {
+ public function __construct($dsn, $username = null, $passwd = null, $options = null) {
+ parent::__construct($dsn, $username, $passwd, $options);
+ $this->exec("SET NAMES 'UTF8';");
+ }
+
+ public function dbType() {
+ return 'pgsql';
+ }
+
+ protected function preSql($statement) {
+ $statement = parent::preSql($statement);
return str_replace(array('`', ' LIKE '), array('"', ' ILIKE '), $statement);
}
}