dovecot-1.2: dict-sql: Only MySQL supports "INSERT .. ON DUPLICA...

dovecot at dovecot.org dovecot at dovecot.org
Mon Jul 7 16:15:47 EEST 2008


details:   http://hg.dovecot.org/dovecot-1.2/rev/54225d0b6e2b
changeset: 7966:54225d0b6e2b
user:      Timo Sirainen <tss at iki.fi>
date:      Mon Jul 07 18:44:16 2008 +0530
description:
dict-sql: Only MySQL supports "INSERT .. ON DUPLICATE KEY". With others just
use the INSERT and let created triggers handle updating existing rows.

diffstat:

1 file changed, 44 insertions(+), 34 deletions(-)
src/lib-dict/dict-sql.c |   78 ++++++++++++++++++++++++++---------------------

diffs (113 lines):

diff -r 72a560a00def -r 54225d0b6e2b src/lib-dict/dict-sql.c
--- a/src/lib-dict/dict-sql.c	Wed Jul 02 09:45:24 2008 +0300
+++ b/src/lib-dict/dict-sql.c	Mon Jul 07 18:44:16 2008 +0530
@@ -22,6 +22,8 @@ struct sql_dict {
 
 	const char *connect_string, *username;
 	const char *table, *select_field, *where_field, *username_field;
+
+	unsigned int has_on_duplicate_key:1;
 };
 
 struct sql_dict_iterate_context {
@@ -132,6 +134,9 @@ sql_dict_init(struct dict *driver, const
 		pool_unref(&pool);
 		return NULL;
 	}
+
+	/* currently pgsql and sqlite don't support "ON DUPLICATE KEY" */
+	dict->has_on_duplicate_key = strcmp(driver->name, "mysql") == 0;
 
 	dict->db = sql_pool_new(dict_sql_pool, driver->name,
 				dict->connect_string);
@@ -352,27 +357,29 @@ sql_dict_set_query(struct sql_dict *dict
 sql_dict_set_query(struct sql_dict *dict, const char *key, const char *value,
 		   bool priv)
 {
+	string_t *str;
+
+	str = t_str_new(256);
 	if (priv) {
-		return t_strdup_printf(
-			"INSERT INTO %s (%s, %s, %s) VALUES ('%s', '%s', '%s') "
-			"ON DUPLICATE KEY UPDATE %s = '%s'",
-			dict->table, dict->select_field, dict->where_field,
-			dict->username_field,
-			sql_escape_string(dict->db, value),
-			sql_escape_string(dict->db, key),
-			sql_escape_string(dict->db, dict->username),
-			dict->select_field,
-			sql_escape_string(dict->db, value));
+		str_printfa(str, "INSERT INTO %s (%s, %s, %s) "
+			    "VALUES ('%s', '%s', '%s')",
+			    dict->table, dict->select_field, dict->where_field,
+			    dict->username_field,
+			    sql_escape_string(dict->db, value),
+			    sql_escape_string(dict->db, key),
+			    sql_escape_string(dict->db, dict->username));
 	} else {
-		return t_strdup_printf(
-			"INSERT INTO %s (%s, %s) VALUES ('%s', '%s') "
-			"ON DUPLICATE KEY UPDATE %s = '%s'",
-			dict->table, dict->select_field, dict->where_field,
-			sql_escape_string(dict->db, value),
-			sql_escape_string(dict->db, key),
-                        dict->select_field,
-			sql_escape_string(dict->db, value));
-	}
+		str_printfa(str, "INSERT INTO %s (%s, %s) VALUES ('%s', '%s')",
+			    dict->table, dict->select_field, dict->where_field,
+			    sql_escape_string(dict->db, value),
+			    sql_escape_string(dict->db, key));
+	}
+	if (dict->has_on_duplicate_key) {
+		str_printfa(str, " ON DUPLICATE KEY UPDATE %s = '%s'",
+			    dict->select_field,
+			    sql_escape_string(dict->db, value));
+	}
+	return str_c(str);
 }
 
 static void sql_dict_set(struct dict_transaction_context *_ctx,
@@ -441,23 +448,26 @@ sql_dict_atomic_inc_query(struct sql_dic
 sql_dict_atomic_inc_query(struct sql_dict *dict, const char *key,
 			  long long diff, bool priv)
 {
+	string_t *str;
+
+	str = t_str_new(256);
 	if (priv) {
-		return t_strdup_printf(
-			"INSERT INTO %s (%s, %s, %s) VALUES (%lld, '%s', '%s') "
-			"ON DUPLICATE KEY UPDATE %s = %s + %lld",
-			dict->table, dict->select_field, dict->where_field,
-			dict->username_field,
-                        diff, sql_escape_string(dict->db, key),
-			sql_escape_string(dict->db, dict->username),
-                        dict->select_field, dict->select_field, diff);
+		str_printfa(str, "INSERT INTO %s (%s, %s, %s) "
+			    "VALUES (%lld, '%s', '%s')",
+			    dict->table, dict->select_field, dict->where_field,
+			    dict->username_field,
+			    diff, sql_escape_string(dict->db, key),
+			    sql_escape_string(dict->db, dict->username));
 	} else {
-		return t_strdup_printf(
-			"INSERT INTO %s (%s, %s) VALUES (%lld, '%s') "
-			"ON DUPLICATE KEY UPDATE %s = %s + %lld",
-			dict->table, dict->select_field, dict->where_field,
-                        diff, sql_escape_string(dict->db, key),
-                        dict->select_field, dict->select_field, diff);
-	}
+		str_printfa(str, "INSERT INTO %s (%s, %s) VALUES (%lld, '%s')",
+			    dict->table, dict->select_field, dict->where_field,
+			    diff, sql_escape_string(dict->db, key));
+	}
+	if (dict->has_on_duplicate_key) {
+		str_printfa(str, " ON DUPLICATE KEY UPDATE %s = %s + %lld",
+			    dict->select_field, dict->select_field, diff);
+	}
+	return str_c(str);
 }
 
 static void sql_dict_atomic_inc(struct dict_transaction_context *_ctx,


More information about the dovecot-cvs mailing list