git-svn-id: https://svn.code.sf.net/p/flaim/code/trunk@74 0109f412-320b-0410-ab79-c3e0c5ffbbe6
1205 lines
24 KiB
C++
1205 lines
24 KiB
C++
//-------------------------------------------------------------------------
|
|
// Desc: Basic unit test.
|
|
// Tabs: 3
|
|
//
|
|
// Copyright (c) 2004-2006 Novell, Inc. All Rights Reserved.
|
|
//
|
|
// This program is free software; you can redistribute it and/or
|
|
// modify it under the terms of version 2 of the GNU General Public
|
|
// License as published by the Free Software Foundation.
|
|
//
|
|
// This program 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 General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with this program; 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: basic_test.cpp 12329 2006-01-20 17:49:30 -0700 (Fri, 20 Jan 2006) ahodgkinson $
|
|
//-------------------------------------------------------------------------
|
|
|
|
#include "flmunittest.h"
|
|
|
|
FSTATIC const char * gv_pszSampleDictionary =
|
|
"0 @1@ field Person\n"
|
|
" 1 type text\n"
|
|
"0 @2@ field LastName\n"
|
|
" 1 type text\n"
|
|
"0 @3@ field FirstName\n"
|
|
" 1 type text\n"
|
|
"0 @4@ field Age\n"
|
|
" 1 type number\n"
|
|
"0 @5@ index LastFirst_IX\n"
|
|
" 1 language US\n"
|
|
" 1 key\n"
|
|
" 2 field 2\n"
|
|
" 3 required\n"
|
|
" 2 field 3\n"
|
|
" 3 required\n";
|
|
|
|
const char * gv_pszFamilyNames[] =
|
|
{
|
|
"Walton",
|
|
"Abernathy",
|
|
"Stillwell",
|
|
"Anderson",
|
|
"Armstrong",
|
|
"Adamson",
|
|
"Bagwell",
|
|
"Ballard",
|
|
"Bennett",
|
|
"Blackman",
|
|
"Bottoms",
|
|
"Bradley",
|
|
"Butterfield",
|
|
"Cavanagh",
|
|
"Chadwick",
|
|
"Clark",
|
|
"Crabtree",
|
|
"Cunningham",
|
|
"Darnell",
|
|
"McClintock",
|
|
"Davidson",
|
|
"Dingman",
|
|
"Doyle",
|
|
"Eastman",
|
|
"Ballantine",
|
|
"Edmunds",
|
|
"Neil",
|
|
"Erickson",
|
|
"Fetterman",
|
|
"Finn",
|
|
"Flanagan",
|
|
"Gerber",
|
|
"Thedford",
|
|
"Thorman",
|
|
"Gibson",
|
|
"Gruszczynski",
|
|
"Haaksman",
|
|
"Hathaway",
|
|
"Pernell",
|
|
"Phillips",
|
|
"Highsmith",
|
|
"Hollingworth",
|
|
"Frankenberger",
|
|
"Hutchison",
|
|
"Irving",
|
|
"Weatherspoon",
|
|
"Itaya",
|
|
"Janiszewski",
|
|
"Jenkins",
|
|
"Jung",
|
|
"Keller",
|
|
"Jackson",
|
|
"Kingsbury",
|
|
"Klostermann",
|
|
"Langley",
|
|
"Liddle",
|
|
"Lockhart",
|
|
"Ludwig",
|
|
"Kristjanson",
|
|
"MacCormack",
|
|
"Richards",
|
|
"Robbins",
|
|
"McAuliffe",
|
|
"Merryweather",
|
|
"Moynihan",
|
|
"Muller",
|
|
"Newland",
|
|
"OCarroll",
|
|
"Okuzawa",
|
|
"Ortiz",
|
|
"Pachulski",
|
|
"Parmaksezian",
|
|
"Peacocke",
|
|
"Poole",
|
|
"Prewitt",
|
|
"Quigley",
|
|
"Qureshi",
|
|
"Ratcliffe",
|
|
"Rundle",
|
|
"Ryder",
|
|
"Sampson",
|
|
"Satterfield",
|
|
"Sharkey",
|
|
"Silverman",
|
|
"Snedeker",
|
|
"Goodman",
|
|
"Spitzer",
|
|
"Szypulski",
|
|
"Talbott",
|
|
"Trisko",
|
|
"Turrubiarte",
|
|
"Upchurch",
|
|
"Valdez",
|
|
"Vandenheede",
|
|
"Volker",
|
|
"Wilke",
|
|
"Wojciechowski",
|
|
"Wyndham",
|
|
"Yamashita",
|
|
"York",
|
|
"Zahn",
|
|
"Zimmermann",
|
|
NULL
|
|
};
|
|
|
|
const char * gv_pszGivenNames[] =
|
|
{
|
|
"Robby",
|
|
"Agatha",
|
|
"Anatoli",
|
|
"Zsazsa",
|
|
"Arlen",
|
|
"Augusta",
|
|
"Bambi",
|
|
"Bee",
|
|
"Bennie",
|
|
"Bonni",
|
|
"Brennan",
|
|
"Bryon",
|
|
"Cal",
|
|
"Caroline",
|
|
"Charlotte",
|
|
"Cristine",
|
|
"Danny",
|
|
"Dean",
|
|
"Desdemona",
|
|
"Dixie",
|
|
"Doug",
|
|
"Ellie",
|
|
"Zelma",
|
|
"Elsie",
|
|
"Ursula",
|
|
"Ernest",
|
|
"Fanny",
|
|
"Francis",
|
|
"Gailya",
|
|
"Gertrude",
|
|
"Gloria",
|
|
"Greg",
|
|
"Harriot",
|
|
"Hennrietta",
|
|
"Howard",
|
|
"Ian",
|
|
"Sherwood",
|
|
"Xavier",
|
|
"Ira",
|
|
"Jacklyn",
|
|
"Jeff",
|
|
"Philippe",
|
|
"Vivianne",
|
|
"Jeremy",
|
|
"Wendie",
|
|
"Abbie",
|
|
"Johnny",
|
|
"Kerrie",
|
|
"Lacey",
|
|
"Lilly",
|
|
"Lucas",
|
|
"Magdalena",
|
|
"Maryanne",
|
|
"Matt",
|
|
"Dorelle",
|
|
"Myron",
|
|
"Netty",
|
|
"Nicolette",
|
|
"Octavio",
|
|
"Oliver",
|
|
"Paige",
|
|
"Parker",
|
|
"Patti",
|
|
"Merv",
|
|
"Preston",
|
|
"Quinn",
|
|
"Randall",
|
|
"Jean",
|
|
"Rebekah",
|
|
"Ricardo",
|
|
"Rose",
|
|
"Russell",
|
|
"Scarlet",
|
|
"Shannon",
|
|
"Larry",
|
|
"Sophie",
|
|
"Stephen",
|
|
"Susette",
|
|
"Christina",
|
|
"Ted",
|
|
"Enrico",
|
|
"Theresa",
|
|
"Timothy",
|
|
"Tony",
|
|
"Vanna",
|
|
"Kalli",
|
|
"Vern",
|
|
"Alicia",
|
|
"Wallace",
|
|
"Yogi",
|
|
"Aaron",
|
|
"Yuji",
|
|
"Zack",
|
|
NULL
|
|
};
|
|
|
|
#define PERSON_TAG 1
|
|
#define LAST_NAME_TAG 2
|
|
#define FIRST_NAME_TAG 3
|
|
#define AGE_TAG 4
|
|
#define LAST_NAME_FIRST_NAME_IX 5
|
|
|
|
#ifdef FLM_NLM
|
|
#define DB_NAME_STR "SYS:\\SAMPLE.DB"
|
|
#else
|
|
#define DB_NAME_STR "sample.db"
|
|
#endif
|
|
|
|
/***************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
class IFlmTestImpl : public TestBase
|
|
{
|
|
public:
|
|
|
|
IFlmTestImpl()
|
|
{
|
|
m_hDb = HFDB_NULL;
|
|
}
|
|
|
|
virtual ~IFlmTestImpl()
|
|
{
|
|
if (m_hDb != HFDB_NULL)
|
|
{
|
|
(void)FlmDbClose( &m_hDb);
|
|
}
|
|
}
|
|
|
|
inline const char * getName( void)
|
|
{
|
|
return( "Basic Test");
|
|
}
|
|
|
|
RCODE createDbTest( void);
|
|
|
|
RCODE addRecordTest(
|
|
FLMUINT * puiDrn);
|
|
|
|
RCODE modifyRecordTest(
|
|
FLMUINT uiDrn);
|
|
|
|
RCODE deleteRecordTest(
|
|
FLMUINT uiDrn);
|
|
|
|
RCODE queryRecordTest( void);
|
|
|
|
RCODE keyRetrieveTest(
|
|
FLMUINT uiIndex,
|
|
FLMBOOL bLastNameFirstNameIx);
|
|
|
|
RCODE addIndexTest(
|
|
FLMUINT * puiIndex);
|
|
|
|
RCODE removeDbTest( void);
|
|
|
|
RCODE execute( void);
|
|
|
|
private:
|
|
|
|
HFDB m_hDb;
|
|
};
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
RCODE getTest(
|
|
IFlmTest ** ppTest)
|
|
{
|
|
RCODE rc = FERR_OK;
|
|
|
|
if( (*ppTest = new IFlmTestImpl) == NULL)
|
|
{
|
|
rc = RC_SET( FERR_MEM);
|
|
goto Exit;
|
|
}
|
|
|
|
Exit:
|
|
|
|
return( rc);
|
|
}
|
|
|
|
/***************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
RCODE IFlmTestImpl::createDbTest( void)
|
|
{
|
|
RCODE rc = FERR_OK;
|
|
FLMBOOL bPassed = FALSE;
|
|
|
|
beginTest( "Create Database Test");
|
|
|
|
for (;;)
|
|
{
|
|
if( RC_BAD( rc = FlmDbCreate( DB_NAME_STR, NULL,
|
|
NULL, NULL, gv_pszSampleDictionary, NULL, &m_hDb)))
|
|
{
|
|
if( rc == FERR_FILE_EXISTS)
|
|
{
|
|
// Since the database already exists, we'll make a call
|
|
// to FlmDbOpen to get a handle to it.
|
|
|
|
if( RC_BAD( rc = FlmDbRemove( DB_NAME_STR,
|
|
NULL, NULL, TRUE)))
|
|
{
|
|
MAKE_ERROR_STRING( "calling FlmDbRemove", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
MAKE_ERROR_STRING( "calling FlmDbCreate", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
bPassed = TRUE;
|
|
|
|
Exit:
|
|
|
|
endTest( bPassed);
|
|
|
|
return( rc);
|
|
}
|
|
|
|
/***************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
RCODE IFlmTestImpl::addRecordTest(
|
|
FLMUINT * puiDrn
|
|
)
|
|
{
|
|
RCODE rc = FERR_OK;
|
|
FlmRecord * pRec = NULL;
|
|
FlmRecord * pCopyRec = NULL;
|
|
void * pvField;
|
|
FLMBOOL bTransActive = FALSE;
|
|
FLMBOOL bPassed = FALSE;
|
|
FLMUINT uiLoop;
|
|
FLMUINT uiLoop2;
|
|
FLMUINT uiDrn2;
|
|
|
|
beginTest( "FlmRecordAdd Test");
|
|
|
|
// Create a record object
|
|
|
|
if( (pRec = new FlmRecord) == NULL)
|
|
{
|
|
rc = RC_SET( FERR_MEM);
|
|
MAKE_ERROR_STRING( "allocating FlmRecord", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
|
|
// Populate the record object with fields and values
|
|
// The first field of a record will be inserted at
|
|
// level zero (the first parameter of insertLast()
|
|
// specifies the level number). Subsequent fields
|
|
// will be inserted at a non-zero level.
|
|
|
|
if( RC_BAD( rc = pRec->insertLast( 0, PERSON_TAG,
|
|
FLM_TEXT_TYPE, NULL)))
|
|
{
|
|
MAKE_ERROR_STRING( "calling insertLast", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
|
|
if( RC_BAD( rc = pRec->insertLast( 1, FIRST_NAME_TAG,
|
|
FLM_TEXT_TYPE, &pvField)))
|
|
{
|
|
MAKE_ERROR_STRING( "calling insertLast", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
|
|
if( RC_BAD( rc = pRec->setNative( pvField, "Foo")))
|
|
{
|
|
MAKE_ERROR_STRING( "calling setNative", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
|
|
if( RC_BAD( rc = pRec->insertLast( 1, LAST_NAME_TAG,
|
|
FLM_TEXT_TYPE, &pvField)))
|
|
{
|
|
MAKE_ERROR_STRING( "calling insertLast", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
|
|
if( RC_BAD( rc = pRec->setNative( pvField, "Bar")))
|
|
{
|
|
MAKE_ERROR_STRING( "calling setNative", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
|
|
if( RC_BAD( rc = pRec->insertLast( 1, AGE_TAG,
|
|
FLM_NUMBER_TYPE, &pvField)))
|
|
{
|
|
MAKE_ERROR_STRING( "calling insertLast", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
|
|
if( RC_BAD( rc = pRec->setUINT( pvField, 32)))
|
|
{
|
|
MAKE_ERROR_STRING( "calling setUINT", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
|
|
// Start an update transaction
|
|
|
|
if( RC_BAD( rc = FlmDbTransBegin( m_hDb, FLM_UPDATE_TRANS, 15)))
|
|
{
|
|
MAKE_ERROR_STRING( "calling FlmDbTransBegin", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
bTransActive = TRUE;
|
|
|
|
// Add the record to the database.
|
|
|
|
*puiDrn = 0;
|
|
if( RC_BAD( rc = FlmRecordAdd( m_hDb, FLM_DATA_CONTAINER,
|
|
puiDrn, pRec, 0)))
|
|
{
|
|
MAKE_ERROR_STRING( "calling FlmRecordAdd", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
|
|
for (uiLoop = 0; gv_pszFamilyNames [uiLoop]; uiLoop++)
|
|
{
|
|
for (uiLoop2 = 0; gv_pszGivenNames [uiLoop2]; uiLoop2++)
|
|
{
|
|
if ((pCopyRec = pRec->copy()) == NULL)
|
|
{
|
|
rc = RC_SET( FERR_MEM);
|
|
MAKE_ERROR_STRING( "calling FlmRecord->copy()", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
if ((pvField = pCopyRec->find( pCopyRec->root(), FIRST_NAME_TAG)) == NULL)
|
|
{
|
|
rc = RC_SET( FERR_DATA_ERROR);
|
|
MAKE_ERROR_STRING( "corruption calling FlmRecord->copy()", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
if( RC_BAD( rc = pCopyRec->setNative( pvField, gv_pszGivenNames [uiLoop2])))
|
|
{
|
|
MAKE_ERROR_STRING( "calling setNative", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
if ((pvField = pCopyRec->find( pCopyRec->root(), LAST_NAME_TAG)) == NULL)
|
|
{
|
|
rc = RC_SET( FERR_DATA_ERROR);
|
|
MAKE_ERROR_STRING( "corruption calling FlmRecord->copy()", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
if( RC_BAD( rc = pCopyRec->setNative( pvField, gv_pszFamilyNames [uiLoop])))
|
|
{
|
|
MAKE_ERROR_STRING( "calling setNative", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
uiDrn2 = 0;
|
|
if( RC_BAD( rc = FlmRecordAdd( m_hDb, FLM_DATA_CONTAINER,
|
|
&uiDrn2, pCopyRec, 0)))
|
|
{
|
|
MAKE_ERROR_STRING( "calling FlmRecordAdd", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
pCopyRec->Release();
|
|
pCopyRec = NULL;
|
|
}
|
|
}
|
|
|
|
// Commit the transaction
|
|
// If FlmDbTransCommit returns without an error, the changes made
|
|
// above will be durable even if the system crashes.
|
|
|
|
if( RC_BAD( rc = FlmDbTransCommit( m_hDb)))
|
|
{
|
|
MAKE_ERROR_STRING( "calling FlmDbTransCommit", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
bTransActive = FALSE;
|
|
|
|
bPassed = TRUE;
|
|
|
|
Exit:
|
|
|
|
if( bTransActive)
|
|
{
|
|
(void)FlmDbTransAbort( m_hDb);
|
|
}
|
|
|
|
if( pRec)
|
|
{
|
|
pRec->Release();
|
|
}
|
|
|
|
if( pCopyRec)
|
|
{
|
|
pCopyRec->Release();
|
|
}
|
|
|
|
endTest( bPassed);
|
|
return( rc);
|
|
}
|
|
|
|
/***************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
RCODE IFlmTestImpl::modifyRecordTest(
|
|
FLMUINT uiDrn
|
|
)
|
|
{
|
|
RCODE rc = FERR_OK;
|
|
FlmRecord * pRec = NULL;
|
|
FlmRecord * pModRec = NULL;
|
|
void * pvField;
|
|
FLMBOOL bTransActive = FALSE;
|
|
FLMBOOL bPassed = FALSE;
|
|
|
|
// Retrieve the record from the database by ID
|
|
|
|
beginTest( "FlmRecordRetrieve Test");
|
|
if( RC_BAD( rc = FlmRecordRetrieve( m_hDb, FLM_DATA_CONTAINER,
|
|
uiDrn, FO_EXACT, &pRec, NULL)))
|
|
{
|
|
MAKE_ERROR_STRING( "calling FlmRecordRetrieve", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
endTest( TRUE);
|
|
|
|
|
|
beginTest( "FlmRecordModify Test");
|
|
|
|
// Copy the record so we can modify it
|
|
|
|
if( (pModRec = pRec->copy()) == NULL)
|
|
{
|
|
rc = RC_SET( FERR_MEM);
|
|
MAKE_ERROR_STRING( "calling FlmRecord->copy()", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
|
|
// Find the first name field and change it.
|
|
|
|
pvField = pModRec->find( pModRec->root(), FIRST_NAME_TAG);
|
|
if( RC_BAD( rc = pModRec->setNative( pvField, "FooFoo")))
|
|
{
|
|
MAKE_ERROR_STRING( "calling setNative", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
|
|
// Start an update transaction
|
|
|
|
if( RC_BAD( rc = FlmDbTransBegin( m_hDb, FLM_UPDATE_TRANS, 15)))
|
|
{
|
|
MAKE_ERROR_STRING( "calling FlmDbTransBegin", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
bTransActive = TRUE;
|
|
|
|
// Add the record to the database.
|
|
|
|
if( RC_BAD( rc = FlmRecordModify( m_hDb, FLM_DATA_CONTAINER,
|
|
uiDrn, pModRec, 0)))
|
|
{
|
|
MAKE_ERROR_STRING( "calling FlmRecordAdd", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
|
|
// Commit the transaction
|
|
// If FlmDbTransCommit returns without an error, the changes made
|
|
// above will be durable even if the system crashes.
|
|
|
|
if( RC_BAD( rc = FlmDbTransCommit( m_hDb)))
|
|
{
|
|
MAKE_ERROR_STRING( "calling FlmDbTransCommit", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
bTransActive = FALSE;
|
|
|
|
bPassed = TRUE;
|
|
|
|
Exit:
|
|
|
|
if( bTransActive)
|
|
{
|
|
(void)FlmDbTransAbort( m_hDb);
|
|
}
|
|
|
|
if( pRec)
|
|
{
|
|
pRec->Release();
|
|
}
|
|
|
|
if( pModRec)
|
|
{
|
|
pModRec->Release();
|
|
}
|
|
|
|
endTest( bPassed);
|
|
return( rc);
|
|
}
|
|
|
|
/***************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
RCODE IFlmTestImpl::deleteRecordTest(
|
|
FLMUINT uiDrn
|
|
)
|
|
{
|
|
RCODE rc = FERR_OK;
|
|
FLMBOOL bPassed = FALSE;
|
|
|
|
// Delete a record from the database
|
|
|
|
beginTest( "FlmRecordDelete Test");
|
|
if( RC_BAD( rc = FlmRecordDelete( m_hDb, FLM_DATA_CONTAINER,
|
|
uiDrn, FLM_AUTO_TRANS | 15)))
|
|
{
|
|
MAKE_ERROR_STRING( "calling FlmRecordDelete", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
bPassed = TRUE;
|
|
|
|
Exit:
|
|
|
|
endTest( bPassed);
|
|
return( rc);
|
|
}
|
|
|
|
/***************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
RCODE IFlmTestImpl::queryRecordTest( void)
|
|
{
|
|
RCODE rc = FERR_OK;
|
|
FlmRecord * pRec = NULL;
|
|
HFCURSOR hCursor = HFCURSOR_NULL;
|
|
FLMBYTE ucTmpBuf[ 64];
|
|
FLMBOOL bPassed = FALSE;
|
|
|
|
// Now, build a query that retrieves the sample record.
|
|
// First we need to initialize a cursor handle.
|
|
|
|
beginTest( "Retrieve Record by query Test");
|
|
|
|
if( RC_BAD( rc = FlmCursorInit( m_hDb, FLM_DATA_CONTAINER, &hCursor)))
|
|
{
|
|
MAKE_ERROR_STRING( "calling FlmCursorInit", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
|
|
// We will search by first name and last name. This will use the
|
|
// LastFirst_IX defined in the sample dictionary for optimization.
|
|
|
|
if( RC_BAD( rc = FlmCursorAddField( hCursor, LAST_NAME_TAG, 0)))
|
|
{
|
|
MAKE_ERROR_STRING( "calling FlmCursorAddField", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
|
|
if( RC_BAD( rc = FlmCursorAddOp( hCursor, FLM_EQ_OP)))
|
|
{
|
|
MAKE_ERROR_STRING( "calling FlmCursorAddOp", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
|
|
f_sprintf( (char *)ucTmpBuf, "Bar");
|
|
if( RC_BAD( rc = FlmCursorAddValue( hCursor, FLM_STRING_VAL,
|
|
ucTmpBuf, 0)))
|
|
{
|
|
MAKE_ERROR_STRING( "calling FlmCursorAddValue", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
|
|
if( RC_BAD( rc = FlmCursorAddOp( hCursor, FLM_AND_OP)))
|
|
{
|
|
MAKE_ERROR_STRING( "calling FlmCursorAddOp failed", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
|
|
if( RC_BAD( rc = FlmCursorAddField( hCursor, FIRST_NAME_TAG, 0)))
|
|
{
|
|
MAKE_ERROR_STRING( "calling FlmCursorAddField", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
|
|
if( RC_BAD( rc = FlmCursorAddOp( hCursor, FLM_EQ_OP)))
|
|
{
|
|
MAKE_ERROR_STRING( "calling FlmCursorAddOp", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
|
|
f_sprintf( (char *)ucTmpBuf, "FooFoo");
|
|
if( RC_BAD( rc = FlmCursorAddValue( hCursor, FLM_STRING_VAL,
|
|
ucTmpBuf, 0)))
|
|
{
|
|
MAKE_ERROR_STRING( "calling FlmCursorAddValue", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
|
|
if( RC_BAD( rc = FlmCursorFirst( hCursor, &pRec)))
|
|
{
|
|
MAKE_ERROR_STRING( "calling FlmCursorFirst", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
bPassed = TRUE;
|
|
|
|
Exit:
|
|
|
|
if (hCursor != HFCURSOR_NULL)
|
|
{
|
|
FlmCursorFree( &hCursor);
|
|
}
|
|
|
|
if( pRec)
|
|
{
|
|
pRec->Release();
|
|
}
|
|
|
|
endTest( bPassed);
|
|
|
|
return( rc);
|
|
}
|
|
|
|
/***************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
RCODE IFlmTestImpl::keyRetrieveTest(
|
|
FLMUINT uiIndex,
|
|
FLMBOOL bLastNameFirstNameIx)
|
|
{
|
|
RCODE rc = FERR_OK;
|
|
FLMBOOL bPassed = FALSE;
|
|
FLMUINT uiFlags = FO_FIRST;
|
|
FlmRecord * pSearchKey = NULL;
|
|
FLMUINT uiSearchDrn = 0;
|
|
FlmRecord * pFoundKey = NULL;
|
|
FLMUINT uiFoundDrn = 0;
|
|
char szLastFirstName [100];
|
|
char szLastLastName [100];
|
|
char szCurrFirstName [100];
|
|
char szCurrLastName [100];
|
|
void * pvField;
|
|
FLMUINT uiLen;
|
|
FLMINT iLastCmp;
|
|
FLMINT iFirstCmp;
|
|
|
|
if (bLastNameFirstNameIx)
|
|
{
|
|
beginTest( "FlmKeyRetrieve Test (Last+FirstIx)");
|
|
}
|
|
else
|
|
{
|
|
beginTest( "FlmKeyRetrieve Test (First+LastIx)");
|
|
}
|
|
szLastFirstName [0] = 0;
|
|
szLastLastName [0] = 0;
|
|
for (;;)
|
|
{
|
|
if (RC_BAD( rc = FlmKeyRetrieve( m_hDb, uiIndex,
|
|
0, pSearchKey, uiSearchDrn, uiFlags,
|
|
&pFoundKey, &uiFoundDrn)))
|
|
{
|
|
if (rc == FERR_EOF_HIT)
|
|
{
|
|
rc = FERR_OK;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
MAKE_ERROR_STRING( "calling FlmKeyRetrieve", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
}
|
|
|
|
// Make sure this key is greater than the last key.
|
|
|
|
if ((pvField = pFoundKey->find( pFoundKey->root(), LAST_NAME_TAG)) == NULL)
|
|
{
|
|
rc = RC_SET( FERR_DATA_ERROR);
|
|
MAKE_ERROR_STRING( "corruption calling FlmRecord->find()", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
uiLen = sizeof( szCurrLastName);
|
|
if (RC_BAD( rc = pFoundKey->getNative( pvField, szCurrLastName, &uiLen)))
|
|
{
|
|
MAKE_ERROR_STRING( "calling FlmRecord->getNative()", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
if ((pvField = pFoundKey->find( pFoundKey->root(), FIRST_NAME_TAG)) == NULL)
|
|
{
|
|
rc = RC_SET( FERR_DATA_ERROR);
|
|
MAKE_ERROR_STRING( "corruption calling FlmRecord->find()", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
uiLen = sizeof( szCurrFirstName);
|
|
if (RC_BAD( rc = pFoundKey->getNative( pvField, szCurrFirstName, &uiLen)))
|
|
{
|
|
MAKE_ERROR_STRING( "calling FlmRecord->getNative()", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
|
|
iLastCmp = f_strcmp( szCurrLastName, szLastLastName);
|
|
iFirstCmp = f_strcmp( szCurrFirstName, szLastFirstName);
|
|
|
|
if (bLastNameFirstNameIx)
|
|
{
|
|
if (iLastCmp < 0)
|
|
{
|
|
rc = RC_SET( FERR_DATA_ERROR);
|
|
f_sprintf( m_szFailInfo, "Invalid last name order in index: "
|
|
" %s before %s", szLastLastName, szCurrLastName);
|
|
goto Exit;
|
|
}
|
|
else if (iLastCmp == 0)
|
|
{
|
|
if (iFirstCmp < 0)
|
|
{
|
|
rc = RC_SET( FERR_DATA_ERROR);
|
|
f_sprintf( m_szFailInfo, "Invalid first name order in index: "
|
|
" %s before %s", szLastFirstName, szCurrFirstName);
|
|
goto Exit;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (iFirstCmp < 0)
|
|
{
|
|
rc = RC_SET( FERR_DATA_ERROR);
|
|
f_sprintf( m_szFailInfo, "Invalid first name order in index: "
|
|
" %s before %s", szLastFirstName, szCurrFirstName);
|
|
goto Exit;
|
|
}
|
|
else if (iFirstCmp == 0)
|
|
{
|
|
if (iLastCmp < 0)
|
|
{
|
|
rc = RC_SET( FERR_DATA_ERROR);
|
|
f_sprintf( m_szFailInfo, "Invalid last name order in index: "
|
|
" %s before %s", szLastLastName, szCurrLastName);
|
|
goto Exit;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Setup to get the next key.
|
|
|
|
uiFlags = FO_EXCL;
|
|
uiSearchDrn = uiFoundDrn;
|
|
if (pSearchKey)
|
|
{
|
|
pSearchKey->Release();
|
|
}
|
|
pSearchKey = pFoundKey;
|
|
pFoundKey = NULL;
|
|
uiFoundDrn = 0;
|
|
f_strcpy( szLastLastName, szCurrLastName);
|
|
f_strcpy( szLastFirstName, szCurrFirstName);
|
|
}
|
|
bPassed = TRUE;
|
|
|
|
Exit:
|
|
|
|
if (pSearchKey)
|
|
{
|
|
pSearchKey->Release();
|
|
}
|
|
if (pFoundKey)
|
|
{
|
|
pFoundKey->Release();
|
|
}
|
|
|
|
endTest( bPassed);
|
|
return( rc);
|
|
}
|
|
|
|
/***************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
RCODE IFlmTestImpl::addIndexTest(
|
|
FLMUINT * puiIndex
|
|
)
|
|
{
|
|
RCODE rc = FERR_OK;
|
|
FlmRecord * pRec = NULL;
|
|
void * pvField;
|
|
FLMBOOL bTransActive = FALSE;
|
|
FLMBOOL bPassed = FALSE;
|
|
char szFieldNum [20];
|
|
|
|
beginTest( "Add FirstName+LastName Index Test");
|
|
|
|
// Create a record object
|
|
|
|
if( (pRec = new FlmRecord) == NULL)
|
|
{
|
|
rc = RC_SET( FERR_MEM);
|
|
MAKE_ERROR_STRING( "allocating FlmRecord", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
|
|
// 0 index FirstLast_IX
|
|
|
|
if( RC_BAD( rc = pRec->insertLast( 0, FLM_INDEX_TAG,
|
|
FLM_TEXT_TYPE, &pvField)))
|
|
{
|
|
MAKE_ERROR_STRING( "calling insertLast", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
if( RC_BAD( rc = pRec->setNative( pvField, "FirstLast_IX")))
|
|
{
|
|
MAKE_ERROR_STRING( "calling setNative", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
|
|
// 1 language US
|
|
|
|
if( RC_BAD( rc = pRec->insertLast( 1, FLM_LANGUAGE_TAG,
|
|
FLM_TEXT_TYPE, &pvField)))
|
|
{
|
|
MAKE_ERROR_STRING( "calling insertLast", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
if( RC_BAD( rc = pRec->setNative( pvField, "US")))
|
|
{
|
|
MAKE_ERROR_STRING( "calling setNative", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
|
|
// 1 key
|
|
|
|
if( RC_BAD( rc = pRec->insertLast( 1, FLM_KEY_TAG,
|
|
FLM_CONTEXT_TYPE, NULL)))
|
|
{
|
|
MAKE_ERROR_STRING( "calling insertLast", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
|
|
// 2 field <FIRST_NAME_TAG>
|
|
|
|
if( RC_BAD( rc = pRec->insertLast( 2, FLM_FIELD_TAG,
|
|
FLM_TEXT_TYPE, &pvField)))
|
|
{
|
|
MAKE_ERROR_STRING( "calling insertLast", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
f_sprintf( szFieldNum, "%u", FIRST_NAME_TAG);
|
|
if( RC_BAD( rc = pRec->setNative( pvField, szFieldNum)))
|
|
{
|
|
MAKE_ERROR_STRING( "calling setNative", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
|
|
// 3 required
|
|
|
|
if( RC_BAD( rc = pRec->insertLast( 3, FLM_REQUIRED_TAG,
|
|
FLM_TEXT_TYPE, NULL)))
|
|
{
|
|
MAKE_ERROR_STRING( "calling insertLast", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
|
|
// 2 field <LAST_NAME_TAG>
|
|
|
|
if( RC_BAD( rc = pRec->insertLast( 2, FLM_FIELD_TAG,
|
|
FLM_TEXT_TYPE, &pvField)))
|
|
{
|
|
MAKE_ERROR_STRING( "calling insertLast", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
f_sprintf( szFieldNum, "%u", LAST_NAME_TAG);
|
|
if( RC_BAD( rc = pRec->setNative( pvField, szFieldNum)))
|
|
{
|
|
MAKE_ERROR_STRING( "calling setNative", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
|
|
// 3 required
|
|
|
|
if( RC_BAD( rc = pRec->insertLast( 3, FLM_REQUIRED_TAG,
|
|
FLM_TEXT_TYPE, NULL)))
|
|
{
|
|
MAKE_ERROR_STRING( "calling insertLast", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
|
|
// Start an update transaction
|
|
|
|
if( RC_BAD( rc = FlmDbTransBegin( m_hDb, FLM_UPDATE_TRANS, 15)))
|
|
{
|
|
MAKE_ERROR_STRING( "calling FlmDbTransBegin", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
bTransActive = TRUE;
|
|
|
|
// Add the record to the database.
|
|
|
|
*puiIndex = 0;
|
|
if( RC_BAD( rc = FlmRecordAdd( m_hDb, FLM_DICT_CONTAINER,
|
|
puiIndex, pRec, 0)))
|
|
{
|
|
MAKE_ERROR_STRING( "calling FlmRecordAdd", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
|
|
// Commit the transaction
|
|
// If FlmDbTransCommit returns without an error, the changes made
|
|
// above will be durable even if the system crashes.
|
|
|
|
if( RC_BAD( rc = FlmDbTransCommit( m_hDb)))
|
|
{
|
|
MAKE_ERROR_STRING( "calling FlmDbTransCommit", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
bTransActive = FALSE;
|
|
|
|
bPassed = TRUE;
|
|
|
|
Exit:
|
|
|
|
if( bTransActive)
|
|
{
|
|
(void)FlmDbTransAbort( m_hDb);
|
|
}
|
|
|
|
if( pRec)
|
|
{
|
|
pRec->Release();
|
|
}
|
|
|
|
endTest( bPassed);
|
|
return( rc);
|
|
}
|
|
|
|
/***************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
RCODE IFlmTestImpl::removeDbTest( void)
|
|
{
|
|
RCODE rc = FERR_OK;
|
|
FLMBOOL bPassed = FALSE;
|
|
|
|
// FlmDbRemove will delete the database and all of its files
|
|
|
|
beginTest( "Remove Database Test");
|
|
|
|
if( RC_BAD( rc = FlmDbRemove( DB_NAME_STR, NULL, NULL, TRUE)))
|
|
{
|
|
MAKE_ERROR_STRING( "calling FlmDbRemove", rc, m_szFailInfo);
|
|
goto Exit;
|
|
}
|
|
bPassed = TRUE;
|
|
|
|
Exit:
|
|
|
|
endTest( bPassed);
|
|
return( rc);
|
|
}
|
|
|
|
/***************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
RCODE IFlmTestImpl::execute( void)
|
|
{
|
|
RCODE rc = FERR_OK;
|
|
FLMUINT uiDrn;
|
|
FLMUINT uiIndex;
|
|
|
|
// Initialize the FLAIM database engine. This call
|
|
// must be made once by the application prior to making any
|
|
// other FLAIM calls
|
|
|
|
if( RC_BAD( rc = FlmStartup()))
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
// Create database test
|
|
|
|
if (RC_BAD( rc = createDbTest()))
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
// FlmRecordAdd test
|
|
|
|
if (RC_BAD( rc = addRecordTest( &uiDrn)))
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
// FlmRecordModify test
|
|
|
|
if (RC_BAD( rc = modifyRecordTest( uiDrn)))
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
// Retrieve record and query tests
|
|
|
|
if (RC_BAD( rc = queryRecordTest()))
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
// FlmRecordDelete test
|
|
|
|
if (RC_BAD( rc = deleteRecordTest( uiDrn)))
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
// FlmKeyRetrieve test
|
|
|
|
if (RC_BAD( rc = keyRetrieveTest( LAST_NAME_FIRST_NAME_IX, TRUE)))
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
// Add index test
|
|
|
|
if (RC_BAD( rc = addIndexTest( &uiIndex)))
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
// FlmKeyRetrieve test
|
|
|
|
if (RC_BAD( rc = keyRetrieveTest( uiIndex, FALSE)))
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
// Close the database
|
|
|
|
FlmDbClose( &m_hDb);
|
|
|
|
if (RC_BAD( rc = removeDbTest()))
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
Exit:
|
|
|
|
FlmShutdown();
|
|
|
|
return( rc);
|
|
}
|
|
|