From ba8d0f0e505d9ad717c119af4957cd5f89dbe940 Mon Sep 17 00:00:00 2001 From: Janos Guljas Date: Thu, 15 Nov 2018 17:24:13 +0100 Subject: [PATCH] swarm/shed: replace JSONField with StructField and rlp encoding --- swarm/shed/{field_json.go => field_struct.go} | 29 +++++++++---------- ...ield_json_test.go => field_struct_test.go} | 8 ++--- 2 files changed, 18 insertions(+), 19 deletions(-) rename swarm/shed/{field_json.go => field_struct.go} (69%) rename swarm/shed/{field_json_test.go => field_struct_test.go} (94%) diff --git a/swarm/shed/field_json.go b/swarm/shed/field_struct.go similarity index 69% rename from swarm/shed/field_json.go rename to swarm/shed/field_struct.go index b3274bb1b6..93d6e94096 100644 --- a/swarm/shed/field_json.go +++ b/swarm/shed/field_struct.go @@ -17,26 +17,25 @@ package shed import ( - "encoding/json" - + "github.com/ethereum/go-ethereum/rlp" "github.com/syndtr/goleveldb/leveldb" ) -// JSONField is a helper to store complex structure by -// encoding it in JSON format. -type JSONField struct { +// StructField is a helper to store complex structure by +// encoding it in RLP format. +type StructField struct { db *DB key []byte } -// NewJSONField returns a new JSONField. +// NewStructField returns a new StructField. // It validates its name and type against the database schema. -func (db *DB) NewJSONField(name string) (f JSONField, err error) { - key, err := db.schemaFieldKey(name, "json") +func (db *DB) NewStructField(name string) (f StructField, err error) { + key, err := db.schemaFieldKey(name, "struct-rlp") if err != nil { return f, err } - return JSONField{ + return StructField{ db: db, key: key, }, nil @@ -44,17 +43,17 @@ func (db *DB) NewJSONField(name string) (f JSONField, err error) { // Unmarshal unmarshals data fromt he database to a provided val. // If the data is not found leveldb.ErrNotFound is returned. -func (f JSONField) Unmarshal(val interface{}) (err error) { +func (f StructField) Unmarshal(val interface{}) (err error) { b, err := f.db.Get(f.key) if err != nil { return err } - return json.Unmarshal(b, val) + return rlp.DecodeBytes(b, val) } // Put marshals provided val and saves it to the database. -func (f JSONField) Put(val interface{}) (err error) { - b, err := json.Marshal(val) +func (f StructField) Put(val interface{}) (err error) { + b, err := rlp.EncodeToBytes(val) if err != nil { return err } @@ -62,8 +61,8 @@ func (f JSONField) Put(val interface{}) (err error) { } // PutInBatch marshals provided val and puts it into the batch. -func (f JSONField) PutInBatch(batch *leveldb.Batch, val interface{}) (err error) { - b, err := json.Marshal(val) +func (f StructField) PutInBatch(batch *leveldb.Batch, val interface{}) (err error) { + b, err := rlp.EncodeToBytes(val) if err != nil { return err } diff --git a/swarm/shed/field_json_test.go b/swarm/shed/field_struct_test.go similarity index 94% rename from swarm/shed/field_json_test.go rename to swarm/shed/field_struct_test.go index c9e2cf658d..137ac3a0ed 100644 --- a/swarm/shed/field_json_test.go +++ b/swarm/shed/field_struct_test.go @@ -22,13 +22,13 @@ import ( "github.com/syndtr/goleveldb/leveldb" ) -// TestJSONField validates put and unmarshal operations -// of the JSONField. -func TestJSONField(t *testing.T) { +// TestStructField validates put and unmarshal operations +// of the StructField. +func TestStructField(t *testing.T) { db, cleanupFunc := newTestDB(t) defer cleanupFunc() - complexField, err := db.NewJSONField("complex-field") + complexField, err := db.NewStructField("complex-field") if err != nil { t.Fatal(err) }