diff -r 000000000000 -r 08ec8eefde2f persistentstorage/sql/SRC/Server/SqlSrvCheckStatement.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/persistentstorage/sql/SRC/Server/SqlSrvCheckStatement.cpp Fri Jan 22 11:06:30 2010 +0200 @@ -0,0 +1,88 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#include +#include "SqlSrvStrings.h" + +_LIT(KCreateSql, "CREATE"); +_LIT(KIndexSql, "INDEX"); +_LIT(KIfSql, "IF"); +_LIT(KNotSql, "NOT"); +_LIT(KExistsSql, "EXISTS"); +_LIT(KDotSql, "."); + + +/** +Determines whether the specified string is an SQL statement that is supported as a config operation. +Currently only 'CREATE INDEX' SQL statements are supported. If necessary adds qualifyed DB name to index name. + +@param aStatementIn The string to be checked to determine if it is a supported SQL statement +@param aDbName Logical database name: "main" for the main database or attached database name +@param aStatementOut Output parameter. Buffer for the constructed statement (if the statement is supported). + +@return True if the aStatementIn statement is supported, aStatementOut will contain the zero-terminated + aStatementIn statement with the database name in it, if aDbName is a name of an attached database +*/ +TBool IsStatementSupported(const TDesC& aStatementIn, const TDesC& aDbName, TDes& aStatementOut) + { + //'CREATE INDEX' is the only statement currently supported. + //We must allow for whitespace between the 'CREATE' and the 'INDEX' + TLex stmtParser(aStatementIn); + TPtrC firstToken = stmtParser.NextToken(); // extract the first token of the statement + if(firstToken.CompareF(KCreateSql()) != 0) + { + return EFalse; + } + //The first token is 'CREATE', now skip any whitespace between + //it and the next token and ensure that the next token is 'INDEX' + TPtrC secondToken = stmtParser.NextToken(); // skip any whitespace and extract the next token + if(secondToken.CompareF(KIndexSql()) != 0) + { + return EFalse; + } + //The second token is 'INDEX' + TPtrC curToken = stmtParser.NextToken(); + // skip optional [IF NOT EXISTS] + if(curToken.CompareF(KIfSql()) == 0) + { + curToken.Set(stmtParser.NextToken()); + if(curToken.CompareF(KNotSql()) != 0) + { + return EFalse; + } + curToken.Set(stmtParser.NextToken()); + if(curToken.CompareF(KExistsSql()) != 0) + { + return EFalse; + } + curToken.Set(stmtParser.NextToken()); + } + // we got '[database-name.]index-name' + if(curToken.Find(KDotSql)==KErrNotFound && aDbName.CompareF(KMainDb16) != 0) // just index-name + { + // Add DB name prefix before table name in the case of CREATE INDEX + aStatementOut.Copy(aStatementIn.Ptr(), curToken.Ptr()-aStatementIn.Ptr()); + aStatementOut.Append(aDbName); + aStatementOut.Append(KDotSql); + aStatementOut.Append(curToken); + aStatementOut.Append(stmtParser.Remainder()); + } + else + { + aStatementOut.Copy(aStatementIn); + } + aStatementOut.Append(TChar(0)); // SQLite requires statements to be zero-terminated + return ETrue; + }