Exemplo n.º 1
0
int xapian_db_open(const char **paths, xapian_db_t **dbp)
{
    xapian_db_t *db = (xapian_db_t *)xzmalloc(sizeof(xapian_db_t));
    const char *thispath = "(unknown)";
    int r = 0;

    try {
        db->paths = new std::string();
        db->database = new Xapian::Database();
        while (*paths) {
            thispath = *paths++;
            db->database->add_database(Xapian::Database(thispath));
            db->paths->append(thispath);
            db->paths->append(" ");
            thispath = "(unknown)";
        }
        db->stemmer = new Xapian::Stem("en");
        db->parser = new Xapian::QueryParser;
        db->parser->set_stemmer(*db->stemmer);
        db->parser->set_default_op(Xapian::Query::OP_AND);
        db->parser->set_database(*db->database);
    }
    catch (const Xapian::Error &err) {
        syslog(LOG_ERR, "IOERROR: Xapian: caught exception: %s: %s",
                    thispath, err.get_description().c_str());
        r = IMAP_IOERROR;
    }

    if (r)
        xapian_db_close(db);
    else
        *dbp = db;

    return r;
}
Exemplo n.º 2
0
int xapian_db_open(const char **paths, xapian_db_t **dbp)
{
    xapian_db_t *db = (xapian_db_t *)xzmalloc(sizeof(xapian_db_t));
    const char *thispath = "(unknown)";
    int r = 0;

    try {
        db->paths = new std::string();
        db->database = new Xapian::Database();
        while (*paths) {
            thispath = *paths++;
            Xapian::Database database = Xapian::Database(thispath);
            int stem_version = stem_version_get(&database);
            if (stem_version < 0) {
                syslog(LOG_ERR, "xapian_wrapper: Invalid prefix version %d in %s",
                        stem_version, thispath);
                r = IMAP_INTERNAL;
                goto done;
            }
            if (!db->stem_versions)
                db->stem_versions = new std::set<int>();
            db->stem_versions->insert(stem_version);
            /* we have some mixed version databases, but only Chert, so we've
             * just made them return zero for the version, and we'll add 1 to
             * the set for them as well */
            if (!stem_version)
                db->stem_versions->insert(1);
            db->database->add_database(database);
            db->paths->append(thispath);
            db->paths->append(" ");
            thispath = "(unknown)";
        }
        db->stemmer = new Xapian::Stem("en");
        db->parser = new Xapian::QueryParser;
        db->stopper = get_stopper();
        db->parser->set_stemmer(*db->stemmer);
        db->parser->set_default_op(Xapian::Query::OP_AND);
        db->parser->set_database(*db->database);
        db->parser->set_stopper(db->stopper);
    }
    catch (const Xapian::Error &err) {
        syslog(LOG_ERR, "IOERROR: Xapian: caught exception: %s: %s",
                    thispath, err.get_description().c_str());
        r = IMAP_IOERROR;
    }

done:
    if (r)
        xapian_db_close(db);
    else
        *dbp = db;

    return r;
}