int init_reg_db(const str *db_url) { /* Find a database module */ if (db_bind_mod(db_url, ®_dbf) < 0) { LM_ERR("Unable to bind to a database driver\n"); return -1; } if (connect_reg_db(db_url)!=0){ LM_ERR("unable to connect to the database\n"); return -1; } if(db_check_table_version(®_dbf, reg_db_handle, ®_table_name, REG_TABLE_VERSION) < 0) { LM_ERR("error during table version check.\n"); return -1; } /* Load registrants into the primary list */ if(load_reg_info_from_db(0) !=0){ LM_ERR("unable to load the registrant data\n"); return -1; } reg_dbf.close(reg_db_handle); reg_db_handle = NULL; return 0; }
static struct mi_root* mi_reg_reload(struct mi_root* cmd, void* param) { struct mi_root *rpl_tree; int i; int err = 0; rpl_tree = init_mi_tree( 200, MI_OK_S, MI_OK_LEN); if (rpl_tree==NULL) return NULL; for(i=0; i<reg_hsize; i++) { lock_get(®_htable[i].lock); if (reg_htable[i].s_list!=NULL) { LM_ERR("Found non NULL s_list\n"); slinkedl_list_destroy(reg_htable[i].s_list); reg_htable[i].s_list = NULL; } reg_htable[i].s_list = slinkedl_init(®_alloc, ®_free); if (reg_htable[i].p_list == NULL) { LM_ERR("oom while allocating list\n"); err = 1; } lock_release(®_htable[i].lock); if (err) goto error; } /* Load registrants into the secondary list */ if(load_reg_info_from_db(1) !=0){ LM_ERR("unable to reload the registrant data\n"); free_mi_tree(rpl_tree); goto error; } /* Swap the lists: secondary will become primary */ for(i=0; i<reg_hsize; i++) { lock_get(®_htable[i].lock); slinkedl_list_destroy(reg_htable[i].p_list); reg_htable[i].p_list = reg_htable[i].s_list; reg_htable[i].s_list = NULL; lock_release(®_htable[i].lock); } return rpl_tree; error: for(i=0; i<reg_hsize; i++) { lock_get(®_htable[i].lock); if (reg_htable[i].s_list) slinkedl_list_destroy(reg_htable[i].s_list); reg_htable[i].s_list = NULL; lock_release(®_htable[i].lock); } return NULL; }