From dadfc49fb12066c37d9fc24e3f0b6961e912156e Mon Sep 17 00:00:00 2001 From: Dmitriy Gorokh Date: Sat, 17 Jun 2017 22:55:38 +0300 Subject: [PATCH 1/3] Update node-lmdb.h --- src/node-lmdb.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/node-lmdb.h b/src/node-lmdb.h index 33abbde471..5242883daf 100644 --- a/src/node-lmdb.h +++ b/src/node-lmdb.h @@ -61,6 +61,8 @@ void setupExportMisc(Handle exports); // Helper callback typedef void (*argtokey_callback_t)(MDB_val &key); +int utf16_cmp_func(const MDB_val *a, const MDB_val *b); + void consoleLog(Local val); void consoleLog(const char *msg); void consoleLogN(int n); From 8f96a8474f8a69ddb96d86337c023d79fe72dd21 Mon Sep 17 00:00:00 2001 From: Dmitriy Gorokh Date: Sat, 17 Jun 2017 22:56:55 +0300 Subject: [PATCH 2/3] Update misc.cpp --- src/misc.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/misc.cpp b/src/misc.cpp index f271983639..9028766970 100644 --- a/src/misc.cpp +++ b/src/misc.cpp @@ -305,3 +305,16 @@ const uint16_t *CustomExternalStringResource::data() const { size_t CustomExternalStringResource::length() const { return this->l; } + +int utf16_cmp_func(const MDB_val *a, const MDB_val *b) { + size_t len = (b->mv_size > a->mv_size ? a->mv_size >> 1 : b->mv_size >> 1) - 1; + uint16_t charA, charB; + for (size_t i = 0; i < len; i++) { + charA = *((uint16_t*)a->mv_data + i); + charB = *((uint16_t*)b->mv_data + i); + if (charA != charB) { + return (charA - charB); + } + } + return a->mv_size == b->mv_size ? 0 : a->mv_size - b->mv_size; +} From dd60e8ab0d78effafa185a47bdb20464e39640a2 Mon Sep 17 00:00:00 2001 From: Dmitriy Gorokh Date: Sat, 17 Jun 2017 22:58:24 +0300 Subject: [PATCH 3/3] Update dbi.cpp --- src/dbi.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/dbi.cpp b/src/dbi.cpp index b381abf22f..c427ff16c5 100644 --- a/src/dbi.cpp +++ b/src/dbi.cpp @@ -138,6 +138,9 @@ NAN_METHOD(DbiWrap::ctor) { } else { isOpen = true; + if (keyType == NodeLmdbKeyType::StringKey) { + rc = mdb_set_compare(txn, dbi, utf16_cmp_func); + } } if (needsTransaction) {