* mu-query-xapian: fix some error cases (exceptions)

This commit is contained in:
Dirk-Jan C. Binnema 2009-12-05 16:05:15 +02:00
parent 3f169f72aa
commit 107852b79d
1 changed files with 23 additions and 21 deletions

View File

@ -29,9 +29,13 @@
#include "mu-msg-xapian-priv.hh" #include "mu-msg-xapian-priv.hh"
struct _MuQueryXapian { struct _MuQueryXapian {
Xapian::Database *_db;
Xapian::QueryParser _qparser; _MuQueryXapian (const char *path) :
Xapian::Sorter* _sorters[MU_MSG_FIELD_TYPE_NUM]; _db(Xapian::Database(path)) {}
const Xapian::Database& _db;
Xapian::QueryParser _qparser;
Xapian::Sorter* _sorters[MU_MSG_FIELD_TYPE_NUM];
}; };
static void static void
@ -64,37 +68,36 @@ mu_query_xapian_new (const char* path, GError **err)
return NULL; return NULL;
} }
self = 0;
try { try {
self = new MuQueryXapian; self = new MuQueryXapian (path);
self->_db = new Xapian::Database(path); self->_qparser.set_database(self->_db);
self->_qparser.set_database(*self->_db);
self->_qparser.set_default_op(Xapian::Query::OP_OR); self->_qparser.set_default_op(Xapian::Query::OP_OR);
self->_qparser.set_stemming_strategy self->_qparser.set_stemming_strategy
(Xapian::QueryParser::STEM_SOME); (Xapian::QueryParser::STEM_SOME);
memset (self->_sorters, 0, sizeof(self->_sorters));
mu_msg_field_foreach ((MuMsgFieldForEachFunc)add_prefix,
(gconstpointer)&self->_qparser);
return self;
} catch (const Xapian::Error &ex) { } catch (const Xapian::Error &ex) {
g_set_error (err, 0, 0,"%s: caught xapian exception '%s' (%s)", g_set_error (err, 0, 0,"%s: caught xapian exception '%s' (%s)",
__FUNCTION__, ex.get_msg().c_str(), __FUNCTION__, ex.get_msg().c_str(),
ex.get_error_string()); ex.get_error_string());
delete self;
self = 0;
} catch (...) { } catch (...) {
delete self->_db;
g_set_error (err, 0, 0,"%s: caught exception", __FUNCTION__); g_set_error (err, 0, 0,"%s: caught exception", __FUNCTION__);
delete self;
self = 0;
} }
if (self) { if (self) {
delete self->_db; memset (self->_sorters, 0, sizeof(self->_sorters));
delete self;
mu_msg_field_foreach ((MuMsgFieldForEachFunc)add_prefix,
(gconstpointer)&self->_qparser);
} }
return NULL; return self ? self: NULL;
} }
@ -110,7 +113,6 @@ mu_query_xapian_destroy (MuQueryXapian *self)
self->_sorters[i] = 0; self->_sorters[i] = 0;
} }
delete self->_db;
delete self; delete self;
} catch (const Xapian::Error &err) { } catch (const Xapian::Error &err) {
@ -147,7 +149,7 @@ mu_query_xapian_run (MuQueryXapian *self, const char* searchexpr,
try { try {
Xapian::Query q(get_query(self, searchexpr)); Xapian::Query q(get_query(self, searchexpr));
Xapian::Enquire enq (*self->_db); Xapian::Enquire enq (self->_db);
if (sortfield) if (sortfield)
enq.set_sort_by_value ( enq.set_sort_by_value (