]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
loader.c: Speed up deprecation metadata lookup
authorSean Bright <sean.bright@gmail.com>
Thu, 1 Apr 2021 15:38:04 +0000 (11:38 -0400)
committerJoshua Colp <jcolp@sangoma.com>
Fri, 2 Apr 2021 17:58:07 +0000 (12:58 -0500)
Only use an XPath query once per module, then just navigate the DOM for
everything else.

Change-Id: Ia0336a7185f9180ccba4b6f631a00f9a22a36e92

main/loader.c

index f06016c9fa94fe628d65996c67546b3e8cf8e338..aafcd3ba1f4fcfe198699bcda417aafafae2c555 100644 (file)
@@ -2422,33 +2422,38 @@ done:
                        continue;
                }
 
-               results = ast_xmldoc_query("/docs/module[@name='%s']/deprecated_in", mod_name);
-               deprecated_in[0] = '\0';
+               /* Clear out the previous values */
+               deprecated_in[0] = removed_in[0] = replacement[0] = 0;
+
+               results = ast_xmldoc_query("/docs/module[@name='%s']", mod_name);
                if (results) {
-                       const char *result_tmp = ast_xml_get_text(ast_xml_xpath_get_first_result(results));
-                       if (!ast_strlen_zero(result_tmp)) {
-                               ast_copy_string(deprecated_in, result_tmp, sizeof(deprecated_in));
+                       struct ast_xml_node *deprecated_node, *removed_node, *replacement_node;
+                       struct ast_xml_node *metadata_nodes = ast_xml_node_get_children(ast_xml_xpath_get_first_result(results));
+
+                       deprecated_node = ast_xml_find_element(metadata_nodes, "deprecated_in", NULL, NULL);
+                       if (deprecated_node) {
+                               const char *result_tmp = ast_xml_get_text(deprecated_node);
+                               if (!ast_strlen_zero(result_tmp)) {
+                                       ast_copy_string(deprecated_in, result_tmp, sizeof(deprecated_in));
+                               }
                        }
-                       ast_xml_xpath_results_free(results);
-               }
 
-               results = ast_xmldoc_query("/docs/module[@name='%s']/removed_in", mod_name);
-               removed_in[0] = '\0';
-               if (results) {
-                       const char *result_tmp = ast_xml_get_text(ast_xml_xpath_get_first_result(results));
-                       if (!ast_strlen_zero(result_tmp)) {
-                               ast_copy_string(removed_in, result_tmp, sizeof(removed_in));
+                       removed_node = ast_xml_find_element(metadata_nodes, "removed_in", NULL, NULL);
+                       if (removed_node) {
+                               const char *result_tmp = ast_xml_get_text(removed_node);
+                               if (!ast_strlen_zero(result_tmp)) {
+                                       ast_copy_string(removed_in, result_tmp, sizeof(removed_in));
+                               }
                        }
-                       ast_xml_xpath_results_free(results);
-               }
 
-               results = ast_xmldoc_query("/docs/module[@name='%s']/replacement", mod_name);
-               replacement[0] = '\0';
-               if (results) {
-                       const char *result_tmp = ast_xml_get_text(ast_xml_xpath_get_first_result(results));
-                       if (!ast_strlen_zero(result_tmp)) {
-                               ast_copy_string(replacement, result_tmp, sizeof(replacement));
+                       replacement_node = ast_xml_find_element(metadata_nodes, "replacement", NULL, NULL);
+                       if (replacement_node) {
+                               const char *result_tmp = ast_xml_get_text(replacement_node);
+                               if (!ast_strlen_zero(result_tmp)) {
+                                       ast_copy_string(replacement, result_tmp, sizeof(replacement));
+                               }
                        }
+
                        ast_xml_xpath_results_free(results);
                }