commands/sql/sql.cpp
changeset 0 7f656887cf89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commands/sql/sql.cpp	Wed Jun 23 15:52:26 2010 +0100
@@ -0,0 +1,345 @@
+// sql.cpp
+// 
+// Copyright (c) 2010 Accenture. All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the "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:
+// Accenture - Initial contribution
+//
+#include <fshell/common.mmh>
+
+#include <fshell/ioutils.h>
+using namespace IoUtils;
+
+class TResponseLex
+	{
+public:
+	TResponseLex(const TDesC& aResponse);
+	
+	TInt GetIntColon(TInt& aValue);
+	TInt GetStringColon(TPtrC& aValue);
+	TInt GetIntEof(TInt& aValue);
+	TPtrC Remainder();
+private:
+	TPtrC iRemainder;
+	};
+
+class CCmdSqlCli : public CClientBase
+	{
+public:
+/*	
+	static const TDesC* PowerConsumptionToString(TPositionQuality::TPowerConsumption aPower);
+	static void CapabilitiesToString(TPositionModuleInfo::TCapabilities aCap, TDes &aDes);
+*/	
+	void PrintTime(const TTime& aTime, TBool aNewline);	
+	static CCommandBase* NewLC();
+	~CCmdSqlCli();
+private:
+	enum TLineProcessingBehaviour
+		{
+		EIgnoreLines,
+		EProcessLines,
+		};
+	
+	CCmdSqlCli();
+	
+	void ProcessLineL(const TDesC& aLine);
+	TBool MatchLineStart(const TDesC& aPrefix, TPtrC& aRemainder);
+	void ProcessErrorL(const TDesC& aDes);
+	void ProcessFailureL(const TDesC& aDes);
+	void UnrecognizedLineL(const TDesC& aDes);
+	void ProcessAsyncIdL(const TDesC& aDes);
+	void ProcessTimeoutL(const TDesC& aDes);
+	void ProcessResultL(const TDesC& aDes);
+	
+	void ProcessLogL(const TDesC& aDes);
+
+
+private: // From CCommandBase.
+	virtual const TDesC& Name() const;
+	virtual void OptionsL(RCommandOptionList& aOptions);
+	// From CClientBase.
+	virtual void HandleServerResponseL(RPointerArray<HBufC> aLines);		
+	};
+
+///////////////////////////////////////////////////////////////////////////////
+
+_LIT(KPersistentConsoleName, "fshell_sqlsrv");
+_LIT(KSrvExeName, "fshell_sqlsrv");
+_LIT(KNewLine, "\r\n");
+_LIT(KPrompt, "ok\r\n");
+_LIT(KErrorPrefix, "error:");
+_LIT(KFailurePrefix, "failure:");
+_LIT(KAsyncIdPrefix, "id:");
+_LIT(KTimeoutPrefix, "timedout:");
+_LIT(KResultPrefix, "result:");
+_LIT(KLogPrefix, "log:");
+_LIT(KColon, ":");
+
+
+CCommandBase* CCmdSqlCli::NewLC()
+	{
+	CCmdSqlCli* self = new (ELeave)CCmdSqlCli();
+	CleanupStack::PushL(self);
+	self->BaseConstructL();
+	return self;
+	}
+
+CCmdSqlCli::CCmdSqlCli()
+	: CClientBase(0, KSrvExeName, KPersistentConsoleName, KPrompt)
+	{
+	//iActiveWait = new (ELeave) CActiveSchedulerWait;	
+	}
+
+
+CCmdSqlCli::~CCmdSqlCli()
+	{
+	}
+
+//////////////////////////////////////////////////////
+
+
+//////////////////////////////////////////////////////
+
+const TDesC& CCmdSqlCli::Name() const
+	{
+	_LIT(KName, "sql");
+	return KName;
+	}
+
+void CCmdSqlCli::OptionsL(RCommandOptionList& aOptions)
+	{
+	_LIT(KVerbose, "verbose");
+	aOptions.AppendBoolL(iVerbose, KVerbose);
+	}
+
+void CCmdSqlCli::HandleServerResponseL(RPointerArray<HBufC> aLines)
+	{
+	const TInt numLines = aLines.Count();
+	for (TInt i = 0; i < numLines; ++i)
+		{
+		ProcessLineL(*aLines[i]);
+		}
+	}
+
+TBool CCmdSqlCli::MatchLineStart(const TDesC& aPrefix, TPtrC& aRemainder)
+	{
+	if (aRemainder.Left(aPrefix.Length()).Compare(aPrefix)==0)
+		{
+		aRemainder.Set(aRemainder.Mid(aPrefix.Length()));
+		return ETrue;
+		}
+	return EFalse;
+	}
+
+void CCmdSqlCli::UnrecognizedLineL(const TDesC& aDes)
+	{
+	if (!iVerbose)
+		{
+		Write(aDes);
+		Write(KNewLine);
+		}
+	}
+
+void CCmdSqlCli::ProcessLogL(const TDesC& aDes)
+	{
+	TResponseLex lex(aDes);
+	TInt id;
+	TInt err = lex.GetIntColon(id);
+	if (err != KErrNone)
+		{
+		UnrecognizedLineL(aDes);
+		}
+	}
+
+void CCmdSqlCli::ProcessLineL(const TDesC& aLine)
+	{
+	TPtrC remainder(aLine);
+	if (MatchLineStart(KErrorPrefix, remainder))
+		{
+		ProcessErrorL(remainder);
+		}
+	else if (MatchLineStart(KFailurePrefix, remainder))
+		{
+		ProcessFailureL(remainder);
+		}
+	else if (MatchLineStart(KAsyncIdPrefix, remainder))
+		{
+		ProcessAsyncIdL(remainder);
+		}
+	else if (MatchLineStart(KTimeoutPrefix, remainder))
+		{
+		ProcessTimeoutL(remainder);
+		}
+	else if (MatchLineStart(KResultPrefix, remainder))
+		{
+		ProcessResultL(remainder);
+		}
+	else if (MatchLineStart(KLogPrefix, remainder))
+		{
+		ProcessLogL(remainder);
+		}
+	else
+		{
+		UnrecognizedLineL(aLine);
+		}
+	}
+
+void CCmdSqlCli::ProcessErrorL(const TDesC& aDes)
+	{
+	TResponseLex lex(aDes);
+	TInt commandId;
+	TInt errorFromServer;
+	TInt err = lex.GetIntColon(errorFromServer);
+	if (err == KErrNone)
+		{
+		err = lex.GetIntColon(commandId);
+		}
+		
+	if (err == KErrNone)
+		{
+		TPtrC remander = lex.Remainder();
+		LeaveIfErr(errorFromServer, remander);
+		}
+	else
+		{
+		UnrecognizedLineL(aDes);
+		}
+	}
+
+void CCmdSqlCli::ProcessFailureL(const TDesC&)
+	{
+	LeaveIfErr(KErrGeneral, _L("Failed"));
+	}
+	
+void CCmdSqlCli::ProcessAsyncIdL(const TDesC& aDes)
+	{
+	TResponseLex lex(aDes);
+	TInt id;
+	TInt err = lex.GetIntEof(id);
+	if (err != KErrNone)
+		{
+		UnrecognizedLineL(aDes);
+		}
+	}
+
+void CCmdSqlCli::ProcessTimeoutL(const TDesC& aDes)
+	{
+	TResponseLex lex(aDes);
+	TInt id;
+	TInt err = lex.GetIntEof(id);
+	if (err == KErrNone)
+		{
+		LeaveIfErr(KErrTimedOut, _L("Command %d timed-out"), id);
+		}
+	else
+		{
+		UnrecognizedLineL(aDes);
+		}
+	}
+	
+void CCmdSqlCli::ProcessResultL(const TDesC& aDes)
+	{
+	TResponseLex lex(aDes);
+	TInt id;
+	TInt err = lex.GetIntColon(id);
+	if (err == KErrNone)
+		{
+		if (id == 0)
+			{
+			TPtrC name;
+			err = lex.GetStringColon(name);
+			if (err == KErrNone)
+				{
+				Write(lex.Remainder());
+				Write(KNewLine);
+				}
+			}
+		}
+	if (err != KErrNone)
+		{
+		UnrecognizedLineL(aDes);
+		}
+	}
+
+
+
+EXE_BOILER_PLATE(CCmdSqlCli)
+
+#define CASE_MODELIT(x) case x: { _LIT(KName, #x); pString = &KName; break; }
+
+void CCmdSqlCli::PrintTime(const TTime& aTime, TBool aNewline)
+	{	
+	TTime NullTime = Time::NullTTime();
+	if (aTime == NullTime) 
+		{
+		Printf(_L("(NullTime)"));
+		}
+	else
+		{
+		_LIT8(KDateTimeFormat, "%d-%02d-%02d %02d:%02d:%02d");
+		TDateTime dt = aTime.DateTime();
+		Printf(KDateTimeFormat, dt.Year(), dt.Month()+1, dt.Day()+1, dt.Hour(), dt.Minute(), dt.Second());
+		}
+	
+	if (aNewline) Printf(_L("\r\n"));
+	}
+
+
+///////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////
+TResponseLex::TResponseLex(const TDesC& aResponse)
+	: iRemainder(aResponse)
+	{
+	}
+
+TInt TResponseLex::GetIntColon(TInt& aValue)
+	{
+	TInt pos = iRemainder.Find(KColon);
+	if (pos == KErrNotFound)
+		{
+		return pos;
+		}
+	TPtrC intStr(iRemainder.Left(pos));
+	TLex lex(intStr);
+	TInt err = lex.Val(aValue);
+	if (err!=KErrNone) return err;
+	if (lex.Remainder().Length()) return KErrArgument;
+	iRemainder.Set(iRemainder.Mid(pos+1));
+	return KErrNone;
+	}
+
+TInt TResponseLex::GetStringColon(TPtrC& aValue)
+	{
+	TInt pos = iRemainder.Find(KColon);
+	if (pos == KErrNotFound)
+		{
+		return pos;
+		}
+	aValue.Set(iRemainder.Left(pos));
+	iRemainder.Set(iRemainder.Mid(pos+1));
+	return KErrNone;
+	}
+	
+TInt TResponseLex::GetIntEof(TInt& aValue)
+	{
+	TLex lex(iRemainder);
+	TInt err = lex.Val(aValue);
+	if (err==KErrNone)
+		{
+		if (lex.Remainder().Length()) err = KErrArgument;
+		}
+	if (err==KErrNone)
+		{
+		iRemainder.Set(lex.Remainder());
+		}
+	return err;
+	}
+
+TPtrC TResponseLex::Remainder()
+	{
+	return iRemainder;
+	}