From e6a5aa40c4b8c52b3ea6e55138b50f1d675edfa7 Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Thu, 13 Jul 2023 18:18:02 -0900 Subject: [PATCH] ctdlload: load message metadata --- citadel/utils/ctdlload.c | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/citadel/utils/ctdlload.c b/citadel/utils/ctdlload.c index d96d234f4..4ee86c2f9 100644 --- a/citadel/utils/ctdlload.c +++ b/citadel/utils/ctdlload.c @@ -146,6 +146,31 @@ int convert_msgtext(char *line, DBT *out_key, DBT *out_data) { } +// Convert a "msgmeta" record to a message metadata record on disk. NOT THREADSAFE +int convert_msgmeta(char *line, DBT *out_key, DBT *out_data) { + char *token; + struct MetaData *m = malloc(sizeof(struct MetaData)); + token = strtok(line, "|"); + m->meta_msgnum = atol(strtok(NULL, "|")); + m->meta_refcount = atoi(strtok(NULL, "|")); + strncpy(m->meta_content_type, strtok(NULL, "|"), sizeof(m->meta_content_type)); + m->meta_rfc822_length = atol(strtok(NULL, "|")); + + // metadata records are stored in the CDB_MSGMAIN table, + // but with the index being the *negative* of the message number. + long index = 0 - m->meta_msgnum; + out_key->size = sizeof(long); + out_key->data = reallok(NULL, out_key->size); + memcpy(out_key->data, &index, out_key->size); + + // data + out_data->size = sizeof(struct MetaData); + out_data->data = m; // out_data owns this memory now + + return(1); +} + + // Ingest one line of dump data. NOT REENTRANT void ingest_one(char *line, DB_ENV *dst_dbenv) { @@ -216,7 +241,7 @@ void ingest_one(char *line, DB_ENV *dst_dbenv) { memset(&out_data, 0, sizeof(DBT)); row_was_good = 0; if (!strcasecmp(record_type, "msgtext")) row_was_good = convert_msgtext(line, &out_key, &out_data); - else if (!strcasecmp(record_type, "msgmeta")) row_was_good = convert_foo(line, &out_key, &out_data); + else if (!strcasecmp(record_type, "msgmeta")) row_was_good = convert_msgmeta(line, &out_key, &out_data); else if (!strcasecmp(record_type, "user")) row_was_good = convert_foo(line, &out_key, &out_data); else if (!strcasecmp(record_type, "room")) row_was_good = convert_foo(line, &out_key, &out_data); else if (!strcasecmp(record_type, "floor")) row_was_good = convert_foo(line, &out_key, &out_data); -- 2.39.2