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; }
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; }