00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <stdlib.h>
00021 #include <stdio.h>
00022 #include <string.h>
00023
00024 #include "../../str.h"
00025 #include "../../db/db.h"
00026 #include "../../dprint.h"
00027
00028 #include "mapping.h"
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054 extern db_func_t pa_dbf;
00055 extern str db_url;
00056 extern str db_table;
00057
00058 void extern_account_free(extern_account_t *accounts, int count) {
00059 if (accounts) {
00060 int i;
00061 for (i = 0; i < count; i++) {
00062 if (accounts[i].protocol)
00063 pkg_free(accounts[i].protocol);
00064 if (accounts[i].username)
00065 pkg_free(accounts[i].username);
00066 if (accounts[i].password)
00067 pkg_free(accounts[i].password);
00068 }
00069 pkg_free(accounts);
00070 }
00071 }
00072
00073 void extern_user_free(extern_user_t *users, int count) {
00074 if (users) {
00075 int i;
00076 for (i = 0; i < count; i++) {
00077 if (users[i].protocol)
00078 pkg_free(users[i].protocol);
00079 if (users[i].username)
00080 pkg_free(users[i].username);
00081 }
00082 pkg_free(users);
00083 }
00084 }
00085
00086 char *find_sip_user(char *extern_user) {
00087 LM_DBG("looking up sip user for %s\n", extern_user);
00088 char *sip_user_r;
00089 str sip_user;
00090
00091 str ext_user;
00092 ext_user.s = extern_user;
00093 ext_user.len = strlen(extern_user);
00094
00095 db_key_t query_cols[6];
00096 db_op_t query_ops[6];
00097 db_val_t query_vals[6];
00098 db_key_t result_cols[6];
00099 int n_query_cols = 0, n_result_cols = 0;
00100 db_row_t *row;
00101 db_val_t *row_vals;
00102 db_res_t *result = NULL;
00103 int sip_user_col;
00104
00105 str q_ext_user = {"ext_user", 8};
00106 query_cols[n_query_cols] = &q_ext_user;
00107 query_ops[n_query_cols] = OP_EQ;
00108 query_vals[n_query_cols].type = DB_STR;
00109 query_vals[n_query_cols].nul = 0;
00110 query_vals[n_query_cols].val.str_val = ext_user;
00111 n_query_cols++;
00112
00113 str r_sip_user = {"sip_user", 8};
00114 result_cols[sip_user_col=n_result_cols++] = &r_sip_user;
00115
00116 db_con_t *pa_db;
00117 pa_db = pa_dbf.init(&db_url);
00118 if (!pa_db) {
00119 LM_ERR("error connecting database\n");
00120 return NULL;
00121 }
00122
00123 if (pa_dbf.use_table(pa_db, &db_table) < 0) {
00124 LM_ERR("error in use_table\n");
00125 return NULL;
00126 }
00127
00128 if (pa_dbf.query(pa_db, query_cols, query_ops, query_vals, result_cols, n_query_cols, n_result_cols, 0, &result) < 0) {
00129 LM_ERR("error in sql query\n");
00130 pa_dbf.close(pa_db);
00131 return NULL;
00132 }
00133
00134 if (result == NULL)
00135 return NULL;
00136 if (result->n <= 0)
00137 return NULL;
00138
00139 row = &result->rows[0];
00140 row_vals = ROW_VALUES(row);
00141
00142 sip_user_r = (char*) row_vals[sip_user_col].val.string_val;
00143
00144 if (sip_user_r == NULL)
00145 return NULL;
00146
00147 sip_user.s = (char*) pkg_malloc(sizeof(char) * (strlen(sip_user_r)+1));
00148 sip_user.len = sprintf(sip_user.s, "%s", sip_user_r);
00149
00150 pa_dbf.free_result(pa_db, result);
00151 pa_dbf.close(pa_db);
00152
00153 return sip_user.len ? sip_user.s : NULL;
00154 }
00155
00156 extern_account_t *find_accounts(char* sip_user, int* count) {
00157 LM_DBG("looking up external account for %s\n", sip_user);
00158 extern_account_t* accounts = NULL;
00159 *count = 0;
00160
00161 db_key_t query_cols[6];
00162 db_op_t query_ops[6];
00163 db_val_t query_vals[6];
00164 db_key_t result_cols[6];
00165 int n_query_cols = 0, n_result_cols = 0;
00166 db_row_t *row;
00167 db_val_t *row_vals;
00168 db_res_t *result = NULL;
00169 int ext_prot_col, ext_user_col, ext_pass_col;
00170
00171 str q_sip_user = {"sip_user", 8};
00172 query_cols[n_query_cols] = &q_sip_user;
00173 query_ops[n_query_cols] = OP_EQ;
00174 query_vals[n_query_cols].type = DB_STRING;
00175 query_vals[n_query_cols].nul = 0;
00176 query_vals[n_query_cols].val.string_val = sip_user;
00177 n_query_cols++;
00178
00179 str r_ext_prot = {"ext_prot", 8};
00180 str r_ext_user = {"ext_user", 8};
00181 str r_ext_pass = {"ext_pass", 8};
00182 result_cols[ext_prot_col=n_result_cols++] = &r_ext_prot;
00183 result_cols[ext_user_col=n_result_cols++] = &r_ext_user;
00184 result_cols[ext_pass_col=n_result_cols++] = &r_ext_pass;
00185
00186 db_con_t *pa_db;
00187 pa_db = pa_dbf.init(&db_url);
00188 if (!pa_db) {
00189 LM_ERR("error connecting database\n");
00190 return NULL;
00191 }
00192
00193 if (pa_dbf.use_table(pa_db, &db_table) < 0) {
00194 LM_ERR("error in use_table\n");
00195 return NULL;
00196 }
00197
00198 if (pa_dbf.query(pa_db, query_cols, query_ops, query_vals, result_cols, n_query_cols, n_result_cols, 0, &result) < 0) {
00199 LM_ERR("in sql query\n");
00200 pa_dbf.close(pa_db);
00201 return NULL;
00202 }
00203 else
00204 LM_DBG("sql query done\n");
00205
00206 if (result == NULL) {
00207 LM_ERR("result = NULL\n");
00208 return NULL;
00209 }
00210 if (result->n <= 0) {
00211 LM_ERR("result count = %d\n", result->n);
00212 return NULL;
00213 }
00214
00215 accounts = (extern_account_t*) pkg_malloc(sizeof(extern_account_t)*result->n);
00216
00217 int i;
00218 char *val;
00219 for (i = 0; i < result->n; i++) {
00220 row = &result->rows[i];
00221 row_vals = ROW_VALUES(row);
00222
00223 val = (char*) row_vals[ext_user_col].val.string_val;
00224 accounts[i].username = (char*)pkg_malloc(sizeof(char)*(strlen(val)+1));
00225 strcpy(accounts[i].username, val);
00226
00227 val = (char*) row_vals[ext_pass_col].val.string_val;
00228 accounts[i].password = (char*)pkg_malloc(sizeof(char)*(strlen(val)+1));
00229 strcpy(accounts[i].password, val);
00230
00231 val = (char*) row_vals[ext_prot_col].val.string_val;
00232 accounts[i].protocol = (char*)pkg_malloc(sizeof(char)*(strlen(val)+1));
00233 strcpy(accounts[i].protocol, val);
00234
00235 }
00236
00237 *count = result->n;
00238
00239 pa_dbf.free_result(pa_db, result);
00240 pa_dbf.close(pa_db);
00241
00242 return accounts;
00243 }
00244
00245 extern_user_t *find_users(char *sip_user, int* count) {
00246 LM_DBG("looking up external users for %s\n", sip_user);
00247 extern_user_t* users = NULL;
00248 *count = 0;
00249
00250 db_key_t query_cols[6];
00251 db_op_t query_ops[6];
00252 db_val_t query_vals[6];
00253 db_key_t result_cols[6];
00254 int n_query_cols = 0, n_result_cols = 0;
00255 db_row_t *row;
00256 db_val_t *row_vals;
00257 db_res_t *result = NULL;
00258 int ext_prot_col, ext_user_col;
00259
00260 str q_sip_user = {"sip_user", 8};
00261 query_cols[n_query_cols] = &q_sip_user;
00262 query_ops[n_query_cols] = OP_EQ;
00263 query_vals[n_query_cols].type = DB_STRING;
00264 query_vals[n_query_cols].nul = 0;
00265 query_vals[n_query_cols].val.string_val = sip_user;
00266 n_query_cols++;
00267
00268 str r_ext_prot = {"ext_prot", 8};
00269 str r_ext_user = {"ext_user", 8};
00270 result_cols[ext_prot_col=n_result_cols++] = &r_ext_prot;
00271 result_cols[ext_user_col=n_result_cols++] = &r_ext_user;
00272
00273 db_con_t *pa_db;
00274 pa_db = pa_dbf.init(&db_url);
00275 if (!pa_db) {
00276 LM_ERR("error connecting database\n");
00277 return NULL;
00278 }
00279
00280 if (pa_dbf.use_table(pa_db, &db_table) < 0) {
00281 LM_ERR("error in use_table\n");
00282 return NULL;
00283 }
00284
00285 if (pa_dbf.query(pa_db, query_cols, query_ops, query_vals, result_cols, n_query_cols, n_result_cols, 0, &result) < 0) {
00286 LM_ERR("in sql query\n");
00287 pa_dbf.close(pa_db);
00288 return NULL;
00289 }
00290
00291 if (result == NULL)
00292 return NULL;
00293 if (result->n <= 0)
00294 return NULL;
00295
00296 users = (extern_user_t*) pkg_malloc(sizeof(extern_user_t)*result->n);
00297
00298 int i;
00299 char *val;
00300 for (i = 0; i < result->n; i++) {
00301 row = &result->rows[i];
00302 row_vals = ROW_VALUES(row);
00303
00304 val = (char*) row_vals[ext_user_col].val.string_val;
00305 users[i].username = (char*) pkg_malloc(sizeof(char)*(strlen(val)+1));
00306 strcpy(users[i].username, val);
00307
00308 val = (char*) row_vals[ext_prot_col].val.string_val;
00309 users[i].protocol = (char*) pkg_malloc(sizeof(char)*(strlen(val)+1));
00310 strcpy(users[i].protocol, val);
00311
00312 }
00313
00314 *count = result->n;
00315
00316 pa_dbf.free_result(pa_db, result);
00317 pa_dbf.close(pa_db);
00318
00319 return users;
00320 }
00321
00322