77#include < algorithm>
88#include < cstddef>
99#include < span>
10+ #include < string_view>
1011#include < utility>
1112
1213#include " runtime-common/core/allocator/script-allocator.h"
@@ -75,19 +76,21 @@ kphp::coro::task<mixed> f$confdata_get_value(string key) noexcept {
7576 }
7677
7778 auto value{extract_confdata_value (*maybe_confdata_value.opt_value )}; // the key exists
78- confdata_key_cache.emplace (key, value);
79+ confdata_key_cache.emplace (std::move ( key) , value);
7980 co_return std::move (value);
8081}
8182
8283kphp::coro::task<array<mixed>> f$confdata_get_values_by_any_wildcard(string wildcard) noexcept {
83- static constexpr size_t CONFDATA_GET_WILDCARD_STREAM_CAPACITY = 1 << 20 ;
84+ static constexpr size_t CONFDATA_GET_WILDCARD_INIT_BUFFER_CAPACITY = 1 << 20 ;
8485
8586 auto & confdata_wildcard_cache{ConfdataInstanceState::get ().wildcard_cache ()};
8687 if (auto it{confdata_wildcard_cache.find (wildcard)}; it != confdata_wildcard_cache.end ()) {
8788 co_return it->second ;
8889 }
8990
90- tl::ConfdataGetWildcard confdata_get_wildcard{.wildcard = {.value = {wildcard.c_str (), wildcard.size ()}}};
91+ const std::string_view wildcard_view{wildcard.c_str (), wildcard.size ()};
92+
93+ const tl::ConfdataGetWildcard confdata_get_wildcard{.wildcard = {.value = wildcard_view}};
9194 tl::storer tls{confdata_get_wildcard.footprint ()};
9295 confdata_get_wildcard.store (tls);
9396
@@ -98,7 +101,7 @@ kphp::coro::task<array<mixed>> f$confdata_get_values_by_any_wildcard(string wild
98101
99102 auto stream{*std::move (expected_stream)};
100103 kphp::stl::vector<std::byte, kphp::memory::script_allocator> response{};
101- response.reserve (CONFDATA_GET_WILDCARD_STREAM_CAPACITY );
104+ response.reserve (CONFDATA_GET_WILDCARD_INIT_BUFFER_CAPACITY );
102105 if (!co_await kphp::forks::id_managed (kphp::component::query (stream, tls.view (), kphp::component::read_ext::append (response)))) [[unlikely]] {
103106 co_return array<mixed>{};
104107 }
@@ -108,10 +111,13 @@ kphp::coro::task<array<mixed>> f$confdata_get_values_by_any_wildcard(string wild
108111 kphp::log::assertion (dict_confdata_value.fetch (tlf));
109112
110113 array<mixed> result{array_size{static_cast <int64_t >(dict_confdata_value.size ()), false }};
111- std::for_each (dict_confdata_value.begin (), dict_confdata_value.end (), [&result](const auto & dict_field) noexcept {
112- result.set_value (string{dict_field.key .value .data (), static_cast <string::size_type>(dict_field.key .value .size ())},
113- extract_confdata_value (dict_field.value ));
114- });
115- confdata_wildcard_cache.emplace (wildcard, result);
114+ std::for_each (dict_confdata_value.begin (), dict_confdata_value.end (),
115+ [&result, &wildcard_view](const tl::dictionaryField<tl::confdataValue>& dict_field) noexcept {
116+ kphp::log::assertion (dict_field.key .value .starts_with (wildcard_view));
117+ const std::string_view key_without_wildcard_prefix{dict_field.key .value .substr (wildcard_view.size ())};
118+ result.set_value (string{key_without_wildcard_prefix.data (), static_cast <string::size_type>(key_without_wildcard_prefix.size ())},
119+ extract_confdata_value (dict_field.value ));
120+ });
121+ confdata_wildcard_cache.emplace (std::move (wildcard), result);
116122 co_return std::move (result);
117123}
0 commit comments