defmodule Fsdb do @moduledoc """ API module. ```elixir #run with: mix sample #drop to start over :ok = Fsdb.drop("table1") #creates table at dev default _build/dev/.fsdb #configure path with: config :fsdb, path: :ok = Fsdb.create("table1") #insert generates and returns an autoincrementing id {:ok, 1} = Fsdb.insert("table1", "row1") {:ok, "row1"} = Fsdb.fetch("table1", 1) #operation on unexisting ids return not found :nf = Fsdb.delete("table1", 5) :nf = Fsdb.update("table1", 5, "row5+") #save overrides and updates id generator :ok = Fsdb.save("table1", 5, "row5") :ok = Fsdb.save("table1", 3, "row3") #continue +1 of largest id used/generated before {:ok, 6} = Fsdb.insert("table1", "row6") #operations that get back previous value {:ok, "row5"} = Fsdb.update("table1", 5, "row5+") {:ok, "row5+"} = Fsdb.save("table1", 5, "row5++") {:ok, "row5++"} = Fsdb.delete("table1", 5) #tuples may not be id ordered [{1, "row1"}, {3, "row3"}, {6, "row6"}] = Fsdb.list("table1") ``` """ ########################################## # App API ########################################## @doc """ Starts the GenServer. `state` *must* contain a valid path in the `:path` key. `opts` is optional and is passed verbatim to GenServer. Returns `{:ok, pid}`. ## Example ``` Fsdb.Server.start_link([path: ".fsdb"], [name: Fsdb.Server]) ``` """ def start_link(state, opts \\ []) do Fsdb.Server.start_link(state, opts) end @doc """ Stops the server. Returns `:ok`. """ def stop(pid) do Fsdb.Server.stop(pid) end @doc """ Creates a table with name `table`. Returns `:ok`. """ def create(table) do GenServer.call(Fsdb.Server, {:create, table}) end @doc """ Same as above but addresses an specific Fsdb.Server. `pid` can be either a pid or a registered name. """ def create(pid, table) do GenServer.call(pid, {:create, table}) end @doc """ Drops the table named `table`. Returns `:ok`. """ def drop(table) do GenServer.call(Fsdb.Server, {:drop, table}) end @doc """ Same as above but addresses an specific Fsdb.Server. `pid` can be either a pid or a registered name. """ def drop(pid, table) do GenServer.call(pid, {:drop, table}) end @doc """ Returns all rows in table `table`. Returns `[{id, row}, ...]`. """ def list(table) do GenServer.call(Fsdb.Server, {:list, table}) end @doc """ Same as above but addresses an specific Fsdb.Server. `pid` can be either a pid or a registered name. """ def list(pid, table) do GenServer.call(pid, {:list, table}) end @doc """ Inserts row `row` in table `table` with auto generated id. Returns `{:ok, id}`. """ def insert(table, row) do GenServer.call(Fsdb.Server, {:insert, table, row}) end @doc """ Same as above but addresses an specific Fsdb.Server. `pid` can be either a pid or a registered name. """ def insert(pid, table, row) do GenServer.call(pid, {:insert, table, row}) end @doc """ Inserts or updates row `row` in table `table` with specific id `id`. If the provided id is greater than the last autogenerated id then the autogenerated id is updated to the provided one. Returns `:ok | {:ok, previous_row}`. """ def save(table, id, row) when is_integer(id) do GenServer.call(Fsdb.Server, {:save, table, id, row}) end @doc """ Same as above but addresses an specific Fsdb.Server. `pid` can be either a pid or a registered name. """ def save(pid, table, id, row) when is_integer(id) do GenServer.call(pid, {:save, table, id, row}) end @doc """ Fetches the row in table `table` having the id `id`. Returns `{:ok, row} | :nf`. """ def fetch(table, id) do GenServer.call(Fsdb.Server, {:fetch, table, id}) end @doc """ Same as above but addresses an specific Fsdb.Server. `pid` can be either a pid or a registered name. """ def fetch(pid, table, id) do GenServer.call(pid, {:fetch, table, id}) end @doc """ Updates the row in table `table` having the id `id`. Returns `{:ok, previous_row} | :nf`. """ def update(table, id, row) do GenServer.call(Fsdb.Server, {:update, table, id, row}) end @doc """ Same as above but addresses an specific Fsdb.Server. `pid` can be either a pid or a registered name. """ def update(pid, table, id, row) do GenServer.call(pid, {:update, table, id, row}) end @doc """ Deletes the row in table `table` having the id `id`. Returns `{:ok, previous_row} | :nf`. """ def delete(table, id) do GenServer.call(Fsdb.Server, {:delete, table, id}) end @doc """ Same as above but addresses an specific Fsdb.Server. `pid` can be either a pid or a registered name. """ def delete(pid, table, id) do GenServer.call(pid, {:delete, table, id}) end end