package org.qrone.kvs;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.mozilla.javascript.Scriptable;
import org.qrone.database.DatabaseCursor;
import org.qrone.database.DatabaseService;
import org.qrone.database.DatabaseTable;
import org.qrone.memcached.Memcached;
import org.qrone.memcached.MemcachedService;
import org.qrone.r7.script.AbstractScriptable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LocalKeyValueStoreService extends AbstractScriptable implements KeyValueStoreService{
private static Logger log = LoggerFactory.getLogger(LocalKeyValueStoreService.class);
private DatabaseService db;
private MemcachedService mems;
private Set<String> list = new HashSet<String>();
public LocalKeyValueStoreService(DatabaseService db, MemcachedService mem){
this.db = db;
this.mems = mem;
}
@Override
public KeyValueStore getKeyValueStore(String collection) {
return new LocalKeyValueStore(db, mems, collection);
}
public static class LocalKeyValueStore extends AbstractScriptable implements KeyValueStore {
private DatabaseTable table;
private Memcached mem;
public LocalKeyValueStore(DatabaseService db, MemcachedService mems, String collection){
table = db.getCollection(collection);
mem = mems.getKeyValueStore(collection);
}
@Override
public Object get(String key) {
Object v;
v = mem.get(key);
if(v != null){
log.debug("KVS Memcached READ (key:{})", key);
return v;
}
Map map = new HashMap();
map.put("_id", key);
DatabaseCursor cursor = table.find(map);
Map result = cursor.next();
if(result == null) return null;
v = result.get("value");
if(v != null){
log.debug("KVS Database READ (key:{})", key);
return v;
}
return null;
}
@Override
public void set(String key, Object value) {
mem.put(key, value);
Map map = new HashMap();
map.put("_id", key);
map.put("value", value);
table.save(map);
log.debug("KVS Database WRITE (key:{})", key);
}
@Override
public void set(String key, Object value, boolean weak) {
if(weak){
mem.put(key, value);
}else{
set(key, value);
}
}
@Override
public Object get(String key, Scriptable s) {
return get(key);
}
@Override
public Object[] getIds() {
return new Object[0];
}
@Override
public void put(String key, Scriptable s, Object value) {
set(key, value);
}
}
@Override
public Object get(String collection, Scriptable s) {
list.add(collection);
return getKeyValueStore(collection);
}
@Override
public Object[] getIds() {
return list.toArray(new Object[list.size()]);
}
}