mirror of https://github.com/djcb/mu.git
* mu-query-xapian: make the C++ more like C
mixing styles leads to weird errors
This commit is contained in:
parent
3f37abaed3
commit
71abd126cd
|
@ -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) {
|
||||||
|
|
|
@ -25,9 +25,11 @@
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* MuQueryXapian
|
* MuQueryXapian
|
||||||
*/
|
*/
|
||||||
|
|
||||||
struct _MuQueryXapian;
|
struct _MuQueryXapian;
|
||||||
typedef struct _MuQueryXapian MuQueryXapian;
|
typedef struct _MuQueryXapian MuQueryXapian;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue