1*9507f98cSAndroid Build Coastguard Worker // Copyright (c) 2011 The LevelDB Authors. All rights reserved.
2*9507f98cSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*9507f98cSAndroid Build Coastguard Worker // found in the LICENSE file. See the AUTHORS file for names of contributors.
4*9507f98cSAndroid Build Coastguard Worker
5*9507f98cSAndroid Build Coastguard Worker #include "leveldb/c.h"
6*9507f98cSAndroid Build Coastguard Worker
7*9507f98cSAndroid Build Coastguard Worker #include <string.h>
8*9507f98cSAndroid Build Coastguard Worker
9*9507f98cSAndroid Build Coastguard Worker #include <cstdint>
10*9507f98cSAndroid Build Coastguard Worker #include <cstdlib>
11*9507f98cSAndroid Build Coastguard Worker
12*9507f98cSAndroid Build Coastguard Worker #include "leveldb/cache.h"
13*9507f98cSAndroid Build Coastguard Worker #include "leveldb/comparator.h"
14*9507f98cSAndroid Build Coastguard Worker #include "leveldb/db.h"
15*9507f98cSAndroid Build Coastguard Worker #include "leveldb/env.h"
16*9507f98cSAndroid Build Coastguard Worker #include "leveldb/filter_policy.h"
17*9507f98cSAndroid Build Coastguard Worker #include "leveldb/iterator.h"
18*9507f98cSAndroid Build Coastguard Worker #include "leveldb/options.h"
19*9507f98cSAndroid Build Coastguard Worker #include "leveldb/status.h"
20*9507f98cSAndroid Build Coastguard Worker #include "leveldb/write_batch.h"
21*9507f98cSAndroid Build Coastguard Worker
22*9507f98cSAndroid Build Coastguard Worker using leveldb::Cache;
23*9507f98cSAndroid Build Coastguard Worker using leveldb::Comparator;
24*9507f98cSAndroid Build Coastguard Worker using leveldb::CompressionType;
25*9507f98cSAndroid Build Coastguard Worker using leveldb::DB;
26*9507f98cSAndroid Build Coastguard Worker using leveldb::Env;
27*9507f98cSAndroid Build Coastguard Worker using leveldb::FileLock;
28*9507f98cSAndroid Build Coastguard Worker using leveldb::FilterPolicy;
29*9507f98cSAndroid Build Coastguard Worker using leveldb::Iterator;
30*9507f98cSAndroid Build Coastguard Worker using leveldb::kMajorVersion;
31*9507f98cSAndroid Build Coastguard Worker using leveldb::kMinorVersion;
32*9507f98cSAndroid Build Coastguard Worker using leveldb::Logger;
33*9507f98cSAndroid Build Coastguard Worker using leveldb::NewBloomFilterPolicy;
34*9507f98cSAndroid Build Coastguard Worker using leveldb::NewLRUCache;
35*9507f98cSAndroid Build Coastguard Worker using leveldb::Options;
36*9507f98cSAndroid Build Coastguard Worker using leveldb::RandomAccessFile;
37*9507f98cSAndroid Build Coastguard Worker using leveldb::Range;
38*9507f98cSAndroid Build Coastguard Worker using leveldb::ReadOptions;
39*9507f98cSAndroid Build Coastguard Worker using leveldb::SequentialFile;
40*9507f98cSAndroid Build Coastguard Worker using leveldb::Slice;
41*9507f98cSAndroid Build Coastguard Worker using leveldb::Snapshot;
42*9507f98cSAndroid Build Coastguard Worker using leveldb::Status;
43*9507f98cSAndroid Build Coastguard Worker using leveldb::WritableFile;
44*9507f98cSAndroid Build Coastguard Worker using leveldb::WriteBatch;
45*9507f98cSAndroid Build Coastguard Worker using leveldb::WriteOptions;
46*9507f98cSAndroid Build Coastguard Worker
47*9507f98cSAndroid Build Coastguard Worker extern "C" {
48*9507f98cSAndroid Build Coastguard Worker
49*9507f98cSAndroid Build Coastguard Worker struct leveldb_t {
50*9507f98cSAndroid Build Coastguard Worker DB* rep;
51*9507f98cSAndroid Build Coastguard Worker };
52*9507f98cSAndroid Build Coastguard Worker struct leveldb_iterator_t {
53*9507f98cSAndroid Build Coastguard Worker Iterator* rep;
54*9507f98cSAndroid Build Coastguard Worker };
55*9507f98cSAndroid Build Coastguard Worker struct leveldb_writebatch_t {
56*9507f98cSAndroid Build Coastguard Worker WriteBatch rep;
57*9507f98cSAndroid Build Coastguard Worker };
58*9507f98cSAndroid Build Coastguard Worker struct leveldb_snapshot_t {
59*9507f98cSAndroid Build Coastguard Worker const Snapshot* rep;
60*9507f98cSAndroid Build Coastguard Worker };
61*9507f98cSAndroid Build Coastguard Worker struct leveldb_readoptions_t {
62*9507f98cSAndroid Build Coastguard Worker ReadOptions rep;
63*9507f98cSAndroid Build Coastguard Worker };
64*9507f98cSAndroid Build Coastguard Worker struct leveldb_writeoptions_t {
65*9507f98cSAndroid Build Coastguard Worker WriteOptions rep;
66*9507f98cSAndroid Build Coastguard Worker };
67*9507f98cSAndroid Build Coastguard Worker struct leveldb_options_t {
68*9507f98cSAndroid Build Coastguard Worker Options rep;
69*9507f98cSAndroid Build Coastguard Worker };
70*9507f98cSAndroid Build Coastguard Worker struct leveldb_cache_t {
71*9507f98cSAndroid Build Coastguard Worker Cache* rep;
72*9507f98cSAndroid Build Coastguard Worker };
73*9507f98cSAndroid Build Coastguard Worker struct leveldb_seqfile_t {
74*9507f98cSAndroid Build Coastguard Worker SequentialFile* rep;
75*9507f98cSAndroid Build Coastguard Worker };
76*9507f98cSAndroid Build Coastguard Worker struct leveldb_randomfile_t {
77*9507f98cSAndroid Build Coastguard Worker RandomAccessFile* rep;
78*9507f98cSAndroid Build Coastguard Worker };
79*9507f98cSAndroid Build Coastguard Worker struct leveldb_writablefile_t {
80*9507f98cSAndroid Build Coastguard Worker WritableFile* rep;
81*9507f98cSAndroid Build Coastguard Worker };
82*9507f98cSAndroid Build Coastguard Worker struct leveldb_logger_t {
83*9507f98cSAndroid Build Coastguard Worker Logger* rep;
84*9507f98cSAndroid Build Coastguard Worker };
85*9507f98cSAndroid Build Coastguard Worker struct leveldb_filelock_t {
86*9507f98cSAndroid Build Coastguard Worker FileLock* rep;
87*9507f98cSAndroid Build Coastguard Worker };
88*9507f98cSAndroid Build Coastguard Worker
89*9507f98cSAndroid Build Coastguard Worker struct leveldb_comparator_t : public Comparator {
~leveldb_comparator_tleveldb_comparator_t90*9507f98cSAndroid Build Coastguard Worker ~leveldb_comparator_t() override { (*destructor_)(state_); }
91*9507f98cSAndroid Build Coastguard Worker
Compareleveldb_comparator_t92*9507f98cSAndroid Build Coastguard Worker int Compare(const Slice& a, const Slice& b) const override {
93*9507f98cSAndroid Build Coastguard Worker return (*compare_)(state_, a.data(), a.size(), b.data(), b.size());
94*9507f98cSAndroid Build Coastguard Worker }
95*9507f98cSAndroid Build Coastguard Worker
Nameleveldb_comparator_t96*9507f98cSAndroid Build Coastguard Worker const char* Name() const override { return (*name_)(state_); }
97*9507f98cSAndroid Build Coastguard Worker
98*9507f98cSAndroid Build Coastguard Worker // No-ops since the C binding does not support key shortening methods.
FindShortestSeparatorleveldb_comparator_t99*9507f98cSAndroid Build Coastguard Worker void FindShortestSeparator(std::string*, const Slice&) const override {}
FindShortSuccessorleveldb_comparator_t100*9507f98cSAndroid Build Coastguard Worker void FindShortSuccessor(std::string* key) const override {}
101*9507f98cSAndroid Build Coastguard Worker
102*9507f98cSAndroid Build Coastguard Worker void* state_;
103*9507f98cSAndroid Build Coastguard Worker void (*destructor_)(void*);
104*9507f98cSAndroid Build Coastguard Worker int (*compare_)(void*, const char* a, size_t alen, const char* b,
105*9507f98cSAndroid Build Coastguard Worker size_t blen);
106*9507f98cSAndroid Build Coastguard Worker const char* (*name_)(void*);
107*9507f98cSAndroid Build Coastguard Worker };
108*9507f98cSAndroid Build Coastguard Worker
109*9507f98cSAndroid Build Coastguard Worker struct leveldb_filterpolicy_t : public FilterPolicy {
~leveldb_filterpolicy_tleveldb_filterpolicy_t110*9507f98cSAndroid Build Coastguard Worker ~leveldb_filterpolicy_t() override { (*destructor_)(state_); }
111*9507f98cSAndroid Build Coastguard Worker
Nameleveldb_filterpolicy_t112*9507f98cSAndroid Build Coastguard Worker const char* Name() const override { return (*name_)(state_); }
113*9507f98cSAndroid Build Coastguard Worker
CreateFilterleveldb_filterpolicy_t114*9507f98cSAndroid Build Coastguard Worker void CreateFilter(const Slice* keys, int n, std::string* dst) const override {
115*9507f98cSAndroid Build Coastguard Worker std::vector<const char*> key_pointers(n);
116*9507f98cSAndroid Build Coastguard Worker std::vector<size_t> key_sizes(n);
117*9507f98cSAndroid Build Coastguard Worker for (int i = 0; i < n; i++) {
118*9507f98cSAndroid Build Coastguard Worker key_pointers[i] = keys[i].data();
119*9507f98cSAndroid Build Coastguard Worker key_sizes[i] = keys[i].size();
120*9507f98cSAndroid Build Coastguard Worker }
121*9507f98cSAndroid Build Coastguard Worker size_t len;
122*9507f98cSAndroid Build Coastguard Worker char* filter = (*create_)(state_, &key_pointers[0], &key_sizes[0], n, &len);
123*9507f98cSAndroid Build Coastguard Worker dst->append(filter, len);
124*9507f98cSAndroid Build Coastguard Worker std::free(filter);
125*9507f98cSAndroid Build Coastguard Worker }
126*9507f98cSAndroid Build Coastguard Worker
KeyMayMatchleveldb_filterpolicy_t127*9507f98cSAndroid Build Coastguard Worker bool KeyMayMatch(const Slice& key, const Slice& filter) const override {
128*9507f98cSAndroid Build Coastguard Worker return (*key_match_)(state_, key.data(), key.size(), filter.data(),
129*9507f98cSAndroid Build Coastguard Worker filter.size());
130*9507f98cSAndroid Build Coastguard Worker }
131*9507f98cSAndroid Build Coastguard Worker
132*9507f98cSAndroid Build Coastguard Worker void* state_;
133*9507f98cSAndroid Build Coastguard Worker void (*destructor_)(void*);
134*9507f98cSAndroid Build Coastguard Worker const char* (*name_)(void*);
135*9507f98cSAndroid Build Coastguard Worker char* (*create_)(void*, const char* const* key_array,
136*9507f98cSAndroid Build Coastguard Worker const size_t* key_length_array, int num_keys,
137*9507f98cSAndroid Build Coastguard Worker size_t* filter_length);
138*9507f98cSAndroid Build Coastguard Worker uint8_t (*key_match_)(void*, const char* key, size_t length,
139*9507f98cSAndroid Build Coastguard Worker const char* filter, size_t filter_length);
140*9507f98cSAndroid Build Coastguard Worker };
141*9507f98cSAndroid Build Coastguard Worker
142*9507f98cSAndroid Build Coastguard Worker struct leveldb_env_t {
143*9507f98cSAndroid Build Coastguard Worker Env* rep;
144*9507f98cSAndroid Build Coastguard Worker bool is_default;
145*9507f98cSAndroid Build Coastguard Worker };
146*9507f98cSAndroid Build Coastguard Worker
SaveError(char ** errptr,const Status & s)147*9507f98cSAndroid Build Coastguard Worker static bool SaveError(char** errptr, const Status& s) {
148*9507f98cSAndroid Build Coastguard Worker assert(errptr != nullptr);
149*9507f98cSAndroid Build Coastguard Worker if (s.ok()) {
150*9507f98cSAndroid Build Coastguard Worker return false;
151*9507f98cSAndroid Build Coastguard Worker } else if (*errptr == nullptr) {
152*9507f98cSAndroid Build Coastguard Worker *errptr = strdup(s.ToString().c_str());
153*9507f98cSAndroid Build Coastguard Worker } else {
154*9507f98cSAndroid Build Coastguard Worker // TODO(sanjay): Merge with existing error?
155*9507f98cSAndroid Build Coastguard Worker std::free(*errptr);
156*9507f98cSAndroid Build Coastguard Worker *errptr = strdup(s.ToString().c_str());
157*9507f98cSAndroid Build Coastguard Worker }
158*9507f98cSAndroid Build Coastguard Worker return true;
159*9507f98cSAndroid Build Coastguard Worker }
160*9507f98cSAndroid Build Coastguard Worker
CopyString(const std::string & str)161*9507f98cSAndroid Build Coastguard Worker static char* CopyString(const std::string& str) {
162*9507f98cSAndroid Build Coastguard Worker char* result =
163*9507f98cSAndroid Build Coastguard Worker reinterpret_cast<char*>(std::malloc(sizeof(char) * str.size()));
164*9507f98cSAndroid Build Coastguard Worker std::memcpy(result, str.data(), sizeof(char) * str.size());
165*9507f98cSAndroid Build Coastguard Worker return result;
166*9507f98cSAndroid Build Coastguard Worker }
167*9507f98cSAndroid Build Coastguard Worker
leveldb_open(const leveldb_options_t * options,const char * name,char ** errptr)168*9507f98cSAndroid Build Coastguard Worker leveldb_t* leveldb_open(const leveldb_options_t* options, const char* name,
169*9507f98cSAndroid Build Coastguard Worker char** errptr) {
170*9507f98cSAndroid Build Coastguard Worker DB* db;
171*9507f98cSAndroid Build Coastguard Worker if (SaveError(errptr, DB::Open(options->rep, std::string(name), &db))) {
172*9507f98cSAndroid Build Coastguard Worker return nullptr;
173*9507f98cSAndroid Build Coastguard Worker }
174*9507f98cSAndroid Build Coastguard Worker leveldb_t* result = new leveldb_t;
175*9507f98cSAndroid Build Coastguard Worker result->rep = db;
176*9507f98cSAndroid Build Coastguard Worker return result;
177*9507f98cSAndroid Build Coastguard Worker }
178*9507f98cSAndroid Build Coastguard Worker
leveldb_close(leveldb_t * db)179*9507f98cSAndroid Build Coastguard Worker void leveldb_close(leveldb_t* db) {
180*9507f98cSAndroid Build Coastguard Worker delete db->rep;
181*9507f98cSAndroid Build Coastguard Worker delete db;
182*9507f98cSAndroid Build Coastguard Worker }
183*9507f98cSAndroid Build Coastguard Worker
leveldb_put(leveldb_t * db,const leveldb_writeoptions_t * options,const char * key,size_t keylen,const char * val,size_t vallen,char ** errptr)184*9507f98cSAndroid Build Coastguard Worker void leveldb_put(leveldb_t* db, const leveldb_writeoptions_t* options,
185*9507f98cSAndroid Build Coastguard Worker const char* key, size_t keylen, const char* val, size_t vallen,
186*9507f98cSAndroid Build Coastguard Worker char** errptr) {
187*9507f98cSAndroid Build Coastguard Worker SaveError(errptr,
188*9507f98cSAndroid Build Coastguard Worker db->rep->Put(options->rep, Slice(key, keylen), Slice(val, vallen)));
189*9507f98cSAndroid Build Coastguard Worker }
190*9507f98cSAndroid Build Coastguard Worker
leveldb_delete(leveldb_t * db,const leveldb_writeoptions_t * options,const char * key,size_t keylen,char ** errptr)191*9507f98cSAndroid Build Coastguard Worker void leveldb_delete(leveldb_t* db, const leveldb_writeoptions_t* options,
192*9507f98cSAndroid Build Coastguard Worker const char* key, size_t keylen, char** errptr) {
193*9507f98cSAndroid Build Coastguard Worker SaveError(errptr, db->rep->Delete(options->rep, Slice(key, keylen)));
194*9507f98cSAndroid Build Coastguard Worker }
195*9507f98cSAndroid Build Coastguard Worker
leveldb_write(leveldb_t * db,const leveldb_writeoptions_t * options,leveldb_writebatch_t * batch,char ** errptr)196*9507f98cSAndroid Build Coastguard Worker void leveldb_write(leveldb_t* db, const leveldb_writeoptions_t* options,
197*9507f98cSAndroid Build Coastguard Worker leveldb_writebatch_t* batch, char** errptr) {
198*9507f98cSAndroid Build Coastguard Worker SaveError(errptr, db->rep->Write(options->rep, &batch->rep));
199*9507f98cSAndroid Build Coastguard Worker }
200*9507f98cSAndroid Build Coastguard Worker
leveldb_get(leveldb_t * db,const leveldb_readoptions_t * options,const char * key,size_t keylen,size_t * vallen,char ** errptr)201*9507f98cSAndroid Build Coastguard Worker char* leveldb_get(leveldb_t* db, const leveldb_readoptions_t* options,
202*9507f98cSAndroid Build Coastguard Worker const char* key, size_t keylen, size_t* vallen,
203*9507f98cSAndroid Build Coastguard Worker char** errptr) {
204*9507f98cSAndroid Build Coastguard Worker char* result = nullptr;
205*9507f98cSAndroid Build Coastguard Worker std::string tmp;
206*9507f98cSAndroid Build Coastguard Worker Status s = db->rep->Get(options->rep, Slice(key, keylen), &tmp);
207*9507f98cSAndroid Build Coastguard Worker if (s.ok()) {
208*9507f98cSAndroid Build Coastguard Worker *vallen = tmp.size();
209*9507f98cSAndroid Build Coastguard Worker result = CopyString(tmp);
210*9507f98cSAndroid Build Coastguard Worker } else {
211*9507f98cSAndroid Build Coastguard Worker *vallen = 0;
212*9507f98cSAndroid Build Coastguard Worker if (!s.IsNotFound()) {
213*9507f98cSAndroid Build Coastguard Worker SaveError(errptr, s);
214*9507f98cSAndroid Build Coastguard Worker }
215*9507f98cSAndroid Build Coastguard Worker }
216*9507f98cSAndroid Build Coastguard Worker return result;
217*9507f98cSAndroid Build Coastguard Worker }
218*9507f98cSAndroid Build Coastguard Worker
leveldb_create_iterator(leveldb_t * db,const leveldb_readoptions_t * options)219*9507f98cSAndroid Build Coastguard Worker leveldb_iterator_t* leveldb_create_iterator(
220*9507f98cSAndroid Build Coastguard Worker leveldb_t* db, const leveldb_readoptions_t* options) {
221*9507f98cSAndroid Build Coastguard Worker leveldb_iterator_t* result = new leveldb_iterator_t;
222*9507f98cSAndroid Build Coastguard Worker result->rep = db->rep->NewIterator(options->rep);
223*9507f98cSAndroid Build Coastguard Worker return result;
224*9507f98cSAndroid Build Coastguard Worker }
225*9507f98cSAndroid Build Coastguard Worker
leveldb_create_snapshot(leveldb_t * db)226*9507f98cSAndroid Build Coastguard Worker const leveldb_snapshot_t* leveldb_create_snapshot(leveldb_t* db) {
227*9507f98cSAndroid Build Coastguard Worker leveldb_snapshot_t* result = new leveldb_snapshot_t;
228*9507f98cSAndroid Build Coastguard Worker result->rep = db->rep->GetSnapshot();
229*9507f98cSAndroid Build Coastguard Worker return result;
230*9507f98cSAndroid Build Coastguard Worker }
231*9507f98cSAndroid Build Coastguard Worker
leveldb_release_snapshot(leveldb_t * db,const leveldb_snapshot_t * snapshot)232*9507f98cSAndroid Build Coastguard Worker void leveldb_release_snapshot(leveldb_t* db,
233*9507f98cSAndroid Build Coastguard Worker const leveldb_snapshot_t* snapshot) {
234*9507f98cSAndroid Build Coastguard Worker db->rep->ReleaseSnapshot(snapshot->rep);
235*9507f98cSAndroid Build Coastguard Worker delete snapshot;
236*9507f98cSAndroid Build Coastguard Worker }
237*9507f98cSAndroid Build Coastguard Worker
leveldb_property_value(leveldb_t * db,const char * propname)238*9507f98cSAndroid Build Coastguard Worker char* leveldb_property_value(leveldb_t* db, const char* propname) {
239*9507f98cSAndroid Build Coastguard Worker std::string tmp;
240*9507f98cSAndroid Build Coastguard Worker if (db->rep->GetProperty(Slice(propname), &tmp)) {
241*9507f98cSAndroid Build Coastguard Worker // We use strdup() since we expect human readable output.
242*9507f98cSAndroid Build Coastguard Worker return strdup(tmp.c_str());
243*9507f98cSAndroid Build Coastguard Worker } else {
244*9507f98cSAndroid Build Coastguard Worker return nullptr;
245*9507f98cSAndroid Build Coastguard Worker }
246*9507f98cSAndroid Build Coastguard Worker }
247*9507f98cSAndroid Build Coastguard Worker
leveldb_approximate_sizes(leveldb_t * db,int num_ranges,const char * const * range_start_key,const size_t * range_start_key_len,const char * const * range_limit_key,const size_t * range_limit_key_len,uint64_t * sizes)248*9507f98cSAndroid Build Coastguard Worker void leveldb_approximate_sizes(leveldb_t* db, int num_ranges,
249*9507f98cSAndroid Build Coastguard Worker const char* const* range_start_key,
250*9507f98cSAndroid Build Coastguard Worker const size_t* range_start_key_len,
251*9507f98cSAndroid Build Coastguard Worker const char* const* range_limit_key,
252*9507f98cSAndroid Build Coastguard Worker const size_t* range_limit_key_len,
253*9507f98cSAndroid Build Coastguard Worker uint64_t* sizes) {
254*9507f98cSAndroid Build Coastguard Worker Range* ranges = new Range[num_ranges];
255*9507f98cSAndroid Build Coastguard Worker for (int i = 0; i < num_ranges; i++) {
256*9507f98cSAndroid Build Coastguard Worker ranges[i].start = Slice(range_start_key[i], range_start_key_len[i]);
257*9507f98cSAndroid Build Coastguard Worker ranges[i].limit = Slice(range_limit_key[i], range_limit_key_len[i]);
258*9507f98cSAndroid Build Coastguard Worker }
259*9507f98cSAndroid Build Coastguard Worker db->rep->GetApproximateSizes(ranges, num_ranges, sizes);
260*9507f98cSAndroid Build Coastguard Worker delete[] ranges;
261*9507f98cSAndroid Build Coastguard Worker }
262*9507f98cSAndroid Build Coastguard Worker
leveldb_compact_range(leveldb_t * db,const char * start_key,size_t start_key_len,const char * limit_key,size_t limit_key_len)263*9507f98cSAndroid Build Coastguard Worker void leveldb_compact_range(leveldb_t* db, const char* start_key,
264*9507f98cSAndroid Build Coastguard Worker size_t start_key_len, const char* limit_key,
265*9507f98cSAndroid Build Coastguard Worker size_t limit_key_len) {
266*9507f98cSAndroid Build Coastguard Worker Slice a, b;
267*9507f98cSAndroid Build Coastguard Worker db->rep->CompactRange(
268*9507f98cSAndroid Build Coastguard Worker // Pass null Slice if corresponding "const char*" is null
269*9507f98cSAndroid Build Coastguard Worker (start_key ? (a = Slice(start_key, start_key_len), &a) : nullptr),
270*9507f98cSAndroid Build Coastguard Worker (limit_key ? (b = Slice(limit_key, limit_key_len), &b) : nullptr));
271*9507f98cSAndroid Build Coastguard Worker }
272*9507f98cSAndroid Build Coastguard Worker
leveldb_destroy_db(const leveldb_options_t * options,const char * name,char ** errptr)273*9507f98cSAndroid Build Coastguard Worker void leveldb_destroy_db(const leveldb_options_t* options, const char* name,
274*9507f98cSAndroid Build Coastguard Worker char** errptr) {
275*9507f98cSAndroid Build Coastguard Worker SaveError(errptr, DestroyDB(name, options->rep));
276*9507f98cSAndroid Build Coastguard Worker }
277*9507f98cSAndroid Build Coastguard Worker
leveldb_repair_db(const leveldb_options_t * options,const char * name,char ** errptr)278*9507f98cSAndroid Build Coastguard Worker void leveldb_repair_db(const leveldb_options_t* options, const char* name,
279*9507f98cSAndroid Build Coastguard Worker char** errptr) {
280*9507f98cSAndroid Build Coastguard Worker SaveError(errptr, RepairDB(name, options->rep));
281*9507f98cSAndroid Build Coastguard Worker }
282*9507f98cSAndroid Build Coastguard Worker
leveldb_iter_destroy(leveldb_iterator_t * iter)283*9507f98cSAndroid Build Coastguard Worker void leveldb_iter_destroy(leveldb_iterator_t* iter) {
284*9507f98cSAndroid Build Coastguard Worker delete iter->rep;
285*9507f98cSAndroid Build Coastguard Worker delete iter;
286*9507f98cSAndroid Build Coastguard Worker }
287*9507f98cSAndroid Build Coastguard Worker
leveldb_iter_valid(const leveldb_iterator_t * iter)288*9507f98cSAndroid Build Coastguard Worker uint8_t leveldb_iter_valid(const leveldb_iterator_t* iter) {
289*9507f98cSAndroid Build Coastguard Worker return iter->rep->Valid();
290*9507f98cSAndroid Build Coastguard Worker }
291*9507f98cSAndroid Build Coastguard Worker
leveldb_iter_seek_to_first(leveldb_iterator_t * iter)292*9507f98cSAndroid Build Coastguard Worker void leveldb_iter_seek_to_first(leveldb_iterator_t* iter) {
293*9507f98cSAndroid Build Coastguard Worker iter->rep->SeekToFirst();
294*9507f98cSAndroid Build Coastguard Worker }
295*9507f98cSAndroid Build Coastguard Worker
leveldb_iter_seek_to_last(leveldb_iterator_t * iter)296*9507f98cSAndroid Build Coastguard Worker void leveldb_iter_seek_to_last(leveldb_iterator_t* iter) {
297*9507f98cSAndroid Build Coastguard Worker iter->rep->SeekToLast();
298*9507f98cSAndroid Build Coastguard Worker }
299*9507f98cSAndroid Build Coastguard Worker
leveldb_iter_seek(leveldb_iterator_t * iter,const char * k,size_t klen)300*9507f98cSAndroid Build Coastguard Worker void leveldb_iter_seek(leveldb_iterator_t* iter, const char* k, size_t klen) {
301*9507f98cSAndroid Build Coastguard Worker iter->rep->Seek(Slice(k, klen));
302*9507f98cSAndroid Build Coastguard Worker }
303*9507f98cSAndroid Build Coastguard Worker
leveldb_iter_next(leveldb_iterator_t * iter)304*9507f98cSAndroid Build Coastguard Worker void leveldb_iter_next(leveldb_iterator_t* iter) { iter->rep->Next(); }
305*9507f98cSAndroid Build Coastguard Worker
leveldb_iter_prev(leveldb_iterator_t * iter)306*9507f98cSAndroid Build Coastguard Worker void leveldb_iter_prev(leveldb_iterator_t* iter) { iter->rep->Prev(); }
307*9507f98cSAndroid Build Coastguard Worker
leveldb_iter_key(const leveldb_iterator_t * iter,size_t * klen)308*9507f98cSAndroid Build Coastguard Worker const char* leveldb_iter_key(const leveldb_iterator_t* iter, size_t* klen) {
309*9507f98cSAndroid Build Coastguard Worker Slice s = iter->rep->key();
310*9507f98cSAndroid Build Coastguard Worker *klen = s.size();
311*9507f98cSAndroid Build Coastguard Worker return s.data();
312*9507f98cSAndroid Build Coastguard Worker }
313*9507f98cSAndroid Build Coastguard Worker
leveldb_iter_value(const leveldb_iterator_t * iter,size_t * vlen)314*9507f98cSAndroid Build Coastguard Worker const char* leveldb_iter_value(const leveldb_iterator_t* iter, size_t* vlen) {
315*9507f98cSAndroid Build Coastguard Worker Slice s = iter->rep->value();
316*9507f98cSAndroid Build Coastguard Worker *vlen = s.size();
317*9507f98cSAndroid Build Coastguard Worker return s.data();
318*9507f98cSAndroid Build Coastguard Worker }
319*9507f98cSAndroid Build Coastguard Worker
leveldb_iter_get_error(const leveldb_iterator_t * iter,char ** errptr)320*9507f98cSAndroid Build Coastguard Worker void leveldb_iter_get_error(const leveldb_iterator_t* iter, char** errptr) {
321*9507f98cSAndroid Build Coastguard Worker SaveError(errptr, iter->rep->status());
322*9507f98cSAndroid Build Coastguard Worker }
323*9507f98cSAndroid Build Coastguard Worker
leveldb_writebatch_create()324*9507f98cSAndroid Build Coastguard Worker leveldb_writebatch_t* leveldb_writebatch_create() {
325*9507f98cSAndroid Build Coastguard Worker return new leveldb_writebatch_t;
326*9507f98cSAndroid Build Coastguard Worker }
327*9507f98cSAndroid Build Coastguard Worker
leveldb_writebatch_destroy(leveldb_writebatch_t * b)328*9507f98cSAndroid Build Coastguard Worker void leveldb_writebatch_destroy(leveldb_writebatch_t* b) { delete b; }
329*9507f98cSAndroid Build Coastguard Worker
leveldb_writebatch_clear(leveldb_writebatch_t * b)330*9507f98cSAndroid Build Coastguard Worker void leveldb_writebatch_clear(leveldb_writebatch_t* b) { b->rep.Clear(); }
331*9507f98cSAndroid Build Coastguard Worker
leveldb_writebatch_put(leveldb_writebatch_t * b,const char * key,size_t klen,const char * val,size_t vlen)332*9507f98cSAndroid Build Coastguard Worker void leveldb_writebatch_put(leveldb_writebatch_t* b, const char* key,
333*9507f98cSAndroid Build Coastguard Worker size_t klen, const char* val, size_t vlen) {
334*9507f98cSAndroid Build Coastguard Worker b->rep.Put(Slice(key, klen), Slice(val, vlen));
335*9507f98cSAndroid Build Coastguard Worker }
336*9507f98cSAndroid Build Coastguard Worker
leveldb_writebatch_delete(leveldb_writebatch_t * b,const char * key,size_t klen)337*9507f98cSAndroid Build Coastguard Worker void leveldb_writebatch_delete(leveldb_writebatch_t* b, const char* key,
338*9507f98cSAndroid Build Coastguard Worker size_t klen) {
339*9507f98cSAndroid Build Coastguard Worker b->rep.Delete(Slice(key, klen));
340*9507f98cSAndroid Build Coastguard Worker }
341*9507f98cSAndroid Build Coastguard Worker
leveldb_writebatch_iterate(const leveldb_writebatch_t * b,void * state,void (* put)(void *,const char * k,size_t klen,const char * v,size_t vlen),void (* deleted)(void *,const char * k,size_t klen))342*9507f98cSAndroid Build Coastguard Worker void leveldb_writebatch_iterate(const leveldb_writebatch_t* b, void* state,
343*9507f98cSAndroid Build Coastguard Worker void (*put)(void*, const char* k, size_t klen,
344*9507f98cSAndroid Build Coastguard Worker const char* v, size_t vlen),
345*9507f98cSAndroid Build Coastguard Worker void (*deleted)(void*, const char* k,
346*9507f98cSAndroid Build Coastguard Worker size_t klen)) {
347*9507f98cSAndroid Build Coastguard Worker class H : public WriteBatch::Handler {
348*9507f98cSAndroid Build Coastguard Worker public:
349*9507f98cSAndroid Build Coastguard Worker void* state_;
350*9507f98cSAndroid Build Coastguard Worker void (*put_)(void*, const char* k, size_t klen, const char* v, size_t vlen);
351*9507f98cSAndroid Build Coastguard Worker void (*deleted_)(void*, const char* k, size_t klen);
352*9507f98cSAndroid Build Coastguard Worker void Put(const Slice& key, const Slice& value) override {
353*9507f98cSAndroid Build Coastguard Worker (*put_)(state_, key.data(), key.size(), value.data(), value.size());
354*9507f98cSAndroid Build Coastguard Worker }
355*9507f98cSAndroid Build Coastguard Worker void Delete(const Slice& key) override {
356*9507f98cSAndroid Build Coastguard Worker (*deleted_)(state_, key.data(), key.size());
357*9507f98cSAndroid Build Coastguard Worker }
358*9507f98cSAndroid Build Coastguard Worker };
359*9507f98cSAndroid Build Coastguard Worker H handler;
360*9507f98cSAndroid Build Coastguard Worker handler.state_ = state;
361*9507f98cSAndroid Build Coastguard Worker handler.put_ = put;
362*9507f98cSAndroid Build Coastguard Worker handler.deleted_ = deleted;
363*9507f98cSAndroid Build Coastguard Worker b->rep.Iterate(&handler);
364*9507f98cSAndroid Build Coastguard Worker }
365*9507f98cSAndroid Build Coastguard Worker
leveldb_writebatch_append(leveldb_writebatch_t * destination,const leveldb_writebatch_t * source)366*9507f98cSAndroid Build Coastguard Worker void leveldb_writebatch_append(leveldb_writebatch_t* destination,
367*9507f98cSAndroid Build Coastguard Worker const leveldb_writebatch_t* source) {
368*9507f98cSAndroid Build Coastguard Worker destination->rep.Append(source->rep);
369*9507f98cSAndroid Build Coastguard Worker }
370*9507f98cSAndroid Build Coastguard Worker
leveldb_options_create()371*9507f98cSAndroid Build Coastguard Worker leveldb_options_t* leveldb_options_create() { return new leveldb_options_t; }
372*9507f98cSAndroid Build Coastguard Worker
leveldb_options_destroy(leveldb_options_t * options)373*9507f98cSAndroid Build Coastguard Worker void leveldb_options_destroy(leveldb_options_t* options) { delete options; }
374*9507f98cSAndroid Build Coastguard Worker
leveldb_options_set_comparator(leveldb_options_t * opt,leveldb_comparator_t * cmp)375*9507f98cSAndroid Build Coastguard Worker void leveldb_options_set_comparator(leveldb_options_t* opt,
376*9507f98cSAndroid Build Coastguard Worker leveldb_comparator_t* cmp) {
377*9507f98cSAndroid Build Coastguard Worker opt->rep.comparator = cmp;
378*9507f98cSAndroid Build Coastguard Worker }
379*9507f98cSAndroid Build Coastguard Worker
leveldb_options_set_filter_policy(leveldb_options_t * opt,leveldb_filterpolicy_t * policy)380*9507f98cSAndroid Build Coastguard Worker void leveldb_options_set_filter_policy(leveldb_options_t* opt,
381*9507f98cSAndroid Build Coastguard Worker leveldb_filterpolicy_t* policy) {
382*9507f98cSAndroid Build Coastguard Worker opt->rep.filter_policy = policy;
383*9507f98cSAndroid Build Coastguard Worker }
384*9507f98cSAndroid Build Coastguard Worker
leveldb_options_set_create_if_missing(leveldb_options_t * opt,uint8_t v)385*9507f98cSAndroid Build Coastguard Worker void leveldb_options_set_create_if_missing(leveldb_options_t* opt, uint8_t v) {
386*9507f98cSAndroid Build Coastguard Worker opt->rep.create_if_missing = v;
387*9507f98cSAndroid Build Coastguard Worker }
388*9507f98cSAndroid Build Coastguard Worker
leveldb_options_set_error_if_exists(leveldb_options_t * opt,uint8_t v)389*9507f98cSAndroid Build Coastguard Worker void leveldb_options_set_error_if_exists(leveldb_options_t* opt, uint8_t v) {
390*9507f98cSAndroid Build Coastguard Worker opt->rep.error_if_exists = v;
391*9507f98cSAndroid Build Coastguard Worker }
392*9507f98cSAndroid Build Coastguard Worker
leveldb_options_set_paranoid_checks(leveldb_options_t * opt,uint8_t v)393*9507f98cSAndroid Build Coastguard Worker void leveldb_options_set_paranoid_checks(leveldb_options_t* opt, uint8_t v) {
394*9507f98cSAndroid Build Coastguard Worker opt->rep.paranoid_checks = v;
395*9507f98cSAndroid Build Coastguard Worker }
396*9507f98cSAndroid Build Coastguard Worker
leveldb_options_set_env(leveldb_options_t * opt,leveldb_env_t * env)397*9507f98cSAndroid Build Coastguard Worker void leveldb_options_set_env(leveldb_options_t* opt, leveldb_env_t* env) {
398*9507f98cSAndroid Build Coastguard Worker opt->rep.env = (env ? env->rep : nullptr);
399*9507f98cSAndroid Build Coastguard Worker }
400*9507f98cSAndroid Build Coastguard Worker
leveldb_options_set_info_log(leveldb_options_t * opt,leveldb_logger_t * l)401*9507f98cSAndroid Build Coastguard Worker void leveldb_options_set_info_log(leveldb_options_t* opt, leveldb_logger_t* l) {
402*9507f98cSAndroid Build Coastguard Worker opt->rep.info_log = (l ? l->rep : nullptr);
403*9507f98cSAndroid Build Coastguard Worker }
404*9507f98cSAndroid Build Coastguard Worker
leveldb_options_set_write_buffer_size(leveldb_options_t * opt,size_t s)405*9507f98cSAndroid Build Coastguard Worker void leveldb_options_set_write_buffer_size(leveldb_options_t* opt, size_t s) {
406*9507f98cSAndroid Build Coastguard Worker opt->rep.write_buffer_size = s;
407*9507f98cSAndroid Build Coastguard Worker }
408*9507f98cSAndroid Build Coastguard Worker
leveldb_options_set_max_open_files(leveldb_options_t * opt,int n)409*9507f98cSAndroid Build Coastguard Worker void leveldb_options_set_max_open_files(leveldb_options_t* opt, int n) {
410*9507f98cSAndroid Build Coastguard Worker opt->rep.max_open_files = n;
411*9507f98cSAndroid Build Coastguard Worker }
412*9507f98cSAndroid Build Coastguard Worker
leveldb_options_set_cache(leveldb_options_t * opt,leveldb_cache_t * c)413*9507f98cSAndroid Build Coastguard Worker void leveldb_options_set_cache(leveldb_options_t* opt, leveldb_cache_t* c) {
414*9507f98cSAndroid Build Coastguard Worker opt->rep.block_cache = c->rep;
415*9507f98cSAndroid Build Coastguard Worker }
416*9507f98cSAndroid Build Coastguard Worker
leveldb_options_set_block_size(leveldb_options_t * opt,size_t s)417*9507f98cSAndroid Build Coastguard Worker void leveldb_options_set_block_size(leveldb_options_t* opt, size_t s) {
418*9507f98cSAndroid Build Coastguard Worker opt->rep.block_size = s;
419*9507f98cSAndroid Build Coastguard Worker }
420*9507f98cSAndroid Build Coastguard Worker
leveldb_options_set_block_restart_interval(leveldb_options_t * opt,int n)421*9507f98cSAndroid Build Coastguard Worker void leveldb_options_set_block_restart_interval(leveldb_options_t* opt, int n) {
422*9507f98cSAndroid Build Coastguard Worker opt->rep.block_restart_interval = n;
423*9507f98cSAndroid Build Coastguard Worker }
424*9507f98cSAndroid Build Coastguard Worker
leveldb_options_set_max_file_size(leveldb_options_t * opt,size_t s)425*9507f98cSAndroid Build Coastguard Worker void leveldb_options_set_max_file_size(leveldb_options_t* opt, size_t s) {
426*9507f98cSAndroid Build Coastguard Worker opt->rep.max_file_size = s;
427*9507f98cSAndroid Build Coastguard Worker }
428*9507f98cSAndroid Build Coastguard Worker
leveldb_options_set_compression(leveldb_options_t * opt,int t)429*9507f98cSAndroid Build Coastguard Worker void leveldb_options_set_compression(leveldb_options_t* opt, int t) {
430*9507f98cSAndroid Build Coastguard Worker opt->rep.compression = static_cast<CompressionType>(t);
431*9507f98cSAndroid Build Coastguard Worker }
432*9507f98cSAndroid Build Coastguard Worker
leveldb_comparator_create(void * state,void (* destructor)(void *),int (* compare)(void *,const char * a,size_t alen,const char * b,size_t blen),const char * (* name)(void *))433*9507f98cSAndroid Build Coastguard Worker leveldb_comparator_t* leveldb_comparator_create(
434*9507f98cSAndroid Build Coastguard Worker void* state, void (*destructor)(void*),
435*9507f98cSAndroid Build Coastguard Worker int (*compare)(void*, const char* a, size_t alen, const char* b,
436*9507f98cSAndroid Build Coastguard Worker size_t blen),
437*9507f98cSAndroid Build Coastguard Worker const char* (*name)(void*)) {
438*9507f98cSAndroid Build Coastguard Worker leveldb_comparator_t* result = new leveldb_comparator_t;
439*9507f98cSAndroid Build Coastguard Worker result->state_ = state;
440*9507f98cSAndroid Build Coastguard Worker result->destructor_ = destructor;
441*9507f98cSAndroid Build Coastguard Worker result->compare_ = compare;
442*9507f98cSAndroid Build Coastguard Worker result->name_ = name;
443*9507f98cSAndroid Build Coastguard Worker return result;
444*9507f98cSAndroid Build Coastguard Worker }
445*9507f98cSAndroid Build Coastguard Worker
leveldb_comparator_destroy(leveldb_comparator_t * cmp)446*9507f98cSAndroid Build Coastguard Worker void leveldb_comparator_destroy(leveldb_comparator_t* cmp) { delete cmp; }
447*9507f98cSAndroid Build Coastguard Worker
leveldb_filterpolicy_create(void * state,void (* destructor)(void *),char * (* create_filter)(void *,const char * const * key_array,const size_t * key_length_array,int num_keys,size_t * filter_length),uint8_t (* key_may_match)(void *,const char * key,size_t length,const char * filter,size_t filter_length),const char * (* name)(void *))448*9507f98cSAndroid Build Coastguard Worker leveldb_filterpolicy_t* leveldb_filterpolicy_create(
449*9507f98cSAndroid Build Coastguard Worker void* state, void (*destructor)(void*),
450*9507f98cSAndroid Build Coastguard Worker char* (*create_filter)(void*, const char* const* key_array,
451*9507f98cSAndroid Build Coastguard Worker const size_t* key_length_array, int num_keys,
452*9507f98cSAndroid Build Coastguard Worker size_t* filter_length),
453*9507f98cSAndroid Build Coastguard Worker uint8_t (*key_may_match)(void*, const char* key, size_t length,
454*9507f98cSAndroid Build Coastguard Worker const char* filter, size_t filter_length),
455*9507f98cSAndroid Build Coastguard Worker const char* (*name)(void*)) {
456*9507f98cSAndroid Build Coastguard Worker leveldb_filterpolicy_t* result = new leveldb_filterpolicy_t;
457*9507f98cSAndroid Build Coastguard Worker result->state_ = state;
458*9507f98cSAndroid Build Coastguard Worker result->destructor_ = destructor;
459*9507f98cSAndroid Build Coastguard Worker result->create_ = create_filter;
460*9507f98cSAndroid Build Coastguard Worker result->key_match_ = key_may_match;
461*9507f98cSAndroid Build Coastguard Worker result->name_ = name;
462*9507f98cSAndroid Build Coastguard Worker return result;
463*9507f98cSAndroid Build Coastguard Worker }
464*9507f98cSAndroid Build Coastguard Worker
leveldb_filterpolicy_destroy(leveldb_filterpolicy_t * filter)465*9507f98cSAndroid Build Coastguard Worker void leveldb_filterpolicy_destroy(leveldb_filterpolicy_t* filter) {
466*9507f98cSAndroid Build Coastguard Worker delete filter;
467*9507f98cSAndroid Build Coastguard Worker }
468*9507f98cSAndroid Build Coastguard Worker
leveldb_filterpolicy_create_bloom(int bits_per_key)469*9507f98cSAndroid Build Coastguard Worker leveldb_filterpolicy_t* leveldb_filterpolicy_create_bloom(int bits_per_key) {
470*9507f98cSAndroid Build Coastguard Worker // Make a leveldb_filterpolicy_t, but override all of its methods so
471*9507f98cSAndroid Build Coastguard Worker // they delegate to a NewBloomFilterPolicy() instead of user
472*9507f98cSAndroid Build Coastguard Worker // supplied C functions.
473*9507f98cSAndroid Build Coastguard Worker struct Wrapper : public leveldb_filterpolicy_t {
474*9507f98cSAndroid Build Coastguard Worker static void DoNothing(void*) {}
475*9507f98cSAndroid Build Coastguard Worker
476*9507f98cSAndroid Build Coastguard Worker ~Wrapper() { delete rep_; }
477*9507f98cSAndroid Build Coastguard Worker const char* Name() const { return rep_->Name(); }
478*9507f98cSAndroid Build Coastguard Worker void CreateFilter(const Slice* keys, int n, std::string* dst) const {
479*9507f98cSAndroid Build Coastguard Worker return rep_->CreateFilter(keys, n, dst);
480*9507f98cSAndroid Build Coastguard Worker }
481*9507f98cSAndroid Build Coastguard Worker bool KeyMayMatch(const Slice& key, const Slice& filter) const {
482*9507f98cSAndroid Build Coastguard Worker return rep_->KeyMayMatch(key, filter);
483*9507f98cSAndroid Build Coastguard Worker }
484*9507f98cSAndroid Build Coastguard Worker
485*9507f98cSAndroid Build Coastguard Worker const FilterPolicy* rep_;
486*9507f98cSAndroid Build Coastguard Worker };
487*9507f98cSAndroid Build Coastguard Worker Wrapper* wrapper = new Wrapper;
488*9507f98cSAndroid Build Coastguard Worker wrapper->rep_ = NewBloomFilterPolicy(bits_per_key);
489*9507f98cSAndroid Build Coastguard Worker wrapper->state_ = nullptr;
490*9507f98cSAndroid Build Coastguard Worker wrapper->destructor_ = &Wrapper::DoNothing;
491*9507f98cSAndroid Build Coastguard Worker return wrapper;
492*9507f98cSAndroid Build Coastguard Worker }
493*9507f98cSAndroid Build Coastguard Worker
leveldb_readoptions_create()494*9507f98cSAndroid Build Coastguard Worker leveldb_readoptions_t* leveldb_readoptions_create() {
495*9507f98cSAndroid Build Coastguard Worker return new leveldb_readoptions_t;
496*9507f98cSAndroid Build Coastguard Worker }
497*9507f98cSAndroid Build Coastguard Worker
leveldb_readoptions_destroy(leveldb_readoptions_t * opt)498*9507f98cSAndroid Build Coastguard Worker void leveldb_readoptions_destroy(leveldb_readoptions_t* opt) { delete opt; }
499*9507f98cSAndroid Build Coastguard Worker
leveldb_readoptions_set_verify_checksums(leveldb_readoptions_t * opt,uint8_t v)500*9507f98cSAndroid Build Coastguard Worker void leveldb_readoptions_set_verify_checksums(leveldb_readoptions_t* opt,
501*9507f98cSAndroid Build Coastguard Worker uint8_t v) {
502*9507f98cSAndroid Build Coastguard Worker opt->rep.verify_checksums = v;
503*9507f98cSAndroid Build Coastguard Worker }
504*9507f98cSAndroid Build Coastguard Worker
leveldb_readoptions_set_fill_cache(leveldb_readoptions_t * opt,uint8_t v)505*9507f98cSAndroid Build Coastguard Worker void leveldb_readoptions_set_fill_cache(leveldb_readoptions_t* opt, uint8_t v) {
506*9507f98cSAndroid Build Coastguard Worker opt->rep.fill_cache = v;
507*9507f98cSAndroid Build Coastguard Worker }
508*9507f98cSAndroid Build Coastguard Worker
leveldb_readoptions_set_snapshot(leveldb_readoptions_t * opt,const leveldb_snapshot_t * snap)509*9507f98cSAndroid Build Coastguard Worker void leveldb_readoptions_set_snapshot(leveldb_readoptions_t* opt,
510*9507f98cSAndroid Build Coastguard Worker const leveldb_snapshot_t* snap) {
511*9507f98cSAndroid Build Coastguard Worker opt->rep.snapshot = (snap ? snap->rep : nullptr);
512*9507f98cSAndroid Build Coastguard Worker }
513*9507f98cSAndroid Build Coastguard Worker
leveldb_writeoptions_create()514*9507f98cSAndroid Build Coastguard Worker leveldb_writeoptions_t* leveldb_writeoptions_create() {
515*9507f98cSAndroid Build Coastguard Worker return new leveldb_writeoptions_t;
516*9507f98cSAndroid Build Coastguard Worker }
517*9507f98cSAndroid Build Coastguard Worker
leveldb_writeoptions_destroy(leveldb_writeoptions_t * opt)518*9507f98cSAndroid Build Coastguard Worker void leveldb_writeoptions_destroy(leveldb_writeoptions_t* opt) { delete opt; }
519*9507f98cSAndroid Build Coastguard Worker
leveldb_writeoptions_set_sync(leveldb_writeoptions_t * opt,uint8_t v)520*9507f98cSAndroid Build Coastguard Worker void leveldb_writeoptions_set_sync(leveldb_writeoptions_t* opt, uint8_t v) {
521*9507f98cSAndroid Build Coastguard Worker opt->rep.sync = v;
522*9507f98cSAndroid Build Coastguard Worker }
523*9507f98cSAndroid Build Coastguard Worker
leveldb_cache_create_lru(size_t capacity)524*9507f98cSAndroid Build Coastguard Worker leveldb_cache_t* leveldb_cache_create_lru(size_t capacity) {
525*9507f98cSAndroid Build Coastguard Worker leveldb_cache_t* c = new leveldb_cache_t;
526*9507f98cSAndroid Build Coastguard Worker c->rep = NewLRUCache(capacity);
527*9507f98cSAndroid Build Coastguard Worker return c;
528*9507f98cSAndroid Build Coastguard Worker }
529*9507f98cSAndroid Build Coastguard Worker
leveldb_cache_destroy(leveldb_cache_t * cache)530*9507f98cSAndroid Build Coastguard Worker void leveldb_cache_destroy(leveldb_cache_t* cache) {
531*9507f98cSAndroid Build Coastguard Worker delete cache->rep;
532*9507f98cSAndroid Build Coastguard Worker delete cache;
533*9507f98cSAndroid Build Coastguard Worker }
534*9507f98cSAndroid Build Coastguard Worker
leveldb_create_default_env()535*9507f98cSAndroid Build Coastguard Worker leveldb_env_t* leveldb_create_default_env() {
536*9507f98cSAndroid Build Coastguard Worker leveldb_env_t* result = new leveldb_env_t;
537*9507f98cSAndroid Build Coastguard Worker result->rep = Env::Default();
538*9507f98cSAndroid Build Coastguard Worker result->is_default = true;
539*9507f98cSAndroid Build Coastguard Worker return result;
540*9507f98cSAndroid Build Coastguard Worker }
541*9507f98cSAndroid Build Coastguard Worker
leveldb_env_destroy(leveldb_env_t * env)542*9507f98cSAndroid Build Coastguard Worker void leveldb_env_destroy(leveldb_env_t* env) {
543*9507f98cSAndroid Build Coastguard Worker if (!env->is_default) delete env->rep;
544*9507f98cSAndroid Build Coastguard Worker delete env;
545*9507f98cSAndroid Build Coastguard Worker }
546*9507f98cSAndroid Build Coastguard Worker
leveldb_env_get_test_directory(leveldb_env_t * env)547*9507f98cSAndroid Build Coastguard Worker char* leveldb_env_get_test_directory(leveldb_env_t* env) {
548*9507f98cSAndroid Build Coastguard Worker std::string result;
549*9507f98cSAndroid Build Coastguard Worker if (!env->rep->GetTestDirectory(&result).ok()) {
550*9507f98cSAndroid Build Coastguard Worker return nullptr;
551*9507f98cSAndroid Build Coastguard Worker }
552*9507f98cSAndroid Build Coastguard Worker
553*9507f98cSAndroid Build Coastguard Worker char* buffer = static_cast<char*>(std::malloc(result.size() + 1));
554*9507f98cSAndroid Build Coastguard Worker std::memcpy(buffer, result.data(), result.size());
555*9507f98cSAndroid Build Coastguard Worker buffer[result.size()] = '\0';
556*9507f98cSAndroid Build Coastguard Worker return buffer;
557*9507f98cSAndroid Build Coastguard Worker }
558*9507f98cSAndroid Build Coastguard Worker
leveldb_free(void * ptr)559*9507f98cSAndroid Build Coastguard Worker void leveldb_free(void* ptr) { std::free(ptr); }
560*9507f98cSAndroid Build Coastguard Worker
leveldb_major_version()561*9507f98cSAndroid Build Coastguard Worker int leveldb_major_version() { return kMajorVersion; }
562*9507f98cSAndroid Build Coastguard Worker
leveldb_minor_version()563*9507f98cSAndroid Build Coastguard Worker int leveldb_minor_version() { return kMinorVersion; }
564*9507f98cSAndroid Build Coastguard Worker
565*9507f98cSAndroid Build Coastguard Worker } // end extern "C"
566