diff -r 000000000000 -r 3ce708148e4d applicationmanagement/omascomoadapter/src/omascomoadapterdb.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/applicationmanagement/omascomoadapter/src/omascomoadapterdb.cpp Thu Dec 17 08:40:12 2009 +0200 @@ -0,0 +1,447 @@ +/* +* Copyright (c) 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: Implementation of applicationmanagement components + * +*/ + + +// INCLUDE FILES +#include +#include + +#include "omascomoadapterdb.h" +#include "debug.h" + +// ============================ MEMBER FUNCTIONS ============================= + +// --------------------------------------------------------------------------- +// CSCOMOAdapterDb::NewL() +// Creates a new instance of CSCOMOAdapterDb object. +// --------------------------------------------------------------------------- +// +CSCOMOAdapterDb* CSCOMOAdapterDb::NewL() + { + RDEBUG("CSCOMOAdapterDb::NewL(): begin"); + + CSCOMOAdapterDb* self = CSCOMOAdapterDb::NewLC(); + CleanupStack::Pop(self); + + RDEBUG("CSCOMOAdapterDb::NewL(): end"); + + return self; + } + +// --------------------------------------------------------------------------- +// CSCOMOAdapterDb::NewLC() +// Creates a new instance of CSCOMOAdapterDb object. +// Pushes and leaves new instance onto CleanupStack. +// --------------------------------------------------------------------------- +// +CSCOMOAdapterDb* CSCOMOAdapterDb::NewLC() + { + RDEBUG("CSCOMOAdapterDb::NewLC(): begin"); + + CSCOMOAdapterDb* self = new( ELeave ) CSCOMOAdapterDb(); + CleanupStack::PushL(self); + self->ConstructL(); + + RDEBUG("CSCOMOAdapterDb::NewLC(): end"); + + return self; + } + +// --------------------------------------------------------------------------- +// CSCOMOAdapterDb::ConstructL() +// Second phase constructor. +// --------------------------------------------------------------------------- +// +void CSCOMOAdapterDb::ConstructL() + { + RDEBUG("CSCOMOAdapterDb::ConstructL(): begin"); + + TParse name; + TInt err; + + User::LeaveIfError(iFsSession.Connect()); + User::LeaveIfError(iRdbSession.Connect() ); + + iFsSession.SetSessionToPrivate(EDriveC); + +#ifdef SYMBIAN_SECURE_DBMS + name.Set(KAMAdapterDbName, NULL, NULL); + err = iDatabase.Open(iRdbSession, name.FullName(), KDBMSSecureID); +#else + name.Set( KAMAdapterDbName, KNonSecureDbFullName, NULL ); + err = iDatabase.Open(iRdbSession, DBFileName); +#endif + + if (err == KErrNotFound) + { + CreateandOpenL(name); + } + else + { + + if ( (err == KErrEof ) || (err == KErrCorrupt ) || (err + == KErrArgument )) + { + + iRdbSession.DeleteDatabase(name.FullName(), KAMPolicyUID); + CreateandOpenL(name); + } + + } + + RDEBUG("CSCOMOAdapterDb::ConstructL(): end"); + } + +// ----------------------------------------------------------------------------- +// CWPInternetAPDB::CreateandOpenL +// ----------------------------------------------------------------------------- +// +void CSCOMOAdapterDb::CreateandOpenL(TParse& name) + { + + TInt err; + +#ifdef SYMBIAN_SECURE_DBMS + iDatabase.Create(iRdbSession, name.FullName(), KDBMSSecureID); +#else + if( SysUtil::FFSSpaceBelowCriticalLevelL( &iFsSession, KEmptyDbSizeEstimate ) ) + { + User::Leave( KErrDiskFull ); + } + iDatabase.Create(iFsSession, name.FullName()); +#endif + + CreateTableL(iDatabase); + iDatabase.Close(); +#ifdef SYMBIAN_SECURE_DBMS + + err = iDatabase.Open(iRdbSession, name.FullName(), KDBMSSecureID); + +#else + err = iDatabase.Open(iFsSession, DBFileName); +#endif + + //Debug + if (err != KErrNone) + { + + User::LeaveIfError(err); + } + + } + +// ----------------------------------------------------------------------------- +// CWPInternetAPDB::CreateTableL +// ----------------------------------------------------------------------------- +// +void CSCOMOAdapterDb::CreateTableL(RDbDatabase& aDatabase) + { + + // Create a table definition + CDbColSet* columns=CDbColSet::NewLC(); + + // Add Columns + TDbCol id(NCol1, EDbColInt32); + + // automatic indexing for items,it is our key field. + id.iAttributes=id.EAutoIncrement; + columns->AddL(id); + columns->AddL(TDbCol(NCol2, EDbColInt32)); + columns->AddL(TDbCol(NCol3, EDbColInt32)); + columns->AddL(TDbCol(NCol4, EDbColText8, 255)); + columns->AddL(TDbCol(NCol5, EDbColText8, 255)); + columns->AddL(TDbCol(NCol6, EDbColText8, 255)); + columns->AddL(TDbCol(NCol7, EDbColInt32)); + + //possibility of Panic + + // Create a table + TRAPD(err, aDatabase.CreateTable(KTableAMMgmtObject, *columns) ); + + if(err!=KErrNone) + User::Leave(err); + + // cleanup the column set + CleanupStack::PopAndDestroy(columns); + + } + +// --------------------------------------------------------------------------- +// CSCOMOAdapterDb::CSCOMOAdapterDb() +// Constructor. +// --------------------------------------------------------------------------- +// +CSCOMOAdapterDb::CSCOMOAdapterDb() + { + RDEBUG("CSCOMOAdapterDb::CSCOMOAdapterDb(): begin"); + RDEBUG("CSCOMOAdapterDb::CSCOMOAdapterDb(): end"); + } + +// --------------------------------------------------------------------------- +// CSCOMOAdapterDb::~CSCOMOAdapterDb() +// Destructor. +// --------------------------------------------------------------------------- +// +CSCOMOAdapterDb::~CSCOMOAdapterDb() + { + RDEBUG("CSCOMOAdapterDb::~CSCOMOAdapterDb(): begin"); + + iView.Close(); + + delete iColSet; + iAMObjectTable.Close(); + + iDatabase.Close(); + iFsSession.Close(); + iRdbSession.Close(); + + RDEBUG("CSCOMOAdapterDb::~CSCOMOAdapterDb(): ends"); + } + +CAMDbItem::~CAMDbItem() + { + delete iServerID; + delete iCorrelator; + delete iSourceURI; + } + +void CSCOMOAdapterDb::GetEntryForServerIDL(RPointerArray& aItemArray, + TDesC8& aValue) + { + + aItemArray.Reset();// first reset the array + + _LIT(KEqualToString,"='%S'"); + _LIT(KQuery, "SELECT * FROM %S WHERE %S"); + + TBuf<256> serverid; + serverid.Copy(aValue); + + TBuf<100> bufsql; + bufsql.Append(KQuery); + bufsql.Append(KEqualToString); + TBuf<100> bufsql1; + bufsql1.Format(bufsql, &KTableAMMgmtObject, &NCol4, &serverid); + + ReadItemsL(aItemArray, bufsql1); + + } + + + +// ----------------------------------------------------------------------------- +// CWPInternetAPDB::ReadItemsL +// ----------------------------------------------------------------------------- +// +void CSCOMOAdapterDb::ReadItemsL(RPointerArray& aItemArray, + TDesC& aSqlQuery) + { + + RDbView view; + view.Prepare(iDatabase, TDbQuery(aSqlQuery)); + CleanupClosePushL(view); + view.EvaluateAll(); + view.FirstL(); + + while (view.AtRow()) + { + view.GetL(); + + CAMDbItem *dbitem = new(ELeave) CAMDbItem; + dbitem->id = view.ColInt(1); + dbitem->iLUID = view.ColInt(2); + dbitem->iProfileId = view.ColInt(3); + + dbitem->iServerID = (view.ColDes8(4)).AllocL(); + dbitem->iCorrelator = (view.ColDes8(5)).AllocL(); + dbitem->iSourceURI = (view.ColDes8(6)).AllocL(); + + dbitem->iRetryCount = view.ColInt(7); + + aItemArray.Append(dbitem); + view.NextL(); + } + + CleanupStack::PopAndDestroy(); // view + + } + +// ----------------------------------------------------------------------------- +// CWPInternetAPDB::SaveToDatabaseL +// ----------------------------------------------------------------------------- +// +void CSCOMOAdapterDb::SaveToDatabaseL(TInt& aIndex, TUint32 aLuid, + TInt aProfileid, TInt aRetryCount, const TDesC8& aSourceURI, + const TDesC8& aServerid, const TDesC8& aCorrelator) + { + + BeginDatabaseTransaction(); + + TFileName sqlQuery; + sqlQuery.Copy(_L("SELECT * FROM ")); + sqlQuery.Append(KTableAMMgmtObject); + + RDbView view; + view.Prepare(iDatabase, TDbQuery(sqlQuery)); + CleanupClosePushL(view); + + view.InsertL(); + + view.SetColL(2, aLuid); + view.SetColL(3, aProfileid); + view.SetColL(4, aServerid); + view.SetColL(5, aCorrelator); + view.SetColL(6, aSourceURI); + view.SetColL(7, aRetryCount); + + view.PutL(); + + aIndex = view.ColInt(1);// autoincrement gives us unique index. + + CleanupStack::PopAndDestroy(1); // view + + CommitDatabaseTransaction(); + + } + +// ----------------------------------------------------------------------------- +// CWPInternetAPDB::DeleteFromDatabaseL +// ----------------------------------------------------------------------------- +// +TBool CSCOMOAdapterDb::DeleteFromDatabaseL(TUint32 aLuid) + { + + TBool rowsdeleted = EFalse; + TFileName sqlQuery; + + PrepareLuidQuery(aLuid, sqlQuery); + + + BeginDatabaseTransaction(); + + RDbView view; + // query buffer with index finds only the selected item row. + view.Prepare(iDatabase, TDbQuery(sqlQuery)); + CleanupClosePushL(view); + + view.EvaluateAll(); + view.FirstL(); + + if (!view.IsEmptyL()) + { + // we have autoincrement in index so it should be unique + // but just to make sure, we use 'while', instead of 'if' + while (view.AtRow()) + { + view.GetL(); + view.DeleteL(); + view.NextL(); + } + + + CommitDatabaseTransaction(); + // compacts the databse, by physically removig deleted data. + iDatabase.Compact(); + rowsdeleted = ETrue; + } + CleanupStack::PopAndDestroy(1); // view + + + return rowsdeleted; + } + +void CSCOMOAdapterDb::UpdateRetryCountForLuidL(TInt aLuid, TInt aRetryCount) +{ + TFileName sqlQuery; + + PrepareLuidQuery(aLuid, sqlQuery); + + BeginDatabaseTransaction(); + + RDbView view; + view.Prepare(iDatabase, TDbQuery(sqlQuery)); + CleanupClosePushL(view); + + view.EvaluateAll(); + view.FirstL(); + + if(view.AtRow()) + { + view.UpdateL(); + view.SetColL(7, aRetryCount); + view.PutL(); + } + + CleanupStack::PopAndDestroy(1); // view + + CommitDatabaseTransaction(); +} + +TInt CSCOMOAdapterDb::GetRetryCountForLuidL(TInt aLuid) +{ + TInt retrycount = KErrNone; + TFileName sqlQuery; + + PrepareLuidQuery(aLuid, sqlQuery); + + BeginDatabaseTransaction(); + + RDbView view; + view.Prepare(iDatabase, TDbQuery(sqlQuery)); + CleanupClosePushL(view); + view.EvaluateAll(); + view.FirstL(); + + if (!view.IsEmptyL()) + { + + if(view.AtRow()) + { + view.GetL(); + } + + retrycount = view.ColInt(7); + + } + + CleanupStack::PopAndDestroy(1); // view + + CommitDatabaseTransaction(); + + return retrycount; + +} + +void CSCOMOAdapterDb::PrepareLuidQuery(TInt aLuid, TDes& aSqlQuery) +{ + aSqlQuery.Copy(_L("SELECT * FROM ")); + aSqlQuery.Append(KTableAMMgmtObject); + aSqlQuery.Append(_L(" WHERE ")); + aSqlQuery.Append(NCol2); + aSqlQuery.Append(_L(" = ")); + aSqlQuery.AppendNum(aLuid); +} + +void CSCOMOAdapterDb::BeginDatabaseTransaction() +{ + iDatabase.Begin(); +} + +void CSCOMOAdapterDb::CommitDatabaseTransaction() +{ + iDatabase.Commit(); +}