| 101 | } |
| 102 | |
| 103 | void GlobalConfig::insert(KeyRef key, ValueRef value) { |
| 104 | // TraceEvent(SevInfo, "GlobalConfigInsert").detail("Key", key).detail("Value", value); |
| 105 | data.erase(key); |
| 106 | |
| 107 | Arena arena(key.expectedSize() + value.expectedSize()); |
| 108 | KeyRef stableKey = KeyRef(arena, key); |
| 109 | try { |
| 110 | std::any any; |
| 111 | Tuple t = Tuple::unpack(value); |
| 112 | if (t.getType(0) == Tuple::ElementType::UTF8) { |
| 113 | any = StringRef(arena, t.getString(0).contents()); |
| 114 | } else if (t.getType(0) == Tuple::ElementType::INT) { |
| 115 | any = t.getInt(0); |
| 116 | } else if (t.getType(0) == Tuple::ElementType::BOOL) { |
| 117 | any = t.getBool(0); |
| 118 | } else if (t.getType(0) == Tuple::ElementType::FLOAT) { |
| 119 | any = t.getFloat(0); |
| 120 | } else if (t.getType(0) == Tuple::ElementType::DOUBLE) { |
| 121 | any = t.getDouble(0); |
| 122 | } else if (t.getType(0) == Tuple::ElementType::VERSIONSTAMP) { |
| 123 | any = t.getVersionstamp(0); |
| 124 | } else { |
| 125 | ASSERT(false); |
| 126 | } |
| 127 | data[stableKey] = makeReference<ConfigValue>(std::move(arena), std::move(any)); |
| 128 | |
| 129 | if (callbacks.find(stableKey) != callbacks.end()) { |
| 130 | callbacks[stableKey](data[stableKey]->value); |
| 131 | } |
| 132 | } catch (Error& e) { |
| 133 | TraceEvent(SevWarn, "GlobalConfigTupleParseError").detail("What", e.what()); |
| 134 | } |
| 135 | } |
| 136 | |
| 137 | void GlobalConfig::erase(Key key) { |
| 138 | erase(KeyRangeRef(key, keyAfter(key))); |