github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/swarm/shed/field_struct.go (about) 1 2 //<developer> 3 // <name>linapex 曹一峰</name> 4 // <email>linapex@163.com</email> 5 // <wx>superexc</wx> 6 // <qqgroup>128148617</qqgroup> 7 // <url>https://jsq.ink</url> 8 // <role>pku engineer</role> 9 // <date>2019-03-16 19:16:44</date> 10 //</624450117713268736> 11 12 13 package shed 14 15 import ( 16 "github.com/ethereum/go-ethereum/rlp" 17 "github.com/syndtr/goleveldb/leveldb" 18 ) 19 20 //structField是用于存储复杂结构的帮助程序 21 //以rlp格式对其进行编码。 22 type StructField struct { 23 db *DB 24 key []byte 25 } 26 27 //NewstructField返回新的structField。 28 //它根据数据库模式验证其名称和类型。 29 func (db *DB) NewStructField(name string) (f StructField, err error) { 30 key, err := db.schemaFieldKey(name, "struct-rlp") 31 if err != nil { 32 return f, err 33 } 34 return StructField{ 35 db: db, 36 key: key, 37 }, nil 38 } 39 40 //将数据库中的数据解包到提供的VAL。 41 //如果找不到数据,则返回leveldb.errnotfound。 42 func (f StructField) Get(val interface{}) (err error) { 43 b, err := f.db.Get(f.key) 44 if err != nil { 45 return err 46 } 47 return rlp.DecodeBytes(b, val) 48 } 49 50 //放入marshals提供的val并将其保存到数据库中。 51 func (f StructField) Put(val interface{}) (err error) { 52 b, err := rlp.EncodeToBytes(val) 53 if err != nil { 54 return err 55 } 56 return f.db.Put(f.key, b) 57 } 58 59 //Putinbatch Marshals提供了VAL并将其放入批处理中。 60 func (f StructField) PutInBatch(batch *leveldb.Batch, val interface{}) (err error) { 61 b, err := rlp.EncodeToBytes(val) 62 if err != nil { 63 return err 64 } 65 batch.Put(f.key, b) 66 return nil 67 } 68