bool black_list_rm(user_id_t uid, user_id_t blocked) { db_res_t *res = db_cmd("DELETE FROM blacklists" " WHERE user_id = %"DBIdUID" AND blocked = %"DBIdUID, uid, blocked); db_clear(res); return res; }
int db_u32_write(regDB_addr_t addr, regDB_val_t val) { db_register DB_reg; DB_reg.addr = addr; DB_reg.u32_val = val; return db_cmd(1, &DB_reg); }
void edit_followed_note(user_id_t follower, user_id_t followed, const char *notes) { if (string_validate_utf8(notes, FOLLOW_NOTE_CCHARS, false) < 0) return; db_res_t *res = db_cmd("UPDATE follows SET notes = %s" "WHERE user_id = %"DBIdUID" AND follower = %"DBIdUID, notes, followed, follower); db_clear(res); }
bool black_list_edit(user_id_t uid, user_id_t blocked, const char *notes) { if (string_validate_utf8(notes, BLACK_LIST_NOTE_CCHARS, false) < 0) return false; db_res_t *res = db_cmd("UPDATE blacklists SET notes = %s" " WHERE user_id = %"DBIdUID" AND blocked = %"DBIdUID, notes, uid, blocked); db_clear(res); return res; }
static bool activate_session(session_id_t sid, const char *uname) { db_res_t *res = db_cmd("UPDATE sessions SET active = TRUE, stamp = %t" " WHERE id = %"DBIdSID, fb_time(), sid); db_clear(res); if (res) return !do_web_login(uname, NULL, false); return false; }
static int child_init(int rank) { if (rank==PROC_INIT || rank==PROC_MAIN || rank==PROC_TCP_MAIN) return 0; /* do nothing for the main process */ if (db_url.s) { acc_db = db_ctx("acc_db"); if (acc_db == NULL) { ERR("Error while initializing database layer\n"); return -1; } if (db_add_db(acc_db, db_url.s) < 0) goto error; if (db_connect(acc_db) < 0) goto error; write_acc = db_cmd(DB_PUT, acc_db, acc_table.s, NULL, NULL, fld); if (write_acc == NULL) { ERR("Error while compiling database query\n"); goto error; } write_mc = db_cmd(DB_PUT, acc_db, mc_table.s, NULL, NULL, fld); if (write_mc == NULL) { ERR("Error while compiling database query\n"); goto error; } return 0; } else { LOG(L_CRIT, "BUG:acc:child_init: null db url\n"); return -1; } error: if (write_acc) db_cmd_free(write_acc); write_acc = NULL; if (write_mc) db_cmd_free(write_mc); write_mc = NULL; if (acc_db) db_ctx_free(acc_db); acc_db = NULL; return -1; }
int unfollow(user_id_t follower, user_id_t followed) { db_res_t *res = db_cmd("DELETE FROM follows WHERE user_id = %"DBIdUID " AND follower = %"DBIdUID, followed, follower); if (res) { int ret = db_cmd_rows(res); db_clear(res); return ret; } return 0; }
int db_u32_read(regDB_addr_t addr, regDB_val_t *val) { int ret; db_register DB_reg; DB_reg.addr = addr; ret = db_cmd(0, &DB_reg); if (ret >= 0) *val = DB_reg.u32_val; return ret; }
bool black_list_add(user_id_t uid, const char *blocked, const char *notes) { if (string_validate_utf8(notes, BLACK_LIST_NOTE_CCHARS, false) < 0) return false; user_id_t block_id = get_user_id(blocked); if (block_id <= 0 || block_id == uid) return false; db_res_t *res = db_cmd("INSERT INTO blacklists" " (user_id, blocked, notes, stamp)" " VALUES (%d, %d, %s, current_timestamp)", uid, block_id, notes); db_clear(res); return res; }
int db_check_addr(regDB_addr_t addr, long *iomap_index) { int ret; db_register DB_reg; DB_reg.addr = addr; ret = db_cmd(2, &DB_reg); if (ret == 0) { /* index returned is 1-based index, 0 is for not found. */ *iomap_index = (long)(DB_reg.u32_val - 1); } else { /* Error: CHECK_ADDR failed with code ret */ printf("HWREG CHECK_ADDR failed with code %d\n", ret); } return ret; }
static int exec_transl(str *group_name, db_cmd_t **cmd, db_res_t **res) { db_fld_t cols[5]; db_fld_t params[2]; memset(cols, 0, sizeof(cols)); cols[0].name = transl_cfg_table_fld; cols[0].type = DB_CSTR; cols[1].name = transl_cfg_table_group_name_field_fld; cols[1].type = DB_CSTR; cols[2].name = transl_cfg_table_name_field_fld; cols[2].type = DB_CSTR; cols[3].name = transl_cfg_table_value_field_fld; cols[3].type = DB_CSTR; memset(params, 0, sizeof(params)); params[0].name = transl_group_name_fld; params[0].type = DB_STR; params[0].op = DB_EQ; DBG(MODULE_NAME": exec_transl('%.*s', ...)\n", group_name->len, group_name->s); *cmd = db_cmd(DB_GET, db_cntx, transl_tbl, cols, params, NULL); if (!*cmd) { ERR(MODULE_NAME": Error preparing query '%s'\n", transl_tbl); return -1; } (*cmd)->match[0].flags &= ~DB_NULL; (*cmd)->match[0].v.lstr = *group_name; // FIXME: proprietary code! db_setopt(*cmd, "key", "pKey"); db_setopt(*cmd, "key_omit", 1); if (db_exec(res, *cmd) < 0) { ERR(MODULE_NAME": Error executing query '%s'\n", transl_tbl); db_cmd_free(*cmd); return -1; } return 0; }
/** * Follow a person. * @param follower The follower id. * @param followed The name of followed person. * @param notes Notes. * @return Affected rows. */ int follow(user_id_t follower, const char *followed, const char *notes) { if (notes) { if (string_validate_utf8(notes, FOLLOW_NOTE_CCHARS, false) < 0) return 0; } else { notes = ""; } user_id_t uid = get_user_id(followed); if (!uid) return 0; db_res_t *res = db_cmd("INSERT INTO follows (user_id, follower, notes)" " VALUES (%"DBIdUID", %"DBIdUID", %s)", uid, follower, notes); if (res) { int ret = db_cmd_rows(res); db_clear(res); return ret; } return 0; }
static int init_db(struct dbops_action* p) { db_fld_t* matches = NULL, *result = NULL, *values = NULL; int type, i; DEBUG(MODULE_NAME": init_db: query: %s(%d)\n", p->query_name, p->query_no); if (p->db_url == NULL) { ERR(MODULE_NAME": No database URL specified\n"); return -1; } p->ctx = db_ctx(MODULE_NAME); if (p->ctx == NULL) { ERR(MODULE_NAME": Error while initializing database layer\n"); return -1; } if (db_add_db(p->ctx, p->db_url) < 0) return -1; if (db_connect(p->ctx) < 0) return -1; if (p->is_raw_query) { type = DB_SQL; if (build_params(&matches, p) < 0) return -1; } else { switch(p->operation) { case INSERT_OPS: case REPLACE_OPS: type = DB_PUT; if (build_params(&values, p) < 0) return -1; break; case UPDATE_OPS: type = DB_UPD; if (build_match(&matches, p) < 0) return -1; if (build_params(&values, p) < 0) { if (matches) pkg_free(matches); return -1; } break; case DELETE_OPS: type = DB_DEL; if (build_match(&matches, p) < 0) return -1; break; case OPEN_QUERY_OPS: type = DB_GET; if (build_match(&matches, p) < 0) return -1; if (build_result(&result, p) < 0) { if (matches) pkg_free(matches); return -1; } break; default: BUG("Unknown operation %d\n", p->operation); return -1; } } p->cmd = db_cmd(type, p->ctx, p->table.s, result, matches, values); if (p->cmd == NULL) { ERR(MODULE_NAME": init_db: query: %s(%d), error while compiling database query\n", p->query_name, p->query_no); if (values) pkg_free(values); if (matches) pkg_free(matches); if (result) pkg_free(result); db_disconnect(p->ctx); db_ctx_free(p->ctx); return -1; } if (values) pkg_free(values); if (matches) pkg_free(matches); if (result) pkg_free(result); for (i=0; i<p->extra_ops_count; i++) { char *end; DEBUG(MODULE_NAME": init_db: query_no: %s(%d), setopt('%s', %i, '%s'\n", p->query_name, p->query_no, p->extra_ops[i].name, p->extra_ops[i].type, p->extra_ops[i].value); switch (p->extra_ops[i].type) { case DB_NONE: /* set null ?? */ break; case DB_DATETIME: { time_t v; v = strtol(p->extra_ops[i].value, &end, 10); if (db_setopt(p->cmd, p->extra_ops[i].name, v) < 0) return -1; break; } case DB_INT: { int v; v = strtol(p->extra_ops[i].value, &end, 10); if (db_setopt(p->cmd, p->extra_ops[i].name, v) < 0) return -1; break; } case DB_FLOAT: { float v; #ifdef __USE_ISOC99 v = strtof(p->extra_ops[i].value, &end); #else v = strtod(p->extra_ops[i].value, &end); #endif if (db_setopt(p->cmd, p->extra_ops[i].name, v) < 0) return -1; break; } case DB_DOUBLE: { double v; v = strtod(p->extra_ops[i].value, &end); if (db_setopt(p->cmd, p->extra_ops[i].name, v) < 0) return -1; break; } case DB_CSTR: if (db_setopt(p->cmd, p->extra_ops[i].name, p->extra_ops[i].value) < 0) return -1; break; default: BUG("Unknown extra_op type: %d\n", p->extra_ops[i].type); return -1; } } return 0; }
/* * Initialize children */ static int child_init(int rank) { int i, j, mpid, cpid; DBG("XJAB:child_init: initializing child <%d>\n", rank); /* Rank 0 is main process now - 1 is the first child (janakj) */ if(rank == 1) { #ifdef HAVE_IHTTP /** register iHTTP callbacks -- go forward in any case*/ ihb.reg_f("xjab", "XMPP Gateway", IH_MENU_YES, xjab_mod_info, NULL); ihb.reg_f("xjabc", "XMPP connections", IH_MENU_YES, xjab_connections, NULL); #endif if((mpid=fork())<0 ) { LOG(L_ERR, "XJAB:child_init:error - cannot launch worker's" " manager\n"); return -1; } if(mpid == 0) { /** launching the workers */ for(i=0;i<nrw;i++) { if ( (cpid=fork())<0 ) { LOG(L_ERR,"XJAB:child_init:error - cannot launch worker\n"); return -1; } if (cpid == 0) { for(j=0;j<nrw;j++) if(j!=i) close(pipes[j][0]); close(pipes[i][1]); if(xj_wlist_set_pid(jwl, getpid(), i) < 0) { LOG(L_ERR, "XJAB:child_init:error setting worker's" " pid\n"); return -1; } /* initialize the config framework */ if (cfg_child_init()) return -1; ctx = db_ctx("jabber"); if (ctx == NULL) goto dberror; if (db_add_db(ctx, db_url) < 0) goto dberror; if (db_connect(ctx) < 0) goto dberror; cmd = db_cmd(DB_GET, ctx, db_table, db_cols, db_params, NULL); if (!cmd) goto dberror; xj_worker_process(jwl,jaddress,jport,i, cmd); db_cmd_free(cmd); db_ctx_free(ctx); ctx = NULL; /* destroy the local config */ cfg_child_destroy(); exit(0); } } mpid = getpid(); /* initialize the config framework */ if (cfg_child_init()) return -1; while(1) { sleep(check_time); /* update the local config */ cfg_update(); xjab_check_workers(mpid); } } } //if(pipes) //{ // for(i=0;i<nrw;i++) // close(pipes[i][0]); //} return 0; dberror: if (cmd) db_cmd_free(cmd); cmd = NULL; if (ctx) db_ctx_free(ctx); ctx = NULL; return -1; }
/* module initialization function */ static int mod_init(void) { static str default_s = STR_STATIC_INIT("<default>"); db_cmd_t *cmd; db_res_t *res; db_rec_t *rec; db_fld_t cols[7]; DBG(MODULE_NAME": mod_init: initializing\n"); /* get default values from translation table */ if (connect_db() < 0) return E_CFG; DBG(MODULE_NAME": mod_init: getting default values from translation table\n"); if (exec_transl(&default_s, &cmd, &res) < 0) return E_CFG; rec = db_first(res); if (rec) { CSTRDUP(def_cfg_table, rec->fld[0]); CSTRDUP(def_cfg_table_group_name_field, rec->fld[1]); CSTRDUP(def_cfg_table_name_field, rec->fld[2]); CSTRDUP(def_cfg_table_value_field, rec->fld[3]); } // db_rec_free(rec); // ---> causes next db_cmd is aborted !!! db_res_free(res); db_cmd_free(cmd); DBG(MODULE_NAME": mod_init: default values: table='%s', group_name_field='%s', name_field='%s', value_field='%s'\n", def_cfg_table, def_cfg_table_group_name_field, def_cfg_table_name_field, def_cfg_table_value_field); /* get custom parameters from database */ DBG(MODULE_NAME": mod_init: getting custom parameters from '%s'\n", custom_tbl); memset(cols, 0, sizeof(cols)); cols[0].name = custom_tbl_group_name_fld; cols[0].type = DB_CSTR; cols[1].name = custom_tbl_name_fld; cols[1].type = DB_CSTR; cols[2].name = custom_tbl_value_type_fld; cols[2].type = DB_CSTR; cols[3].name = custom_tbl_min_value_fld; cols[3].type = DB_INT; cols[4].name = custom_tbl_max_value_fld; cols[4].type = DB_INT; cols[5].name = custom_tbl_decription_fld; cols[5].type = DB_CSTR; cmd = db_cmd(DB_GET, db_cntx, custom_tbl, cols, NULL, NULL); if (!cmd) { ERR(MODULE_NAME": Error preparing query '%s'\n", custom_tbl); return E_CFG; } if (db_exec(&res, cmd) < 0) { ERR(MODULE_NAME": Error executing query '%s'\n", custom_tbl); db_cmd_free(cmd); return E_CFG; } rec = db_first(res); while (rec) { DBG(MODULE_NAME": custom parameter '%s.%s' type:%s\n", rec->fld[0].v.cstr, rec->fld[1].v.cstr, rec->fld[2].v.cstr); if (((rec->fld[0].flags & DB_NULL) || strlen(rec->fld[0].v.cstr) == 0) || ((rec->fld[1].flags & DB_NULL) || strlen(rec->fld[1].v.cstr) == 0) || ((rec->fld[2].flags & DB_NULL) || strlen(rec->fld[2].v.cstr) == 0)) { ERR(MODULE_NAME": empty group_name,name or type value in table '%s'\n", custom_tbl); return E_CFG; } switch (rec->fld[2].v.cstr[0]) { case 'i': case 'I': if (cfg_declare_int(rec->fld[0].v.cstr, rec->fld[1].v.cstr, 0, rec->fld[3].v.int4, rec->fld[4].v.int4, rec->fld[5].v.cstr) < 0) { ERR(MODULE_NAME": Error declaring cfg int '%s.%s'\n", rec->fld[0].v.cstr, rec->fld[1].v.cstr); return E_CFG; } break; case 's': case 'S': if (cfg_declare_str(rec->fld[0].v.cstr, rec->fld[1].v.cstr, "", rec->fld[5].v.cstr) < 0) { ERR(MODULE_NAME": Error declaring cfg str '%s.%s'\n", rec->fld[0].v.cstr, rec->fld[1].v.cstr); return E_CFG; } break; default: ERR(MODULE_NAME": bad custom value type '%s'\n", rec->fld[2].v.cstr); return E_CFG; } rec = db_next(res); } db_res_free(res); db_cmd_free(cmd); /* register into config framework */ DBG(MODULE_NAME": mod_init: registering cfg callback\n"); if (cfg_register_ctx(&cfg_ctx, on_declare) < 0) { ERR(MODULE_NAME": failed to register cfg context\n"); return -1; } return 0; }
/* translate name using translation table, returns 0..not found, 1..success, -1..error */ static int find_cfg_var(str *group_name, char *def_name, db_res_t *transl_res) { db_rec_t *transl_rec; int ret = -1; DBG(MODULE_NAME": find_cfg_var('%.*s', '%s', ...)\n", group_name->len, group_name->s, def_name); transl_rec = db_first(transl_res); /* iterate through each candidate where cfg def may be found */ while (transl_rec) { static db_cmd_t* cmd; db_rec_t *rec; db_res_t *res; db_fld_t params[3], cols[2]; memset(cols, 0, sizeof(cols)); cols[0].name = GETCSTR(transl_rec->fld[3], def_cfg_table_value_field); cols[0].type = DB_NONE; memset(params, 0, sizeof(params)); params[0].name = GETCSTR(transl_rec->fld[1], def_cfg_table_group_name_field); params[0].type = DB_STR; params[0].op = DB_EQ; params[1].name = GETCSTR(transl_rec->fld[2], def_cfg_table_name_field); params[1].type = DB_CSTR; params[1].op = DB_EQ; DBG(MODULE_NAME": exec_transl: looking in '%s'\n", GETCSTR(transl_rec->fld[0], def_cfg_table)); cmd = db_cmd(DB_GET, db_cntx, GETCSTR(transl_rec->fld[0], def_cfg_table), cols, params, NULL); if (!cmd) { ERR(MODULE_NAME": Error preparing query '%s'\n", transl_tbl); return -1; } cmd->match[0].flags &= ~DB_NULL; cmd->match[0].v.lstr = *group_name; cmd->match[1].flags &= ~DB_NULL; cmd->match[1].v.cstr = def_name; // FIXME: proprietary code! db_setopt(cmd, "key", "bySerGroup"); db_setopt(cmd, "key_omit", 0); if (db_exec(&res, cmd) < 0) { ERR(MODULE_NAME": Error executing query '%s'\n", transl_tbl); db_cmd_free(cmd); return -1; } rec = db_first(res); if (rec) { /* var found in config table */ str def_name_s; def_name_s.s = def_name; def_name_s.len = strlen(def_name); DBG(MODULE_NAME": exec_transl: found record, type:%d\n", rec->fld[0].type); /* read and set cfg var */ switch (rec->fld[0].type) { case DB_STR: if (cfg_set_now(cfg_ctx, group_name, NULL /* group id */, &def_name_s, &rec->fld[0].v.lstr, CFG_VAR_STR) < 0) goto err; break; case DB_CSTR: if (cfg_set_now_string(cfg_ctx, group_name, NULL /* group id */, &def_name_s, rec->fld[0].v.cstr) < 0) goto err; break; case DB_INT: if (cfg_set_now_int(cfg_ctx, group_name, NULL /* group id */, &def_name_s, rec->fld[0].v.int4) < 0) goto err; break; default: ERR(MODULE_NAME": unexpected field type (%d), table:'%s', field:'%s'\n", rec->fld[0].type, GETCSTR(transl_rec->fld[0], def_cfg_table), GETCSTR(transl_rec->fld[3], def_cfg_table_value_field) ); goto err; } ret = 1; err: db_res_free(res); db_cmd_free(cmd); return ret; } db_res_free(res); db_cmd_free(cmd); transl_rec = db_next(transl_res); } return 0; }
{.name = NULL} }; db_res_t* res = NULL; db_rec_t* rec; db_cmd_t* get_all = NULL; struct socket_info* sock; str callid, ua, instance, aor; str* receivedp; qvalue_t q; unsigned int flags; urecord_t* r; ucontact_t* c; get_all = db_cmd(DB_GET, db, _d->name->s, columns, NULL, NULL); if (get_all == NULL) { ERR("usrloc: Error while compiling DB_GET command\n"); return -1; } if (db_setopt(get_all, "fetch_all", 0) < 0) { ERR("usrloc: Error while disabling 'fetch_all' database option\n"); } if (db_exec(&res, get_all) < 0) goto error; rec = db_first(res); if (rec == NULL) { DBG("preload_udomain(): Table is empty\n"); db_res_free(res); db_cmd_free(get_all);
/** * check if all SER2Jab workers are still alive * - if not, try to launch new ones */ void xjab_check_workers(int mpid) { int i, n, stat; //DBG("XJAB:%d:xjab_check_workers: time=%d\n", mpid, get_ticks()); if(!jwl || jwl->len <= 0) return; for(i=0; i < jwl->len; i++) { if(jwl->workers[i].pid > 0) { stat = 0; n = waitpid(jwl->workers[i].pid, &stat, WNOHANG); if(n == 0 || n!=jwl->workers[i].pid) continue; LOG(L_ERR,"XJAB:xjab_check_workers: worker[%d][pid=%d] has exited" " - status=%d err=%d errno=%d\n", i, jwl->workers[i].pid, stat, n, errno); xj_wlist_clean_jobs(jwl, i, 1); xj_wlist_set_pid(jwl, -1, i); } #ifdef XJ_EXTRA_DEBUG DBG("XJAB:%d:xjab_check_workers: create a new worker[%d]\n", mpid, i); #endif if ( (stat=fork())<0 ) { #ifdef XJ_EXTRA_DEBUG DBG("XJAB:xjab_check_workers: error - cannot launch new" " worker[%d]\n", i); #endif LOG(L_ERR, "XJAB:xjab_check_workers: error - worker[%d] lost" " forever \n", i); return; } if (stat == 0) { if(xj_wlist_set_pid(jwl, getpid(), i) < 0) { LOG(L_ERR, "XJAB:xjab_check_workers: error setting new" " worker's pid - w[%d]\n", i); return; } /* initialize the config framework * The child process was not registered under * the framework during mod_init, therefore the * late version needs to be called. (Miklos) */ if (cfg_late_child_init()) return; ctx = db_ctx("jabber"); if (ctx == NULL) goto dberror; if (db_add_db(ctx, db_url) < 0) goto dberror; if (db_connect(ctx) < 0) goto dberror; cmd = db_cmd(DB_GET, ctx, db_table, db_cols, db_params, NULL); if (!cmd) goto dberror; xj_worker_process(jwl,jaddress,jport,i, cmd); db_cmd_free(cmd); db_ctx_free(ctx); ctx = NULL; /* destroy the local config */ cfg_child_destroy(); exit(0); } } dberror: if (cmd) db_cmd_free(cmd); cmd = NULL; if (ctx) db_ctx_free(ctx); ctx = NULL; }