erlangerlang-otpgen-serverets

Printing all ets table values


I'm ongoing of learning erlang. The code sniped from Programming Erlang by Joe Armstrong

-module(my_bank).

-behaviour(gen_server).
-export([start/0]).

-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
     terminate/2, code_change/3]).
-compile(nowarn_export_all).
-compile(export_all).
-define(SERVER, ?MODULE). 

start() -> gen_server:start_link({local, ?SERVER}, ?MODULE, [], []).
stop()  -> gen_server:call(?MODULE, stop).

new_account(Who)      -> gen_server:call(?MODULE, {new, Who}).
deposit(Who, Amount)  -> gen_server:call(?MODULE, {add, Who, Amount}).
withdraw(Who, Amount) -> gen_server:call(?MODULE, {remove, Who, Amount}).

init([]) -> {ok, ets:new(?MODULE,[])}.

handle_call({new,Who}, _From, Tab) ->
    Reply = case ets:lookup(Tab, Who) of
        []  -> ets:insert(Tab, {Who,0}), 
               {welcome, Who};
        [_] -> {Who, you_already_are_a_customer}
        end,
    {reply, Reply, Tab};
    
handle_call({add,Who,X}, _From, Tab) ->
    Reply = case ets:lookup(Tab, Who) of
        []  -> not_a_customer;
        [{Who,Balance}] ->
            NewBalance = Balance + X,
            ets:insert(Tab, {Who, NewBalance}),
            {thanks, Who, your_balance_is,  NewBalance} 
        end,
    {reply, Reply, Tab};
    
handle_call({remove,Who, X}, _From, Tab) ->
    Reply = case ets:lookup(Tab, Who) of
        []  -> not_a_customer;
        [{Who,Balance}] when X =< Balance ->
            NewBalance = Balance - X,
            ets:insert(Tab, {Who, NewBalance}),
            {thanks, Who, your_balance_is,  NewBalance};    
        [{Who,Balance}] ->
            {sorry,Who,you_only_have,Balance,in_the_bank}
        end,
    {reply, Reply, Tab};


    
handle_call(stop, _From, Tab) ->
    {stop, normal, stopped, Tab}.
handle_cast(_Msg, State) -> {noreply, State}.
handle_info(_Info, State) -> {noreply, State}.
terminate(_Reason, _State) -> ok.
code_change(_OldVsn, State, _Extra) -> {ok, State}.

Simply, how to add a function to the code above that list all account information that stored in the ets table?

I tried doing something like:

list() -> gen_server:call(?MODULE, list).

and the handle_call as:

handle_call(list, _From, Tab) ->
    io:format("~p~n", [Tab]),
    {reply, ok, Tab};

but it doesn't work. Any help please?


Solution

  • Use the ets:tab2list/1 function, which reads all records from the table and returns them as a list:

        io:format("~p~n", [ets:tab2list(Tab)]),