mirror of
https://github.com/FreshRSS/FreshRSS.git
synced 2026-10-25 04:28:36 -04:00
Merge remote-tracking branch 'origin/sqliteBug' into dev
This commit is contained in:
commit
8b27128a62
7 files changed
+70
-38
No files matched your search
+40
-31
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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'],
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user