Skip to content

Commit 70915ab

Browse files
committed
Feature: add persistance of queue elements
1 parent 7aabde0 commit 70915ab

File tree

4 files changed

+91
-1
lines changed

4 files changed

+91
-1
lines changed

internal/recover.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,13 @@ func GetWebsocketPanicHandler() func(conn *websocket.Conn) {
1414
}
1515
}
1616

17+
func SaveOnPanic(storage *Storage) {
18+
if err := recover(); err != nil {
19+
storage.Save()
20+
HandlePanic(err)
21+
}
22+
}
23+
1724
func RecoverGoroutine(function func()) {
1825
if err := recover(); err != nil {
1926
HandlePanic(err)

internal/storage.go

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package internal
2+
3+
import (
4+
"bufio"
5+
"os"
6+
)
7+
8+
type Storage struct {
9+
queue Queue[string]
10+
}
11+
12+
func NewStorage(queue Queue[string]) *Storage {
13+
return &Storage{
14+
queue: queue,
15+
}
16+
}
17+
18+
func (S *Storage) clear() {
19+
err := os.WriteFile("./data", []byte(""), 0644)
20+
if err != nil {
21+
panic(err)
22+
}
23+
}
24+
25+
func (S *Storage) Save() {
26+
S.clear()
27+
28+
file, err := os.OpenFile("./data", os.O_RDWR|os.O_CREATE, 0644)
29+
if err != nil {
30+
panic(err)
31+
}
32+
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")
37+
if err != nil {
38+
panic(err)
39+
}
40+
}
41+
}
42+
43+
func (S *Storage) Load() {
44+
file, err := os.OpenFile("./data", os.O_RDONLY, 0644)
45+
if err != nil {
46+
return
47+
}
48+
defer file.Close()
49+
50+
scanner := bufio.NewScanner(file)
51+
for scanner.Scan() {
52+
text := scanner.Text()
53+
if text == "" {
54+
continue
55+
}
56+
S.queue.Enqueue(text)
57+
}
58+
}

internal/system.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package internal
2+
3+
import (
4+
"github.com/gofiber/fiber/v2/log"
5+
"os"
6+
"os/signal"
7+
)
8+
9+
func HandleOsSignal(storage *Storage) {
10+
sigchan := make(chan os.Signal, 1)
11+
signals := []os.Signal{os.Kill, os.Interrupt}
12+
signal.Notify(sigchan, signals...)
13+
<-sigchan
14+
15+
storage.Save()
16+
17+
log.Debug("os signal received")
18+
19+
os.Exit(0)
20+
}

src/main.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,12 @@ import (
1111

1212
func main() {
1313

14+
queue := internal.NewLinkedListQueue[string]()
15+
storage := internal.NewStorage(queue)
16+
storage.Load()
17+
defer internal.SaveOnPanic(storage)
18+
go internal.HandleOsSignal(storage)
19+
1420
app := fiber.New(fiber.Config{
1521
// Override default error handler
1622
ErrorHandler: func(ctx *fiber.Ctx, err error) error {
@@ -22,7 +28,6 @@ func main() {
2228
app.Use(logger.New())
2329
app.Use(cors.New())
2430

25-
queue := internal.NewLinkedListQueue[string]()
2631
http := internal.NewHTTP(app, queue)
2732
http.SetupRoutes()
2833

0 commit comments

Comments
 (0)