Make mxc column non-unique for files. Fixes #71
This commit is contained in:
@@ -39,8 +39,8 @@ func (fq *FileQuery) Get(url string, encrypted bool) *File {
|
|||||||
return fq.New().Scan(fq.db.QueryRow(query, url, encrypted))
|
return fq.New().Scan(fq.db.QueryRow(query, url, encrypted))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (fq *FileQuery) GetByMXC(mxc id.ContentURI) *File {
|
func (fq *FileQuery) GetEmojiByMXC(mxc id.ContentURI) *File {
|
||||||
query := fileSelect + " WHERE mxc=$1"
|
query := fileSelect + " WHERE mxc=$1 AND emoji_name<>'' LIMIT 1"
|
||||||
return fq.New().Scan(fq.db.QueryRow(query, mxc.String()))
|
return fq.New().Scan(fq.db.QueryRow(query, mxc.String()))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
-- v0 -> v21 (compatible with v19+): Latest revision
|
-- v0 -> v22 (compatible with v19+): Latest revision
|
||||||
|
|
||||||
CREATE TABLE guild (
|
CREATE TABLE guild (
|
||||||
dcid TEXT PRIMARY KEY,
|
dcid TEXT PRIMARY KEY,
|
||||||
@@ -160,7 +160,7 @@ CREATE TABLE role (
|
|||||||
CREATE TABLE discord_file (
|
CREATE TABLE discord_file (
|
||||||
url TEXT,
|
url TEXT,
|
||||||
encrypted BOOLEAN,
|
encrypted BOOLEAN,
|
||||||
mxc TEXT NOT NULL UNIQUE,
|
mxc TEXT NOT NULL,
|
||||||
|
|
||||||
id TEXT,
|
id TEXT,
|
||||||
emoji_name TEXT,
|
emoji_name TEXT,
|
||||||
@@ -174,3 +174,5 @@ CREATE TABLE discord_file (
|
|||||||
|
|
||||||
PRIMARY KEY (url, encrypted)
|
PRIMARY KEY (url, encrypted)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
CREATE INDEX discord_file_mxc_idx ON discord_file (mxc);
|
||||||
|
|||||||
26
database/upgrades/22-file-cache-duplicate-mxc.sql
Normal file
26
database/upgrades/22-file-cache-duplicate-mxc.sql
Normal file
@@ -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);
|
||||||
@@ -1790,7 +1790,7 @@ func (portal *Portal) handleMatrixReaction(sender *User, evt *event.Event) {
|
|||||||
emojiID := reaction.RelatesTo.Key
|
emojiID := reaction.RelatesTo.Key
|
||||||
if strings.HasPrefix(emojiID, "mxc://") {
|
if strings.HasPrefix(emojiID, "mxc://") {
|
||||||
uri, _ := id.ParseContentURI(emojiID)
|
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 == "" {
|
if emojiFile == nil || emojiFile.ID == "" || emojiFile.EmojiName == "" {
|
||||||
go portal.sendMessageMetrics(evt, fmt.Errorf("%w %s", errUnknownEmoji, emojiID), "Ignoring")
|
go portal.sendMessageMetrics(evt, fmt.Errorf("%w %s", errUnknownEmoji, emojiID), "Ignoring")
|
||||||
return
|
return
|
||||||
|
|||||||
Reference in New Issue
Block a user