// Key returns the key the iterator currently holds. func (i *Iterator) Key() *Slice { var cLen C.size_t cKey := C.rocksdb_iter_key(i.c, &cLen) if cKey == nil { return nil } return &Slice{cKey, cLen, true} }
// Consider changing as here // https://github.com/siddontang/ledisdb/blob/master/store/rocksdb/iterator.go#L20:L38 // // Key returns the key the iterator currently holds. func (iter *Iterator) Key() []byte { var cLen C.size_t cKey := C.rocksdb_iter_key(iter.c, &cLen) if cKey == nil { return nil } return slice(unsafe.Pointer(cKey), int(C.int(cLen))) // return &Slice{cKey, cLen, true} }
func (it *Iterator) Key() []byte { var klen C.size_t kdata := C.rocksdb_iter_key(it.it, &klen) if kdata == nil { return nil } return slice(unsafe.Pointer(kdata), int(C.int(klen))) }
// Key returns a copy the key in the database the iterator currently holds. // // If Valid returns false, this method will panic. func (it *Iterator) Key() []byte { var klen C.size_t kdata := C.rocksdb_iter_key(it.Iter, &klen) if kdata == nil { return nil } // Unlike DB.Get, the key, kdata, returned is not meant to be freed by the // client. It's a direct reference to data managed by the iterator_t // instead of a copy. So, we must not free it here but simply copy it // with GoBytes. return C.GoBytes(unsafe.Pointer(kdata), C.int(klen)) }
// Scan returns up to max key/value objects starting from // start (inclusive) and ending at end (non-inclusive). // If max is zero then the number of key/values returned is unbounded. func (r *RocksDB) Scan(start, end Key, max int64) ([]RawKeyValue, error) { var keyVals []RawKeyValue if bytes.Compare(start, end) >= 0 { return keyVals, nil } // In order to prevent content displacement, caching is disabled // when performing scans. Any options set within the shared read // options field that should be carried over needs to be set here // as well. opts := C.rocksdb_readoptions_create() C.rocksdb_readoptions_set_fill_cache(opts, 0) defer C.rocksdb_readoptions_destroy(opts) it := C.rocksdb_create_iterator(r.rdb, opts) defer C.rocksdb_iter_destroy(it) byteCount := len(start) if byteCount == 0 { // start=Key("") needs special treatment since we need // to access start[0] in an explicit seek. C.rocksdb_iter_seek_to_first(it) } else { C.rocksdb_iter_seek(it, bytesPointer(start), C.size_t(byteCount)) } for i := int64(1); C.rocksdb_iter_valid(it) == 1; C.rocksdb_iter_next(it) { if max > 0 && i > max { break } var l C.size_t // The data returned by rocksdb_iter_{key,value} is not meant to be // freed by the client. It is a direct reference to the data managed // by the iterator, so it is copied instead of freed. data := C.rocksdb_iter_key(it, &l) k := C.GoBytes(unsafe.Pointer(data), C.int(l)) if bytes.Compare(k, end) >= 0 { break } data = C.rocksdb_iter_value(it, &l) v := C.GoBytes(unsafe.Pointer(data), C.int(l)) keyVals = append(keyVals, RawKeyValue{ Key: k, Value: v, }) i++ } // Check for any errors during iteration. var cErr *C.char C.rocksdb_iter_get_error(it, &cErr) if cErr != nil { return nil, charToErr(cErr) } return keyVals, nil }
// scan returns up to max key/value objects starting from // start (inclusive) and ending at end (non-inclusive). // If max is zero then the number of key/values returned is unbounded. func (r *RocksDB) scan(start, end Key, max int64) ([]KeyValue, error) { // In order to prevent content displacement, caching is disabled // when performing scans. Any options set within the shared read // options field that should be carried over needs to be set here // as well. opts := C.rocksdb_readoptions_create() C.rocksdb_readoptions_set_fill_cache(opts, 0) defer C.rocksdb_readoptions_destroy(opts) it := C.rocksdb_create_iterator(r.rdb, opts) defer C.rocksdb_iter_destroy(it) keyVals := []KeyValue{} C.rocksdb_iter_seek(it, (*C.char)(unsafe.Pointer(&start[0])), C.size_t(len(start))) for i := int64(1); C.rocksdb_iter_valid(it) == 1; C.rocksdb_iter_next(it) { if max > 0 && i > max { break } var l C.size_t // The data returned by rocksdb_iter_{key,value} is not meant to be // freed by the client. It is a direct reference to the data managed // by the iterator, so it is copied instead of freed. data := C.rocksdb_iter_key(it, &l) k := C.GoBytes(unsafe.Pointer(data), C.int(l)) if bytes.Equal(k, end) { break } data = C.rocksdb_iter_value(it, &l) v := C.GoBytes(unsafe.Pointer(data), C.int(l)) keyVals = append(keyVals, KeyValue{ Key: k, Value: Value{Bytes: v}, }) i++ } // Check for any errors during iteration. var cErr *C.char C.rocksdb_iter_get_error(it, &cErr) if cErr != nil { return nil, charToErr(cErr) } return keyVals, nil }
func (iter *Iterator) Key() []byte { var keyLen C.size_t var ck = C.rocksdb_iter_key(iter.it, &keyLen) return C.GoBytes(unsafe.Pointer(ck), C.int(keyLen)) }