master
Jason Staten 9 months ago
parent aeb4c6a780
commit 325de4fbb5

@ -1,19 +1,19 @@
package database
import (
"database/sql"
"log"
"github.com/jmoiron/sqlx"
_ "modernc.org/sqlite"
)
type DB struct {
db *sql.DB
db *sqlx.DB
}
func New() *DB {
d := &DB{}
con, err := sql.Open("sqlite", "./todogo.db")
con, err := sqlx.Open("sqlite", "./todogo.db")
if err != nil {
log.Fatal(err)
}
@ -52,37 +52,33 @@ func (d *DB) DeleteTodo(id int) error {
return err
}
func (d *DB) GetAllTodos() ([]*Todo, error) {
rows, err := d.db.Query("SELECT id, title, completed FROM todos")
func (d *DB) GetAllTodos() ([]Todo, error) {
todos := []Todo{}
err := d.db.Select(&todos, "SELECT id, title, completed FROM todos")
if err != nil {
return nil, err
}
defer rows.Close()
todos := scanTodos(rows)
return todos, nil
}
func (d *DB) GetTodosByCompleted(completed bool) ([]*Todo, error) {
func (d *DB) GetTodosByCompleted(completed bool) ([]Todo, error) {
completedInt := 0
if completed {
completedInt = 1
}
rows, err := d.db.Query("SELECT id, title, completed FROM todos WHERE completed = ?", completedInt)
todos := []Todo{}
err := d.db.Select(&todos, "SELECT id, title, completed FROM todos WHERE completed = ?", completedInt)
if err != nil {
return nil, err
}
defer rows.Close()
todos := scanTodos(rows)
return todos, nil
}
func (d *DB) GetIncompleteTodosCount() int {
row := d.db.QueryRow("SELECT COUNT(*) FROM todos WHERE completed = 0")
var count int
err := row.Scan(&count)
err := d.db.Get(&count, "SELECT COUNT(*) FROM todos WHERE completed = 0")
if err != nil {
log.Printf("failed to get incomplete count")
return 0
@ -96,29 +92,6 @@ func (d *DB) DeleteCompletedTodos() error {
return err
}
func scanTodos(rows *sql.Rows) []*Todo {
var todos []*Todo
for rows.Next() {
t := scanTodo(rows)
if t != nil {
todos = append(todos, t)
}
}
return todos
}
func scanTodo(row *sql.Rows) *Todo {
t := new(Todo)
err := row.Scan(&t.Id, &t.Title, &t.Completed)
if err != nil {
log.Printf("Failed to read row %s", err)
return nil
}
return t
}
type Todo struct {
Id int
Title string

@ -5,35 +5,17 @@ import (
"log"
)
const current = 1
func (d *DB) mustExec(query string, args ...any) {
_, err := d.db.Exec(query, args...)
if err != nil {
log.Fatalf("Failed to exec %s %s", query, args)
}
}
func (d *DB) version() (int, error) {
rows, err := d.db.Query("PRAGMA user_version")
var version int
err := d.db.Get(&version, "PRAGMA user_version")
if err != nil {
return -1, err
}
defer rows.Close()
for rows.Next() {
var v int
err = rows.Scan(&v)
if err != nil {
return -1, err
}
return v, nil
}
return -1, nil
return version, nil
}
func (d *DB) setVersion(version int) {
d.mustExec(fmt.Sprintf("PRAGMA user_version = %d", version))
d.db.MustExec(fmt.Sprintf("PRAGMA user_version = %d", version))
}
func (d *DB) migrate() {
@ -45,7 +27,7 @@ func (d *DB) migrate() {
switch version {
case 0:
d.mustExec(`
d.db.MustExec(`
CREATE TABLE todos (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,

@ -1,6 +1,11 @@
module jxs.me/todogo
go 1.19
go 1.20
require (
github.com/jmoiron/sqlx v1.3.5
modernc.org/sqlite v1.18.1
)
require (
github.com/google/uuid v1.3.0 // indirect
@ -18,7 +23,6 @@ require (
modernc.org/mathutil v1.4.1 // indirect
modernc.org/memory v1.1.1 // indirect
modernc.org/opt v0.1.1 // indirect
modernc.org/sqlite v1.18.1 // indirect
modernc.org/strutil v1.1.1 // indirect
modernc.org/token v1.0.0 // indirect
)

@ -1,11 +1,22 @@
github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo=
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
github.com/google/go-cmp v0.5.3 h1:x95R7cp+rSeeqAMI2knLtQ0DKlaBhv2NrtrOvafPHRo=
github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g=
github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ=
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs=
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
github.com/lib/pq v1.2.0 h1:LXpIM/LZ5xGFhOpXAQUIMM1HdyqzVYM13zNdjCEEcA0=
github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
github.com/mattn/go-sqlite3 v1.14.14 h1:qZgc/Rwetq+MtyE18WhzjokPD93dNqLGNT3QJuLvBGw=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk=
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
@ -46,7 +57,9 @@ modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9Y
modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ=
modernc.org/ccgo/v3 v3.16.8 h1:G0QNlTqI5uVgczBWfGKs7B++EPwCfXPWGD2MdeKloDs=
modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws=
modernc.org/ccorpus v1.11.6 h1:J16RXiiqiCgua6+ZvQot4yUuUy8zxgqbqEEUuGPlISk=
modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ=
modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM=
modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM=
modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA=
modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A=
@ -65,5 +78,7 @@ modernc.org/sqlite v1.18.1 h1:ko32eKt3jf7eqIkCgPAeHMBXw3riNSLhl2f3loEF7o8=
modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4=
modernc.org/strutil v1.1.1 h1:xv+J1BXY3Opl2ALrBwyfEikFAj8pmqcpnfmuwUwcozs=
modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw=
modernc.org/tcl v1.13.1 h1:npxzTwFTZYM8ghWicVIX1cRWzj7Nd8i6AqqX2p+IYao=
modernc.org/token v1.0.0 h1:a0jaWiNMDhDUtqOj09wvjWWAqd3q7WpBulmL9H2egsk=
modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=
modernc.org/z v1.5.1 h1:RTNHdsrOpeoSeOF4FbzTo8gBYByaJ5xT7NgZ9ZqRiJM=

@ -37,7 +37,7 @@ func (s *server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
func (s *server) HandleList() http.HandlerFunc {
type viewModel struct {
Todos []*database.Todo
Todos []database.Todo
Only string
Incomplete int
}
@ -48,7 +48,7 @@ func (s *server) HandleList() http.HandlerFunc {
q := r.URL.Query()
only := q.Get("only")
var dbTodos []*database.Todo
var dbTodos []database.Todo
var err error
switch only {
case "active":

Loading…
Cancel
Save