浏览代码

Make mxc column non-unique for files. Fixes #71

Tulir Asokan 2 年之前
父节点
当前提交
0fd88fedea
共有 4 个文件被更改,包括 33 次插入5 次删除
  1. 2 2
      database/file.go
  2. 4 2
      database/upgrades/00-latest-revision.sql
  3. 26 0
      database/upgrades/22-file-cache-duplicate-mxc.sql
  4. 1 1
      portal.go

+ 2 - 2
database/file.go

@@ -39,8 +39,8 @@ func (fq *FileQuery) Get(url string, encrypted bool) *File {
 	return fq.New().Scan(fq.db.QueryRow(query, url, encrypted))
 }
 
-func (fq *FileQuery) GetByMXC(mxc id.ContentURI) *File {
-	query := fileSelect + " WHERE mxc=$1"
+func (fq *FileQuery) GetEmojiByMXC(mxc id.ContentURI) *File {
+	query := fileSelect + " WHERE mxc=$1 AND emoji_name<>'' LIMIT 1"
 	return fq.New().Scan(fq.db.QueryRow(query, mxc.String()))
 }
 

+ 4 - 2
database/upgrades/00-latest-revision.sql

@@ -1,4 +1,4 @@
--- v0 -> v21 (compatible with v19+): Latest revision
+-- v0 -> v22 (compatible with v19+): Latest revision
 
 CREATE TABLE guild (
     dcid       TEXT PRIMARY KEY,
@@ -160,7 +160,7 @@ CREATE TABLE role (
 CREATE TABLE discord_file (
     url       TEXT,
     encrypted BOOLEAN,
-    mxc       TEXT NOT NULL UNIQUE,
+    mxc       TEXT NOT NULL,
 
     id         TEXT,
     emoji_name TEXT,
@@ -174,3 +174,5 @@ CREATE TABLE discord_file (
 
     PRIMARY KEY (url, encrypted)
 );
+
+CREATE INDEX discord_file_mxc_idx ON discord_file (mxc);

+ 26 - 0
database/upgrades/22-file-cache-duplicate-mxc.sql

@@ -0,0 +1,26 @@
+-- v22 (compatible with v19+): Allow non-unique mxc URIs in file cache
+CREATE TABLE new_discord_file (
+    url       TEXT,
+    encrypted BOOLEAN,
+    mxc       TEXT NOT NULL,
+
+    id         TEXT,
+    emoji_name TEXT,
+
+    size            BIGINT NOT NULL,
+    width           INTEGER,
+    height          INTEGER,
+    mime_type       TEXT NOT NULL,
+    decryption_info jsonb,
+    timestamp       BIGINT NOT NULL,
+
+    PRIMARY KEY (url, encrypted)
+);
+
+INSERT INTO new_discord_file (url, encrypted, mxc, id, emoji_name, size, width, height, mime_type, decryption_info, timestamp)
+SELECT url, encrypted, mxc, id, emoji_name, size, width, height, mime_type, decryption_info, timestamp FROM discord_file;
+
+DROP TABLE discord_file;
+ALTER TABLE new_discord_file RENAME TO discord_file;
+
+CREATE INDEX discord_file_mxc_idx ON discord_file (mxc);

+ 1 - 1
portal.go

@@ -1790,7 +1790,7 @@ func (portal *Portal) handleMatrixReaction(sender *User, evt *event.Event) {
 	emojiID := reaction.RelatesTo.Key
 	if strings.HasPrefix(emojiID, "mxc://") {
 		uri, _ := id.ParseContentURI(emojiID)
-		emojiFile := portal.bridge.DB.File.GetByMXC(uri)
+		emojiFile := portal.bridge.DB.File.GetEmojiByMXC(uri)
 		if emojiFile == nil || emojiFile.ID == "" || emojiFile.EmojiName == "" {
 			go portal.sendMessageMetrics(evt, fmt.Errorf("%w %s", errUnknownEmoji, emojiID), "Ignoring")
 			return