configlib/dbmsjdbc/src/native/DbmsResultSet.cpp
changeset 1 b538b70cbe51
--- /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);
+}