-
Notifications
You must be signed in to change notification settings - Fork 16
/
client_cfg.ml
87 lines (70 loc) · 2.59 KB
/
client_cfg.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
(*
Copyright (2010-2014) INCUBAID BVBA
Licensed 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.
*)
open Lwt
module ClientCfg = struct
type node_address = string list * int
type t = (string, node_address) Hashtbl.t
let cfg_to buf (t:t) =
Llio.hashtbl_to Llio.string_to (Llio.pair_to Llio.string_list_to Llio.int_to) buf t
let cfg_from buf =
let entry_from buf =
let k = Llio.string_from buf in
let ips = Llio.string_list_from buf in
let p = Llio.int_from buf in
let (na:node_address) = ips,p in
(k,na)
in
Llio.hashtbl_from entry_from buf
let to_string t =
let buffer = Buffer.create 127 in
Hashtbl.iter (fun s (ips,p) ->
let ipss = Printf.sprintf "[%s]" (String.concat ";" ips) in
Buffer.add_string buffer (Printf.sprintf "(%s,(%s,%i))" s ipss p)) t;
Buffer.contents buffer
let input_cfg ic =
let key_from ic =
Llio.input_string ic
in
let value_from ic =
Llio.input_string_list ic >>= fun ips ->
Llio.input_int ic >>= fun port ->
Lwt.return (ips,port)
in
Llio.input_hashtbl key_from value_from ic
let output_cfg oc cfg =
let helper oc key value =
Llio.output_string oc key >>= fun () ->
let (ip,port) = value in
Llio.output_string oc ip >>= fun () ->
Llio.output_int oc port
in
Llio.output_hashtbl helper oc cfg
let node_names (t:t) = Hashtbl.fold (fun k _v acc -> k::acc) t []
let make () = Hashtbl.create 7
let add (t:t) name sa = Hashtbl.add t name sa
let get (t:t) name = Hashtbl.find t name
let from_file section fn = (* This is the format as defined in the extension *)
let inifile = new Inifiles.inifile fn in
let cfg = make () in
let _ips node_name = Ini.get inifile node_name "ip" Ini.p_string_list Ini.required in
let _get s n p = Ini.get inifile s n p Ini.required in
let nodes = _get section "cluster" Ini.p_string_list in
let () = List.iter
(fun n ->
let ips = _ips n in
let port = _get n "client_port" Ini.p_int in
add cfg n (ips,port)
) nodes
in
cfg
end