%% @author Administrator%% @doc @todo Add description to users_sup.-module(users_sup).-behavior(supervisor).-compile(export_all).%% ====================================================================%% API functions%% ====================================================================-export([]).start() -> register(users_sup, spawn(?MODULE, start_monitor, [])).%% 创建监控子进程,注册为monitor,并运行 init/1start_monitor() -> io:format("sup started: ~p~n", [self()]), {ok, Pid} = supervisor:start_link({local, monitor}, ?MODULE, []), wait().%% monitor进程运行init/1,启动所有被监控的子进程,并监控这些进程%% 运行 users:start%% 监控规范:被监控进程退出后,重启之,重启次数100,重启间隔10msinit(FileName) -> io:format("enter init, ~s, ~p~n", [FileName, self()]), ChildSpec = {users_s, {users_s, start, []}, permanent, 100000, worker, [users_s]}, {ok, { {one_for_one, 100, 10}, [ChildSpec]}}.%% sup进程等待退出消息%%users_sup进程退出,从而导致monitor及所有monitor的子进程都退出wait() -> receive {quit} -> io:format("recv quit msg~n"); { 'EXIT', Pid, Reason} -> io:format("Child ~p exit~n", [Pid]), wait() end.stop() -> users_sup ! {quit}. %% ====================================================================%% Internal functions%% ====================================================================
%% @author Administrator%% @doc @todo Add description to db_s.-module(users_s).%%-export([start/0,stop/0,write/2,delete/1,read/1,match/1,all/0]).%% ====================================================================%% API functions%% ====================================================================-compile(export_all).-behaviour(gen_server).-include("user.hrl").%% ====================================================================%% External functions%% ====================================================================start() -> start_link().stop() -> gen_server:cast(?MODULE, stop).add(UserID, Username, UserPd) -> gen_server:call(?MODULE, {add,UserID, Username, UserPd}).lookById(UserID) -> gen_server:call(?MODULE, {lookById,UserID}).match(Pattern) -> gen_server:call(?MODULE, {match,Pattern}).delete_tab() -> gen_server:call(?MODULE, delete_tab).all() -> gen_server:call(?MODULE, all).test() -> gen_server:call(?MODULE, test).%% ====================================================================%% Server functions%% ====================================================================start_link() -> gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).init([]) -> users:init(), {ok,[]}.handle_cast(stop,LoopData) -> users:delete(), {stop,normal,LoopData}.handle_call({add,UserID, Username, UserPd},_From,LoopData) -> Reply = users:add_user(UserID, Username, UserPd), {reply,Reply,LoopData};handle_call({lookById,UserID},_From,LoopData) -> Reply=users:look_user_byID(UserID), {reply,Reply,LoopData};handle_call({match,Pattern},_From,LoopData) -> Reply=users:look_user_byMatch(Pattern), {reply,Reply,LoopData};handle_call(delete_tab,_From,LoopData) -> Reply = users:delete_tab(), {reply,Reply,LoopData};handle_call(test,_From,LoopData) -> Reply = users:test(), {reply,Reply,LoopData};handle_call(all,_From,LoopData) -> Reply = users:check_all(), {reply,Reply,LoopData}.terminate(_Reason, _State) -> ok.
%% @author Administrator%% @doc @todo Add description to usr.-module(users).-compile(export_all).-include("user.hrl").-define(TIMEOUT,30000).%% ====================================================================%% API functions%% ====================================================================init() -> ets:new(userTab,[{keypos,#user.id},named_table,public]).add_user(UserID,Username,UserPd) -> ets:insert(userTab,#user{id = UserID,name = Username,pd = UserPd}).look_user_byID(UserID) -> ets:lookup(userTab, UserID).check_all() -> check_first().check_first() -> case ets:first(userTab)of '$end_of_table' -> ok; First -> io:format("~w~n",ets:lookup(userTab, First)), check_next(First) end. check_next(First) -> case ets:next(userTab, First) of '$end_of_table' -> ok; Next -> io:format("~w~n",ets:lookup(userTab, Next)), check_next(Next) end. delete_tab() -> ets:delete(userTab).%% ====================================================================%% name:match_by_object%% input:#user{name="yangxin",_='_'}%% ====================================================================look_user_byMatch(Pattern) -> ets:match_object(userTab, Pattern). test() -> init(), add_user(1,yangxin,123456), add_user(2,yangxin,12345678), %%look_user_byMatch(#user{name = "yangxin",_='_'}), check_all().%% ====================================================================%% Internal functions%% ====================================================================