kevinschoon-pomo/store.go

127 lines
2.5 KiB
Go
Raw Normal View History

2018-01-16 10:50:08 +01:00
package main
2018-01-16 12:06:20 +01:00
import (
"database/sql"
_ "github.com/mattn/go-sqlite3"
"os"
"os/user"
2018-01-16 13:02:35 +01:00
"time"
2018-01-16 12:06:20 +01:00
)
2018-01-16 13:02:35 +01:00
// 2018-01-16 19:05:21.752851759+08:00
const datetimeFmt = "2006-01-02 15:04:05.999999999-07:00"
2018-01-16 12:06:20 +01:00
func defaultDBPath() string {
u, err := user.Current()
maybe(err)
return u.HomeDir + "/.pomo"
}
type Store struct {
db *sql.DB
}
2018-01-16 10:50:08 +01:00
func NewStore(path string) (*Store, error) {
2018-01-16 12:06:20 +01:00
os.Mkdir(path, 0755)
db, err := sql.Open("sqlite3", path+"/pomo.db")
if err != nil {
return nil, err
}
return &Store{db: db}, nil
2018-01-16 10:50:08 +01:00
}
2018-01-16 13:02:35 +01:00
func (s Store) CreateTask(task Task) (int, error) {
2018-01-16 12:06:20 +01:00
var taskID int
tx, err := s.db.Begin()
if err != nil {
return -1, err
}
2018-01-17 06:14:20 +01:00
_, err = tx.Exec("INSERT INTO task (message) VALUES ($1)", task.Message)
2018-01-16 12:06:20 +01:00
if err != nil {
tx.Rollback()
return -1, err
}
err = tx.QueryRow("SELECT last_insert_rowid() FROM task").Scan(&taskID)
if err != nil {
tx.Rollback()
return -1, err
}
return taskID, tx.Commit()
}
2018-01-16 10:50:08 +01:00
2018-01-16 13:02:35 +01:00
func (s Store) CreateRecord(taskID int, record Record) error {
2018-01-16 12:06:20 +01:00
_, err := s.db.Exec(
`INSERT INTO record (task_id, start, end) VALUES ($1, $2, $3)`,
taskID,
record.Start,
record.End,
)
return err
}
2018-01-16 13:02:35 +01:00
func (s Store) ReadTasks() ([]*Task, error) {
2018-01-17 06:14:20 +01:00
rows, err := s.db.Query(`SELECT rowid,message FROM task`)
2018-01-16 13:02:35 +01:00
if err != nil {
return nil, err
}
tasks := []*Task{}
for rows.Next() {
task := &Task{Records: []*Record{}}
2018-01-17 06:14:20 +01:00
err = rows.Scan(&task.ID, &task.Message)
2018-01-16 13:02:35 +01:00
if err != nil {
return nil, err
}
records, err := s.ReadRecords(task.ID)
if err != nil {
return nil, err
}
for _, record := range records {
task.Records = append(task.Records, record)
}
tasks = append(tasks, task)
}
return tasks, nil
}
func (s Store) ReadRecords(taskID int) ([]*Record, error) {
rows, err := s.db.Query(`SELECT start,end FROM record WHERE task_id = $1`, &taskID)
if err != nil {
return nil, err
}
records := []*Record{}
for rows.Next() {
var (
startStr string
endStr string
)
record := &Record{}
err = rows.Scan(&startStr, &endStr)
if err != nil {
return nil, err
}
start, _ := time.Parse(datetimeFmt, startStr)
end, _ := time.Parse(datetimeFmt, endStr)
record.Start = start
record.End = end
records = append(records, record)
}
return records, nil
}
2018-01-16 12:06:20 +01:00
func (s Store) Close() error { return s.db.Close() }
func initDB(db *Store) error {
stmt := `
CREATE TABLE task (
2018-01-17 06:14:20 +01:00
message TEXT
2018-01-16 12:06:20 +01:00
);
CREATE TABLE record (
task_id INTEGER,
start DATETTIME,
end DATETTIME
);
`
_, err := db.db.Exec(stmt)
return err
}