接着上一篇,这次处理“维护当前可用的主题房间信息”问题。 每次使用startChild启动子进程的时候将当前的房间信息保存到ets表中。更重要的是每次主题房异常退出或重启都要更新对应的信息。
修改room_manager.erl中的内容:
新建一个函数来初始化房间信息表:
initTab()->
ets:new(roominfo,[public,
ordered_set,
named_table,
{keypos,#roominfo.id}
])
.
再添加对房间表数据操作的方法
addRoomInfo(Record)->
#roominfo{name=Name,type=Type}=Record,
case isRoomUniq([],Name,Type)of
{found,_Id}->
{fail,room_exists};
{not_found}->
RoomId=id_generator:getnewid("room"),
ClientTableName=list_to_atom(?PRIFIX++integer_to_list(RoomId)),
Info=Record#roominfo{id=RoomId,tablename=ClientTableName},
ets:insert(roominfo, Info),
{success,Info}
end
.
setRoomAvailble(Id)->
case ets:lookup(roominfo, Id) of
Record->
ets:update_element(roominfo, Id, {#roominfo.status,1}),
ok;
[]->
ok
end
.
setRoomUnavailble(Id)->
case ets:lookup(roominfo, Id) of
Record->
ets:update_element(roominfo, Id, {#roominfo.status,0}),
ok;
[]->
ok
end
.
removeRoom(Id)->
ets:delete(roominfo, Id)
.
为了方便后面的操作,再提供两个方法,一个根据给定的属性获取对应的ID,一个是判断对应ID的房间是否存在:
getRoomProperty(Id,Proper)->
case ets:lookup(roominfo, Id) of
Record->
#roominfo{name=Name,
type=Type,
unum=Unum,
tablename=Tab,
status=Status,
creationDate=Crdate}=Record,
case Proper of
#roominfo.name->
{ok,Name};
#roominfo.type->
{ok,Type};
#roominfo.unum->
{ok,Unum};
#roominfo.tablename->
{ok,Tab};
#roominfo.status->
{ok,Status};
#roominfo.creationDate->
{ok,Crdate};
_Els->
{fail,illegal_property}
end;
_Els->
{fail,not_found}
end
.
isRoomUniq([],Name,Type)->
case ets:all(roominfo) of
[R|L]->
#roominfo{id=Id,name=TheName,type=TheType}=R,
case string:equal("Name",TheName) and string:equal(Type, TheType) of
true->
{found,Id};
false->
isRoomUniq([L],Name,Type)
end;
[]->
{not_found}
end
;
isRoomUniq([L],Name,Type)->
case ets:all(roominfo) of
[R|L]->
#roominfo{id=Id,name=TheName,type=TheType}=R,
case string:equal("Name",TheName) and string:equal(Type, TheType) of
true->
{found,Id};
false->
isRoomUniq([L],Name,Type)
end;
[]->
{not_found}
end
.
再修改chat_room的terminate,从表中删除相应的记录:
terminate(_Reason,State)->
#roominfo{id=Id}=State,
room_manager:removeRoom(Id)
.
再修改房间启动时的初始化方法,房间的ID和名称从外部传入:
init([Para])->
id_generator:start_link(),
#roominfo{id=RoomId,tablename=ClientTableName}=Para,
client_manager:init(ClientTableName),
case is_record(Para,roominfo)of
true->
{ok,#roominfo{unum=0}=Para,tablename=ClientTableName};
Els->
{ok,#roominfo{id=RoomId,unum=0,name="room"++integer_to_list(RoomId),tablename=ClientTableName,type="def"}}
end
.
暂时不对代码进行测试,等后面整体修改完成后再一起测。
分享到:
相关推荐
erlang 聊天室源代码,初学者项目,花了两周时间完成,其中设计参考的是著名聊天软件rabbitMQ 的部分模块
附有需求文档,设计文档,以及一些说明文档,简单的聊天室功能,适合初学者阅读,是本人学习erlang过程中写的,参照了rabbitMQ的核心模块
基于erlang的简易聊天室,主要技术是通过gen_tcp和gen_servere实现的
esl-erlang_16.b.3-2~centos~6_amd64.rpm
erlang -c语言程序接口.pdferlang -c语言程序接erlang -c语言程序接口.pdf口.pdf
erlang-xmerl-23.0.2-2.el7.x86_64.rpm,rabbitMQ安装需要依赖此环境。Erlang 是一种多用途编程语言,主要用于开发并发和分布式系统。它最初是一种专有的编程语言,Ericsson 使用它来开发电话和通信应用程序。
esl-erlang_24.2.1-1_centos_7_amd64.rpm
erlang-crypto-19.3.6.4-1.el7.x86_64.rpm
rpm包; 包含erlang-23.3-rabbitmq-server-3.8
esl-erlang_25.0.3-1_centos_7_amd64.rpm erlang_25.0.3-1 rpm用于rabitmq基础环境安装
erlang-sd_notify-1.0-2.el7.x86_64.rpm
Erlang程序设计(中文版-完整书签)&Erlang编程指南(中英文版)
erlang-xmerl-22.2.3-1.el7.x86_64.rpm 免费下载0积分镜像下载。rabbitMQ安装需要依赖此环境。Erlang 是一种多用途编程语言,主要用于开发并发和分布式系统。它最初是一种专有的编程语言,Ericsson 使用它来开发电话和...
erlang-jinterface-19.3.6.4-1.el7.x86_64.rpm
erlang-xmerl-22.2.5-1.el7.x86_64.rpm 免费下载0积分镜像下载。rabbitMQ安装需要依赖此环境。Erlang 是一种多用途编程语言,主要用于开发并发和分布式系统。它最初是一种专有的编程语言,Ericsson 使用它来开发电话和...
erlang程序设计中文版1-40,因扫描版太大,只能分卷
Erlang程序设计 第2版 Erlang程序设计 第2版Erlang程序设计 第2版
erlang-rpm-macros-0.1.4-1.el7.noarch.rpm
最新最全rabbitmq与erlang版本匹配-2020-04-23(world版)
erlang-24.3.3-1.el9.x86_64.rpm centos