#21 - result set implementation
authorVyacheslav Tyutyunkov <tyutyunkov@gmail.com>
Fri, 15 Mar 2013 10:18:36 +0000 (17:18 +0700)
committerVyacheslav Tyutyunkov <tyutyunkov@gmail.com>
Fri, 15 Mar 2013 10:18:36 +0000 (17:18 +0700)
jejdb/src/cpp/jejdb.c
jejdb/src/cpp/jejdb.h
jejdb/src/cpp/org_ejdb_driver_EJDBResultSet.h [changed mode: 0644->0755]
jejdb/src/java/org/ejdb/Test2.java
jejdb/src/java/org/ejdb/driver/EJDBQuery.java
jejdb/src/java/org/ejdb/driver/EJDBResultSet.java

index bc6d4b6..2001980 100755 (executable)
@@ -421,7 +421,7 @@ JNIEXPORT jobject JNICALL Java_org_ejdb_driver_EJDBQuery_executeDB
                jmethodID encodeMethodID = (*env)->GetStaticMethodID(env, jBSONClazz, "encode", "(Lorg/bson/BSONObject;)[B");
 
                jclass jQResultClazz = (*env)->FindClass(env, "org/ejdb/driver/EJDBQuery$QResult");
-               jmethodID initQResultMethodID = (*env)->GetMethodID(env, jQResultClazz, "<init>", "(JJ)V");
+               jmethodID initQResultMethodID = (*env)->GetMethodID(env, jQResultClazz, "<init>", "(IJ)V");
                
                bson *qbson = NULL;
                bson *qorbsons = NULL;
@@ -520,7 +520,7 @@ JNIEXPORT jobject JNICALL Java_org_ejdb_driver_EJDBQuery_executeDB
                        }
                }
                
-               qresult = (*env)->NewObject(env, jQResultClazz, initQResultMethodID, (jlong)count, (jlong)qres);
+               qresult = (*env)->NewObject(env, jQResultClazz, initQResultMethodID, (jint)count, (jlong)qres);
 
 finish:
                // clear
@@ -542,3 +542,86 @@ finish:
 
                return qresult;
 };
+
+/*
+ * Class:     org_ejdb_driver_EJDBResultSet
+ * Method:    getDB
+ * Signature: (I)Lorg/bson/BSONObject;
+ */
+ JNIEXPORT jobject JNICALL Java_org_ejdb_driver_EJDBResultSet_getDB
+        (JNIEnv *env, jobject obj, jint indx) {
+                jclass clazz = (*env)->GetObjectClass(env, obj);
+                jfieldID rspID = (*env)->GetFieldID(env, clazz, "rsPointer", "J");
+                jlong rsp = (*env)->GetLongField(env, obj, rspID);
+
+                TCLIST *rs = (TCLIST *)rsp;
+
+                if (!rs) {
+                        set_error(env, 0, "Cursor closed");
+                        return NULL;
+                }
+
+                if (indx < 0 || indx >= TCLISTNUM(rs)) {
+                        set_error(env, 0, "Invalid cursor position");
+                        return NULL;
+                }
+
+                int bsdatasz;
+                void *bsdata;
+
+                TCLISTVAL(bsdata, rs, indx, bsdatasz);
+
+                // decode BSONObject
+                jclass jBSONClazz = (*env)->FindClass(env, "org/bson/BSON");
+                jmethodID decodeMethodID = (*env)->GetStaticMethodID(env, jBSONClazz, "decode", "([B)Lorg/bson/BSONObject;");
+
+                jbyteArray jbsdata = (*env)->NewByteArray(env, bsdatasz);
+                (*env)->SetByteArrayRegion(env, jbsdata, 0, bsdatasz, (jbyte*)bsdata);
+                jobject bson = (*env)->CallStaticObjectMethod(env, jBSONClazz, decodeMethodID, jbsdata);
+
+                (*env)->DeleteLocalRef(env, jbsdata);
+
+                return bson;
+ };
+
+ /*
+ * Class:     org_ejdb_driver_EJDBResultSet
+ * Method:    lengthDB
+ * Signature: ()I
+ */
+ JNIEXPORT jint JNICALL Java_org_ejdb_driver_EJDBResultSet_lengthDB
+        (JNIEnv *env, jobject obj) {
+                jclass clazz = (*env)->GetObjectClass(env, obj);
+                jfieldID rspID = (*env)->GetFieldID(env, clazz, "rsPointer", "J");
+                jlong rsp = (*env)->GetLongField(env, obj, rspID);
+
+                TCLIST *rs = (TCLIST *)rsp;
+
+                if (!rs) {
+                        return 0;
+                }
+
+                return TCLISTNUM(rs);
+ };
+
+ /*
+ * Class:     org_ejdb_driver_EJDBResultSet
+ * Method:    closeDB
+ * Signature: ()V
+ */
+ JNIEXPORT void JNICALL Java_org_ejdb_driver_EJDBResultSet_closeDB
+        (JNIEnv *env, jobject obj) {
+                jclass clazz = (*env)->GetObjectClass(env, obj);
+                jfieldID rspID = (*env)->GetFieldID(env, clazz, "rsPointer", "J");
+                jlong rsp = (*env)->GetLongField(env, obj, rspID);
+
+                TCLIST *rs = (TCLIST *)rsp;
+
+                if (!rs) {
+                        return;
+                }
+
+                tclistdel(rs);
+
+                (*env)->SetLongField(env, obj, rspID, (jlong)0);
+ };
index a2692d3..a12d797 100755 (executable)
@@ -10,6 +10,7 @@
 #include "org_ejdb_driver_EJDB.h"
 #include "org_ejdb_driver_EJDBCollection.h"
 #include "org_ejdb_driver_EJDBQuery.h"
+#include "org_ejdb_driver_EJDBQuery_QResult.h"
 #include "org_ejdb_driver_EJDBResultSet.h"
 
 #endif
\ No newline at end of file
old mode 100644 (file)
new mode 100755 (executable)
index 8017d0a..7f51709
@@ -7,6 +7,30 @@
 #ifdef __cplusplus
 extern "C" {
 #endif
+/*
+ * Class:     org_ejdb_driver_EJDBResultSet
+ * Method:    getDB
+ * Signature: (I)Lorg/bson/BSONObject;
+ */
+JNIEXPORT jobject JNICALL Java_org_ejdb_driver_EJDBResultSet_getDB
+  (JNIEnv *, jobject, jint);
+
+/*
+ * Class:     org_ejdb_driver_EJDBResultSet
+ * Method:    lengthDB
+ * Signature: ()I
+ */
+JNIEXPORT jint JNICALL Java_org_ejdb_driver_EJDBResultSet_lengthDB
+  (JNIEnv *, jobject);
+
+/*
+ * Class:     org_ejdb_driver_EJDBResultSet
+ * Method:    closeDB
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL Java_org_ejdb_driver_EJDBResultSet_closeDB
+  (JNIEnv *, jobject);
+
 #ifdef __cplusplus
 }
 #endif
index 1c900c2..fb04a6d 100644 (file)
@@ -1,8 +1,68 @@
 package org.ejdb;
 
+import org.bson.BSONObject;
+import org.bson.BasicBSONObject;
+import org.ejdb.driver.EJDB;
+import org.ejdb.driver.EJDBCollection;
+import org.ejdb.driver.EJDBQuery;
+import org.ejdb.driver.EJDBResultSet;
+
+import java.util.Random;
+
 /**
  * @author Tyutyunkov Vyacheslav (tve@softmotions.com)
  * @version $Id$
  */
 public class Test2 {
+    public static int INDEX = -1;
+
+    public static final int TEST_COUNT = 15;
+    public static final Random random = new Random(System.currentTimeMillis());
+
+    public static void main(String[] args) {
+        EJDB db = new EJDB();
+
+        try {
+            db.open("test5");
+            System.out.println("test ELDB opened");
+
+            EJDBCollection test = db.getCollection("test");
+
+            test.drop(true);
+            System.out.println("test collection dropped");
+            test.ensureExists();
+            System.out.println("test collection created");
+
+            for (int i = 0; i < TEST_COUNT; ++i) {
+                test.save(getTestObject());
+            }
+
+            System.out.println("test objects saved");
+
+            test.sync();
+            System.out.println("test collection synced");
+
+            EJDBResultSet rs = test.createQuery(new BasicBSONObject(), null, null, 0).execute();
+            for (BSONObject r : rs) {
+                System.out.println(r);
+            }
+//            test.createQuery(new BasicBSONObject("index", new BasicBSONObject("$lt", 5)), null, null, EJDBQuery.JBQRYCOUNT).execute();
+
+        } finally {
+            db.close();
+        }
+    }
+
+    private static BSONObject getTestObject() {
+        BSONObject bsonObject = new BasicBSONObject();
+
+        ++INDEX;
+
+        bsonObject.put("name", "Object#" + INDEX);
+        bsonObject.put("time", System.currentTimeMillis());
+        bsonObject.put("index", INDEX);
+        bsonObject.put("random", random.nextLong());
+
+        return bsonObject;
+    }
 }
index 0b7c608..4aca840 100644 (file)
@@ -26,19 +26,20 @@ public class EJDBQuery {
         this.flags = flags;
     }
 
-    public void execute() {
+    // TODO
+    public EJDBResultSet execute() {
         QResult qResult = this.executeDB(query, qors, hints, flags);
-        // TODO: create EJDBResultSet from QResult
+        return qResult != null ? new EJDBResultSet(qResult.rsPointer) : null;
     }
 
 
     protected native QResult executeDB(BSONObject query, BSONObject[] qors, BSONObject hints, int flags);
 
     private static class QResult {
-        private long count;
+        private int count;
         private long rsPointer;
 
-        private QResult(long count, long rsPointer) {
+        private QResult(int count, long rsPointer) {
             this.count = count;
             this.rsPointer = rsPointer;
         }
index 985d839..4756039 100644 (file)
@@ -1,10 +1,56 @@
 package org.ejdb.driver;
 
+import org.bson.BSONObject;
+
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
 /**
  * @author Tyutyunkov Vyacheslav (tve@softmotions.com)
  * @version $Id$
  */
-public class EJDBResultSet {
-    // todo:
+public class EJDBResultSet implements Iterable<BSONObject>, Iterator<BSONObject> {
+    private long rsPointer;
+
+    private int position;
+
+    EJDBResultSet(long rsPointer) {
+        this.rsPointer = rsPointer;
+
+        this.position = 0;
+    }
+
+    protected native BSONObject getDB(int position);
+    protected native int lengthDB();
+    protected native void closeDB();
+
+    public Iterator<BSONObject> iterator() {
+        return this;
+    }
+
+    public boolean hasNext() {
+        return position < this.lengthDB();
+    }
+
+    public BSONObject next() {
+        if (!hasNext()) {
+            throw new NoSuchElementException();
+        }
+
+        return getDB(position++);
+    }
+
+    public void remove() {
+        throw new UnsupportedOperationException();
+    }
+
+    public void close() {
+        this.closeDB();
+    }
 
+    @Override
+    protected void finalize() throws Throwable {
+        this.close();
+        super.finalize();
+    }
 }