res_pjsip: Use sorcery prefix operation for contact lookup
This improves performance for registrations assuming that res_config_astdb is not in use. Change-Id: I86f37aa9ef07a4fe63448cb881bbadd996834bb1
This commit is contained in:
parent
ccbf176c30
commit
6c53fb5d21
1 changed files with 10 additions and 9 deletions
|
@ -82,16 +82,17 @@ static void aor_deleted_observer(const void *object)
|
||||||
{
|
{
|
||||||
const struct ast_sip_aor *aor = object;
|
const struct ast_sip_aor *aor = object;
|
||||||
const char *aor_id = ast_sorcery_object_get_id(object);
|
const char *aor_id = ast_sorcery_object_get_id(object);
|
||||||
/* Give enough space for ^ at the beginning and ;@ at the end, since that is our object naming scheme */
|
/* Give enough space for ;@ at the end, since that is our object naming scheme */
|
||||||
char regex[strlen(aor_id) + 4];
|
size_t prefix_len = strlen(aor_id) + sizeof(";@") - 1;
|
||||||
|
char prefix[prefix_len + 1];
|
||||||
struct ao2_container *contacts;
|
struct ao2_container *contacts;
|
||||||
|
|
||||||
if (aor->permanent_contacts) {
|
if (aor->permanent_contacts) {
|
||||||
ao2_callback(aor->permanent_contacts, OBJ_NODATA | OBJ_MULTIPLE | OBJ_UNLINK, destroy_contact, NULL);
|
ao2_callback(aor->permanent_contacts, OBJ_NODATA | OBJ_MULTIPLE | OBJ_UNLINK, destroy_contact, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
snprintf(regex, sizeof(regex), "^%s;@", aor_id);
|
sprintf(prefix, "%s;@", aor_id); /* Safe */
|
||||||
if (!(contacts = ast_sorcery_retrieve_by_regex(ast_sip_get_sorcery(), "contact", regex))) {
|
if (!(contacts = ast_sorcery_retrieve_by_prefix(ast_sip_get_sorcery(), "contact", prefix, prefix_len))) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
/* Destroy any contacts that may still exist that were made for this AoR */
|
/* Destroy any contacts that may still exist that were made for this AoR */
|
||||||
|
@ -223,13 +224,13 @@ struct ao2_container *ast_sip_location_retrieve_aor_contacts_nolock(const struct
|
||||||
struct ao2_container *ast_sip_location_retrieve_aor_contacts_nolock_filtered(const struct ast_sip_aor *aor,
|
struct ao2_container *ast_sip_location_retrieve_aor_contacts_nolock_filtered(const struct ast_sip_aor *aor,
|
||||||
unsigned int flags)
|
unsigned int flags)
|
||||||
{
|
{
|
||||||
/* Give enough space for ^ at the beginning and ;@ at the end, since that is our object naming scheme */
|
/* Give enough space for ;@ at the end, since that is our object naming scheme */
|
||||||
char regex[strlen(ast_sorcery_object_get_id(aor)) + 4];
|
size_t prefix_len = strlen(ast_sorcery_object_get_id(aor)) + sizeof(";@") - 1;
|
||||||
|
char prefix[prefix_len + 1];
|
||||||
struct ao2_container *contacts;
|
struct ao2_container *contacts;
|
||||||
|
|
||||||
snprintf(regex, sizeof(regex), "^%s;@", ast_sorcery_object_get_id(aor));
|
sprintf(prefix, "%s;@", ast_sorcery_object_get_id(aor)); /* Safe */
|
||||||
|
if (!(contacts = ast_sorcery_retrieve_by_prefix(ast_sip_get_sorcery(), "contact", prefix, prefix_len))) {
|
||||||
if (!(contacts = ast_sorcery_retrieve_by_regex(ast_sip_get_sorcery(), "contact", regex))) {
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue