修改: 包名称为 zbus
This commit is contained in:
170
internal/zbus/zdb.go
Normal file
170
internal/zbus/zdb.go
Normal file
@@ -0,0 +1,170 @@
|
||||
package zbus
|
||||
|
||||
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 *ZBus) 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 *ZBus) LoadData() {
|
||||
s.loadDelay()
|
||||
// s.loadLock()
|
||||
}
|
||||
|
||||
func (s *ZBus) 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)})
|
||||
}
|
||||
}
|
||||
|
||||
func (s *ZBus) 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,
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user