Files
zhub/internal/zsub/zdb.go
2023-07-02 00:46:04 +08:00

171 lines
3.0 KiB
Go

package zsub
import (
"bufio"
"fmt"
"log"
"os"
"strconv"
"strings"
"time"
)
var (
datadir string
)
// Message 数据封装
type Message struct {
Conn *ZConn
Rcmd []string
}
// Append file append
func Append(str string, fileName string) {
file, err := os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY, os.ModeAppend)
if err != nil {
fmt.Println(err)
}
defer file.Close()
_, err = file.WriteString(str)
if err != nil {
log.Println(err)
}
}
func (s *ZSub) SaveData() {
defer func() {
if r := recover(); r != nil {
log.Println("SaveData Recovered:", r)
}
}()
s.Lock()
defer s.Unlock()
// ========================== delay save ===========================
func() {
if !s.delayup {
return
}
defer func() {
s.delayup = false
}()
err := os.Remove(datadir + "/delay.z")
if err != nil {
log.Println(err)
}
file, err := os.OpenFile(datadir+"/delay.z", os.O_CREATE|os.O_WRONLY, os.ModeAppend)
if err != nil {
fmt.Println(err)
}
defer file.Close()
writer := bufio.NewWriter(file)
_delays := s.delays
for _, delay := range _delays {
delayStr := fmt.Sprintf("%s %s %d\n", delay.Topic, delay.Value, delay.Exectime.Unix())
writer.WriteString(delayStr)
}
writer.Flush()
}()
// ========================== lock save ===========================
func() {
err := os.Remove(datadir + "/lock.z")
if err != nil {
log.Println(err)
}
str := ""
for _, locks := range s.locks {
for _, lock := range locks {
str += fmt.Sprintf("%s %s %d %d\n", lock.key, lock.uuid, lock.duration, lock.start)
break // 只记录获得锁的记录
}
}
Append(str, datadir+"/lock.z")
}()
}
func (s *ZSub) LoadData() {
s.loadDelay()
// s.loadLock()
}
func (s *ZSub) loadDelay() {
f, err := os.Open(datadir + "/delay.z")
if err != nil {
return
}
defer f.Close()
r := bufio.NewReader(f)
for {
bytes, err := r.ReadBytes('\n')
if err != nil {
return
}
line := string(bytes)
if len(line) == 0 {
continue
}
line = strings.Trim(line, " \r\n")
split := strings.Split(line, " ")
if len(split) != 3 {
continue
}
exectime, err := strconv.ParseInt(split[2], 10, 64)
if err != nil {
log.Println(err)
continue
}
if exectime < time.Now().Unix() {
continue
}
s.delay([]string{"delay", split[0], split[1], strconv.FormatInt((exectime-time.Now().Unix())*1000, 10)}, nil)
}
}
func (s *ZSub) loadLock() {
f, err := os.Open(datadir + "/lock.z")
if err != nil {
return
}
defer f.Close()
r := bufio.NewReader(f)
for {
bytes, err := r.ReadBytes('\n')
if err != nil {
return
}
line := string(bytes)
if len(line) == 0 {
continue
}
line = strings.Trim(line, " \r\n")
split := strings.Split(line, " ")
if len(split) != 4 {
continue
}
duration, err := strconv.Atoi(split[2])
start, err := strconv.ParseInt(split[3], 10, 64)
if start > 0 && time.Now().Unix()-start > 1 {
duration = int(time.Now().Unix() - start)
} else {
duration = 1
}
s._lock(&Lock{
key: split[0],
uuid: split[1],
duration: duration,
// start: start,
})
}
}