ctdlload: load message metadata
authorArt Cancro <ajc@citadel.org>
Fri, 14 Jul 2023 03:18:02 +0000 (18:18 -0900)
committerArt Cancro <ajc@citadel.org>
Fri, 14 Jul 2023 03:18:02 +0000 (18:18 -0900)
citadel/utils/ctdlload.c

index d96d234f4878ff04fcdb921b662751132aecd8f8..4ee86c2f991dc10efe40b2ce73e860cfaec5dc5f 100644 (file)
@@ -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);