}
+void regenerate_secondary_indices(void) {
+ syslog(LOG_INFO, "regenerate_secondary_indices has been activated.");
+
+ rebuild_usersbynumber();
+ rebuild_euid_index();
+ CtdlRebuildDirectoryIndex();
+ // we also need to trigger the fulltext foo
+
+ CtdlSetConfigInt("regenerate_secondary_indices", 0);
+}
+
+
// Based on the server version number reported by the existing database,
// run in-place data format upgrades until everything is up to date.
void pre_startup_upgrades(void) {
if (oldver == 0) {
create_default_admin_account();
}
+
+ // Setting this key to nonzero causes the server to regenerate all data that can be derived
+ // from other tables: usersbynumber, directory, fulltext.
+ // The import utility (ctdlload) sets this key.
+ if (CtdlGetConfigInt("regenerate_secondary_indices") != 0) {
+ regenerate_secondary_indices();
+ }
}
// export function for a directory record
// (This is a secondary index -- should we just regenerate the data after import?)
-void export_dir(int which_cdb, DBT *in_key, DBT *in_data) {
- printf("dir|");
- fwrite(in_key->data, in_key->size, 1, stdout);
- printf("|%s|\n", (char *)in_data->data);
-}
+// void export_dir(int which_cdb, DBT *in_key, DBT *in_data) {
+ // printf("dir|");
+ // fwrite(in_key->data, in_key->size, 1, stdout);
+ // printf("|%s|\n", (char *)in_data->data);
+// }
// export function for a use table record
// export function for EUID Index records
-void export_euidindex(int which_cdb, DBT *in_key, DBT *in_data) {
+//void export_euidindex(int which_cdb, DBT *in_key, DBT *in_data) {
// The structure of an euidindex record *key* is:
// |----room_number----|----------EUID-------------|
// |-----msg_number----|----room_number----|----------EUID-------------|
// (sizeof long) (sizeof long) (actual length of euid)
- long msgnum, roomnum;
- char *euid;
-
- memcpy(&msgnum, in_data->data, sizeof(long));
- memcpy(&roomnum, in_data->data+sizeof(long), sizeof(msgnum));
- euid = in_data->data+(sizeof(long)*2);
+ //long msgnum, roomnum;
+ //char *euid;
- printf("euidindex|%ld|%ld|%s|\n", msgnum, roomnum, euid);
-}
+ //memcpy(&msgnum, in_data->data, sizeof(long));
+ //memcpy(&roomnum, in_data->data+sizeof(long), sizeof(msgnum));
+ //euid = in_data->data+(sizeof(long)*2);
+//
+ //printf("euidindex|%ld|%ld|%s|\n", msgnum, roomnum, euid);
+//}
// export users-by-number records
// (This is a secondary index -- should we just regenerate the data after import?)
-void export_usersbynumber(int which_cdb, DBT *in_key, DBT *in_data) {
+//void export_usersbynumber(int which_cdb, DBT *in_key, DBT *in_data) {
// key is a long
- long usernum;
- memcpy(&usernum, in_key->data, sizeof(usernum));
+ //long usernum;
+ //memcpy(&usernum, in_key->data, sizeof(usernum));
// value is a string
- printf("usersbynumber|%ld|%s|\n", usernum, (char *)in_data->data);
-}
+ //printf("usersbynumber|%ld|%s|\n", usernum, (char *)in_data->data);
+//}
// export function for a config record
export_floor, // CDB_FLOORTAB
export_msglist, // CDB_MSGLISTS
export_visit, // CDB_VISIT
- export_dir, // CDB_DIRECTORY
+ zero_function, // CDB_DIRECTORY (regenerate this on the server)
export_usetable, // CDB_USETABLE
export_bigmsg, // CDB_BIGMSGS
zero_function, // CDB_FULLTEXT (regenerate this on the server)
- export_euidindex, // CDB_EUIDINDEX
- export_usersbynumber, // CDB_USERSBYNUMBER
+ zero_function, // CDB_EUIDINDEX (regenerate this on the server)
+ zero_function, // CDB_USERSBYNUMBER (regenerate this on the server)
zero_function, // CDB_UNUSED1 (obsolete)
export_config // CDB_CONFIG
};
printf("begin|\n");
for (i = 0; i < MAXCDB; ++i) {
export_table(i, src_dbenv);
+ if (i == CDB_CONFIG) {
+ printf("config|regenerate_secondary_indices|1|\n"); // Force citserver to rebuild those tables
+ printf("config|MM_fulltext_wordbreaker|0|\n"); // Burn the full text search index
+ }
}
close_dbenv(src_dbenv);
printf("end|\n");
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_msglist(line, &out_key, &out_data);
else if (!strcasecmp(record_type, "visit")) row_was_good = convert_visit(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);
else if (!strcasecmp(record_type, "bigmsg")) row_was_good = convert_foo(line, &out_key, &out_data);
- else if (!strcasecmp(record_type, "euidindex")) row_was_good = convert_foo(line, &out_key, &out_data);
- else if (!strcasecmp(record_type, "usersbynumber")) row_was_good = convert_foo(line, &out_key, &out_data);
else if (!strcasecmp(record_type, "config")) row_was_good = convert_foo(line, &out_key, &out_data);
else row_was_good = 0;