Как сохранить карту с помощью :dets в Эликсире?

Я хочу иметь возможность хранить карту с помощью :dets

В настоящее время это решение, которое я пытаюсь реализовать:

      # a list of strings
topics = GenServer.call(MessageBroker.TopicsProvider, {:get_topics})

# a map with each element of the list as key and an empty list as value
topics_map =
  topics
  |> Enum.chunk_every(1)
  |> Map.new(fn [k] -> {k, []} end)

{:ok, table} = :dets.open_file(:messages, type: :set)

# trying to store the map
:dets.insert(table, [topics_map])

:dets.close(table)

Однако я получаю

      ** (EXIT) an exception was raised:
    ** (ArgumentError) argument error
        (stdlib 3.12) dets.erl:1259: :dets.insert(:messages, [%{"tweet" => [], "user" => []}])

Как это возможно сделать?

2 ответа

Решение Chen Yu хорошее, но до его получения я уже нашел другое решение. По сути, вы можете просто добавить карту в кортеж

      :dets.insert(table, {:map, topics_map})

Затем вы можете получить эту карту, используя

      :dets.lookup(table, :map)

Я тестировал erlang. Сначала вы должны преобразовать карту в список.

Следуя из документа dets:insert_new()

      insert_new(Name, Objects) -> boolean() | {error, Reason}
Types
Name = tab_name()
Objects = object() | [object()] 
Reason = term()
Inserts one or more objects into table Name. If there already exists some object with a key matching the key of any of the specified objects, the table is not updated and false is returned. Otherwise the objects are inserted and true returned.

тестовый код

      dets:open_file(dets_a,[{file,"/tmp/aab"}]).
Map = #{a => 2, b => 3, c=> 4, "a" => 1, "b" => 2, "c" => 4}.
List_a = maps:to_list(Map). %% <----- this line
dets:insert(dets_a,List_a).
Другие вопросы по тегам