* mu-query-xapian: make the C++ more like C

mixing styles leads to weird errors
This commit is contained in:
Dirk-Jan C. Binnema 2009-12-09 00:01:49 +02:00
parent 3f37abaed3
commit 71abd126cd
2 changed files with 77 additions and 55 deletions

View File

@ -30,32 +30,61 @@
static void add_prefix (const MuMsgField* field, Xapian::QueryParser* qparser); static void add_prefix (const MuMsgField* field, Xapian::QueryParser* qparser);
class _MuQueryXapian { struct _MuQueryXapian {
public: Xapian::Database* _db;
_MuQueryXapian (const char *path) : _db(Xapian::Database(path)) { Xapian::QueryParser* _qparser;
Xapian::Sorter* _sorters[MU_MSG_FIELD_TYPE_NUM];
};
_qparser.set_database(_db); gboolean
_qparser.set_default_op(Xapian::Query::OP_OR); _init_mu_query_xapian (MuQueryXapian *mqx, const char* dbpath)
_qparser.set_stemming_strategy {
(Xapian::QueryParser::STEM_SOME); mqx->_db = 0;
mqx->_qparser = 0;
memset (_sorters, 0, sizeof(_sorters));
mu_msg_field_foreach ((MuMsgFieldForEachFunc)add_prefix,
(gconstpointer)&_qparser);
}
~_MuQueryXapian () {
try {
for (int i = 0; i != MU_MSG_FIELD_TYPE_NUM; ++i)
delete _sorters[i];
} catch (...) {
g_warning ("%s: caught exception", __FUNCTION__);
}
}
Xapian::Query get_query (const char* searchexpr) { try {
return _qparser.parse_query mqx->_db = new Xapian::Database(dbpath);
mqx->_qparser = new Xapian::QueryParser;
mqx->_qparser->set_database(*mqx->_db);
mqx->_qparser->set_default_op(Xapian::Query::OP_OR);
mqx->_qparser->set_stemming_strategy (Xapian::QueryParser::STEM_SOME);
memset (mqx->_sorters, 0, sizeof(mqx->_sorters));
mu_msg_field_foreach ((MuMsgFieldForEachFunc)add_prefix,
(gpointer)mqx->_qparser);
} catch (...) {
delete mqx->_db;
delete mqx->_qparser;
g_warning ("%s: caught exception", __FUNCTION__);
return FALSE;
}
return TRUE;
}
static void
_uninit_mu_query_xapian (MuQueryXapian *mqx)
{
try {
delete mqx->_db;
delete mqx->_qparser;
for (int i = 0; i != MU_MSG_FIELD_TYPE_NUM; ++i)
delete mqx->_sorters[i];
} catch (...) {
g_warning ("%s: caught exception", __FUNCTION__);
}
}
static Xapian::Query
_get_query (MuQueryXapian * mqx, const char* searchexpr, int *err = 0) {
try {
return mqx->_qparser->parse_query
(searchexpr, (searchexpr,
Xapian::QueryParser::FLAG_BOOLEAN | Xapian::QueryParser::FLAG_BOOLEAN |
Xapian::QueryParser::FLAG_PHRASE | Xapian::QueryParser::FLAG_PHRASE |
@ -64,14 +93,14 @@ public:
Xapian::QueryParser::FLAG_WILDCARD | Xapian::QueryParser::FLAG_WILDCARD |
Xapian::QueryParser::FLAG_PURE_NOT | Xapian::QueryParser::FLAG_PURE_NOT |
Xapian::QueryParser::FLAG_PARTIAL); Xapian::QueryParser::FLAG_PARTIAL);
}
const Xapian::Database& db() { return _db; }
private: } catch (...) {
const Xapian::Database _db; g_warning ("%s: caught exception", __FUNCTION__);
Xapian::QueryParser _qparser; if (err)
Xapian::Sorter* _sorters[MU_MSG_FIELD_TYPE_NUM]; *err = 1;
}; return Xapian::Query();
}
}
static void static void
add_prefix (const MuMsgField* field, Xapian::QueryParser* qparser) add_prefix (const MuMsgField* field, Xapian::QueryParser* qparser)
@ -80,11 +109,11 @@ add_prefix (const MuMsgField* field, Xapian::QueryParser* qparser)
return; return;
const std::string prefix (mu_msg_field_xapian_prefix(field)); const std::string prefix (mu_msg_field_xapian_prefix(field));
qparser->add_boolean_prefix(std::string(mu_msg_field_name(field)), qparser->add_boolean_prefix(std::string(mu_msg_field_name(field)),
prefix); prefix);
qparser->add_boolean_prefix(std::string(mu_msg_field_shortcut(field)), qparser->add_boolean_prefix(std::string(mu_msg_field_shortcut(field)),
prefix); prefix);
/* make the empty string match this field too*/ /* make the empty string match this field too*/
qparser->add_prefix ("", prefix); qparser->add_prefix ("", prefix);
@ -93,11 +122,11 @@ add_prefix (const MuMsgField* field, Xapian::QueryParser* qparser)
MuQueryXapian* MuQueryXapian*
mu_query_xapian_new (const char* path) mu_query_xapian_new (const char* path)
{ {
char *xpath; char *xpath;
MuQueryXapian *mqx;
g_return_val_if_fail (path, NULL); g_return_val_if_fail (path, NULL);
/* move this to common place? */
xpath = g_strdup_printf ("%s%c%s", path, G_DIR_SEPARATOR, "xapian"); xpath = g_strdup_printf ("%s%c%s", path, G_DIR_SEPARATOR, "xapian");
if (!g_file_test (xpath, G_FILE_TEST_IS_DIR) || if (!g_file_test (xpath, G_FILE_TEST_IS_DIR) ||
g_access(xpath, R_OK) != 0) { g_access(xpath, R_OK) != 0) {
@ -105,28 +134,19 @@ mu_query_xapian_new (const char* path)
g_free (xpath); g_free (xpath);
return NULL; return NULL;
} }
try { mqx = g_new (MuQueryXapian, 1);
MuQueryXapian *qx (new MuQueryXapian (xpath)); _init_mu_query_xapian (mqx, xpath);
g_free (xpath); g_free (xpath);
return qx;
return mqx;
} catch (...) {
g_free (xpath);
g_warning ("%s: caught exception", __FUNCTION__);
return NULL;
}
} }
void void
mu_query_xapian_destroy (MuQueryXapian *self) mu_query_xapian_destroy (MuQueryXapian *self)
{ {
try { _uninit_mu_query_xapian (self);
delete self;
} catch (...) {
g_warning ("%s: caught exception", __FUNCTION__);
}
} }
@ -140,8 +160,8 @@ mu_query_xapian_run (MuQueryXapian *self, const char* searchexpr,
g_return_val_if_fail (searchexpr, NULL); g_return_val_if_fail (searchexpr, NULL);
try { try {
Xapian::Query q(self->get_query(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 (
@ -172,7 +192,7 @@ mu_query_xapian_as_string (MuQueryXapian *self, const char* searchexpr)
g_return_val_if_fail (searchexpr, NULL); g_return_val_if_fail (searchexpr, NULL);
try { try {
Xapian::Query q(self->get_query(searchexpr)); Xapian::Query q(_get_query(self, searchexpr));
return g_strdup(q.get_description().c_str()); return g_strdup(q.get_description().c_str());
} catch (const Xapian::Error &err) { } catch (const Xapian::Error &err) {

View File

@ -25,9 +25,11 @@
G_BEGIN_DECLS G_BEGIN_DECLS
/* /*
* MuQueryXapian * MuQueryXapian
*/ */
struct _MuQueryXapian; struct _MuQueryXapian;
typedef struct _MuQueryXapian MuQueryXapian; typedef struct _MuQueryXapian MuQueryXapian;