From: Alexandre Terrasa Date: Thu, 18 Dec 2014 13:44:55 +0000 (-0500) Subject: lib/json: introduces json store a simple json data storage system. X-Git-Tag: v0.7~19^2 X-Git-Url: http://nitlanguage.org lib/json: introduces json store a simple json data storage system. Signed-off-by: Alexandre Terrasa --- diff --git a/lib/json/store.nit b/lib/json/store.nit new file mode 100644 index 0000000..23a176c --- /dev/null +++ b/lib/json/store.nit @@ -0,0 +1,129 @@ +# This file is part of NIT ( http://www.nitlanguage.org ). +# +# This file is free software, which comes along with NIT. This software is +# distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +# without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. You can modify it is you want, provided this header +# is kept unaltered, and a notification of the changes is added. +# You are allowed to redistribute it and sell it, alone or is a part of +# another product. + +# Store and load json data. +# +# This simple system can be used to store and retrieve json data. +# +# ## Usage +# +# Create a new JsonStore or reuse an existing one. +# ~~~ +# var store = new JsonStore("store_dir") +# ~~~ +# +# JsonStore can store json of type JsonObject and JsonArray. +# ~~~ +# var red = "red" +# var obj = new JsonObject +# obj["color"] = red +# obj["code"] = "FF0000" +# ~~~ +# +# Data are stored under a key. +# ~~~ +# var key = "colors/{red}" +# ~~~ +# +# Store the object. +# ~~~ +# store.store_object(key, obj) +# assert store.has_key(key) +# ~~~ +# +# Load the object. +# ~~~ +# var res = store.load_object(key) +# assert res["name"] == red +# ~~~ +# +# Clear all stored data. +# ~~~ +# store.clear +# ~~~ +module store + +import static + +# A JsonStore can save and load json data from file system. +# +# Json files are stored under a `key`. +# This key represents the path to the json file from `store_dir` +# without the `.json` extension. +# +# Examples: +# +# * key `document` will store data under `store_dir / "document.json"` +# * key `collection/data` will store data under `store_dir / "collection/data.json"` +class JsonStore + + # Directory where data are stored. + # + # Directory is created lazilly at the first write. + var store_dir: String + + # Delete all stored data. + # + # Warning: all `JsonStore` instances sharing the same `store_dir` will + # be cleared. + fun clear do + if not store_dir.file_exists then return + store_dir.rmdir + end + + # Is there data are stored under `key`. + fun has_key(key: String): Bool do + return (store_dir / "{key}.json").file_exists + end + + # Save `json` object under `key`. + fun store_object(key: String, json: JsonObject) do + store_json(key, json) + end + + # Save `json` array under `key`. + fun store_array(key: String, json: JsonArray) do + store_json(key, json) + end + + # Save `json` data under `key`. + # + # Only `JsonObject` and `JsonArray` are allowed in a json file. + # Use `store_object` or `store_array` instead. + private fun store_json(key: String, json: Jsonable) do + var path = store_dir / "{key}.json" + path.dirname.mkdir + var file = new OFStream.open(path) + file.write(json.to_json) + file.close + end + + # Load a JsonObject associated to `key` from store. + fun load_object(key: String): JsonObject do + return load_json(key).as(JsonObject) + end + + # Load a JsonArray associated to `key` from store. + fun load_array(key: String): JsonArray do + return load_json(key).as(JsonArray) + end + + # Load a JsonObject associated to `key` from store. + # + # Ensure `has_data(key)` + private fun load_json(key: String): nullable Jsonable do + assert has_key(key) + var path = store_dir / "{key}.json" + var file = new IFStream.open(path) + var text = file.read_all + file.close + return text.parse_json + end +end