@@ -3,6 +3,7 @@ package db
33import (
44 "database/sql"
55 "fmt"
6+ "github.com/Civil/github2telegram/types"
67 "time"
78
89 "github.com/Civil/github2telegram/configs"
@@ -11,7 +12,7 @@ import (
1112)
1213
1314const (
14- currentSchemaVersion = 2
15+ currentSchemaVersion = 3
1516)
1617
1718type SQLite struct {
@@ -25,7 +26,7 @@ func initSqlite() Database {
2526 configs .Config .DB , err = sql .Open ("sqlite3" , configs .Config .DatabaseURL )
2627 if err != nil {
2728 logger .Fatal ("unable to open database file" ,
28- zap .Any ( "config " , configs .Config ),
29+ zap .String ( "file " , configs .Config . DatabaseURL ),
2930 zap .Error (err ),
3031 )
3132 }
@@ -67,11 +68,16 @@ func initSqlite() Database {
6768 'message_pattern' VARCHAR(255) NOT NULL
6869 );
6970
70- INSERT INTO 'schema_version' (id, version) values (1, 2);
71+ CREATE TABLE IF NOT EXISTS 'resend_queue' (
72+ 'id' INTEGER PRIMARY KEY AUTOINCREMENT,
73+ 'chat_id' Int64,
74+ 'message' TEXT NOT NULL
75+ );
76+
77+ INSERT INTO 'schema_version' (id, version) values (1, 3);
7178 ` )
7279 if err != nil {
7380 logger .Fatal ("failed to initialize database" ,
74- zap .Any ("config" , configs .Config ),
7581 zap .Error (err ),
7682 )
7783 }
@@ -92,29 +98,68 @@ func initSqlite() Database {
9298 }
9399 rows .Close ()
94100
95- if schemaVersion != currentSchemaVersion {
96- switch schemaVersion {
97- case 1 :
98- _ , err = configs .Config .DB .Exec (`
101+ if schemaVersion == 1 {
102+ _ , err = configs .Config .DB .Exec (`
99103ALTER TABLE last_version ADD COLUMN 'last_tag' VARCHAR(255) NOT NULL DEFAULT '';
100104
101105UPDATE schema_version SET version = 2 WHERE id=1;
102106 ` )
103107
104- if err != nil {
105- logger .Fatal ("failed to migrate database" ,
106- zap .Int ("databaseVersion" , schemaVersion ),
107- zap .Int ("upgradingTo" , currentSchemaVersion ),
108- zap .Error (err ),
109- )
110- }
111- // 'last_tag' VARCHAR(255) NOT NULL DEFAULT '',
112- default :
113- // Don't know how to migrate from this version
114- logger .Fatal ("Unknown schema version specified" ,
115- zap .Int ("version" , schemaVersion ),
108+ if err != nil {
109+ logger .Fatal ("failed to migrate database" ,
110+ zap .Int ("databaseVersion" , schemaVersion ),
111+ zap .Int ("upgradingTo" , currentSchemaVersion ),
112+ zap .Error (err ),
113+ )
114+ }
115+
116+ _ , err = configs .Config .DB .Exec (`
117+ UPDATE schema_version SET version = 2 WHERE id=1;` )
118+ if err != nil {
119+ logger .Fatal ("failed to migrate database" ,
120+ zap .Int ("databaseVersion" , schemaVersion ),
121+ zap .Int ("upgradingTo" , currentSchemaVersion ),
122+ zap .Error (err ),
123+ )
124+ }
125+
126+ // We've successfully upgraded to schema version 2.
127+ schemaVersion = 2
128+ }
129+
130+ if schemaVersion == 2 {
131+ _ , err = configs .Config .DB .Exec (` CREATE TABLE IF NOT EXISTS 'resend_queue' (
132+ 'id' INTEGER PRIMARY KEY AUTOINCREMENT,
133+ 'chat_id' Int64,
134+ 'message' TEXT NOT NULL
135+ );` )
136+ if err != nil {
137+ logger .Fatal ("failed to migrate database" ,
138+ zap .Int ("databaseVersion" , schemaVersion ),
139+ zap .Int ("upgradingTo" , currentSchemaVersion ),
140+ zap .Error (err ),
141+ )
142+ }
143+
144+ _ , err = configs .Config .DB .Exec (`
145+ UPDATE schema_version SET version = 3 WHERE id=1;` )
146+ if err != nil {
147+ logger .Fatal ("failed to migrate database" ,
148+ zap .Int ("databaseVersion" , schemaVersion ),
149+ zap .Int ("upgradingTo" , currentSchemaVersion ),
150+ zap .Error (err ),
116151 )
117152 }
153+
154+ // We've successfully upgraded to schema version 3.
155+ schemaVersion = 3
156+ }
157+
158+ if schemaVersion != currentSchemaVersion {
159+ // Don't know how to migrate from this version
160+ logger .Fatal ("Unknown schema version specified" ,
161+ zap .Int ("version" , schemaVersion ),
162+ )
118163 }
119164 }
120165
@@ -288,6 +333,36 @@ func (d *SQLite) ListFeeds() ([]*Feed, error) {
288333 return result , nil
289334}
290335
336+ func (d * SQLite ) RemoveFeed (name , repo , filter , messagePattern string ) error {
337+ logger := zapwriter .Logger ("remove_feed" )
338+ stmt , err := d .db .Prepare ("DELETE FROM 'feeds' WHERE name=? and repo=? and filter=? and message_pattern=?" )
339+ if err != nil {
340+ logger .Error ("error creating statement" ,
341+ zap .Error (err ),
342+ )
343+ return err
344+ }
345+
346+ _ , err = stmt .Exec (name , repo , filter , messagePattern )
347+ if err != nil {
348+ logger .Error ("error removing subscription" ,
349+ zap .Error (err ),
350+ )
351+ }
352+
353+ return err
354+ }
355+
356+ func (d * SQLite ) UpdateChatID (oldChatID , newChatID int64 ) error {
357+ stmt , err := d .db .Prepare ("UPDATE 'subscriptions' SET chat_id=? WHERE chat_id=?" )
358+ if err != nil {
359+ return err
360+ }
361+
362+ _ , err = stmt .Exec (newChatID , oldChatID )
363+ return err
364+ }
365+
291366func (d * SQLite ) AddSubscribtion (endpoint , url , filter string , chatID int64 ) error {
292367 stmt , err := d .db .Prepare ("SELECT chat_id FROM 'subscriptions' where endpoint=? and url=? and filter=? and chat_id=?;" )
293368 if err != nil {
@@ -446,3 +521,58 @@ func (d *SQLite) UpdateLastUpdateTime(url, filter, tag string, t time.Time) {
446521 return
447522 }
448523}
524+
525+ func (db * SQLite ) AddMessagesToResentQueue (messages []* types.NotificationMessage ) error {
526+ logger := zapwriter .Logger ("add_messages_to_resent_queue" )
527+ stmt , err := db .db .Prepare ("INSERT INTO 'resend_queue' (chat_id, message) VALUES (?, ?)" )
528+ if err != nil {
529+ logger .Error ("error creating statement" ,
530+ zap .Error (err ),
531+ )
532+ return err
533+ }
534+
535+ for _ , m := range messages {
536+ _ , err = stmt .Exec (m .ChatID , m .Message )
537+ if err != nil {
538+ logger .Error ("error updating data" ,
539+ zap .Error (err ),
540+ )
541+ return err
542+ }
543+ }
544+ return nil
545+ }
546+
547+ func (db * SQLite ) GetMessagesFromResentQueue () ([]* types.NotificationMessage , error ) {
548+ logger := zapwriter .Logger ("get_messages_from_resent_queue" )
549+ stmt , err := db .db .Prepare ("SELECT chat_id, message FROM 'resend_queue'" )
550+ if err != nil {
551+ logger .Error ("error creating statement" ,
552+ zap .Error (err ),
553+ )
554+ return nil , err
555+ }
556+ rows , err := stmt .Query ()
557+ if err != nil {
558+ logger .Error ("error retrieving data" ,
559+ zap .Error (err ),
560+ )
561+ return nil , err
562+ }
563+ results := make ([]* types.NotificationMessage , 0 )
564+ for rows .Next () {
565+ res := & types.NotificationMessage {}
566+ err = rows .Scan (& res .ChatID , & res .Message )
567+ if err != nil {
568+ logger .Error ("error retrieving data" ,
569+ zap .Error (err ),
570+ )
571+ continue
572+ }
573+ results = append (results , res )
574+ }
575+ _ = rows .Close ()
576+
577+ return nil , nil
578+ }
0 commit comments