add convenience functions for getting a single value from results

Sun, 16 Feb 2025 15:50:04 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sun, 16 Feb 2025 15:50:04 +0100
changeset 14
59e62e65182c
parent 13
cf0b13708fd9
child 15
862ab606ee06

add convenience functions for getting a single value from results

dbutils/db.c file | annotate | diff | comparison | revisions
dbutils/dbutils/db.h file | annotate | diff | comparison | revisions
test/main.c file | annotate | diff | comparison | revisions
--- a/dbutils/db.c	Sun Feb 16 15:14:45 2025 +0100
+++ b/dbutils/db.c	Sun Feb 16 15:50:04 2025 +0100
@@ -80,3 +80,69 @@
 void dbuQueryFree(DBUQuery *q) {
     q->free(q);
 }
+
+
+
+int dbuResultAsInt32(DBUResult *r, int32_t *result) {
+    int64_t i;
+    int ret = dbuResultAsInt64(r, &i);
+    if(!ret) {
+        *result = (int32_t)i;
+    }
+    return ret;
+}
+
+int dbuResultAsUInt32(DBUResult *r, uint32_t *result) {
+    int64_t i;
+    int ret = dbuResultAsInt64(r, &i);
+    if(!ret) {
+        *result = (uint32_t)i;
+    }
+    return ret;
+}
+
+int dbuResultAsInt64(DBUResult *r, int64_t *result) {
+    if(r->hasData(r)) {
+        if(r->fieldType(r, 0) == DBU_FIELD_INT) {
+            if(r->optional_getInt) {
+                *result = r->optional_getInt(r, 0);
+            } else {
+                cxstring s = r->getText(r, 0);
+                return cx_strtoi64(s, result, 10);
+            }
+            return 0;
+        }
+    }
+    return -1;
+}
+
+int dbuResultAsUInt64(DBUResult *r, uint64_t *result) {
+    int64_t i;
+    int ret = dbuResultAsInt64(r, &i);
+    if(!ret) {
+        *result = (uint64_t)i;
+    }
+    return ret;
+}
+
+int dbuResultAsString(DBUResult *r, char **result) {
+    cxmutstr s;
+    int ret = dbuResultAsCxString(r, &s);
+    if(!ret) {
+        *result = s.ptr;
+    }
+    return ret;
+}
+
+int dbuResultAsCxString(DBUResult *r, cxmutstr *result) {
+    if(r->hasData(r)) {
+        if(r->fieldType(r, 0) != DBU_FIELD_NULL) {
+            cxstring s = r->getText(r, 0);
+            if(s.ptr) {
+                *result = cx_strdup(s);
+                return 0;
+            }
+        }
+    }
+    return -1;
+}
--- a/dbutils/dbutils/db.h	Sun Feb 16 15:14:45 2025 +0100
+++ b/dbutils/dbutils/db.h	Sun Feb 16 15:50:04 2025 +0100
@@ -110,6 +110,21 @@
 void dbuQueryFree(DBUQuery *q);
 
 
+#define dbuResultAsValue(r, result) \
+    _Generic(result, \
+    int32_t* : dbuResultAsInt32, \
+    uint32_t*: dbuResultAsUInt32, \
+    int64_t* : dbuResultAsInt64, \
+    uint64_t*: dbuResultAsUInt64, \
+    char**   : dbuResultAsString, \
+    cxmutstr*: dbuResultAsCxString)(r, result)
+
+int dbuResultAsInt32(DBUResult *r, int32_t *result);
+int dbuResultAsUInt32(DBUResult *r, uint32_t *result);
+int dbuResultAsInt64(DBUResult *r, int64_t *result);
+int dbuResultAsUInt64(DBUResult *r, uint64_t *result);
+int dbuResultAsString(DBUResult *r, char **result);
+int dbuResultAsCxString(DBUResult *r, cxmutstr *result);
 
 DBUObjectBuilder* dbuObjectBuilder(DBUClass *type, DBUQuery *query, const CxAllocator *a);
 void dbuObjectBuilderSetDenseResult(DBUObjectBuilder *builder, bool dense);
--- a/test/main.c	Sun Feb 16 15:14:45 2025 +0100
+++ b/test/main.c	Sun Feb 16 15:50:04 2025 +0100
@@ -157,6 +157,18 @@
     int execResult = dbuConnectionExec(conn, "drop table if exists test_table;");
     printf("exec result: %d\n\n", execResult);
     
+    
+    // single value query
+    DBUQuery *q0 = conn->createQuery(conn, NULL);
+    dbuQuerySetSQL(q0, "select 'hello world';");
+    q0->exec(q0);
+    DBUResult *r0 = q0->getResult(q0);
+    char *str;
+    if(!dbuResultAsValue(r0, &str)) {
+        printf("single query value: %s\n\n", str);
+        free(str);
+    }
+    
     DBUQuery *query = conn->createQuery(conn, NULL);
     dbuQuerySetSQL(query, "select p.*, a.address_id as [__address__address_id], a.street, a.zip, a.city from Person p inner join Address a on p.address_id = a.address_id;");
     

mercurial