git-svn-id: https://svn.code.sf.net/p/flaim/code/trunk@1039 0109f412-320b-0410-ab79-c3e0c5ffbbe6
1149 lines
29 KiB
C++
1149 lines
29 KiB
C++
//------------------------------------------------------------------------------
|
|
// Desc:
|
|
// Tabs: 3
|
|
//
|
|
// Copyright (c) 2006-2007 Novell, Inc. All Rights Reserved.
|
|
//
|
|
// This library is free software; you can redistribute it and/or
|
|
// modify it under the terms of the GNU Lesser General Public
|
|
// License as published by the Free Software Foundation; version 2.1
|
|
// of the License.
|
|
//
|
|
// This library is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
// Library Lesser General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU Lesser General Public
|
|
// License along with this library; if not, contact Novell, Inc.
|
|
//
|
|
// To contact Novell about this file by physical or electronic mail,
|
|
// you may find current contact information at www.novell.com.
|
|
//
|
|
// $Id$
|
|
//------------------------------------------------------------------------------
|
|
|
|
#include "xflaim_Query.h"
|
|
#include "xflaim_OptInfo.h"
|
|
#include "xflaim_ResultSetCounts.h"
|
|
#include "flaimsys.h"
|
|
#include "jniftk.h"
|
|
|
|
#define THIS_QUERY() ((F_Query *)((FLMUINT)lThis))
|
|
|
|
// Fields in the OptInfo class
|
|
|
|
static jfieldID fid_OptInfo_iOptType = NULL;
|
|
static jfieldID fid_OptInfo_iCost = NULL;
|
|
static jfieldID fid_OptInfo_lNodeId = NULL;
|
|
static jfieldID fid_OptInfo_lEndNodeId = NULL;
|
|
static jfieldID fid_OptInfo_iIxNum = NULL;
|
|
static jfieldID fid_OptInfo_sIxName = NULL;
|
|
static jfieldID fid_OptInfo_bMustVerifyPath = NULL;
|
|
static jfieldID fid_OptInfo_bDoNodeMatch = NULL;
|
|
static jfieldID fid_OptInfo_bCanCompareOnKey = NULL;
|
|
static jfieldID fid_OptInfo_lKeysRead = NULL;
|
|
static jfieldID fid_OptInfo_lKeyHadDupDoc = NULL;
|
|
static jfieldID fid_OptInfo_lKeysPassed = NULL;
|
|
static jfieldID fid_OptInfo_lNodesRead = NULL;
|
|
static jfieldID fid_OptInfo_lNodesTested = NULL;
|
|
static jfieldID fid_OptInfo_lNodesPassed = NULL;
|
|
static jfieldID fid_OptInfo_lDocsRead = NULL;
|
|
static jfieldID fid_OptInfo_lDupDocsEliminated = NULL;
|
|
static jfieldID fid_OptInfo_lNodesFailedValidation = NULL;
|
|
static jfieldID fid_OptInfo_lDocsFailedValidation = NULL;
|
|
static jfieldID fid_OptInfo_lDocsPassed = NULL;
|
|
|
|
// Fields in the ResultSetCounts class
|
|
|
|
static jfieldID fid_ResultSetCounts_iReadCount = NULL;
|
|
static jfieldID fid_ResultSetCounts_iPassedCount = NULL;
|
|
static jfieldID fid_ResultSetCounts_iPositionableToCount = NULL;
|
|
static jfieldID fid_ResultSetCounts_bDoneBuildingResultSet = NULL;
|
|
|
|
FSTATIC jobject NewOptInfo(
|
|
JNIEnv * pEnv,
|
|
XFLM_OPT_INFO * pOptInfo,
|
|
jclass jOptInfoClass);
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
JNIEXPORT void JNICALL Java_xflaim_OptInfo_initIDs(
|
|
JNIEnv * pEnv,
|
|
jclass jOptInfoClass)
|
|
{
|
|
|
|
// Get the field IDs for the fields in the class.
|
|
|
|
if ((fid_OptInfo_iOptType = pEnv->GetFieldID( jOptInfoClass,
|
|
"iOptType", "I")) == NULL)
|
|
{
|
|
goto Exit;
|
|
}
|
|
if ((fid_OptInfo_iCost = pEnv->GetFieldID( jOptInfoClass,
|
|
"iCost", "I")) == NULL)
|
|
{
|
|
goto Exit;
|
|
}
|
|
if ((fid_OptInfo_lNodeId = pEnv->GetFieldID( jOptInfoClass,
|
|
"lNodeId", "J")) == NULL)
|
|
{
|
|
goto Exit;
|
|
}
|
|
if ((fid_OptInfo_lEndNodeId = pEnv->GetFieldID( jOptInfoClass,
|
|
"lEndNodeId", "J")) == NULL)
|
|
{
|
|
goto Exit;
|
|
}
|
|
if ((fid_OptInfo_iIxNum = pEnv->GetFieldID( jOptInfoClass,
|
|
"iIxNum", "I")) == NULL)
|
|
{
|
|
goto Exit;
|
|
}
|
|
if ((fid_OptInfo_sIxName = pEnv->GetFieldID( jOptInfoClass,
|
|
"sIxName", "Ljava/lang/String;")) == NULL)
|
|
{
|
|
goto Exit;
|
|
}
|
|
if ((fid_OptInfo_bMustVerifyPath = pEnv->GetFieldID( jOptInfoClass,
|
|
"bMustVerifyPath", "Z")) == NULL)
|
|
{
|
|
goto Exit;
|
|
}
|
|
if ((fid_OptInfo_bDoNodeMatch = pEnv->GetFieldID( jOptInfoClass,
|
|
"bDoNodeMatch", "Z")) == NULL)
|
|
{
|
|
goto Exit;
|
|
}
|
|
if ((fid_OptInfo_bCanCompareOnKey = pEnv->GetFieldID( jOptInfoClass,
|
|
"bCanCompareOnKey", "Z")) == NULL)
|
|
{
|
|
goto Exit;
|
|
}
|
|
if ((fid_OptInfo_lKeysRead = pEnv->GetFieldID( jOptInfoClass,
|
|
"lKeysRead", "J")) == NULL)
|
|
{
|
|
goto Exit;
|
|
}
|
|
if ((fid_OptInfo_lKeyHadDupDoc = pEnv->GetFieldID( jOptInfoClass,
|
|
"lKeyHadDupDoc", "J")) == NULL)
|
|
{
|
|
goto Exit;
|
|
}
|
|
if ((fid_OptInfo_lKeysPassed = pEnv->GetFieldID( jOptInfoClass,
|
|
"lKeysPassed", "J")) == NULL)
|
|
{
|
|
goto Exit;
|
|
}
|
|
if ((fid_OptInfo_lNodesRead = pEnv->GetFieldID( jOptInfoClass,
|
|
"lNodesRead", "J")) == NULL)
|
|
{
|
|
goto Exit;
|
|
}
|
|
if ((fid_OptInfo_lNodesTested = pEnv->GetFieldID( jOptInfoClass,
|
|
"lNodesTested", "J")) == NULL)
|
|
{
|
|
goto Exit;
|
|
}
|
|
if ((fid_OptInfo_lNodesPassed = pEnv->GetFieldID( jOptInfoClass,
|
|
"lNodesPassed", "J")) == NULL)
|
|
{
|
|
goto Exit;
|
|
}
|
|
if ((fid_OptInfo_lDocsRead = pEnv->GetFieldID( jOptInfoClass,
|
|
"lDocsRead", "J")) == NULL)
|
|
{
|
|
goto Exit;
|
|
}
|
|
if ((fid_OptInfo_lDupDocsEliminated = pEnv->GetFieldID( jOptInfoClass,
|
|
"lDupDocsEliminated", "J")) == NULL)
|
|
{
|
|
goto Exit;
|
|
}
|
|
if ((fid_OptInfo_lNodesFailedValidation = pEnv->GetFieldID( jOptInfoClass,
|
|
"lNodesFailedValidation", "J")) == NULL)
|
|
{
|
|
goto Exit;
|
|
}
|
|
if ((fid_OptInfo_lDocsFailedValidation = pEnv->GetFieldID( jOptInfoClass,
|
|
"lDocsFailedValidation", "J")) == NULL)
|
|
{
|
|
goto Exit;
|
|
}
|
|
if ((fid_OptInfo_lDocsPassed = pEnv->GetFieldID( jOptInfoClass,
|
|
"lDocsPassed", "J")) == NULL)
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
Exit:
|
|
|
|
return;
|
|
}
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
JNIEXPORT void JNICALL Java_xflaim_ResultSetCounts_initIDs(
|
|
JNIEnv * pEnv,
|
|
jclass jResultSetCountsClass)
|
|
{
|
|
|
|
// Get the field IDs for the fields in the class.
|
|
|
|
if ((fid_ResultSetCounts_iReadCount = pEnv->GetFieldID( jResultSetCountsClass,
|
|
"iReadCount", "I")) == NULL)
|
|
{
|
|
goto Exit;
|
|
}
|
|
if ((fid_ResultSetCounts_iPassedCount = pEnv->GetFieldID( jResultSetCountsClass,
|
|
"iPassedCount", "I")) == NULL)
|
|
{
|
|
goto Exit;
|
|
}
|
|
if ((fid_ResultSetCounts_iPositionableToCount = pEnv->GetFieldID( jResultSetCountsClass,
|
|
"iPositionableToCount", "I")) == NULL)
|
|
{
|
|
goto Exit;
|
|
}
|
|
if ((fid_ResultSetCounts_bDoneBuildingResultSet = pEnv->GetFieldID( jResultSetCountsClass,
|
|
"bDoneBuildingResultSet", "Z")) == NULL)
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
Exit:
|
|
|
|
return;
|
|
}
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
JNIEXPORT void JNICALL Java_xflaim_Query__1release(
|
|
JNIEnv *, // pEnv,
|
|
jobject, // obj,
|
|
jlong lThis)
|
|
{
|
|
IF_Query * pQuery = THIS_QUERY();
|
|
|
|
if (pQuery)
|
|
{
|
|
pQuery->Release();
|
|
}
|
|
}
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
JNIEXPORT jlong JNICALL Java_xflaim_Query__1createQuery(
|
|
JNIEnv * pEnv,
|
|
jobject, // obj
|
|
jint iCollection)
|
|
{
|
|
RCODE rc = NE_XFLM_OK;
|
|
F_Query * pQuery;
|
|
|
|
if ((pQuery = f_new F_Query) == NULL)
|
|
{
|
|
rc = RC_SET( NE_XFLM_MEM);
|
|
ThrowError( rc, pEnv);
|
|
goto Exit;
|
|
}
|
|
pQuery->setCollection( (FLMUINT)iCollection);
|
|
|
|
Exit:
|
|
|
|
return( (jlong)((FLMUINT)pQuery));
|
|
}
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
JNIEXPORT void JNICALL Java_xflaim_Query__1setLanguage(
|
|
JNIEnv * pEnv,
|
|
jobject, // obj
|
|
jlong lThis,
|
|
jint iLanguage)
|
|
{
|
|
RCODE rc = NE_XFLM_OK;
|
|
IF_Query * pQuery = THIS_QUERY();
|
|
|
|
if (RC_BAD( rc = pQuery->setLanguage( (FLMUINT)iLanguage)))
|
|
{
|
|
ThrowError( rc, pEnv);
|
|
goto Exit;
|
|
}
|
|
|
|
Exit:
|
|
|
|
return;
|
|
}
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
JNIEXPORT void JNICALL Java_xflaim_Query__1setupQueryExpr(
|
|
JNIEnv * pEnv,
|
|
jobject, // obj
|
|
jlong lThis,
|
|
jlong lDbRef,
|
|
jstring sQuery)
|
|
{
|
|
RCODE rc = NE_XFLM_OK;
|
|
IF_Query * pQuery = THIS_QUERY();
|
|
IF_Db * pDb = (IF_Db *)((FLMUINT)lDbRef);
|
|
FLMBYTE ucQuery [512];
|
|
F_DynaBuf queryBuf( ucQuery, sizeof( ucQuery));
|
|
|
|
if (RC_BAD( rc = getUTF8String( pEnv, sQuery, &queryBuf)))
|
|
{
|
|
ThrowError( rc, pEnv);
|
|
goto Exit;
|
|
}
|
|
|
|
if (RC_BAD( rc = pQuery->setupQueryExpr( pDb, (const char *)queryBuf.getBufferPtr())))
|
|
{
|
|
ThrowError( rc, pEnv);
|
|
goto Exit;
|
|
}
|
|
|
|
Exit:
|
|
|
|
return;
|
|
}
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
JNIEXPORT void JNICALL Java_xflaim_Query__1copyCriteria(
|
|
JNIEnv * pEnv,
|
|
jobject, // obj
|
|
jlong lThis,
|
|
jlong lQueryToCopy)
|
|
{
|
|
RCODE rc = NE_XFLM_OK;
|
|
IF_Query * pQuery = THIS_QUERY();
|
|
IF_Query * pQueryToCopy = (IF_Query *)((FLMUINT)lQueryToCopy);
|
|
|
|
if (RC_BAD( rc = pQuery->copyCriteria( pQueryToCopy)))
|
|
{
|
|
ThrowError( rc, pEnv);
|
|
goto Exit;
|
|
}
|
|
|
|
Exit:
|
|
|
|
return;
|
|
}
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
JNIEXPORT void JNICALL Java_xflaim_Query__1addXPathComponent(
|
|
JNIEnv * pEnv,
|
|
jobject, // obj
|
|
jlong lThis,
|
|
jint iXPathAxis,
|
|
jint iNodeType,
|
|
jint iNameId)
|
|
{
|
|
RCODE rc = NE_XFLM_OK;
|
|
IF_Query * pQuery = THIS_QUERY();
|
|
|
|
if (RC_BAD( rc = pQuery->addXPathComponent( (eXPathAxisTypes)iXPathAxis,
|
|
(eDomNodeType)iNodeType, (FLMUINT)iNameId,
|
|
NULL)))
|
|
{
|
|
ThrowError( rc, pEnv);
|
|
goto Exit;
|
|
}
|
|
|
|
Exit:
|
|
|
|
return;
|
|
}
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
JNIEXPORT void JNICALL Java_xflaim_Query__1addOperator(
|
|
JNIEnv * pEnv,
|
|
jobject, // obj
|
|
jlong lThis,
|
|
jint iOperator,
|
|
jint iCompareRules)
|
|
{
|
|
RCODE rc = NE_XFLM_OK;
|
|
IF_Query * pQuery = THIS_QUERY();
|
|
|
|
if (RC_BAD( rc = pQuery->addOperator( (eQueryOperators)iOperator,
|
|
(FLMUINT)iCompareRules, NULL)))
|
|
{
|
|
ThrowError( rc, pEnv);
|
|
goto Exit;
|
|
}
|
|
|
|
Exit:
|
|
|
|
return;
|
|
}
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
JNIEXPORT void JNICALL Java_xflaim_Query__1addStringValue(
|
|
JNIEnv * pEnv,
|
|
jobject, // obj
|
|
jlong lThis,
|
|
jstring sValue)
|
|
{
|
|
RCODE rc = NE_XFLM_OK;
|
|
IF_Query * pQuery = THIS_QUERY();
|
|
FLMBYTE ucValue [256];
|
|
F_DynaBuf valueBuf( ucValue, sizeof( ucValue));
|
|
|
|
if (RC_BAD( rc = getUniString( pEnv, sValue, &valueBuf)))
|
|
{
|
|
ThrowError( rc, pEnv);
|
|
goto Exit;
|
|
}
|
|
|
|
if (RC_BAD( rc = pQuery->addUnicodeValue( valueBuf.getUnicodePtr())))
|
|
{
|
|
ThrowError( rc, pEnv);
|
|
goto Exit;
|
|
}
|
|
|
|
Exit:
|
|
|
|
return;
|
|
}
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
JNIEXPORT void JNICALL Java_xflaim_Query__1addBinaryValue(
|
|
JNIEnv * pEnv,
|
|
jobject, // obj
|
|
jlong lThis,
|
|
jbyteArray Value)
|
|
{
|
|
RCODE rc = NE_XFLM_OK;
|
|
IF_Query * pQuery = THIS_QUERY();
|
|
FLMUINT uiLength = pEnv->GetArrayLength( Value);
|
|
void * pvValue = NULL;
|
|
jboolean bIsCopy = JNI_FALSE;
|
|
|
|
if ((pvValue = pEnv->GetPrimitiveArrayCritical( Value, &bIsCopy)) == NULL)
|
|
{
|
|
rc = RC_SET( NE_XFLM_MEM);
|
|
ThrowError( rc, pEnv);
|
|
goto Exit;
|
|
}
|
|
|
|
if (RC_BAD( rc = pQuery->addBinaryValue( pvValue, uiLength)))
|
|
{
|
|
ThrowError( rc, pEnv);
|
|
goto Exit;
|
|
}
|
|
|
|
Exit:
|
|
|
|
if (pvValue)
|
|
{
|
|
pEnv->ReleasePrimitiveArrayCritical( Value, pvValue, JNI_ABORT);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
JNIEXPORT void JNICALL Java_xflaim_Query__1addLongValue(
|
|
JNIEnv * pEnv,
|
|
jobject, // obj
|
|
jlong lThis,
|
|
jlong lValue)
|
|
{
|
|
RCODE rc = NE_XFLM_OK;
|
|
IF_Query * pQuery = THIS_QUERY();
|
|
|
|
if (RC_BAD( rc = pQuery->addINT64Value( (FLMINT64)lValue)))
|
|
{
|
|
ThrowError( rc, pEnv);
|
|
goto Exit;
|
|
}
|
|
|
|
Exit:
|
|
|
|
return;
|
|
}
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
JNIEXPORT void JNICALL Java_xflaim_Query__1addBoolean(
|
|
JNIEnv * pEnv,
|
|
jobject, // obj
|
|
jlong lThis,
|
|
jboolean bValue,
|
|
jboolean bUnknown)
|
|
{
|
|
RCODE rc = NE_XFLM_OK;
|
|
IF_Query * pQuery = THIS_QUERY();
|
|
|
|
if (RC_BAD( rc = pQuery->addBoolean( bValue ? TRUE : FALSE,
|
|
bUnknown ? TRUE : FALSE)))
|
|
{
|
|
ThrowError( rc, pEnv);
|
|
goto Exit;
|
|
}
|
|
|
|
Exit:
|
|
|
|
return;
|
|
}
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
JNIEXPORT jlong JNICALL Java_xflaim_Query__1getFirst(
|
|
JNIEnv * pEnv,
|
|
jobject, // obj
|
|
jlong lThis,
|
|
jlong lDbRef,
|
|
jlong lReusedNodeRef,
|
|
jint iTimeLimit)
|
|
{
|
|
RCODE rc = NE_XFLM_OK;
|
|
IF_Query * pQuery = THIS_QUERY();
|
|
IF_Db * pDb = (IF_Db *)((FLMUINT)lDbRef);
|
|
IF_DOMNode * pNewNode = lReusedNodeRef
|
|
? (IF_DOMNode *)((FLMUINT)lReusedNodeRef)
|
|
: NULL;
|
|
|
|
if (RC_BAD( rc = pQuery->getFirst( pDb, &pNewNode, (FLMUINT)iTimeLimit)))
|
|
{
|
|
ThrowError( rc, pEnv);
|
|
goto Exit;
|
|
}
|
|
|
|
Exit:
|
|
|
|
return( (jlong)((FLMUINT)pNewNode));
|
|
}
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
JNIEXPORT jlong JNICALL Java_xflaim_Query__1getLast(
|
|
JNIEnv * pEnv,
|
|
jobject, // obj
|
|
jlong lThis,
|
|
jlong lDbRef,
|
|
jlong lReusedNodeRef,
|
|
jint iTimeLimit)
|
|
{
|
|
RCODE rc = NE_XFLM_OK;
|
|
IF_Query * pQuery = THIS_QUERY();
|
|
IF_Db * pDb = (IF_Db *)((FLMUINT)lDbRef);
|
|
IF_DOMNode * pNewNode = lReusedNodeRef
|
|
? (IF_DOMNode *)((FLMUINT)lReusedNodeRef)
|
|
: NULL;
|
|
|
|
if (RC_BAD( rc = pQuery->getLast( pDb, &pNewNode, (FLMUINT)iTimeLimit)))
|
|
{
|
|
ThrowError( rc, pEnv);
|
|
goto Exit;
|
|
}
|
|
|
|
Exit:
|
|
|
|
return( (jlong)((FLMUINT)pNewNode));
|
|
}
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
JNIEXPORT jlong JNICALL Java_xflaim_Query__1getNext(
|
|
JNIEnv * pEnv,
|
|
jobject, // obj
|
|
jlong lThis,
|
|
jlong lDbRef,
|
|
jlong lReusedNodeRef,
|
|
jint iTimeLimit,
|
|
jint iNumToSkip)
|
|
{
|
|
RCODE rc = NE_XFLM_OK;
|
|
IF_Query * pQuery = THIS_QUERY();
|
|
IF_Db * pDb = (IF_Db *)((FLMUINT)lDbRef);
|
|
IF_DOMNode * pNewNode = lReusedNodeRef
|
|
? (IF_DOMNode *)((FLMUINT)lReusedNodeRef)
|
|
: NULL;
|
|
|
|
if (RC_BAD( rc = pQuery->getNext( pDb, &pNewNode, (FLMUINT)iTimeLimit,
|
|
(FLMUINT)iNumToSkip, NULL)))
|
|
{
|
|
ThrowError( rc, pEnv);
|
|
goto Exit;
|
|
}
|
|
|
|
Exit:
|
|
|
|
return( (jlong)((FLMUINT)pNewNode));
|
|
}
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
JNIEXPORT jlong JNICALL Java_xflaim_Query__1getPrev(
|
|
JNIEnv * pEnv,
|
|
jobject, // obj
|
|
jlong lThis,
|
|
jlong lDbRef,
|
|
jlong lReusedNodeRef,
|
|
jint iTimeLimit,
|
|
jint iNumToSkip)
|
|
{
|
|
RCODE rc = NE_XFLM_OK;
|
|
IF_Query * pQuery = THIS_QUERY();
|
|
IF_Db * pDb = (IF_Db *)((FLMUINT)lDbRef);
|
|
IF_DOMNode * pNewNode = lReusedNodeRef
|
|
? (IF_DOMNode *)((FLMUINT)lReusedNodeRef)
|
|
: NULL;
|
|
|
|
if (RC_BAD( rc = pQuery->getPrev( pDb, &pNewNode, (FLMUINT)iTimeLimit,
|
|
(FLMUINT)iNumToSkip, NULL)))
|
|
{
|
|
ThrowError( rc, pEnv);
|
|
goto Exit;
|
|
}
|
|
|
|
Exit:
|
|
|
|
return( (jlong)((FLMUINT)pNewNode));
|
|
}
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
JNIEXPORT jlong JNICALL Java_xflaim_Query__1getCurrent(
|
|
JNIEnv * pEnv,
|
|
jobject, // obj
|
|
jlong lThis,
|
|
jlong lDbRef,
|
|
jlong lReusedNodeRef)
|
|
{
|
|
RCODE rc = NE_XFLM_OK;
|
|
IF_Query * pQuery = THIS_QUERY();
|
|
IF_Db * pDb = (IF_Db *)((FLMUINT)lDbRef);
|
|
IF_DOMNode * pNewNode = lReusedNodeRef
|
|
? (IF_DOMNode *)((FLMUINT)lReusedNodeRef)
|
|
: NULL;
|
|
|
|
if (RC_BAD( rc = pQuery->getCurrent( pDb, &pNewNode)))
|
|
{
|
|
ThrowError( rc, pEnv);
|
|
goto Exit;
|
|
}
|
|
|
|
Exit:
|
|
|
|
return( (jlong)((FLMUINT)pNewNode));
|
|
}
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
JNIEXPORT void JNICALL Java_xflaim_Query__1resetQuery(
|
|
JNIEnv *, // pEnv,
|
|
jobject, // obj
|
|
jlong lThis)
|
|
{
|
|
THIS_QUERY()->resetQuery();
|
|
}
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
FSTATIC jobject NewOptInfo(
|
|
JNIEnv * pEnv,
|
|
XFLM_OPT_INFO * pOptInfo,
|
|
jclass jOptInfoClass)
|
|
{
|
|
jobject jOptInfo = NULL;
|
|
jstring jIxName;
|
|
|
|
if ((jIxName = pEnv->NewStringUTF( (const char *)pOptInfo->szIxName)) == NULL)
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
// Allocate and populate the opt info object
|
|
|
|
if ((jOptInfo = pEnv->AllocObject( jOptInfoClass)) == NULL)
|
|
{
|
|
goto Exit;
|
|
}
|
|
pEnv->SetIntField( jOptInfo, fid_OptInfo_iOptType,
|
|
(jint)pOptInfo->eOptType);
|
|
pEnv->SetIntField( jOptInfo, fid_OptInfo_iCost,
|
|
(jint)pOptInfo->uiCost);
|
|
pEnv->SetLongField( jOptInfo, fid_OptInfo_lNodeId,
|
|
(jlong)pOptInfo->ui64NodeId);
|
|
pEnv->SetLongField( jOptInfo, fid_OptInfo_lEndNodeId,
|
|
(jlong)pOptInfo->ui64EndNodeId);
|
|
pEnv->SetIntField( jOptInfo, fid_OptInfo_iIxNum,
|
|
(jint)pOptInfo->uiIxNum);
|
|
pEnv->SetObjectField( jOptInfo, fid_OptInfo_sIxName,
|
|
jIxName);
|
|
pEnv->SetBooleanField( jOptInfo, fid_OptInfo_bMustVerifyPath,
|
|
(jboolean)(pOptInfo->bMustVerifyPath ? JNI_TRUE : JNI_FALSE));
|
|
pEnv->SetBooleanField( jOptInfo, fid_OptInfo_bDoNodeMatch,
|
|
(jboolean)(pOptInfo->bDoNodeMatch ? JNI_TRUE : JNI_FALSE));
|
|
pEnv->SetBooleanField( jOptInfo, fid_OptInfo_bCanCompareOnKey,
|
|
(jboolean)(pOptInfo->bCanCompareOnKey ? JNI_TRUE : JNI_FALSE));
|
|
pEnv->SetLongField( jOptInfo, fid_OptInfo_lKeysRead,
|
|
(jlong)pOptInfo->ui64KeysRead);
|
|
pEnv->SetLongField( jOptInfo, fid_OptInfo_lKeyHadDupDoc,
|
|
(jlong)pOptInfo->ui64KeyHadDupDoc);
|
|
pEnv->SetLongField( jOptInfo, fid_OptInfo_lKeysPassed,
|
|
(jlong)pOptInfo->ui64KeysPassed);
|
|
pEnv->SetLongField( jOptInfo, fid_OptInfo_lNodesRead,
|
|
(jlong)pOptInfo->ui64NodesRead);
|
|
pEnv->SetLongField( jOptInfo, fid_OptInfo_lNodesTested,
|
|
(jlong)pOptInfo->ui64NodesTested);
|
|
pEnv->SetLongField( jOptInfo, fid_OptInfo_lNodesPassed,
|
|
(jlong)pOptInfo->ui64NodesPassed);
|
|
pEnv->SetLongField( jOptInfo, fid_OptInfo_lDocsRead,
|
|
(jlong)pOptInfo->ui64DocsRead);
|
|
pEnv->SetLongField( jOptInfo, fid_OptInfo_lDupDocsEliminated,
|
|
(jlong)pOptInfo->ui64DupDocsEliminated);
|
|
pEnv->SetLongField( jOptInfo, fid_OptInfo_lNodesFailedValidation,
|
|
(jlong)pOptInfo->ui64NodesFailedValidation);
|
|
pEnv->SetLongField( jOptInfo, fid_OptInfo_lDocsFailedValidation,
|
|
(jlong)pOptInfo->ui64DocsFailedValidation);
|
|
pEnv->SetLongField( jOptInfo, fid_OptInfo_lDocsPassed,
|
|
(jlong)pOptInfo->ui64DocsPassed);
|
|
|
|
Exit:
|
|
|
|
return( jOptInfo);
|
|
}
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
JNIEXPORT jobjectArray JNICALL Java_xflaim_Query__1getStatsAndOptInfo(
|
|
JNIEnv * pEnv,
|
|
jobject, // obj
|
|
jlong lThis)
|
|
{
|
|
RCODE rc = NE_XFLM_OK;
|
|
IF_Query * pQuery = THIS_QUERY();
|
|
XFLM_OPT_INFO * pOptInfoArray = NULL;
|
|
FLMUINT uiNumOptInfos = 0;
|
|
jclass jOptInfoClass = NULL;
|
|
jobjectArray jOptInfoArray = NULL;
|
|
|
|
if (RC_BAD( rc = pQuery->getStatsAndOptInfo( &uiNumOptInfos, &pOptInfoArray)))
|
|
{
|
|
ThrowError( rc, pEnv);
|
|
goto Exit;
|
|
}
|
|
|
|
// Get the OptInfo class.
|
|
|
|
if ((jOptInfoClass = pEnv->FindClass( "xflaim/OptInfo")) == NULL)
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
// Allocate an array of OptInfo objects.
|
|
|
|
if (uiNumOptInfos)
|
|
{
|
|
XFLM_OPT_INFO * pOptInfo;
|
|
FLMUINT uiLoop;
|
|
jobject jOptInfo;
|
|
|
|
if ((jOptInfoArray = pEnv->NewObjectArray( (jsize)uiNumOptInfos,
|
|
jOptInfoClass, NULL)) == NULL)
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
// Populate the OptInfo array
|
|
|
|
for (uiLoop = 0, pOptInfo = pOptInfoArray;
|
|
uiLoop < uiNumOptInfos;
|
|
uiLoop++, pOptInfo++)
|
|
{
|
|
|
|
// Allocate an opt info object.
|
|
|
|
if ((jOptInfo = NewOptInfo( pEnv, pOptInfo, jOptInfoClass)) == NULL)
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
// Put the opt info object into the array of
|
|
// opt info objects.
|
|
|
|
pEnv->SetObjectArrayElement( jOptInfoArray, (jsize)uiLoop, jOptInfo);
|
|
}
|
|
}
|
|
|
|
Exit:
|
|
|
|
if (pOptInfoArray)
|
|
{
|
|
pQuery->freeStatsAndOptInfo( &pOptInfoArray);
|
|
}
|
|
|
|
return( jOptInfoArray);
|
|
}
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
JNIEXPORT void JNICALL Java_xflaim_Query__1setDupHandling(
|
|
JNIEnv *, // pEnv,
|
|
jobject, // obj
|
|
jlong lThis,
|
|
jboolean bRemoveDups)
|
|
{
|
|
THIS_QUERY()->setDupHandling( bRemoveDups ? TRUE : FALSE);
|
|
}
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
JNIEXPORT void JNICALL Java_xflaim_Query__1setIndex(
|
|
JNIEnv * pEnv,
|
|
jobject, // obj
|
|
jlong lThis,
|
|
jint iIndex)
|
|
{
|
|
RCODE rc = NE_XFLM_OK;
|
|
IF_Query * pQuery = THIS_QUERY();
|
|
|
|
if (RC_BAD( rc = pQuery->setIndex( (FLMUINT)iIndex)))
|
|
{
|
|
ThrowError( rc, pEnv);
|
|
goto Exit;
|
|
}
|
|
|
|
Exit:
|
|
|
|
return;
|
|
}
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
JNIEXPORT jint JNICALL Java_xflaim_Query__1getIndex(
|
|
JNIEnv * pEnv,
|
|
jobject, // obj
|
|
jlong lThis,
|
|
jlong lDbRef)
|
|
{
|
|
RCODE rc = NE_XFLM_OK;
|
|
IF_Query * pQuery = THIS_QUERY();
|
|
IF_Db * pDb = (IF_Db *)((FLMUINT)lDbRef);
|
|
FLMUINT uiIndex;
|
|
FLMBOOL bHaveMultiple;
|
|
|
|
if (RC_BAD( rc = pQuery->getIndex( pDb, &uiIndex, &bHaveMultiple)))
|
|
{
|
|
ThrowError( rc, pEnv);
|
|
goto Exit;
|
|
}
|
|
|
|
Exit:
|
|
|
|
return( (jint)uiIndex);
|
|
}
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
JNIEXPORT jboolean JNICALL Java_xflaim_Query__1usesMultipleIndexes(
|
|
JNIEnv * pEnv,
|
|
jobject, // obj
|
|
jlong lThis,
|
|
jlong lDbRef)
|
|
{
|
|
RCODE rc = NE_XFLM_OK;
|
|
IF_Query * pQuery = THIS_QUERY();
|
|
IF_Db * pDb = (IF_Db *)((FLMUINT)lDbRef);
|
|
FLMUINT uiIndex;
|
|
FLMBOOL bHaveMultiple;
|
|
|
|
if (RC_BAD( rc = pQuery->getIndex( pDb, &uiIndex, &bHaveMultiple)))
|
|
{
|
|
ThrowError( rc, pEnv);
|
|
goto Exit;
|
|
}
|
|
|
|
Exit:
|
|
|
|
return( (jboolean)(bHaveMultiple ? JNI_TRUE : JNI_FALSE));
|
|
}
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
JNIEXPORT jlong JNICALL Java_xflaim_Query__1addSortKey(
|
|
JNIEnv * pEnv,
|
|
jobject, // obj
|
|
jlong lThis,
|
|
jlong lSortKeyContext,
|
|
jboolean bChildToContext,
|
|
jboolean bElement,
|
|
jint iNameId,
|
|
jint iCompareRules,
|
|
jint iLimit,
|
|
jint iKeyComponent,
|
|
jboolean bSortDescending,
|
|
jboolean bSortMissingHigh)
|
|
{
|
|
RCODE rc = NE_XFLM_OK;
|
|
IF_Query * pQuery = THIS_QUERY();
|
|
void * pvContext = (void *)((FLMUINT)lSortKeyContext);
|
|
void * pvReturnedContext = NULL;
|
|
|
|
if (RC_BAD( rc = pQuery->addSortKey( pvContext,
|
|
(FLMBOOL)(bChildToContext ? TRUE : FALSE),
|
|
(FLMBOOL)(bElement ? TRUE : FALSE),
|
|
(FLMUINT)iNameId,
|
|
(FLMUINT)iCompareRules,
|
|
(FLMUINT)iLimit,
|
|
(FLMUINT)iKeyComponent,
|
|
(FLMBOOL)(bSortDescending ? TRUE : FALSE),
|
|
(FLMBOOL)(bSortMissingHigh ? TRUE : FALSE),
|
|
&pvReturnedContext)))
|
|
{
|
|
ThrowError( rc, pEnv);
|
|
goto Exit;
|
|
}
|
|
|
|
Exit:
|
|
|
|
return( (jlong)((FLMUINT)pvReturnedContext));
|
|
}
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
JNIEXPORT void JNICALL Java_xflaim_Query__1enablePositioning(
|
|
JNIEnv * pEnv,
|
|
jobject, // obj
|
|
jlong lThis)
|
|
{
|
|
RCODE rc = NE_XFLM_OK;
|
|
IF_Query * pQuery = THIS_QUERY();
|
|
|
|
if (RC_BAD( rc = pQuery->enablePositioning()))
|
|
{
|
|
ThrowError( rc, pEnv);
|
|
goto Exit;
|
|
}
|
|
|
|
Exit:
|
|
|
|
return;
|
|
}
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
JNIEXPORT jlong JNICALL Java_xflaim_Query__1positionTo(
|
|
JNIEnv * pEnv,
|
|
jobject, // obj
|
|
jlong lThis,
|
|
jlong lDbRef,
|
|
jlong lReusedNodeRef,
|
|
jint iTimeLimit,
|
|
jint iPosition)
|
|
{
|
|
RCODE rc = NE_XFLM_OK;
|
|
IF_Query * pQuery = THIS_QUERY();
|
|
IF_Db * pDb = (IF_Db *)((FLMUINT)lDbRef);
|
|
IF_DOMNode * pNewNode = lReusedNodeRef
|
|
? (IF_DOMNode *)((FLMUINT)lReusedNodeRef)
|
|
: NULL;
|
|
|
|
if (RC_BAD( rc = pQuery->positionTo( pDb, &pNewNode, (FLMUINT)iTimeLimit,
|
|
(FLMUINT)iPosition)))
|
|
{
|
|
ThrowError( rc, pEnv);
|
|
goto Exit;
|
|
}
|
|
|
|
Exit:
|
|
|
|
return( (jlong)((FLMUINT)pNewNode));
|
|
}
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
JNIEXPORT jlong JNICALL Java_xflaim_Query__1positionTo2(
|
|
JNIEnv * pEnv,
|
|
jobject, // obj
|
|
jlong lThis,
|
|
jlong lDbRef,
|
|
jlong lReusedNodeRef,
|
|
jint iTimeLimit,
|
|
jlong lSearchKeyRef,
|
|
jint iFlags)
|
|
{
|
|
RCODE rc = NE_XFLM_OK;
|
|
IF_Query * pQuery = THIS_QUERY();
|
|
IF_Db * pDb = (IF_Db *)((FLMUINT)lDbRef);
|
|
IF_DataVector * pSearchKey = (IF_DataVector *)((FLMUINT)lSearchKeyRef);
|
|
IF_DOMNode * pNewNode = lReusedNodeRef
|
|
? (IF_DOMNode *)((FLMUINT)lReusedNodeRef)
|
|
: NULL;
|
|
|
|
if (RC_BAD( rc = pQuery->positionTo( pDb, &pNewNode, (FLMUINT)iTimeLimit,
|
|
pSearchKey, (FLMUINT)iFlags)))
|
|
{
|
|
ThrowError( rc, pEnv);
|
|
goto Exit;
|
|
}
|
|
|
|
Exit:
|
|
|
|
return( (jlong)((FLMUINT)pNewNode));
|
|
}
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
JNIEXPORT jint JNICALL Java_xflaim_Query__1getPosition(
|
|
JNIEnv * pEnv,
|
|
jobject, // obj
|
|
jlong lThis,
|
|
jlong lDbRef)
|
|
{
|
|
RCODE rc = NE_XFLM_OK;
|
|
IF_Query * pQuery = THIS_QUERY();
|
|
IF_Db * pDb = (IF_Db *)((FLMUINT)lDbRef);
|
|
FLMUINT uiPosition = 0;
|
|
|
|
if (RC_BAD( rc = pQuery->getPosition( pDb, &uiPosition)))
|
|
{
|
|
ThrowError( rc, pEnv);
|
|
goto Exit;
|
|
}
|
|
|
|
Exit:
|
|
|
|
return( (jint)uiPosition);
|
|
}
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
JNIEXPORT void JNICALL Java_xflaim_Query__1buildResultSet(
|
|
JNIEnv * pEnv,
|
|
jobject, // obj
|
|
jlong lThis,
|
|
jlong lDbRef,
|
|
jint iTimeLimit)
|
|
{
|
|
RCODE rc = NE_XFLM_OK;
|
|
IF_Query * pQuery = THIS_QUERY();
|
|
IF_Db * pDb = (IF_Db *)((FLMUINT)lDbRef);
|
|
|
|
if (RC_BAD( rc = pQuery->buildResultSet( pDb, (FLMUINT)iTimeLimit)))
|
|
{
|
|
ThrowError( rc, pEnv);
|
|
goto Exit;
|
|
}
|
|
|
|
Exit:
|
|
|
|
return;
|
|
}
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
JNIEXPORT void JNICALL Java_xflaim_Query__1stopBuildingResultSet(
|
|
JNIEnv *, // pEnv,
|
|
jobject, // obj
|
|
jlong lThis)
|
|
{
|
|
THIS_QUERY()->stopBuildingResultSet();
|
|
}
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
JNIEXPORT void JNICALL Java_xflaim_Query__1enableResultSetEncryption(
|
|
JNIEnv *, // pEnv,
|
|
jobject, // obj
|
|
jlong lThis)
|
|
{
|
|
THIS_QUERY()->enableResultSetEncryption();
|
|
}
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
JNIEXPORT jobject JNICALL Java_xflaim_Query__1getResultSetCounts(
|
|
JNIEnv * pEnv,
|
|
jobject, // obj
|
|
jlong lThis,
|
|
jlong lDbRef,
|
|
jint iTimeLimit,
|
|
jboolean bPartialCountOk)
|
|
{
|
|
RCODE rc = NE_XFLM_OK;
|
|
IF_Query * pQuery = THIS_QUERY();
|
|
IF_Db * pDb = (IF_Db *)((FLMUINT)lDbRef);
|
|
jclass jResultSetCountsClass = NULL;
|
|
jobject jCounts = NULL;
|
|
FLMUINT uiReadCount;
|
|
FLMUINT uiPassedCount;
|
|
FLMUINT uiPositionableToCount;
|
|
FLMBOOL bDoneBuildingResultSet;
|
|
|
|
if (RC_BAD( rc = pQuery->getCounts( pDb, (FLMUINT)iTimeLimit,
|
|
(FLMBOOL)(bPartialCountOk ? TRUE : FALSE),
|
|
&uiReadCount, &uiPassedCount,
|
|
&uiPositionableToCount, &bDoneBuildingResultSet)))
|
|
{
|
|
ThrowError( rc, pEnv);
|
|
goto Exit;
|
|
}
|
|
|
|
if ((jResultSetCountsClass = pEnv->FindClass( "xflaim/ResultSetCounts")) == NULL)
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
if ((jCounts = pEnv->AllocObject( jResultSetCountsClass)) == NULL)
|
|
{
|
|
goto Exit;
|
|
}
|
|
pEnv->SetIntField( jCounts, fid_ResultSetCounts_iReadCount,
|
|
(jint)uiReadCount);
|
|
pEnv->SetIntField( jCounts, fid_ResultSetCounts_iPassedCount,
|
|
(jint)uiPassedCount);
|
|
pEnv->SetIntField( jCounts, fid_ResultSetCounts_iPositionableToCount,
|
|
(jint)uiPositionableToCount);
|
|
pEnv->SetBooleanField( jCounts, fid_ResultSetCounts_bDoneBuildingResultSet,
|
|
(jboolean)(bDoneBuildingResultSet ? JNI_TRUE : JNI_FALSE));
|
|
|
|
Exit:
|
|
|
|
return( jCounts);
|
|
}
|
|
|