Skip to content

Commit 92cdf84

Browse files
committed
apr-dbm-lmdb: Add LMDB driver for apr_dbm.
git-svn-id: https://svn.apache.org/repos/asf/apr/apr-util/branches/1.7.x@1924398 13f79535-47bb-0310-9956-ffa450edef68
1 parent 44cea5d commit 92cdf84

14 files changed

+79
-6
lines changed

CHANGES

+3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
-*- coding: utf-8 -*-
22
Changes with APR-util 1.7.0
33

4+
*) apr-dbm-lmdb: Add LMDB driver for apr_dbm.
5+
[Lubos Uhliarik <uhliarik redhat.com>]
6+
47
*) apr_ldap: Add write capability to the LDAP API. Support for
58
add, modify, rename, delete, and extended operations.
69
[Graham Leggett]

Makefile.in

+1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ LDADD_dbd_odbc = @LDADD_dbd_odbc@
3939
LDADD_dbm_db = @LDADD_dbm_db@
4040
LDADD_dbm_gdbm = @LDADD_dbm_gdbm@
4141
LDADD_dbm_ndbm = @LDADD_dbm_ndbm@
42+
LDADD_dbm_lmdb = @LDADD_dbm_lmdb@
4243
LDADD_ldap = @LDADD_ldap@
4344
LDADD_crypto_openssl = @LDADD_crypto_openssl@
4445
LDADD_crypto_nss = @LDADD_crypto_nss@

build.conf

+5-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ headers = include/*.h include/private/*.h
4545
modules =
4646
ldap crypto_openssl crypto_nss crypto_commoncrypto dbd_pgsql
4747
dbd_sqlite2 dbd_sqlite3 dbd_oracle dbd_mysql dbd_odbc
48-
dbm_db dbm_gdbm dbm_ndbm
48+
dbm_db dbm_gdbm dbm_ndbm dbm_lmdb
4949

5050
# gen_uri_delim.c
5151

@@ -96,6 +96,10 @@ target = dbm/apr_dbm_db.la
9696
paths = dbm/apr_dbm_gdbm.c
9797
target = dbm/apr_dbm_gdbm.la
9898

99+
[dbm_lmdb]
100+
paths = dbm/apr_dbm_lmdb.c
101+
target = dbm/apr_dbm_lmdb.la
102+
99103
[dbm_ndbm]
100104
paths = dbm/apr_dbm_ndbm.c
101105
target = dbm/apr_dbm_ndbm.la

build/dbm.m4

+42-3
Original file line numberDiff line numberDiff line change
@@ -498,11 +498,13 @@ dnl APU_CHECK_DBM: see what kind of DBM backend to use for apr_dbm.
498498
dnl
499499
AC_DEFUN([APU_CHECK_DBM], [
500500
apu_use_sdbm=0
501+
apu_use_lmdb=0
501502
apu_use_ndbm=0
502503
apu_use_gdbm=0
503504
apu_use_db=0
504505
dnl it's in our codebase
505506
apu_have_sdbm=1
507+
apu_have_lmdb=0
506508
apu_have_gdbm=0
507509
apu_have_ndbm=0
508510
apu_have_db=0
@@ -514,7 +516,7 @@ AC_DEFUN([APU_CHECK_DBM], [
514516
# Although we search for all versions up to 6.9,
515517
# we should only include existing versions in our
516518
# help string.
517-
dbm_list="sdbm, gdbm, ndbm, db, db1, db185, db2, db3, db4"
519+
dbm_list="sdbm, lmdb, gdbm, ndbm, db, db1, db185, db2, db3, db4"
518520
db_max_version=48
519521
db_min_version=41
520522
db_version="$db_min_version"
@@ -541,7 +543,7 @@ AC_DEFUN([APU_CHECK_DBM], [
541543
done
542544
543545
AC_ARG_WITH(dbm, [APR_HELP_STRING([--with-dbm=DBM], [choose the DBM type to use.
544-
DBM={sdbm,gdbm,ndbm,db,db1,db185,db2,db3,db4,db4X,db5X,db6X} for some X=0,...,9])],
546+
DBM={sdbm,lmdb,gdbm,ndbm,db,db1,db185,db2,db3,db4,db4X,db5X,db6X} for some X=0,...,9])],
545547
[
546548
if test "$withval" = "yes"; then
547549
AC_MSG_ERROR([--with-dbm needs to specify a DBM type to use.
@@ -552,6 +554,35 @@ AC_DEFUN([APU_CHECK_DBM], [
552554
requested=default
553555
])
554556
557+
AC_ARG_WITH([lmdb], [APR_HELP_STRING([--with-lmdb=DIR], [enable LMDB support])],
558+
[
559+
apu_have_lmdb=0
560+
if test "$withval" = "yes"; then
561+
AC_CHECK_HEADER(lmdb.h, AC_CHECK_LIB(lmdb, mdb_dbi_open, [apu_have_lmdb=1]))
562+
elif test "$withval" = "no"; then
563+
apu_have_lmdb=0
564+
else
565+
saved_cppflags="$CPPFLAGS"
566+
saved_ldflags="$LDFLAGS"
567+
CPPFLAGS="$CPPFLAGS -I$withval/include"
568+
LDFLAGS="$LDFLAGS -L$withval/lib "
569+
570+
AC_MSG_CHECKING(checking for lmdb in $withval)
571+
AC_CHECK_HEADER(lmdb.h, AC_CHECK_LIB(lmdb, mdb_dbi_open, [apu_have_lmdb=1]))
572+
if test "$apu_have_lmdb" != "0"; then
573+
APR_ADDTO(LDFLAGS, [-L$withval/lib])
574+
APR_ADDTO(INCLUDES, [-I$withval/include])
575+
fi
576+
CPPFLAGS="$saved_cppflags"
577+
LDFLAGS="$saved_ldflags"
578+
fi
579+
580+
if test "$requested" = "lmdb" -a "$apu_have_lmdb" = 0; then
581+
AC_MSG_ERROR([LMDB requested, but not found])
582+
fi
583+
])
584+
585+
555586
dnl We don't pull in GDBM unless the user asks for it, since it's GPL
556587
AC_ARG_WITH([gdbm], [APR_HELP_STRING([--with-gdbm=DIR], [enable GDBM support])],
557588
[
@@ -668,6 +699,7 @@ AC_DEFUN([APU_CHECK_DBM], [
668699
fi
669700
670701
if test "$apu_want_db" != "0"; then
702+
AC_MSG_NOTICE([checking for Berkeley DB $requested in $user_places])
671703
APU_CHECK_DB($requested, $user_places)
672704
if test "$apu_have_db" = "0"; then
673705
AC_ERROR(Berkeley DB not found.)
@@ -680,7 +712,7 @@ AC_DEFUN([APU_CHECK_DBM], [
680712
fi
681713
682714
case "$requested" in
683-
sdbm | gdbm | ndbm | db)
715+
lmdb | sdbm | gdbm | ndbm | db)
684716
eval "apu_use_$requested=1"
685717
apu_default_dbm=$requested
686718
;;
@@ -709,11 +741,13 @@ AC_DEFUN([APU_CHECK_DBM], [
709741
AC_MSG_CHECKING(for default DBM)
710742
AC_MSG_RESULT($apu_default_dbm)
711743
744+
AC_SUBST(apu_use_lmdb)
712745
AC_SUBST(apu_use_sdbm)
713746
AC_SUBST(apu_use_gdbm)
714747
AC_SUBST(apu_use_ndbm)
715748
AC_SUBST(apu_use_db)
716749
750+
AC_SUBST(apu_have_lmdb)
717751
AC_SUBST(apu_have_sdbm)
718752
AC_SUBST(apu_have_gdbm)
719753
AC_SUBST(apu_have_ndbm)
@@ -738,8 +772,13 @@ AC_DEFUN([APU_CHECK_DBM], [
738772
APR_ADDTO(LDADD_dbm_ndbm, [-l$apu_ndbm_lib])
739773
fi
740774
775+
if test "$apu_have_lmdb" = "1"; then
776+
APR_ADDTO(LDADD_dbm_lmdb, [-llmdb])
777+
fi
778+
741779
AC_SUBST(LDADD_dbm_db)
742780
AC_SUBST(LDADD_dbm_gdbm)
743781
AC_SUBST(LDADD_dbm_ndbm)
782+
AC_SUBST(LDADD_dbm_lmdb)
744783
])
745784

build/dso.m4

+4-2
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ yes
6060
test $apu_have_db = 1 && objs="$objs dbm/apr_dbm_berkeleydb.lo"
6161
test $apu_have_gdbm = 1 && objs="$objs dbm/apr_dbm_gdbm.lo"
6262
test $apu_have_ndbm = 1 && objs="$objs dbm/apr_dbm_ndbm.lo"
63+
test $apu_have_lmdb = 1 && objs="$objs dbm/apr_dbm_lmdb.lo"
6364
test $apu_has_ldap = 1 && objs="$objs ldap/apr_ldap_init.lo"
6465
test $apu_has_ldap = 1 && objs="$objs ldap/apr_ldap_option.lo"
6566
test $apu_has_ldap = 1 && objs="$objs ldap/apr_ldap_rebind.lo"
@@ -81,11 +82,11 @@ yes
8182
8283
APRUTIL_LIBS="$APRUTIL_LIBS $LDADD_crypto_openssl $LDADD_crypto_nss $LDADD_crypto_commoncrypto"
8384
APRUTIL_LIBS="$APRUTIL_LIBS $LDADD_dbd_pgsql $LDADD_dbd_sqlite2 $LDADD_dbd_sqlite3 $LDADD_dbd_oracle $LDADD_dbd_mysql $LDADD_dbd_odbc"
84-
APRUTIL_LIBS="$APRUTIL_LIBS $LDADD_dbm_db $LDADD_dbm_gdbm $LDADD_dbm_ndbm"
85+
APRUTIL_LIBS="$APRUTIL_LIBS $LDADD_dbm_db $LDADD_dbm_gdbm $LDADD_dbm_ndbm $LDADD_dbm_lmdb"
8586
APRUTIL_LIBS="$APRUTIL_LIBS $LDADD_ldap"
8687
APRUTIL_EXPORT_LIBS="$APRUTIL_EXPORT_LIBS $LDADD_crypto_openssl $LDADD_crypto_nss $LDADD_crypto_commoncrypto"
8788
APRUTIL_EXPORT_LIBS="$APRUTIL_EXPORT_LIBS $LDADD_dbd_pgsql $LDADD_dbd_sqlite2 $LDADD_dbd_sqlite3 $LDADD_dbd_oracle $LDADD_dbd_mysql $LDADD_dbd_odbc"
88-
APRUTIL_EXPORT_LIBS="$APRUTIL_EXPORT_LIBS $LDADD_dbm_db $LDADD_dbm_gdbm $LDADD_dbm_ndbm"
89+
APRUTIL_EXPORT_LIBS="$APRUTIL_EXPORT_LIBS $LDADD_dbm_db $LDADD_dbm_gdbm $LDADD_dbm_ndbm $LDADD_dbm_lmdb"
8990
APRUTIL_EXPORT_LIBS="$APRUTIL_EXPORT_LIBS $LDADD_ldap"
9091
9192
else
@@ -104,6 +105,7 @@ yes
104105
test $apu_have_db = 1 && dsos="$dsos dbm/apr_dbm_db.la"
105106
test $apu_have_gdbm = 1 && dsos="$dsos dbm/apr_dbm_gdbm.la"
106107
test $apu_have_ndbm = 1 && dsos="$dsos dbm/apr_dbm_ndbm.la"
108+
test $apu_have_lmdb = 1 && dsos="$dsos dbm/apr_dbm_lmdb.la"
107109
test $apu_has_ldap = 1 && dsos="$dsos ldap/apr_ldap.la"
108110
109111
if test -n "$dsos"; then

dbm/apr_dbm.c

+7
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@
5353
#elif APU_USE_SDBM
5454
#define DBM_VTABLE apr_dbm_type_sdbm
5555
#define DBM_NAME "sdbm"
56+
#elif APU_USE_LMDB
57+
#define DBM_VTABLE apr_dbm_type_lmdb
58+
#define DBM_NAME "lmdb"
5659
#else /* Not in the USE_xDBM list above */
5760
#error a DBM implementation was not specified
5861
#endif
@@ -94,6 +97,9 @@ APU_DECLARE(apr_status_t) apr_dbm_get_driver(const apr_dbm_driver_t **vtable,
9497
if (!strcasecmp(type, "default")) *vtable = &DBM_VTABLE;
9598
#if APU_HAVE_DB
9699
else if (!strcasecmp(type, "db")) *vtable = &apr_dbm_type_db;
100+
#endif
101+
#if APU_HAVE_LMDB
102+
else if (!strcasecmp(type, "lmdb")) *vtable = &apr_dbm_type_lmdb;
97103
#endif
98104
else if (*type && !strcasecmp(type + 1, "dbm")) {
99105
#if APU_HAVE_GDBM
@@ -142,6 +148,7 @@ APU_DECLARE(apr_status_t) apr_dbm_get_driver(const apr_dbm_driver_t **vtable,
142148

143149
if (!strcasecmp(type, "default")) type = DBM_NAME;
144150
else if (!strcasecmp(type, "db")) type = "db";
151+
else if (!strcasecmp(type, "lmdb")) type = "lmdb";
145152
else if (*type && !strcasecmp(type + 1, "dbm")) {
146153
if (*type == 'G' || *type == 'g') type = "gdbm";
147154
else if (*type == 'N' || *type == 'n') type = "ndbm";

include/apr_dbm.h

+1
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ APU_DECLARE(apr_status_t) apr_dbm_get_driver(const apr_dbm_driver_t **driver,
8989
* @param type The type of the DBM (not all may be available at run time)
9090
* <pre>
9191
* db for Berkeley DB files
92+
* lmdb for LMDB files
9293
* gdbm for GDBM files
9394
* ndbm for NDBM files
9495
* sdbm for SDBM files (always available)

include/apu.h.in

+1
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@
100100
* we always have SDBM (it's in our codebase)
101101
*/
102102
#define APU_HAVE_SDBM @apu_have_sdbm@
103+
#define APU_HAVE_LMDB @apu_have_lmdb@
103104
#define APU_HAVE_GDBM @apu_have_gdbm@
104105
#define APU_HAVE_NDBM @apu_have_ndbm@
105106
#define APU_HAVE_DB @apu_have_db@

include/apu.hnw

+1
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@
8686
#define APU_HAVE_SDBM 1
8787

8888
#ifndef APU_DSO_MODULE_BUILD
89+
#define APU_HAVE_LMDB 0
8990
#define APU_HAVE_GDBM 0
9091
#define APU_HAVE_NDBM 0
9192
#define APU_HAVE_DB 0

include/apu.hw

+1
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@
108108
#define APU_HAVE_SDBM 1
109109

110110
#ifndef APU_DSO_MODULE_BUILD
111+
#define APU_HAVE_LMDB 0
111112
#define APU_HAVE_GDBM 0
112113
#define APU_HAVE_NDBM 0
113114
#define APU_HAVE_DB 0

include/apu.hwc

+1
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@
110110
#define APU_HAVE_SDBM 1
111111

112112
#ifndef APU_DSO_MODULE_BUILD
113+
#define APU_HAVE_LMDB 0
113114
#define APU_HAVE_GDBM 0
114115
#define APU_HAVE_NDBM 0
115116
#define APU_HAVE_DB 0

include/private/apr_dbm_private.h

+1
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ struct apr_dbm_t
111111
/* Declare all of the DBM provider tables */
112112
APU_MODULE_DECLARE_DATA extern const apr_dbm_driver_t apr_dbm_type_sdbm;
113113
APU_MODULE_DECLARE_DATA extern const apr_dbm_driver_t apr_dbm_type_gdbm;
114+
APU_MODULE_DECLARE_DATA extern const apr_dbm_driver_t apr_dbm_type_lmdb;
114115
APU_MODULE_DECLARE_DATA extern const apr_dbm_driver_t apr_dbm_type_ndbm;
115116
APU_MODULE_DECLARE_DATA extern const apr_dbm_driver_t apr_dbm_type_db;
116117

include/private/apu_select_dbm.h.in

+1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
** The following macros control what features APRUTIL will use
2222
*/
2323
#define APU_USE_SDBM @apu_use_sdbm@
24+
#define APU_USE_LMDB @apu_use_lmdb@
2425
#define APU_USE_NDBM @apu_use_ndbm@
2526
#define APU_USE_GDBM @apu_use_gdbm@
2627
#define APU_USE_DB @apu_use_db@

test/testdbm.c

+10
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,9 @@ static void test_dbm_traversal(abts_case *tc, apr_dbm_t *db, dbm_table_t *table)
153153

154154
rv = apr_dbm_nextkey(db, &key);
155155
ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
156+
157+
/** avoid infinite loop */
158+
if (rv != APR_SUCCESS) break;
156159
} while (1);
157160

158161
for (i = 0; i < NUM_TABLE_ROWS; i++) {
@@ -170,6 +173,7 @@ static void test_dbm(abts_case *tc, void *data)
170173
dbm_table_t *table;
171174
const char *type = data;
172175
const char *file = apr_pstrcat(p, "data/test-", type, NULL);
176+
const char *nofile = apr_pstrcat(p, "data/no-such-test-", type, NULL);
173177

174178
rv = apr_dbm_open_ex(&db, type, file, APR_DBM_RWCREATE, APR_OS_DEFAULT, p);
175179
ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
@@ -198,12 +202,18 @@ static void test_dbm(abts_case *tc, void *data)
198202
test_dbm_fetch(tc, db, table);
199203

200204
apr_dbm_close(db);
205+
206+
rv = apr_dbm_open_ex(&db, type, nofile, APR_DBM_READONLY, APR_FPROT_OS_DEFAULT, p);
207+
ABTS_TRUE(tc, rv != APR_SUCCESS);
201208
}
202209

203210
abts_suite *testdbm(abts_suite *suite)
204211
{
205212
suite = ADD_SUITE(suite);
206213

214+
#if APU_HAVE_LMDB
215+
abts_run_test(suite, test_dbm, "lmdb");
216+
#endif
207217
#if APU_HAVE_GDBM
208218
abts_run_test(suite, test_dbm, "gdbm");
209219
#endif

0 commit comments

Comments
 (0)