From f7e9c0756da3c82bfcc61bc510ba20e337c34c6d Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Fri, 11 Aug 2023 03:42:20 -0900 Subject: [PATCH] Revert "Changed the API for cdb_rewind() / cdb_next_item() to make the caller hold the cursor" This reverts commit 733c6e8f2a624fb641cc50a9d253b3a914c25bba. --- citadel/server/backends/berkeley_db/berkeley_db.c | 13 ++++++------- citadel/server/control.c | 4 ++-- citadel/server/database.c | 4 ++-- citadel/server/database.h | 4 ++-- citadel/server/modules/ctdlproto/serv_rooms.c | 4 ++-- citadel/server/modules/ctdlproto/serv_user.c | 4 ++-- citadel/server/modules/expire/serv_expire.c | 12 ++++++------ citadel/server/modules/imap/imap_acl.c | 4 ++-- citadel/server/room_ops.c | 4 ++-- citadel/server/user_ops.c | 8 ++++---- 10 files changed, 30 insertions(+), 31 deletions(-) diff --git a/citadel/server/backends/berkeley_db/berkeley_db.c b/citadel/server/backends/berkeley_db/berkeley_db.c index 21c703a5f..ee437e046 100644 --- a/citadel/server/backends/berkeley_db/berkeley_db.c +++ b/citadel/server/backends/berkeley_db/berkeley_db.c @@ -603,13 +603,16 @@ void bdb_close_cursor(int cdb) { } -// Prepare for a sequential search of an entire database. Returns a cursor. -void *bdb_rewind(int cdb) { +// Prepare for a sequential search of an entire database. +// (There is guaranteed to be no more than one traversal in +// progress per thread at any given time.) +void bdb_rewind(int cdb) { int ret = 0; if (TSD->cursors[cdb] != NULL) { syslog(LOG_ERR, "bdb: bdb_rewind: must close cursor on database %d before reopening", cdb); bdb_abort(); + // bdb_cclose(TSD->cursors[cdb]); } // Now initialize the cursor @@ -618,15 +621,12 @@ void *bdb_rewind(int cdb) { syslog(LOG_ERR, "bdb: bdb_rewind: db_cursor: %s", db_strerror(ret)); bdb_abort(); } - - syslog(LOG_DEBUG, "\033[33m--- begin cursor %x ---\033[0m", cdb); - return((void *)TSD->cursors[cdb]); } // Fetch the next item in a sequential search. Returns a pointer to a // cdbdata structure, or NULL if we've hit the end. -struct cdbdata *bdb_next_item(void *cursor, int cdb) { +struct cdbdata *bdb_next_item(int cdb) { DBT key, data; struct cdbdata *cdbret; int ret = 0; @@ -644,7 +644,6 @@ struct cdbdata *bdb_next_item(void *cursor, int cdb) { bdb_abort(); } bdb_close_cursor(cdb); - syslog(LOG_DEBUG, "\033[33m--- end cursor %x ---\033[0m", cdb); return NULL; // presumably, end of file } diff --git a/citadel/server/control.c b/citadel/server/control.c index 80c24da55..27bc05b01 100644 --- a/citadel/server/control.c +++ b/citadel/server/control.c @@ -654,8 +654,8 @@ void cmd_conf(char *argbuf) { char *value = NULL; cprintf("%d all configuration variables\n", LISTING_FOLLOWS); - void *cur = cdb_rewind(CDB_CONFIG); - while (cdbcfg = cdb_next_item(cur, CDB_CONFIG), cdbcfg != NULL) { + cdb_rewind(CDB_CONFIG); + while (cdbcfg = cdb_next_item(CDB_CONFIG), cdbcfg != NULL) { if (cdbcfg->len < 1020) { keylen = strlen(cdbcfg->ptr); key = cdbcfg->ptr; diff --git a/citadel/server/database.c b/citadel/server/database.c index dcae3d0a0..5aa7d0e27 100644 --- a/citadel/server/database.c +++ b/citadel/server/database.c @@ -26,8 +26,7 @@ void (*cdb_close_databases)(void) = NULL; int (*cdb_store)(int, const void *, int, void *, int) = NULL; int (*cdb_delete)(int, void *, int) = NULL; void (*cdb_free)(struct cdbdata *) = NULL; -void * (*cdb_rewind)(int) = NULL; -struct cdbdata * (*cdb_next_item)(void *, int) = NULL; +struct cdbdata * (*cdb_next_item)(int) = NULL; void (*cdb_close_cursor)(int) = NULL; void (*cdb_begin_transaction)(void) = NULL; void (*cdb_end_transaction)(void) = NULL; @@ -37,6 +36,7 @@ void (*cdb_chmod_data)(void) = NULL; void (*check_handles)(void *) = NULL; void (*cdb_compact)(void) = NULL; void (*cdb_checkpoint)(void) = NULL; +void (*cdb_rewind)(int) = NULL; struct cdbdata * (*cdb_fetch)(int, const void *, int) = NULL; // This function is responsible for choosing and initializing a back end. diff --git a/citadel/server/database.h b/citadel/server/database.h index 9353b6085..418a2f5de 100644 --- a/citadel/server/database.h +++ b/citadel/server/database.h @@ -12,8 +12,7 @@ extern void (*cdb_close_databases)(void); extern int (*cdb_store)(int, const void *, int, void *, int); extern int (*cdb_delete)(int, void *, int); extern void (*cdb_free)(struct cdbdata *); -extern void * (*cdb_rewind)(int); -extern struct cdbdata * (*cdb_next_item)(void *, int); +extern struct cdbdata * (*cdb_next_item)(int); extern void (*cdb_close_cursor)(int); extern void (*cdb_begin_transaction)(void); extern void (*cdb_end_transaction)(void); @@ -24,5 +23,6 @@ extern void (*check_handles)(void *); extern struct cdbdata * (*cdb_fetch)(int, const void *, int); extern void (*cdb_checkpoint)(void); extern void (*cdb_compact)(void); +extern void (*cdb_rewind)(int); #endif diff --git a/citadel/server/modules/ctdlproto/serv_rooms.c b/citadel/server/modules/ctdlproto/serv_rooms.c index 6b3cdfc03..1ca2fc04f 100644 --- a/citadel/server/modules/ctdlproto/serv_rooms.c +++ b/citadel/server/modules/ctdlproto/serv_rooms.c @@ -326,8 +326,8 @@ void cmd_whok(char *cmdbuf) { int ra; cprintf("%d Who knows room:\n", LISTING_FOLLOWS); - void *cur = cdb_rewind(CDB_USERS); - while (cdbus = cdb_next_item(cur, CDB_USERS), cdbus != NULL) { + cdb_rewind(CDB_USERS); + while (cdbus = cdb_next_item(CDB_USERS), cdbus != NULL) { memset(&temp, 0, sizeof temp); memcpy(&temp, cdbus->ptr, sizeof temp); cdb_free(cdbus); diff --git a/citadel/server/modules/ctdlproto/serv_user.c b/citadel/server/modules/ctdlproto/serv_user.c index 8e7e50593..f5f4ef525 100644 --- a/citadel/server/modules/ctdlproto/serv_user.c +++ b/citadel/server/modules/ctdlproto/serv_user.c @@ -394,8 +394,8 @@ void cmd_gnur(char *argbuf) { } // There are unvalidated users. Traverse the user database, and return the first user we find that needs validation. - void *cur = cdb_rewind(CDB_USERS); - while (cdbus = cdb_next_item(cur, CDB_USERS), cdbus != NULL) { + cdb_rewind(CDB_USERS); + while (cdbus = cdb_next_item(CDB_USERS), cdbus != NULL) { memset(&usbuf, 0, sizeof(struct ctdluser)); memcpy(&usbuf, cdbus->ptr, ((cdbus->len > sizeof(struct ctdluser)) ? sizeof(struct ctdluser) : cdbus->len)); cdb_free(cdbus); diff --git a/citadel/server/modules/expire/serv_expire.c b/citadel/server/modules/expire/serv_expire.c index e07c51382..096360aa4 100644 --- a/citadel/server/modules/expire/serv_expire.c +++ b/citadel/server/modules/expire/serv_expire.c @@ -507,8 +507,8 @@ int PurgeVisits(void) { ForEachUser(AddValidUser, NULL); // Now traverse through the visits, purging irrelevant records... - void *cur = cdb_rewind(CDB_VISIT); - while(cdbvisit = cdb_next_item(cur, CDB_VISIT), cdbvisit != NULL) { + cdb_rewind(CDB_VISIT); + while(cdbvisit = cdb_next_item(CDB_VISIT), cdbvisit != NULL) { memset(&vbuf, 0, sizeof(struct visit)); memcpy(&vbuf, cdbvisit->ptr, ( (cdbvisit->len > sizeof(struct visit)) ? @@ -587,8 +587,8 @@ int PurgeUseTable(StrBuf *ErrMsg) { // Phase 1: traverse through the table, discovering old records... syslog(LOG_DEBUG, "Purge use table: phase 1"); - void *cur = cdb_rewind(CDB_USETABLE); - while(cdbut = cdb_next_item(cur, CDB_USETABLE), cdbut != NULL) { + cdb_rewind(CDB_USETABLE); + while(cdbut = cdb_next_item(CDB_USETABLE), cdbut != NULL) { ++total; if (cdbut->len > sizeof(struct UseTable)) memcpy(&ut, cdbut->ptr, sizeof(struct UseTable)); @@ -629,8 +629,8 @@ int PurgeEuidIndexTable(void) { // Phase 1: traverse through the table, discovering old records... syslog(LOG_DEBUG, "Purge EUID index: phase 1"); - void *cur = cdb_rewind(CDB_EUIDINDEX); - while(cdbei = cdb_next_item(cur, CDB_EUIDINDEX), cdbei != NULL) { + cdb_rewind(CDB_EUIDINDEX); + while(cdbei = cdb_next_item(CDB_EUIDINDEX), cdbei != NULL) { memcpy(&msgnum, cdbei->ptr, sizeof(long)); diff --git a/citadel/server/modules/imap/imap_acl.c b/citadel/server/modules/imap/imap_acl.c index 148d8788a..1cb6337f8 100644 --- a/citadel/server/modules/imap/imap_acl.c +++ b/citadel/server/modules/imap/imap_acl.c @@ -135,8 +135,8 @@ void imap_getacl(int num_parms, ConstStr *Params) { // Traverse the userlist rights = NewStrBuf(); - void *cur = cdb_rewind(CDB_USERS); - while (cdbus = cdb_next_item(cur, CDB_USERS), cdbus != NULL) { + cdb_rewind(CDB_USERS); + while (cdbus = cdb_next_item(CDB_USERS), cdbus != NULL) { memset(&temp, 0, sizeof temp); memcpy(&temp, cdbus->ptr, sizeof temp); cdb_free(cdbus); diff --git a/citadel/server/room_ops.c b/citadel/server/room_ops.c index 21ab47ac8..7fefdbbf3 100644 --- a/citadel/server/room_ops.c +++ b/citadel/server/room_ops.c @@ -527,8 +527,8 @@ void CtdlForEachRoom(ForEachRoomCallBack callback_func, void *in_data) { struct ctdlroom qrbuf; struct cdbdata *cdbqr; - void *cur = cdb_rewind(CDB_ROOMS); - while (cdbqr = cdb_next_item(cur, CDB_ROOMS), cdbqr != NULL) { + cdb_rewind(CDB_ROOMS); + while (cdbqr = cdb_next_item(CDB_ROOMS), cdbqr != NULL) { memset(&qrbuf, 0, sizeof(struct ctdlroom)); memcpy(&qrbuf, cdbqr->ptr, ((cdbqr->len > sizeof(struct ctdlroom)) ? sizeof(struct ctdlroom) : cdbqr->len) ); cdb_free(cdbqr); diff --git a/citadel/server/user_ops.c b/citadel/server/user_ops.c index 6abb6993e..76897347c 100644 --- a/citadel/server/user_ops.c +++ b/citadel/server/user_ops.c @@ -401,8 +401,8 @@ int getuserbyuid(struct ctdluser *usbuf, uid_t number) { // Yes, we do this the long way. // No, we don't use CtdlForEachUser() because that requires multiple reads for each record // TODO: make an index - void *cur = cdb_rewind(CDB_USERS); - while (cdbus = cdb_next_item(cur, CDB_USERS), cdbus != NULL) { + cdb_rewind(CDB_USERS); + while (cdbus = cdb_next_item(CDB_USERS), cdbus != NULL) { usptr = (struct ctdluser *) cdbus->ptr; if (usptr->uid == number) { @@ -1044,8 +1044,8 @@ void ForEachUser(void (*CallBack) (char *, void *out_data), void *in_data) { } // Phase 1 : build an array of all our user account names - void *cur = cdb_rewind(CDB_USERS); - while (cdbus = cdb_next_item(cur, CDB_USERS), cdbus != NULL) { + cdb_rewind(CDB_USERS); + while (cdbus = cdb_next_item(CDB_USERS), cdbus != NULL) { usptr = (struct ctdluser *) cdbus->ptr; if (strlen(usptr->fullname) > 0) { array_append(all_users, usptr->fullname); -- 2.39.2