diff --git a/src/include/art.h b/src/include/art.h index 3d59ddc5..7013705a 100644 --- a/src/include/art.h +++ b/src/include/art.h @@ -170,12 +170,13 @@ pgmoneta_art_iterator_has_next(struct art_iterator* iter); /** * Convert the ART tree to string * @param t The ART tree + * @param format The format * @param tag The optional tag * @param indent The indent * @return The string */ char* -pgmoneta_art_to_string(struct art* t, char* tag, int indent); +pgmoneta_art_to_string(struct art* t, int32_t format, char* tag, int indent); #ifdef __cplusplus } diff --git a/src/include/deque.h b/src/include/deque.h index 69c40731..a734c0ba 100644 --- a/src/include/deque.h +++ b/src/include/deque.h @@ -232,12 +232,13 @@ pgmoneta_deque_destroy(struct deque* deque); /** * Convert what's inside deque to string * @param deque The deque + * @param format The format * @param tag [Optional] The tag, which will be applied before the content if not null * @param indent The current indentation * @return The string */ char* -pgmoneta_deque_to_string(struct deque* deque, char* tag, int indent); +pgmoneta_deque_to_string(struct deque* deque, int32_t format, char* tag, int indent); /** * Create a deque iterator diff --git a/src/include/json.h b/src/include/json.h index 3c06b2af..b287a43c 100644 --- a/src/include/json.h +++ b/src/include/json.h @@ -177,20 +177,22 @@ pgmoneta_json_append(struct json* array, uintptr_t entry, enum value_type type); /** * Convert a json to string * @param object The json object + * @param format The format * @param tag The optional tag * @param indent The indent * @return The json formatted string */ char* -pgmoneta_json_to_string(struct json* object, char* tag, int indent); +pgmoneta_json_to_string(struct json* object, int32_t format, char* tag, int indent); /** * Print a json object * @param object The object + * @param format The format * @param indent_per_level The indent per level */ void -pgmoneta_json_print(struct json* object); +pgmoneta_json_print(struct json* object, int32_t format); /** * Get json array length @@ -250,6 +252,15 @@ pgmoneta_json_iterator_has_next(struct json_iterator* iter); int pgmoneta_json_parse_string(char* str, struct json** obj); +/** + * Clone a json object + * @param from The from object + * @param to [out] The to object + * @return 0 if success, 1 if otherwise + */ +int +pgmoneta_json_clone(struct json* from, struct json** to); + #ifdef __cplusplus } #endif diff --git a/src/include/pgmoneta.h b/src/include/pgmoneta.h index 2b09c48c..36302d4a 100644 --- a/src/include/pgmoneta.h +++ b/src/include/pgmoneta.h @@ -126,6 +126,9 @@ extern "C" { #define INCORRECT_SLOT_TYPE 2 #define INDENT_PER_LEVEL 2 +#define FORMAT_JSON 0 +#define FORMAT_TEXT 1 +#define BULLET_POINT "- " #define likely(x) __builtin_expect (!!(x), 1) #define unlikely(x) __builtin_expect (!!(x), 0) diff --git a/src/include/value.h b/src/include/value.h index 37470cb4..d95548ee 100644 --- a/src/include/value.h +++ b/src/include/value.h @@ -37,7 +37,7 @@ extern "C" { #include typedef void (*data_destroy_cb)(uintptr_t data); -typedef char* (*data_to_string_cb)(uintptr_t data, char* tag, int indent); +typedef char* (*data_to_string_cb)(uintptr_t data, int32_t format, char* tag, int indent); enum value_type { ValueInt8, @@ -100,12 +100,13 @@ pgmoneta_value_data(struct value* value); /** * Convert a value to string * @param value The value + * @param format The format * @param tag The optional tag * @param indent The indent * @return The string */ char* -pgmoneta_value_to_string(struct value* value, char* tag, int indent); +pgmoneta_value_to_string(struct value* value, int32_t format, char* tag, int indent); /** * Convert a double value to value data, since straight type cast discards the decimal part diff --git a/src/include/verify.h b/src/include/verify.h index f8d0c04c..78e78567 100644 --- a/src/include/verify.h +++ b/src/include/verify.h @@ -68,12 +68,13 @@ pgmoneta_verify(SSL* ssl, int client_fd, int server, char* backup_id, char* dire /** * Convert a verify entry to string * @param entry The entry + * @param format The format * @param tag The optional tag * @param indent The indent * @return The string in json format */ char* -pgmoneta_verify_entry_to_string(struct verify_entry* entry, char* tag, int indent); +pgmoneta_verify_entry_to_string(struct verify_entry* entry, int32_t format, char* tag, int indent); #ifdef __cplusplus } diff --git a/src/libpgmoneta/art.c b/src/libpgmoneta/art.c index b1fb07a1..24b21683 100644 --- a/src/libpgmoneta/art.c +++ b/src/libpgmoneta/art.c @@ -121,6 +121,7 @@ struct to_string_param char* str; int indent; int cnt; + char* tag; struct art* t; }; @@ -283,7 +284,16 @@ static struct value* art_search(struct art* t, unsigned char* key, uint32_t key_len); static int -art_to_string_cb(void* param, const unsigned char* key, uint32_t key_len, struct value* value); +art_to_json_string_cb(void* param, const unsigned char* key, uint32_t key_len, struct value* value); + +static int +art_to_text_string_cb(void* param, const unsigned char* key, uint32_t key_len, struct value* value); + +static char* +to_json_string(struct art* t, char* tag, int indent); + +static char* +to_text_string(struct art* t, char* tag, int indent); int pgmoneta_art_init(struct art** tree) @@ -363,27 +373,17 @@ pgmoneta_art_iterate(struct art* t, art_callback cb, void* data) } char* -pgmoneta_art_to_string(struct art* t, char* tag, int indent) +pgmoneta_art_to_string(struct art* t, int32_t format, char* tag, int indent) { - char* ret = NULL; - ret = pgmoneta_indent(ret, tag, indent); - if (t == NULL || t->size == 0) + if (format == FORMAT_JSON) { - ret = pgmoneta_append(ret, "{}"); - return ret; + return to_json_string(t, tag, indent); } - ret = pgmoneta_append(ret, "{\n"); - struct to_string_param param = { - .indent = indent + INDENT_PER_LEVEL, - .str = ret, - .t = t, - .cnt = 0, - }; - pgmoneta_art_iterate(t, art_to_string_cb, ¶m); - ret = pgmoneta_append(NULL, param.str); - ret = pgmoneta_indent(ret, NULL, indent); - ret = pgmoneta_append(ret, "}"); - return ret; + else if (format == FORMAT_TEXT) + { + return to_text_string(t, tag, indent); + } + return NULL; } static uint32_t @@ -1465,15 +1465,110 @@ art_search(struct art* t, unsigned char* key, uint32_t key_len) } static int -art_to_string_cb(void* param, const unsigned char* key, uint32_t key_len, struct value* value) +art_to_json_string_cb(void* param, const unsigned char* key, uint32_t key_len, struct value* value) { struct to_string_param* p = (struct to_string_param*) param; char* str = NULL; + char* tag = NULL; p->cnt++; bool has_next = p->cnt < p->t->size; - str = pgmoneta_value_to_string(value, (char*)key, p->indent); + tag = pgmoneta_append_char(tag, '"'); + tag = pgmoneta_append(tag, (char*)key); + tag = pgmoneta_append_char(tag, '"'); + tag = pgmoneta_append(tag, ": "); + str = pgmoneta_value_to_string(value, FORMAT_JSON, tag, p->indent); + free(tag); p->str = pgmoneta_append(p->str, str); p->str = pgmoneta_append(p->str, has_next ? ",\n" : "\n"); + free(str); return 0; +} + +static int +art_to_text_string_cb(void* param, const unsigned char* key, uint32_t key_len, struct value* value) +{ + struct to_string_param* p = (struct to_string_param*) param; + char* str = NULL; + char* tag = NULL; + p->cnt++; + bool has_next = p->cnt < p->t->size; + tag = pgmoneta_append(tag, (char*)key); + tag = pgmoneta_append(tag, ": "); + if (value->type == ValueJSON) + { + tag = pgmoneta_append(tag, "\n"); + } + if (pgmoneta_compare_string(p->tag, BULLET_POINT)) + { + if (p->cnt == 1) + { + str = pgmoneta_value_to_string(value, FORMAT_TEXT, tag, 0); + } + else + { + str = pgmoneta_value_to_string(value, FORMAT_TEXT, tag, p->indent + INDENT_PER_LEVEL); + } + } + else + { + str = pgmoneta_value_to_string(value, FORMAT_TEXT, tag, p->indent); + } + free(tag); + p->str = pgmoneta_append(p->str, str); + p->str = pgmoneta_append(p->str, has_next ? "\n" : ""); + + free(str); + return 0; +} + +static char* +to_json_string(struct art* t, char* tag, int indent) +{ + char* ret = NULL; + ret = pgmoneta_indent(ret, tag, indent); + if (t == NULL || t->size == 0) + { + ret = pgmoneta_append(ret, "{}"); + return ret; + } + ret = pgmoneta_append(ret, "{\n"); + struct to_string_param param = { + .indent = indent + INDENT_PER_LEVEL, + .str = ret, + .t = t, + .cnt = 0, + }; + pgmoneta_art_iterate(t, art_to_json_string_cb, ¶m); + ret = pgmoneta_append(NULL, param.str); + ret = pgmoneta_indent(ret, NULL, indent); + ret = pgmoneta_append(ret, "}"); + return ret; +} + +static char* +to_text_string(struct art* t, char* tag, int indent) +{ + char* ret = NULL; + int next_indent = indent; + if (tag != NULL && !pgmoneta_compare_string(tag, BULLET_POINT)) + { + ret = pgmoneta_indent(ret, tag, indent); + next_indent += INDENT_PER_LEVEL; + } + if (t == NULL || t->size == 0) + { + ret = pgmoneta_append(ret, "{}"); + return ret; + } + struct to_string_param param = { + .indent = next_indent, + .str = ret, + .t = t, + .cnt = 0, + .tag = tag + }; + pgmoneta_art_iterate(t, art_to_text_string_cb, ¶m); + ret = pgmoneta_append(NULL, param.str); + return ret; } \ No newline at end of file diff --git a/src/libpgmoneta/deque.c b/src/libpgmoneta/deque.c index 26b66eb7..9f65b457 100644 --- a/src/libpgmoneta/deque.c +++ b/src/libpgmoneta/deque.c @@ -61,6 +61,12 @@ deque_next(struct deque* deque, struct deque_node* node); static struct deque_node* deque_find(struct deque* deque, char* tag); +static char* +to_json_string(struct deque* deque, char* tag, int indent); + +static char* +to_text_string(struct deque* deque, char* tag, int indent); + int pgmoneta_deque_create(bool thread_safe, struct deque** deque) { @@ -265,7 +271,7 @@ pgmoneta_deque_list(struct deque* deque) char* str = NULL; if (pgmoneta_log_is_enabled(PGMONETA_LOGGING_LEVEL_DEBUG5)) { - str = pgmoneta_deque_to_string(deque, NULL, 0); + str = pgmoneta_deque_to_string(deque, FORMAT_JSON, NULL, 0); pgmoneta_log_trace("Deque: %s", str); free(str); } @@ -318,32 +324,17 @@ pgmoneta_deque_remove(struct deque* deque, struct deque_node* node) } char* -pgmoneta_deque_to_string(struct deque* deque, char* tag, int indent) +pgmoneta_deque_to_string(struct deque* deque, int32_t format, char* tag, int indent) { - char* ret = NULL; - ret = pgmoneta_indent(ret, tag, indent); - struct deque_node* cur = NULL; - if (deque == NULL || pgmoneta_deque_empty(deque)) + if (format == FORMAT_JSON) { - ret = pgmoneta_append(ret, "[]"); - return ret; + return to_json_string(deque, tag, indent); } - deque_read_lock(deque); - ret = pgmoneta_append(ret, "[\n"); - cur = deque_next(deque, deque->start); - while (cur != NULL) + else if (format == FORMAT_TEXT) { - bool has_next = cur->next != deque->end; - char* str = pgmoneta_value_to_string(cur->data, cur->tag, indent + INDENT_PER_LEVEL); - ret = pgmoneta_append(ret, str); - ret = pgmoneta_append(ret, has_next?",\n":"\n"); - free(str); - cur = deque_next(deque, cur); + return to_text_string(deque, tag, indent); } - ret = pgmoneta_indent(ret, NULL, indent); - ret = pgmoneta_append(ret, "]"); - deque_unlock(deque); - return ret; + return NULL; } uint32_t @@ -527,4 +518,87 @@ deque_find(struct deque* deque, char* tag) n = deque_next(deque, n); } return NULL; +} + +static char* +to_json_string(struct deque* deque, char* tag, int indent) +{ + char* ret = NULL; + ret = pgmoneta_indent(ret, tag, indent); + struct deque_node* cur = NULL; + if (deque == NULL || pgmoneta_deque_empty(deque)) + { + ret = pgmoneta_append(ret, "[]"); + return ret; + } + deque_read_lock(deque); + ret = pgmoneta_append(ret, "[\n"); + cur = deque_next(deque, deque->start); + while (cur != NULL) + { + bool has_next = cur->next != deque->end; + char* str = NULL; + char* t = NULL; + if (cur->tag != NULL) + { + t = pgmoneta_append(t, cur->tag); + t = pgmoneta_append(t, ": "); + } + str = pgmoneta_value_to_string(cur->data, FORMAT_JSON, t, indent + INDENT_PER_LEVEL); + free(t); + ret = pgmoneta_append(ret, str); + ret = pgmoneta_append(ret, has_next ? ",\n" : "\n"); + free(str); + cur = deque_next(deque, cur); + } + ret = pgmoneta_indent(ret, NULL, indent); + ret = pgmoneta_append(ret, "]"); + deque_unlock(deque); + return ret; +} + +static char* +to_text_string(struct deque* deque, char* tag, int indent) +{ + char* ret = NULL; + int cnt = 0; + int next_indent = pgmoneta_compare_string(tag, BULLET_POINT) ? 0 : indent; + // we have a tag and it's not the bullet point, so that means another line + if (tag != NULL && !pgmoneta_compare_string(tag, BULLET_POINT)) + { + ret = pgmoneta_indent(ret, tag, indent); + next_indent += INDENT_PER_LEVEL; + } + struct deque_node* cur = NULL; + if (deque == NULL || pgmoneta_deque_empty(deque)) + { + ret = pgmoneta_append(ret, "[]"); + return ret; + } + deque_read_lock(deque); + cur = deque_next(deque, deque->start); + while (cur != NULL) + { + bool has_next = cur->next != deque->end; + char* str = NULL; + str = pgmoneta_value_to_string(cur->data, FORMAT_TEXT, BULLET_POINT, next_indent); + if (cnt == 0) + { + cnt++; + if (pgmoneta_compare_string(tag, BULLET_POINT)) + { + next_indent = indent + INDENT_PER_LEVEL; + } + } + if (cur->data->type == ValueJSON) + { + ret = pgmoneta_indent(ret, BULLET_POINT, next_indent); + } + ret = pgmoneta_append(ret, str); + ret = pgmoneta_append(ret, has_next ? "\n" : ""); + free(str); + cur = deque_next(deque, cur); + } + deque_unlock(deque); + return ret; } \ No newline at end of file diff --git a/src/libpgmoneta/json.c b/src/libpgmoneta/json.c index 56741d73..56a57613 100644 --- a/src/libpgmoneta/json.c +++ b/src/libpgmoneta/json.c @@ -46,8 +46,8 @@ static bool json_peek_next_char(struct json_reader* reader, char* next); static int json_fast_forward_value(struct json_reader* reader, char ch); static int json_stream_parse_item(struct json_reader* reader, struct json** item); static bool type_allowed(enum value_type type); -static char* item_to_string(struct json* item, char* tag, int indent); -static char* array_to_string(struct json* array, char* tag, int indent); +static char* item_to_string(struct json* item, int32_t format, char* tag, int indent); +static char* array_to_string(struct json* array, int32_t format, char* tag, int indent); static int parse_string(char* str, uint64_t* index, struct json** obj); static int json_add(struct json* obj, char* key, uintptr_t val, enum value_type type); static int fill_value(char* str, char* key, uint64_t* index, struct json* o); @@ -396,29 +396,32 @@ pgmoneta_json_free(struct json* object) } char* -pgmoneta_json_to_string(struct json* object, char* tag, int indent) +pgmoneta_json_to_string(struct json* object, int32_t format, char* tag, int indent) { char* str = NULL; if (object == NULL || (object->type == JSONUnknown || object->elements == NULL)) { str = pgmoneta_indent(str, tag, indent); - str = pgmoneta_append(str, "{}"); + if (format == FORMAT_JSON) + { + str = pgmoneta_append(str, "{}"); + } return str; } if (object->type != JSONArray) { - return item_to_string(object, tag, indent); + return item_to_string(object, format, tag, indent); } else { - return array_to_string(object, tag, indent); + return array_to_string(object, format, tag, indent); } } void -pgmoneta_json_print(struct json* object) +pgmoneta_json_print(struct json* object, int32_t format) { - char* str = pgmoneta_json_to_string(object, NULL, 0); + char* str = pgmoneta_json_to_string(object, format, NULL, 0); printf("%s", str); free(str); } @@ -545,6 +548,24 @@ pgmoneta_json_parse_string(char* str, struct json** obj) return parse_string(str, &idx, obj); } +int +pgmoneta_json_clone(struct json* from, struct json** to) +{ + struct json* o = NULL; + char* str = NULL; + str = pgmoneta_json_to_string(from, FORMAT_JSON, NULL, 0); + if (pgmoneta_json_parse_string(str, &o)) + { + goto error; + } + *to = o; + free(str); + return 0; +error: + free(str); + return 1; +} + static int parse_string(char* str, uint64_t* index, struct json** obj) { @@ -1256,13 +1277,13 @@ type_allowed(enum value_type type) } static char* -item_to_string(struct json* item, char* tag, int indent) +item_to_string(struct json* item, int32_t format, char* tag, int indent) { - return pgmoneta_art_to_string(item->elements, tag, indent); + return pgmoneta_art_to_string(item->elements, format, tag, indent); } static char* -array_to_string(struct json* array, char* tag, int indent) +array_to_string(struct json* array, int32_t format, char* tag, int indent) { - return pgmoneta_deque_to_string(array->elements, tag, indent); + return pgmoneta_deque_to_string(array->elements, format, tag, indent); } \ No newline at end of file diff --git a/src/libpgmoneta/management.c b/src/libpgmoneta/management.c index 14781cd5..2d851299 100644 --- a/src/libpgmoneta/management.c +++ b/src/libpgmoneta/management.c @@ -4290,6 +4290,6 @@ is_command_json_object_faulty(struct json* json) static void print_and_free_json_object(struct json* json) { - pgmoneta_json_print(json); + pgmoneta_json_print(json, FORMAT_JSON); pgmoneta_json_free(json); } diff --git a/src/libpgmoneta/utils.c b/src/libpgmoneta/utils.c index 5e5dea95..936060a3 100644 --- a/src/libpgmoneta/utils.c +++ b/src/libpgmoneta/utils.c @@ -3920,9 +3920,7 @@ pgmoneta_indent(char* str, char* tag, int indent) } if (tag != NULL) { - str = pgmoneta_append(str, "\""); str = pgmoneta_append(str, tag); - str = pgmoneta_append(str, "\": "); } return str; } diff --git a/src/libpgmoneta/value.c b/src/libpgmoneta/value.c index e36846ab..c0800257 100644 --- a/src/libpgmoneta/value.c +++ b/src/libpgmoneta/value.c @@ -44,23 +44,23 @@ static void free_destroy_cb(uintptr_t data); static void art_destroy_cb(uintptr_t data); static void deque_destroy_cb(uintptr_t data); static void json_destroy_cb(uintptr_t data); -static char* noop_to_string_cb(uintptr_t data, char* tag, int indent); -static char* int8_to_string_cb(uintptr_t data, char* tag, int indent); -static char* uint8_to_string_cb(uintptr_t data, char* tag, int indent); -static char* int16_to_string_cb(uintptr_t data, char* tag, int indent); -static char* uint16_to_string_cb(uintptr_t data, char* tag, int indent); -static char* int32_to_string_cb(uintptr_t data, char* tag, int indent); -static char* uint32_to_string_cb(uintptr_t data, char* tag, int indent); -static char* int64_to_string_cb(uintptr_t data, char* tag, int indent); -static char* uint64_to_string_cb(uintptr_t data, char* tag, int indent); -static char* float_to_string_cb(uintptr_t data, char* tag, int indent); -static char* double_to_string_cb(uintptr_t data, char* tag, int indent); -static char* string_to_string_cb(uintptr_t data, char* tag, int indent); -static char* bool_to_string_cb(uintptr_t data, char* tag, int indent); -static char* deque_to_string_cb(uintptr_t data, char* tag, int indent); -static char* art_to_string_cb(uintptr_t data, char* tag, int indent); -static char* json_to_string_cb(uintptr_t data, char* tag, int indent); -static char* verify_entry_to_string_cb(uintptr_t data, char* tag, int indent); +static char* noop_to_string_cb(uintptr_t data, int32_t format, char* tag, int indent); +static char* int8_to_string_cb(uintptr_t data, int32_t format, char* tag, int indent); +static char* uint8_to_string_cb(uintptr_t data, int32_t format, char* tag, int indent); +static char* int16_to_string_cb(uintptr_t data, int32_t format, char* tag, int indent); +static char* uint16_to_string_cb(uintptr_t data, int32_t format, char* tag, int indent); +static char* int32_to_string_cb(uintptr_t data, int32_t format, char* tag, int indent); +static char* uint32_to_string_cb(uintptr_t data, int32_t format, char* tag, int indent); +static char* int64_to_string_cb(uintptr_t data, int32_t format, char* tag, int indent); +static char* uint64_to_string_cb(uintptr_t data, int32_t format, char* tag, int indent); +static char* float_to_string_cb(uintptr_t data, int32_t format, char* tag, int indent); +static char* double_to_string_cb(uintptr_t data, int32_t format, char* tag, int indent); +static char* string_to_string_cb(uintptr_t data, int32_t format, char* tag, int indent); +static char* bool_to_string_cb(uintptr_t data, int32_t format, char* tag, int indent); +static char* deque_to_string_cb(uintptr_t data, int32_t format, char* tag, int indent); +static char* art_to_string_cb(uintptr_t data, int32_t format, char* tag, int indent); +static char* json_to_string_cb(uintptr_t data, int32_t format, char* tag, int indent); +static char* verify_entry_to_string_cb(uintptr_t data, int32_t format, char* tag, int indent); int pgmoneta_value_create(enum value_type type, uintptr_t data, struct value** value) @@ -195,9 +195,9 @@ pgmoneta_value_data(struct value* value) } char* -pgmoneta_value_to_string(struct value* value, char* tag, int indent) +pgmoneta_value_to_string(struct value* value, int32_t format, char* tag, int indent) { - return value->to_string(value->data, tag, indent); + return value->to_string(value->data, format, tag, indent); } uintptr_t @@ -283,16 +283,17 @@ json_destroy_cb(uintptr_t data) } static char* -noop_to_string_cb(uintptr_t data, char* tag, int indent) +noop_to_string_cb(uintptr_t data, int32_t format, char* tag, int indent) { (void) data; (void) tag; (void) indent; + (void) format; return NULL; } static char* -int8_to_string_cb(uintptr_t data, char* tag, int indent) +int8_to_string_cb(uintptr_t data, int32_t format, char* tag, int indent) { char* ret = NULL; ret = pgmoneta_indent(ret, tag, indent); @@ -304,7 +305,7 @@ int8_to_string_cb(uintptr_t data, char* tag, int indent) } static char* -uint8_to_string_cb(uintptr_t data, char* tag, int indent) +uint8_to_string_cb(uintptr_t data, int32_t format, char* tag, int indent) { char* ret = NULL; ret = pgmoneta_indent(ret, tag, indent); @@ -316,7 +317,7 @@ uint8_to_string_cb(uintptr_t data, char* tag, int indent) } static char* -int16_to_string_cb(uintptr_t data, char* tag, int indent) +int16_to_string_cb(uintptr_t data, int32_t format, char* tag, int indent) { char* ret = NULL; ret = pgmoneta_indent(ret, tag, indent); @@ -328,7 +329,7 @@ int16_to_string_cb(uintptr_t data, char* tag, int indent) } static char* -uint16_to_string_cb(uintptr_t data, char* tag, int indent) +uint16_to_string_cb(uintptr_t data, int32_t format, char* tag, int indent) { char* ret = NULL; ret = pgmoneta_indent(ret, tag, indent); @@ -340,7 +341,7 @@ uint16_to_string_cb(uintptr_t data, char* tag, int indent) } static char* -int32_to_string_cb(uintptr_t data, char* tag, int indent) +int32_to_string_cb(uintptr_t data, int32_t format, char* tag, int indent) { char* ret = NULL; ret = pgmoneta_indent(ret, tag, indent); @@ -352,7 +353,7 @@ int32_to_string_cb(uintptr_t data, char* tag, int indent) } static char* -uint32_to_string_cb(uintptr_t data, char* tag, int indent) +uint32_to_string_cb(uintptr_t data, int32_t format, char* tag, int indent) { char* ret = NULL; ret = pgmoneta_indent(ret, tag, indent); @@ -364,7 +365,7 @@ uint32_to_string_cb(uintptr_t data, char* tag, int indent) } static char* -int64_to_string_cb(uintptr_t data, char* tag, int indent) +int64_to_string_cb(uintptr_t data, int32_t format, char* tag, int indent) { char* ret = NULL; ret = pgmoneta_indent(ret, tag, indent); @@ -376,7 +377,7 @@ int64_to_string_cb(uintptr_t data, char* tag, int indent) } static char* -uint64_to_string_cb(uintptr_t data, char* tag, int indent) +uint64_to_string_cb(uintptr_t data, int32_t format, char* tag, int indent) { char* ret = NULL; ret = pgmoneta_indent(ret, tag, indent); @@ -388,7 +389,7 @@ uint64_to_string_cb(uintptr_t data, char* tag, int indent) } static char* -float_to_string_cb(uintptr_t data, char* tag, int indent) +float_to_string_cb(uintptr_t data, int32_t format, char* tag, int indent) { char* ret = NULL; ret = pgmoneta_indent(ret, tag, indent); @@ -400,7 +401,7 @@ float_to_string_cb(uintptr_t data, char* tag, int indent) } static char* -double_to_string_cb(uintptr_t data, char* tag, int indent) +double_to_string_cb(uintptr_t data, int32_t format, char* tag, int indent) { char* ret = NULL; ret = pgmoneta_indent(ret, tag, indent); @@ -412,7 +413,7 @@ double_to_string_cb(uintptr_t data, char* tag, int indent) } static char* -string_to_string_cb(uintptr_t data, char* tag, int indent) +string_to_string_cb(uintptr_t data, int32_t format, char* tag, int indent) { char* ret = NULL; ret = pgmoneta_indent(ret, tag, indent); @@ -421,18 +422,39 @@ string_to_string_cb(uintptr_t data, char* tag, int indent) memset(buf, 0, MISC_LENGTH); if (str == NULL) { - snprintf(buf, MISC_LENGTH, "null"); + if (format == FORMAT_JSON) + { + snprintf(buf, MISC_LENGTH, "null"); + } + } + else if (strlen(str) == 0) + { + if (format == FORMAT_JSON) + { + snprintf(buf, MISC_LENGTH, "\"%s\"", str); + } + else if (format == FORMAT_TEXT) + { + snprintf(buf, MISC_LENGTH, "''"); + } } else { - snprintf(buf, MISC_LENGTH, "\"%s\"", str); + if (format == FORMAT_JSON) + { + snprintf(buf, MISC_LENGTH, "\"%s\"", str); + } + else if (format == FORMAT_TEXT) + { + snprintf(buf, MISC_LENGTH, "%s", str); + } } ret = pgmoneta_append(ret, buf); return ret; } static char* -bool_to_string_cb(uintptr_t data, char* tag, int indent) +bool_to_string_cb(uintptr_t data, int32_t format, char* tag, int indent) { char* ret = NULL; ret = pgmoneta_indent(ret, tag, indent); @@ -442,25 +464,25 @@ bool_to_string_cb(uintptr_t data, char* tag, int indent) } static char* -deque_to_string_cb(uintptr_t data, char* tag, int indent) +deque_to_string_cb(uintptr_t data, int32_t format, char* tag, int indent) { - return pgmoneta_deque_to_string((struct deque*)data, tag, indent); + return pgmoneta_deque_to_string((struct deque*)data, format, tag, indent); } static char* -art_to_string_cb(uintptr_t data, char* tag, int indent) +art_to_string_cb(uintptr_t data, int32_t format, char* tag, int indent) { - return pgmoneta_art_to_string((struct art*) data, tag, indent); + return pgmoneta_art_to_string((struct art*) data, format, tag, indent); } static char* -json_to_string_cb(uintptr_t data, char* tag, int indent) +json_to_string_cb(uintptr_t data, int32_t format, char* tag, int indent) { - return pgmoneta_json_to_string((struct json*)data, tag, indent); + return pgmoneta_json_to_string((struct json*)data, format, tag, indent); } static char* -verify_entry_to_string_cb(uintptr_t data, char* tag, int indent) +verify_entry_to_string_cb(uintptr_t data, int32_t format, char* tag, int indent) { - return pgmoneta_verify_entry_to_string((struct verify_entry*)data, tag, indent); + return pgmoneta_verify_entry_to_string((struct verify_entry*)data, format, tag, indent); } \ No newline at end of file diff --git a/src/libpgmoneta/verify.c b/src/libpgmoneta/verify.c index 5a70fdbe..cc0fdf1b 100644 --- a/src/libpgmoneta/verify.c +++ b/src/libpgmoneta/verify.c @@ -200,7 +200,7 @@ verify_backup(SSL* ssl, int client_fd, int server, char* backup_id, char* direct } char* -pgmoneta_verify_entry_to_string(struct verify_entry* entry, char* tag, int indent) +pgmoneta_verify_entry_to_string(struct verify_entry* entry, int32_t format, char* tag, int indent) { struct json* obj = NULL; char* str = NULL; @@ -210,7 +210,7 @@ pgmoneta_verify_entry_to_string(struct verify_entry* entry, char* tag, int inden pgmoneta_json_put(obj, "original", (uintptr_t)entry->original, ValueString); pgmoneta_json_put(obj, "calculated", (uintptr_t)entry->calculated, ValueString); pgmoneta_json_put(obj, "hash_algorithm", (uintptr_t)entry->hash_algoritm, ValueInt32); - str = pgmoneta_json_to_string(obj, tag, indent); + str = pgmoneta_json_to_string(obj, format, tag, indent); pgmoneta_json_free(obj); return str; } \ No newline at end of file