mirror of
https://github.com/nkanaev/yarr.git
synced 2025-05-24 00:33:14 +00:00
storage fixes
This commit is contained in:
parent
f1332d4200
commit
fa2b97242d
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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 {
|
||||||
|
@ -26,34 +26,58 @@ 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 tx, err = db.Begin(); err != nil {
|
|
||||||
log.Printf("[migration:%d] failed to start transaction", v)
|
if trickyAlteration {
|
||||||
return err
|
db.Exec("pragma foreign_keys=off;")
|
||||||
}
|
}
|
||||||
if err = migratefunc(tx); err != nil {
|
|
||||||
log.Printf("[migration:%d] failed to migrate", v)
|
err := migrateVersion(v, db)
|
||||||
tx.Rollback()
|
|
||||||
return err
|
if trickyAlteration {
|
||||||
}
|
db.Exec("pragma foreign_keys=on;")
|
||||||
if _, err = tx.Exec(fmt.Sprintf("pragma user_version = %d", v)); err != nil {
|
}
|
||||||
log.Printf("[migration:%d] failed to bump version", v)
|
|
||||||
tx.Rollback()
|
if err != nil {
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err = tx.Commit(); err != nil {
|
|
||||||
log.Printf("[migration:%d] failed to commit changes", v)
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Printf("[migration:%d] done", v)
|
log.Printf("[migration:%d] done", v)
|
||||||
}
|
}
|
||||||
return nil
|
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 {
|
||||||
|
log.Printf("[migration:%d] failed to start transaction", v)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err = migratefunc(tx); err != nil {
|
||||||
|
log.Printf("[migration:%d] failed to migrate", v)
|
||||||
|
tx.Rollback()
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if _, err = tx.Exec(fmt.Sprintf("pragma user_version = %d", v)); err != nil {
|
||||||
|
log.Printf("[migration:%d] failed to bump version", v)
|
||||||
|
tx.Rollback()
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err = tx.Commit(); err != nil {
|
||||||
|
log.Printf("[migration:%d] failed to commit changes", v)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func m01_initial(tx *sql.Tx) error {
|
func m01_initial(tx *sql.Tx) error {
|
||||||
sql := `
|
sql := `
|
||||||
create table if not exists folders (
|
create table if not exists folders (
|
||||||
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user