Sun, 16 Feb 2025 15:50:04 +0100
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;");