package storage import ( "database/sql" "fmt" "log" "time" "go.rctt.net/solec/core" ) type Database struct { *sql.DB } const initSql = ` CREATE TABLE IF NOT EXISTS messages (id INTEGER NOT NULL PRIMARY KEY, source STRING, target STRING, timestamp INT, content STRING); ` func InitDb(path string) (*Database, error) { db, err := sql.Open("sqlite3", path) if err != nil { return nil, err } _, err = db.Exec(initSql) return &Database{db}, nil } func (db *Database) Write(msg core.Message) (err error) { fmt.Println(msg.Timestamp) _, err = db.Exec( "INSERT INTO messages (source, target, timestamp, content) VALUES (?, ?, ?, ?);", msg.Source, msg.Target, msg.Timestamp.Unix(), msg.Content, ) return err } func (db *Database) Read(channel string, since time.Time, num int, offset int) (history []core.Message, err error) { rows, err := db.Query( "SELECT source, target, timestamp, content FROM messages WHERE timestamp > ? LIMIT ? OFFSET ?", since.Unix(), num, offset, ) defer func() { if err := rows.Close(); err != nil { log.Println("cannot close database row:", err) } }() if err != nil { return history, err } for rows.Next() { var msg core.Message var timestamp int64 if err := rows.Scan(&msg.Source, &msg.Target, ×tamp, &msg.Content); err != nil { return history, err } msg.Timestamp = time.Unix(timestamp, 0) history = append(history, msg) } return history, nil }