@@ -27,86 +27,99 @@ export const migration002: Migration = {
2727 version : 2 ,
2828 description : 'Add counter columns and triggers to Novel table' ,
2929 migrate : db => {
30- if ( ! columnExists ( db , 'Novel' , 'chaptersDownloaded' ) ) {
31- db . runSync ( `
32- ALTER TABLE Novel
33- ADD COLUMN chaptersDownloaded INTEGER DEFAULT 0
34- ` ) ;
35- }
36-
37- if ( ! columnExists ( db , 'Novel' , 'chaptersUnread' ) ) {
38- db . runSync ( `
39- ALTER TABLE Novel
40- ADD COLUMN chaptersUnread INTEGER DEFAULT 0
41- ` ) ;
42- }
43-
44- if ( ! columnExists ( db , 'Novel' , 'totalChapters' ) ) {
45- db . runSync ( `
46- ALTER TABLE Novel
47- ADD COLUMN totalChapters INTEGER DEFAULT 0
48- ` ) ;
49- }
30+ const addColumnSafely = ( columnName : string , columnDefinition : string ) => {
31+ if ( ! columnExists ( db , 'Novel' , columnName ) ) {
32+ try {
33+ db . runSync ( `
34+ ALTER TABLE Novel
35+ ADD COLUMN ${ columnName } ${ columnDefinition }
36+ ` ) ;
37+ } catch ( error ) {
38+ // Gracefully handle ALTER TABLE failures (e.g., table doesn't exist)
39+ // Columns will be created when table is created in initial schema
40+ if ( __DEV__ ) {
41+ // eslint-disable-next-line no-console
42+ console . warn (
43+ `Failed to add column ${ columnName } to Novel table:` ,
44+ error ,
45+ ) ;
46+ }
47+ }
48+ }
49+ } ;
5050
51- if ( ! columnExists ( db , 'Novel' , 'lastReadAt' ) ) {
52- db . runSync ( `
53- ALTER TABLE Novel
54- ADD COLUMN lastReadAt TEXT
55- ` ) ;
56- }
51+ addColumnSafely ( 'chaptersDownloaded' , 'INTEGER DEFAULT 0' ) ;
52+ addColumnSafely ( 'chaptersUnread' , 'INTEGER DEFAULT 0' ) ;
53+ addColumnSafely ( 'totalChapters' , 'INTEGER DEFAULT 0' ) ;
54+ addColumnSafely ( 'lastReadAt' , 'TEXT' ) ;
55+ addColumnSafely ( 'lastUpdatedAt' , 'TEXT' ) ;
5756
58- if ( ! columnExists ( db , 'Novel' , 'lastUpdatedAt' ) ) {
59- db . runSync ( `
60- ALTER TABLE Novel
61- ADD COLUMN lastUpdatedAt TEXT
62- ` ) ;
63- }
57+ // Verify all columns exist before running UPDATE queries to prevent SQL errors
58+ const allColumnsExist =
59+ columnExists ( db , 'Novel' , 'chaptersDownloaded' ) &&
60+ columnExists ( db , 'Novel' , 'chaptersUnread' ) &&
61+ columnExists ( db , 'Novel' , 'totalChapters' ) &&
62+ columnExists ( db , 'Novel' , 'lastReadAt' ) &&
63+ columnExists ( db , 'Novel' , 'lastUpdatedAt' ) ;
6464
65- db . runSync ( `
66- UPDATE Novel
67- SET chaptersDownloaded = (
68- SELECT COUNT(*)
69- FROM Chapter
70- WHERE Chapter.novelId = Novel.id
71- AND Chapter.isDownloaded = 1
72- )
73- ` ) ;
65+ if ( allColumnsExist ) {
66+ try {
67+ db . runSync ( `
68+ UPDATE Novel
69+ SET chaptersDownloaded = (
70+ SELECT COUNT(*)
71+ FROM Chapter
72+ WHERE Chapter.novelId = Novel.id
73+ AND Chapter.isDownloaded = 1
74+ )
75+ ` ) ;
7476
75- db . runSync ( `
76- UPDATE Novel
77- SET chaptersUnread = (
78- SELECT COUNT(*)
79- FROM Chapter
80- WHERE Chapter.novelId = Novel.id
81- AND Chapter.unread = 1
82- )
83- ` ) ;
77+ db . runSync ( `
78+ UPDATE Novel
79+ SET chaptersUnread = (
80+ SELECT COUNT(*)
81+ FROM Chapter
82+ WHERE Chapter.novelId = Novel.id
83+ AND Chapter.unread = 1
84+ )
85+ ` ) ;
8486
85- db . runSync ( `
86- UPDATE Novel
87- SET totalChapters = (
88- SELECT COUNT(*)
89- FROM Chapter
90- WHERE Chapter.novelId = Novel.id
91- )
92- ` ) ;
87+ db . runSync ( `
88+ UPDATE Novel
89+ SET totalChapters = (
90+ SELECT COUNT(*)
91+ FROM Chapter
92+ WHERE Chapter.novelId = Novel.id
93+ )
94+ ` ) ;
9395
94- db . runSync ( `
95- UPDATE Novel
96- SET lastReadAt = (
97- SELECT MAX(readTime)
98- FROM Chapter
99- WHERE Chapter.novelId = Novel.id
100- )
101- ` ) ;
96+ db . runSync ( `
97+ UPDATE Novel
98+ SET lastReadAt = (
99+ SELECT MAX(readTime)
100+ FROM Chapter
101+ WHERE Chapter.novelId = Novel.id
102+ )
103+ ` ) ;
102104
103- db . runSync ( `
104- UPDATE Novel
105- SET lastUpdatedAt = (
106- SELECT MAX(updatedTime)
107- FROM Chapter
108- WHERE Chapter.novelId = Novel.id
109- )
110- ` ) ;
105+ db . runSync ( `
106+ UPDATE Novel
107+ SET lastUpdatedAt = (
108+ SELECT MAX(updatedTime)
109+ FROM Chapter
110+ WHERE Chapter.novelId = Novel.id
111+ )
112+ ` ) ;
113+ } catch ( error ) {
114+ // Gracefully handle UPDATE failures - columns already added with defaults
115+ if ( __DEV__ ) {
116+ // eslint-disable-next-line no-console
117+ console . warn (
118+ 'Failed to populate counter columns in Novel table:' ,
119+ error ,
120+ ) ;
121+ }
122+ }
123+ }
111124 } ,
112125} ;
0 commit comments