import msglists
authorArt Cancro <ajc@citadel.org>
Mon, 17 Jul 2023 03:24:11 +0000 (18:24 -0900)
committerArt Cancro <ajc@citadel.org>
Mon, 17 Jul 2023 03:24:11 +0000 (18:24 -0900)
citadel/utils/ctdlload.c

index 97f3a0d4d888d8905a9023a88dcfb037e0dba7f1..979419d101b1c7de66df9524be2ec69880dc2a95 100644 (file)
@@ -352,6 +352,42 @@ int convert_floor(char *line, DBT *out_key, DBT *out_data) {
 }
 
 
+// Import a msglist record
+// msglist|26|32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51|
+int convert_msglist(char *line, DBT *out_key, DBT *out_data) {
+       long roomnum;
+       char *token;
+       char *p = line;
+       int num_msgs = 0;
+       long *msglist = NULL;
+
+       for (int i=0; (token = strsep(&p, "|")); ++i) {
+               switch(i) {
+                       case 1:
+                               roomnum = atol(token);
+                               break;
+                       case 2:
+                               char *q = token;
+                               char *mtoken;
+                               for (int j=0; (mtoken = strsep(&q, ",")); ++j) {
+                                       msglist = realloc(msglist, (num_msgs+1) * sizeof(long));
+                                       msglist[num_msgs++] = atol(mtoken);
+                               }
+                               break;
+               }
+       }
+
+       out_key->size = sizeof(long);
+       out_key->data = malloc(out_key->size);
+       memcpy(out_key->data, &roomnum, out_key->size);
+
+       out_data->size = num_msgs * sizeof(long);
+       out_data->data = msglist;
+
+       return(1);
+}
+
+
 #if 0
 // Convert a "foo" record to a record on disk.
 int convert_foo(char *line, DBT *out_key, DBT *out_data) {
@@ -370,7 +406,7 @@ int convert_foo(char *line, DBT *out_key, DBT *out_data) {
        out_key->data = strdup(r->QRname);
        out_data->size = sizeof(struct ctdlfoo);
        out_data->data = r;
-       return(0);
+       return(1);
 }
 #endif
 
@@ -459,7 +495,7 @@ void ingest_one(char *line, DB_ENV *dst_dbenv) {
        else if (!strcasecmp(record_type, "user"))              row_was_good = convert_user(line, &out_key, &out_data);
        else if (!strcasecmp(record_type, "room"))              row_was_good = convert_room(line, &out_key, &out_data);
        else if (!strcasecmp(record_type, "floor"))             row_was_good = convert_floor(line, &out_key, &out_data);
-       else if (!strcasecmp(record_type, "msglist"))           row_was_good = convert_foo(line, &out_key, &out_data);
+       else if (!strcasecmp(record_type, "msglist"))           row_was_good = convert_msglist(line, &out_key, &out_data);
        else if (!strcasecmp(record_type, "visit"))             row_was_good = convert_foo(line, &out_key, &out_data);
        else if (!strcasecmp(record_type, "dir"))               row_was_good = convert_foo(line, &out_key, &out_data);
        else if (!strcasecmp(record_type, "use"))               row_was_good = convert_foo(line, &out_key, &out_data);