applicationmanagement/omascomoadapter/src/omascomoadapterdb.cpp
changeset 0 3ce708148e4d
--- /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 <sysutil.h>
+#include <bautils.h>
+
+#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<CAMDbItem>& 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<CAMDbItem>& 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();
+}