// Merge merges the data associated with the key with the actual data in the database. func (db *DB) Merge(opts *WriteOptions, key []byte, value []byte) error { var ( cErr *C.char cKey = byteToChar(key) cValue = byteToChar(value) ) C.rocksdb_merge(db.c, opts.c, cKey, C.size_t(len(key)), cValue, C.size_t(len(value)), &cErr) return convertErr(cErr) }
// Merge merges the data associated with the key with the actual data in the database. func (db *DB) Merge(opts *WriteOptions, key []byte, value []byte) error { var ( cErr *C.char cKey = byteToChar(key) cValue = byteToChar(value) ) C.rocksdb_merge(db.c, opts.c, cKey, C.size_t(len(key)), cValue, C.size_t(len(value)), &cErr) if cErr != nil { defer C.free(unsafe.Pointer(cErr)) return errors.New(C.GoString(cErr)) } return nil }
// Merge implements the RocksDB merge operator using the function goMergeInit // to initialize missing values and goMerge to merge the old and the given // value into a new value, which is then stored under key. // Currently 64-bit counter logic is implemented. See the documentation of // goMerge and goMergeInit for details. // // The key and value byte slices may be reused safely. merge takes a copy // of them before returning. func (r *RocksDB) Merge(key Key, value []byte) error { if len(key) == 0 { return emptyKeyError() } // rocksdb_merge calls memcpy() (by way of MemTable::Add) // when called, so we do not need to worry about these byte slices being // reclaimed by the GC. var cErr *C.char C.rocksdb_merge( r.rdb, r.wOpts, bytesPointer(key), C.size_t(len(key)), bytesPointer(value), C.size_t(len(value)), &cErr) if cErr != nil { return charToErr(cErr) } return nil }