Separate db initialization from store opening

This commit is contained in:
bronku 2025-03-21 18:50:26 +01:00
parent 646501d609
commit b61bae7cd8
5 changed files with 36 additions and 30 deletions

View file

@ -4,6 +4,7 @@
- [ ] Database Implementation - [ ] Database Implementation
- [ ] Init mode to create a new db
- [x] Set up SQLite database - [x] Set up SQLite database
- [x] Create proper schemas - [x] Create proper schemas
- [x] Implement data persistence - [x] Implement data persistence
@ -123,6 +124,7 @@
- [ ] Integration Tests - [ ] Integration Tests
- [ ] File structure - [ ] File structure
- [ ] Embed templates - [ ] Embed templates
- [ ] Single init function for handler
## Future Considerations ## Future Considerations

View file

@ -14,6 +14,12 @@ type handler struct {
s *store s *store
} }
func (h *handler) close() {
if h.s != nil {
h.s.close()
}
}
func (h *handler) form(w http.ResponseWriter, r *http.Request) { func (h *handler) form(w http.ResponseWriter, r *http.Request) {
url := strings.Split(r.URL.String(), "/") url := strings.Split(r.URL.String(), "/")
o := order{ o := order{

25
main.go
View file

@ -4,33 +4,28 @@ import (
"html/template" "html/template"
"log" "log"
"net/http" "net/http"
"time"
_ "github.com/mattn/go-sqlite3" _ "github.com/mattn/go-sqlite3"
) )
func main() { func main() {
var err error
var h handler var h handler
templates, err := template.ParseFiles("index.html", "order.html") defer h.close()
h.tmpl, err = template.ParseFiles("index.html", "order.html")
if err != nil { if err != nil {
log.Fatal("can't parse templates: ", err) log.Fatal("can't parse templates: ", err)
} }
h.tmpl = templates
// #todo: error handling
h.s, _ = NewStore("./foo.db")
h.s.saveCake(cake{"Sernik ulubiony", -1, 65, 0}) h.s, err = openStore("./foo.db")
h.s.saveCake(cake{"Malinowa chmurka", -1, 150, 0}) if err != nil {
h.s.saveCake(cake{"Mako sernik", -1, 150, 0}) log.Fatal("can't open the databse", err)
h.s.saveCake(cake{"Rolada makowa", -1, 80, 0}) }
h.s.saveCake(cake{"Wieniec bezowy", -1, 120, 0})
h.s.saveOrder(order{-1, "Albert", "Camus", "123456789", "Kartuzy", time.Now().AddDate(0, 0, 7), time.Now(), "accepted", 0, nil})
h.s.saveOrder(order{-1, "George", "Orwell", "", "Kartuzy", time.Now().AddDate(0, 1, 0), time.Now(), "accepted", 0, nil})
h.s.saveOrder(order{-1, "Karl", "Marx", "0700", "Somonino", time.Now(), time.Now(), "accepted", 0, nil})
http.HandleFunc("GET /order/", logger(h.form)) http.HandleFunc("GET /order/", logger(h.form))
http.HandleFunc("GET /", logger(h.index)) http.HandleFunc("GET /", logger(h.index))
http.HandleFunc("POST /", logger(h.addOrder)) http.HandleFunc("POST /", logger(h.addOrder))
http.ListenAndServe(":8080", nil) go http.ListenAndServe(":8080", nil)
adminConsole()
} }

View file

@ -3,6 +3,7 @@ package main
import ( import (
"database/sql" "database/sql"
_ "embed" _ "embed"
"errors"
"os" "os"
"strconv" "strconv"
"time" "time"
@ -15,27 +16,29 @@ type store struct {
db *sql.DB db *sql.DB
} }
func NewStore(filename string) (*store, error) { func openStore(filename string) (*store, error) {
var out store var out store
var err error var err error
if filename != ":memory:" && filename != "file:memdb1?mode=memory&cache=shared" { _, err = os.Stat(filename)
os.Remove(filename) if errors.Is(err, os.ErrNotExist) {
defer out.loadSchema()
} }
out.db, err = sql.Open("sqlite3", filename) out.db, err = sql.Open("sqlite3", filename)
if err != nil { return &out, err
return nil, err
}
_, err = out.db.Exec(schema)
if err != nil {
out.db.Close()
return nil, err
}
return &out, nil
} }
func (s *store) close() { func (s *store) close() {
s.db.Close() if s.db != nil {
s.db.Close()
}
}
func (s *store) loadSchema() error {
if s.db == nil {
return errors.New("database doesn't exist")
}
_, err := s.db.Exec(schema)
return err
} }
func (s *store) getCake(id int) (cake, error) { func (s *store) getCake(id int) (cake, error) {

View file

@ -6,7 +6,7 @@ import (
) )
func TestStore(t *testing.T) { func TestStore(t *testing.T) {
s, err := NewStore("file:memdb1?mode=memory&cache=shared") s, err := openStore("file:memdb1?mode=memory&cache=shared")
if err != nil { if err != nil {
t.Fatalf("Failed to create store: %v", err) t.Fatalf("Failed to create store: %v", err)
} }