int xapian_dbw_open(const char *path, xapian_dbw_t **dbwp) { xapian_dbw_t *dbw = (xapian_dbw_t *)xzmalloc(sizeof(xapian_dbw_t)); int r = 0; try { int action = Xapian::DB_CREATE_OR_OPEN; dbw->database = new Xapian::WritableDatabase(path, action); dbw->term_generator = new Xapian::TermGenerator(); dbw->stemmer = new Xapian::Stem("en"); dbw->term_generator->set_stemmer(*dbw->stemmer); dbw->term_generator->set_stemming_strategy(Xapian::TermGenerator::STEM_ALL); } catch (const Xapian::DatabaseLockError &err) { /* somebody else is already indexing this user. They may be doing a different * mailbox, so we need to re-insert this mailbox into the queue! */ r = IMAP_MAILBOX_LOCKED; } catch (const Xapian::Error &err) { syslog(LOG_ERR, "IOERROR: Xapian: caught exception: %s: %s", err.get_context().c_str(), err.get_description().c_str()); r = IMAP_IOERROR; } if (r) xapian_dbw_close(dbw); else *dbwp = dbw; return r; }
int xapian_dbw_open(const char **paths, xapian_dbw_t **dbwp) { xapian_dbw_t *dbw = (xapian_dbw_t *)xzmalloc(sizeof(xapian_dbw_t)); int r = 0; const char *path = *paths++; try { /* Determine the sterm version of an existing database, or create a * new one with the latest one. Never implicitly upgrade. */ try { dbw->database = new Xapian::WritableDatabase(path, Xapian::DB_OPEN); dbw->stem_version = stem_version_get(dbw->database); if (dbw->stem_version < 0) { syslog(LOG_ERR, "xapian_wrapper: Invalid stem version %d in %s", dbw->stem_version, path); r = IMAP_IOERROR; } } catch (Xapian::DatabaseOpeningError &e) { /* It's OK not to atomically create or open, since we can assume * the xapianactive file items to be locked. */ dbw->database = new Xapian::WritableDatabase(path, Xapian::DB_CREATE|Xapian::DB_BACKEND_GLASS); dbw->stem_version = XAPIAN_STEM_CURRENT_VERSION; stem_version_set(dbw->database, dbw->stem_version); } dbw->term_generator = new Xapian::TermGenerator(); dbw->stemmer = new Xapian::Stem("en"); dbw->stopper = get_stopper(); dbw->term_generator->set_stemmer(*dbw->stemmer); /* Always enable CJK word tokenization */ dbw->term_generator->set_flags(Xapian::TermGenerator::FLAG_CJK_WORDS, ~Xapian::TermGenerator::FLAG_CJK_WORDS); dbw->term_generator->set_stopper(dbw->stopper); } catch (const Xapian::DatabaseLockError &err) { /* somebody else is already indexing this user. They may be doing a different * mailbox, so we need to re-insert this mailbox into the queue! */ r = IMAP_MAILBOX_LOCKED; } catch (const Xapian::Error &err) { syslog(LOG_ERR, "IOERROR: Xapian: caught exception: %s: %s", err.get_context().c_str(), err.get_description().c_str()); r = IMAP_IOERROR; } if (r) { xapian_dbw_close(dbw); return r; } /* open the read-only databases */ while (*paths) { try { Xapian::Database *database = new Xapian::Database(*paths++); ptrarray_append(&dbw->otherdbs, database); } catch (const Xapian::Error &err) { syslog(LOG_ERR, "IOERROR: Xapian: caught exception: %s: %s", err.get_context().c_str(), err.get_description().c_str()); } } *dbwp = dbw; return r; }