}
+// 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) {
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);