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 + -
显示快捷键?