storage fixes

This commit is contained in:
Nazar Kanaev 2021-03-10 21:58:00 +00:00
parent f1332d4200
commit fa2b97242d
3 changed files with 52 additions and 31 deletions

View File

@ -238,11 +238,11 @@ func convertItems(items []*gofeed.Item, feed storage.Feed) []storage.Item {
if item.Author != nil { if item.Author != nil {
author = item.Author.Name author = item.Author.Name
} }
podcastUrl := "" var podcastUrl *string
if item.Enclosures != nil { if item.Enclosures != nil {
for _, enclosure := range item.Enclosures { for _, enclosure := range item.Enclosures {
if strings.ToLower(enclosure.Type) == "audio/mpeg" { if strings.ToLower(enclosure.Type) == "audio/mpeg" {
podcastUrl = enclosure.URL podcastUrl = &enclosure.URL
} }
} }
} }

View File

@ -55,7 +55,7 @@ type Item struct {
DateUpdated *time.Time `json:"date_updated"` DateUpdated *time.Time `json:"date_updated"`
Status ItemStatus `json:"status"` Status ItemStatus `json:"status"`
Image string `json:"image"` Image string `json:"image"`
PodcastURL string `json:"podcast_url"` PodcastURL *string `json:"podcast_url"`
} }
type ItemFilter struct { type ItemFilter struct {

View File

@ -26,11 +26,37 @@ func migrate(db *sql.DB, log *log.Logger) error {
log.Printf("db version is %d. migrating to %d", version, maxVersion) log.Printf("db version is %d. migrating to %d", version, maxVersion)
for v := version + 1; v <= maxVersion; v++ { for v := version + 1; v <= maxVersion; v++ {
migratefunc := migrations[v - 1] // Migrations altering schema using a sequence of steps due to SQLite limitations.
var tx *sql.Tx // Must come with `pragma foreign_key_check` at the end. See:
var err error // "Making Other Kinds Of Table Schema Changes"
// https://www.sqlite.org/lang_altertable.html
trickyAlteration := (v == 3)
log.Printf("[migration:%d] starting", v) log.Printf("[migration:%d] starting", v)
if trickyAlteration {
db.Exec("pragma foreign_keys=off;")
}
err := migrateVersion(v, db)
if trickyAlteration {
db.Exec("pragma foreign_keys=on;")
}
if err != nil {
return err
}
log.Printf("[migration:%d] done", v)
}
return nil
}
func migrateVersion(v int64, db *sql.DB) error {
var err error
var tx *sql.Tx
migratefunc := migrations[v - 1]
if tx, err = db.Begin(); err != nil { if tx, err = db.Begin(); err != nil {
log.Printf("[migration:%d] failed to start transaction", v) log.Printf("[migration:%d] failed to start transaction", v)
return err return err
@ -49,8 +75,6 @@ func migrate(db *sql.DB, log *log.Logger) error {
log.Printf("[migration:%d] failed to commit changes", v) log.Printf("[migration:%d] failed to commit changes", v)
return err return err
} }
log.Printf("[migration:%d] done", v)
}
return nil return nil
} }
@ -136,10 +160,7 @@ func m02_feed_states_and_errors(tx *sql.Tx) error {
func m03_on_delete_actions(tx *sql.Tx) error { func m03_on_delete_actions(tx *sql.Tx) error {
sql := ` sql := `
-- 01. disable foreignkey constraint -- 01. create altered tables
pragma foreign_keys=off;
-- 02. create altered tables
create table if not exists new_feeds ( create table if not exists new_feeds (
id integer primary key autoincrement, id integer primary key autoincrement,
folder_id references folders(id) on delete set null, folder_id references folders(id) on delete set null,
@ -176,25 +197,25 @@ func m03_on_delete_actions(tx *sql.Tx) error {
error string error string
); );
-- 03. transfer content into new tables -- 02. transfer data into new tables
insert into new_feeds select * from feeds; insert into new_feeds select * from feeds;
insert into new_items select * from items; insert into new_items select * from items;
insert into new_http_states select * from http_states; insert into new_http_states select * from http_states;
insert into new_feed_errors select * from feed_errors; insert into new_feed_errors select * from feed_errors;
-- 04. drop old tables -- 03. drop old tables
drop table feeds; drop table feeds;
drop table items; drop table items;
drop table http_states; drop table http_states;
drop table feed_errors; drop table feed_errors;
-- 05. rename new tables -- 04. rename new tables
alter table new_feeds rename to feeds; alter table new_feeds rename to feeds;
alter table new_items rename to items; alter table new_items rename to items;
alter table new_http_states rename to http_states; alter table new_http_states rename to http_states;
alter table new_feed_errors rename to feed_errors; alter table new_feed_errors rename to feed_errors;
-- 06. reconstruct indexes & triggers -- 05. reconstruct indexes & triggers
create index if not exists idx_feed_folder_id on feeds(folder_id); create index if not exists idx_feed_folder_id on feeds(folder_id);
create unique index if not exists idx_feed_feed_link on feeds(feed_link); create unique index if not exists idx_feed_feed_link on feeds(feed_link);
create index if not exists idx_item_feed_id on items(feed_id); create index if not exists idx_item_feed_id on items(feed_id);
@ -205,8 +226,8 @@ func m03_on_delete_actions(tx *sql.Tx) error {
delete from search where rowid = old.search_rowid; delete from search where rowid = old.search_rowid;
end; end;
-- 06. check consistency
pragma foreign_key_check; pragma foreign_key_check;
pragma foreign_keys=on;
` `
_, err := tx.Exec(sql) _, err := tx.Exec(sql)
return err return err