@@ -5,54 +5,103 @@ import (
55 "os"
66)
77
8+ const DataDir = "./data/"
9+ const FileExcluded = ".gitkeep"
10+
811type Storage struct {
9- queue Queue [ string ]
12+ topicManager * TopicManager
1013}
1114
12- func NewStorage (queue Queue [ string ] ) * Storage {
15+ func NewStorage (topicManager * TopicManager ) * Storage {
1316 return & Storage {
14- queue : queue ,
17+ topicManager : topicManager ,
18+ }
19+ }
20+
21+ func (S * Storage ) createStoreDirectory () {
22+ _ , err := os .ReadDir (DataDir )
23+ if err != nil {
24+ if os .IsNotExist (err ) {
25+ err := os .Mkdir (DataDir , 0755 )
26+ if err != nil {
27+ panic (err )
28+ }
29+ } else if ! os .IsExist (err ) {
30+ panic (err )
31+ }
1532 }
1633}
1734
1835func (S * Storage ) clear () {
19- err := os .WriteFile ( "./data" , [] byte ( "" ), 0644 )
36+ dirEntries , err := os .ReadDir ( DataDir )
2037 if err != nil {
2138 panic (err )
2239 }
40+ for _ , entry := range dirEntries {
41+ if entry .Name () == FileExcluded {
42+ continue
43+ }
44+ os .Remove (DataDir + entry .Name ())
45+ }
2346}
2447
2548func (S * Storage ) Save () {
2649 S .clear ()
50+ S .createStoreDirectory ()
51+
52+ for _ , topic := range S .topicManager .GetTopics () {
53+ S .saveTopic (topic )
54+ }
55+ }
2756
28- file , err := os .OpenFile ("./data" , os .O_RDWR | os .O_CREATE , 0644 )
57+ func (S * Storage ) saveTopic (topic Topic ) {
58+ file , err := os .OpenFile (string (DataDir + topic ), os .O_RDWR | os .O_CREATE , 0644 )
2959 if err != nil {
3060 panic (err )
3161 }
3262 defer file .Close ()
33- for ! S .queue .IsEmpty () {
34- value , _ := S .queue .Dequeue ()
35- //err := os.OpenFile("./data", []byte(value+"\n"), 0644)
36- _ , err = file .WriteString (value + "\n " )
63+ for {
64+ message , err := S .topicManager .GetNextMessage (topic )
65+ if err != nil {
66+ return
67+ }
68+ _ , err = file .Write (message )
3769 if err != nil {
3870 panic (err )
3971 }
72+ // Line feed
73+ _ , _ = file .Write ([]byte {10 })
4074 }
4175}
4276
4377func (S * Storage ) Load () {
44- file , err := os .OpenFile ("./data" , os .O_RDONLY , 0644 )
78+ dirEntries , err := os .ReadDir (DataDir )
79+ if err != nil {
80+ panic (err )
81+ }
82+
83+ for _ , dirEntry := range dirEntries {
84+ if dirEntry .Name () == FileExcluded {
85+ continue
86+ }
87+ S .loadTopic (dirEntry )
88+ }
89+ }
90+
91+ func (S * Storage ) loadTopic (dirEntry os.DirEntry ) {
92+ topic := dirEntry .Name ()
93+ file , err := os .OpenFile (DataDir + topic , os .O_RDONLY , 0644 )
4594 if err != nil {
46- return
95+ panic ( err )
4796 }
4897 defer file .Close ()
4998
5099 scanner := bufio .NewScanner (file )
51100 for scanner .Scan () {
52- text := scanner .Text ()
53- if text == "" {
101+ text := scanner .Bytes ()
102+ if len ( text ) <= 0 {
54103 continue
55104 }
56- S .queue . Enqueue ( text )
105+ S .topicManager . AddMessage ( Topic ( topic ), text )
57106 }
58107}
0 commit comments