git-svn-id: https://svn.code.sf.net/p/flaim/code/trunk@1010 0109f412-320b-0410-ab79-c3e0c5ffbbe6
2984 lines
61 KiB
C++
2984 lines
61 KiB
C++
//------------------------------------------------------------------------------
|
|
// Desc: Index definition unit test.
|
|
// Tabs: 3
|
|
//
|
|
// Copyright (c) 2003-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 "flmunittest.h"
|
|
|
|
#if defined( FLM_NLM)
|
|
#define DB_NAME_STR "SYS:\\TST.DB"
|
|
#else
|
|
#define DB_NAME_STR "tst.db"
|
|
#endif
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
class IIndexDefTestImpl : public TestBase
|
|
{
|
|
public:
|
|
|
|
const char * getName( void);
|
|
|
|
RCODE execute( void);
|
|
|
|
private:
|
|
|
|
RCODE importEncDefs( void);
|
|
|
|
FLMUINT m_uiAESDef;
|
|
FLMUINT m_uiDES3Def;
|
|
};
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
RCODE getTest(
|
|
IFlmTest ** ppTest)
|
|
{
|
|
RCODE rc = NE_XFLM_OK;
|
|
|
|
if( (*ppTest = f_new IIndexDefTestImpl) == NULL)
|
|
{
|
|
rc = NE_XFLM_MEM;
|
|
goto Exit;
|
|
}
|
|
|
|
Exit:
|
|
|
|
return( rc);
|
|
}
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
const char * IIndexDefTestImpl::getName( void)
|
|
{
|
|
return "Index Definition Test";
|
|
}
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
RCODE IIndexDefTestImpl::importEncDefs( void)
|
|
{
|
|
RCODE rc = NE_XFLM_OK;
|
|
char * ppszEncDefs[] = {XFLM_ENC_AES_OPTION_STR, XFLM_ENC_DES3_OPTION_STR};
|
|
FLMUINT puiEncDef[2];
|
|
char szEncDef[200];
|
|
FLMUINT uiLoop = 0;
|
|
|
|
for(
|
|
uiLoop = 0;
|
|
uiLoop < sizeof( ppszEncDefs) / sizeof( ppszEncDefs[ 0]);
|
|
uiLoop++)
|
|
{
|
|
f_sprintf(
|
|
szEncDef,
|
|
"<xflaim:EncDef "
|
|
"xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" "
|
|
"xmlns:xflaim=\"http://www.novell.com/XMLDatabase/Schema\" "
|
|
"xflaim:name=\"%s definition\" "
|
|
"xflaim:type=\"%s\" />",
|
|
ppszEncDefs[uiLoop],
|
|
ppszEncDefs[uiLoop]);
|
|
|
|
if( RC_BAD( rc = importBuffer( szEncDef, XFLM_DICT_COLLECTION)))
|
|
{
|
|
MAKE_ERROR_STRING( "importBuffer failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
f_sprintf( szEncDef, "%s definition", ppszEncDefs[uiLoop]);
|
|
if( RC_BAD( rc = m_pDb->getEncDefId( (char *)szEncDef,
|
|
(FLMUINT *)&puiEncDef[ uiLoop])))
|
|
{
|
|
goto Exit;
|
|
}
|
|
}
|
|
|
|
m_uiAESDef = puiEncDef[ 0];
|
|
m_uiDES3Def = puiEncDef[ 1];
|
|
|
|
Exit:
|
|
|
|
return( rc);
|
|
}
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
RCODE IIndexDefTestImpl::execute( void)
|
|
{
|
|
RCODE rc = NE_XFLM_OK;
|
|
FLMBOOL bDibCreated = FALSE;
|
|
FLMUINT uiAttrDefDictNum = 0;
|
|
FLMUINT uiElemDef1DictNum = 0;
|
|
FLMUINT uiElemDef2DictNum = 0;
|
|
FLMUINT64 ui64ElemComponent = 0;
|
|
FLMUINT uiTemp = 0;
|
|
IF_DOMNode * pIndex = NULL;
|
|
IF_DOMNode * pNode = NULL;
|
|
IF_DOMNode * pAttr = NULL;
|
|
IF_DOMNode * pAttrDef = NULL;
|
|
IF_DOMNode * pElemDef = NULL;
|
|
IF_DOMNode * pTmpNode = NULL;
|
|
FLMBOOL bTransBegun = FALSE;
|
|
|
|
beginTest(
|
|
"Index Def Test Init",
|
|
"Perform necessary initializations so we can do the "
|
|
"index definition tests.",
|
|
"1) Get the necessary class factories "
|
|
"2) Create a database 3) create some attribute and element "
|
|
"definitions.",
|
|
"");
|
|
|
|
if ( RC_BAD( rc = initCleanTestState( DB_NAME_STR)))
|
|
{
|
|
MAKE_ERROR_STRING( "Failed to initialize test state.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
bDibCreated = TRUE;
|
|
|
|
#ifdef FLM_USE_NICI
|
|
if ( RC_BAD( rc = m_pDb->transBegin( XFLM_UPDATE_TRANS, FLM_NO_TIMEOUT)))
|
|
{
|
|
MAKE_ERROR_STRING( "transBegin failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
bTransBegun = TRUE;
|
|
|
|
if ( RC_BAD( rc = importEncDefs()))
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = m_pDb->transCommit( )))
|
|
{
|
|
MAKE_ERROR_STRING( "transCommit failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
bTransBegun = FALSE;
|
|
#endif
|
|
|
|
// Start an update transaction
|
|
|
|
if( RC_BAD( rc = m_pDb->transBegin( XFLM_UPDATE_TRANS)))
|
|
{
|
|
MAKE_ERROR_STRING( "transBegin failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
bTransBegun = TRUE;
|
|
|
|
// Create an attribute def and an element def for us to refer to in the index
|
|
|
|
/*
|
|
<name="foo" type="string" state="active"/>
|
|
*/
|
|
|
|
if ( RC_BAD( rc = m_pDb->createRootElement(
|
|
XFLM_DICT_COLLECTION,
|
|
ELM_ATTRIBUTE_TAG,
|
|
&pAttrDef)))
|
|
{
|
|
MAKE_ERROR_STRING( "createRootElement failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttrDef->createAttribute(
|
|
m_pDb,
|
|
ATTR_NAME_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUTF8( m_pDb, (FLMBYTE *)"foo")))
|
|
{
|
|
MAKE_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = m_pDb->documentDone( pAttrDef)))
|
|
{
|
|
MAKE_ERROR_STRING( "documentDone failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttrDef->getAttribute(
|
|
m_pDb,
|
|
ATTR_DICT_NUMBER_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "getAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Get the dictionary number (used by later tests)
|
|
|
|
if ( RC_BAD( rc = pAttr->getUINT(
|
|
m_pDb,
|
|
&uiAttrDefDictNum)))
|
|
{
|
|
MAKE_ERROR_STRING( "getUINT failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Create an element definition
|
|
|
|
/*
|
|
<name="bar" type="string" state="active" />
|
|
*/
|
|
|
|
if ( RC_BAD( rc = m_pDb->createRootElement(
|
|
XFLM_DICT_COLLECTION,
|
|
ELM_ELEMENT_TAG,
|
|
&pElemDef)))
|
|
{
|
|
MAKE_ERROR_STRING( "createRootElement failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pElemDef->createAttribute(
|
|
m_pDb,
|
|
ATTR_NAME_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUTF8( m_pDb, (FLMBYTE *)"bar")))
|
|
{
|
|
MAKE_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = m_pDb->documentDone( pElemDef)))
|
|
{
|
|
MAKE_ERROR_STRING( "documentDone failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pElemDef->getAttribute(
|
|
m_pDb,
|
|
ATTR_DICT_NUMBER_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "getAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Get the dictionary number (used by later tests)
|
|
|
|
if ( RC_BAD( rc = pAttr->getUINT(
|
|
m_pDb,
|
|
&uiElemDef1DictNum)))
|
|
{
|
|
MAKE_ERROR_STRING( "getUINT failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Create an element definition
|
|
|
|
/*
|
|
<name="baz" type="string" state="active" foo />
|
|
*/
|
|
|
|
if ( RC_BAD( rc = m_pDb->createRootElement(
|
|
XFLM_DICT_COLLECTION,
|
|
ELM_ELEMENT_TAG,
|
|
&pElemDef)))
|
|
{
|
|
MAKE_ERROR_STRING( "createRootElement failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pElemDef->createAttribute(
|
|
m_pDb,
|
|
ATTR_NAME_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUTF8( m_pDb, (FLMBYTE *)"baz")))
|
|
{
|
|
MAKE_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Give baz a foo attribute
|
|
|
|
if ( RC_BAD( rc = pElemDef->createAttribute(
|
|
m_pDb,
|
|
uiAttrDefDictNum,
|
|
&pAttr)))
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = m_pDb->documentDone( pElemDef)))
|
|
{
|
|
MAKE_ERROR_STRING( "documentDone failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pElemDef->getAttribute(
|
|
m_pDb,
|
|
ATTR_DICT_NUMBER_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "getAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Get the dictionary number (used by later tests)
|
|
|
|
if ( RC_BAD( rc = pAttr->getUINT(
|
|
m_pDb,
|
|
&uiElemDef2DictNum)))
|
|
{
|
|
MAKE_ERROR_STRING( "getUINT failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if( RC_BAD( rc = m_pDb->transCommit()))
|
|
{
|
|
MAKE_ERROR_STRING( "transCommit failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
bTransBegun = FALSE;
|
|
|
|
endTest("PASS");
|
|
|
|
beginTest(
|
|
"Root Element Tests",
|
|
"Verify rules for having a \"/\" element name are enforced",
|
|
"Verify that an element name of \"/\" is only used once and can "
|
|
"only be used at the root component of an index definition. Verify that it "
|
|
"is not allowed to have any siblings and if it is a key component that "
|
|
"the \"indexOn\" attribute is required to be set to \"presence\". Furthermore "
|
|
"verify that it cannot be used as a data component. ",
|
|
"No additional info");
|
|
|
|
if( RC_BAD( rc = m_pDb->transBegin( XFLM_UPDATE_TRANS)))
|
|
{
|
|
MAKE_ERROR_STRING( "transBegin failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
bTransBegun = TRUE;
|
|
|
|
if ( RC_BAD( rc = m_pDb->createRootElement(
|
|
XFLM_DICT_COLLECTION,
|
|
ELM_INDEX_TAG,
|
|
&pIndex)))
|
|
{
|
|
MAKE_ERROR_STRING( "createRootElement failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Create the root element component
|
|
|
|
if ( RC_BAD( rc = pIndex->createNode(
|
|
m_pDb,
|
|
ELEMENT_NODE,
|
|
ELM_ELEMENT_COMPONENT_TAG,
|
|
XFLM_FIRST_CHILD,
|
|
&pNode)))
|
|
{
|
|
MAKE_ERROR_STRING( "createNode failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pIndex->createAttribute(
|
|
m_pDb,
|
|
ATTR_NAME_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUTF8( m_pDb,
|
|
(FLMBYTE *)"root element test index 1")))
|
|
{
|
|
MAKE_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
#ifdef FLM_USE_NICI
|
|
// Create the encryption Id attribute
|
|
if ( RC_BAD( rc = pIndex->createAttribute(
|
|
m_pDb,
|
|
ATTR_ENCRYPTION_ID_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUINT(
|
|
m_pDb,
|
|
m_uiAESDef)))
|
|
{
|
|
MAKE_ERROR_STRING( "setUINT failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Create the key size parameter.
|
|
if ( RC_BAD( rc = pIndex->createAttribute(
|
|
m_pDb,
|
|
ATTR_ENCRYPTION_KEY_SIZE_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUINT(
|
|
m_pDb,
|
|
192)))
|
|
{
|
|
MAKE_ERROR_STRING( "setUINT failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
#endif
|
|
|
|
// Create the name attribute and set it to "/"
|
|
|
|
if ( RC_BAD( rc = pNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_NAME_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUTF8( m_pDb, (FLMBYTE *)"/")))
|
|
{
|
|
MAKE_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Make this the first key component
|
|
|
|
if ( RC_BAD( rc = pNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_KEY_COMPONENT_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUINT(
|
|
m_pDb,
|
|
1)))
|
|
{
|
|
MAKE_ERROR_STRING( "setUINT failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_INDEX_ON_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// The indexOn attribute should be required to be set to "presence"
|
|
|
|
if ( RC_BAD( rc = pAttr->setUTF8( m_pDb, (FLMBYTE *)"value")))
|
|
{
|
|
MAKE_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// documentDone should fail since we attempted to set the indexOn attribute
|
|
// to something other than "presence" with an element component of "/"
|
|
|
|
rc = m_pDb->documentDone( pIndex);
|
|
|
|
if ( rc != NE_XFLM_MUST_INDEX_ON_PRESENCE)
|
|
{
|
|
MAKE_ERROR_STRING( "Invalid rc. Expected: NE_XFLM_MUST_INDEX_ON_PRESENCE.",
|
|
m_szDetails, rc);
|
|
|
|
if ( RC_OK( rc))
|
|
{
|
|
rc = NE_XFLM_FAILURE;
|
|
}
|
|
goto Exit;
|
|
}
|
|
|
|
if( RC_BAD( rc = m_pDb->transAbort()))
|
|
{
|
|
MAKE_ERROR_STRING( "transAbort failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
bTransBegun = FALSE;
|
|
|
|
// Try again
|
|
|
|
if( RC_BAD( rc = m_pDb->transBegin( XFLM_UPDATE_TRANS)))
|
|
{
|
|
MAKE_ERROR_STRING( "transBegin failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
bTransBegun = TRUE;
|
|
|
|
if ( RC_BAD( rc = m_pDb->createRootElement(
|
|
XFLM_DICT_COLLECTION,
|
|
ELM_INDEX_TAG,
|
|
&pIndex)))
|
|
{
|
|
MAKE_ERROR_STRING( "createRootElement failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Create the root element component
|
|
|
|
if ( RC_BAD( rc = pIndex->createNode(
|
|
m_pDb,
|
|
ELEMENT_NODE,
|
|
ELM_ELEMENT_COMPONENT_TAG,
|
|
XFLM_FIRST_CHILD,
|
|
&pNode)))
|
|
{
|
|
MAKE_ERROR_STRING( "createNode failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pIndex->createAttribute(
|
|
m_pDb,
|
|
ATTR_NAME_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUTF8(
|
|
m_pDb,
|
|
(FLMBYTE *)"root element test index 2")))
|
|
{
|
|
MAKE_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
#ifdef FLM_USE_NICI
|
|
// Create the encryption Id attribute
|
|
if ( RC_BAD( rc = pIndex->createAttribute(
|
|
m_pDb,
|
|
ATTR_ENCRYPTION_ID_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUINT(
|
|
m_pDb,
|
|
m_uiAESDef)))
|
|
{
|
|
MAKE_ERROR_STRING( "setUINT failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Create the key size parameter.
|
|
if ( RC_BAD( rc = pIndex->createAttribute(
|
|
m_pDb,
|
|
ATTR_ENCRYPTION_KEY_SIZE_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUINT(
|
|
m_pDb,
|
|
128)))
|
|
{
|
|
MAKE_ERROR_STRING( "setUINT failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
#endif
|
|
|
|
// Create the name attribute and set it to "/"
|
|
|
|
if ( RC_BAD( rc = pNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_NAME_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUTF8( m_pDb, (FLMBYTE *)"/")))
|
|
{
|
|
MAKE_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Make this the first key component
|
|
|
|
if ( RC_BAD( rc = pNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_KEY_COMPONENT_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUINT(
|
|
m_pDb,
|
|
1)))
|
|
{
|
|
MAKE_ERROR_STRING( "setUINT failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_INDEX_ON_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Set to "presence" as we should
|
|
|
|
if ( RC_BAD( rc = pAttr->setUTF8( m_pDb, (FLMBYTE *)"presence")))
|
|
{
|
|
MAKE_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// We should not be able to create a sibling to this component
|
|
|
|
if ( RC_BAD( rc = pIndex->createNode(
|
|
m_pDb,
|
|
ELEMENT_NODE,
|
|
ELM_ELEMENT_COMPONENT_TAG,
|
|
XFLM_FIRST_CHILD,
|
|
&pTmpNode)))
|
|
{
|
|
MAKE_ERROR_STRING( "createNode failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Have to give it at least one attribute or we'll fail in documentDone
|
|
|
|
if ( RC_BAD( rc = pTmpNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_NAME_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUTF8( m_pDb, (FLMBYTE *)"bar")))
|
|
{
|
|
MAKE_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// documentDone should fail since the "/" element has a sibling
|
|
|
|
rc = m_pDb->documentDone( pIndex);
|
|
if ( rc != NE_XFLM_BAD_USE_OF_ELM_ROOT_TAG)
|
|
{
|
|
MAKE_ERROR_STRING( "Invalid rc. Expected: NE_XFLM_BAD_USE_OF_ELM_ROOT_TAG.",
|
|
m_szDetails, rc);
|
|
|
|
if ( RC_OK( rc))
|
|
{
|
|
rc = NE_XFLM_FAILURE;
|
|
}
|
|
goto Exit;
|
|
}
|
|
|
|
if( RC_BAD( rc = m_pDb->transAbort()))
|
|
{
|
|
MAKE_ERROR_STRING( "transAbort failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
bTransBegun = FALSE;
|
|
|
|
|
|
// Try again
|
|
|
|
if( RC_BAD( rc = m_pDb->transBegin( XFLM_UPDATE_TRANS)))
|
|
{
|
|
MAKE_ERROR_STRING( "transBegin failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
bTransBegun = TRUE;
|
|
|
|
if ( RC_BAD( rc = m_pDb->createRootElement(
|
|
XFLM_DICT_COLLECTION,
|
|
ELM_INDEX_TAG,
|
|
&pIndex)))
|
|
{
|
|
MAKE_ERROR_STRING( "createRootElement failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Create the root element component
|
|
|
|
if ( RC_BAD( rc = pIndex->createNode(
|
|
m_pDb,
|
|
ELEMENT_NODE,
|
|
ELM_ELEMENT_COMPONENT_TAG,
|
|
XFLM_FIRST_CHILD,
|
|
&pNode)))
|
|
{
|
|
MAKE_ERROR_STRING( "createNode failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pIndex->createAttribute(
|
|
m_pDb,
|
|
ATTR_NAME_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUTF8(
|
|
m_pDb,
|
|
(FLMBYTE *)"root element test index 3")))
|
|
{
|
|
MAKE_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
#ifdef FLM_USE_NICI
|
|
// Create the encryption Id attribute
|
|
if ( RC_BAD( rc = pIndex->createAttribute(
|
|
m_pDb,
|
|
ATTR_ENCRYPTION_ID_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUINT(
|
|
m_pDb,
|
|
m_uiAESDef)))
|
|
{
|
|
MAKE_ERROR_STRING( "setUINT failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Create the key size parameter.
|
|
if ( RC_BAD( rc = pIndex->createAttribute(
|
|
m_pDb,
|
|
ATTR_ENCRYPTION_KEY_SIZE_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUINT(
|
|
m_pDb,
|
|
256)))
|
|
{
|
|
MAKE_ERROR_STRING( "setUINT failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
#endif
|
|
|
|
// Create the name attribute and set it to "/"
|
|
|
|
if ( RC_BAD( rc = pNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_NAME_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if( RC_BAD( rc = pAttr->setUTF8( m_pDb, (FLMBYTE *)"/")))
|
|
{
|
|
MAKE_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Make this the first key component
|
|
|
|
if ( RC_BAD( rc = pNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_KEY_COMPONENT_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUINT(
|
|
m_pDb,
|
|
1)))
|
|
{
|
|
MAKE_ERROR_STRING( "setUINT failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_INDEX_ON_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Set to "presence" as we should
|
|
|
|
if ( RC_BAD( rc = pAttr->setUTF8( m_pDb, (FLMBYTE *)"presence")))
|
|
{
|
|
MAKE_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// We should not be able to create a sibling to this component
|
|
|
|
if ( RC_BAD( rc = m_pDb->transCommit()))
|
|
{
|
|
MAKE_ERROR_STRING( "transCommit failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
bTransBegun = FALSE;
|
|
|
|
if ( RC_BAD( rc = m_pDb->transBegin(XFLM_UPDATE_TRANS)))
|
|
{
|
|
MAKE_ERROR_STRING( "transCommit failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
bTransBegun = TRUE;
|
|
|
|
if ( RC_BAD( rc = pIndex->createNode(
|
|
m_pDb,
|
|
ELEMENT_NODE,
|
|
ELM_ELEMENT_COMPONENT_TAG,
|
|
XFLM_FIRST_CHILD,
|
|
&pTmpNode)))
|
|
{
|
|
MAKE_ERROR_STRING( "createNode failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Have to give it at least one attribute or we'll fail in documentDone
|
|
|
|
if ( RC_BAD( rc = pTmpNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_NAME_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUTF8( m_pDb, (FLMBYTE *)"bar")))
|
|
{
|
|
MAKE_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
rc = m_pDb->documentDone( pIndex);
|
|
|
|
if ( rc != NE_XFLM_BAD_USE_OF_ELM_ROOT_TAG)
|
|
{
|
|
MAKE_ERROR_STRING( "Incorrect rc from documentDone."
|
|
" Expected: NE_XFLM_BAD_USE_OF_ELM_ROOT_TAG.", m_szDetails, rc);
|
|
|
|
if ( RC_OK( rc))
|
|
{
|
|
rc = NE_XFLM_FAILURE;
|
|
}
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = m_pDb->transAbort()))
|
|
{
|
|
MAKE_ERROR_STRING( "transAbort failed", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
bTransBegun = FALSE;
|
|
|
|
if ( RC_BAD( rc = m_pDb->transBegin( XFLM_UPDATE_TRANS)))
|
|
{
|
|
MAKE_ERROR_STRING( "transBegin failed", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
bTransBegun = TRUE;
|
|
|
|
// Create a subordinate element component to the "/"
|
|
|
|
if ( RC_BAD( rc = pNode->createNode(
|
|
m_pDb,
|
|
ELEMENT_NODE,
|
|
ELM_ELEMENT_COMPONENT_TAG,
|
|
XFLM_FIRST_CHILD,
|
|
&pNode)))
|
|
{
|
|
MAKE_ERROR_STRING( "createNode failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Try to set its name attribute to "/" as well
|
|
|
|
if ( RC_BAD( rc = pNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_NAME_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUTF8( m_pDb, (FLMBYTE *)"/")))
|
|
{
|
|
MAKE_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_INDEX_ON_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUTF8( m_pDb, (FLMBYTE *)"presence")))
|
|
{
|
|
MAKE_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_KEY_COMPONENT_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUINT(
|
|
m_pDb,
|
|
2)))
|
|
{
|
|
MAKE_ERROR_STRING( "setUINT failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// This call to documentDone should fail since we tried to
|
|
// re-use the "/"
|
|
rc = m_pDb->documentDone( pIndex);
|
|
if ( rc != NE_XFLM_BAD_USE_OF_ELM_ROOT_TAG)
|
|
{
|
|
MAKE_ERROR_STRING( "Incorrect rc from documentDone."
|
|
" Expected: NE_XFLM_BAD_USE_OF_ELM_ROOT_TAG.", m_szDetails, rc);
|
|
|
|
if ( RC_OK( rc))
|
|
{
|
|
rc = NE_XFLM_FAILURE;
|
|
}
|
|
goto Exit;
|
|
}
|
|
|
|
if( RC_BAD( rc = m_pDb->transAbort()))
|
|
{
|
|
MAKE_ERROR_STRING( "transAbort failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
bTransBegun = FALSE;
|
|
|
|
// Try one last time
|
|
|
|
if( RC_BAD( rc = m_pDb->transBegin( XFLM_UPDATE_TRANS)))
|
|
{
|
|
MAKE_ERROR_STRING( "transBegin failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
bTransBegun = TRUE;
|
|
|
|
if ( RC_BAD( rc = m_pDb->createRootElement(
|
|
XFLM_DICT_COLLECTION,
|
|
ELM_INDEX_TAG,
|
|
&pIndex)))
|
|
{
|
|
MAKE_ERROR_STRING( "createRootElement failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Create the root element component
|
|
|
|
if ( RC_BAD( rc = pIndex->createNode(
|
|
m_pDb,
|
|
ELEMENT_NODE,
|
|
ELM_ELEMENT_COMPONENT_TAG,
|
|
XFLM_FIRST_CHILD,
|
|
&pNode)))
|
|
{
|
|
MAKE_ERROR_STRING( "createNode failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pIndex->createAttribute(
|
|
m_pDb,
|
|
ATTR_NAME_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUTF8( m_pDb,
|
|
(FLMBYTE *)"root element test index 4")))
|
|
{
|
|
MAKE_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
#ifdef FLM_USE_NICI
|
|
// Create the encryption Id attribute
|
|
if ( RC_BAD( rc = pIndex->createAttribute(
|
|
m_pDb,
|
|
ATTR_ENCRYPTION_ID_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUINT(
|
|
m_pDb,
|
|
m_uiAESDef)))
|
|
{
|
|
MAKE_ERROR_STRING( "setUINT failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Create the key size parameter.
|
|
if ( RC_BAD( rc = pIndex->createAttribute(
|
|
m_pDb,
|
|
ATTR_ENCRYPTION_KEY_SIZE_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUINT(
|
|
m_pDb,
|
|
256)))
|
|
{
|
|
MAKE_ERROR_STRING( "setUINT failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
#endif
|
|
|
|
// Create the name attribute and set it to "/"
|
|
|
|
if ( RC_BAD( rc = pNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_NAME_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUTF8( m_pDb, (FLMBYTE *)"/")))
|
|
{
|
|
MAKE_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Make this the first key component
|
|
|
|
if ( RC_BAD( rc = pNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_KEY_COMPONENT_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUINT(
|
|
m_pDb,
|
|
1)))
|
|
{
|
|
MAKE_ERROR_STRING( "setUINT failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_INDEX_ON_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Set to "presence" as we should
|
|
|
|
if ( RC_BAD( rc = pAttr->setUTF8( m_pDb, (FLMBYTE *)"presence")))
|
|
{
|
|
MAKE_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = m_pDb->documentDone( pIndex)))
|
|
{
|
|
MAKE_ERROR_STRING( "documentDone failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = m_pDb->transCommit()))
|
|
{
|
|
MAKE_ERROR_STRING( "transCommit failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
bTransBegun = FALSE;
|
|
|
|
|
|
if ( RC_BAD( rc = m_pDb->transBegin(XFLM_UPDATE_TRANS)))
|
|
{
|
|
MAKE_ERROR_STRING( "transBegin failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
bTransBegun = TRUE;
|
|
|
|
// We should not be able to create a sibling to this component
|
|
|
|
if ( RC_BAD( rc = pIndex->createNode(
|
|
m_pDb,
|
|
ELEMENT_NODE,
|
|
ELM_ELEMENT_COMPONENT_TAG,
|
|
XFLM_FIRST_CHILD,
|
|
&pTmpNode)))
|
|
{
|
|
MAKE_ERROR_STRING( "createNode failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Have to give it at least one attribute or we'll fail in documentDone
|
|
|
|
if ( RC_BAD( rc = pTmpNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_NAME_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUTF8( m_pDb, (FLMBYTE *)"bar")))
|
|
{
|
|
MAKE_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// This call should not work
|
|
rc = m_pDb->documentDone( pIndex);
|
|
|
|
if ( rc != NE_XFLM_BAD_USE_OF_ELM_ROOT_TAG)
|
|
{
|
|
MAKE_ERROR_STRING(
|
|
"Unexpected rc from documentDone on bad index def.",
|
|
m_szDetails, rc);
|
|
if ( RC_OK( rc))
|
|
{
|
|
rc = RC_SET( NE_XFLM_FAILURE);
|
|
}
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = m_pDb->transAbort()))
|
|
{
|
|
MAKE_ERROR_STRING( "transAbort failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
bTransBegun = FALSE;
|
|
|
|
if ( RC_BAD( rc = m_pDb->transBegin( XFLM_UPDATE_TRANS)))
|
|
{
|
|
MAKE_ERROR_STRING( "transBegin failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
bTransBegun = TRUE;
|
|
|
|
// This call should work since we corrected all of the errors
|
|
if ( RC_BAD( rc = m_pDb->documentDone( pIndex)))
|
|
{
|
|
MAKE_ERROR_STRING( "documentDone failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if( RC_BAD( rc = m_pDb->transCommit()))
|
|
{
|
|
MAKE_ERROR_STRING( "transCommit failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
bTransBegun = FALSE;
|
|
|
|
endTest("PASS");
|
|
|
|
beginTest(
|
|
"Sibling Element Uniqueness Test",
|
|
m_pszTestDesc = "Test to verify uniqueness rules among sibling elements",
|
|
"Verify that sibling elements and attributes are unique "
|
|
"- that we cannot use the same one twice if they are sibling components.",
|
|
"No additional info");
|
|
|
|
if( RC_BAD( rc = m_pDb->transBegin( XFLM_UPDATE_TRANS)))
|
|
{
|
|
MAKE_ERROR_STRING( "transBegin failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD ( rc = m_pDb->createRootElement(
|
|
XFLM_DICT_COLLECTION,
|
|
ELM_INDEX_TAG,
|
|
&pIndex)))
|
|
{
|
|
MAKE_ERROR_STRING( "createRootElement failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pIndex->createAttribute(
|
|
m_pDb,
|
|
ATTR_NAME_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUTF8( m_pDb,
|
|
(FLMBYTE *)"duplicate components index")))
|
|
{
|
|
MAKE_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pIndex->createNode(
|
|
m_pDb,
|
|
ELEMENT_NODE,
|
|
ELM_ELEMENT_COMPONENT_TAG,
|
|
XFLM_FIRST_CHILD,
|
|
&pNode)))
|
|
{
|
|
MAKE_ERROR_STRING( "createNode failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_NAME_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUTF8( m_pDb, (FLMBYTE *)"bar")))
|
|
{
|
|
MAKE_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_KEY_COMPONENT_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUINT( m_pDb, 1)))
|
|
{
|
|
MAKE_ERROR_STRING( "setUINT failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Create a duplicate
|
|
|
|
if ( RC_BAD( rc = pIndex->createNode(
|
|
m_pDb,
|
|
ELEMENT_NODE,
|
|
ELM_ELEMENT_COMPONENT_TAG,
|
|
XFLM_FIRST_CHILD,
|
|
&pNode)))
|
|
{
|
|
MAKE_ERROR_STRING( "createNode failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_KEY_COMPONENT_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD ( rc = pAttr->setUINT( m_pDb, 2)))
|
|
{
|
|
MAKE_ERROR_STRING( "setUINT failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_NAME_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUTF8( m_pDb, (FLMBYTE *)"bar")))
|
|
{
|
|
MAKE_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// This should fail because there are duplicate key components
|
|
|
|
rc = m_pDb->documentDone( pIndex);
|
|
if ( rc != NE_XFLM_DUP_SIBLING_IX_COMPONENTS)
|
|
{
|
|
MAKE_ERROR_STRING( "Invalid rc from documentDone. Expected: "
|
|
"NE_XFLM_DUP_SIBLING_IX_COMPONENTS.", m_szDetails, rc);
|
|
if ( RC_OK( rc))
|
|
{
|
|
rc = NE_XFLM_FAILURE;
|
|
}
|
|
goto Exit;
|
|
}
|
|
|
|
if( RC_BAD( rc = m_pDb->transAbort()))
|
|
{
|
|
MAKE_ERROR_STRING( "transAbort failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
bTransBegun = FALSE;
|
|
|
|
// Try again
|
|
|
|
if( RC_BAD( rc = m_pDb->transBegin( XFLM_UPDATE_TRANS)))
|
|
{
|
|
MAKE_ERROR_STRING( "transBegin failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
bTransBegun = TRUE;
|
|
|
|
if ( RC_BAD ( rc = m_pDb->createRootElement(
|
|
XFLM_DICT_COLLECTION,
|
|
ELM_INDEX_TAG,
|
|
&pIndex)))
|
|
{
|
|
MAKE_ERROR_STRING( "createRootElement failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pIndex->createAttribute(
|
|
m_pDb,
|
|
ATTR_NAME_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUTF8( m_pDb,
|
|
(FLMBYTE *)"duplicate components index")))
|
|
{
|
|
MAKE_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pIndex->createNode(
|
|
m_pDb,
|
|
ELEMENT_NODE,
|
|
ELM_ELEMENT_COMPONENT_TAG,
|
|
XFLM_FIRST_CHILD,
|
|
&pNode)))
|
|
{
|
|
MAKE_ERROR_STRING( "createNode failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_NAME_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUTF8( m_pDb, (FLMBYTE *)"bar")))
|
|
{
|
|
MAKE_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_KEY_COMPONENT_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUINT( m_pDb, 1)))
|
|
{
|
|
MAKE_ERROR_STRING( "setUINT failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Create a duplicate
|
|
|
|
if ( RC_BAD( rc = pIndex->createNode(
|
|
m_pDb,
|
|
ELEMENT_NODE,
|
|
ELM_ELEMENT_COMPONENT_TAG,
|
|
XFLM_FIRST_CHILD,
|
|
&pNode)))
|
|
{
|
|
MAKE_ERROR_STRING( "createNode failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_KEY_COMPONENT_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD ( rc = pAttr->setUINT( m_pDb, 2)))
|
|
{
|
|
MAKE_ERROR_STRING( "setUINT failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_NAME_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUTF8( m_pDb, (FLMBYTE *)"bar")))
|
|
{
|
|
MAKE_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Clean up our mess
|
|
|
|
if ( RC_BAD( rc = pAttr->setUTF8( m_pDb, (FLMBYTE *)"baz")))
|
|
{
|
|
MAKE_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pNode->createNode(
|
|
m_pDb,
|
|
ELEMENT_NODE,
|
|
ELM_ATTRIBUTE_COMPONENT_TAG,
|
|
XFLM_FIRST_CHILD,
|
|
&pTmpNode)))
|
|
{
|
|
MAKE_ERROR_STRING( "createNode failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pTmpNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_NAME_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUTF8( m_pDb, (FLMBYTE *)"foo")))
|
|
{
|
|
MAKE_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pTmpNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_DATA_COMPONENT_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUINT( m_pDb, 1)))
|
|
{
|
|
MAKE_ERROR_STRING( "setUINT failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Create a duplicate attribute component
|
|
|
|
if ( RC_BAD( rc = pNode->createNode(
|
|
m_pDb,
|
|
ELEMENT_NODE,
|
|
ELM_ATTRIBUTE_COMPONENT_TAG,
|
|
XFLM_FIRST_CHILD,
|
|
&pTmpNode)))
|
|
{
|
|
MAKE_ERROR_STRING( "createNode failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pTmpNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_NAME_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUTF8( m_pDb, (FLMBYTE *)"foo")))
|
|
{
|
|
MAKE_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pTmpNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_DATA_COMPONENT_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUINT( m_pDb, 2)))
|
|
{
|
|
MAKE_ERROR_STRING( "setUINT failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// This should fail because of our duplicate attr components
|
|
|
|
rc = m_pDb->documentDone( pIndex);
|
|
if ( rc != NE_XFLM_DUP_SIBLING_IX_COMPONENTS)
|
|
{
|
|
MAKE_ERROR_STRING( "Invalid rc from documentDone."
|
|
"Expected: NE_XFLM_DUP_SIBLING_IX_COMPONENTS", m_szDetails, rc);
|
|
if ( RC_OK( rc))
|
|
{
|
|
rc = NE_XFLM_FAILURE;
|
|
}
|
|
goto Exit;
|
|
}
|
|
|
|
if( RC_BAD( rc = m_pDb->transAbort()))
|
|
{
|
|
MAKE_ERROR_STRING( "transAbort failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
bTransBegun = FALSE;
|
|
|
|
// Try one more time
|
|
|
|
if( RC_BAD( rc = m_pDb->transBegin( XFLM_UPDATE_TRANS)))
|
|
{
|
|
MAKE_ERROR_STRING( "transBegin failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
bTransBegun = TRUE;
|
|
|
|
if ( RC_BAD ( rc = m_pDb->createRootElement(
|
|
XFLM_DICT_COLLECTION,
|
|
ELM_INDEX_TAG,
|
|
&pIndex)))
|
|
{
|
|
MAKE_ERROR_STRING( "createRootElement failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pIndex->createAttribute(
|
|
m_pDb,
|
|
ATTR_NAME_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUTF8( m_pDb,
|
|
(FLMBYTE *)"duplicate components index")))
|
|
{
|
|
MAKE_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pIndex->createNode(
|
|
m_pDb,
|
|
ELEMENT_NODE,
|
|
ELM_ELEMENT_COMPONENT_TAG,
|
|
XFLM_FIRST_CHILD,
|
|
&pNode)))
|
|
{
|
|
MAKE_ERROR_STRING( "createNode failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_NAME_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUTF8( m_pDb, (FLMBYTE *)"bar")))
|
|
{
|
|
MAKE_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_KEY_COMPONENT_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUINT( m_pDb, 1)))
|
|
{
|
|
MAKE_ERROR_STRING( "setUINT failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Create a duplicate
|
|
|
|
if ( RC_BAD( rc = pIndex->createNode(
|
|
m_pDb,
|
|
ELEMENT_NODE,
|
|
ELM_ELEMENT_COMPONENT_TAG,
|
|
XFLM_FIRST_CHILD,
|
|
&pNode)))
|
|
{
|
|
MAKE_ERROR_STRING( "createNode failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_KEY_COMPONENT_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD ( rc = pAttr->setUINT( m_pDb, 2)))
|
|
{
|
|
MAKE_ERROR_STRING( "setUINT failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_NAME_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUTF8( m_pDb, (FLMBYTE *)"bar")))
|
|
{
|
|
MAKE_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Clean up our mess
|
|
|
|
if ( RC_BAD( rc = pAttr->setUTF8( m_pDb, (FLMBYTE *)"baz")))
|
|
{
|
|
MAKE_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pNode->createNode(
|
|
m_pDb,
|
|
ELEMENT_NODE,
|
|
ELM_ATTRIBUTE_COMPONENT_TAG,
|
|
XFLM_FIRST_CHILD,
|
|
&pTmpNode)))
|
|
{
|
|
MAKE_ERROR_STRING( "createNode failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pTmpNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_NAME_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUTF8( m_pDb, (FLMBYTE *)"foo")))
|
|
{
|
|
MAKE_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pTmpNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_DATA_COMPONENT_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUINT( m_pDb, 1)))
|
|
{
|
|
MAKE_ERROR_STRING( "setUINT failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = m_pDb->transCommit()))
|
|
{
|
|
MAKE_ERROR_STRING( "transCommit failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
bTransBegun = FALSE;
|
|
|
|
if ( RC_BAD( rc = m_pDb->transBegin( XFLM_UPDATE_TRANS)))
|
|
{
|
|
MAKE_ERROR_STRING( "transBegin failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
bTransBegun = TRUE;
|
|
|
|
// Create a duplicate attribute component
|
|
|
|
if ( RC_BAD( rc = pNode->createNode(
|
|
m_pDb,
|
|
ELEMENT_NODE,
|
|
ELM_ATTRIBUTE_COMPONENT_TAG,
|
|
XFLM_FIRST_CHILD,
|
|
&pTmpNode)))
|
|
{
|
|
MAKE_ERROR_STRING( "createNode failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pTmpNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_NAME_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUTF8( m_pDb, (FLMBYTE *)"foo")))
|
|
{
|
|
MAKE_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pTmpNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_DATA_COMPONENT_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUINT( m_pDb, 2)))
|
|
{
|
|
MAKE_ERROR_STRING( "setUINT failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
rc = m_pDb->documentDone( pIndex);
|
|
|
|
if ( rc != NE_XFLM_DUP_SIBLING_IX_COMPONENTS)
|
|
{
|
|
MAKE_ERROR_STRING( "Incorrect rc from documentDone."
|
|
" Expected: NE_XFLM_DUP_SIBLING_IX_COMPONENTS.", m_szDetails, rc);
|
|
|
|
if ( RC_OK( rc))
|
|
{
|
|
rc = NE_XFLM_FAILURE;
|
|
}
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = m_pDb->transAbort()))
|
|
{
|
|
MAKE_ERROR_STRING( "transAbort failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
bTransBegun = FALSE;
|
|
|
|
if ( RC_BAD( rc = m_pDb->transBegin( XFLM_UPDATE_TRANS)))
|
|
{
|
|
MAKE_ERROR_STRING( "transBegin failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
bTransBegun = TRUE;
|
|
|
|
// We should be okay now
|
|
|
|
if ( RC_BAD( rc = m_pDb->documentDone( pIndex)))
|
|
{
|
|
MAKE_ERROR_STRING( "documentDone failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if( RC_BAD( rc = m_pDb->transCommit()))
|
|
{
|
|
MAKE_ERROR_STRING( "transCommit failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
bTransBegun = FALSE;
|
|
|
|
endTest("PASS");
|
|
|
|
beginTest(
|
|
"Key/Data Component Value Test",
|
|
"Verify that the key component number attribute "
|
|
"(ATTR_KEY_COMPONENT_TAG) and the data component number attribute "
|
|
"(ATTR_DATA_COMPONENT_TAG) are not set to a value of zero.",
|
|
"Self-Explanatory.",
|
|
"");
|
|
|
|
if( RC_BAD( rc = m_pDb->transBegin( XFLM_UPDATE_TRANS)))
|
|
{
|
|
MAKE_ERROR_STRING( "transBegin failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
bTransBegun = TRUE;
|
|
|
|
if ( RC_BAD( rc = pIndex->getFirstChild(
|
|
m_pDb,
|
|
&pNode)))
|
|
{
|
|
MAKE_ERROR_STRING( "getFirstChild failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( pNode->getAttribute(
|
|
m_pDb,
|
|
ATTR_KEY_COMPONENT_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "getAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->getUINT(
|
|
m_pDb,
|
|
&uiTemp)))
|
|
{
|
|
MAKE_ERROR_STRING( "getUINT failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( uiTemp == 0)
|
|
{
|
|
MAKE_ERROR_STRING( "Invalid key component number.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pNode->getFirstChild(
|
|
m_pDb,
|
|
&pNode)))
|
|
{
|
|
MAKE_ERROR_STRING( "getFirstChild failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( pNode->getAttribute(
|
|
m_pDb,
|
|
ATTR_DATA_COMPONENT_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "getAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->getUINT(
|
|
m_pDb,
|
|
&uiTemp)))
|
|
{
|
|
MAKE_ERROR_STRING( "getUINT failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( uiTemp == 0)
|
|
{
|
|
MAKE_ERROR_STRING( "Invalid key component number.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if( RC_BAD( rc = m_pDb->transCommit()))
|
|
{
|
|
MAKE_ERROR_STRING( "transCommit failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
bTransBegun = FALSE;
|
|
|
|
endTest("PASS");
|
|
|
|
beginTest(
|
|
"Component Sequence Number Test",
|
|
"Verify rules regarding key/data component sequence numbers "
|
|
"are enforced. ",
|
|
"Verify that FLAIM disallows a sequence of key component "
|
|
"numbers or data component numbers that has gaps (e.g. 1 3 4 5 - 2 is "
|
|
"missing) or that does not begin with 1. Also verify that each component "
|
|
"number is used once and only once. Also verify that FLAIM requires at "
|
|
"least one key component but does not require at least one data component.",
|
|
"");
|
|
|
|
if( RC_BAD( rc = m_pDb->transBegin( XFLM_UPDATE_TRANS)))
|
|
{
|
|
MAKE_ERROR_STRING( "transBegin failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
bTransBegun = TRUE;
|
|
|
|
if ( RC_BAD( rc = m_pDb->createRootElement(
|
|
XFLM_DICT_COLLECTION,
|
|
ELM_INDEX_TAG,
|
|
&pIndex)))
|
|
{
|
|
MAKE_ERROR_STRING( "createRootElement failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pIndex->createAttribute(
|
|
m_pDb,
|
|
ATTR_NAME_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUTF8( m_pDb, (FLMBYTE *)"Sequence Test")))
|
|
{
|
|
MAKE_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// This should not work because FLAIM requires at least one key component
|
|
|
|
rc = m_pDb->documentDone( pIndex);
|
|
|
|
if ( rc != NE_XFLM_ILLEGAL_INDEX_DEF)
|
|
{
|
|
MAKE_ERROR_STRING( "Incorrect rc from documentDone. "
|
|
"Expected: NE_XFLM_ILLEGAL_INDEX_DEF.", m_szDetails, rc);
|
|
if ( RC_OK( rc))
|
|
{
|
|
rc = NE_XFLM_FAILURE;
|
|
}
|
|
goto Exit;
|
|
}
|
|
|
|
if( RC_BAD( rc = m_pDb->transAbort()))
|
|
{
|
|
MAKE_ERROR_STRING( "transAbort failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Try again
|
|
|
|
if( RC_BAD( rc = m_pDb->transBegin( XFLM_UPDATE_TRANS)))
|
|
{
|
|
MAKE_ERROR_STRING( "transBegin failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = m_pDb->createRootElement(
|
|
XFLM_DICT_COLLECTION,
|
|
ELM_INDEX_TAG,
|
|
&pIndex)))
|
|
{
|
|
MAKE_ERROR_STRING( "createRootElement failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pIndex->createAttribute(
|
|
m_pDb,
|
|
ATTR_NAME_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUTF8( m_pDb, (FLMBYTE *)"Sequence Test")))
|
|
{
|
|
MAKE_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pIndex->createNode(
|
|
m_pDb,
|
|
ELEMENT_NODE,
|
|
ELM_ELEMENT_COMPONENT_TAG,
|
|
XFLM_FIRST_CHILD,
|
|
&pNode)))
|
|
{
|
|
MAKE_ERROR_STRING( "createNode failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_NAME_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUTF8( m_pDb, (FLMBYTE *)"bar")))
|
|
{
|
|
MAKE_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Try to give this first component a key comp != 1
|
|
|
|
if ( RC_BAD( rc = pNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_KEY_COMPONENT_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD ( rc = pAttr->setUINT( m_pDb, 7)))
|
|
{
|
|
MAKE_ERROR_STRING( "setUINT failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// This should fail because the first index key component != 1
|
|
|
|
rc = m_pDb->documentDone( pIndex);
|
|
|
|
if ( rc != NE_XFLM_MISSING_KEY_COMPONENT)
|
|
{
|
|
MAKE_ERROR_STRING( "Invalid rc from documentDone. Expected: "
|
|
"NE_XFLM_MISSING_KEY_COMPONENT.", m_szDetails, rc);
|
|
if ( RC_OK( rc))
|
|
{
|
|
rc = NE_XFLM_FAILURE;
|
|
}
|
|
goto Exit;
|
|
}
|
|
|
|
if( RC_BAD( rc = m_pDb->transAbort()))
|
|
{
|
|
MAKE_ERROR_STRING( "transAbort failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
bTransBegun = FALSE;
|
|
|
|
// Try again
|
|
|
|
if( RC_BAD( rc = m_pDb->transBegin( XFLM_UPDATE_TRANS)))
|
|
{
|
|
MAKE_ERROR_STRING( "transBegin failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
bTransBegun = TRUE;
|
|
|
|
if ( RC_BAD( rc = m_pDb->createRootElement(
|
|
XFLM_DICT_COLLECTION,
|
|
ELM_INDEX_TAG,
|
|
&pIndex)))
|
|
{
|
|
MAKE_ERROR_STRING( "createRootElement failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pIndex->createAttribute(
|
|
m_pDb,
|
|
ATTR_NAME_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUTF8( m_pDb, (FLMBYTE *)"Sequence Test")))
|
|
{
|
|
MAKE_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pIndex->createNode(
|
|
m_pDb,
|
|
ELEMENT_NODE,
|
|
ELM_ELEMENT_COMPONENT_TAG,
|
|
XFLM_FIRST_CHILD,
|
|
&pNode)))
|
|
{
|
|
MAKE_ERROR_STRING( "createNode failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_NAME_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUTF8( m_pDb, (FLMBYTE *)"bar")))
|
|
{
|
|
MAKE_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Try to give this first component a key comp != 1
|
|
|
|
if ( RC_BAD( rc = pNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_KEY_COMPONENT_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD ( rc = pAttr->setUINT( m_pDb, 7)))
|
|
{
|
|
MAKE_ERROR_STRING( "setUINT failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Fix our mistake
|
|
|
|
if ( RC_BAD( rc = pAttr->setUINT( m_pDb, 1)))
|
|
{
|
|
MAKE_ERROR_STRING( "setUINT failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Create a new element component
|
|
|
|
if ( RC_BAD( rc = pIndex->createNode(
|
|
m_pDb,
|
|
ELEMENT_NODE,
|
|
ELM_ELEMENT_COMPONENT_TAG,
|
|
XFLM_FIRST_CHILD,
|
|
&pNode)))
|
|
{
|
|
MAKE_ERROR_STRING( "createNode failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_NAME_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUTF8( m_pDb, (FLMBYTE *)"baz")))
|
|
{
|
|
MAKE_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_KEY_COMPONENT_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Try to give this component the same sequence number as the first
|
|
|
|
if ( RC_BAD( rc = pAttr->setUINT(
|
|
m_pDb,
|
|
1)))
|
|
{
|
|
MAKE_ERROR_STRING( "setUINT failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// This should fail because of duplicate sequence numbers
|
|
|
|
rc = m_pDb->documentDone( pIndex);
|
|
|
|
if ( rc != NE_XFLM_DUPLICATE_KEY_COMPONENT)
|
|
{
|
|
MAKE_ERROR_STRING( "Invalid rc from documentDone. "
|
|
"Expected: NE_XFLM_DUPLICATE_KEY_COMPONENT.", m_szDetails, rc);
|
|
if ( RC_OK( rc))
|
|
{
|
|
rc = NE_XFLM_FAILURE;
|
|
}
|
|
goto Exit;
|
|
}
|
|
|
|
if( RC_BAD( rc = m_pDb->transAbort()))
|
|
{
|
|
MAKE_ERROR_STRING( "transAbort failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
bTransBegun = FALSE;
|
|
|
|
// Try again
|
|
|
|
if( RC_BAD( rc = m_pDb->transBegin( XFLM_UPDATE_TRANS)))
|
|
{
|
|
MAKE_ERROR_STRING( "transBegin failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
bTransBegun = TRUE;
|
|
|
|
if ( RC_BAD( rc = m_pDb->createRootElement(
|
|
XFLM_DICT_COLLECTION,
|
|
ELM_INDEX_TAG,
|
|
&pIndex)))
|
|
{
|
|
MAKE_ERROR_STRING( "createRootElement failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pIndex->createAttribute(
|
|
m_pDb,
|
|
ATTR_NAME_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUTF8( m_pDb, (FLMBYTE *)"Sequence Test")))
|
|
{
|
|
MAKE_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pIndex->createNode(
|
|
m_pDb,
|
|
ELEMENT_NODE,
|
|
ELM_ELEMENT_COMPONENT_TAG,
|
|
XFLM_FIRST_CHILD,
|
|
&pNode)))
|
|
{
|
|
MAKE_ERROR_STRING( "createNode failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_NAME_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUTF8( m_pDb, (FLMBYTE *)"bar")))
|
|
{
|
|
MAKE_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Try to give this first component a key comp != 1
|
|
|
|
if ( RC_BAD( rc = pNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_KEY_COMPONENT_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD ( rc = pAttr->setUINT( m_pDb, 7)))
|
|
{
|
|
MAKE_ERROR_STRING( "setUINT failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Fix our mistake
|
|
|
|
if ( RC_BAD( rc = pAttr->setUINT( m_pDb, 1)))
|
|
{
|
|
MAKE_ERROR_STRING( "setUINT failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Create a new element component
|
|
|
|
if ( RC_BAD( rc = pIndex->createNode(
|
|
m_pDb,
|
|
ELEMENT_NODE,
|
|
ELM_ELEMENT_COMPONENT_TAG,
|
|
XFLM_FIRST_CHILD,
|
|
&pNode)))
|
|
{
|
|
MAKE_ERROR_STRING( "createNode failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_NAME_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUTF8( m_pDb, (FLMBYTE *)"baz")))
|
|
{
|
|
MAKE_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_KEY_COMPONENT_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Try to give this component the same sequence number as the first
|
|
|
|
if ( RC_BAD( rc = pAttr->setUINT(
|
|
m_pDb,
|
|
1)))
|
|
{
|
|
MAKE_ERROR_STRING( "setUINT failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Change the number for one out of sequence
|
|
|
|
if ( RC_BAD( rc = pAttr->setUINT( m_pDb, 8)))
|
|
{
|
|
MAKE_ERROR_STRING( "setUINT failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// This should fail because of holes in the sequence
|
|
rc = m_pDb->documentDone( pIndex);
|
|
|
|
if ( rc != NE_XFLM_MISSING_KEY_COMPONENT)
|
|
{
|
|
MAKE_ERROR_STRING( "Invalid rc from documentDone. "
|
|
"Expected: NE_XFLM_MISSING_KEY_COMPONENT.", m_szDetails, rc);
|
|
if ( RC_OK( rc))
|
|
{
|
|
rc = NE_XFLM_FAILURE;
|
|
}
|
|
goto Exit;
|
|
}
|
|
|
|
if( RC_BAD( rc = m_pDb->transAbort()))
|
|
{
|
|
MAKE_ERROR_STRING( "transAbort failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
bTransBegun = FALSE;
|
|
|
|
// Try again
|
|
|
|
if( RC_BAD( rc = m_pDb->transBegin( XFLM_UPDATE_TRANS)))
|
|
{
|
|
MAKE_ERROR_STRING( "transBegin failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
bTransBegun = TRUE;
|
|
|
|
if ( RC_BAD( rc = m_pDb->createRootElement(
|
|
XFLM_DICT_COLLECTION,
|
|
ELM_INDEX_TAG,
|
|
&pIndex)))
|
|
{
|
|
MAKE_ERROR_STRING( "createRootElement failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pIndex->createAttribute(
|
|
m_pDb,
|
|
ATTR_NAME_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUTF8( m_pDb, (FLMBYTE *)"Sequence Test")))
|
|
{
|
|
MAKE_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pIndex->createNode(
|
|
m_pDb,
|
|
ELEMENT_NODE,
|
|
ELM_ELEMENT_COMPONENT_TAG,
|
|
XFLM_FIRST_CHILD,
|
|
&pNode)))
|
|
{
|
|
MAKE_ERROR_STRING( "createNode failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_NAME_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUTF8( m_pDb, (FLMBYTE *)"bar")))
|
|
{
|
|
MAKE_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Try to give this first component a key comp != 1
|
|
|
|
if ( RC_BAD( rc = pNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_KEY_COMPONENT_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD ( rc = pAttr->setUINT( m_pDb, 7)))
|
|
{
|
|
MAKE_ERROR_STRING( "setUINT failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Fix our mistake
|
|
|
|
if ( RC_BAD( rc = pAttr->setUINT( m_pDb, 1)))
|
|
{
|
|
MAKE_ERROR_STRING( "setUINT failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Create a new element component
|
|
|
|
if ( RC_BAD( rc = pIndex->createNode(
|
|
m_pDb,
|
|
ELEMENT_NODE,
|
|
ELM_ELEMENT_COMPONENT_TAG,
|
|
XFLM_FIRST_CHILD,
|
|
&pNode)))
|
|
{
|
|
MAKE_ERROR_STRING( "createNode failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_NAME_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUTF8( m_pDb, (FLMBYTE *)"baz")))
|
|
{
|
|
MAKE_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_KEY_COMPONENT_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Try to give this component the same sequence number as the first
|
|
|
|
if ( RC_BAD( rc = pAttr->setUINT(
|
|
m_pDb,
|
|
1)))
|
|
{
|
|
MAKE_ERROR_STRING( "setUINT failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Change the number for one out of sequence
|
|
|
|
if ( RC_BAD( rc = pAttr->setUINT( m_pDb, 8)))
|
|
{
|
|
MAKE_ERROR_STRING( "setUINT failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Correct our mistake
|
|
|
|
if ( RC_BAD( rc = pAttr->setUINT( m_pDb, 2)))
|
|
{
|
|
MAKE_ERROR_STRING( "setUINT failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
rc = m_pDb->documentDone( pIndex);
|
|
|
|
if( RC_BAD( rc))
|
|
{
|
|
MAKE_ERROR_STRING( "documentDone failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if( RC_BAD( rc = m_pDb->transCommit()))
|
|
{
|
|
MAKE_ERROR_STRING( "transCommit failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
bTransBegun = FALSE;
|
|
|
|
endTest("PASS");
|
|
|
|
beginTest(
|
|
"Attribute Component Test",
|
|
"Verify that attribute components are not allowed to have child "
|
|
"components. Verify that attribute components are required to be marked as "
|
|
"either a key component or a data component.",
|
|
"1) Create an Attribute Component 2) Create a child for that "
|
|
"attribute component. 3) Verify documentDone fails with correct rc 4) "
|
|
"Delete the child node and verify documentDone succeeds.",
|
|
"");
|
|
|
|
if( RC_BAD( rc = m_pDb->transBegin( XFLM_UPDATE_TRANS)))
|
|
{
|
|
MAKE_ERROR_STRING( "transBegin failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
bTransBegun = TRUE;
|
|
|
|
if( RC_BAD( rc = pNode->getNodeId( m_pDb, &ui64ElemComponent)))
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
// pNode is pointing to an element component node.
|
|
// Create an attr component underneath
|
|
|
|
if ( RC_BAD( pNode->createNode(
|
|
m_pDb,
|
|
ELEMENT_NODE,
|
|
ELM_ATTRIBUTE_COMPONENT_TAG,
|
|
XFLM_FIRST_CHILD,
|
|
&pNode)))
|
|
{
|
|
MAKE_ERROR_STRING( "createNode failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_NAME_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUTF8( m_pDb, (FLMBYTE *)"foo")))
|
|
{
|
|
MAKE_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD ( rc = pNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_KEY_COMPONENT_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUINT( m_pDb, 3)))
|
|
{
|
|
MAKE_ERROR_STRING( "setUINT failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Try to add another attribute component under this one
|
|
|
|
if ( RC_BAD( rc = pNode->createNode(
|
|
m_pDb,
|
|
ELEMENT_NODE,
|
|
ELM_ATTRIBUTE_COMPONENT_TAG,
|
|
XFLM_FIRST_CHILD,
|
|
&pTmpNode)))
|
|
{
|
|
MAKE_ERROR_STRING( "createNode failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// This should not work because of the nested attribute component
|
|
|
|
rc = m_pDb->documentDone( pIndex);
|
|
if ( rc != NE_XFLM_ILLEGAL_INDEX_DEF)
|
|
{
|
|
MAKE_ERROR_STRING( "Incorrect rc from documentDone. "
|
|
"Expected: NE_XFLM_ILLEGAL_INDEX_DEF", m_szDetails, rc);
|
|
if ( RC_OK( rc))
|
|
{
|
|
rc = NE_XFLM_FAILURE;
|
|
}
|
|
goto Exit;
|
|
}
|
|
|
|
if( RC_BAD( rc = m_pDb->transAbort()))
|
|
{
|
|
MAKE_ERROR_STRING( "transAbort failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
bTransBegun = FALSE;
|
|
|
|
// Try again
|
|
|
|
if( RC_BAD( rc = m_pDb->transBegin( XFLM_UPDATE_TRANS)))
|
|
{
|
|
MAKE_ERROR_STRING( "transBegin failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
bTransBegun = TRUE;
|
|
|
|
if( RC_BAD( rc = m_pDb->getNode(
|
|
XFLM_DICT_COLLECTION, ui64ElemComponent, &pNode)))
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pNode->createNode(
|
|
m_pDb,
|
|
ELEMENT_NODE,
|
|
ELM_ATTRIBUTE_COMPONENT_TAG,
|
|
XFLM_FIRST_CHILD,
|
|
&pNode)))
|
|
{
|
|
MAKE_ERROR_STRING( "createNode failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_NAME_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUTF8( m_pDb, (FLMBYTE *)"foo")))
|
|
{
|
|
MAKE_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD ( rc = pNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_KEY_COMPONENT_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUINT( m_pDb, 3)))
|
|
{
|
|
MAKE_ERROR_STRING( "setUINT failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// Try to add another attribute component under this one
|
|
|
|
if ( RC_BAD( rc = pNode->createNode(
|
|
m_pDb,
|
|
ELEMENT_NODE,
|
|
ELM_ATTRIBUTE_COMPONENT_TAG,
|
|
XFLM_FIRST_CHILD,
|
|
&pTmpNode)))
|
|
{
|
|
MAKE_ERROR_STRING( "createNode failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pTmpNode->deleteNode( m_pDb)))
|
|
{
|
|
MAKE_ERROR_STRING( "deleteNode failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// All of our errors should now be corrected
|
|
// NOTE - this works even though we have no data components
|
|
// (they should not be required).
|
|
|
|
if ( RC_BAD( rc = m_pDb->documentDone( pIndex)))
|
|
{
|
|
MAKE_ERROR_STRING( "documentDone failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if( RC_BAD( rc = m_pDb->transCommit()))
|
|
{
|
|
MAKE_ERROR_STRING( "transCommit failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
bTransBegun = FALSE;
|
|
|
|
endTest("PASS");
|
|
|
|
beginTest(
|
|
"Name/Dict Number Attribute Tests",
|
|
"Tests to ensure name and dict number rules are being enforced",
|
|
"1) Verify that if both the name and number attributes are "
|
|
"specified that they reference the same element or attribute definition "
|
|
"2) Verify that at least one of these is required to be specified for "
|
|
"each component. ",
|
|
"");
|
|
|
|
if( RC_BAD( rc = m_pDb->transBegin( XFLM_UPDATE_TRANS)))
|
|
{
|
|
MAKE_ERROR_STRING( "transBegin failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
bTransBegun = TRUE;
|
|
|
|
//NOTE: pNode still references "foo" attribute component
|
|
|
|
if ( RC_BAD( rc = pNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_DICT_NUMBER_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUINT( m_pDb, uiAttrDefDictNum + 17)))
|
|
{
|
|
MAKE_ERROR_STRING( "setUINT failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// This should fail because name and dict number don't refer to the same thing
|
|
|
|
rc = m_pDb->documentDone( pIndex);
|
|
|
|
if ( rc != NE_XFLM_ATTRIBUTE_NAME_MISMATCH)
|
|
{
|
|
MAKE_ERROR_STRING( "Invalid rc from documentDone. Expected: "
|
|
"NE_XFLM_ATTRIBUTE_NAME_MISMATCH", m_szDetails, rc);
|
|
if ( RC_OK( rc))
|
|
{
|
|
rc = NE_XFLM_FAILURE;
|
|
}
|
|
goto Exit;
|
|
}
|
|
|
|
if( RC_BAD( rc = m_pDb->transAbort()))
|
|
{
|
|
MAKE_ERROR_STRING( "transAbort failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
bTransBegun = FALSE;
|
|
|
|
// Try again
|
|
|
|
if( RC_BAD( rc = m_pDb->transBegin( XFLM_UPDATE_TRANS)))
|
|
{
|
|
MAKE_ERROR_STRING( "transBegin failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
bTransBegun = TRUE;
|
|
|
|
//NOTE: pNode still references "foo" attribute component
|
|
|
|
if ( RC_BAD( rc = pNode->createAttribute(
|
|
m_pDb,
|
|
ATTR_DICT_NUMBER_TAG,
|
|
&pAttr)))
|
|
{
|
|
MAKE_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUINT( m_pDb, uiAttrDefDictNum + 17)))
|
|
{
|
|
MAKE_ERROR_STRING( "setUINT failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if ( RC_BAD( rc = pAttr->setUINT( m_pDb, uiAttrDefDictNum)))
|
|
{
|
|
MAKE_ERROR_STRING( "setUINT failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
// We should be okay now
|
|
|
|
if ( RC_BAD( rc = m_pDb->documentDone( pIndex)))
|
|
{
|
|
MAKE_ERROR_STRING( "documentDone failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
|
|
if( RC_BAD( rc = m_pDb->transCommit()))
|
|
{
|
|
MAKE_ERROR_STRING( "transCommit failed.", m_szDetails, rc);
|
|
goto Exit;
|
|
}
|
|
bTransBegun = FALSE;
|
|
|
|
endTest("PASS");
|
|
|
|
Exit:
|
|
|
|
if ( RC_BAD( rc))
|
|
{
|
|
outputAll("FAIL");
|
|
}
|
|
|
|
if ( pIndex)
|
|
{
|
|
pIndex->Release();
|
|
}
|
|
if ( pNode)
|
|
{
|
|
pNode->Release();
|
|
}
|
|
if ( pAttr)
|
|
{
|
|
pAttr->Release();
|
|
}
|
|
if ( pAttrDef)
|
|
{
|
|
pAttrDef->Release();
|
|
}
|
|
if ( pElemDef)
|
|
{
|
|
pElemDef->Release();
|
|
}
|
|
if ( pTmpNode)
|
|
{
|
|
pTmpNode->Release();
|
|
}
|
|
|
|
if ( bTransBegun)
|
|
{
|
|
if ( RC_OK( rc))
|
|
{
|
|
m_pDb->transCommit();
|
|
}
|
|
else
|
|
{
|
|
m_pDb->transAbort();
|
|
}
|
|
}
|
|
|
|
shutdownTestState( DB_NAME_STR, bDibCreated);
|
|
return( rc);
|
|
}
|