--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/configlib/dbmsjdbc/src/native/DbmsResultSet.cpp Thu Mar 11 18:20:56 2010 +0200
@@ -0,0 +1,576 @@
+// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include <jni.h>
+#include "DbmsResultSet.h"
+#include "DbmsStatement.h"
+#include "DbmsConnection.h"
+#include "Utils.h"
+#include "dbmsjni/com_symbian_dbms_jdbc_DbmsResultSet.h"
+
+
+// //
+// DbmsResultSet peer
+// //
+
+DbmsResultSet::DbmsResultSet(DbmsStatement* aStatement){
+ iStatement = aStatement;
+}
+
+DbmsResultSet::~DbmsResultSet(){
+}
+
+
+// //
+// JNI
+// //
+
+/*
+ * Class: com_symbian_dbms_jdbc_DbmsResultSet
+ * Method: _rowcount
+ * Signature: (I)I
+ */
+JNIEXPORT jint JNICALL Java_com_symbian_dbms_jdbc_DbmsResultSet__1rowcount
+ (JNIEnv *, jobject, jint aPeerHandle) {
+ DbmsResultSet* rset = (DbmsResultSet*) aPeerHandle;
+ RDbView& view = rset->iStatement->iView;
+ jint res = 0;
+ TRAPD(err, res = view.CountL() );
+ if ( err != KErrNone ) {
+ return err;
+ }
+ return res;
+}
+
+/*
+ * Class: com_symbian_dbms_jdbc_DbmsResultSet
+ * Method: _colcount
+ * Signature: (I)I
+ */
+JNIEXPORT jint JNICALL Java_com_symbian_dbms_jdbc_DbmsResultSet__1colcount
+ (JNIEnv *, jobject, jint aPeerHandle) {
+ DbmsResultSet* rset = (DbmsResultSet*) aPeerHandle;
+ RDbView& view = rset->iStatement->iView;
+ return view.ColCount();
+}
+
+/*
+ * Class: com_symbian_dbms_jdbc_DbmsResultSet
+ * Method: _next
+ * Signature: (II)Z
+ */
+JNIEXPORT jboolean JNICALL Java_com_symbian_dbms_jdbc_DbmsResultSet__1next
+ (JNIEnv *, jobject, jint aPeerHandle, jint aCount) {
+ DbmsResultSet* rset = (DbmsResultSet*) aPeerHandle;
+ RDbView& view = rset->iStatement->iView;
+ TBool res = EFalse;
+ TInt err = 0;
+ for ( TInt i = 0; i < aCount ; i++ )
+ {
+ TRAP( err, res = view.NextL() );
+ if ( err != KErrNone || ! res )
+ {
+ return false;
+ }
+ }
+ TRAP(err, view.GetL());
+ if ( err != KErrNone ) {
+ return false;
+ }
+ return true;
+}
+
+/*
+ * Class: com_symbian_dbms_jdbc_DbmsResultSet
+ * Method: _first
+ * Signature: (I)Z
+ */
+JNIEXPORT jboolean JNICALL Java_com_symbian_dbms_jdbc_DbmsResultSet__1first
+ (JNIEnv *, jobject, jint aPeerHandle){
+ DbmsResultSet* rset = (DbmsResultSet*) aPeerHandle;
+ RDbView& view = rset->iStatement->iView;
+ TBool res = EFalse;
+ TInt err = 0;
+ TRAP(err, res = view.FirstL());
+ if ( err != KErrNone ) {
+ return false;
+ }
+ if ( res ) {
+ TRAP(err, view.GetL());
+ if ( err != KErrNone ) {
+ return false;
+ }
+ return true;
+ }
+ return false;
+}
+
+/*
+ * Class: com_symbian_dbms_jdbc_DbmsResultSet
+ * Method: _last
+ * Signature: (I)Z
+ */
+JNIEXPORT jboolean JNICALL Java_com_symbian_dbms_jdbc_DbmsResultSet__1last
+ (JNIEnv *, jobject, jint aPeerHandle) {
+ DbmsResultSet* rset = (DbmsResultSet*) aPeerHandle;
+ RDbView& view = rset->iStatement->iView;
+ TBool res = EFalse;
+ TInt err = 0;
+ TRAP(err, res = view.LastL());
+ if ( res ) {
+ TRAP(err, view.GetL());
+ if ( err != KErrNone ) {
+ return false;
+ }
+ return true;
+ }
+ return false;
+}
+
+/*
+ * Class: com_symbian_dbms_jdbc_DbmsResultSet
+ * Method: _prev
+ * Signature: (II)Z
+ */
+JNIEXPORT jboolean JNICALL Java_com_symbian_dbms_jdbc_DbmsResultSet__1prev
+ (JNIEnv *, jobject, jint aPeerHandle, jint aCount) {
+ DbmsResultSet* rset = (DbmsResultSet*) aPeerHandle;
+ RDbView& view = rset->iStatement->iView;
+ TBool res = EFalse;
+ TInt err = 0;
+ for ( TInt i = 0; i < aCount ; i++ )
+ {
+ TRAP( err, res = view.PreviousL() );
+ if ( err != KErrNone || ! res )
+ {
+ return false;
+ }
+ }
+ TRAP(err, view.GetL());
+ if ( err != KErrNone ) {
+ return false;
+ }
+ return true;
+}
+
+/*
+ * Class: com_symbian_dbms_jdbc_DbmsResultSet
+ * Method: _close
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL Java_com_symbian_dbms_jdbc_DbmsResultSet__1close
+ (JNIEnv *, jobject, jint aPeerHandle) {
+ DbmsResultSet* rset = (DbmsResultSet*) aPeerHandle;
+ RDbView& view = rset->iStatement->iView;
+ view.Close();
+ delete rset;
+}
+
+/*
+ * Class: com_symbian_dbms_jdbc_DbmsResultSet
+ * Method: delete
+ * Signature: (I)Z
+ */
+JNIEXPORT jboolean JNICALL Java_com_symbian_dbms_jdbc_DbmsResultSet__1delete
+ (JNIEnv *, jobject, jint /*aPeerHandle*/) {
+ // not implemented
+ return false;
+}
+
+/*
+ * Class: com_symbian_dbms_jdbc_DbmsResultSet
+ * Method: _isSigned
+ * Signature: (II)I
+ */
+JNIEXPORT jint JNICALL Java_com_symbian_dbms_jdbc_DbmsResultSet__1isSigned
+ (JNIEnv *, jobject, jint aPeerHandle, jint aColNo) {
+ DbmsResultSet* rset = (DbmsResultSet*) aPeerHandle;
+ RDbView& view = rset->iStatement->iView;
+ TDbColType type = view.ColType(aColNo);
+ switch ( type ) {
+ case EDbColInt8 :
+ case EDbColInt16 :
+ case EDbColInt32 :
+ case EDbColInt64 :
+ case EDbColReal32:
+ case EDbColReal64:
+ {
+ return 1;
+ }break;
+ default:
+ return 0;
+ }
+}
+
+/*
+ * Class: com_symbian_dbms_jdbc_DbmsResultSet
+ * Method: _isFirst
+ * Signature: (I)I
+ */
+JNIEXPORT jint JNICALL Java_com_symbian_dbms_jdbc_DbmsResultSet__1isFirst
+ (JNIEnv *, jobject, jint aPeerHandle) {
+ DbmsResultSet* rset = (DbmsResultSet*) aPeerHandle;
+ RDbView& view = rset->iStatement->iView;
+ return view.AtBeginning();
+}
+
+/*
+ * Class: com_symbian_dbms_jdbc_DbmsResultSet
+ * Method: _isLast
+ * Signature: (I)I
+ */
+JNIEXPORT jint JNICALL Java_com_symbian_dbms_jdbc_DbmsResultSet__1isLast
+ (JNIEnv *, jobject, jint aPeerHandle){
+ DbmsResultSet* rset = (DbmsResultSet*) aPeerHandle;
+ RDbView& view = rset->iStatement->iView;
+ return view.AtEnd();
+}
+
+/*
+ * Class: com_symbian_dbms_jdbc_DbmsResultSet
+ * Method: _isAutoIncrement
+ * Signature: (II)I
+ */
+JNIEXPORT jint JNICALL Java_com_symbian_dbms_jdbc_DbmsResultSet__1isAutoIncrement
+ (JNIEnv *, jobject, jint aPeerHandle, jint aColumn) {
+ DbmsResultSet* rset = (DbmsResultSet*) aPeerHandle;
+ RDbView& view = rset->iStatement->iView;
+ TDbCol col = view.ColDef(aColumn);
+ if ( col.iAttributes & TDbCol::EAutoIncrement ) {
+ return 1; // Auto increment
+ } else {
+ return 0; // Not auto increment
+ }
+}
+
+/*
+ * Class: com_symbian_dbms_jdbc_DbmsResultSet
+ * Method: _isNullable
+ * Signature: (II)I
+ */
+JNIEXPORT jint JNICALL Java_com_symbian_dbms_jdbc_DbmsResultSet__1isNullable
+ (JNIEnv *, jobject, jint aPeerHandle, jint aColumn) {
+ DbmsResultSet* rset = (DbmsResultSet*) aPeerHandle;
+ RDbView& view = rset->iStatement->iView;
+ TDbCol col = view.ColDef(aColumn);
+ if ( col.iAttributes & TDbCol::ENotNull ) {
+ return 1; // Nullable
+ } else {
+ return 0; // Not nullable
+ }
+}
+
+/*
+ * Class: com_symbian_dbms_jdbc_DbmsResultSet
+ * Method: _columnNames
+ * Signature: (I[Ljava/lang/String;)I
+ */
+JNIEXPORT jint JNICALL Java_com_symbian_dbms_jdbc_DbmsResultSet__1columnNames
+ (JNIEnv *aEnv, jobject, jint aPeerHandle, jobjectArray aNames) {
+ DbmsResultSet* rset = (DbmsResultSet*) aPeerHandle;
+ RDbView& view = rset->iStatement->iView;
+ TInt colCount = view.ColCount();
+ for( TInt i = 0 ; i < colCount ; i++ ) {
+ TDbCol col = view.ColDef(i+1);
+ jstring colName = CreateJavaString(aEnv,col.iName);
+ aEnv->SetObjectArrayElement(aNames, i, colName);
+ }
+ return 0;
+}
+
+
+/*
+ * Class: com_symbian_dbms_jdbc_DbmsResultSet
+ * Method: _coltypes
+ * Signature: (I[I)I
+ */
+JNIEXPORT jint JNICALL Java_com_symbian_dbms_jdbc_DbmsResultSet__1columnTypes
+ (JNIEnv *aEnv, jobject, jint aPeerHandle, jintArray aTypes) {
+ DbmsResultSet* rset = (DbmsResultSet*) aPeerHandle;
+ RDbView& view = rset->iStatement->iView;
+ TInt colCount = view.ColCount();
+ for( TInt i = 0 ; i < colCount ; i++ ) {
+ TDbCol col = view.ColDef(i+1);
+ jint colType = col.iType;
+ aEnv->SetIntArrayRegion(aTypes,i,1,&colType);
+ }
+ return 0;
+}
+
+
+/*
+ * Class: com_symbian_dbms_jdbc_DbmsResultSet
+ * Method: _getBoolean
+ * Signature: (I)Z
+ */
+JNIEXPORT jboolean JNICALL Java_com_symbian_dbms_jdbc_DbmsResultSet__1getBoolean
+ (JNIEnv *, jobject, jint aPeerHandle, jint aColIndex) {
+ DbmsResultSet* rset = (DbmsResultSet*) aPeerHandle;
+ RDbView& view = rset->iStatement->iView;
+ TInt val = view.ColUint8(aColIndex);
+ if ( val == 0 ) {
+ return false;
+ } else {
+ return true;
+ }
+}
+
+/*
+ * Class: com_symbian_dbms_jdbc_DbmsResultSet
+ * Method: _getByte
+ * Signature: (I)B
+ */
+JNIEXPORT jbyte JNICALL Java_com_symbian_dbms_jdbc_DbmsResultSet__1getByte
+ (JNIEnv *, jobject, jint aPeerHandle, jint aColIndex){
+ DbmsResultSet* rset = (DbmsResultSet*) aPeerHandle;
+ RDbView& view = rset->iStatement->iView;
+ jbyte ret = view.ColInt8(aColIndex);
+ return ret;
+}
+
+/*
+ * Class: com_symbian_dbms_jdbc_DbmsResultSet
+ * Method: _getShort
+ * Signature: (I)S
+ */
+JNIEXPORT jshort JNICALL Java_com_symbian_dbms_jdbc_DbmsResultSet__1getShort
+ (JNIEnv *, jobject, jint aPeerHandle, jint aColIndex){
+ DbmsResultSet* rset = (DbmsResultSet*) aPeerHandle;
+ RDbView& view = rset->iStatement->iView;
+ return (jshort) view.ColInt16(aColIndex);
+}
+
+/*
+ * Class: com_symbian_dbms_jdbc_DbmsResultSet
+ * Method: _getInteger
+ * Signature: (I)I
+ */
+JNIEXPORT jint JNICALL Java_com_symbian_dbms_jdbc_DbmsResultSet__1getInteger
+ (JNIEnv *, jobject, jint aPeerHandle, jint aColIndex){
+ DbmsResultSet* rset = (DbmsResultSet*) aPeerHandle;
+ RDbView& view = rset->iStatement->iView;
+ TInt res = view.ColInt(aColIndex);
+ return (jint)res;
+}
+
+/*
+ * Class: com_symbian_dbms_jdbc_DbmsResultSet
+ * Method: _getLong
+ * Signature: (I)J
+ */
+JNIEXPORT jlong JNICALL Java_com_symbian_dbms_jdbc_DbmsResultSet__1getLong
+ (JNIEnv *, jobject, jint aPeerHandle, jint aColIndex){
+ DbmsResultSet* rset = (DbmsResultSet*) aPeerHandle;
+ RDbView& view = rset->iStatement->iView;
+ return (jlong) view.ColInt64(aColIndex);
+}
+
+/*
+ * Class: com_symbian_dbms_jdbc_DbmsResultSet
+ * Method: _getFloat
+ * Signature: (I)F
+ */
+JNIEXPORT jfloat JNICALL Java_com_symbian_dbms_jdbc_DbmsResultSet__1getFloat
+ (JNIEnv *, jobject, jint aPeerHandle, jint aColIndex){
+ DbmsResultSet* rset = (DbmsResultSet*) aPeerHandle;
+ RDbView& view = rset->iStatement->iView;
+ return (jfloat) view.ColReal32(aColIndex);
+}
+
+
+/*
+ * Class: com_symbian_dbms_jdbc_DbmsResultSet
+ * Method: _getTime
+ * Signature: (I)J
+ */
+JNIEXPORT jlong JNICALL Java_com_symbian_dbms_jdbc_DbmsResultSet__1getTime
+ (JNIEnv *aEnv, jobject, jint aPeerHandle, jint aColIndex){
+ DbmsResultSet* rset = (DbmsResultSet*) aPeerHandle;
+ RDbView& view = rset->iStatement->iView;
+ TTime stored = view.ColTime(aColIndex);
+ TInt64 time = stored.Int64();
+ // sym time (0AD) to java time (1970AD) adjustment
+ TInt64 adjustment = MAKE_TINT64(0x00dcddb3,0x0f2f8000);
+ TInt64 result = time - adjustment;
+ jlong rv = result / 1000; // convert microseconds into millisconds
+ return rv;
+}
+
+
+/*
+ * Class: com_symbian_dbms_jdbc_DbmsResultSet
+ * Method: _getText
+ * Signature: (I)Ljava/lang/String;
+ */
+JNIEXPORT jstring JNICALL Java_com_symbian_dbms_jdbc_DbmsResultSet__1getText
+ (JNIEnv *aEnv, jobject, jint aPeerHandle, jint aColIndex){
+ DbmsResultSet* rset = (DbmsResultSet*) aPeerHandle;
+ RDbView& view = rset->iStatement->iView;
+ jstring jstr = NULL;
+ // handle wide/8bit text types
+ TDbColNo colNo(aColIndex);
+ if ( view.IsColNull(colNo) ) {
+ return jstr;
+ }
+ TDbCol def = view.ColDef(aColIndex);
+ jint colType = def.iType;
+
+ if ( colType == EDbColText8) {
+ TPtrC8 tmp = view.ColDes8(aColIndex);
+ RBuf buf;
+ TInt res = buf.Create(tmp.Length());
+ if ( res != KErrNone ) {
+ ThrowExc(aEnv, res );
+ return jstr;
+ }
+ buf.Copy(tmp);
+ jstr = CreateJavaString(aEnv, buf);
+ } else if ( colType == EDbColLongText8 ) {
+ TInt blobLength = view.ColLength(aColIndex);
+ RBuf8 cbuf;
+ TInt res = cbuf.Create(blobLength);
+ if ( res != KErrNone ) {
+ ThrowExc(aEnv, res );
+ return jstr;
+ }
+
+ RDbColReadStream blob;
+ TRAP(res, blob.OpenL(view,aColIndex));
+ if ( res != KErrNone ) {
+ ThrowExc(aEnv, res );
+ cbuf.Close();
+ return jstr;
+ }
+ TRAP(res, blob.ReadL(cbuf, blobLength));
+ if ( res != KErrNone ) {
+ ThrowExc(aEnv, res );
+ cbuf.Close();
+ blob.Release();
+ blob.Close();
+ return jstr;
+ }
+ blob.Release();
+ blob.Close();
+
+ RBuf buf;
+ res = buf.Create(cbuf.Length());
+ if ( res != KErrNone ) {
+ ThrowExc(aEnv, res );
+ cbuf.Close();
+ return jstr;
+ }
+ buf.Copy(cbuf);
+ cbuf.Close();
+ jstr = CreateJavaString(aEnv, buf);
+ buf.Close();
+ } else if ( colType == EDbColLongText16 ) {
+ TInt blobLength = view.ColLength(aColIndex);
+ RBuf cbuf;
+ TInt res = cbuf.Create(blobLength);
+ if ( res != KErrNone ) {
+ ThrowExc(aEnv, res );
+ return jstr;
+ }
+
+ RDbColReadStream blob;
+ TRAP(res, blob.OpenL(view,aColIndex));
+ if ( res != KErrNone ) {
+ ThrowExc(aEnv, res );
+ cbuf.Close();
+ return jstr;
+ }
+ TRAP(res, blob.ReadL(cbuf, blobLength));
+ if ( res != KErrNone ) {
+ ThrowExc(aEnv, res );
+ cbuf.Close();
+ blob.Release();
+ blob.Close();
+ return jstr;
+ }
+ blob.Release();
+ blob.Close();
+
+ jstr = CreateJavaString(aEnv, cbuf);
+ cbuf.Close();
+ } else {
+ // 16 bit / wide string
+ TPtrC ptr = view.ColDes16(aColIndex);
+ jstr = CreateJavaString(aEnv, ptr);
+ }
+
+ return jstr;
+}
+
+/*
+ * Class: com_symbian_dbms_jdbc_DbmsResultSet
+ * Method: _getBytes
+ * Signature: (I)[B
+ */
+JNIEXPORT jbyteArray JNICALL Java_com_symbian_dbms_jdbc_DbmsResultSet__1getBytes
+ (JNIEnv *aEnv, jobject, jint aPeerHandle, jint aColIndex){
+ DbmsResultSet* rset = (DbmsResultSet*) aPeerHandle;
+ RDbView& view = rset->iStatement->iView;
+ jbyteArray array = NULL;
+ TDbColNo colNo(aColIndex);
+ if ( view.IsColNull(colNo) ) {
+ return array;
+ }
+ TDbCol col = view.ColDef(aColIndex);
+ TInt colType = col.iType;
+ TInt size = view.ColSize(aColIndex);
+ if ( colType == EDbColBinary ) {
+ TPtrC8 buf = view.ColDes8(aColIndex);
+ array = aEnv->NewByteArray(size);
+ aEnv->SetByteArrayRegion(array, 0, size, (jbyte*)buf.Ptr());
+ return array;
+ } else {
+ RDbColReadStream stream;
+ TRAPD(err, stream.OpenL(view, aColIndex));
+ if ( err != KErrNone ) {
+ ThrowExc(aEnv, err );
+ return array;
+ }
+
+ // read from stream into buffer
+ RBuf8 buf;
+ err = buf.Create(size);
+ if ( err != KErrNone ) {
+ ThrowExc(aEnv, err );
+ stream.Release();
+ stream.Close();
+ return array;
+ }
+
+ stream.ReadL(buf, size);
+ stream.Release();
+ stream.Close();
+ array = aEnv->NewByteArray(size);
+ aEnv->SetByteArrayRegion(array, 0, size, (jbyte*)buf.Ptr());
+ buf.Close();
+ return array;
+ }
+}
+
+/*
+ * Class: com_symbian_dbms_jdbc_DbmsResultSet
+ * Method: _getDouble
+ * Signature: (I)D
+ */
+JNIEXPORT jdouble JNICALL Java_com_symbian_dbms_jdbc_DbmsResultSet__1getDouble
+ (JNIEnv *, jobject, jint aPeerHandle, jint aColIndex){
+ DbmsResultSet* rset = (DbmsResultSet*) aPeerHandle;
+ RDbView& view = rset->iStatement->iView;
+ return (jdouble) view.ColReal64(aColIndex);
+}