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