summaryrefslogtreecommitdiff
path: root/storage/memory.go
diff options
context:
space:
mode:
Diffstat (limited to 'storage/memory.go')
-rw-r--r--storage/memory.go44
1 files changed, 44 insertions, 0 deletions
diff --git a/storage/memory.go b/storage/memory.go
new file mode 100644
index 0000000..a7bf8cc
--- /dev/null
+++ b/storage/memory.go
@@ -0,0 +1,44 @@
+package storage
+
+import "elefant/models"
+
+type Memories interface {
+ Memorise(m *models.Memory) (*models.Memory, error)
+ Recall(agent, topic string) (string, error)
+ RecallTopics(agent string) ([]string, error)
+}
+
+func (p ProviderSQL) Memorise(m *models.Memory) (*models.Memory, error) {
+ query := "INSERT INTO memories (agent, topic, mind) VALUES (:agent, :topic, :mind) RETURNING *;"
+ stmt, err := p.db.PrepareNamed(query)
+ if err != nil {
+ return nil, err
+ }
+ defer stmt.Close()
+ var memory models.Memory
+ err = stmt.Get(&memory, m)
+ if err != nil {
+ return nil, err
+ }
+ return &memory, nil
+}
+
+func (p ProviderSQL) Recall(agent, topic string) (string, error) {
+ query := "SELECT mind FROM memories WHERE agent = $1 AND topic = $2"
+ var mind string
+ err := p.db.Get(&mind, query, agent, topic)
+ if err != nil {
+ return "", err
+ }
+ return mind, nil
+}
+
+func (p ProviderSQL) RecallTopics(agent string) ([]string, error) {
+ query := "SELECT DISTINCT topic FROM memories WHERE agent = $1"
+ var topics []string
+ err := p.db.Select(&topics, query, agent)
+ if err != nil {
+ return nil, err
+ }
+ return topics, nil
+}