From b799e1bbf788b89c7080908e4c96bf82fc0343bd Mon Sep 17 00:00:00 2001 From: PhatPhuckDave Date: Sat, 24 Aug 2024 16:20:01 +0200 Subject: [PATCH] Add init ddl --- .gitignore | 4 +++- db.ddl | 4 ++++ db.go | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++++- main.go | 9 +++++++++ 4 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 db.ddl diff --git a/.gitignore b/.gitignore index 835d9c5..e2a809e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ .env main.log -jysk.db +*.db +*.db-shm +*.db-wal diff --git a/db.ddl b/db.ddl new file mode 100644 index 0000000..aece359 --- /dev/null +++ b/db.ddl @@ -0,0 +1,4 @@ +CREATE TABLE price ( + price int NOT NULL, + date date default current_timestamp +) \ No newline at end of file diff --git a/db.go b/db.go index 7cd3c00..e4262fb 100644 --- a/db.go +++ b/db.go @@ -62,6 +62,60 @@ func (db *DB) Open() error { return nil } +func (db *DB) Init(ddl string) error { + if !db.Ready { + return fmt.Errorf("database not ready") + } + + var rows map[string]struct{} = make(map[string]struct{}) + var expected = map[string]struct{}{ + "price": {}, + } + + res, err := db.readConn.Query("SELECT name FROM sqlite_master WHERE type='table';") + if err != nil { + Error.Printf("%++v", err) + return err + } + defer res.Close() + for res.Next() { + var name string + err := res.Scan(&name) + if err != nil { + Error.Printf("%++v", err) + return err + } + rows[name] = struct{}{} + } + + var needsInit bool + for table := range expected { + if _, ok := rows[table]; !ok { + log.Printf("Table %s not found, initializing", table) + needsInit = true + break + } + } + + if !needsInit { + log.Printf("Database already initialized") + return nil + } + + _, err = db.writeConn.Exec(ddl) + if err != nil { + Error.Printf("%++v", err) + log.Printf("%#v", "Rolling back") + _, err2 := db.writeConn.Exec("ROLLBACK;") + if err2 != nil { + Error.Printf("Error rollingback! %++v", err) + } + return err + } + + return nil +} + func (db *DB) Close() error { err := db.writeConn.Close() if err != nil { @@ -74,4 +128,4 @@ func (db *DB) Close() error { } return nil -} \ No newline at end of file +} diff --git a/main.go b/main.go index bda1dda..6d51e4d 100644 --- a/main.go +++ b/main.go @@ -9,6 +9,7 @@ import ( "regexp" "strconv" "time" + _ "embed" "github.com/PuerkitoBio/goquery" ) @@ -38,6 +39,9 @@ var priceRegex = regexp.MustCompile(`\d+`) const url = "https://jysk.hr/spavaca-soba/madraci/madraci-s-oprugama/madrac-s-oprugama-140x200-gold-s110-dreamzone" +//go:embed db.ddl +var ddl string + func main() { db := DB{path: "jysk.db"} err := db.Open() @@ -46,6 +50,11 @@ func main() { return } defer db.Close() + err = db.Init(ddl) + if err != nil { + Error.Fatalf("Error initializing database: %v", err) + return + } price := Price{ Price: 100,