1717#include < gromox/exmdb_rpc.hpp>
1818#include < gromox/freebusy.hpp>
1919#include < gromox/mapidefs.h>
20+ #include < gromox/midb_agent.hpp>
2021#include < gromox/mysql_adaptor.hpp>
2122#include < gromox/process.hpp>
2223#include < gromox/svc_loader.hpp>
@@ -211,6 +212,65 @@ static int freeze_main(int argc, char **argv)
211212
212213}
213214
215+ namespace sync_midb {
216+
217+ static const char *g_folder_spec;
218+ static constexpr HXoption g_options_table[] = {
219+ {{}, ' f' , HXTYPE_STRP, &g_folder_spec, {}, {}, {}, " Forcibly rescan this folder" , " SPEC" },
220+ MBOP_AUTOHELP,
221+ HXOPT_TABLEEND,
222+ };
223+
224+ int main (int argc, char **argv)
225+ {
226+ HXopt6_auto_result argp;
227+
228+ if (HX_getopt6 (g_options_table, argc, argv, nullptr ,
229+ HXOPT_USAGEONERR) != HXOPT_ERR_SUCCESS || g_exit_after_optparse)
230+ return EXIT_PARAM;
231+
232+ int err = 0 , ret;
233+ if (g_folder_spec == nullptr ) {
234+ ret = midb_agent::ping_mailbox (g_storedir, &err);
235+ } else if (strcasecmp (g_folder_spec, " all" ) == 0 ) {
236+ ret = midb_agent::sync_mailbox (g_storedir, 0 , &err);
237+ } else {
238+ eid_t eid = gi_lookup_eid_by_name (g_storedir, g_folder_spec);
239+ if (eid == 0 ) {
240+ mbop_fprintf (stderr, " Not recognized/found: \" %s\"\n " , g_folder_spec);
241+ return EXIT_FAILURE;
242+ }
243+ ret = midb_agent::sync_mailbox (g_storedir, eid.gcv (), &err);
244+ }
245+ switch (ret) {
246+ case MIDB_RESULT_OK:
247+ if (global::g_verbose_mode)
248+ printf (" midb sync triggered\n " );
249+ return EXIT_SUCCESS;
250+ case MIDB_RESULT_ERROR:
251+ mbop_fprintf (stderr, " midb sync failed: backend returned %d\n " , err);
252+ break ;
253+ case MIDB_NO_SERVER:
254+ mbop_fprintf (stderr, " midb sync failed: midb backend unavailable\n " );
255+ break ;
256+ case MIDB_RDWR_ERROR:
257+ mbop_fprintf (stderr, " midb sync failed: protocol error while talking to midb\n " );
258+ break ;
259+ case MIDB_LOCAL_ENOMEM:
260+ mbop_fprintf (stderr, " midb sync failed: local memory exhausted\n " );
261+ break ;
262+ case MIDB_TOO_MANY_RESULTS:
263+ mbop_fprintf (stderr, " midb sync failed: backend returned too much data\n " );
264+ break ;
265+ default :
266+ mbop_fprintf (stderr, " midb sync failed: unexpected midb agent status %d\n " , ret);
267+ break ;
268+ }
269+ return EXIT_FAILURE;
270+ }
271+
272+ }
273+
214274static errno_t resolvename (const GUID &guid, const char *name, bool create,
215275 uint16_t *out)
216276{
@@ -426,8 +486,10 @@ static int single_user_wrap(int argc, char **argv)
426486 return ret;
427487}
428488
429- static constexpr generic_module g_dfl_svc_plugins[] =
430- {{" libgxs_mysql_adaptor.so" , SVC_mysql_adaptor}};
489+ static constexpr generic_module g_dfl_svc_plugins[] = {
490+ {" libgxs_mysql_adaptor.so" , SVC_mysql_adaptor},
491+ {" libgxs_midb_agent.so" , SVC_midb_agent},
492+ };
431493
432494int main (int argc, char **argv)
433495{
@@ -447,7 +509,7 @@ int main(int argc, char **argv)
447509 argv = result.uarg ;
448510 if (argc == 0 )
449511 return global::help ();
450- service_init ({nullptr , g_dfl_svc_plugins, 1 });
512+ service_init ({nullptr , g_dfl_svc_plugins, 2 });
451513 auto cl_1 = HX::make_scope_exit (service_stop);
452514 if (service_run_early () != 0 || service_run () != 0 ) {
453515 fprintf (stderr, " service_run: failed\n " );
@@ -535,6 +597,8 @@ int cmd_parser(int argc, char **argv)
535597 return set_locale::main (argc, argv);
536598 else if (strcmp (argv[0 ], " get-freebusy" ) == 0 || strcmp (argv[0 ], " gfb" ) == 0 )
537599 return getfreebusy::main (argc, argv);
600+ else if (strcmp (argv[0 ], " sync-midb" ) == 0 )
601+ return sync_midb::main (argc, argv);
538602
539603 if (strcmp (argv[0 ], " clear-profile" ) == 0 ) {
540604 auto ret = delstoreprop (argc, argv, PSETID_Gromox, " zcore_profsect" , PT_BINARY);
0 commit comments