Bladeren bron

MySQL GUID case sensitive (#2078)

* MySQL GUID case sensitive

latin1_bin
https://github.com/FreshRSS/FreshRSS/issues/2077

* Prepare update for existing bases

* Perform DB update during actualize

* Reduce frequency slightly

* No optimize at the same time

* Take advantage of the SQL modifications in 1.12

* Move higher up

* Move to purge, which all users can manually call
Alexandre Alapetite 7 jaren geleden
bovenliggende
commit
307e6995fe
4 gewijzigde bestanden met toevoegingen van 39 en 6 verwijderingen
  1. 4 0
      app/Controllers/entryController.php
  2. 19 0
      app/Models/DatabaseDAO.php
  3. 5 0
      app/Models/TagDAO.php
  4. 11 6
      app/SQL/install.sql.mysql.php

+ 4 - 0
app/Controllers/entryController.php

@@ -207,6 +207,10 @@ class FreshRSS_entry_Controller extends Minz_ActionController {
 
 		$feedDAO->updateCachedValues();
 
+		//Minor DB checks:
+		$databaseDAO = FreshRSS_Factory::createDatabaseDAO();
+		$databaseDAO->ensureCaseInsensitiveGuids();	//FreshRSS 1.12
+
 		invalidateHttpCache();
 		Minz_Request::good(_t('feedback.sub.purge_completed', $nb_total), array(
 			'c' => 'configure',

+ 19 - 0
app/Models/DatabaseDAO.php

@@ -141,4 +141,23 @@ class FreshRSS_DatabaseDAO extends Minz_ModelPdo {
 		}
 		return $ok;
 	}
+
+	public function ensureCaseInsensitiveGuids() {
+		$ok = true;
+		$db = FreshRSS_Context::$system_conf->db;
+		if ($db['type'] === 'mysql') {
+			include_once(APP_PATH . '/SQL/install.sql.mysql.php');
+			if (defined('SQL_UPDATE_GUID_LATIN1_BIN')) {	//FreshRSS 1.12
+				try {
+					$sql = sprintf(SQL_UPDATE_GUID_LATIN1_BIN, $this->prefix);
+					$stm = $this->bd->prepare($sql);
+					$ok = $stm->execute();
+				} catch (Exception $e) {
+					$ok = false;
+					Minz_Log::error('FreshRSS_DatabaseDAO::ensureCaseInsensitiveGuids error: ' . $e->getMessage());
+				}
+			}
+		}
+		return $ok;
+	}
 }

+ 5 - 0
app/Models/TagDAO.php

@@ -15,6 +15,11 @@ class FreshRSS_TagDAO extends Minz_ModelPdo implements FreshRSS_Searchable {
 		try {
 			$db = FreshRSS_Context::$system_conf->db;
 			require_once(APP_PATH . '/SQL/install.sql.' . $db['type'] . '.php');
+
+			Minz_Log::warning('SQL ALTER GUID case sensitivity...');
+			$databaseDAO = FreshRSS_Factory::createDatabaseDAO();
+			$databaseDAO->ensureCaseInsensitiveGuids();
+
 			Minz_Log::warning('SQL CREATE TABLE tag...');
 			if (defined('SQL_CREATE_TABLE_TAGS')) {
 				$sql = sprintf(SQL_CREATE_TABLE_TAGS, $this->prefix);

+ 11 - 6
app/SQL/install.sql.mysql.php

@@ -12,10 +12,10 @@ ENGINE = INNODB;
 
 CREATE TABLE IF NOT EXISTS `%1$sfeed` (
 	`id` SMALLINT NOT NULL AUTO_INCREMENT,	-- v0.7
-	`url` VARCHAR(511) CHARACTER SET latin1 NOT NULL,
+	`url` VARCHAR(511) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
 	`category` SMALLINT DEFAULT 0,	-- v0.7
 	`name` VARCHAR(' . FreshRSS_DatabaseDAO::LENGTH_INDEX_UNICODE . ') NOT NULL,
-	`website` VARCHAR(255) CHARACTER SET latin1,
+	`website` VARCHAR(255) CHARACTER SET latin1 COLLATE latin1_bin,
 	`description` TEXT,
 	`lastUpdate` INT(11) DEFAULT 0,	-- Until year 2038
 	`priority` TINYINT(2) NOT NULL DEFAULT 10,
@@ -38,11 +38,11 @@ ENGINE = INNODB;
 
 CREATE TABLE IF NOT EXISTS `%1$sentry` (
 	`id` BIGINT NOT NULL,	-- v0.7
-	`guid` VARCHAR(760) CHARACTER SET latin1 NOT NULL,	-- Maximum for UNIQUE is 767B
+	`guid` VARCHAR(760) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,	-- Maximum for UNIQUE is 767B
 	`title` VARCHAR(255) NOT NULL,
 	`author` VARCHAR(255),
 	`content_bin` BLOB,	-- v0.7
-	`link` VARCHAR(1023) CHARACTER SET latin1 NOT NULL,
+	`link` VARCHAR(1023) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
 	`date` INT(11),	-- Until year 2038
 	`lastSeen` INT(11) DEFAULT 0,	-- v1.1.1, Until year 2038
 	`hash` BINARY(16),	-- v1.1.1
@@ -66,11 +66,11 @@ INSERT IGNORE INTO `%1$scategory` (id, name) VALUES(1, "%2$s");
 define('SQL_CREATE_TABLE_ENTRYTMP', '
 CREATE TABLE IF NOT EXISTS `%1$sentrytmp` (	-- v1.7
 	`id` BIGINT NOT NULL,
-	`guid` VARCHAR(760) CHARACTER SET latin1 NOT NULL,
+	`guid` VARCHAR(760) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
 	`title` VARCHAR(255) NOT NULL,
 	`author` VARCHAR(255),
 	`content_bin` BLOB,
-	`link` VARCHAR(1023) CHARACTER SET latin1 NOT NULL,
+	`link` VARCHAR(1023) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
 	`date` INT(11),
 	`lastSeen` INT(11) DEFAULT 0,
 	`hash` BINARY(16),
@@ -136,3 +136,8 @@ ALTER TABLE `%1$sentry` MODIFY `author` VARCHAR(255) CHARACTER SET utf8mb4 COLLA
 ALTER TABLE `%1$sentry` MODIFY `tags` VARCHAR(1023) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
 OPTIMIZE TABLE `%1$sentry`;
 ');
+
+define('SQL_UPDATE_GUID_LATIN1_BIN', '	-- v1.12
+ALTER TABLE `%1$sentrytmp` MODIFY `guid` VARCHAR(760) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL;
+ALTER TABLE `%1$sentry` MODIFY `guid` VARCHAR(760) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL;
+');