从Qt客户端向Erlang服务器发起数据库分页查询的请求(3)
2014-07-10 23:11
387 查看
最后,进入最重要的主题,就是实际执行分页查询的模块。
-module(sc_element). -behaviour(gen_server). -export([ start_link/2, create/2, create/1, fetch/1, replace/2, delete/1 ]). -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]). -include_lib("stdlib/include/qlc.hrl"). -define(SERVER, ?MODULE). -define(DEFAULT_LEASE_TIME, 60). -record(state, {value, lease_time, start_time, cursor}). -record(user_data,{acc,icon,sex,calendar,year,month,day,nation,province,city,question1,question2,question3,answer1,answer2,answer3,nickname,signature=1}). -record(available_acc,{acc,is_available}). start_link(Value, LeaseTime) -> gen_server:start_link(?MODULE, [Value, LeaseTime], []). create(Value, LeaseTime) -> sc_element_sup:start_child(Value, LeaseTime). create(Value) -> create(Value, ?DEFAULT_LEASE_TIME). fetch(Pid) -> gen_server:call(Pid, fetch). replace(Pid, Value) -> gen_server:cast(Pid, {replace, Value}). delete(Pid) -> gen_server:cast(Pid, delete). init([Value, LeaseTime]) -> Now = calendar:local_time(), StartTime = calendar:datetime_to_gregorian_seconds(Now), Cursor=make_cursor(), {ok, #state{value = Value, lease_time = LeaseTime, start_time = StartTime, cursor=Cursor}, time_left(StartTime, LeaseTime)}. time_left(_StartTime, infinity) -> infinity; time_left(StartTime, LeaseTime) -> Now = calendar:local_time(), CurrentTime = calendar:datetime_to_gregorian_seconds(Now), TimeElapsed = CurrentTime - StartTime, case LeaseTime - TimeElapsed of Time when Time =< 0 -> 0; Time -> Time * 1000 end. handle_call(fetch, _From, State) -> #state{ lease_time = LeaseTime, start_time = StartTime, cursor = Cursor} = State, TimeLeft = time_left(StartTime, LeaseTime), Value = get_next(Cursor), {reply, {ok, Value}, State, TimeLeft}. handle_cast({replace, Value}, State) -> #state{lease_time = LeaseTime, start_time = StartTime} = State, TimeLeft = time_left(StartTime, LeaseTime), {noreply, State#state{value = Value}, TimeLeft}; handle_cast(delete, State) -> {stop, normal, State}. handle_info(timeout, State) -> {stop, normal, State}. terminate(_Reason, _State) -> sc_store:delete(self()), ok. code_change(_OldVsn, State, _Extra) -> {ok, State}. %%Internal Functions make_cursor()-> Q=qlc:q([X||X<-mnesia:table(available_acc)]), mnesia:activity(async_dirty, fun()->qlc:cursor(Q,[]) end, mnesia_frag). get_next(Cursor)-> Get=fun()-> qlc:next_answers(Cursor,5) end, mnesia:activity(async_dirty,Get,mnesia_frag).
相关文章推荐
- 从Qt客户端向Erlang服务器发起数据库分页查询的请求(2)
- 从Qt客户端向Erlang服务器发起数据库分页查询的请求(1)
- 从Qt客户端向Erlang服务器发起数据库分页查询的请求
- Qt客户端与Erlang服务器通信(2):多个字符串的获取
- 表单POST请求服务器,通过多条件查询获取数据库数据
- Qt客户端与Erlang服务器的通信(3)
- 客户端提交查询请求成功后如何向服务器返回数据
- qt 数据库查询结构的分页显示
- 基于Qt的SocketIO客户端实现 【二】向服务器发送请求
- 分页查询产品信息案例;第一步:创建产品页面,向服务器发送请求(获取所有产品信息)
- 怎么在后台将数据库中数据查询出来并分页显示在客户端?!!!
- Qt客户端和Erlang服务器通信(1)
- android中本地建立数据库,服务器访问本地数据库,将查询结果返回客户端(重要的一条线)
- 免安装oracle客户端连接数据库服务器的方法
- 关于JSP查询数据库显示分页
- 从客户端获数据库服务器的系统时间
- 数据库查询结果集分页实现
- 通过bboss persistent框架实现数据库分页查询功能
- C#WinForm利用Web Service API查询数据库并显示到客户端
- 数据库跨库与跨服务器查询