@@ -304,29 +304,30 @@ typedef struct my_key_s {
304304 };
305305} my_key_t ;
306306
307- static bool get_mykey_from (ErlNifEnv * env , const ERL_NIF_TERM kt , my_key_t * mykey ) {
308- switch (enif_term_type (env , kt )) {
309- case ERL_NIF_TERM_TYPE_BITSTRING :
310- if (!enif_inspect_binary (env , kt , & mykey -> keyBin )) {
311- return false;
312- }
313- mykey -> key .mv_size = mykey -> keyBin .size ;
314- mykey -> key .mv_data = mykey -> keyBin .data ;
315- return true;
316- case ERL_NIF_TERM_TYPE_INTEGER :
317- if (!enif_get_int64 (env , kt , (ErlNifSInt64 * )& mykey -> keyInt )) {
318- return false;
319- }
320- mykey -> key .mv_size = sizeof (ErlNifSInt64 );
321- mykey -> key .mv_data = & mykey -> keyInt ;
322- mykey -> type = MDB_INTEGERKEY ;
323- return true;
324- default :
325- ERR_LOG ("unknow key type, only support int & string" );
326- return false;
307+ #define CHECKOUT_MYKEY (kt , mykey , label ) \
308+ switch (enif_term_type(env, kt)) { \
309+ case ERL_NIF_TERM_TYPE_BITSTRING: \
310+ if (!enif_inspect_binary(env, kt, &mykey.keyBin)) { \
311+ break; \
312+ } \
313+ mykey.key.mv_size = mykey.keyBin.size; \
314+ mykey.key.mv_data = mykey.keyBin.data; \
315+ mykey.type = 0; \
316+ break; \
317+ case ERL_NIF_TERM_TYPE_INTEGER: \
318+ if (!enif_get_int64(env, kt, (ErlNifSInt64*)&mykey.keyInt)) {\
319+ break; \
320+ } \
321+ mykey.key.mv_size = sizeof(ErlNifSInt64); \
322+ mykey.key.mv_data = &mykey.keyInt; \
323+ mykey.type = MDB_INTEGERKEY; \
324+ break; \
325+ default: \
326+ ERR_LOG("unknow key type, only support int & string"); \
327+ err = enif_make_badarg(env); \
328+ goto label; \
327329 }
328330
329- }
330331
331332static ERL_NIF_TERM elmdb_put (ErlNifEnv * env , int argc , const ERL_NIF_TERM argv []) {
332333 __UNUSED (argc );
@@ -344,18 +345,16 @@ static ERL_NIF_TERM elmdb_put(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[
344345 return enif_make_badarg (env );
345346 }
346347
348+ ERL_NIF_TERM err ;
347349 my_key_t mykey = { };
348- if (!get_mykey_from (env , laykey [1 ], & mykey )) {
349- return enif_make_badarg (env );
350- }
350+ CHECKOUT_MYKEY (laykey [1 ], mykey , err3 );
351351
352352 ErlNifBinary valTerm ;
353353 if (!enif_inspect_binary (env , argv [2 ], & valTerm )) {
354354 return enif_make_badarg (env );
355355 }
356356
357357 int ret ;
358- ERL_NIF_TERM err ;
359358
360359 MDB_txn * txn = NULL ;
361360 CHECK (mdb_txn_begin (handle -> env , NULL , 0 , & txn ), err2 );
@@ -431,10 +430,9 @@ static ERL_NIF_TERM elmdb_get(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[
431430 return enif_make_badarg (env );
432431 }
433432
433+ ERL_NIF_TERM err ;
434434 my_key_t mykey = { };
435- if (!get_mykey_from (env , laykey [1 ], & mykey )) {
436- return enif_make_badarg (env );
437- }
435+ CHECKOUT_MYKEY (laykey [1 ], mykey , err2 );
438436
439437 char dbname [SUBDB_NAME_SZ ] = {0 };
440438 memcpy (dbname , layBin .data , layBin .size );
@@ -448,16 +446,12 @@ static ERL_NIF_TERM elmdb_get(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[
448446 }
449447
450448 int ret ;
451- ERL_NIF_TERM err ;
452449
453450 MDB_txn * txn = NULL ;
454451 CHECK (mdb_txn_begin (handle -> env , NULL , MDB_RDONLY , & txn ), err2 );
455452 MDB_dbi dbi ;
456453 CHECK (mdb_dbi_open (txn , dbname , 0 , & dbi ), err1 );
457454
458- unsigned int ff = 0 ;
459- CHECK (mdb_dbi_flags (txn , dbi , & ff ), err1 );
460-
461455 MDB_val val ;
462456 CHECK ( mdb_get (txn , dbi , & mykey .key , & val ), err1 );
463457 mdb_txn_abort (txn );
@@ -559,13 +553,16 @@ static ERL_NIF_TERM elmdb_del(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[
559553 return enif_make_badarg (env );
560554 }
561555 ErlNifBinary layBin ;
562- ErlNifBinary keyBin ;
563556 if (arity != 2 ||
564- !enif_inspect_iolist_as_binary (env , laykey [0 ], & layBin ) ||
565- !enif_inspect_binary (env , laykey [1 ], & keyBin )) {
557+ !enif_inspect_iolist_as_binary (env , laykey [0 ], & layBin )) {
566558 return enif_make_badarg (env );
567559 }
568560
561+ ERL_NIF_TERM err ;
562+
563+ my_key_t mykey = { };
564+ CHECKOUT_MYKEY (laykey [1 ], mykey , err2 );
565+
569566 char dbname [SUBDB_NAME_SZ ] = {0 };
570567 memcpy (dbname , layBin .data , layBin .size );
571568 enif_rwlock_rlock (handle -> layers_rwlock );
@@ -577,18 +574,14 @@ static ERL_NIF_TERM elmdb_del(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[
577574 }
578575
579576 int ret ;
580- ERL_NIF_TERM err ;
581577
582578 MDB_txn * txn = NULL ;
583579 CHECK (mdb_txn_begin (handle -> env , NULL , 0 , & txn ), err2 );
584580 MDB_dbi dbi ;
585581 CHECK (mdb_dbi_open (txn , dbname , 0 , & dbi ), err1 );
586582 DBG ("open dbi: %d" , dbi );
587583
588- MDB_val key ;
589- key .mv_size = keyBin .size ;
590- key .mv_data = keyBin .data ;
591- CHECK ( mdb_del (txn , dbi , & key , NULL ), err1 );
584+ CHECK ( mdb_del (txn , dbi , & mykey .key , NULL ), err1 );
592585 mdb_txn_commit (txn );
593586 return argv [0 ];
594587
@@ -652,20 +645,14 @@ static ERL_NIF_TERM elmdb_range(ErlNifEnv* env, int argc, const ERL_NIF_TERM arg
652645 MDB_val val ;
653646
654647 my_key_t mykey = { };
655- if (!get_mykey_from (env , argv [2 ], & mykey )) {
656- err = enif_raise_exception (env , enif_make_string (env , "cannot extract key" , ERL_NIF_LATIN1 ));
657- goto err1 ;
658- }
648+ CHECKOUT_MYKEY (argv [2 ], mykey , err1 );
659649 MDB_val iterkey ;
660650 iterkey .mv_data = mykey .key .mv_data ;
661651 iterkey .mv_size = mykey .key .mv_size ;
662652
663653 my_key_t endkey = { };
664654 if (argc == 4 ) {
665- if (!get_mykey_from (env , argv [3 ], & endkey )) {
666- err = enif_raise_exception (env , enif_make_string (env , "cannot extract key" , ERL_NIF_LATIN1 ));
667- goto err1 ;
668- }
655+ CHECKOUT_MYKEY (argv [3 ], endkey , err1 );
669656 }
670657 else {
671658 CHECK (mdb_cursor_get (cur , & endkey .key , NULL , MDB_LAST ), err1 );
0 commit comments