fix error with sqlite ≥ 3.34
Since sqlite 3.34[1] deleting a record in a fts5 table that doesn't
exist became an error. The resuls it that adding a torrent "corrupts"
the database and magnetico fails with this error:
Could not add new torrent to the database.
tx.Exec (INSERT OR REPLACE INTO torrents) database disk image is malformed
The problem can be simply avoided by setting modified_on = discovered_on
when inserting the torrent, instead of updating it afterwards with a
trigger.
[1]: 86f477edaa
This commit is contained in:
parent
1c826851b1
commit
06d864d49f
@ -161,9 +161,10 @@ func (db *sqlite3Database) AddNewTorrent(infoHash []byte, name string, files []F
|
|||||||
info_hash,
|
info_hash,
|
||||||
name,
|
name,
|
||||||
total_size,
|
total_size,
|
||||||
discovered_on
|
discovered_on,
|
||||||
) VALUES (?, ?, ?, ?);
|
modified_on
|
||||||
`, infoHash, name, totalSize, time.Now().Unix())
|
) VALUES (?, ?, ?, ?, ?);
|
||||||
|
`, infoHash, name, totalSize, time.Now().Unix(), time.Now().Unix())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "tx.Exec (INSERT OR REPLACE INTO torrents)")
|
return errors.Wrap(err, "tx.Exec (INSERT OR REPLACE INTO torrents)")
|
||||||
}
|
}
|
||||||
@ -651,16 +652,6 @@ func (db *sqlite3Database) setupDatabase() error {
|
|||||||
DEFAULT 32503680000
|
DEFAULT 32503680000
|
||||||
;
|
;
|
||||||
|
|
||||||
-- If 'modified_on' is not explicitly supplied, then it shall be set, by default, to
|
|
||||||
-- 'discovered_on' right after the row is inserted to 'torrents'.
|
|
||||||
--
|
|
||||||
-- {WHEN expr} does NOT work for some reason (trigger doesn't get triggered), so we use
|
|
||||||
-- AND NEW."modified_on" = 32503680000
|
|
||||||
-- instead in the WHERE clause.
|
|
||||||
CREATE TRIGGER "torrents_modified_on_default_t" AFTER INSERT ON "torrents" BEGIN
|
|
||||||
UPDATE "torrents" SET "modified_on" = NEW."discovered_on" WHERE "id" = NEW."id" AND NEW."modified_on" = 32503680000;
|
|
||||||
END;
|
|
||||||
|
|
||||||
-- Set 'modified_on' value of all rows to 'discovered_on' or 'updated_on', whichever is
|
-- Set 'modified_on' value of all rows to 'discovered_on' or 'updated_on', whichever is
|
||||||
-- greater; beware that 'updated_on' can be NULL too.
|
-- greater; beware that 'updated_on' can be NULL too.
|
||||||
UPDATE torrents SET modified_on = (SELECT MAX(discovered_on, IFNULL(updated_on, 0)));
|
UPDATE torrents SET modified_on = (SELECT MAX(discovered_on, IFNULL(updated_on, 0)));
|
||||||
|
Loading…
Reference in New Issue
Block a user