How to generate id by AUTO_INCREMENT in ETS?

99 Views Asked by At

I tried to write a wrapper for ets with which you can read and write structures in etc, question is: how to make id to be generated automatically

  defmodule StructTable do
     defstruct  id: 0, data: nil

     def create_table do
       :ets.new(__MODULE__, [:orderedset, :named_table, {:keypos, 1}])
     end

     def insert_into_table(%__MODULE__{ id: id, data: data}) do
       if hd(:ets.lookup(__MODULE__, id)) == false do
          :ets.insert(__MODULE__, {id,data})
         else IO.puts("already exists")
       end
     end

     def select_data(iid) do
       hd(:ets.lookup(__MODULE__, iid))
     end

     def select_all do
       :ets.tab2list(__MODULE__)
     end

  end
1

There are 1 best solutions below

0
Sana On BEST ANSWER

I used :ets.last() to get the last key and added one to it; if it was an empty table, it gets an id of 1. Table type is ordered_set, which sorts keys.

defmodule StructTable do
 defstruct id: 0, data: nil

def create_table do
  :ets.new(__MODULE__, [:ordered_set, :public, :named_table])
end

def insert_into_table(%__MODULE__{data: data}) do
  :ets.insert(__MODULE__, {generate_id(), data})
end

def select_all do
  :ets.tab2list(__MODULE__)
end

def generate_id() do
  if :ets.tab2list(__MODULE__) == [] do
    1
  else
    (:ets.last(__MODULE__) ) + 1
  end
end

def select_data(iid) do
  hd(:ets.lookup(__MODULE__, iid))
end
end