diff options
Diffstat (limited to 'src/cli/export.c')
| -rw-r--r-- | src/cli/export.c | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/src/cli/export.c b/src/cli/export.c new file mode 100644 index 0000000..4288ba4 --- /dev/null +++ b/src/cli/export.c @@ -0,0 +1,98 @@ +#include "cli/cli.h" + +#include "mcp/tools/common/common.h" +#include "storage/codec.h" +#include "storage/store.h" + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +int +tiny_cli_export(tiny_store_t *store, const tiny_cli_options_t *options) +{ + size_t index; + size_t emitted = 0; + FILE *output = NULL; + tiny_json_buffer_t item; + + if (!options || !options->export_path) + { + fprintf(stderr, "export: path is required\n"); + return 1; + } + + if (strcmp(options->export_path, "-") == 0) + { + output = stdout; + } + else + { + if (fopen_s(&output, options->export_path, "wb") != 0 || !output) + { + fprintf(stderr, "export: unable to open '%s'\n", options->export_path); + return 1; + } + } + + if (fprintf(output, "{\"type\":\"tiny-convmem-manifest\",\"format_version\":2}\n") < 0) + { + fprintf(stderr, "export: failed to write manifest\n"); + if (output != stdout) + { + fclose(output); + } + return 1; + } + + for (index = 0; index < tiny_store_entry_count(store); ++index) + { + const tiny_store_entry_t *entry = tiny_store_entry(store, index); + int write_failed; + if (!entry) + { + continue; + } + if (entry->deleted && !options->include_deleted) + { + continue; + } + if (options->session_id && options->session_id[0] + && strcmp(entry->message.session_id, options->session_id) != 0) + { + continue; + } + + tiny_json_init(&item); + if (entry->deleted) + { + tiny_json_raw(&item, "{\"type\":\"DEL\",\"message_id\":"); + tiny_json_string(&item, entry->message.message_id); + tiny_json_raw(&item, "}"); + } + else + { + tiny_mcp_tool_append_message(&item, &entry->message); + } + + write_failed = item.failed || fprintf(output, "%s\n", item.data ? item.data : "") < 0; + tiny_json_free(&item); + if (write_failed) + { + fprintf(stderr, "export: failed to write record\n"); + if (output != stdout) + { + fclose(output); + } + return 1; + } + emitted++; + } + + if (output != stdout) + { + fclose(output); + } + (void)emitted; + return 0; +} |
