mirror of https://github.com/djcb/mu.git
guile: update for query changes
This commit is contained in:
parent
01ced9a356
commit
4daa7105d2
|
@ -30,8 +30,10 @@
|
||||||
#include <mu-runtime.hh>
|
#include <mu-runtime.hh>
|
||||||
#include <mu-store.hh>
|
#include <mu-store.hh>
|
||||||
#include <mu-query.hh>
|
#include <mu-query.hh>
|
||||||
#include <mu-msg.h>
|
#include <mu-msg.hh>
|
||||||
#include <mu-msg-part.h>
|
#include <mu-msg-part.hh>
|
||||||
|
|
||||||
|
using namespace Mu;
|
||||||
|
|
||||||
/* pseudo field, not in Xapian */
|
/* pseudo field, not in Xapian */
|
||||||
#define MU_GUILE_MSG_FIELD_ID_TIMESTAMP (MU_MSG_FIELD_ID_NUM + 1)
|
#define MU_GUILE_MSG_FIELD_ID_TIMESTAMP (MU_MSG_FIELD_ID_NUM + 1)
|
||||||
|
@ -416,33 +418,11 @@ SCM_DEFINE (get_header, "mu:c:get-header", 2, 0, 0,
|
||||||
}
|
}
|
||||||
#undef FUNC_NAME
|
#undef FUNC_NAME
|
||||||
|
|
||||||
|
static Mu::Option<Mu::QueryResults>
|
||||||
static void
|
get_query_results (Mu::Query& query, const char* expr, int maxnum)
|
||||||
call_func (SCM FUNC, MuMsgIter *iter, const char* func_name)
|
|
||||||
{
|
{
|
||||||
SCM msgsmob;
|
return query.run(expr, MU_MSG_FIELD_ID_NONE,
|
||||||
MuMsg *msg;
|
Mu::QueryFlags::None, maxnum);
|
||||||
|
|
||||||
msg = mu_msg_iter_get_msg_floating (iter); /* don't unref */
|
|
||||||
|
|
||||||
msgsmob = mu_guile_msg_to_scm (mu_msg_ref(msg));
|
|
||||||
scm_call_1 (FUNC, msgsmob);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static MuMsgIter*
|
|
||||||
get_query_iter (Mu::Query& query, const char* expr, int maxnum)
|
|
||||||
{
|
|
||||||
GError *err{};
|
|
||||||
auto iter = query.run (expr, MU_MSG_FIELD_ID_NONE,
|
|
||||||
Mu::Query::Flags::None, maxnum,
|
|
||||||
&err);
|
|
||||||
if (!iter) {
|
|
||||||
mu_guile_g_error ("<internal error>", err);
|
|
||||||
g_clear_error (&err);
|
|
||||||
}
|
|
||||||
|
|
||||||
return iter;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -455,8 +435,7 @@ SCM_DEFINE (for_each_message, "mu:c:for-each-message", 3, 0, 0,
|
||||||
"none if EXPR equals #f.")
|
"none if EXPR equals #f.")
|
||||||
#define FUNC_NAME s_for_each_message
|
#define FUNC_NAME s_for_each_message
|
||||||
{
|
{
|
||||||
MuMsgIter *iter;
|
char* expr{};
|
||||||
char* expr;
|
|
||||||
|
|
||||||
MU_GUILE_INITIALIZED_OR_ERROR;
|
MU_GUILE_INITIALIZED_OR_ERROR;
|
||||||
|
|
||||||
|
@ -473,18 +452,19 @@ SCM_DEFINE (for_each_message, "mu:c:for-each-message", 3, 0, 0,
|
||||||
else
|
else
|
||||||
expr = scm_to_utf8_string(EXPR);
|
expr = scm_to_utf8_string(EXPR);
|
||||||
|
|
||||||
iter = get_query_iter (mu_guile_query(), expr,
|
const auto res{get_query_results(mu_guile_query(), expr,
|
||||||
scm_to_int(MAXNUM));
|
scm_to_int(MAXNUM))};
|
||||||
free (expr);
|
free (expr);
|
||||||
if (!iter)
|
if (!res)
|
||||||
return SCM_UNSPECIFIED;
|
return SCM_UNSPECIFIED;
|
||||||
|
|
||||||
while (!mu_msg_iter_is_done(iter)) {
|
for (auto&& mi: *res) {
|
||||||
call_func (FUNC, iter, FUNC_NAME);
|
auto msg{mi.floating_msg()};
|
||||||
mu_msg_iter_next (iter);
|
if (msg) {
|
||||||
|
auto msgsmob{mu_guile_msg_to_scm (mu_msg_ref(msg))};
|
||||||
|
scm_call_1 (FUNC, msgsmob);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mu_msg_iter_destroy (iter);
|
|
||||||
|
|
||||||
return SCM_UNSPECIFIED;
|
return SCM_UNSPECIFIED;
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,7 +31,9 @@
|
||||||
#include <mu-runtime.hh>
|
#include <mu-runtime.hh>
|
||||||
#include <mu-store.hh>
|
#include <mu-store.hh>
|
||||||
#include <mu-query.hh>
|
#include <mu-query.hh>
|
||||||
#include <mu-msg.h>
|
#include <mu-msg.hh>
|
||||||
|
|
||||||
|
using namespace Mu;
|
||||||
|
|
||||||
SCM
|
SCM
|
||||||
mu_guile_scm_from_str (const char *str)
|
mu_guile_scm_from_str (const char *str)
|
||||||
|
|
Loading…
Reference in New Issue