From 35de23c0f377ad81cbcfc31f5236bd5299b0d13f Mon Sep 17 00:00:00 2001 From: Gregory Burd Date: Tue, 23 Apr 2013 08:22:48 -0400 Subject: [PATCH] Include the gen_server module that will log events using lager. --- src/wterl_event_handler.erl | 111 ++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 src/wterl_event_handler.erl diff --git a/src/wterl_event_handler.erl b/src/wterl_event_handler.erl new file mode 100644 index 0000000..71c357c --- /dev/null +++ b/src/wterl_event_handler.erl @@ -0,0 +1,111 @@ +%% ------------------------------------------------------------------- +%% +%% wterl: Erlang Wrapper for WiredTiger +%% +%% Copyright (c) 2012 Basho Technologies, Inc. All Rights Reserved. +%% +%% This file is provided to you under the Apache License, +%% Version 2.0 (the "License"); you may not use this file +%% except in compliance with the License. You may obtain +%% a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, +%% software distributed under the License is distributed on an +%% "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +%% KIND, either express or implied. See the License for the +%% specific language governing permissions and limitations +%% under the License. +%% +%% ------------------------------------------------------------------- +-module(wterl_event_handler). + +-behaviour(gen_server). + +-ifdef(TEST). +-include_lib("eunit/include/eunit.hrl"). +-endif. + +%% API +-export([start_link/0, stop/0]). + +%% gen_server callbacks +-export([init/1, handle_call/3, handle_cast/2, handle_info/2, + terminate/2, code_change/3]). + +-define(PREFIX, "wiredtiger"). + +%% ==================================================================== +%% API +%% ==================================================================== + +-spec start_link() -> {ok, pid()} | {error, term()}. +start_link() -> + gen_server:start_link({local, ?MODULE}, ?MODULE, [], []). + +-spec stop() -> ok. +stop() -> + gen_server:cast(?MODULE, stop). + +%% ==================================================================== +%% gen_server callbacks +%% ==================================================================== + +init([]) -> + wterl:set_event_handler_pid(self()), + {ok, []}. + +handle_call(_Msg, _From, State) -> + {reply, ok, State}. + +handle_cast(stop, State) -> + {stop, normal, State}; +handle_cast(_Msg, State) -> + {noreply, State}. + +handle_info({error, {Errno, Message}}, State) -> + log(error, "~s: (~s) ~s", [?PREFIX, Errno, Message]), + {noreply, State}; +handle_info({message, Info}, State) -> + log(info, "~s: ~s", [?PREFIX, Info]), + {noreply, State}; +handle_info({progress, {Operation, Counter}}, State) -> + log(info, "~s: progress on ~s [~b]", [?PREFIX, Operation, Counter]), + {noreply, State}; +handle_info(_Info, State) -> + {noreply, State}. + +terminate(_Reason, _State) -> + ok. + +code_change(_OldVsn, State, _Extra) -> + {ok, State}. + +%% ==================================================================== +%% Internal functions +%% ==================================================================== + +%% @private +-spec log(error | info, string(), [any()]) -> ok. +log(Urgency, Format, Args) -> + case proplists:is_defined(lager, application:which_applications()) of + true -> + log(lager, Urgency, Format, Args); + false -> + log(stdio, Urgency, Format, Args) + end. + +-spec log(lager | stdio, error | info, string(), [any()]) -> ok. +log(lager, error, Format, Args) -> + lager:error(Format, Args); +log(lager, info, Format, Args) -> + lager:info(Format, Args); +log(stdio, _, Format, Args) -> + io:format(Format ++ "~n", Args). + +%% =================================================================== +%% EUnit tests +%% =================================================================== +-ifdef(TEST). +-endif.