ctdldump: export visit table
authorArt Cancro <ajc@citadel.org>
Tue, 11 Jul 2023 16:12:41 +0000 (07:12 -0900)
committerArt Cancro <ajc@citadel.org>
Tue, 11 Jul 2023 16:12:41 +0000 (07:12 -0900)
citadel/utils/ctdldump.c

index d2d370d18470ec137c7b71d97111a33b2785c03f..96c989305ee2233007cf369c6e2bf48fadc69e45 100644 (file)
@@ -234,81 +234,52 @@ void export_floor(int which_cdb, DBT *in_key, DBT *in_data) {
 }
 
 
-#if 0
 // export function for a msglist or a fulltext index record
 // (both are indexed by a long and the data is arrays of longs)
-void export_msglists(int which_cdb, DBT *in_key, DBT *in_data, DBT *out_key, DBT *out_data) {
+void export_msglist(int which_cdb, DBT *in_key, DBT *in_data) {
        int i;
-
-       char *table = (which_cdb == CDB_FULLTEXT) ? "FullText" : "Msglist";
+       int num_msgs;
+       long msg;
 
        // records are indexed by a single "long" and contains an array of zero or more "long"s
-       // and remember ... "long" is int32_t on the source system
-       int32_t in_roomnum;
-       long out_roomnum;
-       memcpy(&in_roomnum, in_key->data, sizeof(in_roomnum));
-       out_roomnum = (long) in_roomnum;
+       long roomnum;
+       memcpy(&roomnum, in_key->data, sizeof(long));
 
-       if (in_key->size != 4) {
-               fprintf(stderr, "\033[31m\033[1m *** SOURCE DATABASE IS NOT 32-BIT *** ABORTING *** \033[0m\n");
-               abort();
-       }
-
-       int num_msgs = in_data->size / sizeof(int32_t);
-       // printf("\033[32m\033[1m%s: key %ld (%d messages)\033[0m\n", table, out_roomnum, num_msgs);
+       printf("msglist|%ld|", roomnum);
 
-       // the key is a "long"
-       out_key->size = sizeof(out_roomnum);
-       out_key->data = realloc(out_key->data, out_key->size);
-       memcpy(out_key->data, &out_roomnum, sizeof(out_roomnum));
-
-       // the data is another array, but a wider type
-       out_data->size = sizeof(long) * num_msgs;
-       out_data->data = realloc(out_data->data, out_data->size);
-
-       int32_t in_msg = 0;
-       long out_msg = 0;
-       for (i=0; i<num_msgs; ++i) {
-               memcpy(&in_msg, (in_data->data + (i * sizeof(int32_t))), sizeof(int32_t));
-               out_msg = (long) in_msg;
-               memcpy((out_data->data + (i * sizeof(long))), &out_msg, sizeof(long));
-               // printf("msg#%ld\n", out_msg);
+       if (in_data->size > 0) {
+               num_msgs = in_data->size / sizeof(long);
+               for (i=0; i<num_msgs; ++i) {
+                       memcpy(&msg, (in_data->data + (i * sizeof(long))), sizeof(long));
+                       if (i != 0) {
+                               printf(",");
+                       }
+                       printf("%ld", msg);
+               }
        }
+       printf("\n");
 }
 
 
 // export function for a visit record
-void export_visits(int which_cdb, DBT *in_key, DBT *in_data, DBT *out_key, DBT *out_data) {
-
-       // data
-       struct visit_32 *visit32 = (struct visit_32 *)in_data->data;
-       out_data->size = sizeof(struct visit);
-       out_data->data = realloc(out_data->data, out_data->size);
-       struct visit *visit64 = (struct visit *)out_data->data;
-
-       //  the data (zero it out so it will compress well)
-       memset(visit64, 0, sizeof(struct visit));
-       visit64->v_roomnum              = (long)        visit32->v_roomnum;
-       visit64->v_roomgen              = (long)        visit32->v_roomgen;
-       visit64->v_usernum              = (long)        visit32->v_usernum;
-       visit64->v_lastseen             = (long)        visit32->v_lastseen;
-       visit64->v_flags                = (unsigned)    visit32->v_flags;
-       strcpy(visit64->v_seen,                         visit32->v_seen);
-       strcpy(visit64->v_answered,                     visit32->v_answered);
-       visit64->v_view                 = (int)         visit32->v_view;
-
-       // printf("\033[32m\033[1mVisit: room %10ld, gen %10ld, user %10ld\033[0m\n", visit64->v_roomnum, visit64->v_roomgen, visit64->v_usernum);
-
-       // create the key (which is based on the data, so there is no need to convert the old key)
-       out_key->size = sizeof(struct visit_index);
-       out_key->data = realloc(out_key->data, out_key->size);
-       struct visit_index *newvisitindex = (struct visit_index *) out_key->data;
-       newvisitindex->iRoomID          =               visit64->v_roomnum;
-       newvisitindex->iRoomGen         =               visit64->v_roomgen;
-       newvisitindex->iUserID          =               visit64->v_usernum;
+void export_visit(int which_cdb, DBT *in_key, DBT *in_data) {
+
+       struct visit *visit = (struct visit *)in_data->data;
+
+       printf("visit|%ld|%ld|%ld|%ld|%u|%s|%s|%d\n",
+               visit->v_roomnum,
+               visit->v_roomgen,
+               visit->v_usernum,
+               visit->v_lastseen,
+               visit->v_flags,
+               visit->v_seen,
+               visit->v_answered,
+               visit->v_view
+       );
 }
 
 
+#if 0
 // export function for a directory record
 void export_dir(int which_cdb, DBT *in_key, DBT *in_data, DBT *out_key, DBT *out_data) {
 
@@ -481,8 +452,8 @@ void (*export_functions[])(int which_cdb, DBT *in_key, DBT *in_data) = {
        export_user,            // CDB_USERS
        export_room,            // CDB_ROOMS
        export_floor,           // CDB_FLOORTAB
-       zero_function,          // CDB_MSGLISTS
-       zero_function,          // CDB_VISIT
+       export_msglist,         // CDB_MSGLISTS
+       export_visit,           // CDB_VISIT
        zero_function,          // CDB_DIRECTORY
        zero_function,          // CDB_USETABLE
        zero_function,          // CDB_BIGMSGS