Separate db initialization from store opening
This commit is contained in:
parent
646501d609
commit
b61bae7cd8
5 changed files with 36 additions and 30 deletions
2
TODO.md
2
TODO.md
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
25
main.go
|
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
31
store.go
31
store.go
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue