From: Aki Tuomi Date: Thu, 20 Apr 2023 12:45:45 +0000 (+0000) Subject: lib-sql: Add UUID datatype X-Git-Tag: 2.4.0~2780 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=34dec04a069fef76bc66974070b05d8adf15e51d;p=thirdparty%2Fdovecot%2Fcore.git lib-sql: Add UUID datatype --- diff --git a/src/lib-sql/sql-api-private.h b/src/lib-sql/sql-api-private.h index e53607386b..cbcc2a5a44 100644 --- a/src/lib-sql/sql-api-private.h +++ b/src/lib-sql/sql-api-private.h @@ -118,6 +118,8 @@ struct sql_db_vfuncs { unsigned int column_idx, int64_t value); void (*statement_bind_double)(struct sql_statement *stmt, unsigned int column_idx, double value); + void (*statement_bind_uuid)(struct sql_statement *stmt, + unsigned int column_idx, const guid_128_t uuid); void (*statement_query)(struct sql_statement *stmt, sql_query_callback_t *callback, void *context); struct sql_result *(*statement_query_s)(struct sql_statement *stmt); diff --git a/src/lib-sql/sql-api.c b/src/lib-sql/sql-api.c index 3de8b45f5e..e54527cb9e 100644 --- a/src/lib-sql/sql-api.c +++ b/src/lib-sql/sql-api.c @@ -446,6 +446,16 @@ void sql_statement_bind_double(struct sql_statement *stmt, stmt->db->v.statement_bind_double(stmt, column_idx, value); } +void sql_statement_bind_uuid(struct sql_statement *stmt, + unsigned int column_idx, const guid_128_t uuid) +{ + const char *value_str = p_strdup(stmt->pool, guid_128_to_uuid_string(uuid, FORMAT_RECORD)); + array_idx_set(&stmt->args, column_idx, &value_str); + + if (stmt->db->v.statement_bind_uuid != NULL) + stmt->db->v.statement_bind_uuid(stmt, column_idx, uuid); +} + #undef sql_statement_query void sql_statement_query(struct sql_statement **_stmt, sql_query_callback_t *callback, void *context) @@ -528,6 +538,9 @@ sql_result_build_map(struct sql_result *result, case SQL_TYPE_BOOL: field_size = sizeof(bool); break; + case SQL_TYPE_UUID: + field_size = GUID_128_SIZE; + break; } i_assert(def->offset + field_size <= dest_size); } else { @@ -586,6 +599,11 @@ static void sql_result_fetch(struct sql_result *result) *((bool *)ptr) = TRUE; break; } + case SQL_TYPE_UUID: { + if (value != NULL) + guid_128_from_uuid_string(value, *((guid_128_t *)ptr)); + break; + } } } } diff --git a/src/lib-sql/sql-api.h b/src/lib-sql/sql-api.h index 2115acf73b..49f8f0a6aa 100644 --- a/src/lib-sql/sql-api.h +++ b/src/lib-sql/sql-api.h @@ -1,6 +1,8 @@ #ifndef SQL_API_H #define SQL_API_H +#include "guid.h" + struct timespec; /* This SQL API is designed to work asynchronously. The underlying drivers @@ -25,7 +27,8 @@ enum sql_field_type { SQL_TYPE_STR, SQL_TYPE_UINT, SQL_TYPE_ULLONG, - SQL_TYPE_BOOL + SQL_TYPE_BOOL, + SQL_TYPE_UUID, }; struct sql_field_def { @@ -154,6 +157,8 @@ void sql_statement_bind_int64(struct sql_statement *stmt, unsigned int column_idx, int64_t value); void sql_statement_bind_double(struct sql_statement *stmt, unsigned int column_idx, double value); +void sql_statement_bind_uuid(struct sql_statement *stmt, + unsigned int column_idx, const guid_128_t uuid); void sql_statement_query(struct sql_statement **stmt, sql_query_callback_t *callback, void *context); #define sql_statement_query(stmt, callback, context) \