added saxdb_read and saxdb_write functions
authorpk910 <philipp@zoelle1.de>
Tue, 1 Jan 2013 18:19:13 +0000 (19:19 +0100)
committerpk910 <philipp@zoelle1.de>
Tue, 1 Jan 2013 18:19:13 +0000 (19:19 +0100)
src/mod-hostserv.c

index a66c91dd29e38f1e0739ba2d6ea43b41c36a4467..88f55d45ce93b2c052ce5ee303c8403c8621fd3f 100644 (file)
@@ -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
+}