From: pk910 Date: Tue, 1 Jan 2013 18:19:13 +0000 (+0100) Subject: added saxdb_read and saxdb_write functions X-Git-Url: http://git.pk910.de/?p=srvx.git;a=commitdiff_plain;h=953be72cfd954be6a2521ac2b5b561f4dca5ac4e added saxdb_read and saxdb_write functions --- diff --git a/src/mod-hostserv.c b/src/mod-hostserv.c index a66c91d..88f55d4 100644 --- a/src/mod-hostserv.c +++ b/src/mod-hostserv.c @@ -742,67 +742,204 @@ static MODCMD_FUNC(cmd_delmanager) { reply("HSMSG_MANAGER_DELETED", hi->handle, slfh_name, tlfh_name); } -static int hostserv_saxdb_read(struct dict *conf_db) { - return 1; +static int hostserv_saxdb_read_secondlevel(const char *name, void *data, UNUSED_ARG(void *extra)); +static int hostserv_saxdb_read_assignments(const char *name, void *data, UNUSED_ARG(void *extra)); + +static int hostserv_saxdb_read_toplevel(const char *name, void *data, UNUSED_ARG(void *extra)) { + struct record_data *rd = data; + struct hs_toplevel *tlfh; + struct hs_manager *managerTL; + struct hs_user *user; + struct dict *object; + + if (rd->type == RECDB_OBJECT) { + dict_t db = GET_RECORD_OBJECT(rd); + dict_iterator_t it; + + tlfh = hs_add_toplevel(name); + + if ((object = database_get_data(db, KEY_MANAGERS, RECDB_OBJECT))) { + for (it = dict_first(object); it; it = iter_next(it)) { + user = hs_get_user(get_handle_info(iter_key(it)), 1); + //rd = iter_data(it); + /* nothing in here, yet */ + managerTL = hs_add_manager_toplevel(tlfh, user); + if (database_get_data(db, KEY_ACTIVE, RECDB_QSTRING)) + managerTL->active = 1; + else + managerTL->active = 0; + } + } + + if ((object = database_get_data(db, KEY_SECONDLEVEL, RECDB_OBJECT))) + dict_foreach(object, hostserv_saxdb_read_secondlevel, tlfh); + } + return 0; +} + +static int hostserv_saxdb_read_secondlevel(const char *name, void *data, UNUSED_ARG(void *extra)) { + struct record_data *rd = data; + struct hs_toplevel *tlfh = extra; + struct hs_secondlevel *slfh; + struct hs_manager *managerSL; + struct hs_user *user; + struct dict *object; + + if (rd->type == RECDB_OBJECT) { + dict_t db = GET_RECORD_OBJECT(rd); + dict_iterator_t it; + + slfh = hs_add_secondlevel(tlfh, name); + + if ((object = database_get_data(db, KEY_MANAGERS, RECDB_OBJECT))) { + for (it = dict_first(object); it; it = iter_next(it)) { + user = hs_get_user(get_handle_info(iter_key(it)), 1); + //rd = iter_data(it); + /* nothing in here, yet */ + managerSL = hs_add_manager_secondlevel(slfh, user); + if (database_get_data(db, KEY_ACTIVE, RECDB_QSTRING)) + managerSL->active = 1; + else + managerSL->active = 0; + } + } + + if ((object = database_get_data(db, KEY_ASSIGNMENTS, RECDB_OBJECT))) + dict_foreach(object, hostserv_saxdb_read_assignments, slfh); + } + return 0; } -static int hostserv_saxdb_write(struct saxdb_context *ctx) { - - return 0; +static int hostserv_saxdb_read_assignments(const char *name, void *data, UNUSED_ARG(void *extra)) { + struct record_data *rd = data; + struct hs_secondlevel *slfh = extra; + struct hs_user *user; + struct hs_assignment *assng; + + if (rd->type == RECDB_OBJECT) { + dict_t db = GET_RECORD_OBJECT(rd); + + user = hs_get_user(get_handle_info(name), 1); + assng = hs_add_assignment(slfh, user); + + if (database_get_data(db, KEY_ACTIVE, RECDB_QSTRING)) + assng->active = 1; + else + assng->active = 0; + } + + return 0; } -static void hostserv_conf_read(void) +static int +hostserv_saxdb_read(struct dict *db) { - dict_t conf_node; - const char *str; + struct dict *object; - str = "modules/hostserv"; - if (!(conf_node = conf_get_data(str, RECDB_OBJECT))) { - log_module(HS_LOG, LOG_ERROR, "config node `%s' is missing or has wrong type.", str); - return; - } + if ((object = database_get_data(db, KEY_TOPLEVEL, RECDB_OBJECT))) + dict_foreach(object, hostserv_saxdb_read_toplevel, NULL); - str = database_get_data(conf_node, "nick", RECDB_QSTRING); - if(hostserv_conf.nick && strcmp(hostserv_conf.nick, str)) { - //nick changed + return 1; +} + +static int +hostserv_saxdb_write(struct saxdb_context *ctx) +{ + struct hs_toplevel *tlfh; + struct hs_secondlevel *slfh; + struct hs_assignment *assng; + struct hs_manager *manager; + + saxdb_start_record(ctx, KEY_TOPLEVEL, 1); + for(tlfh = toplevels; tlfh; tlfh = tlfh->next) { + saxdb_start_record(ctx, tlfh->fakehost, 1); + + saxdb_start_record(ctx, KEY_MANAGERS, 1); + for(manager = tlfh->managers; manager; manager = manager->next) { + saxdb_start_record(ctx, manager->user->hi->handle, 0); + //additional manager information? + if(manager->active) + saxdb_write_int(ctx, KEY_ACTIVE, manager->active); + saxdb_end_record(ctx); + } + saxdb_end_record(ctx); + + saxdb_start_record(ctx, KEY_SECONDLEVEL, 1); + for(slfh = tlfh->secondlevel; slfh; slfh = slfh->next) { + saxdb_start_record(ctx, slfh->fakehost, 1); + + saxdb_start_record(ctx, KEY_MANAGERS, 1); + for(manager = slfh->managers; manager; manager = manager->next) { + saxdb_start_record(ctx, manager->user->hi->handle, 0); + //additional manager information? + if(manager->active) + saxdb_write_int(ctx, KEY_ACTIVE, manager->active); + saxdb_end_record(ctx); + } + saxdb_end_record(ctx); + + saxdb_start_record(ctx, KEY_ASSIGNMENTS, 1); + for(assng = slfh->assignments; assng; assng = assng->next) { + saxdb_start_record(ctx, assng->user->hi->handle, 0); + //additional assignment information? + if(assng->active) + saxdb_write_int(ctx, KEY_ACTIVE, assng->active); + saxdb_end_record(ctx); + } + saxdb_end_record(ctx); + + saxdb_end_record(ctx); + } + saxdb_end_record(ctx); + + saxdb_end_record(ctx); } - hostserv_conf.nick = str; + saxdb_end_record(ctx); - str = database_get_data(conf_node, "modes", RECDB_QSTRING); - hostserv_conf.modes = (str ? str : NULL); - - /*str = database_get_data(conf_node, "description", RECDB_QSTRING); - hostserv_conf.description = (str ? str : NULL);*/ + return 0; } -static void hostserv_db_cleanup(void) { - shutting_down=1; - close_helpfile(hostserv_helpfile); - dict_delete(hostserv_func_dict); - if (reqlog_f) - fclose(reqlog_f); +static void hostserv_db_cleanup(void) { + hs_free_all(); } -/* to be continued - some day in the future - maybe? */ int hostserv_init() { HS_LOG = log_register_type("HostServ", "file:hostserv.log"); - hostserv_func_dict = dict_new(); - /*dict_set_free_data(hosts, delete_memo_account);*/ - /*reg_auth_func(hostserv_check_messages); - reg_handle_rename_func(hostserv_rename_account); - reg_unreg_func(hostserv_unreg_account);*/ + + const char *nick, *modes; + if((nick = conf_get_data("modules/hostserv/nick", RECDB_QSTRING))) { + modes = conf_get_data("modules/hostserv/modes", RECDB_QSTRING); + hostserv = AddLocalUser(nick, nick, NULL, "Host Service", modes); + hostserv_service = service_register(hostserv); + hostserv_service->trigger = '*'; + } + conf_register_reload(hostserv_conf_read); reg_exit_func(hostserv_db_cleanup); saxdb_register("HostServ", hostserv_saxdb_read, hostserv_saxdb_write); hostserv_module = module_register("HostServ", HS_LOG, "mod-hostserv.help", NULL); - modcmd_register(hostserv_module, "view", cmd_view, 3, MODCMD_REQUIRE_AUTHED, NULL); - modcmd_register(hostserv_module, "addmanager", cmd_addmanager, 1, MODCMD_REQUIRE_AUTHED, NULL); - modcmd_register(hostserv_module, "delmanager", cmd_delmanager, 2, MODCMD_REQUIRE_AUTHED, NULL); + modcmd_register(hostserv_module, "view", cmd_view, 0, MODCMD_REQUIRE_AUTHED, NULL); + modcmd_register(hostserv_module, "addmanager", cmd_addmanager, 3, MODCMD_REQUIRE_AUTHED, NULL); + modcmd_register(hostserv_module, "delmanager", cmd_delmanager, 3, MODCMD_REQUIRE_AUTHED, NULL); message_register_table(msgtab); return 1; } int hostserv_finalize(void) { + dict_t conf_node; + const char *str; + + str = "modules/hostserv"; + if (!(conf_node = conf_get_data(str, RECDB_OBJECT))) { + log_module(HS_LOG, LOG_ERROR, "config node `%s' is missing or has wrong type.", str); + return 0; + } + + str = database_get_data(conf_node, "nick", RECDB_QSTRING); + if (str) hostserv_conf.nick = str; + + str = database_get_data(conf_node, "modes", RECDB_QSTRING); + if (str) hostserv_conf.modes = str; return 1; -} \ No newline at end of file +}