]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-sql: Add UUID datatype
authorAki Tuomi <aki.tuomi@open-xchange.com>
Thu, 20 Apr 2023 12:45:45 +0000 (12:45 +0000)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Tue, 2 May 2023 09:55:12 +0000 (09:55 +0000)
src/lib-sql/sql-api-private.h
src/lib-sql/sql-api.c
src/lib-sql/sql-api.h

index e53607386bb88d08452c5507202262fd1507caa8..cbcc2a5a44908b1ec9cc71c0af7de2bc713ab3b1 100644 (file)
@@ -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);
index 3de8b45f5ef15c84002910ed43e6185a39cb77a5..e54527cb9e5a0c60bbdc954be120bebe03ae2c25 100644 (file)
@@ -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;
+               }
                }
        }
 }
index 2115acf73b2a0e45d04fd629650eb915016823a7..49f8f0a6aa5311faa3ac86df3d7891f235e95f8c 100644 (file)
@@ -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) \