From 814a327d0bd69d43b138315ea90affef50319bbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Mon, 21 Nov 2022 18:32:56 +0800 Subject: [PATCH] add Load --- reg.go | 66 +++++++++++++++++++++++++++++++++++++++++++++++++---- reg_test.go | 17 +++++++++++--- 2 files changed, 75 insertions(+), 8 deletions(-) diff --git a/reg.go b/reg.go index 9333000..dbec412 100644 --- a/reg.go +++ b/reg.go @@ -6,6 +6,7 @@ import ( "errors" "io" "net" + "os" "strconv" "sync" "time" @@ -32,12 +33,13 @@ type Regedit struct { mu sync.Mutex conn net.Conn addr string + stor string tp tea.TEA ts *tea.TEA seq byte } -func NewRegedit(addr, pwd, sps string) *Regedit { +func NewRegedit(addr, stor, pwd, sps string) *Regedit { var tp, ts [16]byte if len(pwd) > 15 { pwd = pwd[:15] @@ -48,16 +50,32 @@ func NewRegedit(addr, pwd, sps string) *Regedit { copy(tp[:], pwd) copy(ts[:], sps) s := tea.NewTeaCipherLittleEndian(ts[:]) - return &Regedit{addr: addr, tp: tea.NewTeaCipherLittleEndian(tp[:]), ts: &s} + f, err := os.Open(stor) + if err != nil { + f, err = os.Create(stor) + if err != nil { + panic(err) + } + } + _ = f.Close() + return &Regedit{addr: addr, stor: stor, tp: tea.NewTeaCipherLittleEndian(tp[:]), ts: &s} } -func NewRegReader(addr, pwd string) *Regedit { +func NewRegReader(addr, stor, pwd string) *Regedit { var tp [16]byte if len(pwd) > 15 { pwd = pwd[:15] } copy(tp[:], pwd) - return &Regedit{addr: addr, tp: tea.NewTeaCipherLittleEndian(tp[:])} + f, err := os.Open(stor) + if err != nil { + f, err = os.Create(stor) + if err != nil { + panic(err) + } + } + _ = f.Close() + return &Regedit{addr: addr, stor: stor, tp: tea.NewTeaCipherLittleEndian(tp[:])} } func (r *Regedit) Connect() (err error) { @@ -176,7 +194,45 @@ func (r *Regedit) Cat() (*Storage, error) { s.m[BytesToString(sp.Target[0])] = BytesToString(sp.Target[1]) i += int(sp.RealLen) } - return s, nil + f, err := os.Create(r.stor) + if err != nil { + return s, err + } + defer f.Close() + _, err = f.Write(data) + return s, err +} + +func (r *Regedit) Load() (*Storage, error) { + data, err := os.ReadFile(r.stor) + if err != nil { + return nil, err + } + s := new(Storage) + s.m = make(map[string]string, 256) + s.Md5 = md5.Sum(data) + rd := bytes.NewReader(data) + for i := 0; i < len(data); { + sp, err := spb.NewSimplePB(rd) + if err == io.EOF { + break + } + if err != nil { + return nil, err + } + if len(sp.Target) <= 1 { + return nil, ErrInvalidCatData + } + s.m[BytesToString(sp.Target[0])] = BytesToString(sp.Target[1]) + i += int(sp.RealLen) + } + f, err := os.Create(r.stor) + if err != nil { + return s, err + } + defer f.Close() + _, err = f.Write(data) + return s, err } func (r *Regedit) IsMd5Equal(m [md5.Size]byte) (bool, error) { diff --git a/reg_test.go b/reg_test.go index 7ca5deb..b0f700e 100644 --- a/reg_test.go +++ b/reg_test.go @@ -5,7 +5,7 @@ import ( ) func TestReg(t *testing.T) { - r := NewRegedit("127.0.0.1:8888", "testpwd", "testsps") + r := NewRegedit("127.0.0.1:8888", "storbin.test", "testpwd", "testsps") err := r.Connect() if err != nil { t.Fatal(err) @@ -64,15 +64,26 @@ func TestReg(t *testing.T) { if err != nil { t.Fatal(err) } + s, err = r.Load() + if err != nil { + t.Fatal(err) + } + v, err = s.Get("test") + if err != nil { + t.Fatal(err) + } + if v != "测试" { + t.Fatal("invalid test key value in store") + } } func TestPush(t *testing.T) { - r := NewRegedit("reilia.fumiama.top:32664", "fumiama", "--") + r := NewRegedit("reilia.fumiama.top:32664", "storbin.test", "fumiama", "--") err := r.Connect() if err != nil { t.Fatal(err) } - err = r.Set("ZeroBot-Plugin/kanban", "QQ群:1048452984, 开发群:752669987,\n进阶开发群:705749886. 禁止用于商业用途.") + err = r.Set("ZeroBot-Plugin/kanban", "\t\tQQ群:1048452984, 2群:915103207\n\t 开发群:752669987, 进阶开发群:705749886\n\n\t\t\t禁止用于商业用途") if err != nil { t.Fatal(err) }