]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
res_pjsip: Use sorcery prefix operation for contact lookup
authorSean Bright <sean.bright@gmail.com>
Thu, 16 Nov 2017 21:00:20 +0000 (16:00 -0500)
committerSean Bright <sean.bright@gmail.com>
Thu, 16 Nov 2017 21:48:29 +0000 (16:48 -0500)
This improves performance for registrations assuming that
res_config_astdb is not in use.

Change-Id: I86f37aa9ef07a4fe63448cb881bbadd996834bb1

res/res_pjsip/location.c

index 8ba409e2e08d27316b07435caf56e716270f3679..2bd40e84f98f310a4c7e896691c45f4ac94666df 100644 (file)
@@ -71,16 +71,17 @@ static void aor_deleted_observer(const void *object)
 {
        const struct ast_sip_aor *aor = 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 */
-       char regex[strlen(aor_id) + 4];
+       /* Give enough space for ;@ at the end, since that is our object naming scheme */
+       size_t prefix_len = strlen(aor_id) + sizeof(";@") - 1;
+       char prefix[prefix_len + 1];
        struct ao2_container *contacts;
 
        if (aor->permanent_contacts) {
                ao2_callback(aor->permanent_contacts, OBJ_NODATA | OBJ_MULTIPLE | OBJ_UNLINK, destroy_contact, NULL);
        }
 
-       snprintf(regex, sizeof(regex), "^%s;@", aor_id);
-       if (!(contacts = ast_sorcery_retrieve_by_regex(ast_sip_get_sorcery(), "contact", regex))) {
+       sprintf(prefix, "%s;@", aor_id); /* Safe */
+       if (!(contacts = ast_sorcery_retrieve_by_prefix(ast_sip_get_sorcery(), "contact", prefix, prefix_len))) {
                return;
        }
        /* Destroy any contacts that may still exist that were made for this AoR */
@@ -217,13 +218,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,
        unsigned int flags)
 {
-       /* Give enough space for ^ at the beginning and ;@ at the end, since that is our object naming scheme */
-       char regex[strlen(ast_sorcery_object_get_id(aor)) + 4];
+       /* Give enough space for ;@ at the end, since that is our object naming scheme */
+       size_t prefix_len = strlen(ast_sorcery_object_get_id(aor)) + sizeof(";@") - 1;
+       char prefix[prefix_len + 1];
        struct ao2_container *contacts;
 
-       snprintf(regex, sizeof(regex), "^%s;@", ast_sorcery_object_get_id(aor));
-
-       if (!(contacts = ast_sorcery_retrieve_by_regex(ast_sip_get_sorcery(), "contact", regex))) {
+       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))) {
                return NULL;
        }