Explorar el Código

Allow many (20k+) feeds (#4347)

* Allow many (20k+) feeds
Fix errors such as `SQL error listWhereRaw: ERROR: value "42926" is out of range for type smallint`
Start of UI performance improvements accordingly.
Alexandre Alapetite hace 3 años
padre
commit
9d1930d9ad

+ 4 - 4
app/SQL/install.sql.mysql.php

@@ -17,7 +17,7 @@ CREATE TABLE IF NOT EXISTS `_feed` (
 	`id` SMALLINT NOT NULL AUTO_INCREMENT,	-- v0.7
 	`url` VARCHAR(511) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
 	`kind` SMALLINT DEFAULT 0, -- 1.20.0
-	`category` SMALLINT DEFAULT 0,	-- v0.7
+	`category` INT DEFAULT 0,	-- 1.20.0
 	`name` VARCHAR(191) NOT NULL,
 	`website` VARCHAR(255) CHARACTER SET latin1 COLLATE latin1_bin,
 	`description` TEXT,
@@ -50,7 +50,7 @@ CREATE TABLE IF NOT EXISTS `_entry` (
 	`hash` BINARY(16),	-- v1.1.1
 	`is_read` BOOLEAN NOT NULL DEFAULT 0,
 	`is_favorite` BOOLEAN NOT NULL DEFAULT 0,
-	`id_feed` SMALLINT,	-- v0.7
+	`id_feed` INT,	-- 1.20.0
 	`tags` VARCHAR(1023),
 	PRIMARY KEY (`id`),
 	FOREIGN KEY (`id_feed`) REFERENCES `_feed`(`id`) ON DELETE CASCADE ON UPDATE CASCADE,
@@ -82,7 +82,7 @@ CREATE TABLE IF NOT EXISTS `_entrytmp` (	-- v1.7
 	`hash` BINARY(16),
 	`is_read` BOOLEAN NOT NULL DEFAULT 0,
 	`is_favorite` BOOLEAN NOT NULL DEFAULT 0,
-	`id_feed` SMALLINT,
+	`id_feed` INT,	-- 1.20.0
 	`tags` VARCHAR(1023),
 	PRIMARY KEY (`id`),
 	FOREIGN KEY (`id_feed`) REFERENCES `_feed`(`id`) ON DELETE CASCADE ON UPDATE CASCADE,
@@ -103,7 +103,7 @@ CREATE TABLE IF NOT EXISTS `_tag` (	-- v1.12
 ENGINE = INNODB;
 
 CREATE TABLE IF NOT EXISTS `_entrytag` (	-- v1.12
-	`id_tag` SMALLINT,
+	`id_tag` INT,	-- 1.20.0
 	`id_entry` BIGINT,
 	PRIMARY KEY (`id_tag`,`id_entry`),
 	FOREIGN KEY (`id_tag`) REFERENCES `_tag`(`id`) ON DELETE CASCADE ON UPDATE CASCADE,

+ 4 - 4
app/SQL/install.sql.pgsql.php

@@ -14,7 +14,7 @@ CREATE TABLE IF NOT EXISTS `_feed` (
 	"id" SERIAL PRIMARY KEY,
 	"url" VARCHAR(511) UNIQUE NOT NULL,
 	"kind" SMALLINT DEFAULT 0, -- 1.20.0
-	"category" SMALLINT DEFAULT 0,
+	"category" INT DEFAULT 0,	-- 1.20.0
 	"name" VARCHAR(255) NOT NULL,
 	"website" VARCHAR(255),
 	"description" TEXT,
@@ -44,7 +44,7 @@ CREATE TABLE IF NOT EXISTS `_entry` (
 	"hash" BYTEA,
 	"is_read" SMALLINT NOT NULL DEFAULT 0,
 	"is_favorite" SMALLINT NOT NULL DEFAULT 0,
-	"id_feed" SMALLINT,
+	"id_feed" INT,	-- 1.20.0
 	"tags" VARCHAR(1023),
 	FOREIGN KEY ("id_feed") REFERENCES `_feed` ("id") ON DELETE CASCADE ON UPDATE CASCADE,
 	UNIQUE ("id_feed","guid")
@@ -77,7 +77,7 @@ CREATE TABLE IF NOT EXISTS `_entrytmp` (	-- v1.7
 	"hash" BYTEA,
 	"is_read" SMALLINT NOT NULL DEFAULT 0,
 	"is_favorite" SMALLINT NOT NULL DEFAULT 0,
-	"id_feed" SMALLINT,
+	"id_feed" INT,	-- 1.20.0
 	"tags" VARCHAR(1023),
 	FOREIGN KEY ("id_feed") REFERENCES `_feed` ("id") ON DELETE CASCADE ON UPDATE CASCADE,
 	UNIQUE ("id_feed","guid")
@@ -92,7 +92,7 @@ CREATE TABLE IF NOT EXISTS `_tag` (	-- v1.12
 	"attributes" TEXT
 );
 CREATE TABLE IF NOT EXISTS `_entrytag` (
-	"id_tag" SMALLINT,
+	"id_tag" INT,	-- 1.20.0
 	"id_entry" BIGINT,
 	PRIMARY KEY ("id_tag","id_entry"),
 	FOREIGN KEY ("id_tag") REFERENCES `_tag` ("id") ON DELETE CASCADE ON UPDATE CASCADE,

+ 4 - 4
app/SQL/install.sql.sqlite.php

@@ -15,7 +15,7 @@ CREATE TABLE IF NOT EXISTS `feed` (
 	`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
 	`url` VARCHAR(511) NOT NULL,
 	`kind` SMALLINT DEFAULT 0, -- 1.20.0
-	`category` SMALLINT DEFAULT 0,
+	`category` INT DEFAULT 0,	-- 1.20.0
 	`name` VARCHAR(255) NOT NULL,
 	`website` VARCHAR(255),
 	`description` TEXT,
@@ -46,7 +46,7 @@ CREATE TABLE IF NOT EXISTS `entry` (
 	`hash` BINARY(16),	-- v1.1.1
 	`is_read` BOOLEAN NOT NULL DEFAULT 0,
 	`is_favorite` BOOLEAN NOT NULL DEFAULT 0,
-	`id_feed` SMALLINT,
+	`id_feed` INT,	-- 1.20.0
 	`tags` VARCHAR(1023),
 	PRIMARY KEY (`id`),
 	FOREIGN KEY (`id_feed`) REFERENCES `feed`(`id`) ON DELETE CASCADE ON UPDATE CASCADE,
@@ -77,7 +77,7 @@ CREATE TABLE IF NOT EXISTS `entrytmp` (	-- v1.7
 	`hash` BINARY(16),
 	`is_read` BOOLEAN NOT NULL DEFAULT 0,
 	`is_favorite` BOOLEAN NOT NULL DEFAULT 0,
-	`id_feed` SMALLINT,
+	`id_feed` INT,	-- 1.20.0
 	`tags` VARCHAR(1023),
 	PRIMARY KEY (`id`),
 	FOREIGN KEY (`id_feed`) REFERENCES `feed`(`id`) ON DELETE CASCADE ON UPDATE CASCADE,
@@ -94,7 +94,7 @@ CREATE TABLE IF NOT EXISTS `tag` (	-- v1.12
 	UNIQUE (`name`)
 );
 CREATE TABLE IF NOT EXISTS `entrytag` (
-	`id_tag` SMALLINT,
+	`id_tag` INT,	-- 1.20.0
 	`id_entry` BIGINT,
 	PRIMARY KEY (`id_tag`,`id_entry`),
 	FOREIGN KEY (`id_tag`) REFERENCES `tag` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,

+ 20 - 19
app/layout/aside_feed.phtml

@@ -71,7 +71,7 @@
 		</li>
 
 		<?php
-			foreach ($this->categories as $cat) {
+			foreach ($this->categories as $cat):
 				$feeds = $cat->feeds();
 				$position = $cat->attributes('position');
 				if (!empty($feeds)) {
@@ -88,28 +88,29 @@
 			</div>
 
 			<ul class="tree-folder-items<?= $c_show ? ' active' : '' ?>">
-				<?php
-					foreach ($feeds as $feed) {
-						$f_active = FreshRSS_Context::isCurrentGet('f_' . $feed->id());
-				?>
-				<li id="f_<?= $feed->id() ?>" class="item feed<?= $f_active ? ' active' : '', $feed->mute() ? ' mute' : '' ?><?=
-					$feed->inError() ? ' error' : '' ?><?= $feed->nbEntries() <= 0 ? ' empty' : ''
-					?>" data-unread="<?= $feed->nbNotRead() ?>" data-priority="<?= $feed->priority() ?>">
-					<div class="dropdown no-mobile">
-						<div class="dropdown-target"></div>
-						<a class="dropdown-toggle" data-fweb="<?= $feed->website() ?>"><?= _i('configure') ?></a>
-						<?php /* feed_config_template */ ?>
-					</div>
-					<?php if (FreshRSS_Context::$user_conf->show_favicons): ?><img class="favicon" src="<?= $feed->favicon() ?>" alt="✇" loading="lazy" /><?php endif; ?>
-					<a class="item-title" data-unread="<?= format_number($feed->nbNotRead()) ?>" href="<?=
-						_url('index', $actual_view, 'get', 'f_' . $feed->id()). $state_filter_manual ?>"><?= $feed->name() ?></a>
-				</li>
-				<?php } ?>
+<?php
+	// NB: Reduce whitespace in that loop
+	foreach ($feeds as $feed):
+		$f_active = FreshRSS_Context::isCurrentGet('f_' . $feed->id());
+?>
+<li id="f_<?= $feed->id() ?>" class="item feed<?= $f_active ? ' active' : '', $feed->mute() ? ' mute' : '' ?><?=
+	$feed->inError() ? ' error' : '' ?><?= $feed->nbEntries() <= 0 ? ' empty' : ''
+	?>" data-unread="<?= $feed->nbNotRead() ?>" data-priority="<?= $feed->priority() ?>">
+	<div class="dropdown no-mobile">
+		<div class="dropdown-target"></div><a class="dropdown-toggle" data-fweb="<?= $feed->website() ?>"><?= _i('configure') ?></a><?php /* feed_config_template */ ?>
+	</div>
+	<?php
+		if (FreshRSS_Context::$user_conf->show_favicons): ?><img class="favicon" src="<?= $feed->favicon() ?>" alt="✇" loading="lazy" /><?php endif;
+	?><a class="item-title" data-unread="<?= format_number($feed->nbNotRead()) ?>" href="<?=
+		_url('index', $actual_view, 'get', 'f_' . $feed->id()) . $state_filter_manual ?>"><?= $feed->name() ?></a></li>
+<?php
+	endforeach;
+?>
 			</ul>
 		</li>
 		<?php
 				}
-			}
+			endforeach;
 		?>
 		<li class="tree-bottom"></li>
 	</ul>

+ 1 - 1
config.default.php

@@ -104,7 +104,7 @@ return array(
 		'max_inactivity' => PHP_INT_MAX,
 
 		# Max number of feeds for a user.
-		'max_feeds' => 16384,
+		'max_feeds' => 131072,
 
 		# Max number of categories for a user.
 		'max_categories' => 16384,