summaryrefslogtreecommitdiff
path: root/src/storage/store.c
diff options
context:
space:
mode:
authortanaka takashi <isazaka@gmail.com>2026-07-04 17:21:32 +0900
committertanaka takashi <isazaka@gmail.com>2026-07-04 17:21:32 +0900
commit0634f2048c7c9a474aab1d8104b964b3bf70a064 (patch)
tree508c305a64cbd3b01f5146776e22865d283d5dbb /src/storage/store.c
parenteb5e9d9f37bda7d78f69614da70402357794168a (diff)
feat(P1-002): migrate offline JSONL import/export to dedicated CLI
- Replace the MCP import_messages tool with standalone CLI commands: iny-convmem-mcp --data-dir <path> --import <file> iny-convmem-mcp --data-dir <path> --export <file> - Add src/cli/{import,export,cli.h} and a CTest process test (tiny-convmem-mcp.cli) covering round-trip, manifest generation, overwrite/reject policies, and include_deleted export. - Fix Debug heap corruption in iny_store_import() by deep-copying imported messages instead of taking ownership of caller-allocated records, which were later freed by the caller. - Remove the now-redundant src/mcp/tools/import_messages.c and keep the tool registry at 7 MCP tools. - Update docs/development-plan.md (P1-002 complete) and docs/implementation-status.md with CLI test coverage.
Diffstat (limited to 'src/storage/store.c')
-rw-r--r--src/storage/store.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/src/storage/store.c b/src/storage/store.c
index 45621d1..5701578 100644
--- a/src/storage/store.c
+++ b/src/storage/store.c
@@ -1957,16 +1957,26 @@ tiny_store_import(tiny_store_t *store,
}
if (existing != NULL)
{
+ tiny_message_t replacement;
+ tiny_message_init(&replacement);
+ if (tiny_message_copy(&replacement, &record->message) != 0)
+ {
+ status = TINY_STORE_NO_MEMORY;
+ break;
+ }
tiny_message_free(&existing->message);
existing->deleted = record->deleted;
existing->sequence = (uint64_t)record->message.timestamp_ms;
- existing->message = record->message;
+ existing->message = replacement;
(*imported_count)++;
}
else
{
- if (!ensure_entries(store))
+ tiny_message_t copied;
+ tiny_message_init(&copied);
+ if (!ensure_entries(store) || tiny_message_copy(&copied, &record->message) != 0)
{
+ tiny_message_free(&copied);
status = TINY_STORE_NO_MEMORY;
break;
}
@@ -1974,7 +1984,7 @@ tiny_store_import(tiny_store_t *store,
&store->entries[store->entry_count], 0, sizeof(store->entries[store->entry_count]));
store->entries[store->entry_count].deleted = record->deleted;
store->entries[store->entry_count].sequence = (uint64_t)record->message.timestamp_ms;
- store->entries[store->entry_count].message = record->message;
+ store->entries[store->entry_count].message = copied;
store->entry_count++;
(*imported_count)++;
}