package db import ( "database/sql" "log" "os" "time" _ "github.com/lib/pq" ) type Timetable struct { ID int64 `json:"id"` Name string `json:"name"` Status bool `json:"status"` Created time.Time `json:"created"` } type TimeSlot struct { ID int64 `json:"id"` TTID int64 `json:"ttid"` Name string `json:"name"` Time string `json:"time"` Capacity int64 `json:"capacity"` Take int64 `json:"take"` Created time.Time `json:"Created"` Success bool `json:"success"` } type Take struct { Username string `json:"username"` TTID int64 `json:"ttid"` Created time.Time `json:"created"` } var ( DB *sql.DB GetAllTimetables *sql.Stmt CreateNewTimetable *sql.Stmt DeleteTimetable *sql.Stmt UpdateTimetableStatus *sql.Stmt GetTimeSlotsByTimetable *sql.Stmt CreateNewTimeslot *sql.Stmt DeleteTimeslot *sql.Stmt GetTakesByTimeslot *sql.Stmt DeleteTake *sql.Stmt UserTakeTimeslot *sql.Stmt UserUntakeTimeslot *sql.Stmt UpdateTakeCount *sql.Stmt CheckTableStatus *sql.Stmt ) func init() { var err error DB, err = sql.Open("postgres", os.Getenv("POSTGRES_CONNSTR")) if err != nil { log.Fatal(err) } if len(os.Args) > 1{ if os.Args[1] == "install" { install() os.Exit(0) } } GetAllTimetables, err = DB.Prepare(` select id, name, status from timetables order by status desc, created desc `) if err != nil { log.Fatal(err) } CreateNewTimetable, err = DB.Prepare(` insert into timetables (name) values ($1) returning id `) if err != nil { log.Fatal(err) } DeleteTimetable, err = DB.Prepare(` delete from timetables where id = $1 `) if err != nil { log.Fatal(err) } GetTimeSlotsByTimetable, err = DB.Prepare(` select t.id, t."name" ,t."time" ,t.take, t.capacity, t2."name", t2.status, case sub.username when $2 then true else false end as success from timeslots t join timetables t2 on t.ttid = t2.id left outer join ( select username, tsid from takes t3 where username = $2 ) sub on t.id = sub.tsid where t2.id = $1 order by t."name", t."time" `) if err != nil { log.Fatal(err) } CreateNewTimeslot, err = DB.Prepare(` insert into timeslots (ttid, name, time, capacity) values ($1, $2, $3, $4) returning id `) if err != nil { log.Fatal(err) } DeleteTimeslot, err = DB.Prepare(` delete from timeslots where id = $1 `) if err != nil { log.Fatal(err) } GetTakesByTimeslot, err = DB.Prepare(` select username, created from takes where tsid = $1 `) if err != nil { log.Fatal(err) } DeleteTake, err = DB.Prepare(` delete from takes where tsid = $1 and username = $2 `) if err != nil { log.Fatal(err) } UpdateTimetableStatus, err = DB.Prepare(` update timetables set status = $1 where id = $2 `) if err != nil { log.Fatal(err) } UserTakeTimeslot, err = DB.Prepare(` insert into takes (username, tsid) values ($1, $2) `) if err != nil { log.Fatal(err) } UserUntakeTimeslot, err = DB.Prepare(` delete from takes where username = $1 and tsid = $2 `) if err != nil { log.Fatal(err) } UpdateTakeCount, err = DB.Prepare(` update timeslots set take = take + $1 where id = $2 `) if err != nil { log.Fatal(err) } CheckTableStatus, err = DB.Prepare(` select status from timetables where id = $1 `) if err != nil { log.Fatal(err) } }