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) { 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; +} 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);