📄 ucontact.c
字号:
int st_expired_ucontact(ucontact_t* _c){ /* There is no need to change contact * state, because the contact will * be deleted anyway */ switch(_c->state) { case CS_NEW: /* Contact is not in the database * yet, remove it from memory only */ return 0; case CS_SYNC: case CS_DIRTY: /* Remove from database here */ return 1; } return 0; /* Makes gcc happy */}/* * Called when the timer is about flushing the contact, * updates contact state and returns 1 if the contact * should be inserted, 2 if update , 3 if delete * from memory, 4 if delete from database and 0 otherwise */int st_flush_ucontact(ucontact_t* _c){ switch(_c->state) { case CS_NEW: /* Contact is new and is not in * the database yet so we have * to insert it */ _c->state = CS_SYNC; return 1; case CS_SYNC: /* Contact is synchronized, do * nothing */ return 0; case CS_DIRTY: /* Contact has been modified and * is in the db already so we * have to update it */ _c->state = CS_SYNC; return 2; } return 0; /* Makes gcc happy */}/* ============== Database related functions ================ *//* * Insert contact into the database */int db_insert_ucontact(ucontact_t* _c){ char b[256]; char* dom; db_key_t keys[10]; db_val_t vals[10]; if (_c->flags & FL_MEM) { return 0; } keys[0] = user_col.s; keys[1] = contact_col.s; keys[2] = expires_col.s; keys[3] = q_col.s; keys[4] = callid_col.s; keys[5] = cseq_col.s; keys[6] = flags_col.s; keys[7] = user_agent_col.s; keys[8] = received_col.s; keys[9] = domain_col.s; vals[0].type = DB_STR; vals[0].nul = 0; vals[0].val.str_val.s = _c->aor->s; vals[0].val.str_val.len = _c->aor->len; vals[1].type = DB_STR; vals[1].nul = 0; vals[1].val.str_val.s = _c->c.s; vals[1].val.str_val.len = _c->c.len; vals[2].type = DB_DATETIME; vals[2].nul = 0; vals[2].val.time_val = _c->expires; vals[3].type = DB_DOUBLE; vals[3].nul = 0; vals[3].val.double_val = q2double(_c->q); vals[4].type = DB_STR; vals[4].nul = 0; vals[4].val.str_val.s = _c->callid.s; vals[4].val.str_val.len = _c->callid.len; vals[5].type = DB_INT; vals[5].nul = 0; vals[5].val.int_val = _c->cseq; vals[6].type = DB_INT; vals[6].nul = 0; vals[6].val.bitmap_val = _c->flags; vals[7].type = DB_STR; vals[7].nul = 0; vals[7].val.str_val.s = _c->user_agent.s; vals[7].val.str_val.len = _c->user_agent.len; vals[8].type = DB_STR; if (_c->received.s == 0) { vals[8].nul = 1; } else { vals[8].nul = 0; vals[8].val.str_val.s = _c->received.s; vals[8].val.str_val.len = _c->received.len; } if (use_domain) { dom = q_memchr(_c->aor->s, '@', _c->aor->len); vals[0].val.str_val.len = dom - _c->aor->s; vals[9].type = DB_STR; vals[9].nul = 0; vals[9].val.str_val.s = dom + 1; vals[9].val.str_val.len = _c->aor->s + _c->aor->len - dom - 1; } /* FIXME */ memcpy(b, _c->domain->s, _c->domain->len); b[_c->domain->len] = '\0'; if (ul_dbf.use_table(ul_dbh, b) < 0) { LOG(L_ERR, "db_insert_ucontact(): Error in use_table\n"); return -1; } if (ul_dbf.insert(ul_dbh, keys, vals, (use_domain) ? 10 : 9) < 0) { LOG(L_ERR, "db_insert_ucontact(): Error while inserting contact\n"); return -1; } return 0;}/* * Update contact in the database */int db_update_ucontact(ucontact_t* _c){ char b[256]; char* dom; db_key_t keys1[3]; db_val_t vals1[3]; db_key_t keys2[7]; db_val_t vals2[7]; if (_c->flags & FL_MEM) { return 0; } keys1[0] = user_col.s; keys1[1] = contact_col.s; keys1[2] = domain_col.s; keys2[0] = expires_col.s; keys2[1] = q_col.s; keys2[2] = callid_col.s; keys2[3] = cseq_col.s; keys2[4] = flags_col.s; keys2[5] = user_agent_col.s; keys2[6] = received_col.s; vals1[0].type = DB_STR; vals1[0].nul = 0; vals1[0].val.str_val = *_c->aor; vals1[1].type = DB_STR; vals1[1].nul = 0; vals1[1].val.str_val = _c->c; vals2[0].type = DB_DATETIME; vals2[0].nul = 0; vals2[0].val.time_val = _c->expires; vals2[1].type = DB_DOUBLE; vals2[1].nul = 0; vals2[1].val.double_val = q2double(_c->q); vals2[2].type = DB_STR; vals2[2].nul = 0; vals2[2].val.str_val = _c->callid; vals2[3].type = DB_INT; vals2[3].nul = 0; vals2[3].val.int_val = _c->cseq; vals2[4].type = DB_INT; vals2[4].nul = 0; vals2[4].val.bitmap_val = _c->flags; vals2[5].type = DB_STR; vals2[5].nul = 0; vals2[5].val.str_val = _c->user_agent; vals2[6].type = DB_STR; if (_c->received.s == 0) { vals2[6].nul = 1; } else { vals2[6].nul = 0; vals2[6].val.str_val = _c->received; } if (use_domain) { dom = q_memchr(_c->aor->s, '@', _c->aor->len); vals1[0].val.str_val.len = dom - _c->aor->s; vals1[2].type = DB_STR; vals1[2].nul = 0; vals1[2].val.str_val.s = dom + 1; vals1[2].val.str_val.len = _c->aor->s + _c->aor->len - dom - 1; } /* FIXME */ memcpy(b, _c->domain->s, _c->domain->len); b[_c->domain->len] = '\0'; if (ul_dbf.use_table(ul_dbh, b) < 0) { LOG(L_ERR, "db_upd_ucontact(): Error in use_table\n"); return -1; } if (ul_dbf.update(ul_dbh, keys1, 0, vals1, keys2, vals2, (use_domain) ? 3 : 2, 7) < 0) { LOG(L_ERR, "db_upd_ucontact(): Error while updating database\n"); return -1; } return 0;}/* * Delete contact from the database */int db_delete_ucontact(ucontact_t* _c){ char b[256]; char* dom; db_key_t keys[3]; db_val_t vals[3]; if (_c->flags & FL_MEM) { return 0; } keys[0] = user_col.s; keys[1] = contact_col.s; keys[2] = domain_col.s; vals[0].type = DB_STR; vals[0].nul = 0; vals[0].val.str_val = *_c->aor; vals[1].type = DB_STR; vals[1].nul = 0; vals[1].val.str_val = _c->c; if (use_domain) { dom = q_memchr(_c->aor->s, '@', _c->aor->len); vals[0].val.str_val.len = dom - _c->aor->s; vals[2].type = DB_STR; vals[2].nul = 0; vals[2].val.str_val.s = dom + 1; vals[2].val.str_val.len = _c->aor->s + _c->aor->len - dom - 1; } /* FIXME */ memcpy(b, _c->domain->s, _c->domain->len); b[_c->domain->len] = '\0'; if (ul_dbf.use_table(ul_dbh, b) < 0) { LOG(L_ERR, "db_del_ucontact: Error in use_table\n"); return -1; } if (ul_dbf.delete(ul_dbh, keys, 0, vals, (use_domain) ? (3) : (2)) < 0) { LOG(L_ERR, "db_del_ucontact(): Error while deleting from database\n"); return -1; } return 0;}/* * Update ucontact with new values */int update_ucontact(ucontact_t* _c, time_t _e, qvalue_t _q, str* _cid, int _cs, unsigned int _set, unsigned int _res, str* _ua, str* _recv){ /* run callbacks for UPDATE event */ if (exists_ulcb_type(UL_CONTACT_UPDATE)) { run_ul_callbacks( UL_CONTACT_UPDATE, _c); } /* we have to update memory in any case, but database directly * only in db_mode 1 */ if (mem_update_ucontact(_c, _e, _q, _cid, _cs, _set, _res, _ua, _recv) < 0) { LOG(L_ERR, "update_ucontact(): Error while updating\n"); return -1; } st_update_ucontact(_c); if (db_mode == WRITE_THROUGH) { if (db_update_ucontact(_c) < 0) { LOG(L_ERR, "update_ucontact(): Error while updating database\n"); } } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -