static int dp_create_head(str part_desc) { str tmp; str *partition; str param_type, param_value; char* end, *start; int ulen = strlen(PARAM_URL), tlen = strlen(PARAM_TABLE); tmp.s = part_desc.s; end = q_memchr(part_desc.s, DP_CHAR_COLON, part_desc.len); if (end == NULL) goto out_err; tmp.len = end - tmp.s; str_trim_spaces_lr(tmp); partition = str_n_dup( &tmp, tmp.len); if (partition == NULL) goto mem_err; do { start = ++end; end = q_memchr(start, DP_CHAR_SCOLON, part_desc.s + part_desc.len - start); if (end == NULL) break; param_type.s = start; param_value.s = q_memchr(start, DP_CHAR_EQUAL, part_desc.len + part_desc.s - start); if (param_value.s == 0) goto out_err; param_type.len = (param_value.s - 1) - param_type.s; param_value.len = end - (++param_value.s); str_trim_spaces_lr(param_type); str_trim_spaces_lr(param_value); if ( !memcmp(param_type.s, PARAM_URL, ulen)) { dp_head_insert( DP_TYPE_URL, param_value, *partition); } else if ( !memcmp( param_type.s, PARAM_TABLE, tlen)) { dp_head_insert( DP_TYPE_TABLE, param_value, *partition); } else { LM_ERR("Invalid parameter type\n"); return -1; } } while(1); return 0; out_err: LM_ERR("invalid partition param definition\n"); return -1; mem_err: LM_ERR("no more memory\n"); return -1; }
static int mod_init(void) { str def_str = str_init(DEFAULT_PARTITION); dp_head_p el = dp_get_head(def_str); LM_INFO("initializing module...\n"); dpid_column.len = strlen(dpid_column.s); pr_column.len = strlen(pr_column.s); match_op_column.len = strlen(match_op_column.s); match_exp_column.len = strlen(match_exp_column.s); match_flags_column.len = strlen(match_flags_column.s); subst_exp_column.len = strlen(subst_exp_column.s); repl_exp_column.len = strlen(repl_exp_column.s); attrs_column.len = strlen(attrs_column.s); timerec_column.len = strlen(timerec_column.s); disabled_column.len = strlen(disabled_column.s); if (default_dp_db_url.s) { default_dp_db_url.len = strlen(default_dp_db_url.s); if (!el) { default_dp_partition.len = sizeof(DEFAULT_PARTITION) - 1; default_dp_partition.s = pkg_malloc(default_dp_partition.len); if (!default_dp_partition.s) { LM_ERR("No more pkg memory\n"); return -1; } memcpy(default_dp_partition.s, DEFAULT_PARTITION, default_dp_partition.len); } else { default_dp_partition.s = el->partition.s; default_dp_partition.len = el->partition.len; } dp_head_insert( DP_TYPE_URL, default_dp_db_url, default_dp_partition); } if (default_dp_table.s) { if (!default_dp_partition.s) { if (!el) { LM_ERR("DB URL not defined for partition default!\n"); return -1; } else { default_dp_partition.s = el->partition.s; default_dp_partition.len = el->partition.len; } } default_dp_table.len = strlen(default_dp_table.s); dp_head_insert( DP_TYPE_TABLE, default_dp_table, default_dp_partition); } el = dp_hlist; for (el = dp_hlist; el ; el = el->next) { //db_url must be set if (!el->dp_db_url.s) { LM_ERR("DB URL is not defined for partition %.*s!\n", el->partition.len,el->partition.s); return -1; } if (!el->dp_table_name.s) { el->dp_table_name.len = sizeof(DP_TABLE_NAME) - 1; el->dp_table_name.s = pkg_malloc(el->dp_table_name.len); if(!el->dp_table_name.s){ LM_ERR("No more pkg mem\n"); return -1; } memcpy(el->dp_table_name.s, DP_TABLE_NAME, el->dp_table_name.len); } } default_par2 = (dp_param_p)shm_malloc(sizeof(dp_param_t)); if(default_par2 == NULL){ LM_ERR("no shm more memory\n"); return -1; } memset(default_par2, 0, sizeof(dp_param_t)); default_param_s.len = strlen(default_param_s.s); if (pv_parse_spec( &default_param_s, &default_par2->v.sp[0])==NULL) { LM_ERR("input pv is invalid\n"); return -1; } default_param_s.len = strlen(default_param_s.s); if (pv_parse_spec( &default_param_s, &default_par2->v.sp[1])==NULL) { LM_ERR("output pv is invalid\n"); return -1; } dp_print_list(); if(init_data() != 0) { LM_ERR("could not initialize data\n"); return -1; } return 0; #undef init_db_url_part }
static int dp_create_head(str part_desc) { str tmp; str partition; str param_type, param_value; char* end, *start; int ulen = strlen(PARAM_URL), tlen = strlen(PARAM_TABLE); tmp.s = part_desc.s; end = q_memchr(part_desc.s, DP_CHAR_COLON, part_desc.len); if (end == NULL) { LM_ERR("[[%s]]\n", tmp.s); goto out_err; } tmp.len = end - tmp.s; str_trim_spaces_lr(tmp); partition = tmp; do { start = ++end; end = q_memchr(start, DP_CHAR_SCOLON, part_desc.s + part_desc.len - start); if (end == NULL) break; param_type.s = start; param_value.s = q_memchr(start, DP_CHAR_EQUAL, part_desc.len + part_desc.s - start); if (param_value.s == 0) { LM_ERR("[[%s]]!\n", param_value.s); goto out_err; } param_type.len = param_value.s - param_type.s; param_value.len = end - (++param_value.s); str_trim_spaces_lr(param_type); str_trim_spaces_lr(param_value); if (param_type.len == ulen && !memcmp(param_type.s, PARAM_URL, ulen)) { dp_head_insert( DP_TYPE_URL, ¶m_value, &partition); } else if ( param_type.len == tlen && !memcmp( param_type.s, PARAM_TABLE, tlen)) { dp_head_insert( DP_TYPE_TABLE, ¶m_value, &partition); } else { LM_ERR("Invalid parameter type definition [[%.*s]]\n", param_type.len, param_type.s); return -1; } } while(1); return 0; out_err: LM_ERR("invalid partition param definition\n"); return -1; }