11
11
12
12
#include < map>
13
13
#include < vector>
14
+ #include < array>
15
+ #include < memory>
14
16
15
17
/* *
16
18
* Forward declarations.
@@ -249,6 +251,37 @@ static size_t StringOrBufferLength (napi_env env, napi_value value) {
249
251
return size;
250
252
}
251
253
254
+ struct NapiSlice {
255
+ NapiSlice (napi_env env, napi_value from) {
256
+ if (IsString (env, from)) {
257
+ NAPI_STATUS_THROWS_VOID (napi_get_value_string_utf8 (env, from, nullptr , 0 , &size_));
258
+ char * data;
259
+ if (size_ + 1 < stack_.size ()) {
260
+ data = stack_.data ();
261
+ } else {
262
+ heap_.reset (new char [size_ + 1 ]);
263
+ data = heap_.get ();
264
+ }
265
+ data[size_] = 0 ;
266
+ NAPI_STATUS_THROWS_VOID (napi_get_value_string_utf8 (env, from, data, size_ + 1 , &size_));
267
+ data_ = data;
268
+ } else if (IsBuffer (env, from)) {
269
+ void * data;
270
+ NAPI_STATUS_THROWS_VOID (napi_get_buffer_info (env, from, &data, &size_));
271
+ data_ = static_cast <char *>(data);
272
+ }
273
+ }
274
+
275
+ operator leveldb::Slice () const {
276
+ return leveldb::Slice (data_, size_);
277
+ }
278
+
279
+ std::unique_ptr<char []> heap_;
280
+ std::array<char , 1024 > stack_;
281
+ char * data_;
282
+ size_t size_;
283
+ };
284
+
252
285
/* *
253
286
* Takes a Buffer or string property 'name' from 'opts'.
254
287
* Returns null if the property does not exist or is zero-length.
@@ -1977,11 +2010,9 @@ NAPI_METHOD(batch_put) {
1977
2010
NAPI_ARGV (3 );
1978
2011
NAPI_BATCH_CONTEXT ();
1979
2012
1980
- leveldb::Slice key = ToSlice (env, argv[1 ]);
1981
- leveldb::Slice value = ToSlice (env, argv[2 ]);
2013
+ const auto key = NapiSlice (env, argv[1 ]);
2014
+ const auto value = NapiSlice (env, argv[2 ]);
1982
2015
batch->Put (key, value);
1983
- DisposeSliceBuffer (key);
1984
- DisposeSliceBuffer (value);
1985
2016
1986
2017
NAPI_RETURN_UNDEFINED ();
1987
2018
}
@@ -1993,9 +2024,8 @@ NAPI_METHOD(batch_del) {
1993
2024
NAPI_ARGV (2 );
1994
2025
NAPI_BATCH_CONTEXT ();
1995
2026
1996
- leveldb::Slice key = ToSlice (env, argv[1 ]);
2027
+ const auto key = NapiSlice (env, argv[1 ]);
1997
2028
batch->Del (key);
1998
- DisposeSliceBuffer (key);
1999
2029
2000
2030
NAPI_RETURN_UNDEFINED ();
2001
2031
}
0 commit comments