int acc_db_request( struct sip_msg *rq) { int m; int n; int i; struct tm *t; /* formated database columns */ m = core2strar( rq, val_arr, int_arr, type_arr ); for(i=0; i<m; i++) VAL_STR(db_vals+i) = val_arr[i]; /* time value */ VAL_TIME(db_vals+(m++)) = acc_env.ts; /* extra time value */ if(acc_time_mode==1) { VAL_INT(db_vals+(m++)) = (int)acc_env.tv.tv_sec; i++; VAL_INT(db_vals+(m++)) = (int)acc_env.tv.tv_usec; i++; } else if(acc_time_mode==2) { VAL_DOUBLE(db_vals+(m++)) = ((double)(acc_env.tv.tv_sec * 1000) + (acc_env.tv.tv_usec / 1000)) / 1000; i++; } else if(acc_time_mode==3 || acc_time_mode==4) { if(acc_time_mode==3) { t = localtime(&acc_env.ts); } else { t = gmtime(&acc_env.ts); } if(strftime(acc_time_format_buf, ACC_TIME_FORMAT_SIZE, acc_time_format, t)<=0) { acc_time_format_buf[0] = '\0'; } VAL_STRING(db_vals+(m++)) = acc_time_format_buf; i++; } /* extra columns */ m += extra2strar( db_extra, rq, val_arr+m, int_arr+m, type_arr+m); for( i++ ; i<m; i++) VAL_STR(db_vals+i) = val_arr[i]; if (acc_dbf.use_table(db_handle, &acc_env.text/*table*/) < 0) { LM_ERR("error in use_table\n"); return -1; } /* multi-leg columns */ if ( !leg_info ) { if(acc_db_insert_mode==1 && acc_dbf.insert_delayed!=NULL) { if (acc_dbf.insert_delayed(db_handle, db_keys, db_vals, m) < 0) { LM_ERR("failed to insert delayed into database\n"); return -1; } } else if(acc_db_insert_mode==2 && acc_dbf.insert_async!=NULL) { if (acc_dbf.insert_async(db_handle, db_keys, db_vals, m) < 0) { LM_ERR("failed to insert async into database\n"); return -1; } } else { if (acc_dbf.insert(db_handle, db_keys, db_vals, m) < 0) { LM_ERR("failed to insert into database\n"); return -1; } } } else { n = legs2strar(leg_info,rq,val_arr+m,int_arr+m,type_arr+m,1); do { for (i=m; i<m+n; i++) VAL_STR(db_vals+i)=val_arr[i]; if(acc_db_insert_mode==1 && acc_dbf.insert_delayed!=NULL) { if(acc_dbf.insert_delayed(db_handle,db_keys,db_vals,m+n)<0) { LM_ERR("failed to insert delayed into database\n"); return -1; } } else if(acc_db_insert_mode==2 && acc_dbf.insert_async!=NULL) { if(acc_dbf.insert_async(db_handle,db_keys,db_vals,m+n)<0) { LM_ERR("failed to insert async into database\n"); return -1; } } else { if (acc_dbf.insert(db_handle, db_keys, db_vals, m+n) < 0) { LM_ERR("failed to insert into database\n"); return -1; } } }while ( (n=legs2strar(leg_info,rq,val_arr+m,int_arr+m, type_arr+m,0))!=0 ); } return 1; }
static int sip_trace_store_db(struct _siptrace_data *sto) { if(db_con==NULL) { LM_DBG("database connection not initialized\n"); return -1; } if(trace_to_database_flag==NULL || *trace_to_database_flag==0) goto done; db_key_t db_keys[NR_KEYS]; db_val_t db_vals[NR_KEYS]; db_keys[0] = &msg_column; db_vals[0].type = DB1_BLOB; db_vals[0].nul = 0; db_vals[0].val.blob_val = sto->body; db_keys[1] = &callid_column; db_vals[1].type = DB1_STR; db_vals[1].nul = 0; db_vals[1].val.str_val = sto->callid; db_keys[2] = &method_column; db_vals[2].type = DB1_STR; db_vals[2].nul = 0; db_vals[2].val.str_val = sto->method; db_keys[3] = &status_column; db_vals[3].type = DB1_STR; db_vals[3].nul = 0; db_vals[3].val.str_val = sto->status; db_keys[4] = &fromip_column; db_vals[4].type = DB1_STR; db_vals[4].nul = 0; db_vals[4].val.str_val = sto->fromip; db_keys[5] = &toip_column; db_vals[5].type = DB1_STR; db_vals[5].nul = 0; db_vals[5].val.str_val = sto->toip; db_keys[6] = &date_column; db_vals[6].type = DB1_DATETIME; db_vals[6].nul = 0; db_vals[6].val.time_val = sto->tv.tv_sec; db_keys[7] = &direction_column; db_vals[7].type = DB1_STRING; db_vals[7].nul = 0; db_vals[7].val.string_val = sto->dir; db_keys[8] = &fromtag_column; db_vals[8].type = DB1_STR; db_vals[8].nul = 0; db_vals[8].val.str_val = sto->fromtag; db_keys[9] = &traced_user_column; db_vals[9].type = DB1_STR; db_vals[9].nul = 0; db_keys[10] = &time_us_column; db_vals[10].type = DB1_INT; db_vals[10].nul = 0; db_vals[10].val.int_val = sto->tv.tv_usec; db_keys[11] = &totag_column; db_vals[11].type = DB1_STR; db_vals[11].nul = 0; db_vals[11].val.str_val = sto->totag; db_funcs.use_table(db_con, siptrace_get_table()); if(trace_on_flag!=NULL && *trace_on_flag!=0) { db_vals[9].val.str_val.s = ""; db_vals[9].val.str_val.len = 0; LM_DBG("storing info...\n"); if(trace_delayed!=0 && db_funcs.insert_delayed!=NULL) { if(db_funcs.insert_delayed(db_con, db_keys, db_vals, NR_KEYS)<0) { LM_ERR("error storing trace\n"); goto error; } } else { if(db_funcs.insert(db_con, db_keys, db_vals, NR_KEYS) < 0) { LM_ERR("error storing trace\n"); goto error; } } #ifdef STATISTICS update_stat(sto->stat, 1); #endif } if(sto->avp==NULL) goto done; db_vals[9].val.str_val = sto->avp_value.s; LM_DBG("storing info...\n"); if(trace_delayed!=0 && db_funcs.insert_delayed!=NULL) { if(db_funcs.insert_delayed(db_con, db_keys, db_vals, NR_KEYS) < 0) { LM_ERR("error storing trace\n"); goto error; } } else { if(db_funcs.insert(db_con, db_keys, db_vals, NR_KEYS) < 0) { LM_ERR("error storing trace\n"); goto error; } } sto->avp = search_next_avp(&sto->state, &sto->avp_value); while(sto->avp!=NULL) { db_vals[9].val.str_val = sto->avp_value.s; LM_DBG("storing info...\n"); if(trace_delayed!=0 && db_funcs.insert_delayed!=NULL) { if(db_funcs.insert_delayed(db_con, db_keys, db_vals, NR_KEYS) < 0) { LM_ERR("error storing trace\n"); goto error; } } else { if(db_funcs.insert(db_con, db_keys, db_vals, NR_KEYS) < 0) { LM_ERR("error storing trace\n"); goto error; } } sto->avp = search_next_avp(&sto->state, &sto->avp_value); } done: return 1; error: return -1; }