func dbGetProto(rdb *C.DBEngine, key MVCCKey, msg proto.Message) (ok bool, keyBytes, valBytes int64, err error) { if len(key.Key) == 0 { err = emptyKeyError() return } var result C.DBString if err = statusToError(C.DBGet(rdb, goToCKey(key), &result)); err != nil { return } if result.len <= 0 { msg.Reset() return } ok = true if msg != nil { // Make a byte slice that is backed by result.data. This slice // cannot live past the lifetime of this method, but we're only // using it to unmarshal the roachpb. data := cSliceToUnsafeGoBytes(C.DBSlice(result)) err = proto.Unmarshal(data, msg) } C.free(unsafe.Pointer(result.data)) keyBytes = int64(key.EncodedSize()) valBytes = int64(result.len) return }
// ValueProto parses the byte slice value into msg. func (kv *KeyValue) ValueProto(msg proto.Message) error { if kv.Value == nil { msg.Reset() return nil } return kv.Value.GetProto(msg) }
// ValueProto parses the byte slice value as a proto message. func (kv *KeyValue) ValueProto(msg gogoproto.Message) error { if kv.Value == nil || kv.Value.Bytes == nil { msg.Reset() return nil } return gogoproto.Unmarshal(kv.Value.Bytes, msg) }
func (r *RocksDB) getProtoInternal(key proto.EncodedKey, msg gogoproto.Message, snapshotHandle *C.DBSnapshot) (ok bool, keyBytes, valBytes int64, err error) { if len(key) == 0 { err = emptyKeyError() return } var result C.DBString if err = statusToError(C.DBGet(r.rdb, snapshotHandle, goToCSlice(key), &result)); err != nil { return } if result.len <= 0 { msg.Reset() return } ok = true if msg != nil { // Make a byte slice that is backed by result.data. This slice // cannot live past the lifetime of this method, but we're only // using it to unmarshal the proto. data := cSliceToUnsafeGoBytes(C.DBSlice(result)) err = gogoproto.Unmarshal(data, msg) } C.free(unsafe.Pointer(result.data)) keyBytes = int64(len(key)) valBytes = int64(result.len) return }
// ValueProto parses the byte slice value as a proto message. func (kv *KeyValue) ValueProto(msg proto.Message) error { if kv.Value == nil || kv.Value.GetRawBytes() == nil { msg.Reset() return nil } return proto.Unmarshal(kv.Value.GetRawBytes(), msg) }
// ValueProto parses the byte slice value as a proto message. func (kv *KeyValue) ValueProto(msg gogoproto.Message) error { switch val := kv.Value.(type) { case nil: msg.Reset() return nil case []byte: return gogoproto.Unmarshal(val, msg) } return fmt.Errorf("unable to unmarshal proto: %T", kv.Value) }