Sfoglia il codice sorgente

SQL : utilisation de (id_feed, guid) pour l'unicité

Préparation avant
https://github.com/marienfressinaud/FreshRSS/issues/202
Alexandre Alapetite 12 anni fa
parent
commit
6130ba6157
3 ha cambiato i file con 10 aggiunte e 13 eliminazioni
  1. 6 9
      app/controllers/feedController.php
  2. 3 3
      app/models/Entry.php
  3. 1 1
      app/models/Feed.php

+ 6 - 9
app/controllers/feedController.php

@@ -174,17 +174,14 @@ class feedController extends ActionController {
 				$feed->load ();
 				$entries = $feed->entries ();
 
-				//For this feed, check last n entry IDs already in database
-				$existingIds = array_fill_keys ($entryDAO->listLastIdsByFeed ($feed->id (), count($entries) + 10), 1);
-
-				// ajout des articles en masse sans se soucier des erreurs
-				// On ne vérifie pas que l'article n'est pas déjà en BDD
-				// car demanderait plus de ressources
-				// La BDD refusera l'ajout de son côté car l'id doit être
-				// unique
+				//For this feed, check last n entry GUIDs already in database
+				$existingGuids = array_fill_keys ($entryDAO->listLastGuidsByFeed ($feed->id (), count($entries) + 10), 1);
+
+				// On ne vérifie strictement que l'article n'est pas déjà en BDD
+				// La BDD refusera l'ajout car (id_feed, guid) doit être unique
 				$feedDAO->beginTransaction ();
 				foreach ($entries as $entry) {
-					if ((!isset ($existingIds[$entry->id ()])) &&
+					if ((!isset ($existingGuids[$entry->guid ()])) &&
 						($entry->date (true) >= $date_min ||
 						$feed->keepHistory ())) {
 						$values = $entry->toArray ();

+ 3 - 3
app/models/Entry.php

@@ -565,9 +565,9 @@ class EntryDAO extends Model_pdo {
 	public function listByFeed ($feed, $state, $order = 'high_to_low', $limitFromId = '', $limitCount = '') {
 		return $this->listWhere (' WHERE id_feed = ?', $state, $order, $limitFromId, $limitCount, array ($feed));
 	}
-	
-	public function listLastIdsByFeed($id, $n) {
-		$sql = 'SELECT id FROM ' . $this->prefix . 'entry WHERE id_feed=? ORDER BY date DESC LIMIT ' . intval($n);
+
+	public function listLastGuidsByFeed($id, $n) {
+		$sql = 'SELECT guid FROM ' . $this->prefix . 'entry WHERE id_feed=? ORDER BY date DESC LIMIT ' . intval($n);
 		$stm = $this->bd->prepare ($sql);
 		$values = array ($id);
 		$stm->execute ($values);

+ 1 - 1
app/models/Feed.php

@@ -191,7 +191,7 @@ class Feed extends Model {
 			} else {
 				$feed = new SimplePie ();
 				$feed->set_useragent(Translate::t ('freshrss') . '/' . FRESHRSS_VERSION . ' (' . PHP_OS . '; ' . FRESHRSS_WEBSITE . ') ' . SIMPLEPIE_NAME . '/' . SIMPLEPIE_VERSION);
-				$url = str_replace ('&', '&', $this->url);
+				$url = htmlspecialchars_decode ($this->url, ENT_QUOTES);
 				if ($this->httpAuth != '') {
 					$url = preg_replace ('#((.+)://)(.+)#', '${1}' . $this->httpAuth . '@${3}', $url);
 				}