changeset 4517:e661182eab75 HEAD

Berkeley DB dict support is now enabled only when using --with-db configure option.
author Timo Sirainen <timo.sirainen@movial.fi>
date Sun, 30 Jul 2006 22:27:24 +0300
parents aa2f73a4df26
children ed489df90232
files configure.in src/deliver/deliver.c src/dict/Makefile.am src/dict/main.c src/imap/main.c src/lib-dict/.cvsignore src/lib-dict/Makefile.am src/lib-dict/dict-client.c src/lib-dict/dict-client.h src/lib-dict/dict-db.c src/lib-dict/dict-private.h src/lib-dict/dict-sql.c src/lib-dict/dict.c src/lib-dict/dict.h src/pop3/main.c
diffstat 15 files changed, 129 insertions(+), 74 deletions(-) [+]
line wrap: on
line diff
--- a/configure.in	Sun Jul 30 21:49:38 2006 +0300
+++ b/configure.in	Sun Jul 30 22:27:24 2006 +0300
@@ -165,6 +165,15 @@
 	fi,
 	want_prefetch_userdb=yes)
 
+AC_ARG_WITH(db,
+[  --with-db               Build with Berkeley DB support],
+	if test x$withval = xno; then
+		want_db=no
+	else
+		want_db=yes
+	fi,
+	want_db=no)
+
 dnl The --with-sql is useful only if Dovecot is being built with all the SQL
 dnl drivers as modules. If any SQL driver is built-in, this option is ignored.
 AC_ARG_WITH(sql,
@@ -1432,6 +1441,29 @@
 	])
 fi
 
+dict_drivers=client
+
+if test $want_db = yes; then
+	AC_MSG_CHECKING([db_env_create in -ldb])
+	old_LIBS=$LIBS
+	LIBS="$LIBS -ldb"
+	AC_TRY_LINK([
+		#include <db.h>
+	], [
+		db_env_create(0, 0);
+	], [
+		AC_MSG_RESULT(yes)
+		AC_CHECK_HEADER(db.h, [
+        		DICT_LIBS="$DICT_LIBS -ldb"
+			dict_drivers="$dict_drivers db"
+			AC_DEFINE(BUILD_DB,, Build with Berkeley DB support)
+		])
+	], [
+		AC_MSG_RESULT(no)
+	])
+	LIBS=$old_LIBS
+fi
+
 if test $want_pgsql = yes; then
 	# based on code from PHP
 	for i in /usr /usr/local /usr/local/pgsql; do
@@ -1626,6 +1658,9 @@
 AC_SUBST(SQL_CFLAGS)
 AC_SUBST(SQL_LIBS)
 
+AC_SUBST(DICT_LIBS)
+AC_SUBST(dict_drivers)
+
 dnl **
 dnl ** Index file compatibility flags
 dnl **
--- a/src/deliver/deliver.c	Sun Jul 30 21:49:38 2006 +0300
+++ b/src/deliver/deliver.c	Sun Jul 30 22:27:24 2006 +0300
@@ -468,7 +468,7 @@
 	if (deliver_set->sendmail_path == NULL)
 		deliver_set->sendmail_path = DEFAULT_SENDMAIL_PATH;
 
-	dict_client_register();
+	dict_driver_register(&dict_driver_client);
         duplicate_init();
         mail_storage_init();
 	mail_storage_register_all();
@@ -557,7 +557,7 @@
 	mail_storage_deinit();
 
 	duplicate_deinit();
-	dict_client_unregister();
+	dict_driver_unregister(&dict_driver_client);
 	lib_signals_deinit();
 
 	io_loop_destroy(&ioloop);
--- a/src/dict/Makefile.am	Sun Jul 30 21:49:38 2006 +0300
+++ b/src/dict/Makefile.am	Sun Jul 30 22:27:24 2006 +0300
@@ -19,6 +19,7 @@
 	$(libs) \
 	$(RAND_LIBS) \
 	$(MODULE_LIBS) \
+	$(DICT_LIBS) \
 	$(SQL_LIBS)
 
 dict_DEPENDENCIES = $(libs)
--- a/src/dict/main.c	Sun Jul 30 21:49:38 2006 +0300
+++ b/src/dict/main.c	Sun Jul 30 22:27:24 2006 +0300
@@ -7,7 +7,7 @@
 #include "restrict-access.h"
 #include "randgen.h"
 #include "sql-api.h"
-#include "dict-sql.h"
+#include "dict.h"
 #include "dict-client.h"
 #include "dict-server.h"
 #include "module-dir.h"
@@ -68,8 +68,7 @@
 	/* If master dies, the log fd gets closed and we'll quit */
 	log_io = io_add(STDERR_FILENO, IO_ERROR, log_error_callback, NULL);
 
-	dict_client_register();
-	dict_sql_register();
+	dict_drivers_register_all();
 
 	modules = getenv("MODULE_DIR") == NULL ? NULL :
 		module_dir_load(getenv("MODULE_DIR"), NULL, TRUE);
@@ -89,8 +88,7 @@
 
 	module_dir_unload(&modules);
 
-	dict_sql_unregister();
-	dict_client_unregister();
+	dict_drivers_unregister_all();
 
 	sql_drivers_deinit();
 	random_deinit();
--- a/src/imap/main.c	Sun Jul 30 21:49:38 2006 +0300
+++ b/src/imap/main.c	Sun Jul 30 22:27:24 2006 +0300
@@ -172,7 +172,7 @@
 	capability_string = str_new(default_pool, sizeof(CAPABILITY_STRING)+32);
 	str_append(capability_string, CAPABILITY_STRING);
 
-	dict_client_register();
+	dict_driver_register(&dict_driver_client);
         mail_storage_init();
 	mail_storage_register_all();
 	clients_init();
@@ -241,7 +241,7 @@
 	imap_thread_deinit();
 	commands_deinit();
         mail_storage_deinit();
-	dict_client_unregister();
+	dict_driver_unregister(&dict_driver_client);
 	random_deinit();
 	pool_unref(namespace_pool);
 
--- a/src/lib-dict/.cvsignore	Sun Jul 30 21:49:38 2006 +0300
+++ b/src/lib-dict/.cvsignore	Sun Jul 30 22:27:24 2006 +0300
@@ -6,3 +6,4 @@
 Makefile
 Makefile.in
 so_locations
+dict-drivers-register.c
--- a/src/lib-dict/Makefile.am	Sun Jul 30 21:49:38 2006 +0300
+++ b/src/lib-dict/Makefile.am	Sun Jul 30 22:27:24 2006 +0300
@@ -1,5 +1,7 @@
 noinst_LIBRARIES = libdict.a
 
+dict_drivers = @dict_drivers@
+
 AM_CPPFLAGS = \
 	-I$(top_srcdir)/src/lib \
 	-I$(top_srcdir)/src/lib-sql \
@@ -10,11 +12,44 @@
 	dict.c \
 	dict-client.c \
 	dict-db.c \
-	dict-sql.c
+	dict-sql.c \
+	dict-drivers-register.c
 
 noinst_HEADERS = \
 	dict.h \
 	dict-client.h \
 	dict-private.h \
-	dict-db.h \
 	dict-sql.h
+
+dict-drivers-register.c: Makefile
+	rm -f $@
+	echo '/* this file automatically generated by Makefile */' >$@
+	echo '#include "lib.h"' >>$@
+	echo '#include "dict.h"' >>$@
+	echo '#include "dict-sql.h"' >>$@
+	for i in $(dict_drivers) null; do \
+	  if [ "$${i}" != "null" ]; then \
+	        echo "extern struct dict dict_driver_$${i};" >>$@ ; \
+	  fi \
+	done
+	echo 'void dict_drivers_register_all(void) {' >>$@
+	echo 'dict_sql_register();' >>$@
+	for i in $(dict_drivers) null; do \
+	  if [ "$${i}" != "null" ]; then \
+	        echo "dict_driver_register(&dict_driver_$${i});" >>$@ ; \
+	  fi \
+	done
+	echo '}' >>$@
+	echo 'void dict_drivers_unregister_all(void) {' >>$@
+	echo 'dict_sql_unregister();' >>$@
+	for i in $(dict_drivers) null; do \
+	  if [ "$${i}" != "null" ]; then \
+	        echo "dict_driver_unregister(&dict_driver_$${i});" >>$@ ; \
+	  fi \
+	done
+	echo '}' >>$@
+
+DISTFILES = $(DIST_COMMON) $(dist_sources) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+distclean-generic:
+	rm -f Makefile dict-drivers-register.c
--- a/src/lib-dict/dict-client.c	Sun Jul 30 21:49:38 2006 +0300
+++ b/src/lib-dict/dict-client.c	Sun Jul 30 22:27:24 2006 +0300
@@ -282,7 +282,7 @@
 }
 
 static struct dict *
-client_dict_init(struct dict *dict_class, const char *uri,
+client_dict_init(struct dict *driver, const char *uri,
 		 enum dict_data_type value_type, const char *username)
 {
 	struct client_dict *dict;
@@ -299,7 +299,7 @@
 	pool = pool_alloconly_create("client dict", 1024);
 	dict = p_new(pool, struct client_dict, 1);
 	dict->pool = pool;
-	dict->dict = *dict_class;
+	dict->dict = *driver;
 	dict->value_type = value_type;
 	dict->username = p_strdup(pool, username);
 
@@ -536,7 +536,7 @@
 	t_pop();
 }
 
-static struct dict client_dict = {
+struct dict dict_driver_client = {
 	MEMBER(name) "proxy",
 
 	{
@@ -554,13 +554,3 @@
 		client_dict_atomic_inc
 	}
 };
-
-void dict_client_register(void)
-{
-	dict_class_register(&client_dict);
-}
-
-void dict_client_unregister(void)
-{
-	dict_class_unregister(&client_dict);
-}
--- a/src/lib-dict/dict-client.h	Sun Jul 30 21:49:38 2006 +0300
+++ b/src/lib-dict/dict-client.h	Sun Jul 30 22:27:24 2006 +0300
@@ -1,6 +1,8 @@
 #ifndef __DICT_CLIENT_H
 #define __DICT_CLIENT_H
 
+#include "dict.h"
+
 #define DEFAULT_DICT_SERVER_SOCKET_PATH PKG_RUNDIR"/dict-server"
 
 #define DICT_CLIENT_PROTOCOL_MAJOR_VERSION 2
@@ -31,10 +33,9 @@
 	DICT_PROTOCOL_REPLY_FAIL = 'F'
 };
 
+extern struct dict dict_driver_client;
+
 const char *dict_client_escape(const char *src);
 const char *dict_client_unescape(const char *src);
 
-void dict_client_register(void);
-void dict_client_unregister(void);
-
 #endif
--- a/src/lib-dict/dict-db.c	Sun Jul 30 21:49:38 2006 +0300
+++ b/src/lib-dict/dict-db.c	Sun Jul 30 22:27:24 2006 +0300
@@ -2,8 +2,8 @@
 
 #include "lib.h"
 #include "dict-private.h"
-#include "dict-db.h"
 
+#ifdef BUILD_DB
 #include <stdlib.h>
 #include <db.h>
 
@@ -59,7 +59,7 @@
 		(*ua < *ub ? -1 : 0);
 }
 
-static struct dict *db_dict_init(struct dict *dict_class, const char *uri,
+static struct dict *db_dict_init(struct dict *driver, const char *uri,
 				 enum dict_data_type value_type,
 				 const char *username __attr_unused__)
 {
@@ -72,7 +72,7 @@
 	pool = pool_alloconly_create("db dict", 1024);
 	dict = p_new(pool, struct db_dict, 1);
 	dict->pool = pool;
-	dict->dict = *dict_class;
+	dict->dict = *driver;
 
 	/* prepare the environment */
 	ret = db_env_create(&dict->db_env, 0);
@@ -407,7 +407,7 @@
 	/* FIXME */
 }
 
-static struct dict dict_db_class = {
+struct dict dict_driver_db = {
 	MEMBER(name) "db",
 	{
 		db_dict_init,
@@ -424,13 +424,4 @@
 		db_dict_atomic_inc
 	}
 };
-
-void dict_db_register(void)
-{
-	dict_class_register(&dict_db_class);
-}
-
-void dict_db_unregister(void)
-{
-	dict_class_unregister(&dict_db_class);
-}
+#endif
--- a/src/lib-dict/dict-private.h	Sun Jul 30 21:49:38 2006 +0300
+++ b/src/lib-dict/dict-private.h	Sun Jul 30 22:27:24 2006 +0300
@@ -4,7 +4,7 @@
 #include "dict.h"
 
 struct dict_vfuncs {
-	struct dict *(*init)(struct dict *dict_class, const char *uri,
+	struct dict *(*init)(struct dict *dict_driver, const char *uri,
 			     enum dict_data_type value_type,
 			     const char *username);
 	void (*deinit)(struct dict *dict);
--- a/src/lib-dict/dict-sql.c	Sun Jul 30 21:49:38 2006 +0300
+++ b/src/lib-dict/dict-sql.c	Sun Jul 30 22:27:24 2006 +0300
@@ -102,7 +102,7 @@
 }
 
 static struct dict *
-sql_dict_init(struct dict *dict_class, const char *uri,
+sql_dict_init(struct dict *driver, const char *uri,
 	      enum dict_data_type value_type __attr_unused__,
 	      const char *username)
 {
@@ -112,7 +112,7 @@
 	pool = pool_alloconly_create("sql dict", 1024);
 	dict = p_new(pool, struct sql_dict, 1);
 	dict->pool = pool;
-	dict->dict = *dict_class;
+	dict->dict = *driver;
 	dict->username = p_strdup(pool, username);
 
 	if (sql_dict_read_config(dict, uri) < 0) {
@@ -121,7 +121,7 @@
 	}
 
 	t_push();
-	dict->db = sql_init(dict_class->name, dict->connect_string);
+	dict->db = sql_init(driver->name, dict->connect_string);
 	t_pop();
 	return &dict->dict;
 }
@@ -440,7 +440,7 @@
 	}
 };
 
-static struct dict *dict_sql_classes;
+static struct dict *dict_sql_drivers;
 
 void dict_sql_register(void)
 {
@@ -449,13 +449,13 @@
 
 	/* @UNSAFE */
 	drivers = array_get(&sql_drivers, &count);
-	dict_sql_classes = i_new(struct dict, count + 1);
+	dict_sql_drivers = i_new(struct dict, count + 1);
 
 	for (i = 0; i < count; i++) {
-		dict_sql_classes[i] = sql_dict;
-		dict_sql_classes[i].name = drivers[i]->name;
+		dict_sql_drivers[i] = sql_dict;
+		dict_sql_drivers[i].name = drivers[i]->name;
 
-		dict_class_register(&dict_sql_classes[i]);
+		dict_driver_register(&dict_sql_drivers[i]);
 	}
 }
 
@@ -463,7 +463,7 @@
 {
 	int i;
 
-	for (i = 0; dict_sql_classes[i].name != NULL; i++)
-		dict_class_unregister(&dict_sql_classes[i]);
-	i_free(dict_sql_classes);
+	for (i = 0; dict_sql_drivers[i].name != NULL; i++)
+		dict_driver_unregister(&dict_sql_drivers[i]);
+	i_free(dict_sql_drivers);
 }
--- a/src/lib-dict/dict.c	Sun Jul 30 21:49:38 2006 +0300
+++ b/src/lib-dict/dict.c	Sun Jul 30 22:27:24 2006 +0300
@@ -5,14 +5,14 @@
 #include "dict-sql.h"
 #include "dict-private.h"
 
-static ARRAY_DEFINE(dict_classes, struct dict *);
+static ARRAY_DEFINE(dict_drivers, struct dict *);
 
-static struct dict *dict_class_lookup(const char *name)
+static struct dict *dict_driver_lookup(const char *name)
 {
 	struct dict *const *dicts;
 	unsigned int i, count;
 
-	dicts = array_get(&dict_classes, &count);
+	dicts = array_get(&dict_drivers, &count);
 	for (i = 0; i < count; i++) {
 		if (strcmp(dicts[i]->name, name) == 0)
 			return dicts[i];
@@ -20,35 +20,35 @@
 	return NULL;
 }
 
-void dict_class_register(struct dict *dict_class)
+void dict_driver_register(struct dict *driver)
 {
-	if (!array_is_created(&dict_classes))
-		ARRAY_CREATE(&dict_classes, default_pool, struct dict *, 8);
+	if (!array_is_created(&dict_drivers))
+		ARRAY_CREATE(&dict_drivers, default_pool, struct dict *, 8);
 
-	if (dict_class_lookup(dict_class->name) != NULL) {
-		i_fatal("dict_class_register(%s): Already registered",
-			dict_class->name);
+	if (dict_driver_lookup(driver->name) != NULL) {
+		i_fatal("dict_driver_register(%s): Already registered",
+			driver->name);
 	}
-	array_append(&dict_classes, &dict_class, 1);
+	array_append(&dict_drivers, &driver, 1);
 }
 
-void dict_class_unregister(struct dict *dict_class)
+void dict_driver_unregister(struct dict *driver)
 {
 	struct dict *const *dicts;
 	unsigned int i, count;
 
-	dicts = array_get(&dict_classes, &count);
+	dicts = array_get(&dict_drivers, &count);
 	for (i = 0; i < count; i++) {
-		if (dicts[i] == dict_class) {
-			array_delete(&dict_classes, i, 1);
+		if (dicts[i] == driver) {
+			array_delete(&dict_drivers, i, 1);
 			break;
 		}
 	}
 
 	i_assert(i < count);
 
-	if (array_count(&dict_classes) == 0)
-		array_free(&dict_classes);
+	if (array_count(&dict_drivers) == 0)
+		array_free(&dict_drivers);
 }
 
 struct dict *dict_init(const char *uri, enum dict_data_type value_type,
@@ -65,7 +65,7 @@
 
 	t_push();
 	name = t_strdup_until(uri, p);
-	dict = dict_class_lookup(name);
+	dict = dict_driver_lookup(name);
 	if (dict == NULL) {
 		i_error("Unknown dict module: %s", name);
 		t_pop();
--- a/src/lib-dict/dict.h	Sun Jul 30 21:49:38 2006 +0300
+++ b/src/lib-dict/dict.h	Sun Jul 30 22:27:24 2006 +0300
@@ -17,8 +17,11 @@
 	DICT_DATA_TYPE_UINT32
 };
 
-void dict_class_register(struct dict *dict_class);
-void dict_class_unregister(struct dict *dict_class);
+void dict_driver_register(struct dict *driver);
+void dict_driver_unregister(struct dict *driver);
+
+void dict_drivers_register_all(void);
+void dict_drivers_unregister_all(void);
 
 /* Open dictionary with given URI (type:data).
    If URI is invalid, returns NULL. */
--- a/src/pop3/main.c	Sun Jul 30 21:49:38 2006 +0300
+++ b/src/pop3/main.c	Sun Jul 30 22:27:24 2006 +0300
@@ -182,7 +182,7 @@
 				log_error_callback, NULL);
 	}
 
-	dict_client_register();
+	dict_driver_register(&dict_driver_client);
         mail_storage_init();
 	mail_storage_register_all();
 	clients_init();
@@ -255,7 +255,7 @@
 
 	module_dir_unload(&modules);
 	mail_storage_deinit();
-	dict_client_unregister();
+	dict_driver_unregister(&dict_driver_client);
 	random_deinit();
 
 	lib_signals_deinit();