package com.youzi.zhidu.db;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import android.content.Context;
import com.db4o.Db4oEmbedded;
import com.db4o.ObjectContainer;
import com.db4o.ObjectSet;
import com.db4o.config.EmbeddedConfiguration;
import com.db4o.query.Query;
public class Db {
private static Context ctx;
private static ObjectContainer db;
private static ExecutorService execService = Executors
.newFixedThreadPool(Runtime.getRuntime().availableProcessors() + 1);
public static <T> void save(T... ts) {
if (ts != null && ts.length > 0) {
for (T t : ts) {
getDb().store(t);
}
commit();
}
}
public static <T> void save(List<T> list) {
if (list != null && !list.isEmpty()) {
for (T t : list) {
getDb().store(t);
}
commit();
}
}
public static <T> void del(T t) {
if (t != null) {
getDb().delete(t);
commit();
}
}
public static <T> void delAll(Class<T> clazz) {
Query q = getDb().query();
q.constrain(clazz);
ObjectSet<T> tmp = q.execute();
if (!tmp.isEmpty()) {
for (T u : tmp) {
getDb().delete(u);
}
getDb().commit();
}
}
public static <T> void delByParam(Class<T> clazz, Map<String, Object> param) {
Query q = getQuery(clazz);
for (String k : param.keySet()) {
q.descend(k).constrain(param.get(k));
}
ObjectSet<T> tmp = q.execute();
if (!tmp.isEmpty()) {
for (T t : tmp) {
getDb().delete(t);
}
getDb().commit();
}
}
public static <T> Query getQuery(Class<T> clazz) {
Query q = getDb().query();
q.constrain(clazz);
return q;
}
public static void put(String k, Object v) {
del(k);
Map<String, Object> param = new HashMap<String, Object>();
param.put("k", k);
delByParam(Kv.class, param);
if (v != null) {
Kv kv = new Kv();
kv.k = k;
kv.v = v;
save(kv);
}
}
public static void putAsync(final String k, final Object v,
final Callback... cbs) {
execService.execute(new Runnable() {
public void run() {
put(k, v);
if (cbs != null) {
for (Callback cb : cbs) {
cb.done(true);
}
}
}
});
}
public static void getAsync(final String k, final Callback cb) {
execService.execute(new Runnable() {
public void run() {
Object obj = get(k);
if (cb != null) {
cb.done(obj);
}
}
});
}
public static Object get(String k) {
Object obj = null;
Query q = getQuery(Kv.class);
q.descend("k").constrain(k);
ObjectSet<Kv> tmp = q.execute();
if (!tmp.isEmpty()) {
obj = tmp.get(0).v;
}
return obj;
}
@SuppressWarnings("unchecked")
public static <T> T get(String k, Class<T> clazz) {
return (T) get(k);
}
public static <T> int count(Class<T> clazz) {
Query q = getDb().query();
q.constrain(clazz);
ObjectSet<T> tmp = q.execute();
return tmp.size();
}
public synchronized static void init(Context context) {
ctx = context;
EmbeddedConfiguration config = Db4oEmbedded.newConfiguration();
config.common().objectClass(Kv.class).objectField("k").indexed(true);
if (db == null || db.ext().isClosed()) {
db = Db4oEmbedded.openFile(config, ctx.getFilesDir() + "/db.db");
}
}
public static ObjectContainer getDb() {
while (db == null) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (db.ext().isClosed()) {
db = db.ext().openSession();
}
return db;
}
public static void close() {
getDb().close();
}
public static void commit() {
getDb().commit();
}
private static class Kv {
public String k;
public Object v;
}
public static interface Callback {
public void done(Object obj);
}
}