</junit>
</target>
- <target name="compile.headers" depends="compile.production" description="Build JNI headers for JEJDB" if="build.native.headers">
- <javah destdir="${source.native.dir}">
+ <target name="compile.headers" depends="compile.production" if="build.native.headers">
+ <javah destdir="${source.native.dir}" verbose="true">
<class name="org.ejdb.driver.EJDB"/>
<class name="org.ejdb.driver.EJDBCollection"/>
<class name="org.ejdb.driver.EJDBQuery"/>
<delete dir="${distr.home}"/>
</target>
- <target name="build.native.headers" depends="clean">
+ <target name="build.native.headers" depends="clean" description="Build JNI headers for JEJDB">
<property name="build.native.headers" value="true"/>
<ant target="compile" inheritall="true" inheritrefs="true"/>
</target>
};
/*
-* Class: org_ejdb_driver_EJDBResultSet
-* Method: get
-* Signature: (I)Lorg/ejdb/bson/BSONObject;
-*/
-JNIEXPORT jobject JNICALL Java_org_ejdb_driver_EJDBResultSet_get (JNIEnv *env, jobject obj, jint indx) {
+ * Class: org_ejdb_driver_EJDBResultSet
+ * Method: _get
+ * Signature: (I)Lorg/ejdb/bson/BSONObject;
+ */
+JNIEXPORT jobject JNICALL Java_org_ejdb_driver_EJDBResultSet__1get (JNIEnv *env, jobject obj, jint indx) {
TCLIST *rs = get_rs_from_object(env, obj);
if (!rs) {
/*
* Class: org_ejdb_driver_EJDBCollection
* Method: load
- * Signature: (Lorg/bson/types/ObjectId;)Lorg/bson/BSONObject;
+ * Signature: (Lorg/ejdb/bson/types/ObjectId;)Lorg/ejdb/bson/BSONObject;
*/
JNIEXPORT jobject JNICALL Java_org_ejdb_driver_EJDBCollection_load
(JNIEnv *, jobject, jobject);
/*
* Class: org_ejdb_driver_EJDBCollection
* Method: save
- * Signature: (Lorg/bson/BSONObject;)Lorg/bson/types/ObjectId;
+ * Signature: (Lorg/ejdb/bson/BSONObject;)Lorg/ejdb/bson/types/ObjectId;
*/
JNIEXPORT jobject JNICALL Java_org_ejdb_driver_EJDBCollection_save
(JNIEnv *, jobject, jobject);
/*
* Class: org_ejdb_driver_EJDBCollection
* Method: remove
- * Signature: (Lorg/bson/types/ObjectId;)V
+ * Signature: (Lorg/ejdb/bson/types/ObjectId;)V
*/
JNIEXPORT void JNICALL Java_org_ejdb_driver_EJDBCollection_remove
(JNIEnv *, jobject, jobject);
/*
* Class: org_ejdb_driver_EJDBQuery
* Method: execute
- * Signature: (Lorg/bson/BSONObject;[Lorg/bson/BSONObject;Lorg/bson/BSONObject;ILjava/io/OutputStream;)Lorg/ejdb/driver/EJDBQuery$QResult;
+ * Signature: (Lorg/ejdb/bson/BSONObject;[Lorg/ejdb/bson/BSONObject;Lorg/ejdb/bson/BSONObject;ILjava/io/OutputStream;)Lorg/ejdb/driver/EJDBQuery$QResult;
*/
JNIEXPORT jobject JNICALL Java_org_ejdb_driver_EJDBQuery_execute
(JNIEnv *, jobject, jobject, jobjectArray, jobject, jint, jobject);
#endif
/*
* Class: org_ejdb_driver_EJDBResultSet
- * Method: get
- * Signature: (I)Lorg/bson/BSONObject;
+ * Method: _get
+ * Signature: (I)Lorg/ejdb/bson/BSONObject;
*/
-JNIEXPORT jobject JNICALL Java_org_ejdb_driver_EJDBResultSet_get
+JNIEXPORT jobject JNICALL Java_org_ejdb_driver_EJDBResultSet__1get
(JNIEnv *, jobject, jint);
/*
import org.ejdb.bson.BSONObject;
+import java.io.Closeable;
+import java.lang.ref.WeakReference;
+import java.util.HashMap;
import java.util.Iterator;
+import java.util.Map;
import java.util.NoSuchElementException;
/**
* @author Tyutyunkov Vyacheslav (tve@softmotions.com)
* @version $Id$
*/
-public class EJDBResultSet implements Iterable<BSONObject>, Iterator<BSONObject> {
+public class EJDBResultSet implements Iterable<BSONObject>, Iterator<BSONObject>, Closeable {
private transient long rsPointer;
+ private transient Map<Integer, WeakReference<BSONObject>> cache;
private int position;
+ {
+ cache = new HashMap<Integer, WeakReference<BSONObject>>();
+ }
+
EJDBResultSet(long rsPointer) {
this.rsPointer = rsPointer;
/**
* Returns object by position
*/
- public native BSONObject get(int position) throws EJDBException;
+ protected native BSONObject _get(int position) throws EJDBException;
+
+ /**
+ * Returns object by position
+ */
+ public BSONObject get(int position) throws EJDBException {
+ BSONObject obj;
+ WeakReference<BSONObject> wr;
+ if (cache.containsKey(position) && (wr = cache.get(position)).get() != null) {
+ obj = wr.get();
+ } else {
+ obj = _get(position);
+ cache.put(position, new WeakReference<BSONObject>(obj));
+ }
+
+ return obj;
+ }
/**
* Returns objects count in result set
* {@inheritDoc}
*/
public Iterator<BSONObject> iterator() {
- return this;
+ return new Iterator<BSONObject>() {
+ private int pos = 0;
+
+ public boolean hasNext() {
+ return pos < EJDBResultSet.this.length();
+ }
+
+ public BSONObject next() {
+ if (!hasNext()) {
+ throw new NoSuchElementException();
+ }
+ return get(pos++);
+ }
+
+ public void remove() {
+ throw new UnsupportedOperationException();
+ }
+ };
}
/**
}
/**
- * Close result set
+ * {@inheritDoc}
*/
public native void close() throws EJDBException;