this repo has no description
2
fork

Configure Feed

Select the types of activity you want to include in your feed.

Remove MemKV flush

garrison be7bfd13 f0674eab

-89
-47
lib/mem_kv.ex
··· 194 194 end 195 195 end 196 196 197 - @doc """ 198 - Deletes and returns all keys/values with a version <= `version`. 199 - 200 - If there were multiple versions of a key below `version`, only 201 - the latest is returned. 202 - 203 - ## Examples 204 - 205 - flush(kv, 3) 206 - %{ 207 - "foo" => "bar", 208 - "hello" => "world", 209 - } 210 - 211 - """ 212 - @spec flush(:ets.table, non_neg_integer) :: [{binary, binary, non_neg_integer}] 213 - def flush(table, version) do 214 - # TODO: since this scans the entire table anyway, it can be rewritten 215 - # to be much faster with matchspecs 216 - do_flush_scan(table, version, {"", -1}, []) 217 - |> Enum.reverse() 218 - end 219 - 220 - defp do_flush_scan(table, version, prev, acc) do 221 - case :ets.next(table, prev) do 222 - {key, ver} = full_key -> 223 - case ver <= version do 224 - true -> 225 - [{^full_key, value}] = :ets.lookup(table, full_key) 226 - true = :ets.delete(table, full_key) 227 - 228 - case acc do 229 - [{^key, _value, _v} | rest] -> 230 - do_flush_scan(table, version, full_key, [{key, value, ver} | rest]) 231 - acc -> 232 - do_flush_scan(table, version, full_key, [{key, value, ver} | acc]) 233 - end 234 - 235 - false -> 236 - do_flush_scan(table, version, full_key, acc) 237 - end 238 - 239 - _ -> 240 - acc 241 - end 242 - end 243 - 244 197 @spec remove_key_at_version(t, non_neg_integer, binary) :: :ok 245 198 def remove_key_at_version(table, version, key) do 246 199 :ets.delete(table, {key, version})
-42
test/mem_kv_test.exs
··· 191 191 end 192 192 end 193 193 194 - describe "flush/2" do 195 - test "flushes old keys", %{kv: kv} do 196 - MemKV.put(kv, 1, "foo", "bar") 197 - MemKV.put(kv, 2, "foo", "bar_2") 198 - MemKV.put(kv, 3, "foo", "bar_3") 199 - 200 - MemKV.put(kv, 2, "foo_b", "bar_b_2") 201 - MemKV.put(kv, 2, "foo_c", "bar_c_2") 202 - MemKV.put(kv, 1, "foo_d", "bar_d") 203 - 204 - assert MemKV.get(kv, 1, 0, "foo") == "bar" 205 - assert MemKV.get(kv, 3, 0, "foo") == "bar_3" 206 - 207 - assert MemKV.flush(kv, 2) == [ 208 - {"foo", "bar_2", 2}, 209 - {"foo_b", "bar_b_2", 2}, 210 - {"foo_c", "bar_c_2", 2}, 211 - {"foo_d", "bar_d", 1}, 212 - ] 213 - 214 - assert MemKV.get(kv, 1, 0, "foo") == nil 215 - assert MemKV.get(kv, 2, 0, "foo") == nil 216 - assert MemKV.get(kv, 3, 0, "foo") == "bar_3" 217 - 218 - assert MemKV.get(kv, 3, 0, "foo_b") == nil 219 - assert MemKV.get(kv, 3, 0, "foo_c") == nil 220 - end 221 - 222 - test "does not flush special keyspace", %{kv: kv} do 223 - MemKV.put(kv, 1, "foo", "bar") 224 - MemKV.put(kv, 1, "\xFF\xFFhello", "world") 225 - 226 - assert MemKV.flush(kv, 1) == [ 227 - {"foo", "bar", 1}, 228 - {"\xFF\xFFhello", "world", 1}, 229 - ] 230 - 231 - assert MemKV.get(kv, 1, 0, "foo") == nil 232 - assert MemKV.get(kv, 1, 0, "\xFF\xFFhello") == nil 233 - end 234 - end 235 - 236 194 describe "nuke_range/3" do 237 195 test "deletes all keys within a range regardless of version", %{kv: kv} do 238 196 Enum.each(String.graphemes("abcdef"), fn c ->