mirror of https://github.com/djcb/mu.git
* lib: try to reopen database when it got updated from the outside (for guile)
This commit is contained in:
parent
90674172b9
commit
93171a5b90
|
@ -110,9 +110,12 @@ private:
|
||||||
MuMsg *_msg;
|
MuMsg *_msg;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
MuMsgIter*
|
MuMsgIter*
|
||||||
mu_msg_iter_new (XapianEnquire *enq, size_t maxnum,
|
mu_msg_iter_new (XapianEnquire *enq, size_t maxnum,
|
||||||
gboolean threads, MuMsgFieldId sortfield, gboolean revert)
|
gboolean threads, MuMsgFieldId sortfield, gboolean revert,
|
||||||
|
GError **err)
|
||||||
{
|
{
|
||||||
g_return_val_if_fail (enq, NULL);
|
g_return_val_if_fail (enq, NULL);
|
||||||
/* sortfield should be set to .._NONE when we're not threading */
|
/* sortfield should be set to .._NONE when we're not threading */
|
||||||
|
@ -125,7 +128,13 @@ mu_msg_iter_new (XapianEnquire *enq, size_t maxnum,
|
||||||
return new MuMsgIter ((Xapian::Enquire&)*enq, maxnum, threads,
|
return new MuMsgIter ((Xapian::Enquire&)*enq, maxnum, threads,
|
||||||
sortfield, revert ? true : false);
|
sortfield, revert ? true : false);
|
||||||
|
|
||||||
} MU_XAPIAN_CATCH_BLOCK_RETURN(NULL);
|
} catch (const Xapian::DatabaseModifiedError &dbmex) {
|
||||||
|
|
||||||
|
mu_util_g_set_error (err, MU_ERROR_XAPIAN_MODIFIED,
|
||||||
|
"database was modified; please reopen");
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
} MU_XAPIAN_CATCH_BLOCK_G_ERROR_RETURN (err, MU_ERROR_XAPIAN, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -48,13 +48,16 @@ typedef struct _MuMsgIter MuMsgIter;
|
||||||
* @param sorting field when using threads; note, when 'threads' is
|
* @param sorting field when using threads; note, when 'threads' is
|
||||||
* FALSE, this should be MU_MSG_FIELD_ID_NONE
|
* FALSE, this should be MU_MSG_FIELD_ID_NONE
|
||||||
* @param if TRUE, revert the sorting order
|
* @param if TRUE, revert the sorting order
|
||||||
|
* @param err receives error information. if the error is MU_ERROR_XAPIAN_MODIFIED,
|
||||||
|
* the database should be reloaded.
|
||||||
*
|
*
|
||||||
* @return a new MuMsgIter, or NULL in case of error
|
* @return a new MuMsgIter, or NULL in case of error
|
||||||
*/
|
*/
|
||||||
MuMsgIter *mu_msg_iter_new (XapianEnquire *enq,
|
MuMsgIter *mu_msg_iter_new (XapianEnquire *enq,
|
||||||
size_t batchsize, gboolean threads,
|
size_t batchsize, gboolean threads,
|
||||||
MuMsgFieldId threadsortfield,
|
MuMsgFieldId threadsortfield,
|
||||||
gboolean revert) G_GNUC_WARN_UNUSED_RESULT;
|
gboolean revert,
|
||||||
|
GError **err) G_GNUC_WARN_UNUSED_RESULT;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* get the next message (which you got from
|
* get the next message (which you got from
|
||||||
|
|
|
@ -309,6 +309,26 @@ mu_query_preprocess (const char *query, GError **err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* this function is for handling the case where a DatabaseModified
|
||||||
|
* exception is raised. We try to reopen the database, and run the
|
||||||
|
* query again. */
|
||||||
|
static MuMsgIter *
|
||||||
|
try_requery (MuQuery *self, const char* searchexpr, gboolean threads,
|
||||||
|
MuMsgFieldId sortfieldid, gboolean revert, int maxnum,
|
||||||
|
GError **err)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
/* let's assume that infinite regression is
|
||||||
|
* impossible */
|
||||||
|
self->db().reopen();
|
||||||
|
MU_WRITE_LOG ("reopening db after modification");
|
||||||
|
return mu_query_run (self, searchexpr, threads, sortfieldid,
|
||||||
|
revert, maxnum, err);
|
||||||
|
|
||||||
|
} MU_XAPIAN_CATCH_BLOCK_G_ERROR_RETURN (err, MU_ERROR_XAPIAN, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
MuMsgIter*
|
MuMsgIter*
|
||||||
mu_query_run (MuQuery *self, const char* searchexpr, gboolean threads,
|
mu_query_run (MuQuery *self, const char* searchexpr, gboolean threads,
|
||||||
MuMsgFieldId sortfieldid, gboolean revert, int maxnum,
|
MuMsgFieldId sortfieldid, gboolean revert, int maxnum,
|
||||||
|
@ -320,6 +340,7 @@ mu_query_run (MuQuery *self, const char* searchexpr, gboolean threads,
|
||||||
sortfieldid == MU_MSG_FIELD_ID_NONE,
|
sortfieldid == MU_MSG_FIELD_ID_NONE,
|
||||||
NULL);
|
NULL);
|
||||||
try {
|
try {
|
||||||
|
MuMsgIter *iter;
|
||||||
Xapian::Enquire enq (self->db());
|
Xapian::Enquire enq (self->db());
|
||||||
|
|
||||||
/* note, when our result will be *threaded*, we sort
|
/* note, when our result will be *threaded*, we sort
|
||||||
|
@ -336,12 +357,18 @@ mu_query_run (MuQuery *self, const char* searchexpr, gboolean threads,
|
||||||
|
|
||||||
enq.set_cutoff(0,0);
|
enq.set_cutoff(0,0);
|
||||||
|
|
||||||
return mu_msg_iter_new (
|
iter = mu_msg_iter_new (
|
||||||
reinterpret_cast<XapianEnquire*>(&enq),
|
reinterpret_cast<XapianEnquire*>(&enq),
|
||||||
maxnum <= 0 ? self->db().get_doccount() : maxnum,
|
maxnum <= 0 ? self->db().get_doccount() : maxnum,
|
||||||
threads,
|
threads, threads ? sortfieldid : MU_MSG_FIELD_ID_NONE,
|
||||||
threads ? sortfieldid : MU_MSG_FIELD_ID_NONE,
|
revert, err);
|
||||||
revert);
|
|
||||||
|
if (err && *err && (*err)->code == MU_ERROR_XAPIAN_MODIFIED) {
|
||||||
|
g_clear_error (err);
|
||||||
|
return try_requery (self, searchexpr, threads, sortfieldid,
|
||||||
|
revert, maxnum, err);
|
||||||
|
} else
|
||||||
|
return iter;
|
||||||
|
|
||||||
} MU_XAPIAN_CATCH_BLOCK_G_ERROR_RETURN (err, MU_ERROR_XAPIAN, 0);
|
} MU_XAPIAN_CATCH_BLOCK_G_ERROR_RETURN (err, MU_ERROR_XAPIAN, 0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -414,6 +414,8 @@ enum _MuError {
|
||||||
MU_ERROR_XAPIAN_STORE_FAILED = 20,
|
MU_ERROR_XAPIAN_STORE_FAILED = 20,
|
||||||
/* could not remove */
|
/* could not remove */
|
||||||
MU_ERROR_XAPIAN_REMOVE_FAILED = 21,
|
MU_ERROR_XAPIAN_REMOVE_FAILED = 21,
|
||||||
|
/* database was modified; reload */
|
||||||
|
MU_ERROR_XAPIAN_MODIFIED = 22,
|
||||||
|
|
||||||
/* GMime related errors */
|
/* GMime related errors */
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue