changeset 22520:124286dedf19

dict-sql: Add signed "int" type
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Tue, 15 Aug 2017 15:37:01 +0300
parents 5a08febe285f
children 6be650aee0b5
files src/lib-dict/dict-sql-settings.c src/lib-dict/dict-sql-settings.h src/lib-dict/dict-sql.c
diffstat 3 files changed, 19 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-dict/dict-sql-settings.c	Tue Aug 15 14:55:48 2017 +0300
+++ b/src/lib-dict/dict-sql-settings.c	Tue Aug 15 15:37:01 2017 +0300
@@ -138,6 +138,8 @@
 		*type_r = DICT_SQL_TYPE_STRING;
 	else if (strcmp(value_type, "hexblob") == 0)
 		*type_r = DICT_SQL_TYPE_HEXBLOB;
+	else if (strcmp(value_type, "int") == 0)
+		*type_r = DICT_SQL_TYPE_INT;
 	else if (strcmp(value_type, "uint") == 0)
 		*type_r = DICT_SQL_TYPE_UINT;
 	else
@@ -226,6 +228,11 @@
 			field->variable = p_strndup(ctx->pool, value + 10,
 						    value_len-10-1);
 			field->sql_field.value_type = DICT_SQL_TYPE_HEXBLOB;
+		} else if (strncmp(value, "${int:", 6) == 0 &&
+			   value[value_len-1] == '}') {
+			field->variable = p_strndup(ctx->pool, value + 6,
+						    value_len-6-1);
+			field->sql_field.value_type = DICT_SQL_TYPE_INT;
 		} else if (strncmp(value, "${uint:", 7) == 0 &&
 			   value[value_len-1] == '}') {
 			field->variable = p_strndup(ctx->pool, value + 7,
--- a/src/lib-dict/dict-sql-settings.h	Tue Aug 15 14:55:48 2017 +0300
+++ b/src/lib-dict/dict-sql-settings.h	Tue Aug 15 15:37:01 2017 +0300
@@ -3,6 +3,7 @@
 
 enum dict_sql_type {
 	DICT_SQL_TYPE_STRING = 0,
+	DICT_SQL_TYPE_INT,
 	DICT_SQL_TYPE_UINT,
 	DICT_SQL_TYPE_HEXBLOB
 };
--- a/src/lib-dict/dict-sql.c	Tue Aug 15 14:55:48 2017 +0300
+++ b/src/lib-dict/dict-sql.c	Tue Aug 15 15:37:01 2017 +0300
@@ -228,6 +228,7 @@
 		      const char **error_r)
 {
 	buffer_t *buf;
+	int64_t snum;
 	uint64_t num;
 
 	switch (value_type) {
@@ -235,6 +236,15 @@
 		str_printfa(str, "'%s%s'", sql_escape_string(dict->db, value),
 			    value_suffix);
 		return 0;
+	case DICT_SQL_TYPE_INT:
+		if (value_suffix[0] != '\0' || str_to_int64(value, &snum) < 0) {
+			*error_r = t_strdup_printf(
+				"%s field's value isn't 64bit signed integer: %s%s (in pattern: %s)",
+				field_name, value, value_suffix, map->pattern);
+			return -1;
+		}
+		str_printfa(str, "%"PRId64, snum);
+		return 0;
 	case DICT_SQL_TYPE_UINT:
 		if (value_suffix[0] != '\0' || str_to_uint64(value, &num) < 0) {
 			*error_r = t_strdup_printf(
@@ -382,6 +392,7 @@
 
 	switch (type) {
 	case DICT_SQL_TYPE_STRING:
+	case DICT_SQL_TYPE_INT:
 	case DICT_SQL_TYPE_UINT:
 		return p_strdup(pool, sql_result_get_field_value(result, result_idx));
 	case DICT_SQL_TYPE_HEXBLOB: