Store mime type for reuploaded files

This commit is contained in:
Tulir Asokan
2023-01-28 13:11:35 +02:00
parent 448a48af11
commit 75fafae82f
4 changed files with 20 additions and 13 deletions

View File

@@ -76,8 +76,9 @@ func (br *DiscordBridge) uploadMatrixAttachment(intent *appservice.IntentAPI, da
dbFile.URL = url dbFile.URL = url
dbFile.ID = attachmentID dbFile.ID = attachmentID
dbFile.Size = len(data) dbFile.Size = len(data)
dbFile.MimeType = mimetype.Detect(data).String()
if mime == "" { if mime == "" {
mime = mimetype.Detect(data).String() mime = dbFile.MimeType
} }
if strings.HasPrefix(mime, "image/") { if strings.HasPrefix(mime, "image/") {
cfg, _, _ := image.DecodeConfig(bytes.NewReader(data)) cfg, _, _ := image.DecodeConfig(bytes.NewReader(data))

View File

@@ -20,10 +20,10 @@ type FileQuery struct {
// language=postgresql // language=postgresql
const ( const (
fileSelect = "SELECT url, encrypted, id, mxc, size, width, height, decryption_info, timestamp FROM discord_file" fileSelect = "SELECT url, encrypted, id, mxc, size, width, height, mime_type, decryption_info, timestamp FROM discord_file"
fileInsert = ` fileInsert = `
INSERT INTO discord_file (url, encrypted, id, mxc, size, width, height, decryption_info, timestamp) INSERT INTO discord_file (url, encrypted, id, mxc, size, width, height, mime_type, decryption_info, timestamp)
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)
` `
) )
@@ -49,9 +49,10 @@ type File struct {
ID string ID string
MXC id.ContentURI MXC id.ContentURI
Size int Size int
Width int Width int
Height int Height int
MimeType string
DecryptionInfo *attachment.EncryptedFile DecryptionInfo *attachment.EncryptedFile
@@ -64,7 +65,7 @@ func (f *File) Scan(row dbutil.Scannable) *File {
var width, height sql.NullInt32 var width, height sql.NullInt32
var timestamp int64 var timestamp int64
var mxc string var mxc string
err := row.Scan(&f.URL, &f.Encrypted, &fileID, &mxc, &f.Size, &width, &height, &decryptionInfo, &timestamp) err := row.Scan(&f.URL, &f.Encrypted, &fileID, &mxc, &f.Size, &width, &height, &f.MimeType, &decryptionInfo, &timestamp)
if err != nil { if err != nil {
if !errors.Is(err, sql.ErrNoRows) { if !errors.Is(err, sql.ErrNoRows) {
f.log.Errorln("Database scan failed:", err) f.log.Errorln("Database scan failed:", err)
@@ -114,7 +115,7 @@ func (f *File) Insert(txn dbutil.Execable) {
} }
_, err = txn.Exec(fileInsert, _, err = txn.Exec(fileInsert,
f.URL, f.Encrypted, strPtr(f.ID), f.MXC.String(), f.Size, f.URL, f.Encrypted, strPtr(f.ID), f.MXC.String(), f.Size,
positiveIntToNullInt32(f.Width), positiveIntToNullInt32(f.Height), positiveIntToNullInt32(f.Width), positiveIntToNullInt32(f.Height), f.MimeType,
decryptionInfo, f.Timestamp.UnixMilli(), decryptionInfo, f.Timestamp.UnixMilli(),
) )
if err != nil { if err != nil {

View File

@@ -1,4 +1,4 @@
-- v0 -> v11: Latest revision -- v0 -> v12: Latest revision
CREATE TABLE guild ( CREATE TABLE guild (
dcid TEXT PRIMARY KEY, dcid TEXT PRIMARY KEY,
@@ -158,9 +158,10 @@ CREATE TABLE discord_file (
id TEXT, id TEXT,
mxc TEXT NOT NULL, mxc TEXT NOT NULL,
size BIGINT NOT NULL, size BIGINT NOT NULL,
width INTEGER, width INTEGER,
height INTEGER, height INTEGER,
mime_type TEXT NOT NULL,
decryption_info jsonb, decryption_info jsonb,

View File

@@ -0,0 +1,4 @@
-- v12: Cache mime type for reuploaded files
ALTER TABLE discord_file ADD COLUMN mime_type TEXT NOT NULL DEFAULT '';
-- only: postgres
ALTER TABLE discord_file ALTER COLUMN mime_type DROP DEFAULT;