Update contrib.
1 // Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
2 // All rights reserved.
3 // This component and the accompanying materials are made available
4 // under the terms of "Eclipse Public License v1.0"
5 // which accompanies this distribution, and is available
6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
8 // Initial Contributors:
9 // Nokia Corporation - initial contribution.
25 #undef __UHEAP_MARKEND
26 #define __UHEAP_MARKEND
28 LOCAL_D TDBMS_CRCChecks TheCrcChecker;
30 #ifndef __linux__ //No CRC test on LINUX
32 const TPtrC KCrcRecord=_L("\\epoc32\\winscw\\c\\dbms-tst\\T_DBMSSCRIPT.CRC");
34 const TPtrC KCrcRecord=_L("C:\\dbms-tst\\T_DBMSSCRIPT.CRC");
38 LOCAL_D RTest test(_L("T_DBMSSCRIPT"));
39 LOCAL_D CTrapCleanup* TheTrapCleanup;
40 LOCAL_D RDbNamedDatabase TheDatabase;
42 LOCAL_D RDbView TheView;
46 const TPtrC KTestDatabase=_L(".\\dbms-tst\\t_script.db");
48 const TPtrC KTestDatabase=_L("C:\\dbms-tst\\t_script.db");
51 const TPtrC KRomScriptFile=_L("z:\\test\\t_script.txt");
54 const TPtrC KScriptFile=_L("c:\\dbms-tst\\t_script.txt");
56 const TPtrC KScriptFile=_L(".\\dbms-tst\\t_script.txt");
60 const TPtrC KOutputFile=_L("c:\\dbms-tst\\t_script.log");
62 const TPtrC KOutputFile=_L(".\\dbms-tst\\t_script.log");
65 const TInt KTestCleanupStack=0x20;
66 const TPtrC KDDLKeywords[]={_L("CREATE"),_L("DROP"),_L("ALTER")};
67 const TPtrC KDMLKeywords[]={_L("INSERT"),_L("DELETE"),_L("UPDATE")};
68 const TPtrC KQueryKeywords[]={_L("SELECT")};
69 const TPtrC KScriptKeywords[]={_L("PRINT"),_L("ROWS"),_L("COMPARE"),_L("ERROR"),_L("!"),
70 _L("POPULATE"),_L("RESULTS"),_L("BUILD"),_L("QUERY"),
71 _L("NORMAL"),_L("FOLDED"),_L("COLLATED"),_L("START"),_L("STOP"),
72 _L("LOAD"),_L("ECHO"),_L("WINDOW"),_L("ACCESS")};
73 const TPtrC KRowIdColName=_L("Rw");
74 enum TKeyword {EPrint,ERows,ECompare,EError,EComment,EPopulate,EResults,EBuild,EQuery,ENormal,
75 EFolded,ECollated,EStart,EStop,ELoad,EEcho,EWindow,EAccess,ENumKeywords,EUnknown};
77 typedef TBuf<256> TScriptLine;
78 typedef TBuf<256> TScriptToken;
80 #define ARRAY_SIZE(array) (sizeof(array)/sizeof(array[0]))
86 inline TTimer(TScript& aScript);
87 void Start(const TDesC& aDes);
88 void Stop(const TDesC& aDes);
109 enum TSqlType {EDML,EDDL,EQuery,EUnknown};
111 inline TSqlStatement(const TDesC& aSql,TResults& aResults);
112 TInt Execute(TDbTextComparison aTextComparison=EDbCompareNormal,
113 RDbRowSet::TAccess aAccess=RDbRowSet::EReadOnly,TBool aWindow=EFalse) const;
115 void ExecuteSql(TDbTextComparison aTextComparison) const;
116 void ExecuteQuery(RDbRowSet::TAccess aAccess,TBool aWindow) const;
117 TSqlType SqlType() const;
128 ~TScript() { iFile.Close(); };
130 TInt ReadNextStatement();
131 void GetNextTokenFromStatement(TDes& aToken);
132 void GetNextTokenFromLine(TDes& aToken);
135 void WriteLine(const TDesC& aLine);
136 void WriteError(const TDesC& aLine);
137 void WriteSqlError(const TResults& aResults,const TDesC& aLine);
138 void WriteComment(const TDesC& aLine);
139 TKeyword Keyword(const TDesC& aKeyword) const;
141 void ConsumeStatement();
142 inline TInt LineNo() const;
145 TInt AppendNextLine();
162 inline TScriptEngine();
166 TInt ExecuteScriptL();
167 TInt ExecuteSql(const TDesC& aSql);
169 // keyword operations
182 void DoTextComparison(TKeyword aKeyword);
187 void PrintL(RDbRowSet& aRowSet);
188 void CompareL(RDbRowSet& aRowSet);
189 void CompareValues(RDbRowSet& aRowSet,TDbColNo ColNo,TDbColType aType,const TDesC& aToken);
190 void FatalError(const TDesC& aLine);
192 void FatalSqlError(const TDesC& aLine);
193 void TestForNoError();
197 TDbTextComparison iTextComparison;
201 RDbRowSet::TAccess iAccess;
209 inline TTimer::TTimer(TScript& aScript)
213 void TTimer::Start(const TDesC& aDes)
216 line.Format(_L("%S: "),&aDes);
217 iScript.WriteLine(line);
218 iTicks=User::TickCount();
221 void TTimer::Stop(const TDesC& aDes)
224 line.Format(_L("%S: "),&aDes);
226 #define TICK_TIME 15625
228 #define TICK_TIME 100000
230 TInt microSec=(User::TickCount()-iTicks)*TICK_TIME;
231 TUint sec=microSec/1000000;
232 TUint centi=(microSec/10000)-sec*100;
233 line.AppendFormat(_L("%u.%02us\n"),sec,centi);
234 iScript.WriteLine(line);
241 inline TResults::TResults()
242 : iView(TheView),iError(KErrNone)
247 // class TSqlStatement
250 inline TSqlStatement::TSqlStatement(const TDesC& aSql,TResults& aResults)
251 : iSql(aSql),iResults(aResults)
254 void TSqlStatement::ExecuteSql(TDbTextComparison aTextComparison) const
256 // executes DML or DDL
259 TInt r=TheDatabase.Execute(iSql,aTextComparison);
264 iResults.iError=KErrNone;
269 void TSqlStatement::ExecuteQuery(RDbRowSet::TAccess aAccess,TBool aWindow) const
271 iResults.iView.Close(); // discard any previous queries
272 TInt& err=iResults.iError;
274 err=iResults.iView.Prepare(TheDatabase,iSql,KDbUnlimitedWindow,aAccess);
276 err=iResults.iView.Prepare(TheDatabase,iSql,aAccess);
278 err=iResults.iView.EvaluateAll();
281 TSqlStatement::TSqlType TSqlStatement::SqlType() const
283 // determines the type of sql statement by matching keywords
286 for (TUint i=0;i<ARRAY_SIZE(KDDLKeywords);++i)
288 if (iSql.FindF(KDDLKeywords[i])==0)
291 for (TUint ii=0;ii<ARRAY_SIZE(KDMLKeywords);++ii)
293 if (iSql.FindF(KDMLKeywords[ii])==0)
296 for (TUint j=0;j<ARRAY_SIZE(KQueryKeywords);++j)
298 if (iSql.FindF(KQueryKeywords[j])==0)
304 TInt TSqlStatement::Execute(TDbTextComparison aTextComparison,RDbRowSet::TAccess aAccess,TBool aWindow) const
306 // executes the sql statement
314 ExecuteSql(aTextComparison);
317 ExecuteQuery(aAccess,aWindow);
336 TInt r=file.Open(TheFs,KScriptFile,EFileRead);
339 r=file.Open(TheFs,KRomScriptFile,EFileRead);
346 test(file2.Replace(TheFs,KOutputFile,EFileWrite)==KErrNone);
350 test(file.Replace(TheFs,KOutputFile,EFileWrite)==KErrNone);
355 inline TInt TScript::LineNo() const
358 TBool TScript::IsStatement()
360 // checks for keywords which possibly conform to the usual statement format (ie end in ';')
363 if (iLine.Remainder().Length()==0) // null statement
365 TPtrC line=iLine.Remainder();
366 TKeyword keyword=Keyword(line);
383 case EUnknown: // could be sql
389 iStatement=line; // not a statement, so make it the whole line
397 TInt TScript::ReadNextStatement()
399 // reads the next non-blank statement or line
402 TInt r=ReadNextLine();
403 if (r!=KErrNone || !IsStatement())
409 if (!c) // nothing left to read
416 iLine.UnGet(); // the semi-colon
417 iStatement=iLine.MarkedToken();
418 iLine.Get(); // the semi-colon
419 iLine.SkipSpaceAndMark();
423 TPtrC TScript::Statement()
425 return iStatement.Remainder();
428 void TScript::ConsumeLine()
434 void TScript::ConsumeStatement()
436 iLine=iLine.Remainder();
440 TInt TScript::ReadNextLine()
442 // reads the next non-blank line into iLine
445 while (iLine.Remainder().Length()==0)
447 TInt r=iInput.Read(iBuf);
450 if (iBuf.Length()>0 && iBuf[0]==0xfeff) // unicode stream marker
454 iLine.SkipSpaceAndMark();
459 TInt TScript::AppendNextLine()
461 // adds next line from file to iLine
466 TInt r=iInput.Read(line);
470 } while (line.Length()==0);
471 iBuf=iLine.MarkedToken();
477 void TScript::WriteError(const TDesC& aLine)
480 line.Format(_L("Error at line %d: %S\n"),iLineNo,&aLine);
485 void TScript::WriteSqlError(const TResults& aResults,const TDesC& aLine)
488 line.Format(_L("Error at line %d: %S :-\n"),aResults.iLineNo,&aLine);
491 line.Format(_L("\t%S\n"),&aResults.iLine);
496 void TScript::WriteLine(const TDesC& aLine)
503 void TScript::WriteComment(const TDesC& aLine)
506 line.Format(_L("\n%S"),&aLine);
510 TInt TScript::IntValue()
512 // returns the integer n from the ' = n ' which must follow in the statement
515 TScriptToken keyword;
516 GetNextTokenFromStatement(keyword);
517 if (keyword.Compare(_L("="))!=0)
518 WriteError(_L("expected '=' missing"));
519 iStatement.SkipSpaceAndMark();
521 TInt err=iStatement.Val(num);
523 WriteError(_L("expected number missing"));
527 TKeyword TScript::Keyword(const TDesC& aKeyword) const
529 for (TInt ii=0; ii<ENumKeywords; ++ii)
531 if (aKeyword.FindF(KScriptKeywords[ii])==0)
537 void TScript::GetNextTokenFromStatement(TDes& aToken)
539 // gets the next token from iStatement
542 iStatement.SkipSpaceAndMark();
547 if (c=='=' || c=='!')
549 } while (iStatement.Peek().IsAlphaDigit());
550 aToken=iStatement.MarkedToken();
551 iStatement.SkipSpaceAndMark();
554 void TScript::GetNextTokenFromLine(TDes& aToken)
556 // gets the next token from iLine
559 iLine.SkipSpaceAndMark();
562 TBool literal=EFalse;
569 iLine.SkipSpaceAndMark();
572 if (c=='\'' || c=='#')
574 if ((c==',' || c=='(' || c==')' || c=='{' || c=='}' || c=='!' ) && !literal)
577 } while (cc.IsAlphaDigit() || literal || TUint(cc)=='.' || TUint(cc)=='+' || TUint(cc)=='-');
578 aToken=iLine.MarkedToken();
579 if (TUint(cc)==';') // ignore semi-colons - they're optional
581 iLine.SkipSpaceAndMark();
584 iStatement=iLine.Remainder();
585 TPtrC comment=iStatement.Remainder();
586 WriteComment(comment);
588 GetNextTokenFromLine(aToken);
594 // class TScriptEngine
597 TScriptEngine::TScriptEngine()
598 : iTextComparison(EDbCompareNormal),iTimer(iScript),iEcho(EFalse),iWindow(EFalse),iAccess(RDbRowSet::EReadOnly)
602 void TScriptEngine::RunL()
604 // runs the script file
607 while (iScript.ReadNextStatement()!=KErrEof)
612 void TScriptEngine::TestForNoError()
614 if (iResults.iError!=KErrNone)
617 line.Format(_L("unexpected error %d"),iResults.iError);
622 void TScriptEngine::ExecuteL()
624 if (ExecuteScriptL()!=KErrNone && ExecuteSql()!=KErrNone)
625 FatalSqlError(_L("syntax error"));
628 TInt TScriptEngine::ExecuteScriptL()
630 TKeyword keyword=iScript.Keyword(iScript.Statement());
677 DoTextComparison(keyword);
692 TInt TScriptEngine::ExecuteSql()
694 return ExecuteSql(iScript.Statement());
697 TInt TScriptEngine::ExecuteSql(const TDesC& aSql)
701 TScriptLine line(_L("\nSQL:\t"));
703 iScript.WriteLine(line);
705 iResults.iLineNo=iScript.LineNo();
707 TSqlStatement statement(aSql,iResults);
708 return statement.Execute(iTextComparison,iAccess,iWindow);
711 void TScriptEngine::DoStartTimer()
713 // test its right function
714 TScriptToken keyword;
715 iScript.GetNextTokenFromStatement(keyword);
716 test(keyword.CompareF(_L("START"))==0);
717 iScript.GetNextTokenFromStatement(keyword);
718 test(keyword.CompareF(_L("TIMER"))==0);
720 iTimer.Start(_L("Timer started"));
723 void TScriptEngine::DoStopTimer()
725 // test its right function
726 TScriptToken keyword;
727 iScript.GetNextTokenFromStatement(keyword);
728 test(keyword.CompareF(_L("STOP"))==0);
729 iScript.GetNextTokenFromStatement(keyword);
730 test(keyword.CompareF(_L("TIMER"))==0);
732 iTimer.Stop(_L("Timer stopped"));
735 void TScriptEngine::DoTextComparison(TKeyword aKeyword)
741 iTextComparison=EDbCompareNormal;
742 line.Set(_L("[Normal text comparison]"));
745 iTextComparison=EDbCompareFolded;
746 line.Set(_L("[Folded text comparison]"));
749 iTextComparison=EDbCompareCollated;
750 line.Set(_L("[Collated text comparison]"));
755 iScript.WriteLine(line);
758 void TScriptEngine::DoComment()
760 // test its right function
761 TScriptToken keyword;
762 iScript.GetNextTokenFromStatement(keyword);
763 test(keyword.CompareF(_L("!"))==0);
765 TPtrC comment=iScript.Statement();
766 iScript.WriteComment(comment);
767 iScript.ConsumeLine();
770 void TScriptEngine::DoError()
772 // test its right function
773 TScriptToken keyword;
774 iScript.GetNextTokenFromStatement(keyword);
775 test(keyword.CompareF(_L("ERROR"))==0);
778 if (iScript.Statement().Length()==0)
780 if (iResults.iError>=0)
781 FatalSqlError(_L("no error when one was expected"));
782 line=_L("\t\tERROR OK");
786 TInt err=iScript.IntValue();
787 if (iResults.iError!=err)
789 line.Format(_L("expected error %d, actual error %d"),err,iResults.iError);
792 line.Format(_L("\t\tERROR=%D OK"),err);
795 iScript.WriteLine(line);
798 void TScriptEngine::DoRows()
800 // test its right function
801 TScriptToken keyword;
802 iScript.GetNextTokenFromStatement(keyword);
803 test(keyword.CompareF(_L("ROWS"))==0);
806 TInt rows=iScript.IntValue();
807 if (iResults.iRows!=rows)
809 line.Format(_L("expected rows %d, actual rows %d"),rows,iResults.iRows);
812 line.Format(_L("\t\tROWS=%D OK"),rows);
813 iScript.WriteLine(line);
816 void TScriptEngine::DoLoadDb()
818 // test its right function
820 iScript.GetNextTokenFromStatement(token);
821 test(token.CompareF(_L("LOAD"))==0);
823 TFileName database(iScript.Statement());
826 TInt err = TheCrcChecker.GenerateCrcL(KTestDatabase);
830 line.Format(_L("Opening database: %S"),&database);
831 iScript.WriteLine(line);
832 test(TheDatabase.Open(TheFs,database)==KErrNone);
835 void TScriptEngine::DoEcho()
837 // test its right function
838 TScriptToken keyword;
839 iScript.GetNextTokenFromStatement(keyword);
840 test(keyword.CompareF(_L("ECHO"))==0);
842 iScript.GetNextTokenFromStatement(keyword);
843 if (keyword.CompareF(_L("OFF"))==0)
846 iScript.WriteLine(_L("Echo is off"));
848 else if (keyword.CompareF(_L("ON"))==0)
851 iScript.WriteLine(_L("Echo is on"));
854 FatalError(_L("Expected ON|OFF to follow ECHO statement"));
857 void TScriptEngine::DoWindow()
859 // test its right function
860 TScriptToken keyword;
861 iScript.GetNextTokenFromStatement(keyword);
862 test(keyword.CompareF(_L("WINDOW"))==0);
864 iScript.GetNextTokenFromStatement(keyword);
865 if (keyword.CompareF(_L("OFF"))==0)
868 iScript.WriteLine(_L("Window is off"));
870 else if (keyword.CompareF(_L("ON"))==0)
873 iScript.WriteLine(_L("Window is on"));
876 FatalError(_L("Expected ON|OFF to follow WINDOW statement"));
879 void TScriptEngine::DoAccess()
881 // test its right function
882 TScriptToken keyword;
883 iScript.GetNextTokenFromStatement(keyword);
884 test(keyword.CompareF(_L("ACCESS"))==0);
886 iScript.GetNextTokenFromStatement(keyword);
887 if (keyword.CompareF(_L("UPDATE"))==0)
889 iAccess=RDbRowSet::EUpdatable;
890 iScript.WriteLine(_L("Access is updateable"));
892 else if (keyword.CompareF(_L("READ"))==0)
894 iAccess=RDbRowSet::EReadOnly;
895 iScript.WriteLine(_L("Access is read only"));
897 else if (keyword.CompareF(_L("INSERT"))==0)
899 iAccess=RDbRowSet::EInsertOnly;
900 iScript.WriteLine(_L("Access is insert only"));
903 FatalError(_L("Expected UPDATE|INSERT|READ to follow ACCESS statement"));
906 void TScriptEngine::DoResultsL()
908 // test its right function
910 iScript.GetNextTokenFromLine(token);
911 test(token.CompareF(_L("RESULTS"))==0);
913 iScript.GetNextTokenFromLine(token);
914 if (token.Compare(_L("{"))!=0)
915 FatalError(_L("missing '{'"));
916 iScript.GetNextTokenFromLine(token); // first value
918 RDbRowSet& rowset=iResults.iView;
919 CDbColSet* colset=rowset.ColSetL();
920 CleanupStack::PushL(colset);
921 TDbColNo colno=colset->ColNo(KRowIdColName);
922 CArrayFixFlat<TInt>* rowIdScript=new CArrayFixFlat<TInt>(4);
923 CleanupStack::PushL(rowIdScript);
924 CArrayFixFlat<TInt>* rowIdView=new CArrayFixFlat<TInt>(4);
925 CleanupStack::PushL(rowIdView);
927 while (rowset.NextL())
932 if (value.Val(rIdScript)!=KErrNone)
935 line.Format(_L("Unable to extract row id from \"%S\""),&token);
938 TUint rIdView=rowset.ColUint(colno);
939 rowIdScript->AppendL(rIdScript);
940 rowIdView->AppendL(rIdView);
941 iScript.GetNextTokenFromLine(token);
942 if (token.Compare(_L(","))==0 || token.Compare(_L("}"))==0)
944 if (rowIdScript->Count())
946 TKeyArrayFix key(0,ECmpTInt);
947 rowIdScript->Sort(key);
948 rowIdView->Sort(key);
949 for (TInt ii=0;ii<rowIdScript->Count();++ii)
951 TInt expectedId=(*rowIdScript)[ii];
952 TInt actualId=(*rowIdView)[ii];
953 if (actualId!=expectedId)
956 line.Format(_L("expected row id %d, actual row id %d"),actualId,expectedId);
960 rowIdScript->Reset();
963 if (token.Compare(_L(","))==0)
964 iScript.GetNextTokenFromLine(token);
967 if (token.Compare(_L("}"))!=0)
968 FatalError(_L("too many results expected"));
969 CleanupStack::PopAndDestroy(3); // arrays + colset
970 iScript.ConsumeStatement();
973 void TScriptEngine::DoBuildTable()
975 // same as Sql create statement, but adds a counter
978 // test its right function
979 TScriptToken keyword;
980 iScript.GetNextTokenFromStatement(keyword);
981 test(keyword.CompareF(_L("BUILD"))==0);
983 TScriptLine sql(_L("CREATE "));
984 sql.Append(iScript.Statement());
985 TInt pos=sql.Find(_L("("));
986 sql.Insert(++pos,_L("Rw COUNTER,"));
987 iScript.ConsumeStatement();
991 void TScriptEngine::DoQuery()
993 // same as Sql select statement, but makes sure counter is included
996 // test its right function
997 TScriptToken keyword;
998 iScript.GetNextTokenFromStatement(keyword);
999 test(keyword.CompareF(_L("QUERY"))==0);
1001 TScriptLine sql(iScript.Statement());
1002 if (sql.Find(_L("*"))!=0)
1004 sql.Insert(0,_L(","));
1005 sql.Insert(0,KRowIdColName);
1007 sql.Insert(0,_L("SELECT "));
1008 iScript.ConsumeStatement();
1012 void TScriptEngine::FatalError(const TDesC& aLine)
1014 iScript.WriteError(aLine);
1018 void TScriptEngine::FatalError()
1020 FatalError(_L("wrong expected value"));
1023 void TScriptEngine::FatalSqlError(const TDesC& aLine)
1025 iScript.WriteSqlError(iResults,aLine);
1029 void TScriptEngine::DoPopulate()
1031 // check its right function
1033 iScript.GetNextTokenFromLine(token);
1034 test(token.CompareF(_L("POPULATE"))==0);
1036 TScriptLine sqlbase=_L("INSERT INTO ");
1037 iScript.GetNextTokenFromLine(token); // table name
1038 sqlbase.AppendFormat(_L("%S "),&token);
1039 iScript.GetNextTokenFromLine(token);
1040 if (token.Compare(_L("("))==0) // optional column names present?
1044 sqlbase.AppendFormat(token);
1045 if (token.Compare(_L(")"))==0)
1047 iScript.GetNextTokenFromLine(token);
1049 iScript.GetNextTokenFromLine(token);
1051 if (token.Compare(_L("{"))!=0)
1052 FatalError(_L("missing '{'"));
1053 sqlbase.AppendFormat(_L(" VALUES ("));
1054 iScript.GetNextTokenFromLine(token); // first value
1055 TheDatabase.Begin(); // all in same transaction
1058 if (token.Compare(_L("}"))==0)
1060 TScriptLine sql=sqlbase;
1064 iScript.GetNextTokenFromLine(token);
1065 if (token.Compare(_L(","))==0)
1067 sql.Append(token); // comma
1068 iScript.GetNextTokenFromLine(token);
1073 sql.AppendFormat(_L(")"));
1077 TheDatabase.Commit();
1078 iScript.ConsumeStatement();
1081 void TScriptEngine::DoPrintL()
1083 // check its right function
1084 TScriptToken keyword;
1085 iScript.GetNextTokenFromStatement(keyword);
1086 test(keyword.CompareF(_L("PRINT"))==0);
1088 iScript.GetNextTokenFromStatement(keyword);
1089 if (keyword.CompareF(_L("VIEW"))==0)
1090 PrintL(iResults.iView);
1091 else if (keyword.CompareF(_L("TABLE"))==0)
1093 iScript.GetNextTokenFromStatement(keyword); // name of table
1095 TInt err=table.Open(TheDatabase,keyword,table.EReadOnly);
1097 FatalError(_L("unable to open table"));
1102 FatalError(_L("expected VIEW or TABLE keyword not present"));
1105 void TScriptEngine::DoCompareL()
1107 // check its right function
1108 TScriptToken keyword;
1109 iScript.GetNextTokenFromLine(keyword);
1110 test(keyword.CompareF(_L("COMPARE"))==0);
1112 iScript.GetNextTokenFromLine(keyword);
1113 if (keyword.CompareF(_L("VIEW"))==0)
1114 CompareL(iResults.iView);
1115 else if (keyword.CompareF(_L("TABLE"))==0)
1117 iScript.GetNextTokenFromLine(keyword); // name of table
1119 TInt err=table.Open(TheDatabase,keyword,table.EReadOnly);
1121 FatalError(_L("unable to open table"));
1126 FatalError(_L("expected VIEW or TABLE keyword not present"));
1129 void TScriptEngine::CompareL(RDbRowSet& aRowSet)
1132 iScript.GetNextTokenFromLine(token);
1133 TBool rowIdMode=EFalse;
1134 CArrayFixFlat<TInt>* rowIdToTest=new CArrayFixFlat<TInt>(4);
1135 CleanupStack::PushL(rowIdToTest);
1136 if (token.Compare(_L("("))==0) // optional row ids present?
1139 iScript.GetNextTokenFromLine(token); // first value
1145 test (value.Val(rowId)==KErrNone);
1146 rowIdToTest->AppendL(rowId); // add row id to array
1147 iScript.GetNextTokenFromLine(token);
1148 if (token.Compare(_L(")"))==0)
1150 if (token.Compare(_L(","))==0)
1151 iScript.GetNextTokenFromLine(token);
1153 iScript.GetNextTokenFromLine(token);
1155 if (token.Compare(_L("{"))!=0)
1156 FatalError(_L("missing '{'"));
1157 TInt columns=aRowSet.ColCount();
1158 CDbColSet* colset=aRowSet.ColSetL();
1159 aRowSet.BeginningL();
1160 while (aRowSet.NextL())
1165 TInt currentId=aRowSet.ColUint(colset->ColNo(KRowIdColName));
1166 TBool toTest=EFalse;
1167 for (TInt jj=0; jj<rowIdToTest->Count(); ++jj)
1169 if (currentId==(*rowIdToTest)[jj])
1175 for (TInt ii=1;ii<=columns;++ii)
1177 if (rowIdMode && ii==colset->ColNo(KRowIdColName)) // ignore row id column
1179 const TDbCol& col=(*colset)[ii];
1180 iScript.GetNextTokenFromLine(token); // value
1181 if (token.Compare(_L(","))==0)
1182 iScript.GetNextTokenFromLine(token); // ignore comma
1183 if (aRowSet.IsColNull(ii))
1185 if (token.CompareF(_L("NULL"))!=0)
1186 FatalError(_L("NULL expected"));
1189 CompareValues(aRowSet,ii,col.iType,token);
1193 CleanupStack::PopAndDestroy(); // rowIdToTest
1194 iScript.GetNextTokenFromLine(token); // look for closing '}'
1195 if (token.Compare(_L("}"))!=0)
1196 FatalError(_L("missing '}'"));
1197 iScript.ConsumeStatement();
1200 void TScriptEngine::CompareValues(RDbRowSet& aRowSet,TDbColNo ColNo,TDbColType aType,const TDesC& aToken)
1202 // compares the value from a rowset aRowset, colimn number aColNo and of type aType, with the value
1203 // contained in the descriptor aToken
1212 test (value.Val(num)==KErrNone);
1213 if (num!=aRowSet.ColInt(ColNo))
1220 test (value.Val(num8)==KErrNone);
1221 if (num8!=aRowSet.ColInt8(ColNo))
1228 test (value.Val(num16)==KErrNone);
1229 if (num16!=aRowSet.ColInt16(ColNo))
1236 test (value.Val(num64)==KErrNone);
1237 if (num64!=aRowSet.ColInt64(ColNo))
1244 test (value.Val(numu8,EDecimal)==KErrNone);
1245 if (numu8!=aRowSet.ColUint8(ColNo))
1252 test (value.Val(numu16,EDecimal)==KErrNone);
1253 if (numu16!=aRowSet.ColUint16(ColNo))
1260 test (value.Val(numu32,EDecimal)==KErrNone);
1261 if (numu32!=aRowSet.ColUint32(ColNo))
1268 test (value.Val(numr32)==KErrNone);
1269 if (numr32!=aRowSet.ColReal32(ColNo))
1276 test (value.Val(numr64)==KErrNone);
1277 if (numr64!=aRowSet.ColReal64(ColNo))
1284 TPtrC text=aToken.Mid(1,aToken.Length()-2); // skip quotes
1285 if (text.CompareF(aRowSet.ColDes(ColNo))!=0)
1289 case EDbColDateTime:
1291 TScriptLine time=aToken.Mid(1,aToken.Length()-2); // skip hashes
1294 TTime t2(aRowSet.ColTime(ColNo).DateTime());
1304 void TScriptEngine::PrintL(RDbRowSet& aRowSet)
1306 iScript.WriteLine(TPtrC());
1307 TInt columns=aRowSet.ColCount();
1308 CDbColSet* colset=aRowSet.ColSetL();
1310 for (TInt i=1;i<=columns;++i)
1312 const TDbCol& col=(*colset)[i];
1313 line.AppendFormat(_L("%S\t"),&col.iName);
1315 iScript.WriteLine(line);
1316 aRowSet.BeginningL();
1317 while (aRowSet.NextL())
1320 for (TInt ii=1;ii<=columns;++ii)
1322 const TDbCol& col=(*colset)[ii];
1324 if (aRowSet.IsColNull(ii))
1326 line.AppendFormat(_L("NULL\t"));
1332 line.AppendFormat(_L("%d\t"),aRowSet.ColInt(ii));
1335 line.AppendFormat(_L("%d\t"),aRowSet.ColInt8(ii));
1338 line.AppendFormat(_L("%d\t"),aRowSet.ColInt16(ii));
1341 line.AppendFormat(_L("%ld\t"),aRowSet.ColInt64(ii));
1344 line.AppendFormat(_L("%u\t"),aRowSet.ColUint8(ii));
1347 line.AppendFormat(_L("%u\t"),aRowSet.ColUint16(ii));
1350 line.AppendFormat(_L("%u\t"),aRowSet.ColUint(ii));
1353 line.AppendFormat(_L("%f\t"),aRowSet.ColReal32(ii));
1356 line.AppendFormat(_L("%f\t"),aRowSet.ColReal64(ii));
1359 line.Append(aRowSet.ColDes(ii));
1362 case EDbColDateTime:
1364 TDateTime time(aRowSet.ColTime(ii).DateTime());
1365 line.AppendFormat(_L("%d:%d:%d %d/%d/%d"),time.Hour(),time.Minute(),time.Second(),time.Day(),time.Month(),time.Year());
1368 case EDbColLongText:
1370 RDbColReadStream blob;
1371 blob.OpenLC(aRowSet,ii);
1373 blob.ReadL(text,aRowSet.ColLength(ii));
1374 CleanupStack::PopAndDestroy();
1375 line.AppendFormat(_L("%S\t"),&text);
1381 iScript.WriteLine(line);
1383 iScript.WriteLine(TPtrC());
1388 LOCAL_C void CreateDatabaseL()
1390 // Create the database
1393 test(TheDatabase.Replace(TheFs,KTestDatabase)==KErrNone);
1396 LOCAL_C void CloseDatabase()
1398 // Close the database
1401 TheDatabase.Close();
1403 TInt err = TheCrcChecker.GenerateCrcL(KTestDatabase);
1404 test(err==KErrNone);
1407 LOCAL_C void SetupTestDirectory()
1409 // Prepare the test directory.
1412 TInt err=TheFs.Connect();
1413 test(err==KErrNone);
1415 err=TheFs.MkDir(KTestDatabase);
1416 test(err==KErrNone || err==KErrAlreadyExists);
1419 LOCAL_C void SetupCleanup()
1421 // Initialise the cleanup stack.
1424 TheTrapCleanup=CTrapCleanup::New();
1425 test(TheTrapCleanup!=NULL);
1428 for (TInt i=KTestCleanupStack;i>0;i--)\
1429 CleanupStack::PushL((TAny*)0);\
1430 CleanupStack::Pop(KTestCleanupStack);\
1432 test(err==KErrNone);
1436 @SYMTestCaseID SYSLIB-DBMS-CT-0632
1437 @SYMTestCaseDesc Executes the script files
1438 @SYMTestPriority Medium
1439 @SYMTestActions Start the script engine
1440 @SYMTestExpectedResults Test must not fail
1443 LOCAL_C void RunScriptL()
1445 test.Start(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0632 Running script "));
1447 TScriptEngine script;
1453 LOCAL_C void DeleteDataFile(const TDesC& aFullName)
1456 TInt err = fsSession.Connect();
1460 if(fsSession.Entry(aFullName, entry) == KErrNone)
1462 RDebug::Print(_L("Deleting \"%S\" file.\n"), &aFullName);
1463 err = fsSession.SetAtt(aFullName, 0, KEntryAttReadOnly);
1466 RDebug::Print(_L("Error %d changing \"%S\" file attributes.\n"), err, &aFullName);
1468 err = fsSession.Delete(aFullName);
1471 RDebug::Print(_L("Error %d deleting \"%S\" file.\n"), err, &aFullName);
1478 RDebug::Print(_L("Error %d connecting file session. File: %S.\n"), err, &aFullName);
1482 GLDEF_C TInt E32Main()
1485 SetupTestDirectory();
1489 TRAPD(err,RunScriptL());
1490 test(err==KErrNone);
1492 //deletion of data files must be done before call to end - DEF047652
1493 ::DeleteDataFile(KTestDatabase);
1494 ::DeleteDataFile(KOutputFile);//Comment this line if you want topo keep t_script.log file.
1499 TRAPD(lc, err = TheCrcChecker.DumpCrcRecordsL(KCrcRecord));
1500 test(err==KErrNone);
1503 TRAPD(lc, err = TheCrcChecker.ValidateCrcRecordsL(KCrcRecord));
1505 TheCrcChecker.ErrorReportL(err, errmsg);
1506 RDebug::Print(errmsg);
1507 test(err==KErrNone || err==TDBMS_CRCChecks::ECrcCheckOk);
1515 delete TheTrapCleanup;