Merge remote-tracking branch 'origin/sqliteBug' into dev

This commit is contained in:
Alexandre Alapetite committed 2015-05-11 22:47:13 +02:00
commit 8b27128a62
7 files changed
+70 -38

No files matched your search

+40 -31
View File
@@ -6,38 +6,48 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable {
return parent::$sharedDbType !== 'sqlite';
}
protected function addColumn($name) {
Minz_Log::debug('FreshRSS_EntryDAO::autoAddColumn: ' . $name);
$hasTransaction = false;
try {
$stm = null;
if ($name === 'lastSeen') { //v1.2
if (!$this->bd->inTransaction()) {
$this->bd->beginTransaction();
$hasTransaction = true;
}
$stm = $this->bd->prepare('ALTER TABLE `' . $this->prefix . 'entry` ADD COLUMN lastSeen INT(11) DEFAULT 0');
if ($stm && $stm->execute()) {
$stm = $this->bd->prepare('CREATE INDEX entry_lastSeen_index ON `' . $this->prefix . 'entry`(`lastSeen`);'); //"IF NOT EXISTS" does not exist in MySQL 5.7
if ($stm && $stm->execute()) {
if ($hasTransaction) {
$this->bd->commit();
}
return true;
}
}
if ($hasTransaction) {
$this->bd->rollBack();
}
} elseif ($name === 'hash') { //v1.2
$stm = $this->bd->prepare('ALTER TABLE `' . $this->prefix . 'entry` ADD COLUMN hash BINARY(16)');
return $stm && $stm->execute();
}
} catch (Exception $e) {
Minz_Log::debug('FreshRSS_EntryDAO::autoAddColumn error: ' . $e->getMessage());
if ($hasTransaction) {
$this->bd->rollBack();
}
}
return false;
}
protected function autoAddColumn($errorInfo) {
if (isset($errorInfo[0])) {
if ($errorInfo[0] == '42S22') { //ER_BAD_FIELD_ERROR
$hasTransaction = false;
try {
$stm = null;
if (stripos($errorInfo[2], 'lastSeen') !== false) { //v1.2
if (!$this->bd->inTransaction()) {
$this->bd->beginTransaction();
$hasTransaction = true;
}
$stm = $this->bd->prepare('ALTER TABLE `' . $this->prefix . 'entry` ADD COLUMN lastSeen INT(11) NOT NULL');
if ($stm && $stm->execute()) {
$stm = $this->bd->prepare('CREATE INDEX entry_lastSeen_index ON `' . $this->prefix . 'entry`(`lastSeen`);'); //"IF NOT EXISTS" does not exist in MySQL 5.7
if ($stm && $stm->execute()) {
if ($hasTransaction) {
$this->bd->commit();
}
return true;
}
}
if ($hasTransaction) {
$this->bd->rollBack();
}
} elseif (stripos($errorInfo[2], 'hash') !== false) { //v1.2
$stm = $this->bd->prepare('ALTER TABLE `' . $this->prefix . 'entry` ADD COLUMN hash BINARY(16) NOT NULL');
return $stm && $stm->execute();
}
} catch (Exception $e) {
Minz_Log::debug('FreshRSS_EntryDAO::autoAddColumn error: ' . $e->getMessage());
if ($hasTransaction) {
$this->bd->rollBack();
foreach (array('lastSeen', 'hash') as $column) {
if (stripos($errorInfo[2], $column) !== false) {
return $this->addColumn($column);
}
}
}
@@ -82,7 +92,7 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable {
return $this->addEntry($valuesTmp);
} elseif ((int)($info[0] / 1000) !== 23) { //Filter out "SQLSTATE Class code 23: Constraint Violation" because of expected duplicate entries
Minz_Log::error('SQL error addEntry: ' . $info[0] . ': ' . $info[1] . ' ' . $info[2]
. ' while adding entry in feed ' . $valuesTmp['id_feed'] . ' with title: ' . $valuesTmp['title']);
. ' while adding entry in feed ' . $valuesTmp['id_feed'] . ' with title: ' . $valuesTmp['title']. ' ' . $this->addEntryPrepared);
}
return false;
}
@@ -597,7 +607,6 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable {
}
return $result;
} else {
$info = $stm == null ? array(0 => '', 1 => '', 2 => 'syntax error') : $stm->errorInfo();
if ($this->autoAddColumn($info)) {
return $this->listHashForFeedGuids($id_feed, $guids);
+15
View File
@@ -2,6 +2,21 @@
class FreshRSS_EntryDAOSQLite extends FreshRSS_EntryDAO {
protected function autoAddColumn($errorInfo) {
if (empty($errorInfo[0]) || $errorInfo[0] == '42S22') { //ER_BAD_FIELD_ERROR
if ($tableInfo = $this->bd->query("SELECT sql FROM sqlite_master where name='entry'")) {
$showCreate = $tableInfo->fetchColumn();
Minz_Log::debug('FreshRSS_EntryDAOSQLite::autoAddColumn: ' . $showCreate);
foreach (array('lastSeen', 'hash') as $column) {
if (stripos($showCreate, $column) === false) {
return $this->addColumn($column);
}
}
}
}
return false;
}
protected function sqlConcat($s1, $s2) {
return $s1 . '||' . $s2;
}
+6 -5
View File
@@ -330,11 +330,12 @@ class FreshRSS_FeedDAO extends Minz_ModelPdo implements FreshRSS_Searchable {
. 'AND id NOT IN (SELECT id FROM (SELECT e2.id FROM `' . $this->prefix . 'entry` e2 WHERE e2.id_feed=:id_feed ORDER BY id DESC LIMIT :keep) keep)'; //Double select: MySQL doesn't support 'LIMIT & IN/ALL/ANY/SOME subquery'
$stm = $this->bd->prepare($sql);
$id_max = intval($date_min) . '000000';
$stm->bindParam(':id_feed', $id, PDO::PARAM_INT);
$stm->bindParam(':id_max', $id_max, PDO::PARAM_STR);
$stm->bindParam(':keep', $keep, PDO::PARAM_INT);
if ($stm) {
$id_max = intval($date_min) . '000000';
$stm->bindParam(':id_feed', $id, PDO::PARAM_INT);
$stm->bindParam(':id_max', $id_max, PDO::PARAM_STR);
$stm->bindParam(':keep', $keep, PDO::PARAM_INT);
}
if ($stm && $stm->execute()) {
return $stm->rowCount();
+1 -1
View File
@@ -41,7 +41,7 @@ CREATE TABLE IF NOT EXISTS `%1$sentry` (
`content_bin` blob, -- v0.7
`link` varchar(1023) CHARACTER SET latin1 NOT NULL,
`date` int(11), -- Until year 2038
`lastSeen` INT(11) NOT NULL, -- v1.2, Until year 2038
`lastSeen` INT(11) DEFAULT 0, -- v1.2, Until year 2038
`hash` BINARY(16), -- v1.2
`is_read` boolean NOT NULL DEFAULT 0,
`is_favorite` boolean NOT NULL DEFAULT 0,
+1 -1
View File
@@ -39,7 +39,7 @@ $SQL_CREATE_TABLES = array(
`content` text,
`link` varchar(1023) NOT NULL,
`date` int(11), -- Until year 2038
`lastSeen` INT(11) NOT NULL, -- v1.2, Until year 2038
`lastSeen` INT(11) DEFAULT 0, -- v1.2, Until year 2038
`hash` BINARY(16), -- v1.2
`is_read` boolean NOT NULL DEFAULT 0,
`is_favorite` boolean NOT NULL DEFAULT 0,
+2
View File
@@ -168,8 +168,10 @@ function saveStep3() {
$_SESSION['bd_prefix_user'] = $_SESSION['bd_prefix'] .(empty($_SESSION['default_user']) ? '' :($_SESSION['default_user'] . '_'));
}
//TODO: load `config.default.php` as default
$config_array = array(
'environment' => 'production',
'simplepie_syslog_enabled' => true,
'salt' => $_SESSION['salt'],
'title' => $_SESSION['title'],
'default_user' => $_SESSION['default_user'],
+5
View File
@@ -134,4 +134,9 @@ class MinzPDO extends PDO {
MinzPDO::check($statement);
return parent::exec($statement);
}
public function query($statement) {
MinzPDO::check($statement);
return parent::query($statement);
}
}