guile: update for query changes

This commit is contained in:
Dirk-Jan C. Binnema 2020-11-28 10:08:04 +02:00
parent 01ced9a356
commit 4daa7105d2
2 changed files with 23 additions and 41 deletions

View File

@ -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,20 +452,21 @@ 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;
} }
#undef FUNC_NAME #undef FUNC_NAME

View File

@ -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)