From a356403cfd32bc801bafcb6efcbe5a91d3bbdb65 Mon Sep 17 00:00:00 2001 From: Jordan Bancino Date: Sat, 12 Nov 2022 18:26:31 +0000 Subject: [PATCH] Finish DbComputeSize() --- src/Db.c | 71 ++++++++++++++++++++++++++++++++++++++++++---- src/include/Json.h | 3 ++ 2 files changed, 69 insertions(+), 5 deletions(-) diff --git a/src/Db.c b/src/Db.c index 198984e..9699e23 100644 --- a/src/Db.c +++ b/src/Db.c @@ -47,6 +47,71 @@ struct DbRef char *file; }; +static ssize_t DbComputeSize(HashMap *); + +static ssize_t +DbComputeSizeOfValue(JsonValue * val) +{ + MemoryInfo *a; + ssize_t total = 0; + + size_t i; + + union + { + char *str; + Array *arr; + } u; + + if (!val) + { + return -1; + } + + a = MemoryInfoGet(val); + if (a) + { + total += MemoryInfoGetSize(a); + } + + switch (JsonValueType(val)) + { + case JSON_OBJECT: + total += DbComputeSize(JsonValueAsObject(val)); + break; + case JSON_ARRAY: + u.arr = JsonValueAsArray(val); + a = MemoryInfoGet(u.arr); + + if (a) + { + total += MemoryInfoGetSize(a); + } + + for (i = 0; i < ArraySize(u.arr); i++) + { + total += DbComputeSizeOfValue(ArrayGet(u.arr, i)); + } + break; + case JSON_STRING: + u.str = JsonValueAsString(val); + a = MemoryInfoGet(u.str); + if (a) + { + total += MemoryInfoGetSize(a); + } + break; + case JSON_NULL: + case JSON_INTEGER: + case JSON_FLOAT: + case JSON_BOOLEAN: + default: + /* These don't use any extra heap space */ + break; + } + return total; +} + static ssize_t DbComputeSize(HashMap * json) { @@ -76,11 +141,7 @@ DbComputeSize(HashMap * json) total += MemoryInfoGetSize(a); } - a = MemoryInfoGet(val); - if (a) - { - total += MemoryInfoGetSize(a); - } + total += DbComputeSizeOfValue(val); } return total; diff --git a/src/include/Json.h b/src/include/Json.h index 5e5005f..35797ec 100644 --- a/src/include/Json.h +++ b/src/include/Json.h @@ -145,6 +145,9 @@ extern Array * extern JsonValue * JsonValueString(char *string); +extern char * +JsonValueAsString(JsonValue *); + extern JsonValue * JsonValueInteger(long integer);