summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Alexandre Alapetite <alexandre@alapetite.fr> 2016-08-23 00:02:54 +0200
committerGravatar Alexandre Alapetite <alexandre@alapetite.fr> 2016-08-23 00:02:54 +0200
commitc25fdbcc0990b637e305665a456e52e1aa3dec0a (patch)
treec5c7582833eaf82d6afc608312c3420a83914e8f
parent2af3abc89e56af75c38caf5e8071b3cd09bedba8 (diff)
More PostgreSQL
-rw-r--r--app/Models/EntryDAO.php75
-rw-r--r--app/Models/EntryDAOPGSQL.php79
-rw-r--r--app/Models/EntryDAOSQLite.php4
-rw-r--r--app/SQL/install.sql.pgsql.php136
-rw-r--r--app/install.php26
-rw-r--r--lib/Minz/ModelPdo.php29
6 files changed, 138 insertions, 211 deletions
diff --git a/app/Models/EntryDAO.php b/app/Models/EntryDAO.php
index 3a1dc1ba5..8d136cd6c 100644
--- a/app/Models/EntryDAO.php
+++ b/app/Models/EntryDAO.php
@@ -10,6 +10,14 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable {
return parent::$sharedDbType !== 'sqlite';
}
+ public function sqlHexDecode($x) {
+ return 'X' . $x;
+ }
+
+ public function sqlHexEncode($x) {
+ return 'hex(' . $x . ')';
+ }
+
protected function addColumn($name) {
Minz_Log::warning('FreshRSS_EntryDAO::addColumn: ' . $name);
$hasTransaction = false;
@@ -106,31 +114,42 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable {
$sql = 'INSERT INTO `' . $this->prefix . 'entry` (id, guid, title, author, '
. ($this->isCompressed() ? 'content_bin' : 'content')
. ', link, date, lastSeen, hash, is_read, is_favorite, id_feed, tags) '
- . 'VALUES(?, ?, ?, ?, '
- . ($this->isCompressed() ? 'COMPRESS(?)' : '?')
- . ', ?, ?, ?, '
- . ($this->hasNativeHex() ? 'X?' : '?')
- . ', ?, ?, ?, ?)';
+ . 'VALUES(:id, :guid, :title, :author, '
+ . ($this->isCompressed() ? 'COMPRESS(:content)' : ':content')
+ . ', :link, :date, :last_seen, '
+ . $this->sqlHexDecode(':hash')
+ . ', :is_read, :is_favorite, :id_feed, :tags)';
$this->addEntryPrepared = $this->bd->prepare($sql);
}
+ $this->addEntryPrepared->bindParam(':id', $valuesTmp['id']);
+ $valuesTmp['guid'] = substr($valuesTmp['guid'], 0, 760);
+ $this->addEntryPrepared->bindParam(':guid', $valuesTmp['guid']);
+ $valuesTmp['title'] = substr($valuesTmp['title'], 0, 255);
+ $this->addEntryPrepared->bindParam(':title', $valuesTmp['title']);
+ $valuesTmp['author'] = substr($valuesTmp['author'], 0, 255);
+ $this->addEntryPrepared->bindParam(':author', $valuesTmp['author']);
+ $this->addEntryPrepared->bindParam(':content', $valuesTmp['content']);
+ $valuesTmp['link'] = substr($valuesTmp['link'], 0, 1023);
+ $this->addEntryPrepared->bindParam(':link', $valuesTmp['link']);
+ $this->addEntryPrepared->bindParam(':date', $valuesTmp['date'], PDO::PARAM_INT);
+ $valuesTmp['lastSeen'] = time();
+ $this->addEntryPrepared->bindParam(':last_seen', $valuesTmp['lastSeen'], PDO::PARAM_INT);
+ $valuesTmp['is_read'] = $valuesTmp['is_read'] ? 1 : 0;
+ $this->addEntryPrepared->bindParam(':is_read', $valuesTmp['is_read'], PDO::PARAM_INT);
+ $valuesTmp['is_favorite'] = $valuesTmp['is_favorite'] ? 1 : 0;
+ $this->addEntryPrepared->bindParam(':is_favorite', $valuesTmp['is_favorite'], PDO::PARAM_INT);
+ $this->addEntryPrepared->bindParam(':id_feed', $valuesTmp['id_feed'], PDO::PARAM_INT);
+ $valuesTmp['tags'] = substr($valuesTmp['tags'], 0, 1023);
+ $this->addEntryPrepared->bindParam(':tags', $valuesTmp['tags']);
+
+ if ($this->hasNativeHex()) {
+ $this->addEntryPrepared->bindParam(':hash', $valuesTmp['hash']);
+ } else {
+ $valuesTmp['hashBin'] = pack('H*', $valuesTmp['hash']);
+ $this->addEntryPrepared->bindParam(':hash', $valuesTmp['hashBin']); // X'09AF' hexadecimal literals do not work with SQLite/PDO //hex2bin() is PHP5.4+
+ }
- $values = array(
- $valuesTmp['id'],
- substr($valuesTmp['guid'], 0, 760),
- substr($valuesTmp['title'], 0, 255),
- substr($valuesTmp['author'], 0, 255),
- $valuesTmp['content'],
- substr($valuesTmp['link'], 0, 1023),
- $valuesTmp['date'],
- time(),
- $this->hasNativeHex() ? $valuesTmp['hash'] : pack('H*', $valuesTmp['hash']), // X'09AF' hexadecimal literals do not work with SQLite/PDO //hex2bin() is PHP5.4+
- $valuesTmp['is_read'] ? 1 : 0,
- $valuesTmp['is_favorite'] ? 1 : 0,
- $valuesTmp['id_feed'],
- substr($valuesTmp['tags'], 0, 1023),
- );
-
- if ($this->addEntryPrepared && $this->addEntryPrepared->execute($values)) {
+ if ($this->addEntryPrepared && $this->addEntryPrepared->execute()) {
return $this->bd->lastInsertId();
} else {
$info = $this->addEntryPrepared == null ? array(0 => '', 1 => '', 2 => 'syntax error') : $this->addEntryPrepared->errorInfo();
@@ -156,7 +175,7 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable {
. 'SET title=?, author=?, '
. ($this->isCompressed() ? 'content_bin=COMPRESS(?)' : 'content=?')
. ', link=?, date=?, lastSeen=?, hash='
- . ($this->hasNativeHex() ? 'X?' : '?')
+ . ($this->hasNativeHex() ? 'X?' : '?') //TODO PostgreSQL
. ', ' . ($valuesTmp['is_read'] === null ? '' : 'is_read=?, ')
. 'tags=? '
. 'WHERE id_feed=? AND guid=?';
@@ -430,12 +449,12 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable {
}
$this->bd->beginTransaction();
- $sql = 'UPDATE `' . $this->prefix . 'entry` e '
- . 'SET e.is_read=1 '
- . 'WHERE e.id_feed=? AND e.is_read=0 AND e.id <= ?';
+ $sql = 'UPDATE `' . $this->prefix . 'entry` '
+ . 'SET is_read=1 '
+ . 'WHERE id_feed=? AND is_read=0 AND id <= ?';
$values = array($id_feed, $idMax);
- list($searchValues, $search) = $this->sqlListEntriesWhere('e.', $filter, $state);
+ list($searchValues, $search) = $this->sqlListEntriesWhere('', $filter, $state);
$stm = $this->bd->prepare($sql . $search);
if (!($stm && $stm->execute(array_merge($values, $searchValues)))) {
@@ -658,7 +677,7 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable {
if (count($guids) < 1) {
return array();
}
- $sql = 'SELECT guid, hex(hash) AS hexHash FROM `' . $this->prefix . 'entry` WHERE id_feed=? AND guid IN (' . str_repeat('?,', count($guids) - 1). '?)';
+ $sql = 'SELECT guid, ' . $this->sqlHexEncode('hash') . ' AS hexHash FROM `' . $this->prefix . 'entry` WHERE id_feed=? AND guid IN (' . str_repeat('?,', count($guids) - 1). '?)';
$stm = $this->bd->prepare($sql);
$values = array($id_feed);
$values = array_merge($values, $guids);
diff --git a/app/Models/EntryDAOPGSQL.php b/app/Models/EntryDAOPGSQL.php
index 95c12ff5d..b96a62ebc 100644
--- a/app/Models/EntryDAOPGSQL.php
+++ b/app/Models/EntryDAOPGSQL.php
@@ -1,82 +1,21 @@
<?php
-class FreshRSS_EntryDAOPGSQL extends FreshRSS_EntryDAO {
+class FreshRSS_EntryDAOPGSQL extends FreshRSS_EntryDAOSQLite {
- protected function addColumn($name) {
- return false;
- }
-
- protected function updateCacheUnreads($catId = false, $feedId = false) {
- return true; //done via triggers
+ public function sqlHexDecode($x) {
+ return 'decode(' . $x . ", 'hex')";
}
- /**
- * Mark all the articles in a feed as read.
- * There is a fail safe to prevent to mark as read articles that are
- * loaded during the mark as read action. Then the cache is updated.
- *
- * If $idMax equals 0, a deprecated debug message is logged
- *
- * @param integer $id_feed feed ID
- * @param integer $idMax fail safe article ID
- * @return integer affected rows
- */
- public function markReadFeed($id_feed, $idMax = 0) {
- if ($idMax == 0) {
- $idMax = time() . '000000';
- Minz_Log::debug('Calling markReadFeed(0) is deprecated!');
- }
- $this->bd->beginTransaction();
-
- $sql = 'UPDATE "' . $this->prefix . 'entry" '
- . 'SET is_read=:is_read '
- . 'WHERE id_feed=:id_feed AND NOT is_read AND id <= :idmax';
- $values = array($id_feed, $idMax);
- $stm = $this->bd->prepare($sql);
- $stm->bindValue(':is_read', true, PDO::PARAM_BOOL);
- $stm->bindValue(':id_feed', $id_feed);
- $stm->bindValue(':idmax', $idMax);
-
- if (!($stm && $stm->execute())) {
- $info = $stm == null ? array(2 => 'syntax error') : $stm->errorInfo();
- Minz_Log::error('SQL error markReadFeed: ' . $info[2]);
- $this->bd->rollBack();
- return false;
- }
- $affected = $stm->rowCount();
-
- $this->bd->commit();
- return $affected;
+ public function sqlHexEncode($x) {
+ return 'encode(' . $x . ", 'hex')";
}
- public function listHashForFeedGuids($id_feed, $guids) {
- if (count($guids) < 1) {
- return array();
- }
- $sql = 'SELECT guid, hash AS hexHash FROM "' . $this->prefix . 'entry" WHERE id_feed=? AND guid IN (' . str_repeat('?,', count($guids) - 1). '?)';
- $stm = $this->bd->prepare($sql);
- $values = array($id_feed);
- $values = array_merge($values, $guids);
- if ($stm && $stm->execute($values)) {
- $result = array();
- $rows = $stm->fetchAll(PDO::FETCH_ASSOC);
- foreach ($rows as $row) {
- $result[$row['guid']] = $row['hexHash'];
- }
- return $result;
- } else {
- $info = $stm == null ? array(0 => '', 1 => '', 2 => 'syntax error') : $stm->errorInfo();
- if ($this->autoAddColumn($info)) {
- return $this->listHashForFeedGuids($id_feed, $guids);
- }
- Minz_Log::error('SQL error listHashForFeedGuids: ' . $info[0] . ': ' . $info[1] . ' ' . $info[2]
- . ' while querying feed ' . $id_feed);
- return false;
- }
+ protected function autoUpdateDb($errorInfo) {
+ return false;
}
- public function optimizeTable() {
- return null;
+ protected function addColumn($name) {
+ return false;
}
public function size($all = true) {
diff --git a/app/Models/EntryDAOSQLite.php b/app/Models/EntryDAOSQLite.php
index dad34a93d..80dbcca6b 100644
--- a/app/Models/EntryDAOSQLite.php
+++ b/app/Models/EntryDAOSQLite.php
@@ -2,6 +2,10 @@
class FreshRSS_EntryDAOSQLite extends FreshRSS_EntryDAO {
+ public function sqlHexDecode($x) {
+ return $x;
+ }
+
protected function autoUpdateDb($errorInfo) {
if (empty($errorInfo[0]) || $errorInfo[0] == '42S22') { //ER_BAD_FIELD_ERROR
//autoAddColumn
diff --git a/app/SQL/install.sql.pgsql.php b/app/SQL/install.sql.pgsql.php
index 0f243bdb5..04e35af68 100644
--- a/app/SQL/install.sql.pgsql.php
+++ b/app/SQL/install.sql.pgsql.php
@@ -1,91 +1,65 @@
<?php
-define('SQL_CREATE_TABLES', '
-CREATE TABLE IF NOT EXISTS "%1$scategory" (
- id SERIAL PRIMARY KEY,
- name varchar(255) UNIQUE NOT NULL
-)
+define('SQL_CREATE_DB', 'CREATE DATABASE %1$s ENCODING \'UTF8\';');
-CREATE TABLE IF NOT EXISTS "%1$sfeed" (
- id SERIAL PRIMARY KEY,
- url varchar(511) UNIQUE NOT NULL,
- category SMALLINT DEFAULT 0,
- name varchar(255) NOT NULL,
- website varchar(255),
- description text,
- lastUpdate int DEFAULT 0,
- priority smallint NOT NULL DEFAULT 10,
- pathEntries varchar(511) DEFAULT NULL,
- httpAuth varchar(511) DEFAULT NULL,
- error boolean DEFAULT FALSE,
- keep_history INT NOT NULL DEFAULT -2,
- ttl INT NOT NULL DEFAULT -2,
- cache_nbEntries int DEFAULT 0,
- cache_nbUnreads int DEFAULT 0,
- FOREIGN KEY (category) REFERENCES "%1$scategory" (id) ON DELETE SET NULL ON UPDATE CASCADE
-)
-CREATE INDEX name_index ON "%1$sfeed" (name)
-CREATE INDEX priority_index ON "%1$sfeed" (priority)
-CREATE INDEX keep_history_index ON "%1$sfeed" (keep_history)
+global $SQL_CREATE_TABLES;
+$SQL_CREATE_TABLES = array(
+'CREATE TABLE IF NOT EXISTS "%1$scategory" (
+ "id" SERIAL PRIMARY KEY,
+ "name" varchar(255) UNIQUE NOT NULL
+);',
-CREATE TABLE IF NOT EXISTS "%1$sentry" (
- id bigint NOT NULL PRIMARY KEY,
- guid varchar(760) UNIQUE NOT NULL,
- title varchar(255) NOT NULL,
- author varchar(255),
- content_bin text,
- link varchar(1023) NOT NULL,
- date INT,
- lastSeen INT DEFAULT 0,
- hash BYTEA,
- is_read boolean NOT NULL DEFAULT false,
- is_favorite boolean NOT NULL DEFAULT false,
- id_feed SMALLINT,
- tags varchar(1023),
- FOREIGN KEY (id_feed) REFERENCES "%1$sfeed" (id) ON DELETE CASCADE ON UPDATE CASCADE
-)
-CREATE INDEX is_favorite_index ON "%1$sentry" (is_favorite)
-CREATE INDEX is_read_index ON "%1$sentry" (is_read)
-CREATE INDEX entry_lastSeen_index ON "%1$sentry" (lastSeen)
-
-CREATE OR REPLACE FUNCTION update_unread_feed() RETURNS TRIGGER AS $$
- BEGIN
- UPDATE "%1$sfeed"
- SET cache_nbUnreads=(SELECT COUNT(*) FROM "%1$sentry" WHERE id_feed=OLD.id_feed AND NOT is_read)
- WHERE id=OLD.id_feed;
- return NULL;
- end;
- $$ LANGUAGE PLPGSQL;
-
-CREATE TRIGGER update_unread_feed
- AFTER UPDATE OF is_read OR DELETE OR INSERT ON "%1$sentry"
- FOR EACH ROW
- EXECUTE PROCEDURE update_unread_feed();
+'CREATE TABLE IF NOT EXISTS "%1$sfeed" (
+ "id" SERIAL PRIMARY KEY,
+ "url" varchar(511) UNIQUE NOT NULL,
+ "category" SMALLINT DEFAULT 0,
+ "name" varchar(255) NOT NULL,
+ "website" varchar(255),
+ "description" text,
+ "lastUpdate" int DEFAULT 0,
+ "priority" smallint NOT NULL DEFAULT 10,
+ "pathEntries" varchar(511) DEFAULT NULL,
+ "httpAuth" varchar(511) DEFAULT NULL,
+ "error" smallint DEFAULT 0,
+ "keep_history" INT NOT NULL DEFAULT -2,
+ "ttl" INT NOT NULL DEFAULT -2,
+ "cache_nbEntries" int DEFAULT 0,
+ "cache_nbUnreads" int DEFAULT 0,
+ FOREIGN KEY (category) REFERENCES "%1$scategory" ("id") ON DELETE SET NULL ON UPDATE CASCADE
+);',
+'CREATE INDEX name_index ON "%1$sfeed" ("name");',
+'CREATE INDEX priority_index ON "%1$sfeed" ("priority");',
+'CREATE INDEX keep_history_index ON "%1$sfeed" ("keep_history");',
-CREATE OR REPLACE FUNCTION reset_feed_seq() RETURNS TRIGGER AS $$
- BEGIN
- PERFORM 1 FROM "%1$sfeed";
- IF NOT FOUND THEN
- ALTER SEQUENCE IF EXISTS "%1$sfeed_id_seq" RESTART;
- END IF;
- return NULL;
- end;
- $$ LANGUAGE PLPGSQL;
-
-CREATE TRIGGER reset_feed_seq
- AFTER DELETE ON "%1$sfeed"
- FOR EACH STATEMENT
- EXECUTE PROCEDURE reset_feed_seq();
+'CREATE TABLE IF NOT EXISTS "%1$sentry" (
+ "id" bigint NOT NULL PRIMARY KEY,
+ "guid" varchar(760) UNIQUE NOT NULL,
+ "title" varchar(255) NOT NULL,
+ "author" varchar(255),
+ "content" text,
+ "link" varchar(1023) NOT NULL,
+ "date" INT,
+ "lastSeen" INT DEFAULT 0,
+ "hash" BYTEA,
+ "is_read" smallint NOT NULL DEFAULT 0,
+ "is_favorite" smallint NOT NULL DEFAULT 0,
+ "id_feed" SMALLINT,
+ "tags" varchar(1023),
+ FOREIGN KEY (id_feed) REFERENCES "%1$sfeed" (id) ON DELETE CASCADE ON UPDATE CASCADE
+);',
+'CREATE INDEX is_favorite_index ON "%1$sentry" ("is_favorite");',
+'CREATE INDEX is_read_index ON "%1$sentry" ("is_read");',
+'CREATE INDEX entry_lastSeen_index ON "%1$sentry" ("lastSeen");',
-CREATE OR REPLACE RULE check_constraints_on_entry AS ON INSERT TO "%1$sentry" WHERE EXISTS(SELECT 1 FROM "%1$sentry" WHERE guid=NEW.guid) DO INSTEAD NOTHING;
-CREATE OR REPLACE RULE check_constraints_on_feed AS ON INSERT TO "%1$sfeed" WHERE EXISTS(SELECT 1 FROM "%1$sfeed" WHERE url=NEW.url) DO INSTEAD NOTHING;
-CREATE OR REPLACE RULE check_constraints_on_category AS ON INSERT TO "%1$scategory" WHERE EXISTS(SELECT 1 FROM "%1$scategory" WHERE name=NEW.name) DO INSTEAD NOTHING;
-CREATE OR REPLACE RULE check_constraints_on_category as on update to "%1$scategory" WHERE EXISTS(SELECT 1 FROM "%1$scategory" WHERE name=NEW.name) DO INSTEAD NOTHING;
+'CREATE OR REPLACE RULE check_constraints_on_entry AS ON INSERT TO "%1$sentry" WHERE EXISTS(SELECT 1 FROM "%1$sentry" WHERE guid=NEW.guid) DO INSTEAD NOTHING;',
+'CREATE OR REPLACE RULE check_constraints_on_feed AS ON INSERT TO "%1$sfeed" WHERE EXISTS(SELECT 1 FROM "%1$sfeed" WHERE url=NEW.url) DO INSTEAD NOTHING;',
+'CREATE OR REPLACE RULE check_constraints_on_category AS ON INSERT TO "%1$scategory" WHERE EXISTS(SELECT 1 FROM "%1$scategory" WHERE name=NEW.name) DO INSTEAD NOTHING;',
+'CREATE OR REPLACE RULE check_constraints_on_category as on update to "%1$scategory" WHERE EXISTS(SELECT 1 FROM "%1$scategory" WHERE name=NEW.name) DO INSTEAD NOTHING;',
-INSERT IGNORE INTO "%1$scategory" (id, name) VALUES(1, "%2$s");
-INSERT IGNORE INTO "%1$sfeed" (url, category, name, website, description, ttl) VALUES("http://freshrss.org/feeds/all.atom.xml", 1, "FreshRSS.org", "http://freshrss.org/", "FreshRSS, a free, self-hostable aggregator…", 86400);
-INSERT IGNORE INTO "%1$sfeed" (url, category, name, website, description, ttl) VALUES("https://github.com/FreshRSS/FreshRSS/releases.atom", 1, "FreshRSS @ GitHub", "https://github.com/FreshRSS/FreshRSS/", "FreshRSS releases @ GitHub", 86400);
-');
+'INSERT INTO "%1$scategory" (id, name) VALUES(1, \'%2$s\');',
+'INSERT INTO "%1$sfeed" (url, category, name, website, description, ttl) VALUES(\'http://freshrss.org/feeds/all.atom.xml\', 1, \'FreshRSS.org\', \'http://freshrss.org/\', \'FreshRSS, a free, self-hostable aggregator…\', 86400);',
+'INSERT INTO "%1$sfeed" (url, category, name, website, description, ttl) VALUES(\'https://github.com/FreshRSS/FreshRSS/releases.atom\', 1, \'FreshRSS @ GitHub\', \'https://github.com/FreshRSS/FreshRSS/\', \'FreshRSS releases @ GitHub\', 86400);',
+);
define('SQL_DROP_TABLES', 'DROP TABLES "%1$sentry", "%1$sfeed", "%1$scategory"');
diff --git a/app/install.php b/app/install.php
index 6e902485c..db16ca6b1 100644
--- a/app/install.php
+++ b/app/install.php
@@ -200,6 +200,9 @@ function saveStep3() {
$_SESSION['bd_prefix'] = substr($_POST['prefix'], 0, 16);
$_SESSION['bd_prefix_user'] = $_SESSION['bd_prefix'] . (empty($_SESSION['default_user']) ? '' : ($_SESSION['default_user'] . '_'));
}
+ if ($_SESSION['bd_type'] === 'pgsql') {
+ $_SESSION['bd_base'] = strtolower($_SESSION['bd_base']);
+ }
// We use dirname to remove the /i part
$base_url = dirname(Minz_Request::guessBaseUrl());
@@ -236,26 +239,6 @@ function saveStep3() {
invalidateHttpCache();
}
-function newPdo() {
- switch ($_SESSION['bd_type']) {
- case 'mysql':
- $str = 'mysql:host=' . $_SESSION['bd_host'] . ';dbname=' . $_SESSION['bd_base'];
- $driver_options = array(
- PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8mb4',
- );
- break;
- case 'sqlite':
- $str = 'sqlite:' . join_path(USERS_PATH, $_SESSION['default_user'], 'db.sqlite');
- $driver_options = array(
- PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
- );
- break;
- default:
- return false;
- }
- return new PDO($str, $_SESSION['bd_user'], $_SESSION['bd_password'], $driver_options);
-}
-
function deleteInstall() {
$res = unlink(join_path(DATA_PATH, 'do-install.txt'));
@@ -444,11 +427,12 @@ function checkBD() {
);
try { // on ouvre une connexion juste pour créer la base si elle n'existe pas
- $str = 'pgsql:host=' . $_SESSION['bd_host'] . ';';
+ $str = 'pgsql:host=' . $_SESSION['bd_host'] . ';dbname=postgres';
$c = new PDO($str, $_SESSION['bd_user'], $_SESSION['bd_password'], $driver_options);
$sql = sprintf(SQL_CREATE_DB, $_SESSION['bd_base']);
$res = $c->query($sql);
} catch (PDOException $e) {
+ syslog(LOG_DEBUG, 'pgsql ' . $e->getMessage());
}
// on écrase la précédente connexion en sélectionnant la nouvelle BDD
diff --git a/lib/Minz/ModelPdo.php b/lib/Minz/ModelPdo.php
index b98a26d06..41a9f60bf 100644
--- a/lib/Minz/ModelPdo.php
+++ b/lib/Minz/ModelPdo.php
@@ -60,17 +60,17 @@ class Minz_ModelPdo {
$string = 'mysql:host=' . $db['host'] . ';dbname=' . $db['base'] . ';charset=utf8mb4';
$driver_options[PDO::MYSQL_ATTR_INIT_COMMAND] = 'SET NAMES utf8mb4';
$this->prefix = $db['prefix'] . $currentUser . '_';
- $this->bd = new MinzPDO($string, $db['user'], $db['password'], $driver_options);
+ $this->bd = new MinzPDOMySql($string, $db['user'], $db['password'], $driver_options);
//TODO Consider: $this->bd->exec("SET SESSION sql_mode = 'ANSI_QUOTES';");
break;
case 'sqlite':
$string = 'sqlite:' . join_path(DATA_PATH, 'users', $currentUser, 'db.sqlite');
$this->prefix = '';
- $this->bd = new MinzPDO($string, $db['user'], $db['password'], $driver_options);
+ $this->bd = new MinzPDOMSQLite($string, $db['user'], $db['password'], $driver_options);
$this->bd->exec('PRAGMA foreign_keys = ON;');
break;
case 'pgsql':
- $string = 'pgsql:host=' . $db['host'] . ';dbname=' . $db['base'] . ';charset=utf8';
+ $string = 'pgsql:host=' . $db['host'] . ';dbname=' . $db['base'];
$this->prefix = $db['prefix'] . $currentUser . '_';
$this->bd = new MinzPDOPGSQL($string, $db['user'], $db['password'], $driver_options);
$this->bd->exec("SET NAMES 'UTF8';");
@@ -125,33 +125,40 @@ class MinzPDO extends PDO {
public function prepare($statement, $driver_options = array()) {
MinzPDO::check($statement);
- $statement = MinzPDO::compatibility($statement);
+ $statement = $this->compatibility($statement);
return parent::prepare($statement, $driver_options);
}
public function exec($statement) {
MinzPDO::check($statement);
- $statement = MinzPDO::compatibility($statement);
+ $statement = $this->compatibility($statement);
return parent::exec($statement);
}
public function query($statement) {
MinzPDO::check($statement);
- $statement = MinzPDO::compatibility($statement);
+ $statement = $this->compatibility($statement);
return parent::query($statement);
}
+}
+class MinzPDOMySql extends PDO {
public function lastInsertId($name = null) {
return parent::lastInsertId(); //We discard the name, only used by PostgreSQL
}
}
-class MinzPDOPGSQL extends MinzPDO {
- protected function compatibility($statement) {
- return str_replace(array('`', " X'"), array('"', " E'\\x"), $statement);
+class MinzPDOMSQLite extends PDO {
+ public function lastInsertId($name = null) {
+ return parent::lastInsertId(); //We discard the name, only used by PostgreSQL
}
+}
- public function lastInsertId($name = null) {
- return parent::lastInsertId($name);
+class MinzPDOPGSQL extends MinzPDO {
+ protected function compatibility($statement) {
+ return str_replace(
+ array('`', 'lastUpdate', 'pathEntries', 'httpAuth', 'cache_nbEntries', 'cache_nbUnreads', 'lastSeen'),
+ array('"', '"lastUpdate"', '"pathEntries"', '"httpAuth"', '"cache_nbEntries"', '"cache_nbUnreads"', '"lastSeen"'),
+ $statement);
}
}