I've been looking at the mailbox listing code (starting from ic_list and working into db.c) to improve efficiency, and the fix is pretty clear:
ic_list calls db_findmailbox_by_regex, which calls db_list_mailboxes_by_regex, which does a big SELECT, compares the mailbox names with the regex, keeps the matching mailboxidnr's, and throws away the names. ic_list then loops through the list of mailboxidnr's, and selects three times for each mailbox: first for the mailbox name, then for is_selectable then for no_inferiors. The obvious fix is to keep all of that information from the dbmail_mailboxes table that was retrieved with list_mailboxes in the first place. So I'm building a structure to hold that information and eliminate the loop of three more queries per mailbox. But, in the process, I'd like to know if there's rhyme or reason for: int db_findmailbox_by_regex(u64_t owner_idnr, const char *pattern, u64_t ** children, unsigned *nchildren, int only_subscribed); static int db_list_mailboxes_by_regex(u64_t user_idnr, int only_subscribed, regex_t * preg, u64_t ** mailboxes, unsigned int *nr_mailboxes); Yes, they really are the same functions, with different order, and just with findmailbox_by_regex compiling the regex before calling list_mailboxes. I'd like to roll these into one function. Aaron