Skip to content
This repository was archived by the owner on Jan 19, 2022. It is now read-only.

Commit c5d83b0

Browse files
committed
clean code
1 parent b708626 commit c5d83b0

File tree

24 files changed

+2292
-1109
lines changed

24 files changed

+2292
-1109
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,7 @@ makesbvj01/makesbvj01
44
dumpsbvj01/dumpsbvj01
55
dumpbtreedb/dumpbtreedb
66
makebtreedb/makebtreedb
7+
test
78
*/*.exe
9+
*.world
10+
world*

dumpbtreedb/main.go

Lines changed: 41 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,18 @@ import (
55
"compress/zlib"
66
"encoding/hex"
77
"flag"
8+
"fmt"
89
"io"
910
"log"
1011
"os"
1112

12-
"../lib/btreedb5"
13+
"github.com/xhebox/sbutils/lib/btreedb5"
1314
)
1415

1516
func main() {
16-
var in string
17+
var in, mode string
1718
flag.StringVar(&in, "i", "input", "input file")
19+
flag.StringVar(&mode, "m", "default", "default/records")
1820
flag.Parse()
1921
log.SetFlags(log.Llongfile)
2022

@@ -24,46 +26,49 @@ func main() {
2426
}
2527
defer h.Close()
2628

27-
h.SetTree(1)
28-
e = h.Traverse(func(record btreedb5.Record) error {
29-
z, e := zlib.NewReader(bytes.NewReader(record.Data))
30-
if e != nil {
31-
return e
32-
}
29+
switch mode {
30+
/*
31+
case "records":
32+
e = h.DumpBlocks(func(record btreedb5.Record) error {
33+
z, e := zlib.NewReader(bytes.NewReader(record.Data))
34+
if e != nil {
35+
return e
36+
}
3337
34-
f, e := os.OpenFile("tree1_"+hex.EncodeToString(record.Key), os.O_RDWR|os.O_CREATE, 0644)
35-
if e != nil {
36-
return e
37-
}
38+
f, e := os.OpenFile(hex.EncodeToString(record.Key), os.O_RDWR|os.O_CREATE, 0644)
39+
if e != nil {
40+
return e
41+
}
3842
39-
io.Copy(f, z)
43+
io.Copy(f, z)
4044
41-
z.Close()
42-
f.Close()
43-
return nil
44-
})
45-
if e != nil {
46-
log.Fatalln(e)
47-
}
45+
z.Close()
46+
f.Close()
47+
return nil
48+
})
49+
if e != nil {
50+
log.Fatalln(e)
51+
}
52+
*/
53+
default:
54+
e = h.Ascend(func(key btreedb5.Key, data []byte) {
55+
z, e := zlib.NewReader(bytes.NewReader(data))
56+
if e != nil {
57+
panic(e)
58+
}
4859

49-
h.SetTree(2)
50-
e = h.Traverse(func(record btreedb5.Record) error {
51-
z, e := zlib.NewReader(bytes.NewReader(record.Data))
52-
if e != nil {
53-
return e
54-
}
60+
f, e := os.OpenFile(fmt.Sprintf("data_%s", hex.EncodeToString(key)), os.O_RDWR|os.O_CREATE, 0644)
61+
if e != nil {
62+
panic(e)
63+
}
64+
65+
io.Copy(f, z)
5566

56-
f, e := os.OpenFile("tree2_"+hex.EncodeToString(record.Key), os.O_RDWR|os.O_CREATE, 0644)
67+
z.Close()
68+
f.Close()
69+
})
5770
if e != nil {
58-
return e
71+
log.Fatalf("%+v\n", e)
5972
}
60-
61-
io.Copy(f, z)
62-
z.Close()
63-
f.Close()
64-
return nil
65-
})
66-
if e != nil {
67-
log.Fatalln(e)
6873
}
6974
}

dumpsbvj01/main.go

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ func main() {
1818
var skip int
1919
flag.StringVar(&in, "i", "input", "versioned json file")
2020
flag.StringVar(&out, "o", "stdout", "output json")
21-
flag.StringVar(&mode, "m", "vj", "vjmagic/vj/raw")
21+
flag.StringVar(&mode, "m", "vj", "vjmagic/vj/raw/nvj")
2222
flag.IntVar(&skip, "n", 0, "skip first n bytes")
2323
flag.Parse()
2424
log.SetFlags(log.Llongfile)
@@ -60,7 +60,7 @@ func main() {
6060
log.Fatalln(e)
6161
}
6262
case "vj":
63-
r, e := sbvj01.Parse(contents)
63+
r, _, e := sbvj01.Parse(contents)
6464
if e != nil {
6565
log.Fatalln(e)
6666
}
@@ -74,8 +74,30 @@ func main() {
7474
if e != nil {
7575
log.Fatalln(e)
7676
}
77+
case "nvj":
78+
r := int(int8(contents[0]))
79+
80+
off := 1
81+
for i := 0; i < r; i++ {
82+
r, l, e := sbvj01.Parse(contents[off:])
83+
if e != nil {
84+
log.Fatalln(e)
85+
}
86+
87+
out, e := json.MarshalIndent(r, "", "\t")
88+
if e != nil {
89+
log.Fatalln(e)
90+
}
91+
92+
_, e = io.Copy(outwt, bytes.NewReader(out))
93+
if e != nil {
94+
log.Fatalln(e)
95+
}
96+
97+
off += l
98+
}
7799
case "vjmagic":
78-
r, e := sbvj01.ParseMagic(contents)
100+
r, _, e := sbvj01.ParseMagic(contents)
79101
if e != nil {
80102
log.Fatalln(e)
81103
}

filter/.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
filter
2+
log

filter/main.go

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
package main
2+
3+
import (
4+
"flag"
5+
"fmt"
6+
"io"
7+
"log"
8+
"net"
9+
10+
"github.com/xhebox/sbutils/lib/packet"
11+
)
12+
13+
func Callback(r *Filter, p packet.Packet) {
14+
fmt.Printf("%+v\n", p)
15+
}
16+
17+
var laddr, saddr, mode string
18+
19+
func forward(conn net.Conn) {
20+
rconn, err := net.Dial("tcp", saddr)
21+
if err != nil {
22+
log.Fatalln("dial failed: ", err)
23+
}
24+
25+
log.Println("connected to: ", rconn.RemoteAddr())
26+
switch mode {
27+
case "all":
28+
p := NewFilter(conn, rconn, Callback)
29+
q := NewFilter(rconn, conn, Callback)
30+
go func() {
31+
defer conn.Close()
32+
defer rconn.Close()
33+
e := p.Loop()
34+
log.Printf("parse cs: %+v\n", e)
35+
}()
36+
go func() {
37+
defer conn.Close()
38+
defer rconn.Close()
39+
e := q.Loop()
40+
log.Printf("parse sc: %+v\n", e)
41+
}()
42+
case "client":
43+
p := NewFilter(conn, rconn, Callback)
44+
go func() {
45+
defer conn.Close()
46+
defer rconn.Close()
47+
e := p.Loop()
48+
log.Printf("parse cs: %+v\n", e)
49+
}()
50+
go func() {
51+
io.Copy(conn, rconn)
52+
}()
53+
case "server":
54+
q := NewFilter(rconn, conn, Callback)
55+
go func() {
56+
defer conn.Close()
57+
defer rconn.Close()
58+
e := q.Loop()
59+
log.Printf("parse sc: %+v\n", e)
60+
}()
61+
go func() {
62+
io.Copy(rconn, conn)
63+
}()
64+
default:
65+
go func() {
66+
defer rconn.Close()
67+
defer conn.Close()
68+
io.Copy(conn, rconn)
69+
}()
70+
go func() {
71+
defer rconn.Close()
72+
defer conn.Close()
73+
io.Copy(rconn, conn)
74+
}()
75+
}
76+
}
77+
78+
func main() {
79+
flag.StringVar(&laddr, "l", "127.0.0.1:21026", "listened address")
80+
flag.StringVar(&saddr, "t", "127.0.0.1:21025", "server address")
81+
flag.StringVar(&mode, "m", "all", "could be client(filter packages from client to server)/server(filter packages from server to client)/all")
82+
flag.Parse()
83+
log.SetFlags(log.Lshortfile)
84+
85+
listener, err := net.Listen("tcp", laddr)
86+
if err != nil {
87+
log.Fatalln("failed to listen: ", err)
88+
}
89+
log.Println("listened to: ", laddr)
90+
log.Println("forward to: ", saddr)
91+
92+
for {
93+
conn, err := listener.Accept()
94+
if err != nil {
95+
log.Fatalln("failed to accept connection: ", err)
96+
}
97+
98+
log.Println("accepted connection: ", conn.RemoteAddr())
99+
go forward(conn)
100+
}
101+
}

filter/packet.go

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
package main
2+
3+
import (
4+
"bytes"
5+
"compress/zlib"
6+
"fmt"
7+
"io"
8+
"io/ioutil"
9+
10+
"github.com/pkg/errors"
11+
"github.com/xhebox/bstruct/byteorder"
12+
"github.com/xhebox/sbutils/lib/packet"
13+
)
14+
15+
var (
16+
ErrUnknownType = errors.New("packet of unknown type")
17+
)
18+
19+
type FilterCallback func(*Filter, packet.Packet)
20+
21+
type Filter struct {
22+
in io.Reader
23+
out io.Writer
24+
// filter function
25+
cb FilterCallback
26+
End byteorder.ByteOrder
27+
}
28+
29+
func NewFilter(in io.Reader, out io.Writer, cb FilterCallback) *Filter {
30+
r := &Filter{}
31+
r.in = in
32+
r.out = out
33+
r.cb = cb
34+
r.End = byteorder.BigEndian
35+
return r
36+
}
37+
38+
func (r *Filter) ReadPacket() (*packet.BasePacket, error) {
39+
pktType, e := byteorder.Uint8(r.in)
40+
if e != nil {
41+
return nil, errors.WithStack(e)
42+
}
43+
44+
length, e := byteorder.Varint(r.in, r.End)
45+
if e != nil {
46+
return nil, errors.WithStack(e)
47+
}
48+
abslength := int64(length)
49+
if abslength < 0 {
50+
abslength = -abslength
51+
}
52+
53+
buf := &bytes.Buffer{}
54+
55+
in := io.LimitReader(r.in, abslength)
56+
57+
if length < 0 {
58+
zin, e := zlib.NewReader(in)
59+
if e != nil {
60+
return nil, errors.WithStack(e)
61+
}
62+
63+
defer zin.Close()
64+
in = zin
65+
}
66+
67+
_, e = io.Copy(buf, in)
68+
if e != nil {
69+
return nil, errors.WithStack(e)
70+
}
71+
72+
return &packet.BasePacket{Type: pktType, Buf: buf.Bytes()}, nil
73+
}
74+
75+
func (r *Filter) WritePacket(pkt *packet.BasePacket) error {
76+
e := byteorder.PutUint8(r.out, pkt.Type)
77+
if e != nil {
78+
return errors.WithStack(e)
79+
}
80+
81+
e = byteorder.PutVarint(r.out, r.End, int64(len(pkt.Buf)))
82+
if e != nil {
83+
return errors.WithStack(e)
84+
}
85+
86+
_, e = r.out.Write(pkt.Buf)
87+
if e != nil {
88+
return errors.WithStack(e)
89+
}
90+
91+
return nil
92+
}
93+
94+
// loop function
95+
func (r *Filter) Loop() error {
96+
for {
97+
pkt, e := r.ReadPacket()
98+
if e != nil {
99+
return errors.WithStack(e)
100+
}
101+
102+
p, e := pkt.Parse(r.End)
103+
if e != nil {
104+
fmt.Println(e)
105+
}
106+
107+
if p != nil {
108+
if r.cb != nil {
109+
r.cb(r, p)
110+
}
111+
112+
pkt, e = p.Pack(r.End)
113+
if e != nil {
114+
return errors.WithStack(e)
115+
}
116+
} else if pkt.Type == 13 {
117+
ioutil.WriteFile("../out", pkt.Buf, 0644)
118+
}
119+
120+
if e := r.WritePacket(pkt); e != nil {
121+
return errors.WithStack(e)
122+
}
123+
}
124+
}

0 commit comments

Comments
 (0)