summaryrefslogtreecommitdiff
path: root/lang
diff options
context:
space:
mode:
authorDon Anderson <dda@ddanderson.com>2016-04-19 10:47:53 -0400
committerDon Anderson <dda@ddanderson.com>2016-04-19 10:47:53 -0400
commit03cc34056e978931bb0949d3a799ea173b1be075 (patch)
tree3484df57406a54cbe8991029d93d3e37925882bb /lang
parent68c5dc70e1e94108241fec33bc23ceca3978a7cc (diff)
downloadmongo-03cc34056e978931bb0949d3a799ea173b1be075.tar.gz
WT-2550 Support raw mode cursors in java, which can only be accessed via
getByteArray calls.
Diffstat (limited to 'lang')
-rw-r--r--lang/java/src/com/wiredtiger/db/PackFormatInputStream.java7
-rw-r--r--lang/java/src/com/wiredtiger/db/PackInputStream.java26
-rw-r--r--lang/java/src/com/wiredtiger/db/PackOutputStream.java2
-rw-r--r--lang/java/wiredtiger.i36
4 files changed, 55 insertions, 16 deletions
diff --git a/lang/java/src/com/wiredtiger/db/PackFormatInputStream.java b/lang/java/src/com/wiredtiger/db/PackFormatInputStream.java
index 02639bfe77a..4f05e153607 100644
--- a/lang/java/src/com/wiredtiger/db/PackFormatInputStream.java
+++ b/lang/java/src/com/wiredtiger/db/PackFormatInputStream.java
@@ -40,6 +40,7 @@ import com.wiredtiger.db.WiredTigerPackingException;
public class PackFormatInputStream {
protected String format;
+ protected boolean isRaw;
protected int formatOff;
protected int formatRepeatCount;
@@ -48,8 +49,9 @@ public class PackFormatInputStream {
*
* \param format the encoded format backing string.
*/
- protected PackFormatInputStream(String format) {
+ protected PackFormatInputStream(String format, boolean isRaw) {
this.format = format;
+ this.isRaw = isRaw;
formatOff = 0;
formatRepeatCount = 0;
}
@@ -114,6 +116,9 @@ public class PackFormatInputStream {
throws WiredTigerPackingException {
char expected = getType();
+ if (isRaw)
+ throw new WiredTigerPackingException(
+ "Format mismatch for raw mode");
if (Character.toLowerCase(expected) != Character.toLowerCase(asking))
throw new WiredTigerPackingException(
"Format mismatch. Wanted: " + asking + ", got: " + expected);
diff --git a/lang/java/src/com/wiredtiger/db/PackInputStream.java b/lang/java/src/com/wiredtiger/db/PackInputStream.java
index f265d041d94..29cd87e24d8 100644
--- a/lang/java/src/com/wiredtiger/db/PackInputStream.java
+++ b/lang/java/src/com/wiredtiger/db/PackInputStream.java
@@ -43,6 +43,7 @@ public class PackInputStream {
protected byte[] value;
protected int valueOff;
protected int valueLen;
+ protected boolean isRaw;
/**
* Constructor.
@@ -50,9 +51,10 @@ public class PackInputStream {
* \param format A String that contains the WiredTiger format that
* defines the layout of this packed value.
* \param value The raw bytes that back the stream.
+ * \param isRaw The stream is opened raw.
*/
- public PackInputStream(String format, byte[] value) {
- this(format, value, 0, value.length);
+ public PackInputStream(String format, byte[] value, boolean isRaw) {
+ this(format, value, isRaw, 0, value.length);
}
/**
@@ -61,14 +63,17 @@ public class PackInputStream {
* \param format A String that contains the WiredTiger format that
* defines the layout of this packed value.
* \param value The raw bytes that back the stream.
+ * \param isRaw The stream is opened raw.
* \param off Offset into the value array at which the stream begins.
* \param len Length of the value array that forms the stream.
*/
- public PackInputStream(String format, byte[] value, int off, int len) {
- this.format = new PackFormatInputStream(format);
+ public PackInputStream(
+ String format, byte[] value, boolean isRaw, int off, int len) {
+ this.format = new PackFormatInputStream(format, isRaw);
this.value = value;
this.valueOff = off;
this.valueLen = len;
+ this.isRaw = isRaw;
}
/**
@@ -117,7 +122,9 @@ public class PackInputStream {
*/
public void getByteArray(byte[] dest, int off, int len)
throws WiredTigerPackingException {
- format.checkType('U', false);
+ if (!isRaw) {
+ format.checkType('U', false);
+ }
getByteArrayInternal(getByteArrayLength(), dest, off, len);
}
@@ -127,7 +134,9 @@ public class PackInputStream {
*/
public byte[] getByteArray()
throws WiredTigerPackingException {
- format.checkType('U', false);
+ if (!isRaw) {
+ format.checkType('U', false);
+ }
int itemLen = getByteArrayLength();
byte[] unpacked = new byte[itemLen];
getByteArrayInternal(itemLen, unpacked, 0, itemLen);
@@ -142,7 +151,10 @@ public class PackInputStream {
throws WiredTigerPackingException {
int itemLen = 0;
- if (format.hasLength()) {
+ if (isRaw) {
+ // The rest of the buffer is a byte array.
+ itemLen = valueLen - valueOff;
+ } else if (format.hasLength()) {
// If the format has a length, it's always used.
itemLen = format.getLengthFromFormat(true);
} else if (format.getType() == 'U') {
diff --git a/lang/java/src/com/wiredtiger/db/PackOutputStream.java b/lang/java/src/com/wiredtiger/db/PackOutputStream.java
index 805e34f6ca8..46b3aef0974 100644
--- a/lang/java/src/com/wiredtiger/db/PackOutputStream.java
+++ b/lang/java/src/com/wiredtiger/db/PackOutputStream.java
@@ -50,7 +50,7 @@ public class PackOutputStream {
* defines the layout of this packed value.
*/
public PackOutputStream(String format) {
- this.format = new PackFormatInputStream(format);
+ this.format = new PackFormatInputStream(format, false);
intBuf = new byte[MAX_INT_BYTES];
packed = new ByteArrayOutputStream(100);
}
diff --git a/lang/java/wiredtiger.i b/lang/java/wiredtiger.i
index ce013a1939c..b03147018e5 100644
--- a/lang/java/wiredtiger.i
+++ b/lang/java/wiredtiger.i
@@ -80,6 +80,7 @@ typedef struct {
JavaVM *javavm; /* Used in async threads to craft a jnienv */
JNIEnv *jnienv; /* jni env that created the Session/Cursor */
WT_SESSION_IMPL *session; /* session used for alloc/free */
+ bool cursor_raw; /* is the cursor opened raw? */
jobject jobj; /* the java Session/Cursor/AsyncOp object */
jobject jcallback; /* callback object for async ops */
jfieldID cptr_fid; /* cached Cursor.swigCPtr field id in session */
@@ -576,6 +577,13 @@ WT_ASYNC_CALLBACK javaApiAsyncHandler = {javaAsyncHandler};
return $self->update($self);
}
+ %javamethodmodifiers is_raw "protected";
+ bool is_raw(JNIEnv *jenv) {
+ (void)jenv;
+ JAVA_CALLBACK *jcb = (JAVA_CALLBACK *)$self->c.lang_private;
+ return jcb->cursor_raw;
+ }
+
%javamethodmodifiers java_init "protected";
int java_init(jobject jasyncop) {
JAVA_CALLBACK *jcb =
@@ -1090,7 +1098,8 @@ WT_ASYNC_CALLBACK javaApiAsyncHandler = {javaAsyncHandler};
throws WiredTigerPackingException {
if (keyUnpacker == null)
keyUnpacker =
- new PackInputStream(keyFormat, get_key_wrap());
+ new PackInputStream(keyFormat, get_key_wrap(),
+ is_raw());
return keyUnpacker;
}
@@ -1103,7 +1112,8 @@ WT_ASYNC_CALLBACK javaApiAsyncHandler = {javaAsyncHandler};
throws WiredTigerPackingException {
if (valueUnpacker == null)
valueUnpacker =
- new PackInputStream(valueFormat, get_value_wrap());
+ new PackInputStream(valueFormat, get_value_wrap(),
+ is_raw());
return valueUnpacker;
}
@@ -1175,6 +1185,7 @@ WT_ASYNC_CALLBACK javaApiAsyncHandler = {javaAsyncHandler};
return $self->update($self);
}
+ %javamethodmodifiers compare_wrap "protected";
int compare_wrap(JNIEnv *jenv, WT_CURSOR *other) {
int cmp, ret = $self->compare($self, other, &cmp);
if (ret != 0)
@@ -1182,6 +1193,7 @@ WT_ASYNC_CALLBACK javaApiAsyncHandler = {javaAsyncHandler};
return cmp;
}
+ %javamethodmodifiers equals_wrap "protected";
int equals_wrap(JNIEnv *jenv, WT_CURSOR *other) {
int cmp, ret = $self->equals($self, other, &cmp);
if (ret != 0)
@@ -1189,6 +1201,13 @@ WT_ASYNC_CALLBACK javaApiAsyncHandler = {javaAsyncHandler};
return cmp;
}
+ %javamethodmodifiers is_raw "protected";
+ bool is_raw(JNIEnv *jenv) {
+ (void)jenv;
+ JAVA_CALLBACK *jcb = (JAVA_CALLBACK *)$self->lang_private;
+ return jcb->cursor_raw;
+ }
+
%javamethodmodifiers java_init "protected";
int java_init(jobject jcursor) {
JAVA_CALLBACK *jcb = (JAVA_CALLBACK *)$self->lang_private;
@@ -1773,7 +1792,8 @@ WT_ASYNC_CALLBACK javaApiAsyncHandler = {javaAsyncHandler};
if (!success || keyFormat.equals(""))
return null;
else
- return new PackInputStream(keyFormat, get_key_wrap());
+ return new PackInputStream(keyFormat,
+ get_key_wrap(), is_raw());
}
/**
@@ -1789,7 +1809,7 @@ WT_ASYNC_CALLBACK javaApiAsyncHandler = {javaAsyncHandler};
return null;
else
return new PackInputStream(valueFormat,
- get_value_wrap());
+ get_value_wrap(), is_raw());
}
%}
@@ -1996,13 +2016,15 @@ err: if (ret != 0)
if ((ret = $self->open_cursor($self, uri, to_dup, config, &cursor)) != 0)
goto err;
- if ((cursor->flags & WT_CURSTD_DUMP_JSON) == 0)
- cursor->flags |= WT_CURSTD_RAW;
-
if ((ret = __wt_calloc_def((WT_SESSION_IMPL *)cursor->session,
1, &jcb)) != 0)
goto err;
+ if ((cursor->flags & WT_CURSTD_RAW) != 0)
+ jcb->cursor_raw = true;
+ if ((cursor->flags & WT_CURSTD_DUMP_JSON) == 0)
+ cursor->flags |= WT_CURSTD_RAW;
+
jcb->jnienv = jenv;
jcb->session = (WT_SESSION_IMPL *)cursor->session;
cursor->lang_private = jcb;