1818#include " runtime-light/k2-platform/k2-api.h"
1919#include " runtime-light/stdlib/component/component-api.h"
2020#include " runtime-light/stdlib/confdata/confdata-constants.h"
21+ #include " runtime-light/stdlib/confdata/confdata-state.h"
2122#include " runtime-light/stdlib/diagnostics/logs.h"
2223#include " runtime-light/stdlib/fork/fork-functions.h"
2324#include " runtime-light/streams/read-ext.h"
@@ -45,6 +46,11 @@ mixed extract_confdata_value(const tl::confdataValue& confdata_value) noexcept {
4546} // namespace
4647
4748kphp::coro::task<mixed> f$confdata_get_value(const string& key) noexcept {
49+ auto & confdata_key_cache{ConfdataInstanceState::get ().key_cache ()};
50+ if (auto it{confdata_key_cache.find (key)}; it != confdata_key_cache.end ()) {
51+ co_return it->second ;
52+ }
53+
4854 tl::ConfdataGet confdata_get{.key = {.value = {key.c_str (), key.size ()}}};
4955 tl::storer tls{confdata_get.footprint ()};
5056 confdata_get.store (tls);
@@ -67,12 +73,20 @@ kphp::coro::task<mixed> f$confdata_get_value(const string& key) noexcept {
6773 if (!maybe_confdata_value.opt_value ) { // no such key
6874 co_return mixed{};
6975 }
70- co_return extract_confdata_value (*maybe_confdata_value.opt_value ); // the key exists
76+
77+ auto value{extract_confdata_value (*maybe_confdata_value.opt_value )}; // the key exists
78+ confdata_key_cache.emplace (key, value);
79+ co_return std::move (value);
7180}
7281
7382kphp::coro::task<array<mixed>> f$confdata_get_values_by_any_wildcard(const string& wildcard) noexcept {
7483 static constexpr size_t CONFDATA_GET_WILDCARD_STREAM_CAPACITY = 1 << 20 ;
7584
85+ auto & confdata_wildcard_cache{ConfdataInstanceState::get ().wildcard_cache ()};
86+ if (auto it{confdata_wildcard_cache.find (wildcard)}; it != confdata_wildcard_cache.end ()) {
87+ co_return it->second ;
88+ }
89+
7690 tl::ConfdataGetWildcard confdata_get_wildcard{.wildcard = {.value = {wildcard.c_str (), wildcard.size ()}}};
7791 tl::storer tls{confdata_get_wildcard.footprint ()};
7892 confdata_get_wildcard.store (tls);
@@ -98,5 +112,6 @@ kphp::coro::task<array<mixed>> f$confdata_get_values_by_any_wildcard(const strin
98112 result.set_value (string{dict_field.key .value .data (), static_cast <string::size_type>(dict_field.key .value .size ())},
99113 extract_confdata_value (dict_field.value ));
100114 });
115+ confdata_wildcard_cache.emplace (wildcard, result);
101116 co_return std::move (result);
102117}
0 commit comments