Skip to content

Commit dcae1c5

Browse files
authored
gzip data (ccbrown#62)
1 parent e1bfd9d commit dcae1c5

File tree

1 file changed

+24
-3
lines changed

1 file changed

+24
-3
lines changed

server/database.go

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package server
22

33
import (
4+
"bytes"
5+
"compress/gzip"
46
"encoding/binary"
7+
"io/ioutil"
58

69
json "github.com/json-iterator/go"
710
)
@@ -18,11 +21,16 @@ type Database interface {
1821
Close() error
1922
}
2023

24+
const gzipMarker = 0
25+
2126
func marshalActivity(a Activity) (key, value []byte, err error) {
22-
buf, err := json.Marshal(a)
23-
if err != nil {
27+
buf := &bytes.Buffer{}
28+
buf.Write([]byte{gzipMarker})
29+
w := gzip.NewWriter(buf)
30+
if err := json.NewEncoder(w).Encode(a); err != nil {
2431
return nil, nil, err
2532
}
33+
w.Close()
2634
k := make([]byte, 10)
2735
binary.BigEndian.PutUint64(k, uint64(a.ActivityTime().Unix())<<24)
2836
switch a.(type) {
@@ -34,10 +42,23 @@ func marshalActivity(a Activity) (key, value []byte, err error) {
3442
k[5] = RedditPostType
3543
}
3644
binary.BigEndian.PutUint32(k[6:], a.ActivityKey())
37-
return k, buf, nil
45+
return k, buf.Bytes(), nil
3846
}
3947

4048
func unmarshalActivity(key, value []byte) (Activity, error) {
49+
if len(value) > 0 && value[0] == gzipMarker {
50+
r, err := gzip.NewReader(bytes.NewReader(value[1:]))
51+
if err != nil {
52+
return nil, err
53+
}
54+
defer r.Close()
55+
buf, err := ioutil.ReadAll(r)
56+
if err != nil {
57+
return nil, err
58+
}
59+
value = buf
60+
}
61+
4162
switch key[5] {
4263
case ForumPostType:
4364
post := &ForumPost{}

0 commit comments

Comments
 (0)