package com.iminido.nosql;
import com.sequoiadb.base.CollectionSpace;
import com.sequoiadb.base.DBCollection;
import com.sequoiadb.base.DBCursor;
import com.sequoiadb.base.Sequoiadb;
import com.sequoiadb.base.SequoiadbDatasource;
import com.sequoiadb.base.SequoiadbOption;
import com.sequoiadb.exception.BaseException;
import com.sequoiadb.net.ConfigOptions;
import ist.Const;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Semaphore;
import java.util.function.BiConsumer;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.logging.log4j.LogManager;
import org.bson.BSONObject;
import org.bson.BasicBSONObject;
import org.bson.util.JSON;
import org.json.JSONObject;
/**
* @author Jade
*/
public class Squ {
private static SequoiadbDatasource sequoiadbDatasource;
protected static final org.apache.logging.log4j.Logger log = LogManager.getLogger(Squ.class);
private static Semaphore semaphore = new Semaphore(1);
private static Map<String, Sequoiadb> dbs = new HashMap<String, Sequoiadb>();
public static void main(String[] args) {
//
String connString = Const.SEQUOIADB_HOST + ":" + Const.SEQUOIADB_PORT;
try {
// 建立 SequoiaDB 数据库连接
Sequoiadb sdb = new Sequoiadb(connString, "", "");
// 获取所有 Collection 信息,并打印出来
DBCursor cursor = sdb.listCollectionSpaces();
while (cursor.hasNext()) {
System.out.println(cursor.getCurrent());
}
} catch (BaseException e) {
System.out.println("Sequoiadb driver error, error description:" + e.getErrorType());
}
// initSequoiadbDatasource();
// getSequoiadb();
// BSONObject dbo = new BasicBSONObject(); //添加异常处理
// dbo.put("key_a", "value_a");
// dbo.put("key_b", "value_b");
//
// DBCollection dBCollection = initCollection("test");
// dBCollection.save(dbo);
// DBCursor dbc = dBCollection.query();
// while (dbc.hasNext()) {
// System.out.println("" + dbc.getNext().toString());
// }
// sequoiadbDatasource.close(dBCollection.getSequoiadb());
}
static {
}
private static void initSequoiadbDatasource() {
ArrayList<String> urls = new ArrayList<>();
ConfigOptions nwOpt = new ConfigOptions(); // 定义连接选项
SequoiadbOption dsOpt = new SequoiadbOption(); // 定义连接池选项
urls.add(Const.SEQUOIADB_HOST + ":" + Const.SEQUOIADB_PORT);//
// urls.add("ubuntu-dev2:11810");
// urls.add("ubuntu-dev3:11810");
nwOpt.setConnectTimeout(500); // 设置若连接失败,超时时间(ms)
nwOpt.setMaxAutoConnectRetryTime(0); // 设置若连接失败,重试次数
// 以下设置的都是 SequoiadbOption 的默认值
dsOpt.setMaxConnectionNum(500); // 设置连接池最大连接数
dsOpt.setInitConnectionNum(10); // 初始化连接池时,创建连接的数量
dsOpt.setDeltaIncCount(10); // 当池中没有可用连接时,增加连接的数量
dsOpt.setMaxIdeNum(10); // 周期清理多余的空闲连接时,应保留连接的数量
dsOpt.setTimeout(5 * 1000); // 当已使用的连接数到达设置的最大连接数时(500),请求连接的等待时间。
dsOpt.setAbandonTime(10 * 60 * 1000); // 连接存活时间,当连接空闲时间超过连接存活时间,将被连接池丢弃
dsOpt.setRecheckCyclePeriod(1 * 60 * 1000); // 清除多余空闲连接的周期
dsOpt.setRecaptureConnPeriod(10 * 60 * 1000); // 检测并取回异常地址的周期
sequoiadbDatasource = new SequoiadbDatasource(urls, Const.SEQUOIADB_USERNAME, Const.SEQUOIADB_PASSWORD, nwOpt, dsOpt); // 创建连接池
}
private static synchronized Sequoiadb getSequoiadb() {
return getSequoiadb("zy");
}
private static synchronized Sequoiadb getSequoiadb(String dbName) {
// Sequoiadb sdb = dbs.get(dbName);
Sequoiadb sdb = null;
try {
sdb = sequoiadbDatasource.getConnection();
} catch (BaseException | InterruptedException ex) {
Logger.getLogger(Squ.class.getName()).log(Level.SEVERE, null, ex);
}
// while (sdb == null) {
// try {
// semaphore.tryAcquire(1, 2, TimeUnit.SECONDS);
// } catch (InterruptedException ex) {
// Logger.getLogger(Squ.class.getName()).log(Level.SEVERE, null, ex);
// }
// try {
// sdb = sequoiadbDatasource.getConnection();
// } catch (BaseException | InterruptedException ex) {
// Logger.getLogger(Squ.class.getName()).log(Level.SEVERE, null, ex);
// }
// }
// dbs.put(dbName, sdb);
semaphore.release();
return sdb;
}
private static CollectionSpace initCollectionSpace(String csName) {
try {
Sequoiadb sdb = getSequoiadb();
CollectionSpace cs;
if (sdb.isCollectionSpaceExist(csName)) {
cs = sdb.getCollectionSpace(csName);
} else {
cs = sdb.createCollectionSpace(csName);
}
return cs;
} catch (BaseException ex) {
Logger.getLogger(Squ.class.getName()).log(Level.SEVERE, null, ex);
return null;
}
}
private static DBCollection initCollection(String collectionName) {
CollectionSpace cs = initCollectionSpace(Const.SEQUOIADB_DATABASE);
DBCollection cl;
if (cs.isCollectionExist(collectionName)) {
cl = cs.getCollection(collectionName);
} else {
cl = cs.createCollection(collectionName);
}
return cl;
}
public static void remove(String collectionName) {
DBCollection cl = initCollection(collectionName);
cl.delete(new BasicBSONObject());
sequoiadbDatasource.close(cl.getSequoiadb());
}
public static boolean delete(String cl, String matcher) {
try {
DBCollection dbc = initCollection(cl);
dbc.delete(matcher);
sequoiadbDatasource.close(dbc.getSequoiadb());
return true;
} catch (Exception e) {
log.error("delete " + cl + "matcher=>" + matcher + "失败", e);
return false;
}
}
public static void delete(String cl, String matcher, String hint) {
DBCollection dbc = initCollection(cl);
dbc.delete(matcher, hint);
sequoiadbDatasource.close(dbc.getSequoiadb());
}
public static boolean insert(String collectionName, String... key_val) {
String strJson = strs2json(key_val);
if (strJson != null) {
BSONObject dbo;
try {
dbo = (BasicBSONObject) JSON.parse(strJson); //添加异常处理
} catch (Exception e) {
log.error("解析json字符串异常,传入的字符串为:" + strJson, e);
return false;
}
try {
DBCollection dbc = initCollection(collectionName);
dbc.insert(dbo);
sequoiadbDatasource.close(dbc.getSequoiadb());
return true;
} catch (Exception e) {
return false;
}
}
return false;
}
public static boolean insert(String collectionName, String strJson) {
BSONObject dbo = null;
try {
dbo = (BasicBSONObject) JSON.parse(strJson); //添加异常处理
} catch (Exception e) {
log.error("解析json字符串异常,传入的字符串为:" + strJson, e);
return false;
}
DBCollection dBCollection = initCollection(collectionName);
dBCollection.insert(dbo);
sequoiadbDatasource.close(dBCollection.getSequoiadb());
return true;
}
public static boolean insertNestJson(String collectionName, String strJson, String strJson2, String nameOfNest) {
BSONObject dbo = null;
try {
dbo = (BasicBSONObject) JSON.parse(strJson); //添加异常处理
} catch (Exception e) {
log.error("解析json字符串异常,传入的字符串为:" + strJson, e);
return false;
}
BSONObject dbo2 = null;
try {
dbo2 = (BasicBSONObject) JSON.parse(strJson2); //添加异常处理
} catch (Exception e) {
log.error("解析json字符串异常,传入的字符串为:" + strJson, e);
return false;
}
dbo.put(nameOfNest, dbo2);
DBCollection dBCollection = initCollection(collectionName);
Object object = dBCollection.insert(dbo);
sequoiadbDatasource.close(dBCollection.getSequoiadb());
return true;
}
//1
public static boolean isExist(String collectionName, String matcher) {
if (null == queryOne(collectionName, matcher, matcher, matcher, null)) {
return false;
} else {
return true;
}
}
public static BasicBSONObject str2BSONObject(String jsonString) {
return (BasicBSONObject) JSON.parse(jsonString);
}
public static List exec(String sql) {
DBCursor c = null;
Sequoiadb seq = null;
try {
seq = sequoiadbDatasource.getConnection();
c = seq.exec(sql);
} catch (BaseException e) {
e.printStackTrace();
} catch (InterruptedException ex) {
Logger.getLogger(Squ.class.getName()).log(Level.SEVERE, null, ex);
}
if (c != null && c.hasNext()) {
List list = new ArrayList();
while (c.hasNext()) {
list.add(c.getNext());
}
if (seq != null) {
sequoiadbDatasource.close(seq);
}
return list;
} else {
if (seq != null) {
sequoiadbDatasource.close(seq);
}
return null;
}
}
public static String exeSql(String sql) {
return list2String(exec(sql));
}
public static String exe(String sql) {
return list2String(exec(sql));
}
public static boolean execUpdate(String sql) {
Sequoiadb seq = null;
try {
seq = sequoiadbDatasource.getConnection();
seq.execUpdate(sql);
sequoiadbDatasource.close(seq);
return true;
} catch (BaseException e) {
sequoiadbDatasource.close(seq);
e.printStackTrace();
log.warn(sql, e);
return false;
} catch (InterruptedException ex) {
Logger.getLogger(Squ.class.getName()).log(Level.SEVERE, null, ex);
return false;
}
}
private static String _query(String cl, String matcher, String selector, String orderBy, String hint, long skipRows, long returnRows) {
DBCollection dbc = initCollection(cl);
String jsonString = cur2jsonstr(dbc.query(matcher, selector, orderBy, hint, skipRows, returnRows));
sequoiadbDatasource.close(dbc.getSequoiadb());
return jsonString;
}
public static String query(String cl, String matcher, String selector, String orderBy, String hint, long skipRows, long returnRows) {
return _query(cl, matcher, selector, orderBy, hint, skipRows, returnRows);
}
//matcher test
public static String query(String cl, String matcher) {
return _query(cl, matcher, null, null, null, 0, 0);
}
//matcher test
public static String query(String cl, String matcher, String selector) {
return _query(cl, matcher, selector, null, null, 0, 0);
}
public static List query4roomids(String cl, String matcher, String selector) {
DBCollection dbc = initCollection(cl);
DBCursor dBCursor = dbc.query(matcher, selector, null, null, 0, 0);
sequoiadbDatasource.close(dbc.getSequoiadb());
return cur2list(dBCursor);
}
//returnRows test
public static String query(String cl, String matcher, long returnRows) {
return _query(cl, matcher, null, null, null, 0L, returnRows);
}
// selector {filed:1}
public static String query(String cl, String matcher, String selector, long returnRows) {
return _query(cl, matcher, selector, null, null, 0L, returnRows);
}
// selector {filed:1}
public static String query(String cl, String matcher, String selector, long skipRows, long returnRows) {
return _query(cl, matcher, selector, null, null, skipRows, returnRows);
}
// orderBy {filed:1/-1}
public static String query(String cl, String matcher, String selector, String orderBy, long returnRows) {
return _query(cl, matcher, selector, orderBy, null, 0L, returnRows);
}
//hint (index) {}
public static DBCursor query(String cl, String matcher, String selector, String orderBy, String hint, long returnRows) {
DBCollection dbc = initCollection(cl);
DBCursor dbcu = dbc.query(matcher, selector, orderBy, hint, 0L, returnRows);
sequoiadbDatasource.close(dbc.getSequoiadb());
return dbcu;
}
public static List query2(String cl, String matcher, String selector, String orderBy, String hint, long returnRows, List<String> list) {
DBCollection dbc = initCollection(cl);
DBCursor c = dbc.query(matcher, selector, orderBy, hint, 0L, returnRows);
if (c != null && c.hasNext()) {
while (c.hasNext()) {
String str1 = (String) c.getNext().get("acc");
for (int j = 0; j < list.size(); j++) {
String str2 = list.get(j);
if (str2.equals(str1)) {
list.remove(str1);
}
}
}
} else {
sequoiadbDatasource.close(dbc.getSequoiadb());
return list;//直接返回生成的推荐号
}
sequoiadbDatasource.close(dbc.getSequoiadb());
return list;
}
public static String query(String cl, String matcher, long returnRows, long skipRows) {
return _query(cl, matcher, null, null, null, skipRows, returnRows);
}
//1
public static BSONObject queryOne(String collectionName, String matcher, String selector, String orderBy, String hint) {
DBCollection dBCollection = initCollection(collectionName);
BSONObject bSONObject = dBCollection.queryOne(str2BSONObject(matcher), str2BSONObject(selector), str2BSONObject(orderBy), str2BSONObject(hint), 0);
sequoiadbDatasource.close(dBCollection.getSequoiadb());
return bSONObject;
}
public static String query(String collectionName) {
return _query(collectionName, null, null, null, null, 0, 0);
}
public static String query(String collectionName, String matcher, String selector, String orderBy, String hint, int limitNum) {
return _query(collectionName, matcher, selector, orderBy, hint, limitNum, limitNum);
}
public static void update(String cl, String matcher, String modifier, String hint) {
DBCollection dbc = initCollection(cl);
dbc.update(matcher, modifier, hint);
sequoiadbDatasource.close(dbc.getSequoiadb());
}
public static void update$insert(String cl, String matcher, String modifier, String hint) {
DBCollection dbc = initCollection(cl);
dbc.update(matcher, modifier, hint);
sequoiadbDatasource.close(dbc.getSequoiadb());
}
public static void update$unsetAll(String cl, String matcher, String field, String hint) {
DBCollection dbc = initCollection(cl);
dbc.update(matcher, "{$unset:" + field + ":[]}", hint); // Squ.update("friend", "{}", "{$unset:{label:[]}}", "{}");
sequoiadbDatasource.close(dbc.getSequoiadb());
}
public static void update$unset(String cl, String matcher, String modifier, String hint) {
DBCollection dbc = initCollection(cl);
dbc.update(matcher, "{$unset:" + modifier + "}", hint); // Squ.update("friend", "{}", "{$unset:{label:[33,44,55]}}", "{}");
sequoiadbDatasource.close(dbc.getSequoiadb());
}
public static void update$addtoset(String cl, String matcher, String modifier, String hint) {
DBCollection dbc = initCollection(cl);
dbc.update(matcher, "{$addtoset:" + modifier + "}", hint); // Squ.upsert("friend", "{}", "{$addtoset:{label:[33,44,55]}}", "{}");
sequoiadbDatasource.close(dbc.getSequoiadb());
}
public static boolean update(String collectionName, String matcher, String modifier) {
DBCollection dbc = initCollection(collectionName);
dbc.update(matcher, modifier, null);
sequoiadbDatasource.close(dbc.getSequoiadb());
return true;
}
public static boolean update$set(String collectionName, String matcher, String modifier) {
DBCollection dbc = null;
try {
dbc = initCollection(collectionName);
dbc.update(matcher, "{$set:" + modifier + "}", null);
sequoiadbDatasource.close(dbc.getSequoiadb());
} catch (Exception e) {
log.debug("", e);
sequoiadbDatasource.close(dbc.getSequoiadb());
return false;
}
return true;
}
/**
* 不存在会自动插入新记录
*
* @param cl
* @param matcher
* @param modifier
* @param hint
*/
public static void upsert(String cl, String matcher, String modifier, String hint) {
DBCollection dbc = initCollection(cl);
BSONObject ma = null;
BSONObject mo = null;
BSONObject hi = null;
if (matcher != null) {
ma = (BSONObject) JSON.parse(matcher);
}
if (modifier != null) {
mo = (BSONObject) JSON.parse(modifier);
}
if (hint != null) {
hi = (BSONObject) JSON.parse(hint);
}
dbc.upsert(ma, mo, hi);
sequoiadbDatasource.close(dbc.getSequoiadb());
}
public static String strs2json(String... key_val) {
if (key_val.length % 2 != 0) {
}
String strJson = null;
if (key_val != null) {
StringBuilder sb = new StringBuilder();
sb.append("{");
int i = 0;
while (key_val[i] != null) {
sb.append(key_val[i]).append(":\"").append(key_val[++i]).append("\"");
if (i < key_val.length - 1) {
sb.append(",");
i++;
} else {
key_val[i] = null;
}
}
sb.append("}");
strJson = sb.toString();
}
return strJson;
}
public static List cur2list(DBCursor c) {
if (c != null && c.hasNext()) {
List list = new ArrayList();
while (c.hasNext()) {
list.add(c.getNext());
}
return list;
}
return null;
}
public static String cur2jsonstr(DBCursor c) {
String jsonString = "";
if (c != null && c.hasNext()) {
while (c.hasNext()) {
jsonString = jsonString + (c.getNext().toString());
}
c.close();
return jsonString;
}
return "{}";
}
private static String list2String(List list) {
if (list != null) {
StringBuilder sb = new StringBuilder();
list.stream().forEach((Object s) -> {
sb.append(s).append(",");
});
return sb.toString();
} else {
return null;
}
}
public static List<String> queryList(String collectionName, String string, String acc1_id0, String string0, String string1, int i, int DB_SEARCH_REM_COUNT, List<String> list) {
return query2(collectionName, string, string1, string1, string, i, list);
}
public static void remove(String collectionName, String match) {
DBCollection cl = initCollection(collectionName);
cl.delete(parse2BasicBSONObject(match));
sequoiadbDatasource.close(cl.getSequoiadb());
}
public static JSONObject parse2JSONObject(String json) {
return new JSONObject(json);
}
static class a implements BiConsumer {
@Override
public void accept(Object t, Object u) {
// System.out.println("t=>>"+t);
// System.out.println("u=>>"+u);
}
}
public static BasicBSONObject parse2BasicBSONObject(String json) {
BasicBSONObject bbo = new BasicBSONObject();
JSONObject obj = parse2JSONObject(json);
// obj.forEach(new a() {});
obj.entrySet().forEach(key -> {
System.out.println("c=>>" + obj.getString(key.getKey()));
System.out.println("c=>>" + obj.optString(key.getKey()));
});
return bbo;
}
public static void main2(String[] args) {
parse2BasicBSONObject("{\n"
+ " \"_id\":\"testuser8\",\n"
+ " \"UID\":\"testuser\",\n"
+ " \"CDATE\":\"2015-05-10 17:28:50\",\n"
+ " \"IDATE\":\"2015-05-10 17:28:50\",\n"
+ " \"CARDTL\":\"{\\\"HEADPIC\\\":\\\"\\\",\\\"NICK\\\":\\\"1\\\",\\\"name\\\":\\\"2\\\",\\\"skill\\\":\\\"3\\\"}\",\n"
+ " \"NICK\":\"\",\n"
+ " \"NID\":\"8\",\n"
+ " \"HEADPIC\":\"\",\n"
+ " \"UDATE\":{\n"
+ " \"$date\":\"2015-05-10T09:28:50.668Z\"\n"
+ " },\n"
+ " \"UD\":\"testuser\",\n"
+ " \"URID\":\"urid\",\n"
+ " \"ORANGE\":\"uId:个人信息标签2\"\n"
+ "}");
}
}