Example #1
0
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;
}
Example #2
0
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;
}