os/persistentdata/persistentstorage/dbms/pcdbms/tdbms/src/t_dbmsscript.cpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
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 <f32file.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_DBMSSCRIPT.CRC");
sl@0
    33
#else
sl@0
    34
const TPtrC	KCrcRecord=_L("C:\\dbms-tst\\T_DBMSSCRIPT.CRC");
sl@0
    35
#endif
sl@0
    36
#endif
sl@0
    37
sl@0
    38
LOCAL_D RTest test(_L("T_DBMSSCRIPT"));
sl@0
    39
LOCAL_D CTrapCleanup* TheTrapCleanup;
sl@0
    40
LOCAL_D RDbNamedDatabase TheDatabase;
sl@0
    41
LOCAL_D RFs TheFs;
sl@0
    42
LOCAL_D RDbView TheView;
sl@0
    43
//
sl@0
    44
sl@0
    45
#ifdef __TOOLS2__
sl@0
    46
const TPtrC KTestDatabase=_L(".\\dbms-tst\\t_script.db");
sl@0
    47
#else
sl@0
    48
const TPtrC KTestDatabase=_L("C:\\dbms-tst\\t_script.db");
sl@0
    49
#endif
sl@0
    50
sl@0
    51
const TPtrC KRomScriptFile=_L("z:\\test\\t_script.txt");
sl@0
    52
sl@0
    53
#ifndef __TOOLS2__
sl@0
    54
const TPtrC KScriptFile=_L("c:\\dbms-tst\\t_script.txt");
sl@0
    55
#else
sl@0
    56
const TPtrC KScriptFile=_L(".\\dbms-tst\\t_script.txt");
sl@0
    57
#endif
sl@0
    58
sl@0
    59
#ifndef __TOOLS2__
sl@0
    60
const TPtrC KOutputFile=_L("c:\\dbms-tst\\t_script.log");
sl@0
    61
#else
sl@0
    62
const TPtrC KOutputFile=_L(".\\dbms-tst\\t_script.log");
sl@0
    63
#endif
sl@0
    64
sl@0
    65
const TInt KTestCleanupStack=0x20;
sl@0
    66
const TPtrC KDDLKeywords[]={_L("CREATE"),_L("DROP"),_L("ALTER")};
sl@0
    67
const TPtrC KDMLKeywords[]={_L("INSERT"),_L("DELETE"),_L("UPDATE")};
sl@0
    68
const TPtrC KQueryKeywords[]={_L("SELECT")};
sl@0
    69
const TPtrC KScriptKeywords[]={_L("PRINT"),_L("ROWS"),_L("COMPARE"),_L("ERROR"),_L("!"),
sl@0
    70
							   _L("POPULATE"),_L("RESULTS"),_L("BUILD"),_L("QUERY"),
sl@0
    71
							   _L("NORMAL"),_L("FOLDED"),_L("COLLATED"),_L("START"),_L("STOP"),
sl@0
    72
							   _L("LOAD"),_L("ECHO"),_L("WINDOW"),_L("ACCESS")};
sl@0
    73
const TPtrC KRowIdColName=_L("Rw");
sl@0
    74
enum TKeyword {EPrint,ERows,ECompare,EError,EComment,EPopulate,EResults,EBuild,EQuery,ENormal,
sl@0
    75
               EFolded,ECollated,EStart,EStop,ELoad,EEcho,EWindow,EAccess,ENumKeywords,EUnknown};
sl@0
    76
//
sl@0
    77
typedef TBuf<256> TScriptLine;
sl@0
    78
typedef TBuf<256> TScriptToken;
sl@0
    79
//
sl@0
    80
#define ARRAY_SIZE(array) (sizeof(array)/sizeof(array[0]))
sl@0
    81
sl@0
    82
class TScript;
sl@0
    83
class TTimer
sl@0
    84
	{
sl@0
    85
public:
sl@0
    86
	inline TTimer(TScript& aScript);
sl@0
    87
	void Start(const TDesC& aDes);
sl@0
    88
	void Stop(const TDesC& aDes);
sl@0
    89
private:
sl@0
    90
	TUint iTicks;
sl@0
    91
	TScript& iScript;
sl@0
    92
	};
sl@0
    93
sl@0
    94
class TResults
sl@0
    95
	{
sl@0
    96
public:
sl@0
    97
	inline TResults(); 
sl@0
    98
public:
sl@0
    99
	RDbView& iView;
sl@0
   100
	TInt iError;
sl@0
   101
	TInt iRows;
sl@0
   102
	TInt iLineNo;
sl@0
   103
	TScriptLine iLine;
sl@0
   104
	};
sl@0
   105
sl@0
   106
class TSqlStatement
sl@0
   107
	{
sl@0
   108
private:
sl@0
   109
	enum TSqlType {EDML,EDDL,EQuery,EUnknown};
sl@0
   110
public:
sl@0
   111
	inline TSqlStatement(const TDesC& aSql,TResults& aResults); 
sl@0
   112
	TInt Execute(TDbTextComparison aTextComparison=EDbCompareNormal,
sl@0
   113
		RDbRowSet::TAccess aAccess=RDbRowSet::EReadOnly,TBool aWindow=EFalse) const;
sl@0
   114
private:
sl@0
   115
	void ExecuteSql(TDbTextComparison aTextComparison) const;
sl@0
   116
	void ExecuteQuery(RDbRowSet::TAccess aAccess,TBool aWindow) const;
sl@0
   117
	TSqlType SqlType() const;
sl@0
   118
private:
sl@0
   119
	const TDesC& iSql;
sl@0
   120
	TResults& iResults;
sl@0
   121
	};
sl@0
   122
sl@0
   123
class TScript
sl@0
   124
	{
sl@0
   125
public:
sl@0
   126
	TScript();
sl@0
   127
#ifdef __TOOLS2__
sl@0
   128
	~TScript() { iFile.Close(); };
sl@0
   129
#endif
sl@0
   130
	TInt ReadNextStatement();
sl@0
   131
	void GetNextTokenFromStatement(TDes& aToken);
sl@0
   132
	void GetNextTokenFromLine(TDes& aToken);
sl@0
   133
	TPtrC Statement();
sl@0
   134
	TInt IntValue();
sl@0
   135
	void WriteLine(const TDesC& aLine);
sl@0
   136
	void WriteError(const TDesC& aLine);
sl@0
   137
	void WriteSqlError(const TResults& aResults,const TDesC& aLine); 
sl@0
   138
	void WriteComment(const TDesC& aLine);
sl@0
   139
	TKeyword Keyword(const TDesC& aKeyword) const;
sl@0
   140
	void ConsumeLine();
sl@0
   141
	void ConsumeStatement();
sl@0
   142
	inline TInt LineNo() const;
sl@0
   143
private:
sl@0
   144
	TInt ReadNextLine();
sl@0
   145
	TInt AppendNextLine();
sl@0
   146
	TBool IsStatement();
sl@0
   147
private:
sl@0
   148
	TFileText iInput;
sl@0
   149
	TFileText iOutput;
sl@0
   150
	TScriptLine iBuf;
sl@0
   151
	TLex iStatement;
sl@0
   152
	TLex iLine;
sl@0
   153
	TInt iLineNo;
sl@0
   154
#ifdef __TOOLS2__
sl@0
   155
	RFile iFile;
sl@0
   156
#endif
sl@0
   157
	};
sl@0
   158
sl@0
   159
class TScriptEngine
sl@0
   160
	{
sl@0
   161
public:
sl@0
   162
	inline TScriptEngine();
sl@0
   163
	void RunL();
sl@0
   164
private:
sl@0
   165
	void ExecuteL();
sl@0
   166
	TInt ExecuteScriptL();
sl@0
   167
	TInt ExecuteSql(const TDesC& aSql);
sl@0
   168
	TInt ExecuteSql();
sl@0
   169
	// keyword operations
sl@0
   170
	void DoPrintL();
sl@0
   171
	void DoComment();
sl@0
   172
	void DoError();
sl@0
   173
	void DoEcho();
sl@0
   174
	void DoWindow();
sl@0
   175
	void DoAccess();
sl@0
   176
	void DoRows();
sl@0
   177
	void DoCompareL();
sl@0
   178
	void DoPopulate();
sl@0
   179
	void DoResultsL();
sl@0
   180
	void DoBuildTable();
sl@0
   181
	void DoQuery();
sl@0
   182
	void DoTextComparison(TKeyword aKeyword);
sl@0
   183
	void DoStartTimer();
sl@0
   184
	void DoStopTimer();
sl@0
   185
	void DoLoadDb();
sl@0
   186
	//
sl@0
   187
	void PrintL(RDbRowSet& aRowSet);
sl@0
   188
	void CompareL(RDbRowSet& aRowSet);
sl@0
   189
	void CompareValues(RDbRowSet& aRowSet,TDbColNo ColNo,TDbColType aType,const TDesC& aToken);
sl@0
   190
	void FatalError(const TDesC& aLine);
sl@0
   191
	void FatalError();
sl@0
   192
	void FatalSqlError(const TDesC& aLine);
sl@0
   193
	void TestForNoError(); 
sl@0
   194
private:
sl@0
   195
	TScript iScript;
sl@0
   196
	TResults iResults;
sl@0
   197
	TDbTextComparison iTextComparison;
sl@0
   198
	TTimer iTimer;
sl@0
   199
	TBool iEcho;
sl@0
   200
	TBool iWindow;
sl@0
   201
	RDbRowSet::TAccess iAccess;
sl@0
   202
	
sl@0
   203
	};
sl@0
   204
sl@0
   205
//
sl@0
   206
// class TTimer
sl@0
   207
//
sl@0
   208
sl@0
   209
inline TTimer::TTimer(TScript& aScript)
sl@0
   210
	: iScript(aScript)
sl@0
   211
	{}
sl@0
   212
sl@0
   213
void TTimer::Start(const TDesC& aDes)
sl@0
   214
	{
sl@0
   215
	TScriptLine line;
sl@0
   216
	line.Format(_L("%S: "),&aDes);
sl@0
   217
	iScript.WriteLine(line);
sl@0
   218
	iTicks=User::TickCount();
sl@0
   219
	}
sl@0
   220
sl@0
   221
void TTimer::Stop(const TDesC& aDes)
sl@0
   222
	{
sl@0
   223
	TScriptLine line;
sl@0
   224
	line.Format(_L("%S: "),&aDes);
sl@0
   225
#ifdef __EPOC32__
sl@0
   226
#define TICK_TIME 15625
sl@0
   227
#else
sl@0
   228
#define	TICK_TIME 100000
sl@0
   229
#endif
sl@0
   230
	TInt microSec=(User::TickCount()-iTicks)*TICK_TIME;
sl@0
   231
	TUint sec=microSec/1000000;
sl@0
   232
	TUint centi=(microSec/10000)-sec*100;
sl@0
   233
	line.AppendFormat(_L("%u.%02us\n"),sec,centi);
sl@0
   234
	iScript.WriteLine(line);
sl@0
   235
	}
sl@0
   236
sl@0
   237
//
sl@0
   238
// class TResults
sl@0
   239
//
sl@0
   240
sl@0
   241
inline TResults::TResults()
sl@0
   242
	: iView(TheView),iError(KErrNone)
sl@0
   243
	{}
sl@0
   244
sl@0
   245
sl@0
   246
//
sl@0
   247
// class TSqlStatement
sl@0
   248
//
sl@0
   249
sl@0
   250
inline TSqlStatement::TSqlStatement(const TDesC& aSql,TResults& aResults)
sl@0
   251
	: iSql(aSql),iResults(aResults)
sl@0
   252
	{}
sl@0
   253
sl@0
   254
void TSqlStatement::ExecuteSql(TDbTextComparison aTextComparison) const
sl@0
   255
//
sl@0
   256
// executes DML or DDL
sl@0
   257
//
sl@0
   258
	{
sl@0
   259
	TInt r=TheDatabase.Execute(iSql,aTextComparison);
sl@0
   260
	if (r<0)
sl@0
   261
		iResults.iError=r;
sl@0
   262
	else
sl@0
   263
		{
sl@0
   264
		iResults.iError=KErrNone;
sl@0
   265
		iResults.iRows=r;
sl@0
   266
		}
sl@0
   267
	}
sl@0
   268
sl@0
   269
void TSqlStatement::ExecuteQuery(RDbRowSet::TAccess aAccess,TBool aWindow) const
sl@0
   270
	{
sl@0
   271
	iResults.iView.Close();			// discard any previous queries
sl@0
   272
	TInt& err=iResults.iError;
sl@0
   273
	if (aWindow)
sl@0
   274
		err=iResults.iView.Prepare(TheDatabase,iSql,KDbUnlimitedWindow,aAccess);
sl@0
   275
	else
sl@0
   276
		err=iResults.iView.Prepare(TheDatabase,iSql,aAccess);
sl@0
   277
	if (err==KErrNone)
sl@0
   278
		err=iResults.iView.EvaluateAll();
sl@0
   279
	}
sl@0
   280
sl@0
   281
TSqlStatement::TSqlType TSqlStatement::SqlType() const
sl@0
   282
//
sl@0
   283
// determines the type of sql statement by matching keywords
sl@0
   284
//
sl@0
   285
	{
sl@0
   286
	for (TUint i=0;i<ARRAY_SIZE(KDDLKeywords);++i)
sl@0
   287
		{
sl@0
   288
		if (iSql.FindF(KDDLKeywords[i])==0)		
sl@0
   289
			return EDDL;
sl@0
   290
		}
sl@0
   291
	for (TUint ii=0;ii<ARRAY_SIZE(KDMLKeywords);++ii)
sl@0
   292
		{
sl@0
   293
		if (iSql.FindF(KDMLKeywords[ii])==0)
sl@0
   294
			return EDML;
sl@0
   295
		}
sl@0
   296
	for (TUint j=0;j<ARRAY_SIZE(KQueryKeywords);++j)
sl@0
   297
		{
sl@0
   298
		if (iSql.FindF(KQueryKeywords[j])==0)
sl@0
   299
			return EQuery;
sl@0
   300
		}
sl@0
   301
	return EUnknown;
sl@0
   302
	}
sl@0
   303
sl@0
   304
TInt TSqlStatement::Execute(TDbTextComparison aTextComparison,RDbRowSet::TAccess aAccess,TBool aWindow) const
sl@0
   305
//
sl@0
   306
// executes the sql statement
sl@0
   307
//
sl@0
   308
	{
sl@0
   309
	TInt r=KErrNone;
sl@0
   310
	switch (SqlType())
sl@0
   311
		{
sl@0
   312
	case EDDL:
sl@0
   313
	case EDML:
sl@0
   314
		ExecuteSql(aTextComparison);
sl@0
   315
		break;
sl@0
   316
	case EQuery:
sl@0
   317
		ExecuteQuery(aAccess,aWindow);
sl@0
   318
		break;
sl@0
   319
	case EUnknown:
sl@0
   320
	default:
sl@0
   321
		r=KErrNotFound;
sl@0
   322
		break;
sl@0
   323
		}
sl@0
   324
	return r;
sl@0
   325
	}
sl@0
   326
sl@0
   327
sl@0
   328
//
sl@0
   329
// class TScript
sl@0
   330
//
sl@0
   331
sl@0
   332
TScript::TScript()
sl@0
   333
	: iLineNo(0)
sl@0
   334
	{
sl@0
   335
	RFile file;
sl@0
   336
	TInt r=file.Open(TheFs,KScriptFile,EFileRead);
sl@0
   337
#ifndef __TOOLS2__
sl@0
   338
	if (r!=KErrNone)
sl@0
   339
		r=file.Open(TheFs,KRomScriptFile,EFileRead);
sl@0
   340
#endif
sl@0
   341
	test(r==KErrNone);
sl@0
   342
	iInput.Set(file);
sl@0
   343
sl@0
   344
#ifdef __TOOLS2__
sl@0
   345
	RFile file2;
sl@0
   346
	test(file2.Replace(TheFs,KOutputFile,EFileWrite)==KErrNone);
sl@0
   347
	iFile = file2;
sl@0
   348
	iOutput.Set(file2);
sl@0
   349
#else
sl@0
   350
	test(file.Replace(TheFs,KOutputFile,EFileWrite)==KErrNone);
sl@0
   351
	iOutput.Set(file);
sl@0
   352
#endif
sl@0
   353
	}
sl@0
   354
sl@0
   355
inline TInt TScript::LineNo() const
sl@0
   356
	{return iLineNo;}
sl@0
   357
sl@0
   358
TBool TScript::IsStatement()
sl@0
   359
//
sl@0
   360
//	checks for keywords which possibly conform to the usual statement format (ie end in ';')
sl@0
   361
//
sl@0
   362
	{
sl@0
   363
	if (iLine.Remainder().Length()==0)	// null statement
sl@0
   364
		return ETrue;
sl@0
   365
	TPtrC line=iLine.Remainder();
sl@0
   366
	TKeyword keyword=Keyword(line);
sl@0
   367
	switch (keyword)
sl@0
   368
		{
sl@0
   369
	case EPrint: 
sl@0
   370
	case ERows:
sl@0
   371
	case EBuild:
sl@0
   372
	case EError:
sl@0
   373
	case EQuery:
sl@0
   374
	case ENormal:
sl@0
   375
	case EFolded:
sl@0
   376
	case ECollated:
sl@0
   377
	case EStart:
sl@0
   378
	case EStop:
sl@0
   379
	case ELoad:
sl@0
   380
	case EEcho:
sl@0
   381
	case EWindow:
sl@0
   382
	case EAccess:
sl@0
   383
	case EUnknown:						// could be sql
sl@0
   384
		return ETrue;
sl@0
   385
	case EComment:
sl@0
   386
	case EPopulate:
sl@0
   387
	case ECompare:
sl@0
   388
	case EResults:
sl@0
   389
		iStatement=line;				// not a statement, so make it the whole line
sl@0
   390
		return EFalse;
sl@0
   391
	default:
sl@0
   392
		test(0);
sl@0
   393
		return EFalse;
sl@0
   394
		}
sl@0
   395
	}
sl@0
   396
sl@0
   397
TInt TScript::ReadNextStatement()
sl@0
   398
//
sl@0
   399
// reads the next non-blank statement or line
sl@0
   400
//
sl@0
   401
	{
sl@0
   402
	TInt r=ReadNextLine();
sl@0
   403
	if (r!=KErrNone || !IsStatement())
sl@0
   404
		return r;
sl@0
   405
	TChar c=0;
sl@0
   406
	while (c!=';')
sl@0
   407
		{
sl@0
   408
		c=iLine.Get();
sl@0
   409
		if (!c)							// nothing left to read
sl@0
   410
			{
sl@0
   411
			r=AppendNextLine();
sl@0
   412
			if (r!=KErrNone)
sl@0
   413
				return r;
sl@0
   414
			}
sl@0
   415
		}
sl@0
   416
	iLine.UnGet();						// the semi-colon
sl@0
   417
	iStatement=iLine.MarkedToken();
sl@0
   418
	iLine.Get();						// the semi-colon
sl@0
   419
	iLine.SkipSpaceAndMark();
sl@0
   420
	return KErrNone;
sl@0
   421
	}
sl@0
   422
sl@0
   423
TPtrC TScript::Statement()
sl@0
   424
	{
sl@0
   425
	return iStatement.Remainder();
sl@0
   426
	}
sl@0
   427
sl@0
   428
void TScript::ConsumeLine()
sl@0
   429
	{
sl@0
   430
	iLine=TPtrC();
sl@0
   431
	iStatement=TPtrC();
sl@0
   432
	}
sl@0
   433
sl@0
   434
void TScript::ConsumeStatement()
sl@0
   435
	{
sl@0
   436
	iLine=iLine.Remainder();
sl@0
   437
	iStatement=TPtrC();
sl@0
   438
	}
sl@0
   439
sl@0
   440
TInt TScript::ReadNextLine()
sl@0
   441
//
sl@0
   442
// reads the next non-blank line into iLine
sl@0
   443
//
sl@0
   444
	{
sl@0
   445
	while (iLine.Remainder().Length()==0)
sl@0
   446
		{
sl@0
   447
		TInt r=iInput.Read(iBuf);
sl@0
   448
		if (r!=KErrNone)
sl@0
   449
			return r;
sl@0
   450
		if (iBuf.Length()>0 && iBuf[0]==0xfeff)	// unicode stream marker
sl@0
   451
			iBuf.Delete(0,1);
sl@0
   452
		iLineNo++;
sl@0
   453
		iLine=iBuf;
sl@0
   454
		iLine.SkipSpaceAndMark();
sl@0
   455
		} 
sl@0
   456
	return KErrNone;
sl@0
   457
	}
sl@0
   458
sl@0
   459
TInt TScript::AppendNextLine()
sl@0
   460
//
sl@0
   461
// adds next line from file to iLine
sl@0
   462
//
sl@0
   463
	{
sl@0
   464
	TScriptLine line;
sl@0
   465
	do {
sl@0
   466
		TInt r=iInput.Read(line);
sl@0
   467
		if (r!=KErrNone)
sl@0
   468
			return r;
sl@0
   469
		iLineNo++;
sl@0
   470
		} while (line.Length()==0);
sl@0
   471
	iBuf=iLine.MarkedToken();
sl@0
   472
	iBuf.Append(line);
sl@0
   473
	iLine=iBuf;
sl@0
   474
	return KErrNone;
sl@0
   475
	}
sl@0
   476
sl@0
   477
void TScript::WriteError(const TDesC& aLine)
sl@0
   478
	{
sl@0
   479
	TScriptLine line;
sl@0
   480
	line.Format(_L("Error at line %d: %S\n"),iLineNo,&aLine);
sl@0
   481
	WriteLine(line);
sl@0
   482
	test.Printf(line);
sl@0
   483
	}
sl@0
   484
sl@0
   485
void TScript::WriteSqlError(const TResults& aResults,const TDesC& aLine)
sl@0
   486
	{
sl@0
   487
	TScriptLine line;
sl@0
   488
	line.Format(_L("Error at line %d: %S :-\n"),aResults.iLineNo,&aLine);
sl@0
   489
	WriteLine(line);
sl@0
   490
	test.Printf(line);
sl@0
   491
	line.Format(_L("\t%S\n"),&aResults.iLine);
sl@0
   492
	WriteLine(line);
sl@0
   493
	test.Printf(line);
sl@0
   494
	}
sl@0
   495
sl@0
   496
void TScript::WriteLine(const TDesC& aLine)
sl@0
   497
	{
sl@0
   498
	TScriptLine l=aLine;
sl@0
   499
	l.Append('\r');
sl@0
   500
	iOutput.Write(l);
sl@0
   501
	}
sl@0
   502
sl@0
   503
void TScript::WriteComment(const TDesC& aLine)
sl@0
   504
	{
sl@0
   505
	TScriptLine line;	
sl@0
   506
	line.Format(_L("\n%S"),&aLine);
sl@0
   507
	WriteLine(line);
sl@0
   508
	}
sl@0
   509
sl@0
   510
TInt TScript::IntValue()
sl@0
   511
//
sl@0
   512
// returns the integer n from the ' = n ' which must follow in the statement
sl@0
   513
//
sl@0
   514
	{
sl@0
   515
	TScriptToken keyword;
sl@0
   516
	GetNextTokenFromStatement(keyword);
sl@0
   517
	if (keyword.Compare(_L("="))!=0)
sl@0
   518
		WriteError(_L("expected '=' missing"));
sl@0
   519
	iStatement.SkipSpaceAndMark();
sl@0
   520
	TInt num=0;
sl@0
   521
	TInt err=iStatement.Val(num);
sl@0
   522
	if (err!=KErrNone)
sl@0
   523
		WriteError(_L("expected number missing"));
sl@0
   524
	return num;
sl@0
   525
	}
sl@0
   526
sl@0
   527
TKeyword TScript::Keyword(const TDesC& aKeyword) const
sl@0
   528
	{
sl@0
   529
	for (TInt ii=0; ii<ENumKeywords; ++ii)
sl@0
   530
		{
sl@0
   531
		if (aKeyword.FindF(KScriptKeywords[ii])==0)
sl@0
   532
			return TKeyword(ii);
sl@0
   533
		}
sl@0
   534
	return EUnknown;
sl@0
   535
	}
sl@0
   536
sl@0
   537
void TScript::GetNextTokenFromStatement(TDes& aToken)
sl@0
   538
//
sl@0
   539
// gets the next token from iStatement
sl@0
   540
//
sl@0
   541
	{
sl@0
   542
	iStatement.SkipSpaceAndMark();
sl@0
   543
	TUint c;
sl@0
   544
	do
sl@0
   545
		{
sl@0
   546
		c=iStatement.Get();
sl@0
   547
		if (c=='=' || c=='!')
sl@0
   548
			break;
sl@0
   549
		} while (iStatement.Peek().IsAlphaDigit());
sl@0
   550
	aToken=iStatement.MarkedToken();
sl@0
   551
	iStatement.SkipSpaceAndMark();
sl@0
   552
	}
sl@0
   553
sl@0
   554
void TScript::GetNextTokenFromLine(TDes& aToken)
sl@0
   555
//
sl@0
   556
// gets the next token from iLine
sl@0
   557
//
sl@0
   558
	{
sl@0
   559
	iLine.SkipSpaceAndMark();
sl@0
   560
	TUint c=0;
sl@0
   561
	TChar cc=c;
sl@0
   562
	TBool literal=EFalse;
sl@0
   563
	do
sl@0
   564
		{
sl@0
   565
		c=iLine.Get();
sl@0
   566
		if (!c)
sl@0
   567
			{
sl@0
   568
			AppendNextLine();
sl@0
   569
			iLine.SkipSpaceAndMark();
sl@0
   570
			c=iLine.Get();
sl@0
   571
			}
sl@0
   572
		if (c=='\'' || c=='#')
sl@0
   573
			literal=!literal;
sl@0
   574
		if ((c==',' || c=='(' || c==')' || c=='{' || c=='}' || c=='!' ) && !literal)
sl@0
   575
			break;
sl@0
   576
		cc=iLine.Peek();
sl@0
   577
		} while (cc.IsAlphaDigit() || literal || TUint(cc)=='.' || TUint(cc)=='+' || TUint(cc)=='-');
sl@0
   578
	aToken=iLine.MarkedToken();
sl@0
   579
	if (TUint(cc)==';')					// ignore semi-colons - they're optional
sl@0
   580
		iLine.Get();
sl@0
   581
	iLine.SkipSpaceAndMark();
sl@0
   582
	if (c=='!')
sl@0
   583
		{
sl@0
   584
		iStatement=iLine.Remainder();
sl@0
   585
		TPtrC comment=iStatement.Remainder();
sl@0
   586
		WriteComment(comment); 
sl@0
   587
		iLine=TPtrC();
sl@0
   588
		GetNextTokenFromLine(aToken);
sl@0
   589
		}
sl@0
   590
	}
sl@0
   591
sl@0
   592
sl@0
   593
//
sl@0
   594
// class TScriptEngine
sl@0
   595
//
sl@0
   596
sl@0
   597
TScriptEngine::TScriptEngine()
sl@0
   598
	: iTextComparison(EDbCompareNormal),iTimer(iScript),iEcho(EFalse),iWindow(EFalse),iAccess(RDbRowSet::EReadOnly)
sl@0
   599
	{} 
sl@0
   600
sl@0
   601
sl@0
   602
void TScriptEngine::RunL() 
sl@0
   603
//
sl@0
   604
// runs the script file
sl@0
   605
//
sl@0
   606
	{
sl@0
   607
	while (iScript.ReadNextStatement()!=KErrEof)
sl@0
   608
		ExecuteL();
sl@0
   609
	TestForNoError(); 
sl@0
   610
	}
sl@0
   611
sl@0
   612
void TScriptEngine::TestForNoError() 
sl@0
   613
	{
sl@0
   614
	if (iResults.iError!=KErrNone)
sl@0
   615
		{
sl@0
   616
		TScriptLine line;
sl@0
   617
		line.Format(_L("unexpected error %d"),iResults.iError);
sl@0
   618
		FatalSqlError(line);
sl@0
   619
		}
sl@0
   620
	}
sl@0
   621
sl@0
   622
void TScriptEngine::ExecuteL()
sl@0
   623
	{
sl@0
   624
	if (ExecuteScriptL()!=KErrNone && ExecuteSql()!=KErrNone)
sl@0
   625
		FatalSqlError(_L("syntax error"));
sl@0
   626
	}
sl@0
   627
sl@0
   628
TInt TScriptEngine::ExecuteScriptL()
sl@0
   629
	{
sl@0
   630
	TKeyword keyword=iScript.Keyword(iScript.Statement());
sl@0
   631
	if (keyword!=EError)
sl@0
   632
		TestForNoError(); 
sl@0
   633
	switch (keyword)
sl@0
   634
		{
sl@0
   635
	case EPrint:	
sl@0
   636
		DoPrintL();
sl@0
   637
		break;
sl@0
   638
	case ERows:
sl@0
   639
		DoRows();
sl@0
   640
		break;
sl@0
   641
	case ELoad:
sl@0
   642
		DoLoadDb();
sl@0
   643
		break;
sl@0
   644
	case EEcho:
sl@0
   645
		DoEcho();
sl@0
   646
		break;
sl@0
   647
	case EWindow:
sl@0
   648
		DoWindow();
sl@0
   649
		break;
sl@0
   650
	case EAccess:
sl@0
   651
		DoAccess();
sl@0
   652
		break;
sl@0
   653
	case ECompare:
sl@0
   654
		DoCompareL();
sl@0
   655
		break;
sl@0
   656
	case EError:
sl@0
   657
		DoError();
sl@0
   658
		break;
sl@0
   659
	case EPopulate:
sl@0
   660
		DoPopulate();
sl@0
   661
		break;
sl@0
   662
	case EComment:
sl@0
   663
		DoComment();
sl@0
   664
		break;
sl@0
   665
	case EResults:
sl@0
   666
		DoResultsL();
sl@0
   667
		break;
sl@0
   668
	case EBuild:
sl@0
   669
		DoBuildTable();
sl@0
   670
		break;
sl@0
   671
	case EQuery:
sl@0
   672
		DoQuery();
sl@0
   673
		break;
sl@0
   674
	case ENormal:
sl@0
   675
	case EFolded:
sl@0
   676
	case ECollated:
sl@0
   677
		DoTextComparison(keyword);
sl@0
   678
		break;
sl@0
   679
	case EStart:
sl@0
   680
		DoStartTimer();
sl@0
   681
		break;
sl@0
   682
	case EStop:
sl@0
   683
		DoStopTimer();
sl@0
   684
		break;
sl@0
   685
	case EUnknown:
sl@0
   686
	default:
sl@0
   687
		return KErrNotFound;
sl@0
   688
		}
sl@0
   689
	return KErrNone;
sl@0
   690
	}
sl@0
   691
sl@0
   692
TInt TScriptEngine::ExecuteSql()
sl@0
   693
	{
sl@0
   694
	return ExecuteSql(iScript.Statement());
sl@0
   695
	}
sl@0
   696
sl@0
   697
TInt TScriptEngine::ExecuteSql(const TDesC& aSql)
sl@0
   698
	{
sl@0
   699
	if (iEcho)
sl@0
   700
		{
sl@0
   701
		TScriptLine line(_L("\nSQL:\t"));
sl@0
   702
		line.Append(aSql);
sl@0
   703
		iScript.WriteLine(line);
sl@0
   704
		}
sl@0
   705
	iResults.iLineNo=iScript.LineNo();
sl@0
   706
	iResults.iLine=aSql;
sl@0
   707
	TSqlStatement statement(aSql,iResults);
sl@0
   708
	return statement.Execute(iTextComparison,iAccess,iWindow);
sl@0
   709
	}
sl@0
   710
sl@0
   711
void TScriptEngine::DoStartTimer()
sl@0
   712
	{
sl@0
   713
	// test its right function
sl@0
   714
	TScriptToken keyword;
sl@0
   715
	iScript.GetNextTokenFromStatement(keyword);
sl@0
   716
	test(keyword.CompareF(_L("START"))==0);
sl@0
   717
	iScript.GetNextTokenFromStatement(keyword);
sl@0
   718
	test(keyword.CompareF(_L("TIMER"))==0);
sl@0
   719
	//
sl@0
   720
	iTimer.Start(_L("Timer started"));
sl@0
   721
	}
sl@0
   722
sl@0
   723
void TScriptEngine::DoStopTimer()
sl@0
   724
	{
sl@0
   725
	// test its right function
sl@0
   726
	TScriptToken keyword;
sl@0
   727
	iScript.GetNextTokenFromStatement(keyword);
sl@0
   728
	test(keyword.CompareF(_L("STOP"))==0);
sl@0
   729
	iScript.GetNextTokenFromStatement(keyword);
sl@0
   730
	test(keyword.CompareF(_L("TIMER"))==0);
sl@0
   731
	//
sl@0
   732
	iTimer.Stop(_L("Timer stopped"));
sl@0
   733
	}
sl@0
   734
sl@0
   735
void TScriptEngine::DoTextComparison(TKeyword aKeyword)
sl@0
   736
	{
sl@0
   737
	TPtrC line;
sl@0
   738
	switch (aKeyword)
sl@0
   739
		{
sl@0
   740
	case ENormal:
sl@0
   741
		iTextComparison=EDbCompareNormal;
sl@0
   742
		line.Set(_L("[Normal text comparison]"));
sl@0
   743
		break;
sl@0
   744
	case EFolded:
sl@0
   745
		iTextComparison=EDbCompareFolded;
sl@0
   746
		line.Set(_L("[Folded text comparison]"));
sl@0
   747
		break;
sl@0
   748
	case ECollated:
sl@0
   749
		iTextComparison=EDbCompareCollated;
sl@0
   750
		line.Set(_L("[Collated text comparison]"));
sl@0
   751
		break;
sl@0
   752
	default:
sl@0
   753
		test(0);
sl@0
   754
		}
sl@0
   755
	iScript.WriteLine(line);
sl@0
   756
	}
sl@0
   757
sl@0
   758
void TScriptEngine::DoComment()
sl@0
   759
	{
sl@0
   760
	// test its right function
sl@0
   761
	TScriptToken keyword;
sl@0
   762
	iScript.GetNextTokenFromStatement(keyword);
sl@0
   763
	test(keyword.CompareF(_L("!"))==0);
sl@0
   764
	//
sl@0
   765
	TPtrC comment=iScript.Statement();
sl@0
   766
	iScript.WriteComment(comment);
sl@0
   767
	iScript.ConsumeLine();
sl@0
   768
	}
sl@0
   769
sl@0
   770
void TScriptEngine::DoError()
sl@0
   771
	{
sl@0
   772
	// test its right function
sl@0
   773
	TScriptToken keyword;
sl@0
   774
	iScript.GetNextTokenFromStatement(keyword);
sl@0
   775
	test(keyword.CompareF(_L("ERROR"))==0);
sl@0
   776
	//
sl@0
   777
	TScriptLine line;
sl@0
   778
	if (iScript.Statement().Length()==0)
sl@0
   779
		{
sl@0
   780
		if (iResults.iError>=0)
sl@0
   781
			FatalSqlError(_L("no error when one was expected"));
sl@0
   782
		line=_L("\t\tERROR OK");
sl@0
   783
		}
sl@0
   784
	else
sl@0
   785
		{
sl@0
   786
		TInt err=iScript.IntValue();
sl@0
   787
		if (iResults.iError!=err)
sl@0
   788
			{
sl@0
   789
			line.Format(_L("expected error %d, actual error %d"),err,iResults.iError);
sl@0
   790
			FatalSqlError(line);
sl@0
   791
			}
sl@0
   792
		line.Format(_L("\t\tERROR=%D OK"),err);
sl@0
   793
		}
sl@0
   794
	iResults.iError=0;
sl@0
   795
	iScript.WriteLine(line);
sl@0
   796
	}
sl@0
   797
sl@0
   798
void TScriptEngine::DoRows()
sl@0
   799
	{
sl@0
   800
	// test its right function
sl@0
   801
	TScriptToken keyword;
sl@0
   802
	iScript.GetNextTokenFromStatement(keyword);
sl@0
   803
	test(keyword.CompareF(_L("ROWS"))==0);
sl@0
   804
	//
sl@0
   805
	TScriptLine line;
sl@0
   806
	TInt rows=iScript.IntValue();
sl@0
   807
	if (iResults.iRows!=rows)
sl@0
   808
		{
sl@0
   809
		line.Format(_L("expected rows %d, actual rows %d"),rows,iResults.iRows);
sl@0
   810
		FatalSqlError(line);
sl@0
   811
		}
sl@0
   812
	line.Format(_L("\t\tROWS=%D OK"),rows);
sl@0
   813
	iScript.WriteLine(line);
sl@0
   814
	}
sl@0
   815
sl@0
   816
void TScriptEngine::DoLoadDb()
sl@0
   817
	{
sl@0
   818
	// test its right function
sl@0
   819
	TScriptToken token;
sl@0
   820
	iScript.GetNextTokenFromStatement(token);
sl@0
   821
	test(token.CompareF(_L("LOAD"))==0);
sl@0
   822
	//
sl@0
   823
	TFileName database(iScript.Statement());
sl@0
   824
	TheDatabase.Close();
sl@0
   825
sl@0
   826
	TInt err = TheCrcChecker.GenerateCrcL(KTestDatabase);
sl@0
   827
	test(err==KErrNone);
sl@0
   828
sl@0
   829
	TScriptLine line;
sl@0
   830
	line.Format(_L("Opening database: %S"),&database);
sl@0
   831
	iScript.WriteLine(line);
sl@0
   832
	test(TheDatabase.Open(TheFs,database)==KErrNone);
sl@0
   833
	}
sl@0
   834
sl@0
   835
void TScriptEngine::DoEcho()
sl@0
   836
	{
sl@0
   837
	// test its right function
sl@0
   838
	TScriptToken keyword;
sl@0
   839
	iScript.GetNextTokenFromStatement(keyword);
sl@0
   840
	test(keyword.CompareF(_L("ECHO"))==0);
sl@0
   841
	//
sl@0
   842
	iScript.GetNextTokenFromStatement(keyword);
sl@0
   843
	if (keyword.CompareF(_L("OFF"))==0)
sl@0
   844
		{
sl@0
   845
		iEcho=EFalse;
sl@0
   846
		iScript.WriteLine(_L("Echo is off"));
sl@0
   847
		}
sl@0
   848
	else if (keyword.CompareF(_L("ON"))==0)
sl@0
   849
		{
sl@0
   850
		iEcho=ETrue;
sl@0
   851
		iScript.WriteLine(_L("Echo is on"));
sl@0
   852
		}
sl@0
   853
	else
sl@0
   854
		FatalError(_L("Expected ON|OFF to follow ECHO statement"));
sl@0
   855
	}
sl@0
   856
sl@0
   857
void TScriptEngine::DoWindow()
sl@0
   858
	{
sl@0
   859
	// test its right function
sl@0
   860
	TScriptToken keyword;
sl@0
   861
	iScript.GetNextTokenFromStatement(keyword);
sl@0
   862
	test(keyword.CompareF(_L("WINDOW"))==0);
sl@0
   863
	//
sl@0
   864
	iScript.GetNextTokenFromStatement(keyword);
sl@0
   865
	if (keyword.CompareF(_L("OFF"))==0)
sl@0
   866
		{
sl@0
   867
		iWindow=EFalse;
sl@0
   868
		iScript.WriteLine(_L("Window is off"));
sl@0
   869
		}
sl@0
   870
	else if (keyword.CompareF(_L("ON"))==0)
sl@0
   871
		{
sl@0
   872
		iWindow=ETrue;
sl@0
   873
		iScript.WriteLine(_L("Window is on"));
sl@0
   874
		}
sl@0
   875
	else
sl@0
   876
		FatalError(_L("Expected ON|OFF to follow WINDOW statement"));
sl@0
   877
	}
sl@0
   878
sl@0
   879
void TScriptEngine::DoAccess()
sl@0
   880
	{
sl@0
   881
	// test its right function
sl@0
   882
	TScriptToken keyword;
sl@0
   883
	iScript.GetNextTokenFromStatement(keyword);
sl@0
   884
	test(keyword.CompareF(_L("ACCESS"))==0);
sl@0
   885
	//
sl@0
   886
	iScript.GetNextTokenFromStatement(keyword);
sl@0
   887
	if (keyword.CompareF(_L("UPDATE"))==0)
sl@0
   888
		{
sl@0
   889
		iAccess=RDbRowSet::EUpdatable;
sl@0
   890
		iScript.WriteLine(_L("Access is updateable"));
sl@0
   891
		}
sl@0
   892
	else if (keyword.CompareF(_L("READ"))==0)
sl@0
   893
		{
sl@0
   894
		iAccess=RDbRowSet::EReadOnly;
sl@0
   895
		iScript.WriteLine(_L("Access is read only"));
sl@0
   896
		}
sl@0
   897
	else if (keyword.CompareF(_L("INSERT"))==0)
sl@0
   898
		{
sl@0
   899
		iAccess=RDbRowSet::EInsertOnly;
sl@0
   900
		iScript.WriteLine(_L("Access is insert only"));
sl@0
   901
		}
sl@0
   902
	else
sl@0
   903
		FatalError(_L("Expected UPDATE|INSERT|READ to follow ACCESS statement"));
sl@0
   904
	}
sl@0
   905
sl@0
   906
void TScriptEngine::DoResultsL()
sl@0
   907
	{
sl@0
   908
	// test its right function
sl@0
   909
	TScriptToken token;
sl@0
   910
	iScript.GetNextTokenFromLine(token);
sl@0
   911
	test(token.CompareF(_L("RESULTS"))==0);
sl@0
   912
	//
sl@0
   913
	iScript.GetNextTokenFromLine(token);
sl@0
   914
	if (token.Compare(_L("{"))!=0)		
sl@0
   915
		FatalError(_L("missing '{'"));
sl@0
   916
	iScript.GetNextTokenFromLine(token);					// first value
sl@0
   917
	TLex value;
sl@0
   918
	RDbRowSet& rowset=iResults.iView;
sl@0
   919
	CDbColSet* colset=rowset.ColSetL();
sl@0
   920
	CleanupStack::PushL(colset);
sl@0
   921
	TDbColNo colno=colset->ColNo(KRowIdColName);
sl@0
   922
	CArrayFixFlat<TInt>* rowIdScript=new CArrayFixFlat<TInt>(4);
sl@0
   923
	CleanupStack::PushL(rowIdScript);
sl@0
   924
	CArrayFixFlat<TInt>* rowIdView=new CArrayFixFlat<TInt>(4);
sl@0
   925
	CleanupStack::PushL(rowIdView);
sl@0
   926
	rowset.BeginningL();
sl@0
   927
	while (rowset.NextL())				
sl@0
   928
		{
sl@0
   929
		rowset.GetL();
sl@0
   930
		TUint rIdScript;
sl@0
   931
		value=token;
sl@0
   932
		if (value.Val(rIdScript)!=KErrNone)
sl@0
   933
			{
sl@0
   934
			TScriptLine line;
sl@0
   935
			line.Format(_L("Unable to extract row id from \"%S\""),&token);
sl@0
   936
			FatalError(line);
sl@0
   937
			}
sl@0
   938
		TUint rIdView=rowset.ColUint(colno);
sl@0
   939
		rowIdScript->AppendL(rIdScript);
sl@0
   940
		rowIdView->AppendL(rIdView);
sl@0
   941
		iScript.GetNextTokenFromLine(token);			
sl@0
   942
		if (token.Compare(_L(","))==0 || token.Compare(_L("}"))==0)
sl@0
   943
			{
sl@0
   944
			if (rowIdScript->Count())
sl@0
   945
				{
sl@0
   946
				TKeyArrayFix key(0,ECmpTInt);
sl@0
   947
				rowIdScript->Sort(key);
sl@0
   948
				rowIdView->Sort(key);
sl@0
   949
				for (TInt ii=0;ii<rowIdScript->Count();++ii)
sl@0
   950
					{
sl@0
   951
					TInt expectedId=(*rowIdScript)[ii];
sl@0
   952
					TInt actualId=(*rowIdView)[ii];
sl@0
   953
					if (actualId!=expectedId)
sl@0
   954
						{
sl@0
   955
						TScriptLine line;
sl@0
   956
						line.Format(_L("expected row id %d, actual row id %d"),actualId,expectedId);
sl@0
   957
						FatalError(line);
sl@0
   958
						}
sl@0
   959
					}
sl@0
   960
				rowIdScript->Reset();
sl@0
   961
				rowIdView->Reset();
sl@0
   962
				}
sl@0
   963
			if (token.Compare(_L(","))==0)
sl@0
   964
				iScript.GetNextTokenFromLine(token);
sl@0
   965
			}
sl@0
   966
		}
sl@0
   967
	if (token.Compare(_L("}"))!=0)
sl@0
   968
		FatalError(_L("too many results expected"));
sl@0
   969
	CleanupStack::PopAndDestroy(3);	// arrays + colset
sl@0
   970
	iScript.ConsumeStatement();
sl@0
   971
	}
sl@0
   972
sl@0
   973
void TScriptEngine::DoBuildTable()
sl@0
   974
//
sl@0
   975
// same as Sql create statement, but adds a counter
sl@0
   976
//
sl@0
   977
	{
sl@0
   978
	// test its right function
sl@0
   979
	TScriptToken keyword;
sl@0
   980
	iScript.GetNextTokenFromStatement(keyword);
sl@0
   981
	test(keyword.CompareF(_L("BUILD"))==0);
sl@0
   982
	//
sl@0
   983
	TScriptLine sql(_L("CREATE "));
sl@0
   984
	sql.Append(iScript.Statement());
sl@0
   985
	TInt pos=sql.Find(_L("("));
sl@0
   986
	sql.Insert(++pos,_L("Rw COUNTER,"));
sl@0
   987
	iScript.ConsumeStatement();
sl@0
   988
	ExecuteSql(sql);
sl@0
   989
	}
sl@0
   990
sl@0
   991
void TScriptEngine::DoQuery()
sl@0
   992
//
sl@0
   993
// same as Sql select statement, but makes sure counter is included
sl@0
   994
//
sl@0
   995
	{
sl@0
   996
	// test its right function
sl@0
   997
	TScriptToken keyword;
sl@0
   998
	iScript.GetNextTokenFromStatement(keyword);
sl@0
   999
	test(keyword.CompareF(_L("QUERY"))==0);
sl@0
  1000
	//
sl@0
  1001
	TScriptLine sql(iScript.Statement());
sl@0
  1002
	if (sql.Find(_L("*"))!=0)
sl@0
  1003
		{
sl@0
  1004
		sql.Insert(0,_L(","));
sl@0
  1005
		sql.Insert(0,KRowIdColName);
sl@0
  1006
		}
sl@0
  1007
	sql.Insert(0,_L("SELECT "));
sl@0
  1008
	iScript.ConsumeStatement();
sl@0
  1009
	ExecuteSql(sql);
sl@0
  1010
	}
sl@0
  1011
sl@0
  1012
void TScriptEngine::FatalError(const TDesC& aLine)
sl@0
  1013
	{
sl@0
  1014
	iScript.WriteError(aLine);
sl@0
  1015
	test(0);
sl@0
  1016
	}
sl@0
  1017
sl@0
  1018
void TScriptEngine::FatalError()
sl@0
  1019
	{
sl@0
  1020
	FatalError(_L("wrong expected value"));
sl@0
  1021
	}
sl@0
  1022
sl@0
  1023
void TScriptEngine::FatalSqlError(const TDesC& aLine)
sl@0
  1024
	{
sl@0
  1025
	iScript.WriteSqlError(iResults,aLine);
sl@0
  1026
	test(0);
sl@0
  1027
	}
sl@0
  1028
sl@0
  1029
void TScriptEngine::DoPopulate()
sl@0
  1030
	{
sl@0
  1031
	// check its right function
sl@0
  1032
	TScriptToken token;
sl@0
  1033
	iScript.GetNextTokenFromLine(token);
sl@0
  1034
	test(token.CompareF(_L("POPULATE"))==0);
sl@0
  1035
	//
sl@0
  1036
	TScriptLine sqlbase=_L("INSERT INTO ");
sl@0
  1037
	iScript.GetNextTokenFromLine(token);	// table name
sl@0
  1038
	sqlbase.AppendFormat(_L("%S "),&token);	
sl@0
  1039
	iScript.GetNextTokenFromLine(token);
sl@0
  1040
	if (token.Compare(_L("("))==0)			// optional column names present?
sl@0
  1041
		{			
sl@0
  1042
		for (;;) 							
sl@0
  1043
			{
sl@0
  1044
			sqlbase.AppendFormat(token);
sl@0
  1045
			if (token.Compare(_L(")"))==0)
sl@0
  1046
				break;
sl@0
  1047
			iScript.GetNextTokenFromLine(token);		
sl@0
  1048
			} 
sl@0
  1049
		iScript.GetNextTokenFromLine(token);
sl@0
  1050
		}
sl@0
  1051
	if (token.Compare(_L("{"))!=0)		
sl@0
  1052
		FatalError(_L("missing '{'"));
sl@0
  1053
	sqlbase.AppendFormat(_L(" VALUES ("));
sl@0
  1054
	iScript.GetNextTokenFromLine(token);	// first value
sl@0
  1055
	TheDatabase.Begin();					// all in same transaction
sl@0
  1056
	for (;;)
sl@0
  1057
		{
sl@0
  1058
		if (token.Compare(_L("}"))==0)	
sl@0
  1059
			break;
sl@0
  1060
		TScriptLine sql=sqlbase;
sl@0
  1061
		for (;;)
sl@0
  1062
			{
sl@0
  1063
			sql.Append(token);
sl@0
  1064
			iScript.GetNextTokenFromLine(token);
sl@0
  1065
			if (token.Compare(_L(","))==0)
sl@0
  1066
				{
sl@0
  1067
				sql.Append(token);			// comma
sl@0
  1068
				iScript.GetNextTokenFromLine(token);
sl@0
  1069
				}
sl@0
  1070
			else
sl@0
  1071
				break;
sl@0
  1072
			}
sl@0
  1073
		sql.AppendFormat(_L(")"));
sl@0
  1074
		ExecuteSql(sql);
sl@0
  1075
		TestForNoError();
sl@0
  1076
		}
sl@0
  1077
	TheDatabase.Commit();
sl@0
  1078
	iScript.ConsumeStatement();
sl@0
  1079
	}
sl@0
  1080
sl@0
  1081
void TScriptEngine::DoPrintL() 
sl@0
  1082
	{
sl@0
  1083
	// check its right function
sl@0
  1084
	TScriptToken keyword;
sl@0
  1085
	iScript.GetNextTokenFromStatement(keyword);
sl@0
  1086
	test(keyword.CompareF(_L("PRINT"))==0);
sl@0
  1087
	//
sl@0
  1088
	iScript.GetNextTokenFromStatement(keyword);
sl@0
  1089
	if (keyword.CompareF(_L("VIEW"))==0)
sl@0
  1090
		PrintL(iResults.iView);
sl@0
  1091
	else if (keyword.CompareF(_L("TABLE"))==0)
sl@0
  1092
		{
sl@0
  1093
		iScript.GetNextTokenFromStatement(keyword);	// name of table
sl@0
  1094
		RDbTable table;
sl@0
  1095
		TInt err=table.Open(TheDatabase,keyword,table.EReadOnly);
sl@0
  1096
		if (err!=KErrNone)
sl@0
  1097
			FatalError(_L("unable to open table"));
sl@0
  1098
		PrintL(table);
sl@0
  1099
		table.Close();
sl@0
  1100
		}
sl@0
  1101
	else
sl@0
  1102
		FatalError(_L("expected VIEW or TABLE keyword not present"));
sl@0
  1103
	}
sl@0
  1104
sl@0
  1105
void TScriptEngine::DoCompareL() 
sl@0
  1106
	{
sl@0
  1107
	// check its right function
sl@0
  1108
	TScriptToken keyword;
sl@0
  1109
	iScript.GetNextTokenFromLine(keyword);
sl@0
  1110
	test(keyword.CompareF(_L("COMPARE"))==0);
sl@0
  1111
	//
sl@0
  1112
	iScript.GetNextTokenFromLine(keyword);
sl@0
  1113
	if (keyword.CompareF(_L("VIEW"))==0)
sl@0
  1114
		CompareL(iResults.iView);
sl@0
  1115
	else if (keyword.CompareF(_L("TABLE"))==0)
sl@0
  1116
		{
sl@0
  1117
		iScript.GetNextTokenFromLine(keyword);	// name of table
sl@0
  1118
		RDbTable table;
sl@0
  1119
		TInt err=table.Open(TheDatabase,keyword,table.EReadOnly);
sl@0
  1120
		if (err!=KErrNone)
sl@0
  1121
			FatalError(_L("unable to open table"));
sl@0
  1122
		CompareL(table);
sl@0
  1123
		table.Close();
sl@0
  1124
		}
sl@0
  1125
	else
sl@0
  1126
		FatalError(_L("expected VIEW or TABLE keyword not present"));
sl@0
  1127
	}
sl@0
  1128
sl@0
  1129
void TScriptEngine::CompareL(RDbRowSet& aRowSet) 
sl@0
  1130
	{
sl@0
  1131
	TScriptToken token;
sl@0
  1132
	iScript.GetNextTokenFromLine(token);
sl@0
  1133
	TBool rowIdMode=EFalse;
sl@0
  1134
	CArrayFixFlat<TInt>* rowIdToTest=new CArrayFixFlat<TInt>(4);
sl@0
  1135
	CleanupStack::PushL(rowIdToTest);
sl@0
  1136
	if (token.Compare(_L("("))==0)				// optional row ids present?
sl@0
  1137
		{
sl@0
  1138
		rowIdMode=ETrue;
sl@0
  1139
		iScript.GetNextTokenFromLine(token);	// first value
sl@0
  1140
		TLex value;
sl@0
  1141
		TInt rowId;
sl@0
  1142
		for (;;) 							
sl@0
  1143
			{
sl@0
  1144
			value=token;
sl@0
  1145
			test (value.Val(rowId)==KErrNone);
sl@0
  1146
			rowIdToTest->AppendL(rowId);		// add row id to array
sl@0
  1147
			iScript.GetNextTokenFromLine(token);
sl@0
  1148
			if (token.Compare(_L(")"))==0)
sl@0
  1149
				break;
sl@0
  1150
			if (token.Compare(_L(","))==0)
sl@0
  1151
				iScript.GetNextTokenFromLine(token);					
sl@0
  1152
			} 
sl@0
  1153
		iScript.GetNextTokenFromLine(token);
sl@0
  1154
		}
sl@0
  1155
	if (token.Compare(_L("{"))!=0)		
sl@0
  1156
		FatalError(_L("missing '{'"));
sl@0
  1157
	TInt columns=aRowSet.ColCount();
sl@0
  1158
	CDbColSet* colset=aRowSet.ColSetL();
sl@0
  1159
	aRowSet.BeginningL();
sl@0
  1160
	while (aRowSet.NextL())
sl@0
  1161
		{
sl@0
  1162
		aRowSet.GetL();
sl@0
  1163
		if (rowIdMode)
sl@0
  1164
			{
sl@0
  1165
			TInt currentId=aRowSet.ColUint(colset->ColNo(KRowIdColName));
sl@0
  1166
			TBool toTest=EFalse;
sl@0
  1167
			for (TInt jj=0; jj<rowIdToTest->Count(); ++jj)
sl@0
  1168
				{
sl@0
  1169
				if (currentId==(*rowIdToTest)[jj])
sl@0
  1170
					toTest=ETrue;
sl@0
  1171
				}
sl@0
  1172
			if (!toTest)
sl@0
  1173
				continue;
sl@0
  1174
			}
sl@0
  1175
		for (TInt ii=1;ii<=columns;++ii)
sl@0
  1176
			{
sl@0
  1177
			if (rowIdMode && ii==colset->ColNo(KRowIdColName))	// ignore row id column
sl@0
  1178
				continue;
sl@0
  1179
			const TDbCol& col=(*colset)[ii];
sl@0
  1180
			iScript.GetNextTokenFromLine(token);				// value
sl@0
  1181
			if (token.Compare(_L(","))==0)
sl@0
  1182
				iScript.GetNextTokenFromLine(token);			// ignore comma
sl@0
  1183
			if (aRowSet.IsColNull(ii))
sl@0
  1184
				{
sl@0
  1185
				if (token.CompareF(_L("NULL"))!=0)
sl@0
  1186
					FatalError(_L("NULL expected"));
sl@0
  1187
				continue;
sl@0
  1188
				}
sl@0
  1189
			CompareValues(aRowSet,ii,col.iType,token); 
sl@0
  1190
			}
sl@0
  1191
		}
sl@0
  1192
	delete colset;
sl@0
  1193
	CleanupStack::PopAndDestroy();				// rowIdToTest
sl@0
  1194
	iScript.GetNextTokenFromLine(token);		// look for closing '}'
sl@0
  1195
	if (token.Compare(_L("}"))!=0)		
sl@0
  1196
		FatalError(_L("missing '}'"));
sl@0
  1197
	iScript.ConsumeStatement();
sl@0
  1198
	}
sl@0
  1199
sl@0
  1200
void TScriptEngine::CompareValues(RDbRowSet& aRowSet,TDbColNo ColNo,TDbColType aType,const TDesC& aToken) 
sl@0
  1201
//
sl@0
  1202
// compares the value from a rowset aRowset, colimn number aColNo and of type aType, with the value
sl@0
  1203
// contained in the descriptor aToken
sl@0
  1204
//
sl@0
  1205
	{
sl@0
  1206
	TLex value=aToken;
sl@0
  1207
	switch (aType)
sl@0
  1208
		{
sl@0
  1209
	case EDbColInt32:
sl@0
  1210
		{
sl@0
  1211
		TInt num;
sl@0
  1212
		test (value.Val(num)==KErrNone);
sl@0
  1213
		if (num!=aRowSet.ColInt(ColNo))
sl@0
  1214
			FatalError();
sl@0
  1215
		break;
sl@0
  1216
		}
sl@0
  1217
	case EDbColInt8:
sl@0
  1218
		{
sl@0
  1219
		TInt8 num8;
sl@0
  1220
		test (value.Val(num8)==KErrNone);
sl@0
  1221
		if (num8!=aRowSet.ColInt8(ColNo))
sl@0
  1222
			FatalError();
sl@0
  1223
		break;
sl@0
  1224
		}
sl@0
  1225
	case EDbColInt16:
sl@0
  1226
		{
sl@0
  1227
		TInt16 num16;
sl@0
  1228
		test (value.Val(num16)==KErrNone);
sl@0
  1229
		if (num16!=aRowSet.ColInt16(ColNo))
sl@0
  1230
			FatalError();
sl@0
  1231
		break;
sl@0
  1232
		}
sl@0
  1233
	case EDbColInt64:
sl@0
  1234
		{
sl@0
  1235
		TInt64 num64;
sl@0
  1236
		test (value.Val(num64)==KErrNone);
sl@0
  1237
		if (num64!=aRowSet.ColInt64(ColNo))
sl@0
  1238
			FatalError();
sl@0
  1239
		break;
sl@0
  1240
		}
sl@0
  1241
	case EDbColUint8:
sl@0
  1242
		{
sl@0
  1243
		TUint8 numu8;
sl@0
  1244
		test (value.Val(numu8,EDecimal)==KErrNone);
sl@0
  1245
		if (numu8!=aRowSet.ColUint8(ColNo))
sl@0
  1246
			FatalError();
sl@0
  1247
		break;
sl@0
  1248
		}
sl@0
  1249
	case EDbColUint16:
sl@0
  1250
		{
sl@0
  1251
		TUint16 numu16;
sl@0
  1252
		test (value.Val(numu16,EDecimal)==KErrNone);
sl@0
  1253
		if (numu16!=aRowSet.ColUint16(ColNo))
sl@0
  1254
			FatalError();
sl@0
  1255
		break;
sl@0
  1256
		}
sl@0
  1257
	case EDbColUint32:
sl@0
  1258
		{
sl@0
  1259
		TUint32 numu32;
sl@0
  1260
		test (value.Val(numu32,EDecimal)==KErrNone);
sl@0
  1261
		if (numu32!=aRowSet.ColUint32(ColNo))
sl@0
  1262
			FatalError();
sl@0
  1263
		break;
sl@0
  1264
		}
sl@0
  1265
	case EDbColReal32:
sl@0
  1266
		{
sl@0
  1267
		TReal32 numr32;
sl@0
  1268
		test (value.Val(numr32)==KErrNone);
sl@0
  1269
		if (numr32!=aRowSet.ColReal32(ColNo))
sl@0
  1270
			FatalError();
sl@0
  1271
		break;
sl@0
  1272
		}
sl@0
  1273
	case EDbColReal64:
sl@0
  1274
		{
sl@0
  1275
		TReal64 numr64;
sl@0
  1276
		test (value.Val(numr64)==KErrNone);
sl@0
  1277
		if (numr64!=aRowSet.ColReal64(ColNo))
sl@0
  1278
			FatalError();
sl@0
  1279
		break;
sl@0
  1280
		}
sl@0
  1281
	case EDbColText8:
sl@0
  1282
	case EDbColText16:
sl@0
  1283
		{
sl@0
  1284
		TPtrC text=aToken.Mid(1,aToken.Length()-2);			// skip quotes
sl@0
  1285
		if (text.CompareF(aRowSet.ColDes(ColNo))!=0)
sl@0
  1286
			FatalError();
sl@0
  1287
		break;
sl@0
  1288
		}
sl@0
  1289
	case EDbColDateTime:
sl@0
  1290
		{
sl@0
  1291
		TScriptLine time=aToken.Mid(1,aToken.Length()-2);	// skip hashes
sl@0
  1292
		TTime t1;
sl@0
  1293
		t1.Parse(time);
sl@0
  1294
		TTime t2(aRowSet.ColTime(ColNo).DateTime());
sl@0
  1295
		if (t1!=t2)
sl@0
  1296
			FatalError();
sl@0
  1297
		break;
sl@0
  1298
		}
sl@0
  1299
	default:
sl@0
  1300
		break;
sl@0
  1301
		}
sl@0
  1302
	}
sl@0
  1303
sl@0
  1304
void TScriptEngine::PrintL(RDbRowSet& aRowSet) 
sl@0
  1305
	{
sl@0
  1306
	iScript.WriteLine(TPtrC());
sl@0
  1307
	TInt columns=aRowSet.ColCount();	
sl@0
  1308
	CDbColSet* colset=aRowSet.ColSetL();
sl@0
  1309
	TScriptLine line;
sl@0
  1310
	for (TInt i=1;i<=columns;++i)
sl@0
  1311
		{
sl@0
  1312
		const TDbCol& col=(*colset)[i];
sl@0
  1313
		line.AppendFormat(_L("%S\t"),&col.iName);
sl@0
  1314
		}
sl@0
  1315
	iScript.WriteLine(line);
sl@0
  1316
	aRowSet.BeginningL();
sl@0
  1317
	while (aRowSet.NextL())
sl@0
  1318
		{
sl@0
  1319
		line=TPtrC();
sl@0
  1320
		for (TInt ii=1;ii<=columns;++ii)
sl@0
  1321
			{
sl@0
  1322
			const TDbCol& col=(*colset)[ii];
sl@0
  1323
			aRowSet.GetL();
sl@0
  1324
			if (aRowSet.IsColNull(ii))
sl@0
  1325
				{
sl@0
  1326
				line.AppendFormat(_L("NULL\t"));
sl@0
  1327
				continue;
sl@0
  1328
				}
sl@0
  1329
			switch (col.iType)
sl@0
  1330
				{
sl@0
  1331
			case EDbColInt32:
sl@0
  1332
				line.AppendFormat(_L("%d\t"),aRowSet.ColInt(ii));
sl@0
  1333
				break;
sl@0
  1334
			case EDbColInt8:
sl@0
  1335
				line.AppendFormat(_L("%d\t"),aRowSet.ColInt8(ii));
sl@0
  1336
				break;
sl@0
  1337
			case EDbColInt16:
sl@0
  1338
				line.AppendFormat(_L("%d\t"),aRowSet.ColInt16(ii));
sl@0
  1339
				break;
sl@0
  1340
			case EDbColInt64:
sl@0
  1341
				line.AppendFormat(_L("%ld\t"),aRowSet.ColInt64(ii));
sl@0
  1342
				break;
sl@0
  1343
			case EDbColUint8:
sl@0
  1344
				line.AppendFormat(_L("%u\t"),aRowSet.ColUint8(ii));
sl@0
  1345
				break;
sl@0
  1346
			case EDbColUint16:
sl@0
  1347
				line.AppendFormat(_L("%u\t"),aRowSet.ColUint16(ii));
sl@0
  1348
				break;
sl@0
  1349
			case EDbColUint32:
sl@0
  1350
				line.AppendFormat(_L("%u\t"),aRowSet.ColUint(ii));
sl@0
  1351
				break;
sl@0
  1352
			case EDbColReal32:
sl@0
  1353
				line.AppendFormat(_L("%f\t"),aRowSet.ColReal32(ii));
sl@0
  1354
				break;
sl@0
  1355
			case EDbColReal64:
sl@0
  1356
				line.AppendFormat(_L("%f\t"),aRowSet.ColReal64(ii));
sl@0
  1357
				break;
sl@0
  1358
			case EDbColText:
sl@0
  1359
				line.Append(aRowSet.ColDes(ii));
sl@0
  1360
				line.Append('\t');
sl@0
  1361
				break;
sl@0
  1362
			case EDbColDateTime:
sl@0
  1363
				{
sl@0
  1364
				TDateTime time(aRowSet.ColTime(ii).DateTime());
sl@0
  1365
				line.AppendFormat(_L("%d:%d:%d %d/%d/%d"),time.Hour(),time.Minute(),time.Second(),time.Day(),time.Month(),time.Year());
sl@0
  1366
				}	
sl@0
  1367
				break;
sl@0
  1368
			case EDbColLongText:
sl@0
  1369
				{
sl@0
  1370
				RDbColReadStream blob;
sl@0
  1371
				blob.OpenLC(aRowSet,ii);
sl@0
  1372
				TScriptLine text;
sl@0
  1373
				blob.ReadL(text,aRowSet.ColLength(ii));
sl@0
  1374
				CleanupStack::PopAndDestroy();
sl@0
  1375
				line.AppendFormat(_L("%S\t"),&text);
sl@0
  1376
				}
sl@0
  1377
			default:
sl@0
  1378
				break;
sl@0
  1379
				}
sl@0
  1380
			}
sl@0
  1381
		iScript.WriteLine(line);
sl@0
  1382
		}
sl@0
  1383
	iScript.WriteLine(TPtrC());
sl@0
  1384
	delete colset;
sl@0
  1385
	}
sl@0
  1386
sl@0
  1387
sl@0
  1388
LOCAL_C void CreateDatabaseL()
sl@0
  1389
//
sl@0
  1390
// Create the database
sl@0
  1391
//
sl@0
  1392
	{
sl@0
  1393
	test(TheDatabase.Replace(TheFs,KTestDatabase)==KErrNone);
sl@0
  1394
	}
sl@0
  1395
sl@0
  1396
LOCAL_C void CloseDatabase()
sl@0
  1397
//
sl@0
  1398
// Close the database
sl@0
  1399
//
sl@0
  1400
	{
sl@0
  1401
	TheDatabase.Close();
sl@0
  1402
sl@0
  1403
	TInt err = TheCrcChecker.GenerateCrcL(KTestDatabase);
sl@0
  1404
	test(err==KErrNone);
sl@0
  1405
	}
sl@0
  1406
sl@0
  1407
LOCAL_C void SetupTestDirectory()
sl@0
  1408
//
sl@0
  1409
// Prepare the test directory.
sl@0
  1410
//
sl@0
  1411
    {
sl@0
  1412
	TInt err=TheFs.Connect();
sl@0
  1413
	test(err==KErrNone);
sl@0
  1414
//
sl@0
  1415
	err=TheFs.MkDir(KTestDatabase);
sl@0
  1416
	test(err==KErrNone || err==KErrAlreadyExists);
sl@0
  1417
	}
sl@0
  1418
sl@0
  1419
LOCAL_C void SetupCleanup()
sl@0
  1420
//
sl@0
  1421
// Initialise the cleanup stack.
sl@0
  1422
//
sl@0
  1423
    {
sl@0
  1424
	TheTrapCleanup=CTrapCleanup::New();
sl@0
  1425
	test(TheTrapCleanup!=NULL);
sl@0
  1426
	TRAPD(err,\
sl@0
  1427
		{\
sl@0
  1428
		for (TInt i=KTestCleanupStack;i>0;i--)\
sl@0
  1429
			CleanupStack::PushL((TAny*)0);\
sl@0
  1430
		CleanupStack::Pop(KTestCleanupStack);\
sl@0
  1431
		});
sl@0
  1432
	test(err==KErrNone);
sl@0
  1433
	}
sl@0
  1434
sl@0
  1435
/**
sl@0
  1436
@SYMTestCaseID          SYSLIB-DBMS-CT-0632
sl@0
  1437
@SYMTestCaseDesc        Executes the script files
sl@0
  1438
@SYMTestPriority        Medium
sl@0
  1439
@SYMTestActions         Start the script engine 
sl@0
  1440
@SYMTestExpectedResults Test must not fail
sl@0
  1441
@SYMREQ                 REQ0000
sl@0
  1442
*/
sl@0
  1443
LOCAL_C void RunScriptL()
sl@0
  1444
	{
sl@0
  1445
	test.Start(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0632 Running script "));
sl@0
  1446
	CreateDatabaseL();
sl@0
  1447
	TScriptEngine script;
sl@0
  1448
	script.RunL();
sl@0
  1449
	CloseDatabase();
sl@0
  1450
	TheView.Close();
sl@0
  1451
	}
sl@0
  1452
sl@0
  1453
LOCAL_C void DeleteDataFile(const TDesC& aFullName)
sl@0
  1454
	{
sl@0
  1455
	RFs fsSession;
sl@0
  1456
	TInt err = fsSession.Connect();
sl@0
  1457
	if(err == KErrNone)
sl@0
  1458
		{
sl@0
  1459
		TEntry entry;
sl@0
  1460
		if(fsSession.Entry(aFullName, entry) == KErrNone)
sl@0
  1461
			{
sl@0
  1462
			RDebug::Print(_L("Deleting \"%S\" file.\n"), &aFullName);
sl@0
  1463
			err = fsSession.SetAtt(aFullName, 0, KEntryAttReadOnly);
sl@0
  1464
			if(err != KErrNone) 
sl@0
  1465
				{
sl@0
  1466
				RDebug::Print(_L("Error %d changing \"%S\" file attributes.\n"), err, &aFullName);
sl@0
  1467
				}
sl@0
  1468
			err = fsSession.Delete(aFullName);
sl@0
  1469
			if(err != KErrNone) 
sl@0
  1470
				{
sl@0
  1471
				RDebug::Print(_L("Error %d deleting \"%S\" file.\n"), err, &aFullName);
sl@0
  1472
				}
sl@0
  1473
			}
sl@0
  1474
		fsSession.Close();
sl@0
  1475
		}
sl@0
  1476
	else
sl@0
  1477
		{
sl@0
  1478
		RDebug::Print(_L("Error %d connecting file session. File: %S.\n"), err, &aFullName);
sl@0
  1479
		}
sl@0
  1480
	}
sl@0
  1481
sl@0
  1482
GLDEF_C TInt E32Main()
sl@0
  1483
    {
sl@0
  1484
	test.Title();
sl@0
  1485
	SetupTestDirectory();
sl@0
  1486
	SetupCleanup();
sl@0
  1487
	__UHEAP_MARK;
sl@0
  1488
//
sl@0
  1489
	TRAPD(err,RunScriptL());
sl@0
  1490
	test(err==KErrNone);
sl@0
  1491
sl@0
  1492
	//deletion of data files must be done before call to end - DEF047652
sl@0
  1493
	::DeleteDataFile(KTestDatabase);
sl@0
  1494
	::DeleteDataFile(KOutputFile);//Comment this line if you want topo keep t_script.log file.	
sl@0
  1495
	
sl@0
  1496
sl@0
  1497
#ifndef __linux__
sl@0
  1498
#ifndef __TOOLS2__ 
sl@0
  1499
	TRAPD(lc, err = TheCrcChecker.DumpCrcRecordsL(KCrcRecord));
sl@0
  1500
	test(err==KErrNone);
sl@0
  1501
	test(lc==KErrNone);
sl@0
  1502
#else
sl@0
  1503
	TRAPD(lc, err = TheCrcChecker.ValidateCrcRecordsL(KCrcRecord));
sl@0
  1504
	TPtrC errmsg;
sl@0
  1505
	TheCrcChecker.ErrorReportL(err, errmsg);
sl@0
  1506
	RDebug::Print(errmsg);
sl@0
  1507
	test(err==KErrNone || err==TDBMS_CRCChecks::ECrcCheckOk);
sl@0
  1508
#endif
sl@0
  1509
#endif
sl@0
  1510
	
sl@0
  1511
	test.End();
sl@0
  1512
//
sl@0
  1513
	__UHEAP_MARKEND;
sl@0
  1514
sl@0
  1515
	delete TheTrapCleanup;
sl@0
  1516
sl@0
  1517
	TheFs.Close();
sl@0
  1518
	test.Close();
sl@0
  1519
sl@0
  1520
	return 0;
sl@0
  1521
    }