cc-haxe/src/lib/KVStore.hx

83 lines
1.8 KiB
Haxe
Raw Normal View History

2022-03-12 16:18:12 +00:00
package lib;
import haxe.Serializer;
import haxe.Unserializer;
import kernel.fs.FS;
import haxe.ds.StringMap;
/**
Key value store with persistence.
**/
class KVStore {
private var kvStore: StringMap<Dynamic> = new StringMap();
2023-05-29 10:49:42 +00:00
public final namespace:String;
2022-03-12 16:18:12 +00:00
public function new(namespace: String) {
this.namespace = namespace;
2023-06-04 13:43:24 +00:00
this.load();
2022-03-12 16:18:12 +00:00
}
2023-05-25 21:44:08 +00:00
public static function removeNamespace(namespace: String): Void {
var nsFile = getNamespaceFile(namespace);
FS.delete(nsFile);
}
2023-05-29 10:49:42 +00:00
public static function getStoreForClass(?pos:haxe.PosInfos) {
var className = pos.className;
return new KVStore(className);
}
2022-03-12 16:18:12 +00:00
private static function getNamespaceFile(namespace: String): String {
2023-03-27 22:55:23 +00:00
return '/var/ns/$namespace';
2022-03-12 16:18:12 +00:00
}
public function load() {
2023-03-27 22:55:23 +00:00
var nsFile = getNamespaceFile(this.namespace);
if (FS.exists(nsFile)){
var handle = FS.openRead(nsFile);
2022-03-12 16:18:12 +00:00
parseFile(handle.readAll());
}
}
public function save() {
var handle = FS.openWrite(getNamespaceFile(this.namespace));
handle.write(Serializer.run(this.kvStore));
handle.close();
}
private function parseFile(content: String) {
var unserializer = new Unserializer(content);
this.kvStore = unserializer.unserialize();
}
public inline function set(key: String, value: Dynamic) {
this.kvStore.set(key,value);
}
2023-05-29 10:49:42 +00:00
public inline function get<T>(key: String,?orElse:T = null): Null<T> {
return this.kvStore.get(key) ?? orElse;
2022-03-12 16:18:12 +00:00
}
public inline function exists(key: String): Bool {
return this.kvStore.exists(key);
}
public inline function clear() {
this.kvStore.clear();
}
public inline function remove(key: String): Bool {
return this.kvStore.remove(key);
}
public inline function keys(): Iterator<String> {
return this.kvStore.keys();
}
public inline function keyValueIterator():KeyValueIterator<String, Dynamic> {
return this.kvStore.keyValueIterator();
}
}