diff options
Diffstat (limited to 'storage')
| -rw-r--r-- | storage/storage.go | 61 | ||||
| -rw-r--r-- | storage/storage_test.go | 7 |
2 files changed, 68 insertions, 0 deletions
diff --git a/storage/storage.go b/storage/storage.go new file mode 100644 index 0000000..9207761 --- /dev/null +++ b/storage/storage.go @@ -0,0 +1,61 @@ +package storage + +import ( + "database/sql" + "fmt" + "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 rows.Close() + + if err != nil { + return history, err + } + + for rows.Next() { + var msg core.Message + if err := rows.Scan(&msg.Source, &msg.Target, &msg.Timestamp, &msg.Content); err != nil { + return history, err + } + history = append(history, msg) + } + + return history, nil +} diff --git a/storage/storage_test.go b/storage/storage_test.go new file mode 100644 index 0000000..7a72c1f --- /dev/null +++ b/storage/storage_test.go @@ -0,0 +1,7 @@ +package storage + +import "testing" + +func TestStorage(t *testing.T) { + +} |
