db-sql.c revision 2fbc2a7c65d30e46803195ebb4547176b85c22c7
c25356d5978632df6203437e1953bcb29e0c736fTimo Sirainen/* Copyright (C) 2003-2004 Timo Sirainen */
c25356d5978632df6203437e1953bcb29e0c736fTimo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen#include "common.h"
cf1797248b02eadfd7d63aabc0b64678a4239540Timo Sirainen
cf1797248b02eadfd7d63aabc0b64678a4239540Timo Sirainen#if defined(PASSDB_SQL) || defined(USERDB_SQL)
2423da95ee20fd4b3c260c1389cf2952d25f099cTimo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen#include "settings.h"
a8fe899601735459641edae975c0fa08be8482e2Timo Sirainen#include "db-sql.h"
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen#include <stddef.h>
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen#include <stdlib.h>
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen#define DEF(type, name) { type, #name, offsetof(struct sql_settings, name) }
29543188462c9348f365ec29115d777ffe4769d3Timo Sirainen
29543188462c9348f365ec29115d777ffe4769d3Timo Sirainenstatic struct setting_def setting_defs[] = {
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen DEF(SET_STR, driver),
fa780a18c41881036af582f7a3473d6399e9d34dTimo Sirainen DEF(SET_STR, connect),
37847ec8eaec9ad55c9df10ae109efe7b37ac573Timo Sirainen DEF(SET_STR, password_query),
37847ec8eaec9ad55c9df10ae109efe7b37ac573Timo Sirainen DEF(SET_STR, user_query),
bdb026e2dc8a7c77585ed5ba489f0056df8074d4Timo Sirainen DEF(SET_STR, default_pass_scheme)
bdb026e2dc8a7c77585ed5ba489f0056df8074d4Timo Sirainen};
bdb026e2dc8a7c77585ed5ba489f0056df8074d4Timo Sirainen
bdb026e2dc8a7c77585ed5ba489f0056df8074d4Timo Sirainenstruct sql_settings default_sql_settings = {
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainen MEMBER(driver) NULL,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen MEMBER(connect) NULL,
9393445a6dabd17ce62ebfc12fd73545b0065824Timo Sirainen MEMBER(password_query) "SELECT password FROM users WHERE userid = '%u'",
ef50336eefcb9ba99f73c6af37420eaf8857a39bTimo Sirainen MEMBER(user_query) "SELECT home, uid, gid FROM users WHERE userid = '%u'",
ef50336eefcb9ba99f73c6af37420eaf8857a39bTimo Sirainen MEMBER(default_pass_scheme) "PLAIN-MD5"
8854395cdd21ca521b37ce669f3acb8445792b20Timo Sirainen};
8854395cdd21ca521b37ce669f3acb8445792b20Timo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainenstatic struct sql_connection *connections = NULL;
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainen
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainenstatic struct sql_connection *sql_conn_find(const char *config_path)
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainen{
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainen struct sql_connection *conn;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen for (conn = connections; conn != NULL; conn = conn->next) {
917498e6f84969d2b93410c1e479735abe8e0ed7Timo Sirainen if (strcmp(conn->config_path, config_path) == 0)
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen return conn;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen }
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen return NULL;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen}
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainenstatic const char *parse_setting(const char *key, const char *value,
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen void *context)
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen{
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen struct sql_connection *conn = context;
9fc97c8aa8190df87624d214bcc5d0b5362bec93Timo Sirainen
9fc97c8aa8190df87624d214bcc5d0b5362bec93Timo Sirainen return parse_setting_from_defs(conn->pool, setting_defs,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen &conn->set, key, value);
c040ee67d0ac0fb7375bb543965bf67dcae6affaTimo Sirainen}
533bfba437e4120aa29dd45bca2aa87e30ee28a2Timo Sirainen
533bfba437e4120aa29dd45bca2aa87e30ee28a2Timo Sirainenstruct sql_connection *db_sql_init(const char *config_path)
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen{
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen struct sql_connection *conn;
d92f33f13830ba23d814342bf3ea8db721a15bb1Timo Sirainen pool_t pool;
d92f33f13830ba23d814342bf3ea8db721a15bb1Timo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen conn = sql_conn_find(config_path);
61e84692827b6a64912343f515c984853021483aTimo Sirainen if (conn != NULL) {
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen conn->refcount++;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen return conn;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen }
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainen
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainen pool = pool_alloconly_create("sql_connection", 1024);
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainen conn = p_new(pool, struct sql_connection, 1);
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainen conn->pool = pool;
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainen
61b0637759146621cbb7edcbd0b03a71cfd66dfeTimo Sirainen conn->refcount = 1;
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainen
b039dabf4c53f72454e795930e7643b6e0e625f9Timo Sirainen conn->config_path = p_strdup(pool, config_path);
4ba962c3e78f140facdcfb1e093c4c46de75ae24Timo Sirainen conn->set = default_sql_settings;
4ba962c3e78f140facdcfb1e093c4c46de75ae24Timo Sirainen if (!settings_read(config_path, NULL, parse_setting, NULL, conn))
4ba962c3e78f140facdcfb1e093c4c46de75ae24Timo Sirainen exit(FATAL_DEFAULT);
4ba962c3e78f140facdcfb1e093c4c46de75ae24Timo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen if (conn->set.driver == NULL) {
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen i_fatal("sql: driver not set in configuration file %s",
b039dabf4c53f72454e795930e7643b6e0e625f9Timo Sirainen config_path);
2f30b72d49fbff0c4096125c139e4bdfef45669cTimo Sirainen }
0b25846ba794ce19536a24d4065beaf2a0bd9464Timo Sirainen if (conn->set.connect == NULL) {
91b203fd2132510a47a4b34252c0ae0efd688a19Timo Sirainen i_fatal("sql: connect string not set in configuration file %s",
71e88fae3be360e9a93b3398e743f99a6f05d2edTimo Sirainen config_path);
8854395cdd21ca521b37ce669f3acb8445792b20Timo Sirainen }
8854395cdd21ca521b37ce669f3acb8445792b20Timo Sirainen conn->db = sql_init(conn->set.driver, conn->set.connect);
8854395cdd21ca521b37ce669f3acb8445792b20Timo Sirainen
8854395cdd21ca521b37ce669f3acb8445792b20Timo Sirainen conn->next = connections;
8854395cdd21ca521b37ce669f3acb8445792b20Timo Sirainen connections = conn;
8854395cdd21ca521b37ce669f3acb8445792b20Timo Sirainen return conn;
8854395cdd21ca521b37ce669f3acb8445792b20Timo Sirainen}
8854395cdd21ca521b37ce669f3acb8445792b20Timo Sirainen
8854395cdd21ca521b37ce669f3acb8445792b20Timo Sirainenvoid db_sql_unref(struct sql_connection *conn)
58a89627905e3590381cdd5eb931b9537c4b4ea6Timo Sirainen{
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen if (--conn->refcount > 0)
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen return;
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen sql_deinit(conn->db);
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen pool_unref(conn->pool);
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen}
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen#endif
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen