* add guile (still non-functional) guile command

This commit is contained in:
djcb 2012-06-29 09:56:59 +03:00
parent b6d11830f5
commit beced7857b
1 changed files with 97 additions and 48 deletions

View File

@ -360,6 +360,13 @@ determine_docid (MuQuery *query, GSList *args, GError **err)
#define EQSTR(S1,S2) (g_strcmp0((S1),(S2))==0) #define EQSTR(S1,S2) (g_strcmp0((S1),(S2))==0)
struct _ServerContext {
MuStore *store;
MuQuery *query;
};
typedef struct _ServerContext ServerContext;
/*************************************************************************/ /*************************************************************************/
/* implementation for the commands -- for each command <x>, there is a /* implementation for the commands -- for each command <x>, there is a
* dedicated function cmd_<x>. These function all are of the type CmdFunc * dedicated function cmd_<x>. These function all are of the type CmdFunc
@ -371,7 +378,8 @@ determine_docid (MuQuery *query, GSList *args, GError **err)
* if function return non-MU_OK, the repl will print the error instead * if function return non-MU_OK, the repl will print the error instead
*/ */
typedef MuError (*CmdFunc) (MuStore*,MuQuery*,GSList*,GError**); typedef MuError (*CmdFunc) (ServerContext*,GSList*,GError**);
/* 'add' adds a message to the database, and takes two parameters: /* 'add' adds a message to the database, and takes two parameters:
* 'path', which is the full path to the message, and 'maildir', which * 'path', which is the full path to the message, and 'maildir', which
@ -380,7 +388,7 @@ typedef MuError (*CmdFunc) (MuStore*,MuQuery*,GSList*,GError**);
* message (details: see code below) * message (details: see code below)
*/ */
static MuError static MuError
cmd_add (MuStore *store, MuQuery *query, GSList *args, GError **err) cmd_add (ServerContext *ctx, GSList *args, GError **err)
{ {
unsigned docid; unsigned docid;
const char *maildir, *path; const char *maildir, *path;
@ -388,7 +396,7 @@ cmd_add (MuStore *store, MuQuery *query, GSList *args, GError **err)
GET_STRING_OR_ERROR_RETURN (args, "path", &path, err); GET_STRING_OR_ERROR_RETURN (args, "path", &path, err);
GET_STRING_OR_ERROR_RETURN (args, "maildir", &maildir, err); GET_STRING_OR_ERROR_RETURN (args, "maildir", &maildir, err);
docid = mu_store_add_path (store, path, maildir, err); docid = mu_store_add_path (ctx->store, path, maildir, err);
if (docid == MU_STORE_INVALID_DOCID) if (docid == MU_STORE_INVALID_DOCID)
print_and_clear_g_error (err); print_and_clear_g_error (err);
else { else {
@ -487,7 +495,7 @@ compose_type (const char *typestr)
* Note ':include' t or nil determines whether to include attachments * Note ':include' t or nil determines whether to include attachments
*/ */
static MuError static MuError
cmd_compose (MuStore *store, MuQuery *query, GSList *args, GError **err) cmd_compose (ServerContext *ctx, GSList *args, GError **err)
{ {
const gchar *typestr; const gchar *typestr;
char *sexp, *atts; char *sexp, *atts;
@ -505,7 +513,7 @@ cmd_compose (MuStore *store, MuQuery *query, GSList *args, GError **err)
MuMsg *msg; MuMsg *msg;
const char *docidstr; const char *docidstr;
GET_STRING_OR_ERROR_RETURN (args, "docid", &docidstr, err); GET_STRING_OR_ERROR_RETURN (args, "docid", &docidstr, err);
msg = mu_store_get_msg (store, atoi(docidstr), err); msg = mu_store_get_msg (ctx->store, atoi(docidstr), err);
if (!msg) { if (!msg) {
print_and_clear_g_error (err); print_and_clear_g_error (err);
return MU_OK; return MU_OK;
@ -599,7 +607,7 @@ contacts_to_sexp (MuContacts *contacts, gboolean personal, time_t after)
static MuError static MuError
cmd_contacts (MuStore *store, MuQuery *query, GSList *args, GError **err) cmd_contacts (ServerContext *ctx, GSList *args, GError **err)
{ {
MuContacts *contacts; MuContacts *contacts;
char *sexp; char *sexp;
@ -759,7 +767,7 @@ action_type (const char *actionstr)
/* 'extract' extracts some mime part from a message */ /* 'extract' extracts some mime part from a message */
static MuError static MuError
cmd_extract (MuStore *store, MuQuery *query, GSList *args, GError **err) cmd_extract (ServerContext *ctx, GSList *args, GError **err)
{ {
MuMsg *msg; MuMsg *msg;
int docid, index, action; int docid, index, action;
@ -770,7 +778,7 @@ cmd_extract (MuStore *store, MuQuery *query, GSList *args, GError **err)
GET_STRING_OR_ERROR_RETURN (args, "action", &actionstr, err); GET_STRING_OR_ERROR_RETURN (args, "action", &actionstr, err);
GET_STRING_OR_ERROR_RETURN (args, "index", &indexstr, err); GET_STRING_OR_ERROR_RETURN (args, "index", &indexstr, err);
index = atoi (indexstr); index = atoi (indexstr);
docid = determine_docid (query, args, err); docid = determine_docid (ctx->query, args, err);
if (docid == MU_STORE_INVALID_DOCID) { if (docid == MU_STORE_INVALID_DOCID) {
print_and_clear_g_error (err); print_and_clear_g_error (err);
return MU_OK; return MU_OK;
@ -780,7 +788,7 @@ cmd_extract (MuStore *store, MuQuery *query, GSList *args, GError **err)
print_error (MU_ERROR_IN_PARAMETERS, "invalid action"); print_error (MU_ERROR_IN_PARAMETERS, "invalid action");
return MU_OK; return MU_OK;
} }
msg = mu_store_get_msg (store, docid, err); msg = mu_store_get_msg (ctx->store, docid, err);
if (!msg) { if (!msg) {
print_error (MU_ERROR, "failed to get message"); print_error (MU_ERROR, "failed to get message");
return MU_OK; return MU_OK;
@ -842,7 +850,7 @@ get_find_params (GSList *args, gboolean *threads, MuMsgFieldId *sortfield,
* (:found <number of found messages>) * (:found <number of found messages>)
*/ */
static MuError static MuError
cmd_find (MuStore *store, MuQuery *query, GSList *args, GError **err) cmd_find (ServerContext *ctx, GSList *args, GError **err)
{ {
MuMsgIter *iter; MuMsgIter *iter;
unsigned foundnum; unsigned foundnum;
@ -861,7 +869,8 @@ cmd_find (MuStore *store, MuQuery *query, GSList *args, GError **err)
/* note: when we're threading, we get *all* messages, and then /* note: when we're threading, we get *all* messages, and then
* only return maxnum; this is so that we maximimize the * only return maxnum; this is so that we maximimize the
* change of all messages in a thread showing up */ * change of all messages in a thread showing up */
iter = mu_query_run (query, querystr, threads, sortfield, reverse, iter = mu_query_run (ctx->query, querystr, threads,
sortfield, reverse,
threads ? -1 : maxnum, err); threads ? -1 : maxnum, err);
if (!iter) { if (!iter) {
print_and_clear_g_error (err); print_and_clear_g_error (err);
@ -881,6 +890,45 @@ cmd_find (MuStore *store, MuQuery *query, GSList *args, GError **err)
} }
/* static gpointer */
/* start_guile (GuileData *data) */
/* { */
/* g_print ("starting guile"); */
/* sleep (10); */
/* } */
#ifdef BUILD_GUILE
static MuError
cmd_guile (ServerContext *ctx, GSList *args, GError **err)
{
const char *script, *file;
script = get_string_from_args (args, "script", TRUE, NULL);
file = get_string_from_args (args, "file", TRUE, NULL);
if (!script == !file) {
print_error (MU_ERROR_IN_PARAMETERS,
"guile: must provide one of 'script', 'file'");
return MU_OK;
}
return MU_OK;
}
#else /*!BUILD_GUILE*/
static MuError
cmd_guile (ServerContext *ctx, GSList *args, GError **err)
{
print_error (MU_ERROR_INTERNAL,
"this mu does not have guile support");
return MU_OK;
}
#endif /*BUILD_GUILE*/
static MuError static MuError
index_msg_cb (MuIndexStats *stats, void *user_data) index_msg_cb (MuIndexStats *stats, void *user_data)
@ -918,7 +966,7 @@ set_my_addresses (MuStore *store, const char *addrstr)
* index ... ) messages while doing so (see the code) * index ... ) messages while doing so (see the code)
*/ */
static MuError static MuError
cmd_index (MuStore *store, MuQuery *query, GSList *args, GError **err) cmd_index (ServerContext *ctx, GSList *args, GError **err)
{ {
MuIndex *index; MuIndex *index;
const char *path; const char *path;
@ -926,10 +974,11 @@ cmd_index (MuStore *store, MuQuery *query, GSList *args, GError **err)
MuError rv; MuError rv;
GET_STRING_OR_ERROR_RETURN (args, "path", &path, err); GET_STRING_OR_ERROR_RETURN (args, "path", &path, err);
set_my_addresses (store, set_my_addresses (ctx->store,
get_string_from_args (args, "my-addresses", TRUE, NULL)); get_string_from_args (args, "my-addresses",
TRUE, NULL));
index = mu_index_new (store, err); index = mu_index_new (ctx->store, err);
if (!index) { if (!index) {
print_and_clear_g_error (err); print_and_clear_g_error (err);
return MU_OK; return MU_OK;
@ -950,7 +999,7 @@ cmd_index (MuStore *store, MuQuery *query, GSList *args, GError **err)
goto leave; goto leave;
} }
mu_store_flush (store); mu_store_flush (ctx->store);
print_expr ("(:info index :status complete " print_expr ("(:info index :status complete "
":processed %u :updated %u :cleaned-up %u)", ":processed %u :updated %u :cleaned-up %u)",
stats._processed, stats._updated, stats2._cleaned_up); stats._processed, stats._updated, stats2._cleaned_up);
@ -965,7 +1014,7 @@ leave:
/* 'mkdir' attempts to create a maildir directory at 'path:'; sends an /* 'mkdir' attempts to create a maildir directory at 'path:'; sends an
* (:info mkdir ...) message when it succeeds */ * (:info mkdir ...) message when it succeeds */
static MuError static MuError
cmd_mkdir (MuStore *store, MuQuery *query, GSList *args, GError **err) cmd_mkdir (ServerContext *ctx, GSList *args, GError **err)
{ {
const char *path; const char *path;
@ -1049,7 +1098,7 @@ do_move (MuStore *store, unsigned docid, MuMsg *msg, const char *maildir,
* would a message in inbox and sentbox with the same id. we set the * would a message in inbox and sentbox with the same id. we set the
* flag on both */ * flag on both */
static gboolean static gboolean
move_msgid_maybe (MuStore *store, MuQuery *query, GSList *args, GError **err) move_msgid_maybe (ServerContext *ctx, GSList *args, GError **err)
{ {
GSList *docids, *cur; GSList *docids, *cur;
const char *maildir = get_string_from_args (args, "maildir", TRUE, err); const char *maildir = get_string_from_args (args, "maildir", TRUE, err);
@ -1060,7 +1109,7 @@ move_msgid_maybe (MuStore *store, MuQuery *query, GSList *args, GError **err)
if (!msgid || !flagstr || maildir ) if (!msgid || !flagstr || maildir )
return FALSE; return FALSE;
if (!(docids = get_docids_from_msgids (query, msgid, err))) { if (!(docids = get_docids_from_msgids (ctx->query, msgid, err))) {
print_and_clear_g_error (err); print_and_clear_g_error (err);
return TRUE; return TRUE;
} }
@ -1069,7 +1118,7 @@ move_msgid_maybe (MuStore *store, MuQuery *query, GSList *args, GError **err)
MuMsg *msg; MuMsg *msg;
MuFlags flags; MuFlags flags;
unsigned docid = (GPOINTER_TO_SIZE(cur->data)); unsigned docid = (GPOINTER_TO_SIZE(cur->data));
if (!(msg = mu_store_get_msg (store, docid, err))) { if (!(msg = mu_store_get_msg (ctx->store, docid, err))) {
print_and_clear_g_error (err); print_and_clear_g_error (err);
break; break;
} }
@ -1083,7 +1132,7 @@ move_msgid_maybe (MuStore *store, MuQuery *query, GSList *args, GError **err)
break; break;
} }
if ((do_move (store, docid, msg, NULL, flags, err) != MU_OK)) if ((do_move (ctx->store, docid, msg, NULL, flags, err) != MU_OK))
print_and_clear_g_error (err); print_and_clear_g_error (err);
mu_msg_unref (msg); mu_msg_unref (msg);
@ -1106,7 +1155,7 @@ move_msgid_maybe (MuStore *store, MuQuery *query, GSList *args, GError **err)
* *
*/ */
static MuError static MuError
cmd_move (MuStore *store, MuQuery *query, GSList *args, GError **err) cmd_move (ServerContext *ctx, GSList *args, GError **err)
{ {
unsigned docid; unsigned docid;
MuMsg *msg; MuMsg *msg;
@ -1115,15 +1164,15 @@ cmd_move (MuStore *store, MuQuery *query, GSList *args, GError **err)
/* check if the move is based on the message id; if so, handle /* check if the move is based on the message id; if so, handle
* it in move_msgid_maybe */ * it in move_msgid_maybe */
if (move_msgid_maybe (store, query, args, err)) if (move_msgid_maybe (ctx, args, err))
return MU_OK; return MU_OK;
maildir = get_string_from_args (args, "maildir", TRUE, err); maildir = get_string_from_args (args, "maildir", TRUE, err);
flagstr = get_string_from_args (args, "flags", TRUE, err); flagstr = get_string_from_args (args, "flags", TRUE, err);
docid = determine_docid (query, args, err); docid = determine_docid (ctx->query, args, err);
if (docid == MU_STORE_INVALID_DOCID || if (docid == MU_STORE_INVALID_DOCID ||
!(msg = mu_store_get_msg (store, docid, err))) { !(msg = mu_store_get_msg (ctx->store, docid, err))) {
print_and_clear_g_error (err); print_and_clear_g_error (err);
return MU_OK; return MU_OK;
} }
@ -1145,7 +1194,7 @@ cmd_move (MuStore *store, MuQuery *query, GSList *args, GError **err)
goto leave; goto leave;
} }
if ((do_move (store, docid, msg, maildir, flags, err) != MU_OK)) if ((do_move (ctx->store, docid, msg, maildir, flags, err) != MU_OK))
print_and_clear_g_error (err); print_and_clear_g_error (err);
leave: leave:
@ -1159,10 +1208,10 @@ leave:
* server using a (:pong ...) message (details: see code below) * server using a (:pong ...) message (details: see code below)
*/ */
static MuError static MuError
cmd_ping (MuStore *store, MuQuery *query, GSList *args, GError **err) cmd_ping (ServerContext *ctx, GSList *args, GError **err)
{ {
unsigned doccount; unsigned doccount;
doccount = mu_store_count (store, err); doccount = mu_store_count (ctx->store, err);
if (doccount == (unsigned)-1) if (doccount == (unsigned)-1)
return print_and_clear_g_error (err); return print_and_clear_g_error (err);
@ -1177,7 +1226,7 @@ cmd_ping (MuStore *store, MuQuery *query, GSList *args, GError **err)
/* 'quit' takes no parameters, terminates this mu server */ /* 'quit' takes no parameters, terminates this mu server */
static MuError static MuError
cmd_quit (MuStore *store, MuQuery *query, GSList *args , GError **err) cmd_quit (ServerContext *ctx, GSList *args , GError **err)
{ {
print_expr (";; quiting"); print_expr (";; quiting");
@ -1220,18 +1269,18 @@ get_path_from_docid (MuStore *store, unsigned docid, GError **err)
* (:remove ...) message when it succeeds * (:remove ...) message when it succeeds
*/ */
static MuError static MuError
cmd_remove (MuStore *store, MuQuery *query, GSList *args, GError **err) cmd_remove (ServerContext *ctx, GSList *args, GError **err)
{ {
unsigned docid; unsigned docid;
const char *path; const char *path;
docid = determine_docid (query, args, err); docid = determine_docid (ctx->query, args, err);
if (docid == MU_STORE_INVALID_DOCID) { if (docid == MU_STORE_INVALID_DOCID) {
print_and_clear_g_error (err); print_and_clear_g_error (err);
return MU_OK; return MU_OK;
} }
path = get_path_from_docid (store, docid, err); path = get_path_from_docid (ctx->store, docid, err);
if (!path) { if (!path) {
print_and_clear_g_error (err); print_and_clear_g_error (err);
return MU_OK; return MU_OK;
@ -1244,7 +1293,7 @@ cmd_remove (MuStore *store, MuQuery *query, GSList *args, GError **err)
return MU_OK; return MU_OK;
} }
if (!mu_store_remove_path (store, path)) { if (!mu_store_remove_path (ctx->store, path)) {
print_error (MU_ERROR_XAPIAN_REMOVE_FAILED, print_error (MU_ERROR_XAPIAN_REMOVE_FAILED,
"failed to remove from database"); "failed to remove from database");
return MU_OK; return MU_OK;
@ -1261,7 +1310,7 @@ cmd_remove (MuStore *store, MuQuery *query, GSList *args, GError **err)
* message (details: see code below) * message (details: see code below)
*/ */
static MuError static MuError
cmd_sent (MuStore *store, MuQuery *query, GSList *args, GError **err) cmd_sent (ServerContext *ctx, GSList *args, GError **err)
{ {
unsigned docid; unsigned docid;
const char *maildir, *path; const char *maildir, *path;
@ -1269,7 +1318,7 @@ cmd_sent (MuStore *store, MuQuery *query, GSList *args, GError **err)
GET_STRING_OR_ERROR_RETURN (args, "path", &path, err); GET_STRING_OR_ERROR_RETURN (args, "path", &path, err);
GET_STRING_OR_ERROR_RETURN (args, "maildir", &maildir, err); GET_STRING_OR_ERROR_RETURN (args, "maildir", &maildir, err);
docid = mu_store_add_path (store, path, maildir, err); docid = mu_store_add_path (ctx->store, path, maildir, err);
if (docid == MU_STORE_INVALID_DOCID) if (docid == MU_STORE_INVALID_DOCID)
print_and_clear_g_error (err); print_and_clear_g_error (err);
else { else {
@ -1289,7 +1338,7 @@ cmd_sent (MuStore *store, MuQuery *query, GSList *args, GError **err)
* identified by either docid: or msgid:; return a (:view <sexp>) * identified by either docid: or msgid:; return a (:view <sexp>)
*/ */
static MuError static MuError
cmd_view (MuStore *store, MuQuery *query, GSList *args, GError **err) cmd_view (ServerContext *ctx, GSList *args, GError **err)
{ {
MuMsg *msg; MuMsg *msg;
unsigned docid; unsigned docid;
@ -1302,13 +1351,13 @@ cmd_view (MuStore *store, MuQuery *query, GSList *args, GError **err)
return MU_OK; return MU_OK;
} }
docid = determine_docid (query, args, err); docid = determine_docid (ctx->query, args, err);
if (docid == MU_STORE_INVALID_DOCID) { if (docid == MU_STORE_INVALID_DOCID) {
print_and_clear_g_error (err); print_and_clear_g_error (err);
return MU_OK; return MU_OK;
} }
msg = mu_store_get_msg (store, docid, err); msg = mu_store_get_msg (ctx->store, docid, err);
if (!msg) { if (!msg) {
print_and_clear_g_error (err); print_and_clear_g_error (err);
return MU_OK; return MU_OK;
@ -1330,7 +1379,7 @@ cmd_view (MuStore *store, MuQuery *query, GSList *args, GError **err)
/*************************************************************************/ /*************************************************************************/
static MuError static MuError
handle_args (MuStore *store, MuQuery *query, GSList *args, GError **err) handle_args (ServerContext *ctx, GSList *args, GError **err)
{ {
unsigned u; unsigned u;
const char *cmd; const char *cmd;
@ -1343,6 +1392,7 @@ handle_args (MuStore *store, MuQuery *query, GSList *args, GError **err)
{ "contacts", cmd_contacts }, { "contacts", cmd_contacts },
{ "extract", cmd_extract }, { "extract", cmd_extract },
{ "find", cmd_find }, { "find", cmd_find },
{ "guile", cmd_guile },
{ "index", cmd_index }, { "index", cmd_index },
{ "mkdir", cmd_mkdir }, { "mkdir", cmd_mkdir },
{ "move", cmd_move }, { "move", cmd_move },
@ -1361,9 +1411,7 @@ handle_args (MuStore *store, MuQuery *query, GSList *args, GError **err)
for (u = 0; u != G_N_ELEMENTS (cmd_map); ++u) for (u = 0; u != G_N_ELEMENTS (cmd_map); ++u)
if (g_strcmp0(cmd, cmd_map[u].cmd) == 0) if (g_strcmp0(cmd, cmd_map[u].cmd) == 0)
return cmd_map[u].func (store, query, return cmd_map[u].func (ctx, g_slist_next(args), err);
g_slist_next(args),
err);
mu_util_g_set_error (err, MU_ERROR_IN_PARAMETERS, mu_util_g_set_error (err, MU_ERROR_IN_PARAMETERS,
"unknown command '%s'", cmd ? cmd : ""); "unknown command '%s'", cmd ? cmd : "");
@ -1375,13 +1423,14 @@ handle_args (MuStore *store, MuQuery *query, GSList *args, GError **err)
MuError MuError
mu_cmd_server (MuStore *store, MuConfig *opts/*unused*/, GError **err) mu_cmd_server (MuStore *store, MuConfig *opts/*unused*/, GError **err)
{ {
MuQuery *query; ServerContext ctx;
gboolean do_quit; gboolean do_quit;
g_return_val_if_fail (store, MU_ERROR_INTERNAL); g_return_val_if_fail (store, MU_ERROR_INTERNAL);
query = mu_query_new (store, err); ctx.store = store;
if (!query) ctx.query = mu_query_new (store, err);
if (!ctx.query)
return MU_G_ERROR_CODE (err); return MU_G_ERROR_CODE (err);
install_sig_handler (); install_sig_handler ();
@ -1403,7 +1452,7 @@ mu_cmd_server (MuStore *store, MuConfig *opts/*unused*/, GError **err)
continue; continue;
} }
switch (handle_args (store, query, args, &my_err)) { switch (handle_args (&ctx, args, &my_err)) {
case MU_OK: break; case MU_OK: break;
case MU_STOP: case MU_STOP:
do_quit = TRUE; do_quit = TRUE;
@ -1415,8 +1464,8 @@ mu_cmd_server (MuStore *store, MuConfig *opts/*unused*/, GError **err)
mu_str_free_list (args); mu_str_free_list (args);
} }
mu_store_flush (store); mu_store_flush (ctx.store);
mu_query_destroy (query); mu_query_destroy (ctx.query);
return MU_OK; return MU_OK;
} }