mirror of
https://github.com/supleed2/go-chat.git
synced 2024-12-22 14:15:49 +00:00
Implement database loading
This commit is contained in:
parent
95f7457e4d
commit
3db53ff1ae
|
@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
- Description in help output of client and server binaries
|
- Description in help output of client and server binaries
|
||||||
- SQLite Database connection to persist room and message history data
|
- SQLite Database connection to persist room and message history data
|
||||||
- Logging message struct and channel + function to make database calls for channel output
|
- Logging message struct and channel + function to make database calls for channel output
|
||||||
|
- Database loading + initialisation, restores previous channels and most recent messages on server start
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,7 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"os/signal"
|
"os/signal"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"slices"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
@ -58,6 +59,9 @@ type args struct {
|
||||||
NickMap *string `arg:"-n" help:"path to nick:pass JSON file" placeholder:"FILE"`
|
NickMap *string `arg:"-n" help:"path to nick:pass JSON file" placeholder:"FILE"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const createRoomTable = "CREATE TABLE IF NOT EXISTS %s (tim DATETIME, id TEXT, msg TEXT)"
|
||||||
|
const insertRoomMsg = "INSERT INTO %v (tim, id, msg) VALUES (:tim, :id, :msg)"
|
||||||
|
|
||||||
func (a *args) Version() string {
|
func (a *args) Version() string {
|
||||||
return "v0.1.2"
|
return "v0.1.2"
|
||||||
}
|
}
|
||||||
|
@ -189,8 +193,8 @@ func (s server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||||
wsjson.Write(ctx, conn, c.SMsg{Tim: time.Now(), Id: "system", Msg: fmt.Sprintf("Room exists: %v", cmd)})
|
wsjson.Write(ctx, conn, c.SMsg{Tim: time.Now(), Id: "system", Msg: fmt.Sprintf("Room exists: %v", cmd)})
|
||||||
} else {
|
} else {
|
||||||
s.dbase.Exec("INSERT INTO rooms (name) VALUES ($1)", cmd[1])
|
s.dbase.Exec("INSERT INTO rooms (name) VALUES ($1)", cmd[1])
|
||||||
s.dbase.Exec(fmt.Sprintf("CREATE TABLE IF NOT EXISTS %s (tim DATETIME, id TEXT, msg TEXT)", cmd[1]))
|
s.dbase.Exec(fmt.Sprintf(createRoomTable, cmd[1]))
|
||||||
s.rooms[cmd[1]] = fmt.Sprintf("insert into %v (tim, id, msg) values (:tim, :id, :msg)", cmd[1])
|
s.rooms[cmd[1]] = fmt.Sprintf(insertRoomMsg, cmd[1])
|
||||||
wsjson.Write(ctx, conn, c.SMsg{Tim: time.Now(), Id: "system", Msg: fmt.Sprintf("Created room: %v", cmd[1])})
|
wsjson.Write(ctx, conn, c.SMsg{Tim: time.Now(), Id: "system", Msg: fmt.Sprintf("Created room: %v", cmd[1])})
|
||||||
}
|
}
|
||||||
} else if cmd[0] == "rm" {
|
} else if cmd[0] == "rm" {
|
||||||
|
@ -337,7 +341,52 @@ func (s server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func loadDb(path string, rhlen int) (*sqlx.DB, map[string]string, map[string][]c.SMsg, error) {
|
func loadDb(path string, rhlen int) (*sqlx.DB, map[string]string, map[string][]c.SMsg, error) {
|
||||||
return nil, nil, nil, fmt.Errorf("loadDb not implemented")
|
db, err := sqlx.Connect("sqlite", path)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = db.Exec("CREATE TABLE IF NOT EXISTS rooms (name TEXT)")
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
roomList := []string{}
|
||||||
|
err = db.Select(&roomList, "SELECT * FROM rooms")
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(roomList) == 0 {
|
||||||
|
roomList = []string{"general", "test1", "test2"}
|
||||||
|
_, err = db.Exec("INSERT INTO rooms (name) VALUES ('general'), ('test1'), ('test2')")
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rooms := make(map[string]string)
|
||||||
|
rhist := make(map[string][]c.SMsg)
|
||||||
|
|
||||||
|
for _, room := range roomList {
|
||||||
|
rooms[room] = fmt.Sprintf(insertRoomMsg, room)
|
||||||
|
|
||||||
|
_, err = db.Exec(fmt.Sprintf(createRoomTable, room))
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
roomHistory := []c.SMsg{}
|
||||||
|
err = db.Select(&roomHistory, fmt.Sprintf("SELECT * FROM %s ORDER BY tim DESC LIMIT %d", room, rhlen))
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
slices.Reverse(roomHistory)
|
||||||
|
rhist[room] = roomHistory
|
||||||
|
}
|
||||||
|
|
||||||
|
return db, rooms, rhist, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type nickErr int
|
type nickErr int
|
||||||
|
|
Loading…
Reference in a new issue