os/persistentdata/persistentstorage/dbms/pcdbms/tdbms/src/t_dbms.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
sl@0
     1
// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     2
// All rights reserved.
sl@0
     3
// This component and the accompanying materials are made available
sl@0
     4
// under the terms of "Eclipse Public License v1.0"
sl@0
     5
// which accompanies this distribution, and is available
sl@0
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     7
//
sl@0
     8
// Initial Contributors:
sl@0
     9
// Nokia Corporation - initial contribution.
sl@0
    10
//
sl@0
    11
// Contributors:
sl@0
    12
//
sl@0
    13
// Description:
sl@0
    14
//
sl@0
    15
sl@0
    16
#include <d32dbms.h>
sl@0
    17
#include <s32file.h>
sl@0
    18
#include <e32test.h>
sl@0
    19
#include <e32math.h>
sl@0
    20
sl@0
    21
#include "crccheck.h"
sl@0
    22
sl@0
    23
#undef __UHEAP_MARK
sl@0
    24
#define __UHEAP_MARK
sl@0
    25
#undef __UHEAP_MARKEND
sl@0
    26
#define __UHEAP_MARKEND
sl@0
    27
sl@0
    28
LOCAL_D TDBMS_CRCChecks TheCrcChecker;
sl@0
    29
sl@0
    30
#ifndef __linux__ //No CRC test on LINUX
sl@0
    31
#ifdef __TOOLS2__
sl@0
    32
const TPtrC	KCrcRecord=_L("\\epoc32\\winscw\\c\\dbms-tst\\T_DBMS.CRC");
sl@0
    33
#else
sl@0
    34
const TPtrC	KCrcRecord=_L("C:\\dbms-tst\\T_DBMS.CRC");
sl@0
    35
#endif
sl@0
    36
#endif
sl@0
    37
sl@0
    38
#if defined(__VC32__) && !defined(_DEBUG)
sl@0
    39
#pragma warning(disable : 4710)			// function not expanded. MSVC 4.0 is stupid
sl@0
    40
#endif
sl@0
    41
sl@0
    42
LOCAL_D RTest test(_L("T_DBMS : Test DBMS API"));
sl@0
    43
LOCAL_D CTrapCleanup* TheTrapCleanup;
sl@0
    44
LOCAL_D RDbs TheDbs;
sl@0
    45
LOCAL_D RDbNamedDatabase TheDatabase;
sl@0
    46
LOCAL_D RDbTable TheTable;
sl@0
    47
LOCAL_D RDbView TheView;
sl@0
    48
LOCAL_D RFs TheFs;
sl@0
    49
LOCAL_D TBuf8<0x200> TheBuf8;
sl@0
    50
LOCAL_D TBuf16<0x100> TheBuf16;
sl@0
    51
sl@0
    52
const TInt KTestCleanupStack=0x40;
sl@0
    53
sl@0
    54
#ifdef __TOOLS2__
sl@0
    55
const TPtrC KTestDatabase=_L(".\\dbms-tst\\T_DBMS.DB");
sl@0
    56
#else
sl@0
    57
const TPtrC KTestDatabase=_L("C:\\dbms-tst\\T_DBMS.DB");
sl@0
    58
#endif
sl@0
    59
sl@0
    60
const TPtrC8 KTestText8(_S8("Text used for test columns when testing"));
sl@0
    61
const TPtrC8 KTestShortText8(_S8("a"));
sl@0
    62
const TPtrC8 KTestLongText8(_S8("Text which is used to set Long ASCII Text columns and ensure they are not inlined, and therefore needs to be very long indeed............." \
sl@0
    63
							"Text which is used to set Long ASCII Text columns and ensure they are not inlined, and therefore needs to be very long indeed............."));
sl@0
    64
const TPtrC16 KTestText16(_S16("Text used for test columns when testing"));
sl@0
    65
const TPtrC16 KTestShortText16(_S16("a"));
sl@0
    66
const TPtrC16 KTestLongText16(_S16("Text which is used to set Long UNICODE Text columns and ensure they are not inlined, and therefore needs to be very long indeed............."));
sl@0
    67
const TPtrC KTableName(_S("TestTable"));
sl@0
    68
const TPtrC KTableName2(_S("TestTable2"));
sl@0
    69
const TPtrC KTestViewTable(_L("TestViewTable"));
sl@0
    70
const TPtrC KTestTypesTable(_L("TestTypesTable"));
sl@0
    71
const TPtrC KTestFindTable(_L("TestFindTable"));
sl@0
    72
const TPtrC KTestMultiTable(_L("TestMultiTable"));
sl@0
    73
const TPtrC KIndexName(_S("Index1"));
sl@0
    74
const TPtrC KIndexName2(_S("Index2"));
sl@0
    75
const TPtrC KIndexName3(_S("Index3"));
sl@0
    76
const TInt KBlobItems=1000;
sl@0
    77
sl@0
    78
const TPtrC KNull=TPtrC();
sl@0
    79
const TPtrC KPass1(_S("wibble"));
sl@0
    80
const TPtrC KPass2(_S("wobble"));
sl@0
    81
sl@0
    82
const TTime KMinTTime=Time::MinTTime();
sl@0
    83
const TTime KMaxTTime=Time::MaxTTime();
sl@0
    84
sl@0
    85
struct SColDef
sl@0
    86
	{
sl@0
    87
	const TText* iName;
sl@0
    88
	TDbColType iType;
sl@0
    89
	TInt iAttributes;
sl@0
    90
	};
sl@0
    91
LOCAL_D SColDef const SingleColumn[]=
sl@0
    92
	{
sl@0
    93
	{_S("Column1"),EDbColInt32,0},
sl@0
    94
	{0}
sl@0
    95
	};
sl@0
    96
LOCAL_D SColDef const DoubleColumn[]=
sl@0
    97
	{
sl@0
    98
	{_S("Column1"),EDbColInt32,0},
sl@0
    99
	{_S("c2"),EDbColInt64,0},
sl@0
   100
	{0}
sl@0
   101
	};
sl@0
   102
LOCAL_D SColDef const ViewTestColumns[]=
sl@0
   103
	{
sl@0
   104
	{_S("Int"),EDbColInt32,0},
sl@0
   105
	{_S("Long1"),EDbColLongText8,0},
sl@0
   106
	{_S("Long2"),EDbColLongText8,0},
sl@0
   107
	{_S("Long3"),EDbColLongText8,0},
sl@0
   108
	{_S("Long4"),EDbColLongText8,0},
sl@0
   109
	{_S("Long5"),EDbColLongText8,0},
sl@0
   110
	{0}
sl@0
   111
	};
sl@0
   112
LOCAL_D SColDef const AllColumns[]=
sl@0
   113
	{
sl@0
   114
	{_S("counter"),EDbColInt32,TDbCol::ENotNull|TDbCol::EAutoIncrement},
sl@0
   115
	{_S("bit"),EDbColBit,TDbCol::ENotNull},
sl@0
   116
	{_S("int8"),EDbColInt8,TDbCol::ENotNull},
sl@0
   117
	{_S("uint8"),EDbColUint8,TDbCol::ENotNull},
sl@0
   118
	{_S("int16"),EDbColInt16,TDbCol::ENotNull},
sl@0
   119
	{_S("uint16"),EDbColUint16,TDbCol::ENotNull},
sl@0
   120
	{_S("int32"),EDbColInt32,TDbCol::ENotNull},
sl@0
   121
	{_S("uint32"),EDbColUint32,TDbCol::ENotNull},
sl@0
   122
	{_S("int64"),EDbColInt64,TDbCol::ENotNull},
sl@0
   123
	{_S("real32"),EDbColReal32,TDbCol::ENotNull},
sl@0
   124
	{_S("real64"),EDbColReal64,TDbCol::ENotNull},
sl@0
   125
	{_S("date_time"),EDbColDateTime,TDbCol::ENotNull},
sl@0
   126
	{_S("text8"),EDbColText8,TDbCol::ENotNull},
sl@0
   127
	{_S("text16"),EDbColText16,TDbCol::ENotNull},
sl@0
   128
	{_S("binary"),EDbColBinary,TDbCol::ENotNull},
sl@0
   129
	{_S("longtext8"),EDbColLongText8,TDbCol::ENotNull},
sl@0
   130
	{_S("longtext16"),EDbColLongText16,TDbCol::ENotNull},
sl@0
   131
	{_S("longbinary"),EDbColLongBinary,TDbCol::ENotNull},
sl@0
   132
	{_S("bit_null"),EDbColBit,0},
sl@0
   133
	{_S("int8_null"),EDbColInt8,0},
sl@0
   134
	{_S("uint8_null"),EDbColUint8,0},
sl@0
   135
	{_S("int16_null"),EDbColInt16,0},
sl@0
   136
	{_S("uint16_null"),EDbColUint16,0},
sl@0
   137
	{_S("int32_null"),EDbColInt32,0},
sl@0
   138
	{_S("uint32_null"),EDbColUint32,0},
sl@0
   139
	{_S("int64_null"),EDbColInt64,0},
sl@0
   140
	{_S("real32_null"),EDbColReal32,0},
sl@0
   141
	{_S("real64_null"),EDbColReal64,0},
sl@0
   142
	{_S("date_time_null"),EDbColDateTime,0},
sl@0
   143
	{_S("text8_null"),EDbColText8,0},
sl@0
   144
	{_S("text16_null"),EDbColText16,0},
sl@0
   145
	{_S("binary_null"),EDbColBinary,0},
sl@0
   146
	{_S("longtext8_null"),EDbColLongText8,0},
sl@0
   147
	{_S("longtext16_null"),EDbColLongText16,0},
sl@0
   148
	{_S("longbinary_null"),EDbColLongBinary,0},
sl@0
   149
	{_S("force_null"),EDbColInt32,0},
sl@0
   150
	{0}
sl@0
   151
	};
sl@0
   152
const TInt KColumns=sizeof(AllColumns)/sizeof(AllColumns[0])-1;
sl@0
   153
enum TColumns
sl@0
   154
	{
sl@0
   155
	ECounter,
sl@0
   156
	EBit,EInt8,EUint8,EInt16,EUint16,EInt32,EUint32,EInt64,
sl@0
   157
	EReal32,EReal64,ETime,EText8,EText16,ETBinary,
sl@0
   158
	ELongText8,ELongText16,ELongBinary,
sl@0
   159
	EBitNull,EInt8Null,EUint8Null,EInt16Null,EUint16Null,EInt32Null,EUint32Null,EInt64Null,
sl@0
   160
	EReal32Null,EReal64Null,ETimeNull,EText8Null,EText16Null,ETBinaryNull,
sl@0
   161
	ELongText8Null,ELongText16Null,ELongBinaryNull,EForceNull
sl@0
   162
	};
sl@0
   163
LOCAL_D TDbColNo TheMap[KColumns];
sl@0
   164
sl@0
   165
CDbColSet* ColumnSetL(const SColDef* aDef)
sl@0
   166
	{
sl@0
   167
	CDbColSet *set=CDbColSet::NewLC();
sl@0
   168
	for (;aDef->iName;++aDef)
sl@0
   169
		{
sl@0
   170
		TDbCol col(TPtrC(aDef->iName),aDef->iType);
sl@0
   171
		col.iAttributes=aDef->iAttributes;
sl@0
   172
		set->AddL(col);
sl@0
   173
		}
sl@0
   174
	CleanupStack::Pop();
sl@0
   175
	return set;
sl@0
   176
	}
sl@0
   177
sl@0
   178
enum TColSet {EAllTypes,ESingleColumn,EDoubleColumn,EViewTestTable};
sl@0
   179
LOCAL_D const SColDef* const ColSetDef[]=
sl@0
   180
	{
sl@0
   181
	AllColumns,
sl@0
   182
	SingleColumn,
sl@0
   183
	DoubleColumn,
sl@0
   184
	ViewTestColumns
sl@0
   185
	};
sl@0
   186
LOCAL_C CDbColSet* CreateColSetL(TColSet aType)
sl@0
   187
	{
sl@0
   188
	return ColumnSetL(ColSetDef[aType]);
sl@0
   189
	}
sl@0
   190
sl@0
   191
inline TPtrC ColName(const SColDef* aSet,TInt aColumn)
sl@0
   192
	{return TPtrC(aSet[aColumn].iName);}
sl@0
   193
sl@0
   194
enum TKeySet {EKeyAsc,EKeyDesc,EKeyMulti,EKeySingle};
sl@0
   195
LOCAL_C CDbKey* CreateKeyL(TKeySet aType)
sl@0
   196
	{
sl@0
   197
	CDbKey *k=CDbKey::NewLC();
sl@0
   198
	switch(aType)
sl@0
   199
		{
sl@0
   200
	case EKeyAsc:
sl@0
   201
		k->AddL(ColName(AllColumns,EInt32));
sl@0
   202
		break;
sl@0
   203
	case EKeyDesc:
sl@0
   204
		k->AddL(TDbKeyCol(ColName(AllColumns,EInt32),TDbKeyCol::EDesc));
sl@0
   205
		k->MakeUnique();
sl@0
   206
		break;
sl@0
   207
	case EKeyMulti:
sl@0
   208
		k->AddL(ColName(AllColumns,EInt32)).AddL(ColName(AllColumns,EText8));
sl@0
   209
		k->SetComparison(EDbCompareFolded);
sl@0
   210
		break;
sl@0
   211
	case EKeySingle:
sl@0
   212
		k->AddL(ColName(SingleColumn,0));
sl@0
   213
		break;
sl@0
   214
		}
sl@0
   215
	CleanupStack::Pop();
sl@0
   216
	return k;
sl@0
   217
	}
sl@0
   218
sl@0
   219
LOCAL_C void CloseDatabase()
sl@0
   220
	{
sl@0
   221
	TheDatabase.Close();
sl@0
   222
	TheCrcChecker.GenerateCrcL(KTestDatabase);
sl@0
   223
	}
sl@0
   224
sl@0
   225
sl@0
   226
//
sl@0
   227
// Open a shared database (SYMBIAN_REMOVE_TRIVIAL_ENCRYPTION version)
sl@0
   228
//
sl@0
   229
LOCAL_C TInt OpenSharedDatabase()
sl@0
   230
	{
sl@0
   231
	return TheDatabase.Open(TheDbs,KTestDatabase);
sl@0
   232
	}
sl@0
   233
sl@0
   234
//
sl@0
   235
// Create a local database (SYMBIAN_REMOVE_TRIVIAL_ENCRYPTION version)
sl@0
   236
//
sl@0
   237
LOCAL_C void CreateClientDatabase()
sl@0
   238
	{
sl@0
   239
	TInt r=TheDatabase.Replace(TheFs,KTestDatabase);
sl@0
   240
	test (r==KErrNone);
sl@0
   241
	}
sl@0
   242
sl@0
   243
//
sl@0
   244
// Create a shared database (SYMBIAN_REMOVE_TRIVIAL_ENCRYPTION version)
sl@0
   245
//
sl@0
   246
LOCAL_C void CreateSharedDatabase()
sl@0
   247
	{
sl@0
   248
	CreateClientDatabase();
sl@0
   249
	CloseDatabase();
sl@0
   250
	TInt r=OpenSharedDatabase();
sl@0
   251
	test (r==KErrNone);
sl@0
   252
	}
sl@0
   253
sl@0
   254
//
sl@0
   255
// Open a shared database (SYMBIAN_REMOVE_TRIVIAL_ENCRYPTION version)
sl@0
   256
//
sl@0
   257
LOCAL_C void OpenDatabase()
sl@0
   258
	{
sl@0
   259
	TInt r=OpenSharedDatabase();
sl@0
   260
	test (r==KErrNone);
sl@0
   261
	}
sl@0
   262
sl@0
   263
//
sl@0
   264
// Create a shared database (SYMBIAN_REMOVE_TRIVIAL_ENCRYPTION version)
sl@0
   265
//
sl@0
   266
LOCAL_C void CreateDatabase()
sl@0
   267
	{
sl@0
   268
	CreateSharedDatabase();
sl@0
   269
	}
sl@0
   270
sl@0
   271
sl@0
   272
LOCAL_C void DestroyDatabase()
sl@0
   273
	{
sl@0
   274
	TInt r=TheDatabase.Destroy();
sl@0
   275
	test (r==KErrNone);
sl@0
   276
	}
sl@0
   277
sl@0
   278
//
sl@0
   279
// Check the database has this many tables
sl@0
   280
//
sl@0
   281
LOCAL_C void CountTables(TInt aCount)
sl@0
   282
	{
sl@0
   283
	CDbNames* names=TheDatabase.TableNamesL();
sl@0
   284
	test (names->Count()==aCount);
sl@0
   285
	delete names;
sl@0
   286
	}
sl@0
   287
sl@0
   288
//
sl@0
   289
// Compare two column sets
sl@0
   290
//
sl@0
   291
LOCAL_C void Compare(const TDesC& aTable,const CDbColSet& aSet)
sl@0
   292
	{
sl@0
   293
	CDbColSet* set=TheDatabase.ColSetL(aTable);
sl@0
   294
	test(set->Count()==aSet.Count());
sl@0
   295
	for (TDbColSetIter iter(*set);iter;++iter)
sl@0
   296
		{
sl@0
   297
		const TDbCol* pRight=aSet.Col(iter->iName);
sl@0
   298
		test(pRight!=NULL);
sl@0
   299
		test(iter->iType==pRight->iType);
sl@0
   300
		test(iter->iMaxLength==KDbUndefinedLength || pRight->iMaxLength==KDbUndefinedLength || iter->iMaxLength==pRight->iMaxLength);
sl@0
   301
		test((iter->iAttributes&pRight->iAttributes)==iter->iAttributes);
sl@0
   302
		}
sl@0
   303
	delete set;
sl@0
   304
	}
sl@0
   305
sl@0
   306
//
sl@0
   307
// Check the database has this many tables
sl@0
   308
//
sl@0
   309
LOCAL_C void CountIndexes(const TDesC& aTable,TInt aCount)
sl@0
   310
	{
sl@0
   311
	CDbNames* names=TheDatabase.IndexNamesL(aTable);
sl@0
   312
	test (names->Count()==aCount);
sl@0
   313
	delete names;
sl@0
   314
	}
sl@0
   315
sl@0
   316
//
sl@0
   317
// Compare index definition
sl@0
   318
//
sl@0
   319
LOCAL_C void Compare(const TDesC& aIndex,const TDesC& aTable,const CDbKey& aKey)
sl@0
   320
	{
sl@0
   321
	CDbKey* key=TheDatabase.KeyL(aIndex,aTable);
sl@0
   322
	test(key->Count()==aKey.Count());
sl@0
   323
	test(key->Comparison()==aKey.Comparison());
sl@0
   324
	test(key->IsUnique()==aKey.IsUnique());
sl@0
   325
	for (TInt ii=aKey.Count();--ii>=0;)
sl@0
   326
		{
sl@0
   327
		const TDbKeyCol& left=(*key)[ii];
sl@0
   328
		const TDbKeyCol& right=aKey[ii];
sl@0
   329
		test (left.iName==right.iName);
sl@0
   330
		test (left.iOrder==right.iOrder);
sl@0
   331
		test (left.iLength==right.iLength || right.iLength==KDbUndefinedLength);
sl@0
   332
		}
sl@0
   333
	delete key;
sl@0
   334
	}
sl@0
   335
sl@0
   336
/**
sl@0
   337
@SYMTestCaseID          SYSLIB-DBMS-CT-0594
sl@0
   338
@SYMTestCaseDesc        Tests the database definition and enquiry functions
sl@0
   339
@SYMTestPriority        Medium
sl@0
   340
@SYMTestActions         Tests for creation and opening of a database,creation of a table 
sl@0
   341
                        Tests for comparing column and table column sets
sl@0
   342
						Tests for altering a table and creation of an index.
sl@0
   343
@SYMTestExpectedResults Test must not fail
sl@0
   344
@SYMREQ                 REQ0000
sl@0
   345
*/
sl@0
   346
LOCAL_C void TestDDL()
sl@0
   347
	{
sl@0
   348
	test.Start(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0594 Create Database "));
sl@0
   349
	CreateDatabase();
sl@0
   350
	CountTables(0);
sl@0
   351
	CloseDatabase();
sl@0
   352
	test.Next(_L("Open Database"));
sl@0
   353
	OpenDatabase();
sl@0
   354
	CountTables(0);
sl@0
   355
	test.Next(_L("CreateTable"));
sl@0
   356
	CDbColSet* cs=CreateColSetL(EAllTypes);
sl@0
   357
	test(TheDatabase.CreateTable(KTableName,*cs)==KErrNone);
sl@0
   358
	CountTables(1);
sl@0
   359
	test.Next(_L("Compare column sets"));
sl@0
   360
	Compare(KTableName,*cs);
sl@0
   361
	CloseDatabase();
sl@0
   362
	test.Next(_L("Re-open database"));
sl@0
   363
	OpenDatabase();
sl@0
   364
	CountTables(1);
sl@0
   365
	test.Next(_L("Compare table column sets"));
sl@0
   366
	Compare(KTableName,*cs);
sl@0
   367
	delete cs;
sl@0
   368
	test.Next(_L("Add another table"));
sl@0
   369
	cs=CreateColSetL(ESingleColumn);
sl@0
   370
	test(TheDatabase.CreateTable(KTableName2,*cs)==KErrNone);
sl@0
   371
	Compare(KTableName2,*cs);
sl@0
   372
	delete cs;
sl@0
   373
	CountTables(2);
sl@0
   374
//
sl@0
   375
	test.Next(_L("Alter table"));
sl@0
   376
	cs=CreateColSetL(EDoubleColumn);
sl@0
   377
	test(TheDatabase.AlterTable(KTableName2,*cs)==KErrNone);
sl@0
   378
	Compare(KTableName2,*cs);
sl@0
   379
	delete cs;
sl@0
   380
	CountTables(2);
sl@0
   381
//
sl@0
   382
	test.Next(_L("Test index creation"));
sl@0
   383
	CountIndexes(KTableName,0);
sl@0
   384
	CountIndexes(KTableName2,0);
sl@0
   385
	CDbKey* key=CreateKeyL(EKeyAsc);
sl@0
   386
	test (TheDatabase.CreateIndex(KIndexName,KTableName,*key)==KErrNone);
sl@0
   387
	Compare(KIndexName,KTableName,*key);
sl@0
   388
	delete key;
sl@0
   389
	key=CreateKeyL(EKeyDesc);
sl@0
   390
	test (TheDatabase.CreateIndex(KIndexName2,KTableName,*key)==KErrNone);
sl@0
   391
	Compare(KIndexName2,KTableName,*key);
sl@0
   392
	delete key;
sl@0
   393
	key=CreateKeyL(EKeySingle);
sl@0
   394
	test (TheDatabase.CreateIndex(KIndexName,KTableName2,*key)==KErrNone);
sl@0
   395
	Compare(KIndexName,KTableName2,*key);
sl@0
   396
	delete key;
sl@0
   397
	key=CreateKeyL(EKeyMulti);
sl@0
   398
	test (TheDatabase.CreateIndex(KIndexName3,KTableName,*key)==KErrNone);
sl@0
   399
	Compare(KIndexName3,KTableName,*key);
sl@0
   400
	CountIndexes(KTableName,3);
sl@0
   401
	CountIndexes(KTableName2,1);
sl@0
   402
	CloseDatabase();
sl@0
   403
	OpenDatabase();
sl@0
   404
	CountIndexes(KTableName,3);
sl@0
   405
	CountIndexes(KTableName2,1);
sl@0
   406
	Compare(KIndexName3,KTableName,*key);
sl@0
   407
	delete key;
sl@0
   408
	test.Next(_L("Drop indexes"));
sl@0
   409
	test (TheDatabase.DropIndex(KIndexName,KTableName)==KErrNone);
sl@0
   410
	CountIndexes(KTableName,2);
sl@0
   411
	test (TheDatabase.DropIndex(KIndexName2,KTableName)==KErrNone);
sl@0
   412
	CountIndexes(KTableName,1);
sl@0
   413
	test (TheDatabase.DropIndex(KIndexName,KTableName2)==KErrNone);
sl@0
   414
	CountIndexes(KTableName2,0);
sl@0
   415
	test.Next(_L("Drop table"));
sl@0
   416
	test(TheDatabase.DropTable(KTableName)==KErrNone);
sl@0
   417
	CountTables(1);
sl@0
   418
	test(TheDatabase.DropTable(KTableName2)==KErrNone);
sl@0
   419
	CountTables(0);
sl@0
   420
	CloseDatabase();
sl@0
   421
	OpenDatabase();
sl@0
   422
	CountTables(0);
sl@0
   423
	DestroyDatabase();
sl@0
   424
	test.End();
sl@0
   425
	}
sl@0
   426
sl@0
   427
sl@0
   428
LOCAL_C void AddRow()
sl@0
   429
	{
sl@0
   430
	test(TheView.Prepare(TheDatabase,_L("select * from testviewtable"))==KErrNone);
sl@0
   431
	test(TheView.EvaluateAll()==KErrNone);
sl@0
   432
	TheView.InsertL();
sl@0
   433
	TheView.SetColL(1,(TInt32)12345);
sl@0
   434
	TheView.PutL();
sl@0
   435
	TheView.InsertL();
sl@0
   436
	TheView.Cancel();
sl@0
   437
	TheView.FirstL();
sl@0
   438
	TheView.NextL();
sl@0
   439
	test(TheView.AtEnd());		// should be only 1 row as second insert was cancelled
sl@0
   440
	TheView.Close();
sl@0
   441
	}
sl@0
   442
sl@0
   443
/**
sl@0
   444
@SYMTestCaseID          SYSLIB-DBMS-CT-1318
sl@0
   445
@SYMTestCaseDesc        Tests for RDbView class
sl@0
   446
@SYMTestPriority        Medium
sl@0
   447
@SYMTestActions         Tests for navigation of the cursor in the generated row sets.
sl@0
   448
@SYMTestExpectedResults Test must not fail
sl@0
   449
@SYMREQ                 REQ0000
sl@0
   450
*/
sl@0
   451
LOCAL_C void TestEmptyNavigation(const TDesC& aQuery)
sl@0
   452
	{
sl@0
   453
	test.Next(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-1318 Test navigation states "));
sl@0
   454
	test(TheView.Prepare(TheDatabase,aQuery,TheView.EReadOnly)==KErrNone);
sl@0
   455
	test(TheView.EvaluateAll()==KErrNone);
sl@0
   456
	TheView.FirstL();
sl@0
   457
	test(!TheView.AtBeginning());
sl@0
   458
	test(!TheView.AtRow());
sl@0
   459
	test(TheView.AtEnd());
sl@0
   460
	TheView.PreviousL();
sl@0
   461
	test(TheView.AtBeginning());
sl@0
   462
	test(!TheView.AtRow());
sl@0
   463
	test(!TheView.AtEnd());
sl@0
   464
	TheView.NextL();
sl@0
   465
	test(!TheView.AtBeginning());
sl@0
   466
	test(!TheView.AtRow());
sl@0
   467
	test(TheView.AtEnd());
sl@0
   468
	TheView.LastL();
sl@0
   469
	test(TheView.AtBeginning());
sl@0
   470
	test(!TheView.AtRow());
sl@0
   471
	test(!TheView.AtEnd());
sl@0
   472
	TheView.NextL();
sl@0
   473
	test(TheView.AtEnd());
sl@0
   474
	TheView.Close();
sl@0
   475
	}
sl@0
   476
sl@0
   477
/**
sl@0
   478
@SYMTestCaseID          SYSLIB-DBMS-CT-1319
sl@0
   479
@SYMTestCaseDesc        Tests for RDbView class
sl@0
   480
@SYMTestPriority        Medium
sl@0
   481
@SYMTestActions         Tests for navigation of the cursor in the generated row sets.
sl@0
   482
@SYMTestExpectedResults Test must not fail
sl@0
   483
@SYMREQ                 REQ0000
sl@0
   484
*/
sl@0
   485
LOCAL_C void TestNavigation(const TDesC& aQuery)
sl@0
   486
	{
sl@0
   487
	test.Next(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-1319 Test navigation states "));
sl@0
   488
	test(TheView.Prepare(TheDatabase,aQuery,TheView.EReadOnly)==KErrNone);
sl@0
   489
	test(TheView.EvaluateAll()==KErrNone);
sl@0
   490
	TheView.FirstL();
sl@0
   491
	test(!TheView.AtBeginning());
sl@0
   492
	test(TheView.AtRow());
sl@0
   493
	test(!TheView.AtEnd());
sl@0
   494
	TheView.GetL();
sl@0
   495
	test(TheView.ColInt32(1)==12345);
sl@0
   496
	TheView.PreviousL();
sl@0
   497
	test(TheView.AtBeginning());
sl@0
   498
	test(!TheView.AtRow());
sl@0
   499
	test(!TheView.AtEnd());
sl@0
   500
	TheView.NextL();
sl@0
   501
	test(!TheView.AtBeginning());
sl@0
   502
	test(TheView.AtRow());
sl@0
   503
	test(!TheView.AtEnd());
sl@0
   504
	TheView.NextL();
sl@0
   505
	test(!TheView.AtBeginning());
sl@0
   506
	test(!TheView.AtRow());
sl@0
   507
	test(TheView.AtEnd());
sl@0
   508
	TheView.PreviousL();
sl@0
   509
	test(!TheView.AtBeginning());
sl@0
   510
	test(TheView.AtRow());
sl@0
   511
	test(!TheView.AtEnd());
sl@0
   512
	TheView.LastL();
sl@0
   513
	test(!TheView.AtBeginning());
sl@0
   514
	test(TheView.AtRow());
sl@0
   515
	test(!TheView.AtEnd());
sl@0
   516
	TheView.NextL();
sl@0
   517
	test(TheView.AtEnd());
sl@0
   518
	TheView.Close();
sl@0
   519
	}
sl@0
   520
sl@0
   521
/**
sl@0
   522
@SYMTestCaseID          SYSLIB-DBMS-CT-1320
sl@0
   523
@SYMTestCaseDesc        RDbView updation test
sl@0
   524
@SYMTestPriority        Medium
sl@0
   525
@SYMTestActions         Tests for updation of row sets 
sl@0
   526
@SYMTestExpectedResults Test must not fail
sl@0
   527
@SYMREQ                 REQ0000
sl@0
   528
*/
sl@0
   529
static void TestUpdate()
sl@0
   530
	{
sl@0
   531
	test.Next(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-1320 Update and delete the row "));
sl@0
   532
	test(TheView.Prepare(TheDatabase,_L("select * from TestViewTable"))==KErrNone);
sl@0
   533
	test(TheView.EvaluateAll()==KErrNone);
sl@0
   534
	TheView.FirstL();
sl@0
   535
	TheView.UpdateL();
sl@0
   536
	TheView.SetColL(1,(TInt32)54321);
sl@0
   537
	TheView.PutL();
sl@0
   538
	TheView.FirstL();
sl@0
   539
	TheView.GetL();
sl@0
   540
	test(TheView.ColInt32(1)==54321);
sl@0
   541
	TheView.UpdateL();
sl@0
   542
	TheView.SetColL(1,(TInt32)12345);
sl@0
   543
	TheView.Cancel();
sl@0
   544
	TheView.FirstL();
sl@0
   545
	TheView.GetL();
sl@0
   546
	test(TheView.ColInt32(1)==54321);
sl@0
   547
	TheView.DeleteL();
sl@0
   548
	TheView.PreviousL();
sl@0
   549
	test(TheView.AtBeginning());
sl@0
   550
	TheView.NextL();
sl@0
   551
	test(TheView.AtEnd());
sl@0
   552
	TheView.Close();
sl@0
   553
	}
sl@0
   554
sl@0
   555
#include <s32mem.h>
sl@0
   556
sl@0
   557
void writeBLOB(TDbColNo aCol,const TDesC8& aDes)
sl@0
   558
	{
sl@0
   559
	CBufSeg* buf=CBufSeg::NewL(128);
sl@0
   560
	CleanupStack::PushL(buf);
sl@0
   561
	buf->InsertL(0,aDes);
sl@0
   562
	RBufReadStream read(*buf);
sl@0
   563
	RDbColWriteStream blob;
sl@0
   564
	blob.OpenLC(TheView,aCol);
sl@0
   565
//	blob.WriteL(aDes);
sl@0
   566
	blob.WriteL(read,aDes.Length());
sl@0
   567
	blob.CommitL();
sl@0
   568
	CleanupStack::PopAndDestroy();
sl@0
   569
	CleanupStack::PopAndDestroy();	// buf
sl@0
   570
	test (TheView.ColLength(aCol)==aDes.Length());
sl@0
   571
	test (TheView.ColSize(aCol)==aDes.Size());
sl@0
   572
	}
sl@0
   573
sl@0
   574
void checkBLOB(TDbColNo aCol,const TDesC8& aDes)
sl@0
   575
	{
sl@0
   576
	RDbColReadStream blob;
sl@0
   577
	blob.OpenLC(TheView,aCol);
sl@0
   578
	blob.ReadL(TheBuf8,TheView.ColLength(aCol));
sl@0
   579
	CleanupStack::PopAndDestroy();
sl@0
   580
	test(TheBuf8==aDes);
sl@0
   581
	}
sl@0
   582
sl@0
   583
/**
sl@0
   584
@SYMTestCaseID          SYSLIB-DBMS-CT-1321
sl@0
   585
@SYMTestCaseDesc        BLOB tests
sl@0
   586
@SYMTestPriority        Medium
sl@0
   587
@SYMTestActions         Test long column tracking through insert/put/update/cancel
sl@0
   588
@SYMTestExpectedResults Test must not fail
sl@0
   589
@SYMREQ                 REQ0000
sl@0
   590
*/
sl@0
   591
void TestBLOB()
sl@0
   592
	{
sl@0
   593
	test.Next(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-1321 Long column tracking "));
sl@0
   594
	test(TheView.Prepare(TheDatabase,_L("select * from TestViewTable"))==KErrNone);
sl@0
   595
	test(TheView.EvaluateAll()==KErrNone);
sl@0
   596
	TheView.InsertL();
sl@0
   597
	writeBLOB(2,KTestShortText8);
sl@0
   598
	writeBLOB(3,KTestShortText8);
sl@0
   599
	TheView.PutL();
sl@0
   600
	TheView.InsertL();
sl@0
   601
	writeBLOB(4,KTestShortText8);
sl@0
   602
	writeBLOB(5,KTestShortText8);
sl@0
   603
	TheView.Cancel();
sl@0
   604
// change in behaviour--writing BLOBs forces a true rollback here. So reset
sl@0
   605
	TheView.Reset();
sl@0
   606
	test(TheView.EvaluateAll()==KErrNone);
sl@0
   607
// check the one row we should have
sl@0
   608
	TheView.FirstL();
sl@0
   609
	TheView.GetL();
sl@0
   610
	checkBLOB(2,KTestShortText8);
sl@0
   611
	checkBLOB(3,KTestShortText8);
sl@0
   612
	test(TheView.IsColNull(4));
sl@0
   613
	test(TheView.IsColNull(5));
sl@0
   614
	test(TheView.IsColNull(6));
sl@0
   615
	TheView.NextL();
sl@0
   616
	test(TheView.AtEnd());
sl@0
   617
// update/cancel the row
sl@0
   618
	TheView.FirstL();
sl@0
   619
	TheView.UpdateL();
sl@0
   620
	TheView.SetColNullL(3);
sl@0
   621
	writeBLOB(4,KTestLongText8);
sl@0
   622
	writeBLOB(5,KTestLongText8);
sl@0
   623
// check pre-cancel
sl@0
   624
	checkBLOB(2,KTestShortText8);
sl@0
   625
	test(TheView.IsColNull(3));
sl@0
   626
	checkBLOB(4,KTestLongText8);
sl@0
   627
	checkBLOB(5,KTestLongText8);
sl@0
   628
	test(TheView.IsColNull(6));
sl@0
   629
// cancel and check
sl@0
   630
	TheView.Cancel();
sl@0
   631
// change in behaviour--writing BLOBs forces a true rollback here. So reset
sl@0
   632
	TheView.Reset();
sl@0
   633
	test(TheView.EvaluateAll()==KErrNone);
sl@0
   634
	TheView.FirstL();
sl@0
   635
	TheView.GetL();
sl@0
   636
	checkBLOB(2,KTestShortText8);
sl@0
   637
	checkBLOB(3,KTestShortText8);
sl@0
   638
	test(TheView.IsColNull(4));
sl@0
   639
	test(TheView.IsColNull(5));
sl@0
   640
	test(TheView.IsColNull(6));
sl@0
   641
	TheView.NextL();
sl@0
   642
	test(TheView.AtEnd());
sl@0
   643
// update/put the row
sl@0
   644
	TheView.FirstL();
sl@0
   645
	TheView.UpdateL();
sl@0
   646
	TheView.SetColNullL(3);
sl@0
   647
	writeBLOB(4,KTestLongText8);
sl@0
   648
	writeBLOB(5,KTestLongText8);
sl@0
   649
// check pre-put
sl@0
   650
	checkBLOB(2,KTestShortText8);
sl@0
   651
	test(TheView.IsColNull(3));
sl@0
   652
	checkBLOB(4,KTestLongText8);
sl@0
   653
	checkBLOB(5,KTestLongText8);
sl@0
   654
	test(TheView.IsColNull(6));
sl@0
   655
// put and check
sl@0
   656
	TheView.PutL();
sl@0
   657
	TheView.FirstL();
sl@0
   658
	TheView.GetL();
sl@0
   659
	checkBLOB(2,KTestShortText8);
sl@0
   660
	test(TheView.IsColNull(3));
sl@0
   661
	checkBLOB(4,KTestLongText8);
sl@0
   662
	checkBLOB(5,KTestLongText8);
sl@0
   663
	test(TheView.IsColNull(6));
sl@0
   664
	TheView.NextL();
sl@0
   665
	test(TheView.AtEnd());
sl@0
   666
// update/put the row again
sl@0
   667
	TheView.FirstL();
sl@0
   668
	TheView.UpdateL();
sl@0
   669
	TheView.SetColNullL(2);
sl@0
   670
	writeBLOB(3,KTestShortText8);
sl@0
   671
	writeBLOB(4,KTestShortText8);
sl@0
   672
	writeBLOB(5,KTestShortText8);
sl@0
   673
// check
sl@0
   674
	test(TheView.IsColNull(2));
sl@0
   675
	checkBLOB(3,KTestShortText8);
sl@0
   676
	checkBLOB(4,KTestShortText8);
sl@0
   677
	checkBLOB(5,KTestShortText8);
sl@0
   678
	test(TheView.IsColNull(6));
sl@0
   679
// modify again
sl@0
   680
	writeBLOB(2,KTestLongText8);
sl@0
   681
	TheView.SetColNullL(3);
sl@0
   682
	TheView.SetColNullL(4);
sl@0
   683
	writeBLOB(5,KTestLongText8);
sl@0
   684
// check pre-put
sl@0
   685
	checkBLOB(2,KTestLongText8);
sl@0
   686
	test(TheView.IsColNull(3));
sl@0
   687
	test(TheView.IsColNull(4));
sl@0
   688
	checkBLOB(5,KTestLongText8);
sl@0
   689
	test(TheView.IsColNull(6));
sl@0
   690
// put and check
sl@0
   691
	TheView.PutL();
sl@0
   692
	TheView.FirstL();
sl@0
   693
	TheView.GetL();
sl@0
   694
	checkBLOB(2,KTestLongText8);
sl@0
   695
	test(TheView.IsColNull(3));
sl@0
   696
	test(TheView.IsColNull(4));
sl@0
   697
	checkBLOB(5,KTestLongText8);
sl@0
   698
	test(TheView.IsColNull(6));
sl@0
   699
	TheView.NextL();
sl@0
   700
	test(TheView.AtEnd());
sl@0
   701
// insert copy
sl@0
   702
	TheView.LastL();
sl@0
   703
	TheView.InsertCopyL();
sl@0
   704
	TheView.SetColNullL(2);
sl@0
   705
	writeBLOB(3,KTestLongText8);
sl@0
   706
// check pre-put
sl@0
   707
	test(TheView.IsColNull(2));
sl@0
   708
	checkBLOB(3,KTestLongText8);
sl@0
   709
	test(TheView.IsColNull(4));
sl@0
   710
	checkBLOB(5,KTestLongText8);
sl@0
   711
	test(TheView.IsColNull(6));
sl@0
   712
// put and check
sl@0
   713
	TheView.PutL();
sl@0
   714
	TheView.LastL();
sl@0
   715
	TheView.GetL();
sl@0
   716
	test(TheView.IsColNull(2));
sl@0
   717
	checkBLOB(3,KTestLongText8);
sl@0
   718
	test(TheView.IsColNull(4));
sl@0
   719
	checkBLOB(5,KTestLongText8);
sl@0
   720
	test(TheView.IsColNull(6));
sl@0
   721
// delete previous one and check
sl@0
   722
	TheView.PreviousL();
sl@0
   723
	TheView.DeleteL();
sl@0
   724
	TheView.NextL();
sl@0
   725
	TheView.GetL();
sl@0
   726
	test(TheView.IsColNull(2));
sl@0
   727
	checkBLOB(3,KTestLongText8);
sl@0
   728
	test(TheView.IsColNull(4));
sl@0
   729
	checkBLOB(5,KTestLongText8);
sl@0
   730
	test(TheView.IsColNull(6));
sl@0
   731
	TheView.NextL();
sl@0
   732
	test(TheView.AtEnd());
sl@0
   733
// delete
sl@0
   734
	TheView.FirstL();
sl@0
   735
	TheView.DeleteL();
sl@0
   736
// finish
sl@0
   737
	TheView.Close();
sl@0
   738
	}
sl@0
   739
sl@0
   740
/**
sl@0
   741
@SYMTestCaseID          SYSLIB-DBMS-CT-0596
sl@0
   742
@SYMTestCaseDesc        Tests for navigation states
sl@0
   743
@SYMTestPriority        Medium
sl@0
   744
@SYMTestActions         Tests for view state cycle, navigation, Insert/Update/Delete 
sl@0
   745
@SYMTestExpectedResults Test must not fail
sl@0
   746
@SYMREQ                 REQ0000
sl@0
   747
*/
sl@0
   748
void TestView()
sl@0
   749
	{
sl@0
   750
	test.Start(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0596 Create the Test table "));
sl@0
   751
	CreateDatabase();
sl@0
   752
	CDbColSet* cs=CreateColSetL(EViewTestTable);
sl@0
   753
	test(TheDatabase.CreateTable(KTestViewTable,*cs)==KErrNone);
sl@0
   754
	delete cs;
sl@0
   755
	test.Next(_L("Test navigation states"));
sl@0
   756
	TestEmptyNavigation(_L("select * from TestViewTable"));
sl@0
   757
	test.Next(_L("Insert and Put/Cancel"));
sl@0
   758
	AddRow();
sl@0
   759
	test.Next(_L("Test navigation states"));
sl@0
   760
	TestNavigation(_L("select * from TestViewTable"));
sl@0
   761
	TestNavigation(_L("select * from TestViewTable where Int is not null"));
sl@0
   762
	TestEmptyNavigation(_L("select * from TestViewTable where Int is null"));
sl@0
   763
	test.Next(_L("Update and delete the row"));
sl@0
   764
	TestUpdate();
sl@0
   765
	test.Next(_L("Long column tracking"));
sl@0
   766
	TestBLOB();
sl@0
   767
	test.Next(_L("Close"));
sl@0
   768
	CloseDatabase();
sl@0
   769
	test.End();
sl@0
   770
	}
sl@0
   771
sl@0
   772
//
sl@0
   773
// Check the integral set/get functions for different width types
sl@0
   774
//
sl@0
   775
LOCAL_C void CheckIntAccessors()
sl@0
   776
	{
sl@0
   777
	TheView.InsertL();
sl@0
   778
// bit column
sl@0
   779
	TDbColNo ord=TheMap[EBit];
sl@0
   780
	TheView.SetColL(ord,TUint32(1));
sl@0
   781
	test (TheView.ColUint(ord)==1);
sl@0
   782
	TheView.SetColL(ord,TInt32(0));
sl@0
   783
	test (TheView.ColUint(ord)==0);
sl@0
   784
	TheView.SetColL(ord,TInt64(1));
sl@0
   785
	test (TheView.ColUint(ord)==1);
sl@0
   786
	test (TheView.ColUint8(ord)==1);
sl@0
   787
	test (TheView.ColUint16(ord)==1);
sl@0
   788
	test (TheView.ColUint32(ord)==1);
sl@0
   789
	test (TheView.ColInt8(ord)==1);
sl@0
   790
	test (TheView.ColInt16(ord)==1);
sl@0
   791
	test (TheView.ColInt32(ord)==1);
sl@0
   792
	test (TheView.ColInt64(ord)==1);
sl@0
   793
// uint8 column
sl@0
   794
	ord=TheMap[EUint8];
sl@0
   795
	TheView.SetColL(ord,TUint32(255));
sl@0
   796
	test (TheView.ColUint(ord)==255);
sl@0
   797
	TheView.SetColL(ord,TInt32(0));
sl@0
   798
	test (TheView.ColUint(ord)==0);
sl@0
   799
	TheView.SetColL(ord,TInt64(1));
sl@0
   800
	test (TheView.ColUint(ord)==1);
sl@0
   801
	test (TheView.ColUint8(ord)==1);
sl@0
   802
	test (TheView.ColUint16(ord)==1);
sl@0
   803
	test (TheView.ColUint32(ord)==1);
sl@0
   804
	test (TheView.ColInt16(ord)==1);
sl@0
   805
	test (TheView.ColInt32(ord)==1);
sl@0
   806
	test (TheView.ColInt64(ord)==1);
sl@0
   807
// uint16 column
sl@0
   808
	ord=TheMap[EUint16];
sl@0
   809
	TheView.SetColL(ord,TUint32(65535));
sl@0
   810
	test (TheView.ColUint(ord)==65535);
sl@0
   811
	TheView.SetColL(ord,TInt32(0));
sl@0
   812
	test (TheView.ColUint(ord)==0);
sl@0
   813
	TheView.SetColL(ord,TInt64(1));
sl@0
   814
	test (TheView.ColUint(ord)==1);
sl@0
   815
	test (TheView.ColUint16(ord)==1);
sl@0
   816
	test (TheView.ColUint32(ord)==1);
sl@0
   817
	test (TheView.ColInt32(ord)==1);
sl@0
   818
	test (TheView.ColInt64(ord)==1);
sl@0
   819
// uint32 column
sl@0
   820
	ord=TheMap[EUint32];
sl@0
   821
	TheView.SetColL(ord,TUint32(0));
sl@0
   822
	test (TheView.ColUint(ord)==0);
sl@0
   823
	TheView.SetColL(ord,TInt32(KMaxTInt));
sl@0
   824
	test (TInt(TheView.ColUint(ord))==KMaxTInt);
sl@0
   825
	TheView.SetColL(ord,TInt64(KMaxTUint));
sl@0
   826
	test (TheView.ColUint(ord)==KMaxTUint);
sl@0
   827
	test (TheView.ColUint32(ord)==KMaxTUint);
sl@0
   828
	test (TheView.ColInt64(ord)==KMaxTUint);
sl@0
   829
// int8 column
sl@0
   830
	ord=TheMap[EInt8];
sl@0
   831
	TheView.SetColL(ord,TUint32(127));
sl@0
   832
	test (TheView.ColInt(ord)==127);
sl@0
   833
	TheView.SetColL(ord,TInt32(0));
sl@0
   834
	test (TheView.ColInt(ord)==0);
sl@0
   835
	TheView.SetColL(ord,TInt64(-128));
sl@0
   836
	test (TheView.ColInt(ord)==-128);
sl@0
   837
	test (TheView.ColInt8(ord)==-128);
sl@0
   838
	test (TheView.ColInt16(ord)==-128);
sl@0
   839
	test (TheView.ColInt32(ord)==-128);
sl@0
   840
	test (TheView.ColInt64(ord)==-128);
sl@0
   841
// int16 column
sl@0
   842
	ord=TheMap[EInt16];
sl@0
   843
	TheView.SetColL(ord,TUint32(32767));
sl@0
   844
	test (TheView.ColInt(ord)==32767);
sl@0
   845
	TheView.SetColL(ord,TInt32(0));
sl@0
   846
	test (TheView.ColInt(ord)==0);
sl@0
   847
	TheView.SetColL(ord,TInt64(-32768));
sl@0
   848
	test (TheView.ColInt(ord)==-32768);
sl@0
   849
	test (TheView.ColInt16(ord)==-32768);
sl@0
   850
	test (TheView.ColInt32(ord)==-32768);
sl@0
   851
	test (TheView.ColInt64(ord)==-32768);
sl@0
   852
// int32 column
sl@0
   853
	ord=TheMap[EInt32];
sl@0
   854
	TheView.SetColL(ord,TUint32(KMaxTInt));
sl@0
   855
	test (TheView.ColInt(ord)==KMaxTInt);
sl@0
   856
	TheView.SetColL(ord,TInt32(0));
sl@0
   857
	test (TheView.ColInt(ord)==0);
sl@0
   858
	TheView.SetColL(ord,TInt64(KMinTInt));
sl@0
   859
	test (TheView.ColInt(ord)==KMinTInt);
sl@0
   860
	test (TheView.ColInt32(ord)==KMinTInt);
sl@0
   861
	test (TheView.ColInt64(ord)==KMinTInt);
sl@0
   862
//
sl@0
   863
	TheView.Cancel();
sl@0
   864
	}
sl@0
   865
sl@0
   866
//
sl@0
   867
// Write the values to nullable column types
sl@0
   868
//
sl@0
   869
LOCAL_C void WriteMinValues(TInt anOffset)
sl@0
   870
	{
sl@0
   871
	TheView.SetColL(TheMap[anOffset+EBit],TUint(0));
sl@0
   872
	TheView.SetColL(TheMap[anOffset+EInt8],KMinTInt8);
sl@0
   873
	TheView.SetColL(TheMap[anOffset+EUint8],TUint(0));
sl@0
   874
	TheView.SetColL(TheMap[anOffset+EInt16],KMinTInt16);
sl@0
   875
	TheView.SetColL(TheMap[anOffset+EUint16],TUint(0));
sl@0
   876
	TheView.SetColL(TheMap[anOffset+EInt32],KMinTInt32);
sl@0
   877
	TheView.SetColL(TheMap[anOffset+EUint32],TUint(0));
sl@0
   878
	TheView.SetColL(TheMap[anOffset+EInt64],KMinTInt64);
sl@0
   879
	TheView.SetColL(TheMap[anOffset+EReal32],KMinTReal32);
sl@0
   880
	TheView.SetColL(TheMap[anOffset+EReal64],KMinTReal64);
sl@0
   881
	TheView.SetColL(TheMap[anOffset+ETime],KMinTTime);
sl@0
   882
	TheView.SetColL(TheMap[anOffset+EText8],KTestShortText8);
sl@0
   883
	TheView.SetColL(TheMap[anOffset+EText16],KTestShortText16);
sl@0
   884
	{
sl@0
   885
	TUint8 val=0;
sl@0
   886
	TheView.SetColL(TheMap[anOffset+ETBinary],TPtrC8(&val,sizeof(val)));
sl@0
   887
	}
sl@0
   888
	TheView.SetColL(TheMap[anOffset+ELongText8],KTestShortText8);
sl@0
   889
	TheView.SetColL(TheMap[anOffset+ELongText16],KTestShortText16);
sl@0
   890
	RDbColWriteStream out;
sl@0
   891
	out.OpenLC(TheView,TheMap[anOffset+ELongBinary]);
sl@0
   892
	out.WriteUint8L(0);
sl@0
   893
	out.CommitL();
sl@0
   894
	CleanupStack::PopAndDestroy();
sl@0
   895
	}
sl@0
   896
sl@0
   897
//
sl@0
   898
// Write a row with the minimum (or small) column values
sl@0
   899
// return the value in the counter column
sl@0
   900
//
sl@0
   901
LOCAL_C TInt WriteMinimum()
sl@0
   902
	{
sl@0
   903
	TheView.InsertL();
sl@0
   904
	WriteMinValues(0);
sl@0
   905
	WriteMinValues(EBitNull-EBit);
sl@0
   906
	test(!TheView.IsColNull(TheMap[ECounter]));
sl@0
   907
	TInt cc=TheView.ColInt(TheMap[ECounter]);
sl@0
   908
	TheView.PutL();
sl@0
   909
	return cc;
sl@0
   910
	}
sl@0
   911
sl@0
   912
LOCAL_C void CheckMinValues(TInt anOffset)
sl@0
   913
	{
sl@0
   914
	test(TheView.ColUint8(TheMap[anOffset+EBit])==0);
sl@0
   915
	test(TheView.ColUint16(TheMap[anOffset+EBit])==0);
sl@0
   916
	test(TheView.ColUint32(TheMap[anOffset+EBit])==0);
sl@0
   917
	test(TheView.ColUint(TheMap[anOffset+EBit])==0);
sl@0
   918
	test(TheView.ColInt8(TheMap[anOffset+EInt8])==KMinTInt8);
sl@0
   919
	test(TheView.ColInt16(TheMap[anOffset+EInt8])==KMinTInt8);
sl@0
   920
	test(TheView.ColInt32(TheMap[anOffset+EInt8])==KMinTInt8);
sl@0
   921
	test(TheView.ColInt(TheMap[anOffset+EInt8])==KMinTInt8);
sl@0
   922
	test(TheView.ColUint8(TheMap[anOffset+EUint8])==0);
sl@0
   923
	test(TheView.ColUint16(TheMap[anOffset+EUint8])==0);
sl@0
   924
	test(TheView.ColUint32(TheMap[anOffset+EUint8])==0);
sl@0
   925
	test(TheView.ColUint(TheMap[anOffset+EUint8])==0);
sl@0
   926
	test(TheView.ColInt16(TheMap[anOffset+EInt16])==KMinTInt16);
sl@0
   927
	test(TheView.ColInt32(TheMap[anOffset+EInt16])==KMinTInt16);
sl@0
   928
	test(TheView.ColInt(TheMap[anOffset+EInt16])==KMinTInt16);
sl@0
   929
	test(TheView.ColUint16(TheMap[anOffset+EUint16])==0);
sl@0
   930
	test(TheView.ColUint32(TheMap[anOffset+EUint16])==0);
sl@0
   931
	test(TheView.ColUint(TheMap[anOffset+EUint16])==0);
sl@0
   932
	test(TheView.ColInt32(TheMap[anOffset+EInt32])==KMinTInt32);
sl@0
   933
	test(TheView.ColInt(TheMap[anOffset+EInt32])==KMinTInt32);
sl@0
   934
	test(TheView.ColUint32(TheMap[anOffset+EUint32])==0);
sl@0
   935
	test(TheView.ColUint(TheMap[anOffset+EUint32])==0);
sl@0
   936
	test(TheView.ColInt64(TheMap[anOffset+EInt64])==KMinTInt64);
sl@0
   937
	test(TheView.ColReal32(TheMap[anOffset+EReal32])==KMinTReal32);
sl@0
   938
	test(TheView.ColReal64(TheMap[anOffset+EReal64])==KMinTReal64);
sl@0
   939
	test(TheView.ColReal(TheMap[anOffset+EReal64])==KMinTReal64);
sl@0
   940
	test(TheView.ColTime(TheMap[anOffset+ETime])==KMinTTime);
sl@0
   941
	test(TheView.ColDes8(TheMap[anOffset+EText8])==KTestShortText8);
sl@0
   942
	test(TheView.ColSize(TheMap[anOffset+EText8])==KTestShortText8.Size());
sl@0
   943
	test(TheView.ColLength(TheMap[anOffset+EText8])==KTestShortText8.Length());
sl@0
   944
	test(TheView.ColDes16(TheMap[anOffset+EText16])==KTestShortText16);
sl@0
   945
	test(TheView.ColSize(TheMap[anOffset+EText16])==KTestShortText16.Size());
sl@0
   946
	test(TheView.ColLength(TheMap[anOffset+EText16])==KTestShortText16.Length());
sl@0
   947
	{
sl@0
   948
	TUint8 val=0;
sl@0
   949
	test(TheView.ColDes8(TheMap[anOffset+ETBinary])==TPtrC8(&val,sizeof(val)));
sl@0
   950
	}
sl@0
   951
	test(TheView.ColSize(TheMap[anOffset+ETBinary])==1);
sl@0
   952
	test(TheView.ColLength(TheMap[anOffset+ETBinary])==1);
sl@0
   953
//
sl@0
   954
	test(TheView.ColSize(TheMap[anOffset+ELongText8])==KTestShortText8.Size());
sl@0
   955
	test(TheView.ColLength(TheMap[anOffset+ELongText8])==KTestShortText8.Length());
sl@0
   956
	RDbColReadStream in;
sl@0
   957
	in.OpenLC(TheView,TheMap[anOffset+ELongText8]);
sl@0
   958
	in.ReadL(TheBuf8,TheView.ColLength(TheMap[anOffset+ELongText8]));
sl@0
   959
	CleanupStack::PopAndDestroy();
sl@0
   960
	test(TheBuf8==KTestShortText8);
sl@0
   961
//
sl@0
   962
	test(TheView.ColSize(TheMap[anOffset+ELongText16])==KTestShortText16.Size());
sl@0
   963
	test(TheView.ColLength(TheMap[anOffset+ELongText16])==KTestShortText16.Length());
sl@0
   964
	in.OpenLC(TheView,TheMap[anOffset+ELongText16]);
sl@0
   965
	in.ReadL(TheBuf16,TheView.ColLength(TheMap[anOffset+ELongText16]));
sl@0
   966
	CleanupStack::PopAndDestroy();
sl@0
   967
	test(TheBuf16==KTestShortText16);
sl@0
   968
//
sl@0
   969
	test(TheView.ColSize(TheMap[anOffset+ELongBinary])==1);
sl@0
   970
	test(TheView.ColLength(TheMap[anOffset+ELongBinary])==1);
sl@0
   971
	in.OpenLC(TheView,TheMap[anOffset+ELongBinary]);
sl@0
   972
	test(in.ReadUint8L()==0);
sl@0
   973
	CleanupStack::PopAndDestroy();
sl@0
   974
	}
sl@0
   975
sl@0
   976
//
sl@0
   977
// Check the row is the same as was written
sl@0
   978
//
sl@0
   979
LOCAL_C void CheckMinimum(TInt aCounter)
sl@0
   980
	{
sl@0
   981
	TheView.GetL();
sl@0
   982
	test(TheView.ColInt32(TheMap[ECounter])==aCounter);
sl@0
   983
	CheckMinValues(0);
sl@0
   984
	CheckMinValues(EBitNull-EBit);
sl@0
   985
	}
sl@0
   986
sl@0
   987
LOCAL_C void WriteMaxValues(TInt anOffset)
sl@0
   988
	{
sl@0
   989
	TheView.SetColL(TheMap[anOffset+EBit],TUint(1));
sl@0
   990
	TheView.SetColL(TheMap[anOffset+EInt8],KMaxTInt8);
sl@0
   991
	TheView.SetColL(TheMap[anOffset+EUint8],TUint(KMaxTUint8));
sl@0
   992
	TheView.SetColL(TheMap[anOffset+EInt16],KMaxTInt16);
sl@0
   993
	TheView.SetColL(TheMap[anOffset+EUint16],TUint(KMaxTUint16));
sl@0
   994
	TheView.SetColL(TheMap[anOffset+EInt32],KMaxTInt32);
sl@0
   995
	TheView.SetColL(TheMap[anOffset+EUint32],KMaxTUint32);
sl@0
   996
	TheView.SetColL(TheMap[anOffset+EInt64],KMaxTInt64);
sl@0
   997
	TheView.SetColL(TheMap[anOffset+EReal32],KMaxTReal32);
sl@0
   998
	TheView.SetColL(TheMap[anOffset+EReal64],KMaxTReal64);
sl@0
   999
	TheView.SetColL(TheMap[anOffset+ETime],KMaxTTime);
sl@0
  1000
	TheView.SetColL(TheMap[anOffset+EText8],KTestText8);
sl@0
  1001
	TheView.SetColL(TheMap[anOffset+EText16],KTestText16);
sl@0
  1002
	TheView.SetColL(TheMap[anOffset+ETBinary],TPtrC8((TUint8*)&TheMap[0],sizeof(TheMap)));
sl@0
  1003
	TheView.SetColL(TheMap[anOffset+ELongText8],KTestLongText8);
sl@0
  1004
	TheView.SetColL(TheMap[anOffset+ELongText16],KTestLongText16);
sl@0
  1005
	RDbColWriteStream out;
sl@0
  1006
	out.OpenLC(TheView,TheMap[anOffset+ELongBinary]);
sl@0
  1007
	for (TInt ii=0;ii<KBlobItems;++ii)
sl@0
  1008
		out.WriteInt32L(ii);
sl@0
  1009
	out.CommitL();
sl@0
  1010
	CleanupStack::PopAndDestroy();
sl@0
  1011
	}
sl@0
  1012
sl@0
  1013
//
sl@0
  1014
// Write a row with the maximum (or longer) column values
sl@0
  1015
// return the value in the counter column
sl@0
  1016
//
sl@0
  1017
LOCAL_C TInt WriteMaximum()
sl@0
  1018
	{
sl@0
  1019
	TheView.InsertL();
sl@0
  1020
	WriteMaxValues(0);
sl@0
  1021
	WriteMaxValues(EBitNull-EBit);
sl@0
  1022
	test(!TheView.IsColNull(TheMap[ECounter]));
sl@0
  1023
	TInt cc=TheView.ColInt(TheMap[ECounter]);
sl@0
  1024
	TheView.PutL();
sl@0
  1025
	return cc;
sl@0
  1026
	}
sl@0
  1027
sl@0
  1028
LOCAL_C void CheckMaxValues(TInt anOffset)
sl@0
  1029
	{
sl@0
  1030
	test(TheView.ColUint8(TheMap[anOffset+EBit])==1);
sl@0
  1031
	test(TheView.ColUint16(TheMap[anOffset+EBit])==1);
sl@0
  1032
	test(TheView.ColUint32(TheMap[anOffset+EBit])==1);
sl@0
  1033
	test(TheView.ColUint(TheMap[anOffset+EBit])==1);
sl@0
  1034
	test(TheView.ColInt8(TheMap[anOffset+EInt8])==KMaxTInt8);
sl@0
  1035
	test(TheView.ColInt16(TheMap[anOffset+EInt8])==KMaxTInt8);
sl@0
  1036
	test(TheView.ColInt32(TheMap[anOffset+EInt8])==KMaxTInt8);
sl@0
  1037
	test(TheView.ColInt(TheMap[anOffset+EInt8])==KMaxTInt8);
sl@0
  1038
	test(TheView.ColUint8(TheMap[anOffset+EUint8])==KMaxTUint8);
sl@0
  1039
	test(TheView.ColUint16(TheMap[anOffset+EUint8])==KMaxTUint8);
sl@0
  1040
	test(TheView.ColUint32(TheMap[anOffset+EUint8])==KMaxTUint8);
sl@0
  1041
	test(TheView.ColUint(TheMap[anOffset+EUint8])==KMaxTUint8);
sl@0
  1042
	test(TheView.ColInt16(TheMap[anOffset+EInt16])==KMaxTInt16);
sl@0
  1043
	test(TheView.ColInt32(TheMap[anOffset+EInt16])==KMaxTInt16);
sl@0
  1044
	test(TheView.ColInt(TheMap[anOffset+EInt16])==KMaxTInt16);
sl@0
  1045
	test(TheView.ColUint16(TheMap[anOffset+EUint16])==KMaxTUint16);
sl@0
  1046
	test(TheView.ColUint32(TheMap[anOffset+EUint16])==KMaxTUint16);
sl@0
  1047
	test(TheView.ColUint(TheMap[anOffset+EUint16])==KMaxTUint16);
sl@0
  1048
	test(TheView.ColInt32(TheMap[anOffset+EInt32])==KMaxTInt32);
sl@0
  1049
	test(TheView.ColInt(TheMap[anOffset+EInt32])==KMaxTInt32);
sl@0
  1050
	test(TheView.ColUint32(TheMap[anOffset+EUint32])==KMaxTUint32);
sl@0
  1051
	test(TheView.ColUint(TheMap[anOffset+EUint32])==KMaxTUint32);
sl@0
  1052
	test(TheView.ColInt64(TheMap[anOffset+EInt64])==KMaxTInt64);
sl@0
  1053
	test(TheView.ColReal32(TheMap[anOffset+EReal32])==KMaxTReal32);
sl@0
  1054
	test(TheView.ColReal64(TheMap[anOffset+EReal64])==KMaxTReal64);
sl@0
  1055
	test(TheView.ColReal(TheMap[anOffset+EReal64])==KMaxTReal64);
sl@0
  1056
	test(TheView.ColTime(TheMap[anOffset+ETime])==KMaxTTime);
sl@0
  1057
	test(TheView.ColDes8(TheMap[anOffset+EText8])==KTestText8);
sl@0
  1058
	test(TheView.ColSize(TheMap[anOffset+EText8])==KTestText8.Size());
sl@0
  1059
	test(TheView.ColLength(TheMap[anOffset+EText8])==KTestText8.Length());
sl@0
  1060
	test(TheView.ColDes16(TheMap[anOffset+EText16])==KTestText16);
sl@0
  1061
	test(TheView.ColSize(TheMap[anOffset+EText16])==KTestText16.Size());
sl@0
  1062
	test(TheView.ColLength(TheMap[anOffset+EText16])==KTestText16.Length());
sl@0
  1063
	test(TheView.ColDes8(TheMap[anOffset+ETBinary])==TPtrC8((TUint8*)&TheMap[0],sizeof(TheMap)));
sl@0
  1064
	test(TheView.ColSize(TheMap[anOffset+ETBinary])==sizeof(TheMap));
sl@0
  1065
	test(TheView.ColLength(TheMap[anOffset+ETBinary])==sizeof(TheMap));
sl@0
  1066
//
sl@0
  1067
	test(TheView.ColSize(TheMap[anOffset+ELongText8])==KTestLongText8.Size());
sl@0
  1068
	test(TheView.ColLength(TheMap[anOffset+ELongText8])==KTestLongText8.Length());
sl@0
  1069
	RDbColReadStream in;
sl@0
  1070
	in.OpenLC(TheView,TheMap[anOffset+ELongText8]);
sl@0
  1071
	in.ReadL(TheBuf8,TheView.ColLength(TheMap[anOffset+ELongText8]));
sl@0
  1072
	CleanupStack::PopAndDestroy();
sl@0
  1073
	test(TheBuf8==KTestLongText8);
sl@0
  1074
//
sl@0
  1075
	test(TheView.ColSize(TheMap[anOffset+ELongText16])==KTestLongText16.Size());
sl@0
  1076
	test(TheView.ColLength(TheMap[anOffset+ELongText16])==KTestLongText16.Length());
sl@0
  1077
	in.OpenLC(TheView,TheMap[anOffset+ELongText16]);
sl@0
  1078
	in.ReadL(TheBuf16,TheView.ColLength(TheMap[anOffset+ELongText16]));
sl@0
  1079
	CleanupStack::PopAndDestroy();
sl@0
  1080
	test(TheBuf16==KTestLongText16);
sl@0
  1081
//
sl@0
  1082
	test(TheView.ColSize(TheMap[anOffset+ELongBinary])==KBlobItems*sizeof(TUint32));
sl@0
  1083
	test(TheView.ColLength(TheMap[anOffset+ELongBinary])==KBlobItems*sizeof(TUint32));
sl@0
  1084
	in.OpenLC(TheView,TheMap[anOffset+ELongBinary]);
sl@0
  1085
	for (TInt ii=0;ii<KBlobItems;++ii)
sl@0
  1086
		test(in.ReadInt32L()==ii);
sl@0
  1087
	CleanupStack::PopAndDestroy();
sl@0
  1088
	}
sl@0
  1089
sl@0
  1090
//
sl@0
  1091
// Check the row is the same as was written
sl@0
  1092
//
sl@0
  1093
LOCAL_C void CheckMaximum(TInt aCounter)
sl@0
  1094
	{
sl@0
  1095
	TheView.GetL();
sl@0
  1096
	test(TheView.ColInt32(TheMap[ECounter])==aCounter);
sl@0
  1097
	CheckMaxValues(0);
sl@0
  1098
	CheckMaxValues(EBitNull-EBit);
sl@0
  1099
	}
sl@0
  1100
sl@0
  1101
//
sl@0
  1102
// Write a row with null column values in the nullable columns
sl@0
  1103
// return the value in the counter column
sl@0
  1104
//
sl@0
  1105
LOCAL_C TInt WriteNull()
sl@0
  1106
	{
sl@0
  1107
	TheView.InsertL();
sl@0
  1108
	WriteMinValues(0);
sl@0
  1109
	test(!TheView.IsColNull(TheMap[ECounter]));
sl@0
  1110
	TInt cc=TheView.ColInt(TheMap[ECounter]);
sl@0
  1111
	TheView.PutL();
sl@0
  1112
	return cc;
sl@0
  1113
	}
sl@0
  1114
sl@0
  1115
//
sl@0
  1116
// Check the row is the same as was written
sl@0
  1117
//
sl@0
  1118
LOCAL_C void CheckNull(TInt aCounter)
sl@0
  1119
	{
sl@0
  1120
	TheView.GetL();
sl@0
  1121
	test(TheView.ColInt32(TheMap[ECounter])==aCounter);
sl@0
  1122
	TInt ii;
sl@0
  1123
	for (ii=ECounter;ii<EBitNull;ii++)
sl@0
  1124
		{	// not null columns
sl@0
  1125
		TDbColNo col=TheMap[ii];
sl@0
  1126
		test(!TheView.IsColNull(col));
sl@0
  1127
		test(TheView.ColSize(col)!=0);
sl@0
  1128
		test(TheView.ColLength(col)!=0);
sl@0
  1129
		if (ii<ELongText8)
sl@0
  1130
			test(TheView.ColDes8(col).Length()!=0);
sl@0
  1131
		}
sl@0
  1132
	CheckMinValues(0);
sl@0
  1133
	for (;ii<EForceNull-1;++ii)
sl@0
  1134
		{	// null columns
sl@0
  1135
		TDbColNo col=TheMap[ii];
sl@0
  1136
		test(TheView.IsColNull(col));
sl@0
  1137
		test(TheView.ColSize(col)==0);
sl@0
  1138
		test(TheView.ColLength(col)==0);
sl@0
  1139
		if (ii<ELongText8Null)
sl@0
  1140
			test(TheView.ColDes8(col).Length()==0);
sl@0
  1141
		}
sl@0
  1142
	test(TheView.ColUint(TheMap[EBitNull])==0);
sl@0
  1143
	test(TheView.ColInt(TheMap[EInt8Null])==0);
sl@0
  1144
	test(TheView.ColUint(TheMap[EUint8Null])==0);
sl@0
  1145
	test(TheView.ColInt(TheMap[EInt16Null])==0);
sl@0
  1146
	test(TheView.ColUint(TheMap[EUint16Null])==0);
sl@0
  1147
	test(TheView.ColInt(TheMap[EInt32Null])==0);
sl@0
  1148
	test(TheView.ColUint(TheMap[EUint32Null])==0);
sl@0
  1149
	test(TheView.ColInt64(TheMap[EInt64Null])==0);
sl@0
  1150
	test(TheView.ColReal32(TheMap[EReal32Null])==0);
sl@0
  1151
	test(TheView.ColReal64(TheMap[EReal64Null])==0);
sl@0
  1152
	test(TheView.ColTime(TheMap[ETimeNull])==TTime(0));
sl@0
  1153
	}
sl@0
  1154
sl@0
  1155
//
sl@0
  1156
// Copy the last row (should have a different auto-inc value)
sl@0
  1157
//
sl@0
  1158
LOCAL_C TInt WriteCopy()
sl@0
  1159
	{
sl@0
  1160
	TheView.LastL();
sl@0
  1161
	TheView.InsertCopyL();
sl@0
  1162
	TheView.SetColL(TheMap[EForceNull],1234567);
sl@0
  1163
	test(!TheView.IsColNull(TheMap[ECounter]));
sl@0
  1164
	TInt cc=TheView.ColInt(TheMap[ECounter]);
sl@0
  1165
	TheView.PutL();
sl@0
  1166
	return cc;
sl@0
  1167
	}
sl@0
  1168
sl@0
  1169
template <class T>
sl@0
  1170
void TestOverflow(TDbColNo aCol,const T& aValue)
sl@0
  1171
	{
sl@0
  1172
	TheView.UpdateL();
sl@0
  1173
	TheView.SetColL(aCol,aValue);
sl@0
  1174
	TRAPD(r,TheView.PutL());
sl@0
  1175
	test(r==KErrOverflow);
sl@0
  1176
	TheView.Cancel();
sl@0
  1177
	}
sl@0
  1178
sl@0
  1179
LOCAL_C void TestWriteNull(TDbColNo aCol)
sl@0
  1180
	{
sl@0
  1181
	TheView.UpdateL();
sl@0
  1182
	TheView.SetColNullL(aCol);
sl@0
  1183
	TRAPD(r,TheView.PutL());
sl@0
  1184
	test(r==KErrNotFound);
sl@0
  1185
	TheView.Cancel();
sl@0
  1186
	}
sl@0
  1187
sl@0
  1188
LOCAL_C void TestValidation()
sl@0
  1189
	{
sl@0
  1190
	TheView.InsertL();
sl@0
  1191
	WriteMinValues(0);
sl@0
  1192
	TheView.PutL();
sl@0
  1193
	TestOverflow(TheMap[EBit],TUint(2));
sl@0
  1194
	TestOverflow(TheMap[EBit],TUint(0xffffffffu));
sl@0
  1195
	TestOverflow(TheMap[EInt8],TInt(-129));
sl@0
  1196
	TestOverflow(TheMap[EInt8],TInt(128));
sl@0
  1197
	TestOverflow(TheMap[EUint8],TUint(0xffffffffu));
sl@0
  1198
	TestOverflow(TheMap[EUint8],TUint(256));
sl@0
  1199
	TestOverflow(TheMap[EInt16],TInt(-32769));
sl@0
  1200
	TestOverflow(TheMap[EInt16],TInt(32768));
sl@0
  1201
	TestOverflow(TheMap[EUint16],TUint(0xffffffffu));
sl@0
  1202
	TestOverflow(TheMap[EUint16],TUint(65536));
sl@0
  1203
	{
sl@0
  1204
	TBuf8<KDbDefaultTextColLength+1> buf;
sl@0
  1205
	buf.SetMax();
sl@0
  1206
	buf.Fill('x');
sl@0
  1207
	TestOverflow(TheMap[EText8],buf);
sl@0
  1208
	}
sl@0
  1209
	{
sl@0
  1210
	TBuf16<KDbDefaultTextColLength+1> buf;
sl@0
  1211
	buf.SetMax();
sl@0
  1212
	buf.Fill('x');
sl@0
  1213
	TestOverflow(TheMap[EText16],buf);
sl@0
  1214
	}
sl@0
  1215
	for (TInt ii=EBit;ii<EBitNull;++ii)
sl@0
  1216
		TestWriteNull(TheMap[ii]);
sl@0
  1217
	}
sl@0
  1218
sl@0
  1219
/**
sl@0
  1220
@SYMTestCaseID          SYSLIB-DBMS-CT-0597
sl@0
  1221
@SYMTestCaseDesc        Tests the range and values of all columns types
sl@0
  1222
@SYMTestPriority        Medium
sl@0
  1223
@SYMTestActions         Tests for integral accessors 
sl@0
  1224
@SYMTestExpectedResults Test must not fail
sl@0
  1225
@SYMREQ                 REQ0000
sl@0
  1226
*/
sl@0
  1227
LOCAL_C void TestTypes()
sl@0
  1228
	{
sl@0
  1229
	test.Start(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0597 Create table of all types "));
sl@0
  1230
	OpenDatabase();
sl@0
  1231
	CDbColSet* cs=CreateColSetL(EAllTypes);
sl@0
  1232
	test(TheDatabase.CreateTable(KTestTypesTable,*cs)==KErrNone);
sl@0
  1233
	delete cs;
sl@0
  1234
	test(TheView.Prepare(TheDatabase,_L("select * from TestTypesTable"))==KErrNone);
sl@0
  1235
	test(TheView.EvaluateAll()==KErrNone);
sl@0
  1236
	cs=TheView.ColSetL();
sl@0
  1237
	for (TInt ii=0;ii<KColumns;ii++)
sl@0
  1238
		TheMap[ii]=cs->ColNo(TPtrC(AllColumns[ii].iName));
sl@0
  1239
	delete cs;
sl@0
  1240
	test.Next(_L("Test integral accessors"));
sl@0
  1241
	CheckIntAccessors();
sl@0
  1242
	test.Next(_L("Add row of minimum values"));
sl@0
  1243
	TInt c1=WriteMinimum();
sl@0
  1244
	test.Next(_L("Add row of maximum values"));
sl@0
  1245
	TInt c2=WriteMaximum();
sl@0
  1246
	test(c2>c1);
sl@0
  1247
	test.Next(_L("Add row of Null values"));
sl@0
  1248
	TInt c3=WriteNull();
sl@0
  1249
	test(c3>c2);
sl@0
  1250
	test.Next(_L("Add a copy of the last row"));
sl@0
  1251
	TInt c4=WriteCopy();
sl@0
  1252
	test(c4>c3);
sl@0
  1253
	test.Next(_L("Check minimum values"));
sl@0
  1254
	TheView.FirstL();
sl@0
  1255
	CheckMinimum(c1);
sl@0
  1256
	test.Next(_L("Check maximum values"));
sl@0
  1257
	TheView.NextL();
sl@0
  1258
	CheckMaximum(c2);
sl@0
  1259
	test.Next(_L("Check Null values"));
sl@0
  1260
	TheView.NextL();
sl@0
  1261
	CheckNull(c3);
sl@0
  1262
	TheView.NextL();
sl@0
  1263
	CheckNull(c4);
sl@0
  1264
	test.Next(_L("Test column value Validation"));
sl@0
  1265
	TestValidation();
sl@0
  1266
	TheView.Close();
sl@0
  1267
	CloseDatabase();
sl@0
  1268
	test.End();
sl@0
  1269
	}
sl@0
  1270
sl@0
  1271
const TPtrC KColumnID(_S("id"));
sl@0
  1272
const TPtrC KColumnText(_S("txt"));
sl@0
  1273
const TPtrC KColumnOther(_S("other"));
sl@0
  1274
const TPtrC KBlobText(_S("text"));
sl@0
  1275
const TPtrC KFind1(_S("id=1"));
sl@0
  1276
const TPtrC KFind2(_S("id is null"));
sl@0
  1277
sl@0
  1278
// records will be:
sl@0
  1279
// 0: "text"
sl@0
  1280
// 1: "aaa...aaatext"
sl@0
  1281
// 2: "textaaa...aaa"
sl@0
  1282
// 3: "aaa...aaa"
sl@0
  1283
// 4: "aaa...aaatextaaa...aaa"
sl@0
  1284
// 5: ""
sl@0
  1285
sl@0
  1286
struct STest
sl@0
  1287
	{
sl@0
  1288
	const TText* iText;
sl@0
  1289
	TUint iRecs;
sl@0
  1290
	};
sl@0
  1291
sl@0
  1292
LOCAL_D STest const Tests[]=
sl@0
  1293
	{
sl@0
  1294
		{_S("txt like 'a*'"),0x010110},
sl@0
  1295
		{_S("txt like 'a*' or other like 'a*'"),0x111111},
sl@0
  1296
		{_S("txt like 'a*' and other like 'a*'"),0x010110},
sl@0
  1297
		{_S("txt < 'text'"),0x010111},
sl@0
  1298
		{_S("txt > 'text'"),0x001000},
sl@0
  1299
		{_S("txt > ''"),0x111110},
sl@0
  1300
		{_S("txt like 'text'"),0x100000},
sl@0
  1301
		{_S("txt like '*TEXT'"),0x110000},
sl@0
  1302
		{_S("txt like 'text*'"),0x101000},
sl@0
  1303
		{_S("txt like '*text*'"),0x111010},
sl@0
  1304
		{_S("txt like '*'"),0x111111},
sl@0
  1305
		{_S("txt like '?*'"),0x111110},
sl@0
  1306
		{_S("txt like '*t*t*'"),0x111010},
sl@0
  1307
		{_S("txt like '*a??t*'"),0x010010},
sl@0
  1308
		{_S("txt like 'aA*aa'"),0x000110},
sl@0
  1309
		{_S("txt like 'teXT'"),0x100000},
sl@0
  1310
		{_S("txt like '*text'"),0x110000},
sl@0
  1311
		{_S("txt like '*tExt*'"),0x111010},
sl@0
  1312
		{_S("txt like ''"),0x000001},
sl@0
  1313
		{_S("txt is null"),0x000001}
sl@0
  1314
	};
sl@0
  1315
sl@0
  1316
LOCAL_C void CreateFindTable()
sl@0
  1317
	{
sl@0
  1318
	CDbColSet *pC=CDbColSet::NewL();
sl@0
  1319
	CleanupStack::PushL(pC);
sl@0
  1320
	pC->AddL(TDbCol(KColumnID,EDbColUint32));
sl@0
  1321
	pC->AddL(TDbCol(KColumnText,EDbColLongText,200));
sl@0
  1322
	pC->AddL(TDbCol(KColumnOther,EDbColText,200));
sl@0
  1323
	test(TheDatabase.CreateTable(KTestFindTable,*pC)==KErrNone);
sl@0
  1324
	CleanupStack::PopAndDestroy();
sl@0
  1325
	test(TheTable.Open(TheDatabase,KTestFindTable,TheTable.EInsertOnly)==KErrNone);
sl@0
  1326
	TBuf<0x40> garbage;
sl@0
  1327
	garbage.SetMax();
sl@0
  1328
	garbage.Fill('a');
sl@0
  1329
	TBuf<0xff> col;
sl@0
  1330
	for (TUint ii=0;ii<6;++ii)
sl@0
  1331
		{
sl@0
  1332
		TheTable.InsertL();
sl@0
  1333
		TheTable.SetColL(1,ii);
sl@0
  1334
		TheTable.SetColL(3,_L("abcdef"));
sl@0
  1335
sl@0
  1336
		switch (ii)
sl@0
  1337
			{
sl@0
  1338
		case 0:
sl@0
  1339
			TheTable.SetColL(2,KBlobText);
sl@0
  1340
			break;
sl@0
  1341
		case 1:
sl@0
  1342
			col=garbage;
sl@0
  1343
			col+=KBlobText;
sl@0
  1344
			TheTable.SetColL(2,col);
sl@0
  1345
			break;
sl@0
  1346
		case 2:
sl@0
  1347
			col=KBlobText;
sl@0
  1348
			col+=garbage;
sl@0
  1349
			TheTable.SetColL(2,col);
sl@0
  1350
			break;
sl@0
  1351
		case 3:
sl@0
  1352
			TheTable.SetColL(2,garbage);
sl@0
  1353
			break;
sl@0
  1354
		case 4:
sl@0
  1355
			col=garbage;
sl@0
  1356
			col+=KBlobText;
sl@0
  1357
			col+=garbage;
sl@0
  1358
			TheTable.SetColL(2,col);
sl@0
  1359
			break;
sl@0
  1360
		case 5:
sl@0
  1361
			break;
sl@0
  1362
			}
sl@0
  1363
		TheTable.PutL();
sl@0
  1364
		}
sl@0
  1365
	TheTable.Close();
sl@0
  1366
	CDbKey* key=CDbKey::NewLC();
sl@0
  1367
	key->AddL(KColumnID);
sl@0
  1368
	key->MakeUnique();
sl@0
  1369
	test(TheDatabase.CreateIndex(KIndexName,KTestFindTable,*key)==KErrNone);
sl@0
  1370
	key->Clear();
sl@0
  1371
	key->AddL(TDbKeyCol(KColumnText,100));
sl@0
  1372
	key->MakeUnique();
sl@0
  1373
	key->SetComparison(EDbCompareFolded);
sl@0
  1374
	test(TheDatabase.CreateIndex(KIndexName2,KTestFindTable,*key)==KErrNone);
sl@0
  1375
	CleanupStack::PopAndDestroy(); //key
sl@0
  1376
	}
sl@0
  1377
sl@0
  1378
/**
sl@0
  1379
@SYMTestCaseID          SYSLIB-DBMS-CT-0598
sl@0
  1380
@SYMTestCaseDesc        Tests for RDbRowConstraint::Open() function
sl@0
  1381
@SYMTestPriority        Medium
sl@0
  1382
@SYMTestActions         Tests for the specified SQL search-condition for matching against rows in the specified rowset
sl@0
  1383
@SYMTestExpectedResults Test must not fail
sl@0
  1384
@SYMREQ                 REQ0000
sl@0
  1385
*/
sl@0
  1386
LOCAL_C void TestMatch()
sl@0
  1387
	{
sl@0
  1388
	test.Next(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0598 Match "));
sl@0
  1389
	test(TheTable.Open(TheDatabase,KTestFindTable,TheTable.EReadOnly)==KErrNone);
sl@0
  1390
	for (TInt ii=0;ii<TInt(sizeof(Tests)/sizeof(Tests[0]));++ii)
sl@0
  1391
		{
sl@0
  1392
		RDbRowConstraint match;
sl@0
  1393
		test(match.Open(TheTable,TDbQuery(TPtrC(Tests[ii].iText),EDbCompareFolded))==KErrNone);
sl@0
  1394
		TUint mask=0;
sl@0
  1395
		TheTable.BeginningL();
sl@0
  1396
		while (TheTable.NextL())
sl@0
  1397
			{
sl@0
  1398
			if (TheTable.MatchL(match))
sl@0
  1399
				{
sl@0
  1400
				TheTable.GetL();
sl@0
  1401
				TUint bit=0x100000>>(TheTable.ColUint32(1)*4);
sl@0
  1402
				test((bit&mask)==0);
sl@0
  1403
				mask|=bit;
sl@0
  1404
				}
sl@0
  1405
			}
sl@0
  1406
		match.Close();
sl@0
  1407
		test(mask==Tests[ii].iRecs);
sl@0
  1408
		}
sl@0
  1409
	TheTable.Close();
sl@0
  1410
	}
sl@0
  1411
sl@0
  1412
/**
sl@0
  1413
@SYMTestCaseID          SYSLIB-DBMS-CT-0599
sl@0
  1414
@SYMTestCaseDesc        Tests for RDbRowSet::FindL(),RDbRowSet::GetL() functions
sl@0
  1415
@SYMTestPriority        Medium
sl@0
  1416
@SYMTestActions         Tests for finding a match through a rowset 
sl@0
  1417
@SYMTestExpectedResults Test must not fail
sl@0
  1418
@SYMREQ                 REQ0000
sl@0
  1419
*/
sl@0
  1420
LOCAL_C void TestFind(RDbRowSet& aSet)
sl@0
  1421
	{
sl@0
  1422
	test.Next(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0599 "));
sl@0
  1423
	CDbColSet* cs=aSet.ColSetL();
sl@0
  1424
	test(cs!=0);
sl@0
  1425
	TDbColNo col=cs->ColNo(KColumnID);
sl@0
  1426
	test(col!=KDbNullColNo);
sl@0
  1427
	delete cs;
sl@0
  1428
	aSet.FirstL();
sl@0
  1429
	TInt p1=aSet.FindL(aSet.EForwards,KFind1);
sl@0
  1430
	test(p1>=0);
sl@0
  1431
	aSet.GetL();
sl@0
  1432
	test(aSet.ColUint(col)==1);
sl@0
  1433
	test(aSet.FindL(aSet.EForwards,KFind1)==0);
sl@0
  1434
	aSet.GetL();
sl@0
  1435
	test(aSet.ColUint(col)==1);
sl@0
  1436
	if (aSet.NextL())
sl@0
  1437
		test(aSet.FindL(aSet.EForwards,KFind1)==KErrNotFound);
sl@0
  1438
	aSet.FirstL();
sl@0
  1439
	test(aSet.FindL(aSet.EForwards,KFind2)==KErrNotFound);
sl@0
  1440
	aSet.LastL();
sl@0
  1441
	TInt p2=aSet.FindL(aSet.EBackwards,KFind1);
sl@0
  1442
	test(p2>=0);
sl@0
  1443
	aSet.GetL();
sl@0
  1444
	test(aSet.ColUint(col)==1);
sl@0
  1445
	test(aSet.FindL(aSet.EBackwards,KFind1)==0);
sl@0
  1446
	aSet.GetL();
sl@0
  1447
	test(aSet.ColUint(col)==1);
sl@0
  1448
	if (aSet.PreviousL())
sl@0
  1449
		test(aSet.FindL(aSet.EBackwards,KFind1)==KErrNotFound);
sl@0
  1450
	aSet.LastL();
sl@0
  1451
	test(aSet.FindL(aSet.EBackwards,KFind2)==KErrNotFound);
sl@0
  1452
	test(p1+p2+1==aSet.CountL());
sl@0
  1453
	}
sl@0
  1454
sl@0
  1455
/**
sl@0
  1456
@SYMTestCaseID          SYSLIB-DBMS-CT-0600
sl@0
  1457
@SYMTestCaseDesc        Tests for SQL find
sl@0
  1458
@SYMTestPriority        Medium
sl@0
  1459
@SYMTestActions         Tests for SQL querying a table
sl@0
  1460
@SYMTestExpectedResults Test must not fail
sl@0
  1461
@SYMREQ                 REQ0000
sl@0
  1462
*/
sl@0
  1463
LOCAL_C void TestSQLFind(const TText* aSql)
sl@0
  1464
	{
sl@0
  1465
    test.Next(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0600 "));
sl@0
  1466
	test(TheView.Prepare(TheDatabase,TDbQuery(TPtrC(aSql),EDbCompareFolded),TheView.EReadOnly)==KErrNone);
sl@0
  1467
	test(TheView.EvaluateAll()==KErrNone);
sl@0
  1468
	TestFind(TheView);
sl@0
  1469
	TheView.Close();
sl@0
  1470
	}
sl@0
  1471
sl@0
  1472
/**
sl@0
  1473
@SYMTestCaseID          SYSLIB-DBMS-CT-0601
sl@0
  1474
@SYMTestCaseDesc        Tests for DBMS limits
sl@0
  1475
@SYMTestPriority        Medium
sl@0
  1476
@SYMTestActions         Tests for maximum length boundaries
sl@0
  1477
@SYMTestExpectedResults Test must not fail
sl@0
  1478
@SYMREQ                 REQ0000
sl@0
  1479
*/
sl@0
  1480
LOCAL_C void TestDbmsBoundaries()
sl@0
  1481
	{
sl@0
  1482
	test.Next(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0601 "));
sl@0
  1483
	// Test KMaxSegmentLength boundary
sl@0
  1484
sl@0
  1485
	_LIT(KMaxSegmentLengthMinusOne,"txt like \
sl@0
  1486
		'*01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567@0.com*' \
sl@0
  1487
		  or other like \
sl@0
  1488
		'*01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567@0.com*'");
sl@0
  1489
	_LIT(KMaxSegmentLengthExact,"txt like \
sl@0
  1490
		'*012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678@0.com*' \
sl@0
  1491
		  or other like \
sl@0
  1492
		'*012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678@0.com*'");
sl@0
  1493
	_LIT(KMaxSegmentLengthPlusOne,"txt like \
sl@0
  1494
		'*0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789@0.com*' \
sl@0
  1495
		  or other like \
sl@0
  1496
		'*0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789@0.com*'");
sl@0
  1497
sl@0
  1498
	TInt ret=KErrNone;
sl@0
  1499
	RDbRowConstraint match;
sl@0
  1500
sl@0
  1501
	test(TheTable.Open(TheDatabase,KTestFindTable,TheTable.EReadOnly)==KErrNone);
sl@0
  1502
sl@0
  1503
	// Test one less than the boundary
sl@0
  1504
	ret = match.Open(TheTable,TDbQuery(KMaxSegmentLengthMinusOne,EDbCompareFolded));
sl@0
  1505
	match.Close();
sl@0
  1506
	test(ret==KErrNone);
sl@0
  1507
sl@0
  1508
	// Test the boundary
sl@0
  1509
	ret = match.Open(TheTable,TDbQuery(KMaxSegmentLengthExact,EDbCompareFolded));
sl@0
  1510
	match.Close();
sl@0
  1511
	test(ret==KErrNone);
sl@0
  1512
sl@0
  1513
	// Test one more than the boundary
sl@0
  1514
	ret = match.Open(TheTable,TDbQuery(KMaxSegmentLengthPlusOne,EDbCompareFolded));
sl@0
  1515
	match.Close();
sl@0
  1516
	test(ret==KErrArgument);
sl@0
  1517
sl@0
  1518
	TheTable.Close();
sl@0
  1519
	}
sl@0
  1520
sl@0
  1521
/**
sl@0
  1522
@SYMTestCaseID          SYSLIB-DBMS-CT-0602
sl@0
  1523
@SYMTestCaseDesc        Tests for table order,SQL query,
sl@0
  1524
@SYMTestPriority        Medium
sl@0
  1525
@SYMTestActions         Tests for finding a row in a rowset,dbms boundaries,SQL querying
sl@0
  1526
@SYMTestExpectedResults Test must not fail
sl@0
  1527
@SYMREQ                 REQ0000
sl@0
  1528
*/
sl@0
  1529
LOCAL_C void TestFind()
sl@0
  1530
	{
sl@0
  1531
	test.Start(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0602 Table order "));
sl@0
  1532
	test(TheTable.Open(TheDatabase,KTestFindTable,TheTable.EReadOnly)==KErrNone);
sl@0
  1533
	TestFind(TheTable);
sl@0
  1534
	test.Next(_L("Index order"));
sl@0
  1535
	test(TheTable.SetIndex(KIndexName)==KErrNone);
sl@0
  1536
	TestFind(TheTable);
sl@0
  1537
	test(TheTable.SetIndex(KIndexName2)==KErrNone);
sl@0
  1538
	TestFind(TheTable);
sl@0
  1539
	TheTable.Close();
sl@0
  1540
sl@0
  1541
	test.Next(_L("SQL query test boundary"));
sl@0
  1542
	TestDbmsBoundaries();
sl@0
  1543
sl@0
  1544
	test.Next(_L("SQL query"));
sl@0
  1545
	TestSQLFind(_S("select id from TestFindTable where id=1"));
sl@0
  1546
	TestSQLFind(_S("select * from TestFindTable where id<=2"));
sl@0
  1547
	TestSQLFind(_S("select txt,id from TestFindTable order by id desc"));
sl@0
  1548
	TestSQLFind(_S("select id,txt from TestFindTable where id=1 or txt like '*text*'"));
sl@0
  1549
	TestSQLFind(_S("select * from TestFindTable where id=1 or txt is not null order by id"));
sl@0
  1550
	TestSQLFind(_S("select id from TestFindTable where id<>3 order by txt"));
sl@0
  1551
	test.End();
sl@0
  1552
	}
sl@0
  1553
sl@0
  1554
LOCAL_C void TestBookmark(RDbRowSet& aSet)
sl@0
  1555
	{
sl@0
  1556
	aSet.BeginningL();
sl@0
  1557
	while (aSet.NextL())
sl@0
  1558
		{
sl@0
  1559
		aSet.GetL();
sl@0
  1560
		TUint id=aSet.ColUint(1);
sl@0
  1561
		TDbBookmark mark=aSet.Bookmark();
sl@0
  1562
		aSet.BeginningL();
sl@0
  1563
		aSet.GotoL(mark);
sl@0
  1564
		aSet.GetL();
sl@0
  1565
		test(aSet.ColUint(1)==id);
sl@0
  1566
		aSet.NextL();
sl@0
  1567
		aSet.PreviousL();
sl@0
  1568
		aSet.PreviousL();
sl@0
  1569
		aSet.NextL();
sl@0
  1570
		aSet.GetL();
sl@0
  1571
		test(aSet.ColUint(1)==id);
sl@0
  1572
		aSet.GotoL(mark);
sl@0
  1573
		};
sl@0
  1574
	}
sl@0
  1575
sl@0
  1576
LOCAL_C void TestSQLBookmark(const TText* aSql)
sl@0
  1577
	{
sl@0
  1578
	test(TheView.Prepare(TheDatabase,TDbQuery(TPtrC(aSql),EDbCompareFolded),TheView.EReadOnly)==KErrNone);
sl@0
  1579
	test(TheView.EvaluateAll()==KErrNone);
sl@0
  1580
	TestBookmark(TheView);
sl@0
  1581
	TheView.Close();
sl@0
  1582
	}
sl@0
  1583
sl@0
  1584
LOCAL_C void TestBookmark()
sl@0
  1585
	{
sl@0
  1586
	test.Start(_L("Table order"));
sl@0
  1587
	test(TheTable.Open(TheDatabase,KTestFindTable,TheTable.EReadOnly)==KErrNone);
sl@0
  1588
	TestBookmark(TheTable);
sl@0
  1589
	test.Next(_L("Index order"));
sl@0
  1590
	test(TheTable.SetIndex(KIndexName)==KErrNone);
sl@0
  1591
	TestBookmark(TheTable);
sl@0
  1592
	test(TheTable.SetIndex(KIndexName2)==KErrNone);
sl@0
  1593
	TestBookmark(TheTable);
sl@0
  1594
	TheTable.Close();
sl@0
  1595
	test.Next(_L("SQL query"));
sl@0
  1596
	TestSQLBookmark(_S("select * from TestFindTable where id=1"));
sl@0
  1597
	TestSQLBookmark(_S("select * from TestFindTable where id>2"));
sl@0
  1598
	TestSQLBookmark(_S("select * from TestFindTable order by id desc"));
sl@0
  1599
	TestSQLBookmark(_S("select * from TestFindTable where txt like '*text*'"));
sl@0
  1600
	TestSQLBookmark(_S("select * from TestFindTable where txt is not null order by id"));
sl@0
  1601
	TestSQLBookmark(_S("select * from TestFindTable where id <> 3 order by txt"));
sl@0
  1602
	test.End();
sl@0
  1603
	}
sl@0
  1604
sl@0
  1605
/**
sl@0
  1606
@SYMTestCaseID          SYSLIB-DBMS-CT-0603
sl@0
  1607
@SYMTestCaseDesc        Tests for find and bookmark
sl@0
  1608
@SYMTestPriority        Medium
sl@0
  1609
@SYMTestActions         Executes Match,Find,Bookmarks tests 
sl@0
  1610
@SYMTestExpectedResults Test must not fail
sl@0
  1611
@SYMREQ                 REQ0000
sl@0
  1612
*/
sl@0
  1613
LOCAL_C void TestFindAndBookmark()
sl@0
  1614
	{
sl@0
  1615
	test.Start(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0603 Create Table "));
sl@0
  1616
	OpenDatabase();
sl@0
  1617
	CreateFindTable();
sl@0
  1618
	test.Next(_L("Match"));
sl@0
  1619
	TestMatch();
sl@0
  1620
	test.Next(_L("Find"));
sl@0
  1621
	TestFind();
sl@0
  1622
	test.Next(_L("Bookmarks"));
sl@0
  1623
	TestBookmark();
sl@0
  1624
	test.Next(_L("Close"));
sl@0
  1625
	CloseDatabase();
sl@0
  1626
	test.End();
sl@0
  1627
	}
sl@0
  1628
sl@0
  1629
/**
sl@0
  1630
@SYMTestCaseID          SYSLIB-DBMS-CT-0604
sl@0
  1631
@SYMTestCaseDesc        Tests for multi view
sl@0
  1632
@SYMTestPriority        Medium
sl@0
  1633
@SYMTestActions         Tests for adding and deleting rows 
sl@0
  1634
@SYMTestExpectedResults Test must not fail
sl@0
  1635
@SYMREQ                 REQ0000
sl@0
  1636
*/
sl@0
  1637
LOCAL_C void TestMultiView()
sl@0
  1638
	{
sl@0
  1639
	test.Start(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0604 Create Table "));
sl@0
  1640
	OpenDatabase();
sl@0
  1641
	CDbColSet* set=CreateColSetL(ESingleColumn);
sl@0
  1642
	test(TheDatabase.CreateTable(KTestMultiTable,*set)==KErrNone);
sl@0
  1643
	delete set;
sl@0
  1644
	test.Next(_L("Add and modify rows"));
sl@0
  1645
	test(TheTable.Open(TheDatabase,KTestMultiTable)==KErrNone);
sl@0
  1646
	test(TheView.Prepare(TheDatabase,_L("select * from TestMultiTable"))==KErrNone);
sl@0
  1647
	test(TheView.EvaluateAll()==KErrNone);
sl@0
  1648
	for (TInt ii=1;ii<=10;++ii)
sl@0
  1649
		{
sl@0
  1650
		TheTable.InsertL();
sl@0
  1651
		TheTable.SetColL(1,ii);
sl@0
  1652
		TheTable.PutL();
sl@0
  1653
		TheView.NextL();
sl@0
  1654
		TheView.GetL();
sl@0
  1655
		test(TheView.ColInt(1)==ii);
sl@0
  1656
		TheView.UpdateL();
sl@0
  1657
		TheView.SetColL(1,ii+100);
sl@0
  1658
		TheView.PutL();
sl@0
  1659
		test(TheTable.ColInt(1)==ii);
sl@0
  1660
		TheTable.GetL();
sl@0
  1661
		test(TheTable.ColInt(1)==ii+100);
sl@0
  1662
		}
sl@0
  1663
	test.Next(_L("delete rows"));
sl@0
  1664
	TheView.FirstL();
sl@0
  1665
	TheTable.FirstL();
sl@0
  1666
	TheView.GetL();
sl@0
  1667
	test (TheView.ColInt(1)==1+100);
sl@0
  1668
	TheTable.DeleteL();
sl@0
  1669
	TRAPD(r,TheView.GetL());
sl@0
  1670
	test(r!=KErrNone);
sl@0
  1671
	TheView.NextL();
sl@0
  1672
	TheView.GetL();
sl@0
  1673
	test (TheView.ColInt(1)==2+100);
sl@0
  1674
	TheView.DeleteL();
sl@0
  1675
	test(!TheView.PreviousL());
sl@0
  1676
	TheTable.NextL();
sl@0
  1677
	test(!TheTable.PreviousL());
sl@0
  1678
	test.End();
sl@0
  1679
	TheView.Close();
sl@0
  1680
	TheTable.Close();
sl@0
  1681
	CloseDatabase();
sl@0
  1682
	}
sl@0
  1683
	
sl@0
  1684
LOCAL_C void ValidateUID3(const TDesC& aDbName, const TUid& aUid)
sl@0
  1685
	{
sl@0
  1686
	test.Next(_L("Read DB header"));
sl@0
  1687
	RFile dbFile;
sl@0
  1688
	TInt err = dbFile.Open(TheFs, aDbName, EFileRead);
sl@0
  1689
	test(err==KErrNone);
sl@0
  1690
	TBuf8<100> contents; // header of a new DB is approx 77 bytes
sl@0
  1691
	err = dbFile.Read(contents);
sl@0
  1692
	dbFile.Close();
sl@0
  1693
	test(err==KErrNone);
sl@0
  1694
	
sl@0
  1695
	test.Next(_L("Check UID3"));
sl@0
  1696
	const TPtrC8 ptr((const TUint8*) &aUid.iUid, sizeof(aUid.iUid));
sl@0
  1697
	TInt pos = contents.Find(ptr);
sl@0
  1698
	test(pos==8); // UID3 begins at byte pos 8
sl@0
  1699
	}
sl@0
  1700
sl@0
  1701
/**
sl@0
  1702
@SYMTestCaseID          SYSLIB-DBMS-CT-1372
sl@0
  1703
@SYMTestCaseDesc        Tests for UID3 being set in DB header
sl@0
  1704
@SYMTestPriority        Medium
sl@0
  1705
@SYMTestActions         Creates a new DB and checks UID3
sl@0
  1706
@SYMTestExpectedResults Test must not fail
sl@0
  1707
@SYMREQ                 REQ0000
sl@0
  1708
*/
sl@0
  1709
LOCAL_C void TestDbUID3()
sl@0
  1710
	{
sl@0
  1711
	const TUid KOrigUid = {0x19768253}; // random UID
sl@0
  1712
	const TUid KReplaceUid = {0x24731264}; // different random UID
sl@0
  1713
#ifndef __TOOLS2__
sl@0
  1714
	const TPtrC KTempDbName(_S("C:\\dbms-tst\\T_DBMS_UID3.DB"));
sl@0
  1715
#else
sl@0
  1716
	const TPtrC KTempDbName(_S(".\\dbms-tst\\T_DBMS_UID3.DB"));
sl@0
  1717
#endif
sl@0
  1718
	
sl@0
  1719
	(void)TheFs.Delete(KTempDbName);
sl@0
  1720
	
sl@0
  1721
	test.Start(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-1372 Create Database "));
sl@0
  1722
	RDbNamedDatabase tempDb;
sl@0
  1723
	TInt err = tempDb.Create(TheFs, KTempDbName, KOrigUid.Name());
sl@0
  1724
	test(err==KErrNone);
sl@0
  1725
	tempDb.Close();
sl@0
  1726
	
sl@0
  1727
	ValidateUID3(KTempDbName, KOrigUid);
sl@0
  1728
	
sl@0
  1729
	test.Next(_L("Replace Database"));
sl@0
  1730
	err = tempDb.Replace(TheFs, KTempDbName, KReplaceUid.Name());
sl@0
  1731
	test(err==KErrNone);
sl@0
  1732
	tempDb.Close();
sl@0
  1733
	
sl@0
  1734
	ValidateUID3(KTempDbName, KReplaceUid);
sl@0
  1735
	
sl@0
  1736
	test.Next(_L("Replace Database using default UID3"));
sl@0
  1737
	err = tempDb.Replace(TheFs, KTempDbName);
sl@0
  1738
	test(err==KErrNone);
sl@0
  1739
	tempDb.Close();
sl@0
  1740
	
sl@0
  1741
	ValidateUID3(KTempDbName, KNullUid);
sl@0
  1742
	
sl@0
  1743
	(void)TheFs.Delete(KTempDbName);
sl@0
  1744
	test.End();
sl@0
  1745
	}
sl@0
  1746
sl@0
  1747
LOCAL_C void Test()
sl@0
  1748
	{
sl@0
  1749
	__UHEAP_MARK;
sl@0
  1750
	test.Start(_L("DDL"));
sl@0
  1751
	TRAPD(r,TestDDL();)
sl@0
  1752
	test(r==KErrNone);
sl@0
  1753
	__UHEAP_MARKEND;
sl@0
  1754
	__UHEAP_MARK;
sl@0
  1755
	test.Next(_L("Navigation/Edit"));
sl@0
  1756
	TRAP(r,TestView();)
sl@0
  1757
	test(r==KErrNone);
sl@0
  1758
	__UHEAP_MARKEND;
sl@0
  1759
	__UHEAP_MARK;
sl@0
  1760
	test.Next(_L("Column Types"));
sl@0
  1761
	TRAP(r,TestTypes();)
sl@0
  1762
	test(r==KErrNone);
sl@0
  1763
	__UHEAP_MARKEND;
sl@0
  1764
	__UHEAP_MARK;
sl@0
  1765
	test.Next(_L("Find, Match & Bookmarks"));
sl@0
  1766
	TRAP(r,TestFindAndBookmark();)
sl@0
  1767
	test(r==KErrNone);
sl@0
  1768
	__UHEAP_MARKEND;
sl@0
  1769
	__UHEAP_MARK;
sl@0
  1770
	test.Next(_L("Multiple view updates"));
sl@0
  1771
	TRAP(r,TestMultiView();)
sl@0
  1772
	test(r==KErrNone);
sl@0
  1773
	__UHEAP_MARKEND;
sl@0
  1774
	__UHEAP_MARK;
sl@0
  1775
	test.Next(_L("Database UID3"));
sl@0
  1776
	TRAP(r,TestDbUID3();)
sl@0
  1777
	test(r==KErrNone);
sl@0
  1778
	test.End();
sl@0
  1779
	__UHEAP_MARKEND;
sl@0
  1780
	}
sl@0
  1781
sl@0
  1782
//
sl@0
  1783
// Prepare the test directory.
sl@0
  1784
//
sl@0
  1785
LOCAL_C void setupTestDirectory()
sl@0
  1786
    {
sl@0
  1787
	TInt r=TheFs.Connect();
sl@0
  1788
	test(r==KErrNone);
sl@0
  1789
//
sl@0
  1790
	r=TheFs.MkDir(KTestDatabase);
sl@0
  1791
	test(r==KErrNone || r==KErrAlreadyExists);
sl@0
  1792
	}
sl@0
  1793
sl@0
  1794
//
sl@0
  1795
// Initialise the cleanup stack.
sl@0
  1796
//
sl@0
  1797
LOCAL_C void setupCleanup()
sl@0
  1798
    {
sl@0
  1799
	TheTrapCleanup=CTrapCleanup::New();
sl@0
  1800
	test(TheTrapCleanup!=NULL);
sl@0
  1801
	TRAPD(r,\
sl@0
  1802
		{\
sl@0
  1803
		for (TInt i=KTestCleanupStack;i>0;i--)\
sl@0
  1804
			CleanupStack::PushL((TAny*)0);\
sl@0
  1805
		CleanupStack::Pop(KTestCleanupStack);\
sl@0
  1806
		});
sl@0
  1807
	test(r==KErrNone);
sl@0
  1808
	}
sl@0
  1809
sl@0
  1810
LOCAL_C void DeleteDataFile(const TDesC& aFullName)
sl@0
  1811
	{
sl@0
  1812
	RFs fsSession;
sl@0
  1813
	TInt err = fsSession.Connect();
sl@0
  1814
	if(err == KErrNone)
sl@0
  1815
		{
sl@0
  1816
		TEntry entry;
sl@0
  1817
		if(fsSession.Entry(aFullName, entry) == KErrNone)
sl@0
  1818
			{
sl@0
  1819
			RDebug::Print(_L("Deleting \"%S\" file.\n"), &aFullName);
sl@0
  1820
			err = fsSession.SetAtt(aFullName, 0, KEntryAttReadOnly);
sl@0
  1821
			if(err != KErrNone) 
sl@0
  1822
				{
sl@0
  1823
				RDebug::Print(_L("Error %d changing \"%S\" file attributes.\n"), err, &aFullName);
sl@0
  1824
				}
sl@0
  1825
			err = fsSession.Delete(aFullName);
sl@0
  1826
			if(err != KErrNone) 
sl@0
  1827
				{
sl@0
  1828
				RDebug::Print(_L("Error %d deleting \"%S\" file.\n"), err, &aFullName);
sl@0
  1829
				}
sl@0
  1830
			}
sl@0
  1831
		fsSession.Close();
sl@0
  1832
		}
sl@0
  1833
	else
sl@0
  1834
		{
sl@0
  1835
		RDebug::Print(_L("Error %d connecting file session. File: %S.\n"), err, &aFullName);
sl@0
  1836
		}
sl@0
  1837
	}
sl@0
  1838
sl@0
  1839
//
sl@0
  1840
// Test streaming conversions.
sl@0
  1841
//
sl@0
  1842
GLDEF_C TInt E32Main()
sl@0
  1843
    {
sl@0
  1844
	test.Title();
sl@0
  1845
	setupTestDirectory();
sl@0
  1846
	setupCleanup();
sl@0
  1847
	__UHEAP_MARK;
sl@0
  1848
//
sl@0
  1849
#ifndef __TOOLS2__
sl@0
  1850
	TInt r=TheDbs.Connect();
sl@0
  1851
	test (r==KErrNone);
sl@0
  1852
#endif
sl@0
  1853
	test.Start(_L("Standard database"));
sl@0
  1854
	Test();
sl@0
  1855
	test.Next(_L("Secure database"));
sl@0
  1856
	Test();
sl@0
  1857
#ifndef __TOOLS2__
sl@0
  1858
	TheDbs.Close();
sl@0
  1859
#endif
sl@0
  1860
sl@0
  1861
#ifndef __linux__
sl@0
  1862
	TInt err;
sl@0
  1863
#ifndef __TOOLS2__
sl@0
  1864
	TRAPD(lc, err = TheCrcChecker.DumpCrcRecordsL(KCrcRecord));
sl@0
  1865
	test(err==KErrNone);
sl@0
  1866
	test(lc==KErrNone);
sl@0
  1867
#else
sl@0
  1868
	TRAPD(lc, err = TheCrcChecker.ValidateCrcRecordsL(KCrcRecord));
sl@0
  1869
	TPtrC errmsg;
sl@0
  1870
	TheCrcChecker.ErrorReportL(err, errmsg);
sl@0
  1871
	RDebug::Print(errmsg);
sl@0
  1872
	test(err==KErrNone || err==TDBMS_CRCChecks::ECrcCheckOk);
sl@0
  1873
#endif // TOOLS2
sl@0
  1874
#endif // linux
sl@0
  1875
sl@0
  1876
	test.Next(_L("Waiting for server exit"));
sl@0
  1877
	const TUint KExitDelay=6*0x100000;	// ~6 seconds
sl@0
  1878
	User::After(KExitDelay);
sl@0
  1879
	test.End();
sl@0
  1880
//
sl@0
  1881
	__UHEAP_MARKEND;
sl@0
  1882
	delete TheTrapCleanup;
sl@0
  1883
sl@0
  1884
	::DeleteDataFile(KTestDatabase);
sl@0
  1885
sl@0
  1886
	TheFs.Close();
sl@0
  1887
	test.Close();
sl@0
  1888
	return 0;
sl@0
  1889
    }