83 lines
2.6 KiB
OCaml
83 lines
2.6 KiB
OCaml
(**************************************************************************)
|
|
(* *)
|
|
(* Copyright (c) 2014 - 2017. *)
|
|
(* Dynamic Ledger Solutions, Inc. <contact@tezos.com> *)
|
|
(* *)
|
|
(* All rights reserved. No warranty, explicit or implicit, provided. *)
|
|
(* *)
|
|
(**************************************************************************)
|
|
|
|
(* TODO locking... *)
|
|
|
|
type t = (Block_hash.t * Nonce.t) list
|
|
|
|
let encoding : t Data_encoding.t =
|
|
let open Data_encoding in
|
|
list
|
|
(obj2
|
|
(req "block" Block_hash.encoding)
|
|
(req "nonce" Nonce.encoding))
|
|
|
|
let filename cctxt =
|
|
Client_commands.(Filename.concat cctxt.config.base_dir "nonces")
|
|
|
|
let load cctxt =
|
|
let filename = filename cctxt in
|
|
if not (Sys.file_exists filename) then
|
|
Lwt.return []
|
|
else
|
|
Data_encoding_ezjsonm.read_file filename >>= function
|
|
| Error _ ->
|
|
cctxt.Client_commands.error "couldn't to read the nonces file"
|
|
| Ok json ->
|
|
match Data_encoding.Json.destruct encoding json with
|
|
| exception _ -> (* TODO print_error *)
|
|
cctxt.Client_commands.error "didn't understand the nonces file"
|
|
| list ->
|
|
Lwt.return list
|
|
|
|
let check_dir dirname =
|
|
if not (Sys.file_exists dirname) then
|
|
Lwt_utils.create_dir dirname
|
|
else
|
|
Lwt.return ()
|
|
|
|
let save cctxt list =
|
|
Lwt.catch
|
|
(fun () ->
|
|
let dirname = Client_commands.(cctxt.config.base_dir) in
|
|
check_dir dirname >>= fun () ->
|
|
let filename = filename cctxt in
|
|
let json = Data_encoding.Json.construct encoding list in
|
|
Data_encoding_ezjsonm.write_file filename json >>= function
|
|
| Error _ -> failwith "Json.write_file"
|
|
| Ok () -> return ())
|
|
(fun exn ->
|
|
cctxt.Client_commands.error
|
|
"could not write the nonces file: %s." (Printexc.to_string exn))
|
|
|
|
let mem cctxt block_hash =
|
|
load cctxt >|= fun data ->
|
|
List.mem_assoc block_hash data
|
|
|
|
let find cctxt block_hash =
|
|
load cctxt >|= fun data ->
|
|
try Some (List.assoc block_hash data)
|
|
with Not_found -> None
|
|
|
|
let add cctxt block_hash nonce =
|
|
load cctxt >>= fun data ->
|
|
save cctxt ((block_hash, nonce) ::
|
|
List.remove_assoc block_hash data)
|
|
|
|
let del cctxt block_hash =
|
|
load cctxt >>= fun data ->
|
|
save cctxt (List.remove_assoc block_hash data)
|
|
|
|
let dels cctxt hashes =
|
|
load cctxt >>= fun data ->
|
|
save cctxt @@
|
|
List.fold_left
|
|
(fun data hash -> List.remove_assoc hash data)
|
|
data hashes
|