persistentstorage/dbms/tdbms/t_dbindex.cpp
changeset 0 08ec8eefde2f
equal deleted inserted replaced
-1:000000000000 0:08ec8eefde2f
       
     1 // Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 //
       
    15 
       
    16 #include <d32dbms.h>
       
    17 #include <s32file.h>
       
    18 #include <e32test.h>
       
    19 #include <e32math.h>
       
    20 #include "D32TABLE.H"
       
    21 
       
    22 // MSVC++ up to 5.0 has problems with expanding inline functions
       
    23 // This disables the mad warnings for the whole project
       
    24 #if defined(NDEBUG) && defined(__VC32__) && _MSC_VER<=1100
       
    25 #pragma warning(disable : 4710)			// function not expanded. MSVC 5.0 is stupid
       
    26 #endif
       
    27 
       
    28 LOCAL_D RTest test(_L("t_dbindex - Test DBMS indexing and ordering"));
       
    29 LOCAL_D CTrapCleanup* TheTrapCleanup;
       
    30 LOCAL_D RDbs TheDbs;
       
    31 LOCAL_D RDbNamedDatabase TheDatabase;
       
    32 LOCAL_D RDbTable TheTable;
       
    33 LOCAL_D RDbView TheView;
       
    34 LOCAL_D RFs TheFs;
       
    35 LOCAL_D TBuf<0x200> TheBuf;
       
    36 
       
    37 const TInt KTestCleanupStack=0x20;
       
    38 const TPtrC KTestDatabase=_L("C:\\DBMS-TST\\T_INDEX.DB");
       
    39 const TPtrC KTableName(_S("Table"));
       
    40 const TPtrC KIndexName(_S("index"));
       
    41 const TPtrC KIndexTwo(_S("index_two"));
       
    42 const TPtrC KColumnName(_S("column"));
       
    43 const TPtrC KColumnTwo(_S("column2"));
       
    44 
       
    45 const TPtrC KTableName1(_S("Table1"));
       
    46 const TPtrC KColumnName1(_S("column1"));
       
    47 const TPtrC KIndexName1(_S("index1"));
       
    48 
       
    49 const TPtrC KSelectOrdered(_L("select column from table order by column"));
       
    50 
       
    51 #define elementsof(array) (sizeof(array)/sizeof(array[0]))
       
    52 
       
    53 void Check(TInt aValue,TInt aExpected,TInt aLine)
       
    54 	{
       
    55 	if (aValue!=aExpected)
       
    56 		{
       
    57 		test.Printf(_L("*** Expected %d: got %d\r\n"),aExpected,aValue);
       
    58 		test.operator()(EFalse,aLine);
       
    59 		}
       
    60 	}
       
    61 #define test2(a,b) Check(a,b,__LINE__)
       
    62 
       
    63 //
       
    64 // Open the database (shared access) (SYMBIAN_REMOVE_TRIVIAL_ENCRYPTION version)
       
    65 //
       
    66 LOCAL_C void OpenDatabase()
       
    67 	{
       
    68 	TInt r=TheDatabase.Open(TheDbs,KTestDatabase);
       
    69 	test (r==KErrNone);
       
    70 	}
       
    71 
       
    72 //
       
    73 // Create the database (SYMBIAN_REMOVE_TRIVIAL_ENCRYPTION version)
       
    74 //
       
    75 LOCAL_C void CreateDatabase()
       
    76 	{
       
    77 	TInt r=TheDatabase.Replace(TheFs,KTestDatabase);
       
    78 	test (r==KErrNone);
       
    79 	TheDatabase.Close();
       
    80 	OpenDatabase();
       
    81 	}
       
    82 
       
    83 
       
    84 LOCAL_C void CloseDatabase()
       
    85 	{
       
    86 	TheDatabase.Close();
       
    87 	}
       
    88 
       
    89 /**
       
    90 @SYMTestCaseID          SYSLIB-DBMS-CT-0618
       
    91 @SYMTestCaseDesc        Tests for RDbNamedDatabase functionality
       
    92 @SYMTestPriority        Medium
       
    93 @SYMTestActions         Tests for RDbNamedDatabase::CreateIndex()
       
    94 @SYMTestExpectedResults Test must not fail
       
    95 @SYMREQ                 REQ0000
       
    96 */
       
    97 LOCAL_C void TestIndexBuildL()
       
    98 	{
       
    99 	test.Start(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0618 Create table "));
       
   100 	TheDatabase.Begin();
       
   101 	CDbColSet *cs=CDbColSet::NewLC();
       
   102 	cs->AddL(TDbCol(KColumnName,EDbColInt32));
       
   103 	cs->AddL(TDbCol(KColumnTwo,EDbColInt32));
       
   104 	test(TheDatabase.CreateTable(KTableName,*cs)==KErrNone);
       
   105 	CleanupStack::PopAndDestroy();
       
   106 	test.Next(_L("create indices"));
       
   107 	CDbKey *key=CDbKey::NewLC();
       
   108 	key->AddL(TDbKeyCol(KColumnName));
       
   109 	key->MakeUnique();
       
   110 	test(TheDatabase.CreateIndex(KIndexName,KTableName,*key)==KErrNone);
       
   111 	key->Clear();
       
   112 	key->AddL(TDbKeyCol(KColumnTwo));
       
   113 	key->MakeUnique();
       
   114 	test(TheDatabase.CreateIndex(KIndexTwo,KTableName,*key)==KErrNone);
       
   115 	CleanupStack::PopAndDestroy();
       
   116 	test.Next(_L("Populate table"));
       
   117 	test(TheTable.Open(TheDatabase,KTableName)==KErrNone);
       
   118 	TheTable.InsertL();
       
   119 	TheTable.SetColL(1,1);
       
   120 	TheTable.SetColL(2,-1);
       
   121 	TheTable.PutL();
       
   122 	TheTable.InsertL();
       
   123 	TheTable.SetColL(1,2);
       
   124 	TheTable.SetColL(2,-2);
       
   125 	TheTable.PutL();
       
   126 	test(TheDatabase.Commit()==KErrNone);
       
   127 	test.Next(_L("Check order"));
       
   128 	test(TheTable.SetNoIndex()==KErrNone);
       
   129 	test(TheTable.SetIndex(KIndexName)==KErrNone);
       
   130 	test(TheTable.CountL()==2);
       
   131 	test(TheTable.NextL());
       
   132 	TheTable.GetL();
       
   133 	test(TheTable.ColInt(1)==1);
       
   134 	test(TheTable.NextL());
       
   135 	TheTable.GetL();
       
   136 	test(TheTable.ColInt(1)==2);
       
   137 	test(!TheTable.NextL());
       
   138 	test(TheTable.SetIndex(KIndexTwo)==KErrNone);
       
   139 	test(TheTable.CountL()==2);
       
   140 	test(TheTable.NextL());
       
   141 	TheTable.GetL();
       
   142 	test(TheTable.ColInt(1)==2);
       
   143 	test(TheTable.NextL());
       
   144 	TheTable.GetL();
       
   145 	test(TheTable.ColInt(1)==1);
       
   146 	test(!TheTable.NextL());
       
   147  	test(TheTable.SetNoIndex()==KErrNone);
       
   148 	test(TheTable.CountL()==2);
       
   149 	test(TheTable.NextL());
       
   150 	test(TheTable.NextL());
       
   151 	test(!TheTable.NextL());
       
   152 	TheTable.Close();
       
   153 	test.Next(_L("Drop indices"));
       
   154 	test(TheDatabase.DropIndex(KIndexTwo,KTableName)==KErrNone);
       
   155 	test(TheTable.Open(TheDatabase,KTableName)==KErrNone);
       
   156 	test(TheTable.SetIndex(KIndexName)==KErrNone);
       
   157 	test(TheTable.SetIndex(KIndexTwo)!=KErrNone);
       
   158 	TheTable.Close();
       
   159 	test(TheDatabase.DropIndex(KIndexName,KTableName)==KErrNone);
       
   160 	test(TheTable.Open(TheDatabase,KTableName)==KErrNone);
       
   161 	test(TheTable.SetIndex(KIndexName)!=KErrNone);
       
   162 	test(TheTable.SetIndex(KIndexTwo)!=KErrNone);
       
   163 	TheTable.Close();
       
   164 	test(TheDatabase.DropTable(KTableName)==KErrNone);
       
   165 	test.End();
       
   166 	}
       
   167 
       
   168 LOCAL_C TInt CountRowsL()
       
   169 	{
       
   170 	TInt count=0;
       
   171 	while (TheTable.NextL())
       
   172 		++count;
       
   173 	return count;
       
   174 	}
       
   175 
       
   176 /**
       
   177 @SYMTestCaseID          SYSLIB-DBMS-CT-0619
       
   178 @SYMTestCaseDesc        RDbNamedDatabase::Execute() function test
       
   179 @SYMTestPriority        Medium
       
   180 @SYMTestActions         Tests for CREATE TABLE,CREATE INDEX and CREATE UNIQUE INDEX query
       
   181 @SYMTestExpectedResults Test must not fail
       
   182 @SYMREQ                 REQ0000
       
   183 */
       
   184 LOCAL_C void TestPersistenceL()
       
   185 	{
       
   186 	test.Start(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0619 Create table "));
       
   187 	TheDatabase.Begin();
       
   188 	test(TheDatabase.Execute(_L("CREATE TABLE Table (column CHAR(120) NOT NULL)"))==KErrNone);
       
   189 	test(TheTable.Open(TheDatabase,KTableName)==KErrNone);
       
   190 	TheTable.InsertL();
       
   191 	TheTable.SetColL(1,_L("a"));
       
   192 	TheTable.PutL();
       
   193 	TheTable.InsertL();
       
   194 	TheTable.SetColL(1,_L("b"));
       
   195 	TheTable.PutL();
       
   196 	TheTable.InsertL();
       
   197 	TheTable.SetColL(1,_L("c"));
       
   198 	TheTable.PutL();
       
   199 	TheTable.InsertL();
       
   200 	TheTable.SetColL(1,_L("d"));
       
   201 	TheTable.PutL();
       
   202 	TheTable.InsertL();
       
   203 	TheTable.SetColL(1,_L("e"));
       
   204 	TheTable.PutL();
       
   205 	TheTable.Close();
       
   206 	test(TheDatabase.Commit()==KErrNone);
       
   207 	test.Next(_L("Build indices"));
       
   208 	test (TheDatabase.Execute(_L("CREATE INDEX index ON table (column ASC)"))==KErrNone);
       
   209 	test (TheDatabase.Execute(_L("CREATE UNIQUE INDEX index_two ON table (column DESC)"))==KErrNone);
       
   210 	test.Next(_L("Close and re-open database"));
       
   211 	CloseDatabase();
       
   212 	OpenDatabase();
       
   213 	test.Next(_L("Check indices"));
       
   214 	CDbKey* key=TheDatabase.KeyL(KIndexName,KTableName);
       
   215 	test (key->Count()==1);
       
   216 	test (key->Comparison()==EDbCompareNormal);
       
   217 	test (!key->IsUnique());
       
   218 	test ((*key)[0].iName.CompareF(KColumnName)==0);
       
   219 	test ((*key)[0].iOrder==TDbKeyCol::EAsc);
       
   220 	delete key;
       
   221 	key=TheDatabase.KeyL(KIndexTwo,KTableName);
       
   222 	test (key->Count()==1);
       
   223 	test (key->Comparison()==EDbCompareNormal);
       
   224 	test (key->IsUnique());
       
   225 	test ((*key)[0].iName.CompareF(KColumnName)==0);
       
   226 	test ((*key)[0].iOrder==TDbKeyCol::EDesc);
       
   227 	delete key;
       
   228 	test(TheTable.Open(TheDatabase,KTableName)==KErrNone);
       
   229 	test(TheTable.SetNoIndex()==KErrNone);
       
   230 	test(CountRowsL()==5);
       
   231 	test(TheTable.CountL()==5);
       
   232 	test(TheTable.SetIndex(KIndexName)==KErrNone);
       
   233 	test(TheTable.CountL()==5);
       
   234 	test(CountRowsL()==5);
       
   235 	test(TheTable.SetIndex(KIndexTwo)==KErrNone);
       
   236 	test(TheTable.CountL()==5);
       
   237 	test(CountRowsL()==5);
       
   238 	TheTable.Close();
       
   239 	test.Next(_L("Drop indices"));
       
   240 	TheDatabase.Begin();
       
   241 	test (TheDatabase.Execute(_L("DROP INDEX index_two FROM table"))==KErrNone);
       
   242 	test (TheDatabase.Execute(_L("DROP INDEX index FROM table"))==KErrNone);
       
   243 	test (TheDatabase.Execute(_L("DROP TABLE table"))==KErrNone);
       
   244 	test(TheDatabase.Commit()==KErrNone);
       
   245 	test.End();
       
   246 	}
       
   247 
       
   248 LOCAL_C void BuildTablePrologL(TDbColType aType,TInt aAttribs=0)
       
   249 	{
       
   250 	TheDatabase.Begin();
       
   251 	CDbColSet *cs=CDbColSet::NewLC();
       
   252 	TDbCol col(KColumnName,aType);
       
   253 	col.iAttributes=aAttribs;
       
   254 	cs->AddL(col);
       
   255 	test(TheDatabase.CreateTable(KTableName,*cs)==KErrNone);
       
   256 	CleanupStack::PopAndDestroy();
       
   257 	test(TheTable.Open(TheDatabase,KTableName)==KErrNone);
       
   258 	}
       
   259 
       
   260 inline void SetColL(RDbRowSet& aSet,TDbColNo col,const TInt& aValue)
       
   261 	{aSet.SetColL(col,aValue);}
       
   262 inline void SetColL(RDbRowSet& aSet,TDbColNo col,const TUint& aValue)
       
   263 	{aSet.SetColL(col,aValue);}
       
   264 inline void SetColL(RDbRowSet& aSet,TDbColNo col,const TInt64& aValue)
       
   265 	{aSet.SetColL(col,aValue);}
       
   266 inline void SetColL(RDbRowSet& aSet,TDbColNo col,const TReal32& aValue)
       
   267 	{aSet.SetColL(col,aValue);}
       
   268 inline void SetColL(RDbRowSet& aSet,TDbColNo col,const TReal64& aValue)
       
   269 	{aSet.SetColL(col,aValue);}
       
   270 inline void SetColL(RDbRowSet& aSet,TDbColNo col,const TTime& aValue)
       
   271 	{aSet.SetColL(col,aValue);}
       
   272 inline void SetColL(RDbRowSet& aSet,TDbColNo col,const TPtrC& aValue)
       
   273 	{aSet.SetColL(col,aValue);}
       
   274 
       
   275 template <class T>
       
   276 void BuildTableL(TDbColType aType,TInt aAttribs,T aValues[],TInt aCount)
       
   277 	{
       
   278 	BuildTablePrologL(aType,aAttribs);
       
   279 	for (TInt ii=0;ii<aCount;++ii)
       
   280 		{
       
   281 		TheTable.InsertL();
       
   282 		SetColL(TheTable,1,aValues[ii]);
       
   283 		TheTable.PutL();
       
   284 		}
       
   285 	test(TheDatabase.Commit()==KErrNone);
       
   286 	test (TheTable.CountL()==aCount);
       
   287 	TheTable.Close();
       
   288 	}
       
   289 
       
   290 /**
       
   291 @SYMTestCaseID          SYSLIB-DBMS-CT-0620
       
   292 @SYMTestCaseDesc        Setting the specified index as the active index for a table test
       
   293 @SYMTestPriority        Medium
       
   294 @SYMTestActions         Create an index and set as active index for the table.
       
   295                         Tests for RDbNamedDatabase::CreateIndex(),RDbNamedDatabase::Commit()
       
   296 						RDbTable::Open(),RDbTable::SetIndex() functions.
       
   297 @SYMTestExpectedResults Test must not fail
       
   298 @SYMREQ                 REQ0000
       
   299 */
       
   300 LOCAL_C void BuildIndexL(TDbTextComparison aComparison=EDbCompareNormal,TInt aLength=KDbUndefinedLength)
       
   301 	{
       
   302 	test.Next(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0620 Test index order "));
       
   303 	TheDatabase.Begin();
       
   304 	CDbKey *key=CDbKey::NewLC();
       
   305 	key->AddL(TDbKeyCol(KColumnName,aLength));
       
   306 	key->MakeUnique();
       
   307 	key->SetComparison(aComparison);
       
   308 	test(TheDatabase.CreateIndex(KIndexName,KTableName,*key)==KErrNone);
       
   309 	CleanupStack::PopAndDestroy();
       
   310 	test (TheDatabase.Commit()==KErrNone);
       
   311 	test(TheTable.Open(TheDatabase,KTableName)==KErrNone);
       
   312 	test(TheTable.SetIndex(KIndexName)==KErrNone);
       
   313 	}
       
   314 
       
   315 inline void GetCol(RDbRowSet& aSet,TDbColNo col,TInt& aValue)
       
   316 	{aValue=aSet.ColInt(col);}
       
   317 inline void GetCol(RDbRowSet& aSet,TDbColNo col,TUint& aValue)
       
   318 	{aValue=aSet.ColUint(col);}
       
   319 inline void GetCol(RDbRowSet& aSet,TDbColNo col,TInt64& aValue)
       
   320 	{aValue=aSet.ColInt64(col);}
       
   321 inline void GetCol(RDbRowSet& aSet,TDbColNo col,TReal32& aValue)
       
   322 	{aValue=aSet.ColReal32(col);}
       
   323 inline void GetCol(RDbRowSet& aSet,TDbColNo col,TReal64& aValue)
       
   324 	{aValue=aSet.ColReal64(col);}
       
   325 inline void GetCol(RDbRowSet& aSet,TDbColNo col,TTime& aValue)
       
   326 	{aValue=aSet.ColTime(col);}
       
   327 
       
   328 /**
       
   329 @SYMTestCaseID          SYSLIB-DBMS-CT-0621
       
   330 @SYMTestCaseDesc        RDbRowSet ordering test
       
   331 @SYMTestPriority        Medium
       
   332 @SYMTestActions         Reorder the row set data with RDbRowSet::GetL(),SetL() functions.
       
   333 @SYMTestExpectedResults Test must not fail
       
   334 @SYMREQ                 REQ0000
       
   335 */
       
   336 template <class T>
       
   337 void TestOrderingL(RDbRowSet& aSet,T,TInt aCount)
       
   338 	{
       
   339 	test.Next( _L( " @SYMTestCaseID:SYSLIB-DBMS-CT-0621 " ) );
       
   340 	test(aSet.CountL()==aCount);
       
   341 	TInt count=0;
       
   342 	if (aSet.FirstL())
       
   343 		{
       
   344 		++count;
       
   345 		aSet.GetL();
       
   346 		T last;
       
   347 		GetCol(aSet,1,last);
       
   348 		while (aSet.NextL())
       
   349 			{
       
   350 			++count;
       
   351 			aSet.GetL();
       
   352 			T current;
       
   353 			GetCol(aSet,1,current);
       
   354 			test(last<current);
       
   355 			last=current;
       
   356 			}
       
   357 		}
       
   358 	test(count==aCount);
       
   359 	}
       
   360 
       
   361 /**
       
   362 @SYMTestCaseID          SYSLIB-DBMS-CT-0622
       
   363 @SYMTestCaseDesc        RDbTable::SeekL() function test
       
   364 @SYMTestPriority        Medium
       
   365 @SYMTestActions         Tests for the retrieved column value
       
   366 @SYMTestExpectedResults Test must not fail
       
   367 @SYMREQ                 REQ0000
       
   368 */
       
   369 template <class T>
       
   370 void TestSeekL(RDbTable& aTable,T,const T aValues[],TInt aCount)
       
   371 	{
       
   372 	test.Next( _L( " @SYMTestCaseID:SYSLIB-DBMS-CT-0622 Test index seeking " ) );
       
   373 	for (TInt ii=0;ii<aCount;++ii)
       
   374 		{
       
   375 		test(aTable.SeekL(aValues[ii]));
       
   376 		aTable.GetL();
       
   377 		T val;
       
   378 		GetCol(aTable,1,val);
       
   379 		test(aValues[ii]==val);
       
   380 		}
       
   381 	}
       
   382 
       
   383 /**
       
   384 aVal argument is used in the test functions (TestType & TestOrdering) and has no meaning outside them.
       
   385 It is used only to avoid some compiler varnings and to determine the correct template type
       
   386 
       
   387 @SYMTestCaseID          SYSLIB-DBMS-CT-0623
       
   388 @SYMTestCaseDesc        Tests for RDbTable,RDbRowSet classes
       
   389 @SYMTestPriority        Medium
       
   390 @SYMTestActions         Call up Test for table ordering and index seeking functions
       
   391 @SYMTestExpectedResults Test must not fail
       
   392 @SYMREQ                 REQ0000
       
   393 */
       
   394 template <class T>
       
   395 void TestTypeL( TDbColType aType, TInt aAttribs, const T aValues[], TInt aCount )
       
   396 	{
       
   397 	test.Start( _L( " @SYMTestCaseID:SYSLIB-DBMS-CT-0623 Build table " ) );
       
   398 	BuildTableL( aType, aAttribs, aValues, aCount );
       
   399 	T t(0);
       
   400 //
       
   401 	test.Next( _L( "Test ORDER BY ordering" ) );
       
   402 	test( TheView.Prepare( TheDatabase, KSelectOrdered ) == KErrNone );
       
   403 	test( TheView.EvaluateAll() == KErrNone );
       
   404 	TestOrderingL( TheView, t, aCount );
       
   405 	TheView.Close();
       
   406 //
       
   407 	BuildIndexL();
       
   408 	TestOrderingL( TheTable, t, aCount );
       
   409 //
       
   410 	TestSeekL( TheTable, t, aValues, aCount );
       
   411 	TheTable.Close();
       
   412 //
       
   413 	test( TheDatabase.DropTable( KTableName ) == KErrNone );
       
   414 	test.End();
       
   415 	}
       
   416 /**
       
   417 @SYMTestCaseID          SYSLIB-DBMS-CT-1322
       
   418 @SYMTestCaseDesc        Text ordering test
       
   419 @SYMTestPriority        Medium
       
   420 @SYMTestActions         Tests for RDbRowSet::Next(),RDbRowSet::GetL(),RDbRowSet::ColDes() functions
       
   421 @SYMTestExpectedResults Test must not fail
       
   422 @SYMREQ                 REQ0000
       
   423 */
       
   424 void TestTextOrderingL(RDbRowSet& aSet,TInt aCount,const TTextOps& aComp)
       
   425 	{
       
   426 	test.Next(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-1322 "));
       
   427 	test(aSet.CountL()==aCount);
       
   428 	TInt count=0;
       
   429 	while (aSet.NextL())
       
   430 		{
       
   431 		aSet.GetL();
       
   432 		TPtrC current=aSet.ColDes(1);
       
   433 		if (count++>0)
       
   434 			test(aComp.Compare(TheBuf,current)<0);
       
   435 		TheBuf=current;
       
   436 		}
       
   437 	test(count==aCount);
       
   438 	}
       
   439 
       
   440 /**
       
   441 @SYMTestCaseID          SYSLIB-DBMS-CT-1323
       
   442 @SYMTestCaseDesc        Tests for RDbView,RDbTable classes
       
   443 @SYMTestPriority        Medium
       
   444 @SYMTestActions         Wrapper function to call up for text ordering and text indexing tests
       
   445 @SYMTestExpectedResults Test must not fail
       
   446 @SYMREQ                 REQ0000
       
   447 */
       
   448 void TestTextL(const TPtrC aValues[],TInt aCount,TDbTextComparison aComparison,TInt aLength=KDbUndefinedLength)
       
   449 	{
       
   450 	const TTextOps& comp=TTextOps::Ops(aComparison);
       
   451 	test.Start(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-1323 Build table "));
       
   452 	BuildTableL(EDbColText,0,aValues,aCount);
       
   453 //
       
   454 	test.Next(_L("Test ORDER BY ordering"));
       
   455 	test (TheView.Prepare(TheDatabase,TDbQuery(KSelectOrdered,aComparison))==KErrNone);
       
   456 	test (TheView.EvaluateAll()==KErrNone);
       
   457 	TestTextOrderingL(TheView,aCount,comp);
       
   458 	TheView.Close();
       
   459 //
       
   460 	BuildIndexL(aComparison,aLength);
       
   461 	test(TheTable.SetIndex(KIndexName)==KErrNone);
       
   462 	TestTextOrderingL(TheTable,aCount,comp);
       
   463 //
       
   464 	test.Next(_L("Test index seeking"));
       
   465 	for (TInt ii=0;ii<aCount;++ii)
       
   466 		{
       
   467 		test(TheTable.SeekL(aValues[ii]));
       
   468 		TheTable.GetL();
       
   469 		test(comp.Compare(aValues[ii],TheTable.ColDes(1))==0);
       
   470 		}
       
   471 //
       
   472 	TheTable.Close();
       
   473 	test(TheDatabase.DropTable(KTableName)==KErrNone);
       
   474 	test.End();
       
   475 	}
       
   476 
       
   477 void TestLongTextOrderingL(RDbRowSet& aSet,TInt aCount,const TTextOps& aComp)
       
   478 	{
       
   479 	test(aSet.CountL()==aCount);
       
   480 	TInt count=0;
       
   481 	HBufC* prev=0;
       
   482 	while (aSet.NextL())
       
   483 		{
       
   484 		aSet.GetL();
       
   485 		TInt len=aSet.ColLength(1);
       
   486 		HBufC* buf=HBufC::NewL(len);
       
   487 		RDbColReadStream s;
       
   488 		s.OpenLC(aSet,1);
       
   489 		TPtr des(buf->Des());
       
   490 		s.ReadL(des,len);
       
   491 		CleanupStack::PopAndDestroy();
       
   492 		if (count++)
       
   493 			test (aComp.Compare(*buf,*prev)>=0);
       
   494 		delete prev;
       
   495 		prev=buf;
       
   496 		}
       
   497 	delete prev;
       
   498 	test(count==aCount);
       
   499 	}
       
   500 
       
   501 LOCAL_C void OrderByLongTextL(TInt aCount,TDbTextComparison aComparison)
       
   502 	{
       
   503 	test (TheView.Prepare(TheDatabase,TDbQuery(KSelectOrdered,aComparison))==KErrNone);
       
   504 	test (TheView.EvaluateAll()==KErrNone);
       
   505 	TestLongTextOrderingL(TheView,aCount,TTextOps::Ops(aComparison));
       
   506 	TheView.Close();
       
   507 	}
       
   508 
       
   509 LOCAL_C void TestLongTextL(const TPtrC aValues[],TInt aCount,TDbTextComparison aComparison,TInt aLength=KDbUndefinedLength)
       
   510 	{
       
   511 	const TTextOps& comp=TTextOps::Ops(aComparison);
       
   512 	test.Start(_L("Build table"));
       
   513 	BuildTableL(EDbColLongText,0,aValues,aCount);
       
   514 //
       
   515 	test.Next(_L("Test ORDER BY ordering"));
       
   516 	OrderByLongTextL(aCount,aComparison);
       
   517 //
       
   518 	BuildIndexL(aComparison,aLength);
       
   519 	test(TheTable.SetIndex(KIndexName)==KErrNone);
       
   520 	TestLongTextOrderingL(TheTable,aCount,comp);
       
   521 //
       
   522 	test.Next(_L("Test index seeking"));
       
   523 	for (TInt ii=0;ii<aCount;++ii)
       
   524 		{
       
   525 		test(TheTable.SeekL(aValues[ii]));
       
   526 		TheTable.GetL();
       
   527 		RDbColReadStream strm;
       
   528 		strm.OpenLC(TheTable,1);
       
   529 		strm.ReadL(TheBuf,TheTable.ColLength(1));
       
   530 		CleanupStack::PopAndDestroy();
       
   531 		test(comp.Compare(aValues[ii],TheBuf)==0);
       
   532 		}
       
   533 	TheTable.Close();
       
   534 //
       
   535 	test(TheDatabase.DropTable(KTableName)==KErrNone);
       
   536 	test.End();
       
   537 	}
       
   538 
       
   539 TUint const KBitValues[]={0,1};
       
   540 TInt const KInt8Values[]={0,KMinTInt8+1,1,KMaxTInt8,2,-3,-1,KMaxTInt8-1,KMinTInt8,-40};
       
   541 TInt const KInt16Values[]={0,KMinTInt16+1,1,KMaxTInt16,2,-3,-1,KMaxTInt16-1,KMinTInt16,-4000};
       
   542 TInt const KInt32Values[]={0,KMinTInt32+1,1,KMaxTInt32,2,-3,-1,KMaxTInt32-1,KMinTInt32,-40000000};
       
   543 TInt const KInt32Count=sizeof(KInt32Values)/sizeof(KInt32Values[0]);
       
   544 TUint const KUint8Values[]={0,1,KMaxTUint8,2,(KMaxTUint8+1)/2,(KMaxTUint8-1)/2,KMaxTUint8-1,40};
       
   545 TUint const KUint16Values[]={0,1,KMaxTUint16,2,(KMaxTUint16+1)/2,(KMaxTUint16-1)/2,KMaxTUint16-1,4000};
       
   546 TUint const KUint32Values[]={0,1,KMaxTUint32,2,KMaxTUint32/2+1,KMaxTUint32/2,KMaxTUint32-1,40000000};
       
   547 //TReal32 const KReal32Values[]={0.0f,1.0f,KMaxTReal32,KMinTReal32,-1.0f,-KMaxTReal32,-4e20f,-KMinTReal32};
       
   548 //TReal64 const KReal64Values[]={0.0,1.0,KMaxTReal64,KMinTReal64,-1.0,-KMaxTReal64,-4e200,-KMinTReal64};
       
   549 TReal32 const KReal32Values[]={0.0f,1.0f,1e37f,1e-37f,-1.0f,-1e37f,-4e20f,-1e-37f};
       
   550 TReal64 const KReal64Values[]={0.0,1.0,KMaxTReal64,KMinTReal64,-1.0,-KMaxTReal64,-4e200,-KMinTReal64};
       
   551 TInt64 const KInt64Values[]=
       
   552 	{
       
   553 	0,
       
   554 	MAKE_TINT64(0x80000000u,0x1u),
       
   555 	1,
       
   556 	MAKE_TINT64(0x7fffffffu,0xffffffffu),
       
   557 	2,
       
   558 	-3,
       
   559 	-1,
       
   560 	MAKE_TINT64(0x7fffffffu,0xfffffffeu),
       
   561 	MAKE_TINT64(0x80000000u,0x0u),
       
   562 	-40
       
   563 	};
       
   564 TTime const KTimeValues[]=
       
   565 	{
       
   566 	Time::MaxTTime(),
       
   567 	TInt64(0),
       
   568 	TDateTime(1970,EJanuary,0,0,0,0,0),
       
   569 	Time::MinTTime(),
       
   570 	TDateTime(2049,EDecember,30,23,59,59,999999),
       
   571 	TDateTime(1996,EJuly,8,17,45,0,0)
       
   572 	};
       
   573 TPtrC const KTextValues[]=
       
   574 	{
       
   575 	_S(""),
       
   576 	_S("10"),
       
   577 	_S("zyx"),
       
   578 	_S("0"),
       
   579 	_S("abcd"),
       
   580 	_S("abcdefg"),
       
   581 	_S("ABCDE"),
       
   582 	_S("Z")
       
   583 	};
       
   584 TPtrC const KLongTextValues[]=
       
   585 	{
       
   586 	_S("this blob will be inlined"),
       
   587 	_S(""),
       
   588 	_S("that blob was null"),
       
   589 	_S("An example of an out-of-line blob in an index! LongText8-LongText8-LongText8-LongText8-LongText8-LongText8-LongText8-LongText8-LongText8-LongText8-LongText8-LongText8-LongText8-LongText8-LongText8-LongText8-LongText8-LongText8-LongText8-LongText8-LongText8-LongText8-LongText8-LongText8-LongText8-LongText8")
       
   590 	};
       
   591 const TInt KLongTextLimit=30;
       
   592 
       
   593 /**
       
   594 @SYMTestCaseID          SYSLIB-DBMS-CT-0624
       
   595 @SYMTestCaseDesc        Wrapper function testing for Indexing with different integer sizes and Text .
       
   596 @SYMTestPriority        Medium
       
   597 @SYMTestActions         Tests for indexing
       
   598 @SYMTestExpectedResults Test must not fail
       
   599 @SYMREQ                 REQ0000
       
   600 */
       
   601 LOCAL_C void TestTypesL()
       
   602 	{
       
   603 	#define ARRAY_SIZE(a) TInt(sizeof(a)/sizeof(a[0]))
       
   604 	test.Start(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0624 Indexing Bit "));
       
   605 	TestTypeL(EDbColBit,TDbCol::ENotNull,KBitValues,ARRAY_SIZE(KBitValues));
       
   606 	test.Next(_L("Indexing Int8"));
       
   607 	TestTypeL(EDbColInt8,TDbCol::ENotNull,KInt8Values,ARRAY_SIZE(KInt8Values));
       
   608 	test.Next(_L("Indexing Int16"));
       
   609 	TestTypeL(EDbColInt16,TDbCol::ENotNull,KInt16Values,ARRAY_SIZE(KInt16Values));
       
   610 	test.Next(_L("Indexing Int32"));
       
   611 	TestTypeL(EDbColInt32,TDbCol::ENotNull,KInt32Values,ARRAY_SIZE(KInt32Values));
       
   612 	test.Next(_L("Indexing Uint8"));
       
   613 	TestTypeL(EDbColUint8,TDbCol::ENotNull,KUint8Values,ARRAY_SIZE(KUint8Values));
       
   614 	test.Next(_L("Indexing Uint16"));
       
   615 	TestTypeL(EDbColUint16,TDbCol::ENotNull,KUint16Values,ARRAY_SIZE(KUint16Values));
       
   616 	test.Next(_L("Indexing Uint32"));
       
   617 	TestTypeL(EDbColUint32,TDbCol::ENotNull,KUint32Values,ARRAY_SIZE(KUint32Values));
       
   618 	test.Next(_L("Indexing Real32"));
       
   619 	TestTypeL(EDbColReal32,TDbCol::ENotNull,KReal32Values,ARRAY_SIZE(KReal32Values));
       
   620 	test.Next(_L("Indexing Real64"));
       
   621 	TestTypeL(EDbColReal64,TDbCol::ENotNull,KReal64Values,ARRAY_SIZE(KReal64Values));
       
   622 	test.Next(_L("Indexing Int64"));
       
   623 	TestTypeL(EDbColInt64,TDbCol::ENotNull,KInt64Values,ARRAY_SIZE(KInt64Values));
       
   624 	test.Next(_L("Indexing Time"));
       
   625 	TestTypeL(EDbColDateTime,TDbCol::ENotNull,KTimeValues,ARRAY_SIZE(KTimeValues));
       
   626 	test.Next(_L("Indexing Text (Normal)"));
       
   627 	TestTextL(KTextValues,ARRAY_SIZE(KTextValues),EDbCompareNormal);
       
   628 	test.Next(_L("Indexing Text (Folded)"));
       
   629 	TestTextL(KTextValues,ARRAY_SIZE(KTextValues),EDbCompareFolded);
       
   630 	test.Next(_L("Indexing Text (Collated)"));
       
   631 	TestTextL(KTextValues,ARRAY_SIZE(KTextValues),EDbCompareCollated);
       
   632 	test.Next(_L("Indexing Text (Normal, truncated)"));
       
   633 	TestTextL(KTextValues,ARRAY_SIZE(KTextValues),EDbCompareNormal,5);
       
   634 	test.Next(_L("Indexing LongText (Normal)"));
       
   635 	TestLongTextL(KLongTextValues,ARRAY_SIZE(KLongTextValues),EDbCompareNormal,KLongTextLimit);
       
   636 	test.Next(_L("Indexing LongText (Folded)"));
       
   637 	TestLongTextL(KLongTextValues,ARRAY_SIZE(KLongTextValues),EDbCompareFolded,KLongTextLimit);
       
   638 	test.Next(_L("Indexing LongText (Collated)"));
       
   639 	TestLongTextL(KLongTextValues,ARRAY_SIZE(KLongTextValues),EDbCompareCollated,KLongTextLimit);
       
   640 	test.End();
       
   641 	}
       
   642 
       
   643 const TInt KBlobKeyTruncated=32/sizeof(TText);
       
   644 const TInt KBlobKeyMaxInline=255/sizeof(TText);
       
   645 const TInt KBlobKeyCompare=512/sizeof(TText);
       
   646 
       
   647 const TInt KMemoTestLengths[]=
       
   648 	{
       
   649 	0,
       
   650 	1,
       
   651 	KBlobKeyTruncated-1,
       
   652 	KBlobKeyTruncated,
       
   653 	KBlobKeyTruncated+1,
       
   654 	KBlobKeyMaxInline,
       
   655 	KBlobKeyMaxInline+1,
       
   656 	KBlobKeyCompare-1,
       
   657 	KBlobKeyCompare,
       
   658 	KBlobKeyCompare+1,
       
   659 	5000
       
   660 	};
       
   661 
       
   662 void TestMemoTableL(CDbColSet& aBaseSet)
       
   663 	{
       
   664 	test.Start(_L("create the table"));
       
   665 	aBaseSet.AddL(TDbCol(KColumnName,EDbColLongText));
       
   666 	TheDatabase.Begin();
       
   667 	TInt r=TheDatabase.CreateTable(KTableName,aBaseSet);
       
   668 	test (r==KErrNone);
       
   669 //
       
   670 	test.Next(_L("add the rows"));
       
   671 	r=TheView.Prepare(TheDatabase,KSelectOrdered,RDbView::EInsertOnly);
       
   672 	test (r==KErrNone);
       
   673 	r=TheView.EvaluateAll();
       
   674 	test (r==KErrNone);
       
   675 	HBufC* prev=0;
       
   676 	TInt count=0;
       
   677 	for (TUint ii=0;ii<elementsof(KMemoTestLengths);++ii)
       
   678 		{
       
   679 		TInt size=KMemoTestLengths[ii];
       
   680 		HBufC* buf=HBufC::NewL(size);
       
   681 		if (size>0)
       
   682 			{
       
   683 			TPtr des(buf->Des());
       
   684 			des.Copy(*prev);
       
   685 			des.AppendFill('b',size-prev->Length());
       
   686 			delete prev;
       
   687 			TheView.InsertL();
       
   688 			TheView.SetColL(1,*buf);
       
   689 			TheView.PutL();
       
   690 			++count;
       
   691 			des[size-1]='a';
       
   692 			}
       
   693 		TheView.InsertL();
       
   694 		TheView.SetColL(1,*buf);
       
   695 		TheView.PutL();
       
   696 		++count;
       
   697 		prev=buf;
       
   698 		}
       
   699 	delete prev;
       
   700 	TheView.Close();
       
   701 	r=TheDatabase.Commit();
       
   702 	test (r==KErrNone);
       
   703 //
       
   704 	test.Next(_L("Normal order"));
       
   705 	OrderByLongTextL(count,EDbCompareNormal);
       
   706 	test.Next(_L("Folded order"));
       
   707 	OrderByLongTextL(count,EDbCompareFolded);
       
   708 	test.Next(_L("Collated order"));
       
   709 	OrderByLongTextL(count,EDbCompareCollated);
       
   710 //
       
   711 	r=TheDatabase.DropTable(KTableName);
       
   712 	test (r==KErrNone);
       
   713 	test.End();
       
   714 	}
       
   715 
       
   716 /**
       
   717 @SYMTestCaseID          SYSLIB-DBMS-CT-0625
       
   718 @SYMTestCaseDesc        Tests for ordering by longtext
       
   719 @SYMTestPriority        Medium
       
   720 @SYMTestActions         Tests for CDbColSet
       
   721 @SYMTestExpectedResults Test must not fail
       
   722 @SYMREQ                 REQ0000
       
   723 */
       
   724 LOCAL_C void TestOrderByLongTextL()
       
   725 	{
       
   726 	test.Start(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0625 Maximum Inline Limit "));
       
   727 	CDbColSet* set=CDbColSet::NewLC();
       
   728 	TestMemoTableL(*set);
       
   729 //
       
   730 	test.Next(_L("Reduced Inline limit [<32]"));
       
   731 	set->Clear();
       
   732 	TDbCol col;
       
   733 	col.iType=EDbColText8;
       
   734 	col.iMaxLength=255;
       
   735 	col.iAttributes=0;
       
   736 	TDbColName name;
       
   737 	for (TInt ii=0;ii<32;++ii)
       
   738 		{
       
   739 		name.Format(_L("col%d"),ii);
       
   740 		col.iName=name;
       
   741 		if (ii==31)
       
   742 			col.iMaxLength=255-20;
       
   743 		set->AddL(col);
       
   744 		}
       
   745 	TestMemoTableL(*set);
       
   746 	CleanupStack::PopAndDestroy();
       
   747 	test.End();
       
   748 	}
       
   749 
       
   750 /**
       
   751 @SYMTestCaseID          SYSLIB-DBMS-CT-0626
       
   752 @SYMTestCaseDesc        Tests for reverse ordering in indexes
       
   753 @SYMTestPriority        Medium
       
   754 @SYMTestActions         Tests for reversing the indexes
       
   755 @SYMTestExpectedResults Test must not fail
       
   756 @SYMREQ                 REQ0000
       
   757 */
       
   758 LOCAL_C void TestReverseL()
       
   759 	{
       
   760 	test.Start(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0626 Create table and index "));
       
   761 	TheDatabase.Begin();
       
   762 	CDbColSet *cs=CDbColSet::NewLC();
       
   763 	cs->AddL(TDbCol(KColumnName,EDbColInt32));
       
   764 	test(TheDatabase.CreateTable(KTableName,*cs)==KErrNone);
       
   765 	CleanupStack::PopAndDestroy();
       
   766 	CDbKey *key=CDbKey::NewLC();
       
   767 	key->AddL(TDbKeyCol(KColumnName,TDbKeyCol::EDesc));
       
   768 	key->MakeUnique();
       
   769 	test(TheDatabase.CreateIndex(KIndexName,KTableName,*key)==KErrNone);
       
   770 	CleanupStack::PopAndDestroy();
       
   771 	test(TheDatabase.Commit()==KErrNone);
       
   772 	test.Next(_L("Add records"));
       
   773 	TheDatabase.Begin();
       
   774 	test(TheTable.Open(TheDatabase,KTableName)==KErrNone);
       
   775 	for (TInt ii=0;ii<KInt32Count;++ii)
       
   776 		{
       
   777 		TheTable.InsertL();
       
   778 		TheTable.SetColL(1,KInt32Values[ii]);
       
   779 		TheTable.PutL();
       
   780 		}
       
   781 	test(TheDatabase.Commit()==KErrNone);
       
   782 	test(TheTable.CountL()==KInt32Count);
       
   783 	test.Next(_L("Check order"));
       
   784 	test(TheTable.SetIndex(KIndexName)==KErrNone);
       
   785 	test(TheTable.CountL()==KInt32Count);
       
   786 	TInt count=0;
       
   787 	if (TheTable.FirstL())
       
   788 		{
       
   789 		++count;
       
   790 		TheTable.GetL();
       
   791 		TInt32 last=TheTable.ColInt(1);
       
   792 		while (TheTable.NextL())
       
   793 			{
       
   794 			++count;
       
   795 			TheTable.GetL();
       
   796 			TInt32 current=TheTable.ColInt(1);
       
   797 			test(last>current);
       
   798 			last=current;
       
   799 			}
       
   800 		}
       
   801 	test(count==KInt32Count);
       
   802 	TheTable.Close();
       
   803 	test(TheDatabase.DropTable(KTableName)==KErrNone);
       
   804 	test.End();
       
   805 	}
       
   806 
       
   807 /**
       
   808 @SYMTestCaseID          SYSLIB-DBMS-CT-0627
       
   809 @SYMTestCaseDesc        Tests for multi-column keys
       
   810 @SYMTestPriority        Medium
       
   811 @SYMTestActions         Tests for mutliple column keys
       
   812 @SYMTestExpectedResults Test must not fail
       
   813 @SYMREQ                 REQ0000
       
   814 */
       
   815 LOCAL_C void TestMultiL()
       
   816 	{
       
   817 	test.Start(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0627 Create table and index "));
       
   818 	TheDatabase.Begin();
       
   819 	CDbColSet *cs=CDbColSet::NewLC();
       
   820 	TDbCol col(KColumnName,EDbColInt32);
       
   821 	col.iAttributes=TDbCol::ENotNull;
       
   822 	cs->AddL(col);
       
   823 	col.iName=KColumnTwo;
       
   824 	cs->AddL(col);
       
   825 	test(TheDatabase.CreateTable(KTableName,*cs)==KErrNone);
       
   826 	CleanupStack::PopAndDestroy();
       
   827 	CDbKey *key=CDbKey::NewLC();
       
   828 	key->AddL(TDbKeyCol(KColumnTwo));
       
   829 	key->AddL(TDbKeyCol(KColumnName,TDbKeyCol::EDesc));
       
   830 	key->MakeUnique();
       
   831 	test(TheDatabase.CreateIndex(KIndexName,KTableName,*key)==KErrNone);
       
   832 	CleanupStack::PopAndDestroy();
       
   833 	test(TheDatabase.Commit()==KErrNone);
       
   834 	test.Next(_L("Add records"));
       
   835 	TheDatabase.Begin();
       
   836 	test(TheTable.Open(TheDatabase,KTableName)==KErrNone);
       
   837 	for (TInt ii=0;ii<KInt32Count;++ii)
       
   838 		{
       
   839 		for (TInt jj=0;jj<KInt32Count;++jj)
       
   840 			{
       
   841 			TheTable.InsertL();
       
   842 			TheTable.SetColL(1,KInt32Values[ii]);
       
   843 			TheTable.SetColL(2,KInt32Values[jj]);
       
   844 			TheTable.PutL();
       
   845 			}
       
   846 		}
       
   847 	test(TheDatabase.Commit()==KErrNone);
       
   848 	test.Next(_L("Check order"));
       
   849 	test(TheTable.CountL()==KInt32Count*KInt32Count);
       
   850 	test(TheTable.SetIndex(KIndexName)==KErrNone);
       
   851 	test(TheTable.CountL()==KInt32Count*KInt32Count);
       
   852 	TInt count=0;
       
   853 	if (TheTable.FirstL())
       
   854 		{
       
   855 		++count;
       
   856 		TheTable.GetL();
       
   857 		TInt32 lastOne=TheTable.ColInt(1);
       
   858 		TInt32 lastTwo=TheTable.ColInt(2);
       
   859 		while (TheTable.NextL())
       
   860 			{
       
   861 			++count;
       
   862 			TheTable.GetL();
       
   863 			TInt32 currentOne=TheTable.ColInt(1);
       
   864 			TInt32 currentTwo=TheTable.ColInt(2);
       
   865 			test(lastTwo<currentTwo||(lastTwo==currentTwo&&lastOne>currentOne));
       
   866 			lastOne=currentOne;
       
   867 			lastTwo=currentTwo;
       
   868 			}
       
   869 		}
       
   870 	test(count==KInt32Count*KInt32Count);
       
   871 	TheTable.Close();
       
   872 	test(TheDatabase.DropTable(KTableName)==KErrNone);
       
   873 	test.End();
       
   874 	}
       
   875 
       
   876 /**
       
   877 @SYMTestCaseID          SYSLIB-DBMS-CT-0628
       
   878 @SYMTestCaseDesc        Tests duplicates/unique constraints
       
   879 @SYMTestPriority        Medium
       
   880 @SYMTestActions         Tests for adding duplicate entries
       
   881 @SYMTestExpectedResults Test must not fail
       
   882 @SYMREQ                 REQ0000
       
   883 */
       
   884 LOCAL_C void TestDuplicatesL()
       
   885 	{
       
   886 	test.Start(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0628 Create table and indices "));
       
   887 	BuildTableL(EDbColInt32,TDbCol::ENotNull,KInt32Values,KInt32Count);
       
   888 	BuildIndexL();
       
   889 	TheTable.Close();
       
   890 	CDbKey* key=CDbKey::NewLC();
       
   891 	key->AddL(KColumnName);
       
   892 	test(TheDatabase.CreateIndex(KIndexTwo,KTableName,*key)==KErrNone);
       
   893 	CleanupStack::PopAndDestroy();
       
   894 	test.Next(_L("Attempt to add/update duplicate entry"));
       
   895 	test(TheTable.Open(TheDatabase,KTableName)==KErrNone);
       
   896 	TheTable.InsertL();
       
   897 	TheTable.SetColL(1,0);
       
   898 	TRAPD(r,TheTable.PutL());
       
   899 	test(r!=KErrNone);
       
   900 	TheTable.Cancel();
       
   901 	TheTable.LastL();
       
   902 	TheTable.UpdateL();
       
   903 	TheTable.SetColL(1,0);
       
   904 	TRAP(r,TheTable.PutL());
       
   905 	test(r!=KErrNone);
       
   906 	TheTable.Cancel();
       
   907 	test.Next(_L("Remove unique index"));
       
   908 	TheTable.Close();
       
   909 	test(TheDatabase.DropIndex(KIndexName,KTableName)==KErrNone);
       
   910 	test.Next(_L("Attempt to update/add duplicate entry"));
       
   911 	test(TheTable.Open(TheDatabase,KTableName)==KErrNone);
       
   912 	TheTable.LastL();
       
   913 	TheTable.UpdateL();
       
   914 	TheTable.SetColL(1,0);
       
   915 	TRAP(r,TheTable.PutL());
       
   916 	test(r==KErrNone);
       
   917 	TheTable.InsertL();
       
   918 	TheTable.SetColL(1,0);
       
   919 	TRAP(r,TheTable.PutL());
       
   920 	test(r==KErrNone);
       
   921 	test.Next(_L("Check order"));
       
   922 	test(TheTable.CountL()==KInt32Count+1);
       
   923 	test(TheTable.SetIndex(KIndexTwo)==KErrNone);
       
   924 	test(TheTable.CountL()==KInt32Count+1);
       
   925 	TInt count=0;
       
   926 	if (TheTable.FirstL())
       
   927 		{
       
   928 		++count;
       
   929 		TheTable.GetL();
       
   930 		TInt32 last=TheTable.ColInt(1);
       
   931 		while (TheTable.NextL())
       
   932 			{
       
   933 			++count;
       
   934 			TheTable.GetL();
       
   935 			TInt32 current=TheTable.ColInt(1);
       
   936 			test(last<=current);	// duplicates present
       
   937 			last=current;
       
   938 			}
       
   939 		}
       
   940 	test(count==KInt32Count+1);
       
   941 	test.Next(_L("Try to create unique index"));
       
   942 	TheTable.Close();
       
   943 	key=CDbKey::NewLC();
       
   944 	key->AddL(KColumnName);
       
   945 	key->MakeUnique();
       
   946 	test(TheDatabase.CreateIndex(KIndexName,KTableName,*key)!=KErrNone);
       
   947 	CleanupStack::PopAndDestroy();
       
   948 	test(TheDatabase.DropTable(KTableName)==KErrNone);
       
   949 	test.End();
       
   950 	}
       
   951 
       
   952 struct Pair { TInt i1,i2; };
       
   953 struct TSeekingTest
       
   954 	{
       
   955 	Pair iSeek;
       
   956 	Pair iResults[5];
       
   957 	};
       
   958 
       
   959 // seek pair: results for <,<=,=,>=,>
       
   960 static TSeekingTest const SeekingTests[]=
       
   961 	{
       
   962 	{{0,0},{{-1,-1},{-1,-1},{-1,-1},{100,10},{100,10}}},
       
   963 	{{0,-1},{{-1,-1},{-1,-1},{-1,-1},{100,10},{100,10}}},
       
   964 	{{100,0},{{-1,-1},{-1,-1},{-1,-1},{100,10},{100,10}}},
       
   965 	{{100,10},{{-1,-1},{100,10},{100,10},{100,10},{100,20}}},
       
   966 	{{100,55},{{100,50},{100,50},{-1,-1},{100,60},{100,60}}},
       
   967 	{{100,60},{{100,50},{100,60},{100,60},{100,60},{100,70}}},
       
   968 	{{100,100},{{100,90},{100,100},{100,100},{100,100},{200,10}}},
       
   969 	{{100,110},{{100,100},{100,100},{-1,-1},{200,10},{200,10}}},
       
   970 	{{100,-1},{{-1,-1},{100,100},{100,10},{100,10},{200,10}}},
       
   971 	{{500,-1},{{400,100},{500,100},{500,10},{500,10},{600,10}}},
       
   972 	{{550,50},{{500,100},{500,100},{-1,-1},{600,10},{600,10}}},
       
   973 	{{550,-1},{{500,100},{500,100},{-1,-1},{600,10},{600,10}}},
       
   974 	{{1000,0},{{900,100},{900,100},{-1,-1},{1000,10},{1000,10}}},
       
   975 	{{1000,10},{{900,100},{1000,10},{1000,10},{1000,10},{1000,20}}},
       
   976 	{{1000,100},{{1000,90},{1000,100},{1000,100},{1000,100},{-1,-1}}},
       
   977 	{{1000,110},{{1000,100},{1000,100},{-1,-1},{-1,-1},{-1,-1}}},
       
   978 	{{1000,-1},{{900,100},{1000,100},{1000,10},{1000,10},{-1,-1}}},
       
   979 	{{1100,0},{{1000,100},{1000,100},{-1,-1},{-1,-1},{-1,-1}}},
       
   980 	{{1100,-1},{{1000,100},{1000,100},{-1,-1},{-1,-1},{-1,-1}}}
       
   981 	};
       
   982 
       
   983 /**
       
   984 @SYMTestCaseID          SYSLIB-DBMS-CT-0629
       
   985 @SYMTestCaseDesc        Tests for seeking on indexes
       
   986 @SYMTestPriority        Medium
       
   987 @SYMTestActions         Tests for SeekL and GetL functions
       
   988 @SYMTestExpectedResults Test must not fail
       
   989 @SYMREQ                 REQ0000
       
   990 */
       
   991 LOCAL_C void TestSeekingL()
       
   992 	{
       
   993 	test.Start(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0629 Create table and index "));
       
   994 	TheDatabase.Begin();
       
   995 	CDbColSet *cs=CDbColSet::NewLC();
       
   996 	TDbCol col(KColumnName,EDbColInt32);
       
   997 	col.iAttributes=TDbCol::ENotNull;
       
   998 	cs->AddL(col);
       
   999 	col.iName=KColumnTwo;
       
  1000 	cs->AddL(col);
       
  1001 	test(TheDatabase.CreateTable(KTableName,*cs)==KErrNone);
       
  1002 	CleanupStack::PopAndDestroy();
       
  1003 	CDbKey *key=CDbKey::NewLC();
       
  1004 	key->AddL(KColumnName).AddL(KColumnTwo);
       
  1005 	key->MakeUnique();
       
  1006 	test(TheDatabase.CreateIndex(KIndexName,KTableName,*key)==KErrNone);
       
  1007 	CleanupStack::PopAndDestroy();
       
  1008 	test(TheDatabase.Commit()==KErrNone);
       
  1009 	test.Next(_L("Add records"));
       
  1010 	TheDatabase.Begin();
       
  1011 	test(TheTable.Open(TheDatabase,KTableName)==KErrNone);
       
  1012 	for (TInt ii=100;ii<=1000;ii+=100)
       
  1013 		{
       
  1014 		for (TInt jj=10;jj<=100;jj+=10)
       
  1015 			{
       
  1016 			TheTable.InsertL();
       
  1017 			TheTable.SetColL(1,ii);
       
  1018 			TheTable.SetColL(2,jj);
       
  1019 			TheTable.PutL();
       
  1020 			}
       
  1021 		}
       
  1022 	test(TheDatabase.Commit()==KErrNone);
       
  1023 	test(TheTable.CountL()==100);
       
  1024 	test(TheTable.SetIndex(KIndexName)==KErrNone);
       
  1025 	test(TheTable.CountL()==100);
       
  1026 	test.Next(_L("Seeking"));
       
  1027 	const TSeekingTest* stest=SeekingTests;
       
  1028 	const TSeekingTest* const end=stest+sizeof(SeekingTests)/sizeof(SeekingTests[0])-1;
       
  1029 	for (;stest<=end;++stest)
       
  1030 		{
       
  1031 		TDbSeekMultiKey<2> key;
       
  1032 		key.Add(stest->iSeek.i1);
       
  1033 		if (stest->iSeek.i2>=0)
       
  1034 			key.Add(stest->iSeek.i2);
       
  1035 		const Pair* results=stest->iResults;
       
  1036 		for (TInt ii=RDbTable::ELessThan;ii<=RDbTable::EGreaterThan;++results,++ii)
       
  1037 			{
       
  1038 			if (TheTable.SeekL(key,RDbTable::TComparison(ii)))
       
  1039 				{
       
  1040 				test(results->i1>=0);
       
  1041 				TRAPD(errCode, TheTable.GetL());
       
  1042 				test(errCode==KErrNone);
       
  1043 				test(TheTable.ColInt(1)==results->i1);
       
  1044 				test(TheTable.ColInt(2)==results->i2);
       
  1045 				}
       
  1046 			else
       
  1047 				test(results->i1<0);
       
  1048 			}
       
  1049 		}
       
  1050 	TheTable.Close();
       
  1051 	test(TheDatabase.DropTable(KTableName)==KErrNone);
       
  1052 	test.End();
       
  1053 	}
       
  1054 
       
  1055 /**
       
  1056 @SYMTestCaseID          SYSLIB-DBMS-CT-0630
       
  1057 @SYMTestCaseDesc        Tests for defect,index creation and set index operations
       
  1058 @SYMTestPriority        Medium
       
  1059 @SYMTestActions         Tests for creating and setting index operations
       
  1060 @SYMTestExpectedResults Test must not fail
       
  1061 @SYMREQ                 REQ0000
       
  1062 */
       
  1063 LOCAL_C void TestInequalityErrorL()
       
  1064 	{
       
  1065 	test.Start(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0630 Create table "));
       
  1066 	TheDatabase.Begin();
       
  1067 	CDbColSet *cs=CDbColSet::NewLC();
       
  1068 	cs->AddL(TDbCol(KColumnName,EDbColInt32));
       
  1069 	test(TheDatabase.CreateTable(KTableName,*cs)==KErrNone);
       
  1070 	CleanupStack::PopAndDestroy();
       
  1071 //
       
  1072 	test.Next(_L("create indices"));
       
  1073 	CDbKey *key=CDbKey::NewLC();
       
  1074 	key->AddL(TDbKeyCol(KColumnName));
       
  1075 	test(TheDatabase.CreateIndex(KIndexName,KTableName,*key)==KErrNone);
       
  1076 	CleanupStack::PopAndDestroy();
       
  1077 //
       
  1078 	test.Next(_L("Populate table"));
       
  1079 	test(TheTable.Open(TheDatabase,KTableName)==KErrNone);
       
  1080 	for(TInt ii=0; ii<=130;++ii)
       
  1081 		{
       
  1082 		TheTable.InsertL();
       
  1083 		TheTable.SetColL(1,ii);
       
  1084 		TheTable.PutL();
       
  1085 		}
       
  1086 //
       
  1087 	test.Next(_L("Checks"));
       
  1088 	test(TheTable.SetIndex(KIndexName)==KErrNone);
       
  1089 //
       
  1090 // We need to delete a row in this node to get to the correct inequality condition
       
  1091 	test.Next(_L("Delete row 90"));
       
  1092 	test(TheTable.SeekL(TDbSeekKey(90)));
       
  1093 	TheTable.GetL();
       
  1094 	TheTable.DeleteL();
       
  1095 // Now delete last row on node which should be 94
       
  1096 	test.Next(_L("Delete row 94"));
       
  1097 	test(TheTable.SeekL(TDbSeekKey(94)));
       
  1098 	TheTable.GetL();
       
  1099 	TheTable.DeleteL();
       
  1100 	TheTable.EndL();
       
  1101 	test(!TheTable.SeekL(TDbSeekKey(94)));
       
  1102 //
       
  1103 	test.Next(_L("Insert row 94"));
       
  1104 	TheTable.InsertL();
       
  1105 	TheTable.SetColL(1,94);
       
  1106 	TheTable.PutL();
       
  1107 //
       
  1108 	test.Next(_L("now try and find it"));
       
  1109 	test(TheTable.SeekL(TDbSeekKey(94))); //prior to defect fix this line failed.
       
  1110 //
       
  1111 	TheDatabase.Commit();
       
  1112 	TheTable.Close();
       
  1113 	test(TheDatabase.DropTable(KTableName)==KErrNone);
       
  1114 	test.End();
       
  1115 	}
       
  1116 
       
  1117 /**
       
  1118 @SYMTestCaseID          PDS-DBMS-CT-4006
       
  1119 @SYMTestCaseDesc        Tests for add dbseekkey operations
       
  1120 @SYMTestPriority        High
       
  1121 @SYMTestActions         Create a DbSeekKey then add an index to it
       
  1122 @SYMTestExpectedResults Verify that seeking with key works
       
  1123 @SYMDEF                 DEF135710
       
  1124 */
       
  1125 LOCAL_C void TestAddSeekKeyL()
       
  1126 	{
       
  1127 	test.Start(_L(" @SYMTestCaseID:PDS-DBMS-CT-4006 Tests for add dbseekkey operations"));
       
  1128 	
       
  1129 	CreateDatabase();
       
  1130 	TInt err = TheDatabase.Begin();
       
  1131 	test2(err, KErrNone);
       
  1132 	
       
  1133 	CDbColSet *cs=CDbColSet::NewLC();
       
  1134 	cs->AddL(TDbCol(KColumnName1,EDbColText8));
       
  1135 	err = TheDatabase.CreateTable(KTableName1,*cs);
       
  1136 	test2(err , KErrNone);
       
  1137 	CleanupStack::PopAndDestroy();
       
  1138 
       
  1139 	test.Next(_L("Create Indices"));
       
  1140 	CDbKey *key=CDbKey::NewLC();
       
  1141 	key->AddL(TDbKeyCol(KColumnName1));
       
  1142 	err = TheDatabase.CreateIndex(KIndexName1,KTableName1,*key);
       
  1143 	test2(err, KErrNone);
       
  1144 	CleanupStack::PopAndDestroy();
       
  1145 
       
  1146 	test.Next(_L("Populate Table"));
       
  1147 	TBuf8<7> buf(_L8("testKey"));
       
  1148 	err = TheTable.Open(TheDatabase,KTableName1);
       
  1149 	test2(err, KErrNone);
       
  1150 	for(TInt i = 0; i <= 10; ++i)
       
  1151 		{
       
  1152 		TheTable.InsertL();
       
  1153 		TheTable.SetColL(1,buf);
       
  1154 		TheTable.PutL();
       
  1155 		}
       
  1156 	
       
  1157 	test.Next(_L("Set Index"));
       
  1158 	err = TheTable.SetIndex(KIndexName1);
       
  1159 	test2(err, KErrNone);
       
  1160 
       
  1161 	test.Next(_L("Testing Add Function"));
       
  1162 	TDbSeekKey testkey;
       
  1163 	testkey.Add(buf);
       
  1164 	TBool r = TheTable.SeekL(testkey);
       
  1165 	test2(r, ETrue);
       
  1166 	
       
  1167 	err = TheDatabase.Commit();
       
  1168 	test2(err, KErrNone);
       
  1169 	
       
  1170 	TheTable.Close();
       
  1171 	test.End();
       
  1172 	}
       
  1173 
       
  1174 //
       
  1175 // Test the database definition and enquiry functions
       
  1176 //
       
  1177 LOCAL_C void TestIndexesL()
       
  1178 	{
       
  1179 	test.Start(_L("Create Database"));
       
  1180 	CreateDatabase();
       
  1181 	test.Next(_L("Test index build and drop"));
       
  1182 	TestIndexBuildL();
       
  1183 	test.Next(_L("Test index persistence"));
       
  1184 	TestPersistenceL();
       
  1185 	test.Next(_L("Testing index key types"));
       
  1186 	TestTypesL();
       
  1187 	test.Next(_L("Testing LongText ORDER BY"));
       
  1188 	TestOrderByLongTextL();
       
  1189 	test.Next(_L("Testing reverse ordering"));
       
  1190 	TestReverseL();
       
  1191 	test.Next(_L("Testing multi column keys"));
       
  1192 	TestMultiL();
       
  1193 	test.Next(_L("Testing duplicate/unqiue"));
       
  1194 	TestDuplicatesL();
       
  1195 	test.Next(_L("Testing seeking"));
       
  1196 	TestSeekingL();
       
  1197 	test.Next(_L("Testing incorrect inequaltiy condition in store btree"));
       
  1198 	TestInequalityErrorL();
       
  1199 	CloseDatabase();
       
  1200 	test.End();
       
  1201 	}
       
  1202 
       
  1203 //
       
  1204 // Prepare the test directory.
       
  1205 //
       
  1206 LOCAL_C void setupTestDirectory()
       
  1207     {
       
  1208 	TInt r=TheFs.Connect();
       
  1209 	test(r==KErrNone);
       
  1210 //
       
  1211 	r=TheFs.MkDir(KTestDatabase);
       
  1212 	test(r==KErrNone || r==KErrAlreadyExists);
       
  1213 	}
       
  1214 
       
  1215 //
       
  1216 // Initialise the cleanup stack.
       
  1217 //
       
  1218 LOCAL_C void setupCleanup()
       
  1219     {
       
  1220 	TheTrapCleanup=CTrapCleanup::New();
       
  1221 	test(TheTrapCleanup!=NULL);
       
  1222 	TRAPD(r,\
       
  1223 		{\
       
  1224 		for (TInt i=KTestCleanupStack;i>0;i--)\
       
  1225 			CleanupStack::PushL((TAny*)0);\
       
  1226 		CleanupStack::Pop(KTestCleanupStack);\
       
  1227 		});
       
  1228 	test(r==KErrNone);
       
  1229 	}
       
  1230 
       
  1231 LOCAL_C void DeleteDataFile(const TDesC& aFullName)
       
  1232 	{
       
  1233 	RFs fsSession;
       
  1234 	TInt err = fsSession.Connect();
       
  1235 	if(err == KErrNone)
       
  1236 		{
       
  1237 		TEntry entry;
       
  1238 		if(fsSession.Entry(aFullName, entry) == KErrNone)
       
  1239 			{
       
  1240 			RDebug::Print(_L("Deleting \"%S\" file.\n"), &aFullName);
       
  1241 			err = fsSession.SetAtt(aFullName, 0, KEntryAttReadOnly);
       
  1242 			if(err != KErrNone)
       
  1243 				{
       
  1244 				RDebug::Print(_L("Error %d changing \"%S\" file attributes.\n"), err, &aFullName);
       
  1245 				}
       
  1246 			err = fsSession.Delete(aFullName);
       
  1247 			if(err != KErrNone)
       
  1248 				{
       
  1249 				RDebug::Print(_L("Error %d deleting \"%S\" file.\n"), err, &aFullName);
       
  1250 				}
       
  1251 			}
       
  1252 		fsSession.Close();
       
  1253 		}
       
  1254 	else
       
  1255 		{
       
  1256 		RDebug::Print(_L("Error %d connecting file session. File: %S.\n"), err, &aFullName);
       
  1257 		}
       
  1258 	}
       
  1259 
       
  1260 //
       
  1261 // Test streaming conversions.
       
  1262 //
       
  1263 GLDEF_C TInt E32Main()
       
  1264     {
       
  1265 	test.Title();
       
  1266 	setupTestDirectory();
       
  1267 	setupCleanup();
       
  1268 	__UHEAP_MARK;
       
  1269 //
       
  1270 	TInt r=TheDbs.Connect();
       
  1271 	test (r==KErrNone);
       
  1272 	TheDbs.ResourceMark();
       
  1273 	test.Start(_L("Standard database"));
       
  1274 	TRAP(r,TestIndexesL();)
       
  1275 	test(r==KErrNone);
       
  1276 	test.Next(_L("Secure database"));
       
  1277 	TRAP(r,TestIndexesL();)
       
  1278 	test(r==KErrNone);
       
  1279 	TRAP(r, TestAddSeekKeyL());
       
  1280 	test(r==KErrNone);
       
  1281 	CloseDatabase();
       
  1282 
       
  1283 	::DeleteDataFile(KTestDatabase);	//deletion of data files must be before call to end - DEF047652
       
  1284 
       
  1285 	test.End();
       
  1286 	TheDbs.ResourceCheck();
       
  1287 	TheDbs.Close();
       
  1288 
       
  1289 	__UHEAP_MARKEND;
       
  1290 	delete TheTrapCleanup;
       
  1291 
       
  1292 	TheFs.Close();
       
  1293 	test.Close();
       
  1294 	return 0;
       
  1295     }