diff options
author | Joe <joe@ubuntu.localdomain> | 2010-02-22 12:19:15 -0800 |
---|---|---|
committer | Joe <joe@ubuntu.localdomain> | 2010-02-22 12:19:15 -0800 |
commit | 6fce297e9ff9f495b10281f2c5c78e6e0c2d48ad (patch) | |
tree | 42f34b519a411ce8f594a375d5be5c885ee37ed6 /src/configuration.erl |
merge attempt #1
Diffstat (limited to 'src/configuration.erl')
-rw-r--r-- | src/configuration.erl | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/src/configuration.erl b/src/configuration.erl new file mode 100644 index 00000000..1caca5ec --- /dev/null +++ b/src/configuration.erl @@ -0,0 +1,99 @@ +%%% -*- erlang-indent-level:2 -*- +%%%------------------------------------------------------------------- +%%% File: configuration.erl +%%% @author Cliff Moon <cliff@powerset.com> +%%% @author Brad Anderson <brad@cloudant.com> +%%% @copyright 2008 Cliff Moon +%%% @doc +%%% This module keeps Dynomite source relatively unchanged, but +%%% reads from couchdb config stuffs +%%% @end +%%% +%%% @since 2008-07-18 by Cliff Moon +%%%------------------------------------------------------------------- +-module(configuration). +-author('cliff@powerset.com'). +-author('brad@cloudant.com'). + +%%-behaviour(gen_server). + +%% API +-export([start_link/1, get_config/1, get_config/0, set_config/1, stop/0]). + +-include_lib("eunit/include/eunit.hrl"). + +-include("../include/config.hrl"). +-include("../include/common.hrl"). + +-define(SERVER, couch_config). +-define(i2l(V), integer_to_list(V)). +-define(l2i(V), list_to_integer(V)). + + +%% ----------------------------------------------------------------- +%% API +%% ----------------------------------------------------------------- + +%% @doc starts couch_config gen_server if it's not already started +start_link(DynomiteConfig) -> + couch_config:start_link([]), + set_config(DynomiteConfig). + + +%% @doc get the config for a remote node +get_config(Node) -> + ClusterConfig = rpc:call(Node, couch_config, get, ["cluster"]), + Directory = rpc:call(Node, couch_config, get, ["couchdb", "database_dir"]), + couch2dynomite_config(ClusterConfig, Directory). + + +%% @doc get the config for the local node +get_config() -> + get_config(node()). + + +%% @doc given a Dynomite config record, put the values into the Couch config +set_config(DynomiteConfig) -> + dynomite2couch_config(DynomiteConfig). + + +%% @doc stop the config server (nothing to do until after couch_config refactor) +stop() -> + couch_config:stop(). + + +%% ----------------------------------------------------------------- +%% Internal functions +%% ----------------------------------------------------------------- + +%% @doc turn a couch config proplist into a dynomite configuration record +couch2dynomite_config(ClusterConfig, Directory) -> + Q = ?l2i(proplists:get_value("q", ClusterConfig, "3")), + R = ?l2i(proplists:get_value("r", ClusterConfig, "2")), + W = ?l2i(proplists:get_value("w", ClusterConfig, "1")), + N = ?l2i(proplists:get_value("n", ClusterConfig, "4")), + %% use couch's database_dir here, to avoid /tmp/data not existing + Webport = ?l2i(proplists:get_value("webport", ClusterConfig, "8080")), + Meta = proplists:get_value("meta", ClusterConfig, []), + StorageMod = proplists:get_value("storage_mod", ClusterConfig, []), + #config{q=Q, r=R, w=W, n=N, directory=Directory, web_port=Webport, + meta=Meta, storage_mod=StorageMod}. + + +%% @doc workhorse for set_config/1 above +dynomite2couch_config(DynomiteConfig) -> + couch_config:set("cluster", "q", ?i2l(DynomiteConfig#config.q), false), + couch_config:set("cluster", "r", ?i2l(DynomiteConfig#config.r), false), + couch_config:set("cluster", "w", ?i2l(DynomiteConfig#config.w), false), + couch_config:set("cluster", "n", ?i2l(DynomiteConfig#config.n), false), + couch_config:set("couchdb", "database_dir", DynomiteConfig#config.directory, + false), + couch_config:set("cluster", "webport", + case DynomiteConfig#config.web_port of + undefined -> "8080"; + _ -> ?i2l(DynomiteConfig#config.web_port) + end, false), + couch_config:set("cluster", "meta", DynomiteConfig#config.meta, false), + couch_config:set("cluster", "storage_mod", + DynomiteConfig#config.storage_mod, false), + ok. |