1111
1212#include < map>
1313#include < vector>
14+ #include < array>
15+ #include < memory>
1416
1517/* *
1618 * Forward declarations.
@@ -249,6 +251,37 @@ static size_t StringOrBufferLength (napi_env env, napi_value value) {
249251 return size;
250252}
251253
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+ char * data_;
280+ size_t size_;
281+ std::unique_ptr<char []> heap_;
282+ std::array<char , 1024 > stack_;
283+ };
284+
252285/* *
253286 * Takes a Buffer or string property 'name' from 'opts'.
254287 * Returns null if the property does not exist or is zero-length.
@@ -1977,11 +2010,9 @@ NAPI_METHOD(batch_put) {
19772010 NAPI_ARGV (3 );
19782011 NAPI_BATCH_CONTEXT ();
19792012
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 ]);
19822015 batch->Put (key, value);
1983- DisposeSliceBuffer (key);
1984- DisposeSliceBuffer (value);
19852016
19862017 NAPI_RETURN_UNDEFINED ();
19872018}
@@ -1993,9 +2024,8 @@ NAPI_METHOD(batch_del) {
19932024 NAPI_ARGV (2 );
19942025 NAPI_BATCH_CONTEXT ();
19952026
1996- leveldb::Slice key = ToSlice (env, argv[1 ]);
2027+ const auto key = NapiSlice (env, argv[1 ]);
19972028 batch->Del (key);
1998- DisposeSliceBuffer (key);
19992029
20002030 NAPI_RETURN_UNDEFINED ();
20012031}
0 commit comments