db-sql.c revision 803197abb1cc0e81abb668c026c22394bfef820d
5f5870385cff47efd2f58e7892f251cf13761528Timo Sirainen/* Copyright (c) 2003-2012 Dovecot authors, see the included COPYING file */
a84eb0599fa1d796206eaed65c4e3239f0799276Timo Sirainen#define DEF_STR(name) DEF_STRUCT_STR(name, sql_settings)
a84eb0599fa1d796206eaed65c4e3239f0799276Timo Sirainen#define DEF_INT(name) DEF_STRUCT_INT(name, sql_settings)
a84eb0599fa1d796206eaed65c4e3239f0799276Timo Sirainen#define DEF_BOOL(name) DEF_STRUCT_BOOL(name, sql_settings)
ab0d9eecd85f74acae18fe88529302e0776cc500Timo Sirainenstatic struct sql_settings default_sql_settings = {
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .password_query = "SELECT username, domain, password FROM users WHERE username = '%n' AND domain = '%d'",
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .user_query = "SELECT home, uid, gid FROM users WHERE username = '%n' AND domain = '%d'",
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .update_query = "UPDATE users SET password = '%w' WHERE username = '%n' AND domain = '%d'",
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .iterate_query = "SELECT username, domain FROM users",
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenstatic struct sql_connection *connections = NULL;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenstatic struct sql_connection *sql_conn_find(const char *config_path)
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen for (conn = connections; conn != NULL; conn = conn->next) {
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen if (strcmp(conn->config_path, config_path) == 0)
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenstatic const char *parse_setting(const char *key, const char *value,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen return parse_setting_from_defs(conn->pool, setting_defs,
e665999b757e60bfb98e5a84a78b05f061453140Timo Sirainenstruct sql_connection *db_sql_init(const char *config_path, bool userdb)
b7828b34f6d81cdea62761932a1da1a444a29bcdTimo Sirainen i_fatal("sql: Configuration file path not given");
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen pool = pool_alloconly_create("sql_connection", 1024);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen conn->config_path = p_strdup(pool, config_path);
803197abb1cc0e81abb668c026c22394bfef820dTimo Sirainen if (!settings_read_nosection(config_path, parse_setting, conn, &error))
48010d123abfac8cb19f33f1fe12f33a7090089eTimo Sirainen if (conn->set.password_query == default_sql_settings.password_query)
48010d123abfac8cb19f33f1fe12f33a7090089eTimo Sirainen if (conn->set.user_query == default_sql_settings.user_query)
48010d123abfac8cb19f33f1fe12f33a7090089eTimo Sirainen if (conn->set.update_query == default_sql_settings.update_query)
48010d123abfac8cb19f33f1fe12f33a7090089eTimo Sirainen if (conn->set.iterate_query == default_sql_settings.iterate_query)
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen i_fatal("sql: driver not set in configuration file %s",
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen i_fatal("sql: connect string not set in configuration file %s",
f8a86fdfb0048f9c87bf223373b35416ceb5856bTimo Sirainen conn->db = sql_init(conn->set.driver, conn->set.connect);
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainenvoid db_sql_unref(struct sql_connection **_conn)
607f0cc7310ae7ecde7c96f67945026a128d8174Timo Sirainen /* abort all pending auth requests before setting conn to NULL,
607f0cc7310ae7ecde7c96f67945026a128d8174Timo Sirainen so that callbacks can still access it */
f93c833d644ecff0b0f80bee4f1cdde3e697b5c8Timo Sirainenvoid db_sql_connect(struct sql_connection *conn)
f93c833d644ecff0b0f80bee4f1cdde3e697b5c8Timo Sirainen /* auth worker's sql connection failed. we can't do anything
f93c833d644ecff0b0f80bee4f1cdde3e697b5c8Timo Sirainen useful until the connection works. there's no point in
f93c833d644ecff0b0f80bee4f1cdde3e697b5c8Timo Sirainen having tons of worker processes all logging failures,
f93c833d644ecff0b0f80bee4f1cdde3e697b5c8Timo Sirainen so tell the auth master to stop creating new workers (and
f93c833d644ecff0b0f80bee4f1cdde3e697b5c8Timo Sirainen maybe close old ones). this handling is especially useful if
f93c833d644ecff0b0f80bee4f1cdde3e697b5c8Timo Sirainen we reach the max. number of connections for sql server. */
f93c833d644ecff0b0f80bee4f1cdde3e697b5c8Timo Sirainenvoid db_sql_success(struct sql_connection *conn ATTR_UNUSED)
e665999b757e60bfb98e5a84a78b05f061453140Timo Sirainenvoid db_sql_check_userdb_warning(struct sql_connection *conn)
e665999b757e60bfb98e5a84a78b05f061453140Timo Sirainen if (worker || conn->userdb_used || conn->set.userdb_warning_disable)
e665999b757e60bfb98e5a84a78b05f061453140Timo Sirainen i_warning("sql: Ignoring changed user_query in %s, "
e665999b757e60bfb98e5a84a78b05f061453140Timo Sirainen "because userdb sql not used. "
e665999b757e60bfb98e5a84a78b05f061453140Timo Sirainen "(If this is intentional, set userdb_warning_disable=yes)",
e665999b757e60bfb98e5a84a78b05f061453140Timo Sirainen i_warning("sql: Ignoring changed iterate_query in %s, "
e665999b757e60bfb98e5a84a78b05f061453140Timo Sirainen "because userdb sql not used. "
e665999b757e60bfb98e5a84a78b05f061453140Timo Sirainen "(If this is intentional, set userdb_warning_disable=yes)",