Commit 6e94c024 authored by obscuren's avatar obscuren

Added big data test and updating to reader

parent d1d2b660
...@@ -55,8 +55,7 @@ func DecodeWithReader(reader *bytes.Buffer) interface{} { ...@@ -55,8 +55,7 @@ func DecodeWithReader(reader *bytes.Buffer) interface{} {
return reader.Next(int(char - 0x80)) return reader.Next(int(char - 0x80))
case char <= 0xbf: case char <= 0xbf:
buff := bytes.NewReader(reader.Next(int(char - 0xb8))) length := ReadVarInt(reader.Next(int(char - 0xb7)))
length := ReadVarint(buff)
return reader.Next(int(length)) return reader.Next(int(length))
...@@ -72,74 +71,20 @@ func DecodeWithReader(reader *bytes.Buffer) interface{} { ...@@ -72,74 +71,20 @@ func DecodeWithReader(reader *bytes.Buffer) interface{} {
} }
return slice return slice
}
return slice
}
// TODO Use a bytes.Buffer instead of a raw byte slice.
// Cleaner code, and use draining instead of seeking the next bytes to read
func Decode(data []byte, pos uint64) (interface{}, uint64) {
var slice []interface{}
char := int(data[pos])
switch {
case char <= 0x7f:
return data[pos], pos + 1
case char <= 0xb7:
b := uint64(data[pos]) - 0x80
return data[pos+1 : pos+1+b], pos + 1 + b
case char <= 0xbf:
b := uint64(data[pos]) - 0xb7
b2 := ReadVarint(bytes.NewReader(data[pos+1 : pos+1+b]))
return data[pos+1+b : pos+1+b+b2], pos + 1 + b + b2
case char <= 0xf7:
b := uint64(data[pos]) - 0xc0
prevPos := pos
pos++
for i := uint64(0); i < b; {
var obj interface{}
// Get the next item in the data list and append it
obj, prevPos = Decode(data, pos)
slice = append(slice, obj)
// Increment i by the amount bytes read in the previous
// read
i += (prevPos - pos)
pos = prevPos
}
return slice, pos
case char <= 0xff: case char <= 0xff:
l := uint64(data[pos]) - 0xf7 length := ReadVarInt(reader.Next(int(char - 0xf7)))
b := ReadVarint(bytes.NewReader(data[pos+1 : pos+1+l])) for i := uint64(0); i < length; i++ {
obj := DecodeWithReader(reader)
pos = pos + l + 1 if obj != nil {
slice = append(slice, obj)
prevPos := b } else {
for i := uint64(0); i < uint64(b); { break
var obj interface{} }
obj, prevPos = Decode(data, pos)
slice = append(slice, obj)
i += (prevPos - pos)
pos = prevPos
} }
return slice, pos
default: default:
panic(fmt.Sprintf("byte not supported: %q", char))
} }
return slice, 0 return slice
} }
var ( var (
...@@ -223,3 +168,67 @@ func Encode(object interface{}) []byte { ...@@ -223,3 +168,67 @@ func Encode(object interface{}) []byte {
return buff.Bytes() return buff.Bytes()
} }
// TODO Use a bytes.Buffer instead of a raw byte slice.
// Cleaner code, and use draining instead of seeking the next bytes to read
func Decode(data []byte, pos uint64) (interface{}, uint64) {
var slice []interface{}
char := int(data[pos])
switch {
case char <= 0x7f:
return data[pos], pos + 1
case char <= 0xb7:
b := uint64(data[pos]) - 0x80
return data[pos+1 : pos+1+b], pos + 1 + b
case char <= 0xbf:
b := uint64(data[pos]) - 0xb7
b2 := ReadVarInt(data[pos+1 : pos+1+b])
return data[pos+1+b : pos+1+b+b2], pos + 1 + b + b2
case char <= 0xf7:
b := uint64(data[pos]) - 0xc0
prevPos := pos
pos++
for i := uint64(0); i < b; {
var obj interface{}
// Get the next item in the data list and append it
obj, prevPos = Decode(data, pos)
slice = append(slice, obj)
// Increment i by the amount bytes read in the previous
// read
i += (prevPos - pos)
pos = prevPos
}
return slice, pos
case char <= 0xff:
l := uint64(data[pos]) - 0xf7
b := ReadVarInt(data[pos+1 : pos+1+l])
pos = pos + l + 1
prevPos := b
for i := uint64(0); i < uint64(b); {
var obj interface{}
obj, prevPos = Decode(data, pos)
slice = append(slice, obj)
i += (prevPos - pos)
pos = prevPos
}
return slice, pos
default:
panic(fmt.Sprintf("byte not supported: %q", char))
}
return slice, 0
}
...@@ -44,6 +44,17 @@ func TestValueSlice(t *testing.T) { ...@@ -44,6 +44,17 @@ func TestValueSlice(t *testing.T) {
} }
} }
func TestLargeData(t *testing.T) {
data := make([]byte, 100000)
enc := Encode(data)
value := NewValue(enc)
value.Decode()
if value.Len() != len(data) {
t.Error("Expected data to be", len(data), "got", value.Len())
}
}
func TestValue(t *testing.T) { func TestValue(t *testing.T) {
value := NewValueFromBytes([]byte("\xcd\x83dog\x83god\x83cat\x01")) value := NewValueFromBytes([]byte("\xcd\x83dog\x83god\x83cat\x01"))
if value.Get(0).Str() != "dog" { if value.Get(0).Str() != "dog" {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment