/*
* Class: org_ejdb_driver_EJDB
* Method: openDB
- * Signature: (Ljava/lang/String;I)J
+ * Signature: (Ljava/lang/String;I)V
*/
-JNIEXPORT jlong JNICALL Java_org_ejdb_driver_EJDB_openDB
- (JNIEnv *env, jobject ojb, jstring path, jint mode) {
+JNIEXPORT void JNICALL Java_org_ejdb_driver_EJDB_openDB
+ (JNIEnv *env, jobject obj, jstring path, jint mode) {
EJDB* db = ejdbnew();
const char *dbpath;
ejdbopen(db, dbpath, mode);
(*env)->ReleaseStringUTFChars(env, path, dbpath);
- return (jlong)db;
+ jclass clazz = (*env)->GetObjectClass(env, obj);
+ jfieldID dbpID = (*env)->GetFieldID(env, clazz, "dbPointer", "J");
+ (*env)->SetLongField(env, obj, dbpID, (jlong)db);
+
+ return;
};
/*
* Class: org_ejdb_driver_EJDB
* Method: isOpenDB
- * Signature: (J)Z
+ * Signature: ()Z
*/
JNIEXPORT jboolean JNICALL Java_org_ejdb_driver_EJDB_isOpenDB
- (JNIEnv *env, jobject obj, jlong dbp) {
+ (JNIEnv *env, jobject obj) {
+ jclass clazz = (*env)->GetObjectClass(env, obj);
+ jfieldID dbpID = (*env)->GetFieldID(env, clazz, "dbPointer", "J");
+ jlong dbp = (*env)->GetLongField(env, obj, dbpID);
+
+ // todo: check null?
EJDB* db = (EJDB*)dbp;
return ejdbisopen(db);
/*
* Class: org_ejdb_driver_EJDB
* Method: closeDB
- * Signature: (J)V
+ * Signature: ()V
*/
JNIEXPORT void JNICALL Java_org_ejdb_driver_EJDB_closeDB
- (JNIEnv *env, jobject obj, jlong dbp) {
+ (JNIEnv *env, jobject obj) {
+ jclass clazz = (*env)->GetObjectClass(env, obj);
+ jfieldID dbpID = (*env)->GetFieldID(env, clazz, "dbPointer", "J");
+ jlong dbp = (*env)->GetLongField(env, obj, dbpID);
+
+ // todo: check null?
EJDB* db = (EJDB*)dbp;
ejdbclose(db);
/*
* Class: org_ejdb_driver_EJDBCollection
* Method: ensureCollectionDB
- * Signature: (JLjava/lang/String;Ljava/lang/Object;)Z
+ * Signature: (Ljava/lang/Object;)Z
*/
JNIEXPORT jboolean JNICALL Java_org_ejdb_driver_EJDBCollection_ensureCollectionDB
- (JNIEnv *env, jobject obj, jlong dbp, jstring colname, jobject opts) {
+ (JNIEnv *env, jobject obj, jobject opts) {
+ jclass clazz = (*env)->GetObjectClass(env, obj);
+ jfieldID dbpID = (*env)->GetFieldID(env, clazz, "dbPointer", "J");
+ jlong dbp = (*env)->GetLongField(env, obj, dbpID);
+
+ // todo: check null?
EJDB* db = (EJDB*)dbp;
+ jfieldID colnameID = (*env)->GetFieldID(env, clazz, "cname", "Ljava/lang/String;");
+ jstring colname = (*env)->GetObjectField(env, obj, colnameID);
+
EJCOLLOPTS jcopts;
memset(&jcopts, 0, sizeof (jcopts));
/*
* Class: org_ejdb_driver_EJDBCollection
* Method: dropCollectionDB
- * Signature: (JLjava/lang/String;Z)Z
+ * Signature: (Z)Z
*/
JNIEXPORT jboolean JNICALL Java_org_ejdb_driver_EJDBCollection_dropCollectionDB
- (JNIEnv *env, jobject obj, jlong dbp, jstring colname, jboolean prune) {
+ (JNIEnv *env, jobject obj, jboolean prune) {
+ jclass clazz = (*env)->GetObjectClass(env, obj);
+ jfieldID dbpID = (*env)->GetFieldID(env, clazz, "dbPointer", "J");
+ jlong dbp = (*env)->GetLongField(env, obj, dbpID);
+
+ // todo: check null?
EJDB* db = (EJDB*)dbp;
+ jfieldID colnameID = (*env)->GetFieldID(env, clazz, "cname", "Ljava/lang/String;");
+ jstring colname = (*env)->GetObjectField(env, obj, colnameID);
+
const char *cname;
cname = (*env)->GetStringUTFChars(env, colname, NULL);
/*
* Class: org_ejdb_driver_EJDBCollection
* Method: loadDB
- * Signature: (JLjava/lang/String;[B)Ljava/lang/Object;
+ * Signature: ([B)Ljava/lang/Object;
*/
JNIEXPORT jobject JNICALL Java_org_ejdb_driver_EJDBCollection_loadDB
- (JNIEnv *env, jobject obj, jlong dbp, jstring colname, jbyteArray oidArray) {
+ (JNIEnv *env, jobject obj, jbyteArray oidArray) {
+ jclass clazz = (*env)->GetObjectClass(env, obj);
+ jfieldID dbpID = (*env)->GetFieldID(env, clazz, "dbPointer", "J");
+ jlong dbp = (*env)->GetLongField(env, obj, dbpID);
+
+ // todo: check null?
EJDB* db = (EJDB*)dbp;
+ jfieldID colnameID = (*env)->GetFieldID(env, clazz, "cname", "Ljava/lang/String;");
+ jstring colname = (*env)->GetObjectField(env, obj, colnameID);
+
const char *cname = (*env)->GetStringUTFChars(env, colname, NULL);
bson_oid_t *oid = (jbyte*)(*env)->GetByteArrayElements(env, oidArray, NULL);
if (!bson) {
return NULL;
-// result = (*env)->NewByteArray(env, 0);
}
- jclass clazz = (*env)->GetObjectClass(env, obj);
jmethodID method = (*env)->GetStaticMethodID(env, clazz, "handleBSONData", "(Ljava/nio/ByteBuffer;)Ljava/lang/Object;");
// todo: checks
-// printf("%d", bson_size(bson));
-
-// jbyteArray buff = (*env)->NewByteArray(env, bson_size(bson));
-// memcpy(buff, bson_data(bson), bson_size(bson));
-// jbyte* tbuff;
-// (*env)>GetByteArrayRegion(env, buff, 0, bson_size(bson), tbuff);
-// (*env)>SetByteArrayRegion(env, buff, (jsize)0, (jsize)bson_size(bson), (jbyte*)bson_data(bson));
-//
-// printf("0x%x", bson_data(bson));
-
-// void *bb = malloc(bson_size(bson));
-// memcpy(bb, bson_data(bson), bson_size(bson));
-//
jobject buff = (*env)->NewDirectByteBuffer(env, (void*)bson_data(bson), bson_size(bson));
jobject result = (*env)->CallStaticObjectMethod(env, clazz, method, buff);
-// free (bb);
(*env)->DeleteLocalRef(env, buff);
-// (*env)->DeleteLocalRef(env, method);
-// (*env)->DeleteLocalRef(env, clazz);
bson_del(bson);
return result;
/*
* Class: org_ejdb_driver_EJDBCollection
* Method: saveDB
- * Signature: (JLjava/lang/String;[B)Ljava/lang/Object;
+ * Signature: ([B)Ljava/lang/Object;
*/
JNIEXPORT jobject JNICALL Java_org_ejdb_driver_EJDBCollection_saveDB
- (JNIEnv *env, jobject obj, jlong dbp, jstring colname, jbyteArray objdata) {
+ (JNIEnv *env, jobject obj, jbyteArray objdata) {
+ jclass clazz = (*env)->GetObjectClass(env, obj);
+ jfieldID dbpID = (*env)->GetFieldID(env, clazz, "dbPointer", "J");
+ jlong dbp = (*env)->GetLongField(env, obj, dbpID);
+
+ // todo: check null?
EJDB* db = (EJDB*)dbp;
+ jfieldID colnameID = (*env)->GetFieldID(env, clazz, "cname", "Ljava/lang/String;");
+ jstring colname = (*env)->GetObjectField(env, obj, colnameID);
+
const char *cname = (*env)->GetStringUTFChars(env, colname, NULL);
jbyte *bdata = (*env)->GetByteArrayElements(env, objdata, NULL);
jsize blength = (*env)->GetArrayLength(env, objdata);
return NULL;
}
- jclass clazz = (*env)->GetObjectClass(env, obj);
jmethodID method = (*env)->GetStaticMethodID(env, clazz, "handleObjectIdData", "(Ljava/nio/ByteBuffer;)Ljava/lang/Object;");
jobject buff = (*env)->NewDirectByteBuffer(env, (void*)&oid, sizeof(oid));
jobject result = (*env)->CallStaticObjectMethod(env, clazz, method, buff);
-// free (bb);
(*env)->DeleteLocalRef(env, buff);
-// (*env)->DeleteLocalRef(env, method);
-// (*env)->DeleteLocalRef(env, clazz);
return result;
/*
* Class: org_ejdb_driver_EJDB
* Method: openDB
- * Signature: (Ljava/lang/String;I)J
+ * Signature: (Ljava/lang/String;I)V
*/
-JNIEXPORT jlong JNICALL Java_org_ejdb_driver_EJDB_openDB
+JNIEXPORT void JNICALL Java_org_ejdb_driver_EJDB_openDB
(JNIEnv *, jobject, jstring, jint);
/*
* Class: org_ejdb_driver_EJDB
* Method: isOpenDB
- * Signature: (J)Z
+ * Signature: ()Z
*/
JNIEXPORT jboolean JNICALL Java_org_ejdb_driver_EJDB_isOpenDB
- (JNIEnv *, jobject, jlong);
+ (JNIEnv *, jobject);
/*
* Class: org_ejdb_driver_EJDB
* Method: closeDB
- * Signature: (J)V
+ * Signature: ()V
*/
JNIEXPORT void JNICALL Java_org_ejdb_driver_EJDB_closeDB
- (JNIEnv *, jobject, jlong);
+ (JNIEnv *, jobject);
#ifdef __cplusplus
}
/*
* Class: org_ejdb_driver_EJDBCollection
* Method: ensureCollectionDB
- * Signature: (JLjava/lang/String;Ljava/lang/Object;)Z
+ * Signature: (Ljava/lang/Object;)Z
*/
JNIEXPORT jboolean JNICALL Java_org_ejdb_driver_EJDBCollection_ensureCollectionDB
- (JNIEnv *, jobject, jlong, jstring, jobject);
+ (JNIEnv *, jobject, jobject);
/*
* Class: org_ejdb_driver_EJDBCollection
* Method: dropCollectionDB
- * Signature: (JLjava/lang/String;Z)Z
+ * Signature: (Z)Z
*/
JNIEXPORT jboolean JNICALL Java_org_ejdb_driver_EJDBCollection_dropCollectionDB
- (JNIEnv *, jobject, jlong, jstring, jboolean);
+ (JNIEnv *, jobject, jboolean);
/*
* Class: org_ejdb_driver_EJDBCollection
* Method: loadDB
- * Signature: (JLjava/lang/String;[B)Ljava/lang/Object;
+ * Signature: ([B)Ljava/lang/Object;
*/
JNIEXPORT jobject JNICALL Java_org_ejdb_driver_EJDBCollection_loadDB
- (JNIEnv *, jobject, jlong, jstring, jbyteArray);
+ (JNIEnv *, jobject, jbyteArray);
/*
* Class: org_ejdb_driver_EJDBCollection
* Method: saveDB
- * Signature: (JLjava/lang/String;[B)Ljava/lang/Object;
+ * Signature: ([B)Ljava/lang/Object;
*/
JNIEXPORT jobject JNICALL Java_org_ejdb_driver_EJDBCollection_saveDB
- (JNIEnv *, jobject, jlong, jstring, jbyteArray);
+ (JNIEnv *, jobject, jbyteArray);
#ifdef __cplusplus
}
import org.bson.BSONObject;
import org.bson.BasicBSONObject;
+import org.bson.types.BasicBSONList;
import org.bson.types.ObjectId;
import org.ejdb.driver.EJDB;
import org.ejdb.driver.EJDBCollection;
import java.io.IOException;
import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
import java.util.Random;
/**
System.out.println("DB opened");
// System.in.read();
- db.ensureCollection("test");
-
- System.out.println("collection 'test' created");
+// db.ensureCollection("test");
+//
+// System.out.println("collection 'test' created");
// System.in.read();
// db.ensureCollection("test2");
// System.out.println("collection 'test2' created");
//// System.in.read();
//
-// db.dropCollection("test");
+ db.dropCollection("test");
//
// System.out.println("collection 'test' dropped");
//// System.in.read();
EJDBCollection coll = db.getCollection("test");
+ coll.ensureExists();
BSONObject bson = coll.load(new ObjectId("513f04d563f08b6400000000"));
if (bson != null) {
System.out.println(bson.toString());
Random rand = new Random();
+ List<ObjectId> oids = new ArrayList<ObjectId>(500);
+
int ri;
- for (int i = 0; i < 5; ++ i) {
+ for (int i = 0; i < 5/*00*/; ++ i) {
ri = rand.nextInt();
- System.out.println("Random: " + ri);
+// System.out.println("Random: " + ri);
ObjectId oid = coll.save(new BasicBSONObject("test", ri));
if (oid == null) {
System.out.println("Error loading");
} else {
System.out.println(bson.toString());
+ oids.add(oid);
}
}
}
+// int i = 0;
+
+// while(true) {
+// for (ObjectId oid : oids) {
+// bson = coll.load(oid);
+// }
+// }
+//
+ BasicBSONList list = new BasicBSONList();
+
+ list.add(new BasicBSONObject("random", rand.nextInt()));
+ list.add(new BasicBSONObject("random", rand.nextInt()));
+ list.add(new BasicBSONObject("random", rand.nextInt()));
+ list.add(new BasicBSONObject("random", rand.nextInt()));
+ list.add(new BasicBSONObject("random", rand.nextInt()));
+
+ ObjectId oid = coll.save(list);
+ if (oid == null) {
+ System.out.println("Error saving");
+ } else {
+ bson = coll.load(oid);
+ if (bson == null) {
+ System.out.println("Error loading");
+ } else {
+ System.out.println(bson.toString());
+ oids.add(oid);
+ }
+ }
} finally {
db.close();
System.out.println("DB closed");
}
// todo: rewrite impls - use `this.db` from c code
- protected native long openDB(String path, int mode);
- protected native boolean isOpenDB(long dbp);
- protected native void closeDB(long dbp);
+ protected native void openDB(String path, int mode);
+ protected native boolean isOpenDB();
+ protected native void closeDB();
- private Long dbp;
+ private long dbPointer;
// TODO: move to driver class
}
public void open(String path, int mode) {
- dbp = this.openDB(path, mode);
+ this.openDB(path, mode);
}
public boolean isOpen() {
- return dbp != null && this.isOpenDB(dbp);
+ return this.isOpenDB();
}
public void close() {
- if (dbp != null) {
- this.closeDB(dbp);
- }
- dbp = null;
+ this.closeDB();
}
}
public EJDBCollection ensureCollection(String cname, Object opts) {
- if (dbp == null) {
- // todo
+ if (!this.isOpen()) {
+// todo
throw new RuntimeException("Connection does not exists");
}
}
public boolean dropCollection(String cname, boolean prune) {
- if (dbp == null) {
+ if (!this.isOpen()) {
// todo
throw new RuntimeException("Connection does not exists");
}
}
public EJDBCollection getCollection(String cname, boolean ecreate, Object opts) {
- EJDBCollection collection = new EJDBCollection(dbp, cname);
+ EJDBCollection collection = new EJDBCollection(dbPointer, cname);
if (ecreate) {
collection.ensureExists(opts);
import org.bson.BSONObject;
import org.bson.types.ObjectId;
-import java.awt.image.DataBufferByte;
import java.nio.ByteBuffer;
-import java.nio.MappedByteBuffer;
-import java.util.Arrays;
+import java.util.ArrayList;
+import java.util.List;
/**
* @author Tyutyunkov Vyacheslav (tve@softmotions.com)
*/
public class EJDBCollection {
- private long dbp;
- private String name;
+ private long dbPointer;
+ private String cname;
- EJDBCollection(long dbp, String name) {
- this.dbp = dbp;
- this.name = name;
+ EJDBCollection(long dbPointer, String cname) {
+ this.dbPointer = dbPointer;
+ this.cname = cname;
}
// todo: bson object for options
- protected native boolean ensureCollectionDB(long dbp, String cname, Object opts);
+ protected native boolean ensureCollectionDB(Object opts);
+ protected native boolean dropCollectionDB(boolean prune);
- protected native boolean dropCollectionDB(long dbp, String cname, boolean prune);
-
- protected native Object loadDB(long dbp, String cname, byte[] oid);
- protected native Object saveDB(long dbp, String cname, byte[] objdata);
+ protected native Object loadDB(byte[] oid);
+ protected native Object saveDB(byte[] objdata);
public boolean ensureExists() {
return this.ensureExists(null);
}
public boolean ensureExists(Object opts) {
- return this.ensureCollectionDB(dbp, name, opts);
+ return this.ensureCollectionDB(opts);
}
public boolean drop() {
}
public boolean drop(boolean prune) {
- return this.dropCollectionDB(dbp, name, prune);
+ return this.dropCollectionDB(prune);
}
public BSONObject load(ObjectId oid) {
- return (BSONObject) this.loadDB(dbp, name, oid.toByteArray());
-// byte[] data = this.loadDB(dbp, name, oid.toByteArray());
-// if (data.length > 0) {
-// return BSON.decode(data);
-// } else {
-// return null;
-// }
+ return (BSONObject) this.loadDB(oid.toByteArray());
}
public ObjectId save(BSONObject object) {
- return (ObjectId) this.saveDB(dbp, name, BSON.encode(object));
+ return (ObjectId) this.saveDB(BSON.encode(object));
+ }
+
+ public List<ObjectId> save(List<BSONObject> objects) {
+ List<ObjectId> result = new ArrayList<ObjectId>(objects.size());
+
+ for (BSONObject object : objects) {
+ result.add(this.save(object));
+ }
+
+ return result;
}
private static Object handleBSONData(ByteBuffer data) {
byte[] tmp = new byte[data.limit()];
data.get(tmp);
-// System.out.println(data.getClass().getName());
-// System.out.println(((MappedByteBuffer)data).load().array());
- // System.out.println(Arrays.toString(data.array()));
return BSON.decode(tmp);
-
-// return null;
}
private static Object handleObjectIdData(ByteBuffer data) {