-
Notifications
You must be signed in to change notification settings - Fork 1
/
db.go
123 lines (109 loc) · 2.21 KB
/
db.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
package main
import (
"encoding/json"
"os"
)
const dbPath = "./db/"
var dbPathCreated = false
type Conversations map[string]Conversation
func readConversation(id string) (Conversation, error) {
jsonFile, err := os.ReadFile(dbPath + id + ".json")
if err != nil {
return Conversation{}, err
}
conv := Conversation{}
err = json.Unmarshal(jsonFile, &conv)
conv.HasChange = true
return conv, err
}
func clearDB() error {
ids, err := getIDS()
if err != nil {
return err
}
for _, id := range ids {
err = os.Remove(dbPath + id + ".json")
if err != nil {
return err
}
}
return nil
}
func getIDS() ([]string, error) {
files, err := os.ReadDir(dbPath + ".")
if err != nil {
return nil, err
}
ids := make([]string, 0)
for _, file := range files {
if file.IsDir() {
continue
}
ids = append(ids, file.Name()[:len(file.Name())-5])
}
return ids, nil
}
func (conversations *Conversations) updateConversations() error {
ids, err := getIDS()
if err != nil {
return err
}
for _, id := range ids {
conv, ok := (*conversations)[id]
if !ok || conv.HasChange {
conv, err = readConversation(id)
if err != nil {
return err
}
(*conversations)[id] = conv
}
}
return nil
}
func (conversations *Conversations) getConversation(id string) (Conversation, error) {
conv, ok := (*conversations)[id]
if !ok || conv.HasChange {
var err error
conv, err = readConversation(id)
if err != nil {
return Conversation{}, err
}
(*conversations)[id] = conv
}
return conv, nil
}
func createIfNotExist(path string) error {
if _, err := os.Stat(path); os.IsNotExist(err) {
err := os.MkdirAll(path, 0755)
if err != nil {
return err
}
}
dbPathCreated = true
return nil
}
func (conv *Conversation) saveConversation() error {
// WARN : not very efficient or thread safe
if !dbPathCreated {
err := createIfNotExist(dbPath)
if err != nil {
return err
}
}
conv.HasChange = false
file := dbPath + conv.ID + ".json"
jsonConv, err := json.Marshal(conv)
if err != nil {
conv.HasChange = true
return err
}
err = os.WriteFile(file, jsonConv, 0644)
if err != nil {
conv.HasChange = true
return err
}
return nil
}
func (conv *Conversation) invalid() {
conv.HasChange = true
}