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;
}
}
- qresult = (*env)->NewObject(env, jQResultClazz, initQResultMethodID, (jlong)count, (jlong)qres);
+ qresult = (*env)->NewObject(env, jQResultClazz, initQResultMethodID, (jint)count, (jlong)qres);
finish:
// clear
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);
+ };
#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
#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
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;
+ }
}
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;
}
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();
+ }
}