4 * Index messages by EUID per room.
14 #if TIME_WITH_SYS_TIME
15 # include <sys/time.h>
19 # include <sys/time.h>
34 #include "serv_extensions.h"
38 #include "sysdep_decls.h"
39 #include "citserver.h"
46 #include "euidindex.h"
49 long locate_message_by_euid(char *euid, struct ctdlroom *qrbuf) {
52 struct cdbdata *cdb_euid;
55 lprintf(CTDL_DEBUG, "Searching for EUID <%s> in <%s>\n", euid, qrbuf->QRname);
57 key_len = strlen(euid) + sizeof(long) + 1;
58 key = malloc(key_len);
59 memcpy(key, &qrbuf->QRnumber, sizeof(long));
60 strcpy(&key[sizeof(long)], euid);
62 cdb_euid = cdb_fetch(CDB_EUIDINDEX, key, key_len);
65 if (cdb_euid == NULL) {
69 if (cdb_euid->len == sizeof(long)) {
70 msgnum = *(long *)cdb_euid->ptr;
74 lprintf(CTDL_DEBUG, "returning msgnum==%ld\n", msgnum);
78 void index_message_by_euid(char *euid, struct ctdlroom *qrbuf, long msgnum) {
82 lprintf(CTDL_DEBUG, "Indexing message #%ld <%s> in <%s>\n", msgnum, euid, qrbuf->QRname);
84 key_len = strlen(euid) + sizeof(long) + 1;
85 key = malloc(key_len);
86 memcpy(key, &qrbuf->QRnumber, sizeof(long));
87 strcpy(&key[sizeof(long)], euid);
89 cdb_store(CDB_EUIDINDEX, key, key_len, &msgnum, sizeof(long));
96 * Called by rebuild_euid_index_for_room() to index one message.
98 void rebuild_euid_index_for_msg(long msgnum, void *userdata) {
99 struct CtdlMessage *msg;
101 msg = CtdlFetchMessage(msgnum, 0);
102 if (msg == NULL) return;
103 if (msg->cm_fields['E'] != NULL) {
104 index_message_by_euid(msg->cm_fields['E'], &CC->room, msgnum);
106 CtdlFreeMessage(msg);
110 void rebuild_euid_index_for_room(struct ctdlroom *qrbuf, void *data) {
111 static struct RoomProcList *rplist = NULL;
112 struct RoomProcList *ptr;
115 /* Lazy programming here. Call this function as a ForEachRoom backend
116 * in order to queue up the room names, or call it with a null room
117 * to make it do the processing.
120 ptr = (struct RoomProcList *)
121 malloc(sizeof (struct RoomProcList));
122 if (ptr == NULL) return;
124 safestrncpy(ptr->name, qrbuf->QRname, sizeof ptr->name);
130 while (rplist != NULL) {
131 if (getroom(&qr, rplist->name) == 0) {
132 lprintf(CTDL_DEBUG, "Rebuilding EUID index for <%s>\n", rplist->name);
133 usergoto(rplist->name, 0, 0, NULL, NULL);
134 CtdlForEachMessage(MSGS_ALL, 0L, NULL, NULL, rebuild_euid_index_for_msg, NULL);
137 rplist = rplist->next;
144 * Globally rebuild the EUID indices in every room.
146 void rebuild_euid_index(void) {
147 cdb_trunc(CDB_EUIDINDEX);
149 ForEachRoom(rebuild_euid_index_for_room, NULL);
150 rebuild_euid_index_for_room(NULL, NULL);