#21
authorVyacheslav Tyutyunkov <tyutyunkov@gmail.com>
Wed, 13 Mar 2013 07:00:11 +0000 (14:00 +0700)
committerVyacheslav Tyutyunkov <tyutyunkov@gmail.com>
Wed, 13 Mar 2013 07:00:11 +0000 (14:00 +0700)
jejdb/libjejdb.so
jejdb/src/cpp/jejdb.c
jejdb/src/cpp/org_ejdb_driver_EJDB.h
jejdb/src/cpp/org_ejdb_driver_EJDBCollection.h
jejdb/src/java/org/ejdb/Test.java
jejdb/src/java/org/ejdb/driver/EJDB.java
jejdb/src/java/org/ejdb/driver/EJDBCollection.java

index 63619fb..a6c1383 100755 (executable)
Binary files a/jejdb/libjejdb.so and b/jejdb/libjejdb.so differ
index 403c5f7..9d226ff 100644 (file)
@@ -4,10 +4,10 @@
 /*
  * 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;
@@ -15,16 +15,25 @@ JNIEXPORT jlong JNICALL Java_org_ejdb_driver_EJDB_openDB
     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);
@@ -33,10 +42,15 @@ JNIEXPORT jboolean JNICALL Java_org_ejdb_driver_EJDB_isOpenDB
 /*
  * 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);
@@ -46,12 +60,20 @@ JNIEXPORT void JNICALL Java_org_ejdb_driver_EJDB_closeDB
 /*
  * 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));
 
@@ -69,12 +91,20 @@ JNIEXPORT jboolean JNICALL Java_org_ejdb_driver_EJDBCollection_ensureCollectionD
 /*
  * 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);
 
@@ -88,12 +118,20 @@ JNIEXPORT jboolean JNICALL Java_org_ejdb_driver_EJDBCollection_dropCollectionDB
 /*
  * 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);
 
@@ -107,32 +145,14 @@ JNIEXPORT jobject JNICALL Java_org_ejdb_driver_EJDBCollection_loadDB
 
     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;
@@ -141,12 +161,20 @@ JNIEXPORT jobject JNICALL Java_org_ejdb_driver_EJDBCollection_loadDB
 /*
  * 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);
@@ -169,16 +197,12 @@ JNIEXPORT jobject JNICALL Java_org_ejdb_driver_EJDBCollection_saveDB
         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;
 
index 1ec2302..1f364e2 100644 (file)
@@ -26,26 +26,26 @@ extern "C" {
 /*
  * 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
 }
index 65b1561..fea9c41 100644 (file)
@@ -10,34 +10,34 @@ extern "C" {
 /*
  * 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
 }
index 277cad0..f358aa4 100644 (file)
@@ -2,6 +2,7 @@ package org.ejdb;
 
 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;
@@ -9,6 +10,8 @@ import org.ejdb.driver.EJDBDriver;
 
 import java.io.IOException;
 import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Random;
 
 /**
@@ -25,9 +28,9 @@ public class Test {
             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");
@@ -35,7 +38,7 @@ public class Test {
 //            System.out.println("collection 'test2' created");
 ////            System.in.read();
 //
-//            db.dropCollection("test");
+            db.dropCollection("test");
 //
 //            System.out.println("collection 'test' dropped");
 ////            System.in.read();
@@ -47,6 +50,7 @@ public class Test {
 
 
             EJDBCollection coll = db.getCollection("test");
+            coll.ensureExists();
             BSONObject bson = coll.load(new ObjectId("513f04d563f08b6400000000"));
             if (bson != null) {
                 System.out.println(bson.toString());
@@ -54,11 +58,13 @@ public class Test {
 
             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) {
@@ -69,10 +75,39 @@ public class Test {
                         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");
index c540f79..8b7a80e 100644 (file)
@@ -21,11 +21,11 @@ public class EJDB {
     }
 
     // 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
@@ -34,18 +34,15 @@ public class EJDB {
     }
 
     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();
     }
 
 
@@ -54,8 +51,8 @@ public class EJDB {
     }
 
     public EJDBCollection ensureCollection(String cname, Object opts) {
-        if (dbp == null) {
-            // todo
+        if (!this.isOpen()) {
+//            todo
             throw new RuntimeException("Connection does not exists");
         }
 
@@ -70,7 +67,7 @@ public class EJDB {
     }
 
     public boolean dropCollection(String cname, boolean prune) {
-        if (dbp == null) {
+        if (!this.isOpen()) {
             // todo
             throw new RuntimeException("Connection does not exists");
         }
@@ -89,7 +86,7 @@ public class EJDB {
     }
 
     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);
index 4b5e64c..16a57c7 100644 (file)
@@ -4,10 +4,9 @@ import org.bson.BSON;
 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)
@@ -15,28 +14,27 @@ import java.util.Arrays;
  */
 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() {
@@ -44,34 +42,33 @@ public class EJDBCollection {
     }
 
     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) {