func (it *Iterator) Value() []byte { var vlen C.size_t vdata := C.leveldb_iter_value(it.it, &vlen) if vdata == nil { return nil } return slice(unsafe.Pointer(vdata), int(C.int(vlen))) }
// Value returns a copy of the value in the database the iterator currently // holds. // // If Valid returns false, this method will panic. func (it *Iterator) Value() []byte { var vlen C.size_t vdata := C.leveldb_iter_value(it.Iter, &vlen) if vdata == nil { return nil } // Unlike DB.Get, the value, vdata, 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(vdata), C.int(vlen)) }
func (self *Leveldb) Iter(fun func(string, Getter) bool) { iterator := C.leveldb_create_iterator(self.cdb, self.read_options) defer C.leveldb_iter_destroy(iterator) var keyLen C.size_t var keyValue *C.char var valueLen C.size_t var valueValue *C.char var ret bool for C.leveldb_iter_seek_to_first(iterator); C.leveldb_iter_valid(iterator) != levelFalse; C.leveldb_iter_next(iterator) { keyValue = C.leveldb_iter_key(iterator, &keyLen) key := string(C.GoBytes(unsafe.Pointer(keyValue), C.int(keyLen))) valueValue = C.leveldb_iter_value(iterator, &valueLen) value := C.GoBytes(unsafe.Pointer(valueValue), C.int(valueLen)) r := bytes.NewReader(value) ret = fun(key, func(e interface{}) error { return decode(r, e) }) if ret == false { break } } }
// Value() returns a copy of the value in the database the iterator currently // holds. // // If Valid() returns false, this method will panic. func (it *Iterator) Value() []byte { var vlen C.size_t vdata := C.leveldb_iter_value(it.Iter, &vlen) return C.GoBytes(unsafe.Pointer(vdata), C.int(vlen)) }