ucontact.c
来自「性能优秀的SIP Proxy」· C语言 代码 · 共 707 行 · 第 1/2 页
C
707 行
/* 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* dom; db_key_t keys[14]; db_val_t vals[14]; 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] = path_col.s; keys[10] = sock_col.s; keys[11] = methods_col.s; keys[12] = last_mod_col.s; keys[13] = 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; } vals[9].type = DB_STR; if (_c->path.s == 0) { vals[9].nul = 1; } else { vals[9].nul = 0; vals[9].val.str_val.s = _c->path.s; vals[9].val.str_val.len = _c->path.len; } vals[10].type = DB_STR; if (_c->sock) { vals[10].val.str_val = _c->sock->sock_str; vals[10].nul = 0; } else { vals[10].nul = 1; } vals[11].type = DB_BITMAP; if (_c->methods == 0xFFFFFFFF) { vals[11].nul = 1; } else { vals[11].val.bitmap_val = _c->methods; vals[11].nul = 0; } vals[12].type = DB_DATETIME; vals[12].nul = 0; vals[12].val.time_val = _c->last_modified; if (use_domain) { dom = q_memchr(_c->aor->s, '@', _c->aor->len); vals[0].val.str_val.len = dom - _c->aor->s; vals[13].type = DB_STR; vals[13].nul = 0; vals[13].val.str_val.s = dom + 1; vals[13].val.str_val.len = _c->aor->s + _c->aor->len - dom - 1; } if (ul_dbf.use_table(ul_dbh, _c->domain->s) < 0) { LOG(L_ERR, "db_insert_ucontact(): Error in use_table\n"); return -1; } if (ul_dbf.insert(ul_dbh, keys, vals, (use_domain) ? (14) : (13)) < 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* dom; db_key_t keys1[3]; db_val_t vals1[3]; db_key_t keys2[11]; db_val_t vals2[11]; 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; keys2[7] = path_col.s; keys2[8] = sock_col.s; keys2[9] = methods_col.s; keys2[10] = last_mod_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; } vals2[7].type = DB_STR; if (_c->path.s == 0) { vals2[7].nul = 1; } else { vals2[7].nul = 0; vals2[7].val.str_val = _c->path; } vals2[8].type = DB_STR; if (_c->sock) { vals2[8].val.str_val = _c->sock->sock_str; vals2[8].nul = 0; } else { vals2[8].nul = 1; } vals2[9].type = DB_BITMAP; if (_c->methods == 0xFFFFFFFF) { vals2[9].nul = 1; } else { vals2[9].val.bitmap_val = _c->methods; vals2[9].nul = 0; } vals2[10].type = DB_DATETIME; vals2[10].nul = 0; vals2[10].val.time_val = _c->last_modified; 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; } if (ul_dbf.use_table(ul_dbh, _c->domain->s) < 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), 11) < 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* 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; } if (ul_dbf.use_table(ul_dbh, _c->domain->s) < 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, ucontact_info_t* _ci){ /* 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, _ci) < 0) { LOG(L_ERR, "ERROR:usrloc:update_ucontact: failed to update memory\n"); return -1; } st_update_ucontact(_c); if (db_mode == WRITE_THROUGH || db_mode==DB_ONLY) { if (db_update_ucontact(_c) < 0) { LOG(L_ERR, "ERROR:usrloc:update_ucontact: failed to update " "database\n"); } } return 0;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?