--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/locationdataharvester/mylocationsengine/src/lookupmaptiledb.cpp Tue Aug 31 15:09:25 2010 +0300
@@ -0,0 +1,607 @@
+/*
+* Copyright (c) 2010 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: Maptile database lookup table source implementation.
+*
+*/
+#include <QString>
+#include <QFile>
+
+#include <bautils.h>
+#include <locationservicedefines.h>
+#include "mylocationlogger.h"
+#include "lookupmaptiledb.h"
+
+_LIT( KSelectAllFrom, "SELECT * FROM " );
+_LIT(KQueryToDB,"SELECT * FROM cntmaptilelookuptable WHERE cntuid = %d AND source = %d");
+_LIT(KQueryGetCalendaIds,"SELECT cntuid FROM cntmaptilelookuptable WHERE source = %d");
+_LIT( KSelectfilepathFrom, "SELECT filepath FROM " );
+_LIT(KQueryMaptile, "SELECT filepath FROM cntmaptilelookuptable WHERE filepath = '%S'");
+// string 'where'
+_LIT( KStringWhere, " WHERE " );
+// string ' = '
+_LIT( KStringEqual, " = " );
+
+_LIT(KQueryByMaptileFetchingState,"SELECT * FROM cntmaptilelookuptable WHERE fetchingstatus = %d");
+
+// -----------------------------------------------------------------------------
+// CLookupMapTileDatabase::CLookupMapTileDatabase()
+// Default constructor.
+// -----------------------------------------------------------------------------
+//
+CLookupMapTileDatabase::CLookupMapTileDatabase()
+{
+}
+
+// -----------------------------------------------------------------------------
+// CLookupMapTileDatabase::~CLookupMapTileDatabase()
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CLookupMapTileDatabase::~CLookupMapTileDatabase()
+{
+ __TRACE_CALLSTACK;// close the database
+ iItemsDatabase.Close();
+ // close the file session
+ iFsSession.Close();
+}
+
+// -----------------------------------------------------------------------------
+// CLookupMapTileDatabase::~CLookupMapTileDatabase()
+// Creates an object of this class and pushes to cleanup stack.
+// -----------------------------------------------------------------------------
+//
+CLookupMapTileDatabase* CLookupMapTileDatabase::NewLC(
+ const TDesC& aLookupTableName)
+{
+ CLookupMapTileDatabase* self = new (ELeave) CLookupMapTileDatabase;
+ CleanupStack::PushL(self);
+ self->ConstructL(aLookupTableName);
+ return self;
+}
+
+// -----------------------------------------------------------------------------
+// CLookupMapTileDatabase::NewL()
+// Creates an object of this class.
+// -----------------------------------------------------------------------------
+//
+CLookupMapTileDatabase* CLookupMapTileDatabase::NewL(
+ const TDesC& aLookupTableName)
+{
+ CLookupMapTileDatabase* self = CLookupMapTileDatabase::NewLC(
+ aLookupTableName);
+ CleanupStack::Pop(self);
+ return self;
+}
+
+// -----------------------------------------------------------------------------
+// CLookupMapTileDatabase::ConstructL()
+// 2nd phase contructor.
+// -----------------------------------------------------------------------------
+//
+void CLookupMapTileDatabase::ConstructL(const TDesC& aLookupTableName)
+{
+ __TRACE_CALLSTACK;
+ User::LeaveIfError(iFsSession.Connect());
+
+ //create private path
+ User::LeaveIfError(iFsSession.CreatePrivatePath(RFs::GetSystemDrive()));
+ // private path with no drive on it
+ iFsSession.PrivatePath(iDbFileName);
+
+ TFindFile PrivFolder(iFsSession);
+ // find out the drive
+ if (KErrNone == PrivFolder.FindByDir(iDbFileName, KNullDesC))
+ {
+ iFsSession.MkDir(KLookupDbPath);
+ iDbFileName.Copy(KLookupDbPath);
+ iDbFileName.Append(aLookupTableName);
+
+ if (!BaflUtils::FileExists(iFsSession, iDbFileName))
+ { // no database exists so we make one
+ User::LeaveIfError(iItemsDatabase.Create(iFsSession, iDbFileName));
+ // and will create the only table needed for it
+ CreateTableL(iItemsDatabase);
+
+ //close the database
+ iItemsDatabase.Close();
+ }
+ }
+}
+
+// -----------------------------------------------------------------------------
+// CLookupMapTileDatabase::Open()
+// Opens the lookup database.
+// -----------------------------------------------------------------------------
+//
+TInt CLookupMapTileDatabase::Open()
+{
+ __TRACE_CALLSTACK;
+ return iItemsDatabase.Open(iFsSession, iDbFileName);
+}
+
+// -----------------------------------------------------------------------------
+// CLookupMapTileDatabase::Close()
+// Closes the lookup database.
+// -----------------------------------------------------------------------------
+//
+void CLookupMapTileDatabase::Close()
+{
+ __TRACE_CALLSTACK;
+ iItemsDatabase.Close();
+}
+
+// -----------------------------------------------------------------------------
+// CLookupMapTileDatabase::CreateTableL()
+// Creates a lookup table.
+// -----------------------------------------------------------------------------
+//
+void CLookupMapTileDatabase::CreateTableL(RDbDatabase& aDatabase)
+{
+ __TRACE_CALLSTACK;// Create a table definition
+ CDbColSet* columns = CDbColSet::NewLC();
+
+ // Add Columns
+
+ // Add uid column
+ columns->AddL(TDbCol(NCntColUid, EDbColUint32));
+
+ columns->AddL(TDbCol(NColSource, EDbColUint32));
+
+ // add file path type column
+ columns->AddL(TDbCol(NCntColFilePath, EDbColText16));
+
+ //MK
+ // add map tile fetching status to the db
+ columns->AddL(TDbCol(MapTileFetchingStatus, EDbColUint32));
+
+
+ // Create a table
+ User::LeaveIfError(aDatabase.CreateTable(KMapTileLookupTable, *columns));
+
+ // cleanup the column set
+ CleanupStack::PopAndDestroy(columns);
+}
+
+// -----------------------------------------------------------------------------
+// CLookupMapTileDatabase::CreateEntryL()
+// Creates an entry in the lookup table.
+// -----------------------------------------------------------------------------
+//
+void CLookupMapTileDatabase::CreateEntryL(const TLookupItem& aLookupItem)
+{
+ __TRACE_CALLSTACK;// create a query for the view
+ TFileName queryBuffer;
+ queryBuffer.Copy(KSelectAllFrom);
+ queryBuffer.Append(KMapTileLookupTable);
+
+ TInt ret = Open();
+ if (ret != KErrNone)
+ {
+ Close();
+ ret = Open();
+ if( ret != KErrNone )
+ return;
+
+ }
+ iItemsDatabase.Begin();
+
+ RDbView myView;
+ myView.Prepare(iItemsDatabase, TDbQuery(queryBuffer));
+ CleanupClosePushL(myView);
+
+ // Inert the item
+ myView.InsertL();
+ // set the fields
+ myView.SetColL(KColumncntUid, aLookupItem.iUid);
+ myView.SetColL(KColumnSource, aLookupItem.iSource);
+ myView.SetColL(KColumnFilePath, aLookupItem.iFilePath);
+ myView.SetColL(KColumnMapTileFetchingStatus, aLookupItem.iFetchingStatus); //MK
+
+ myView.PutL();
+
+ CleanupStack::PopAndDestroy(&myView); // myView
+ iItemsDatabase.Commit();
+ Close();
+}
+
+// -----------------------------------------------------------------------------
+// CLookupMapTileDatabase::ReSetEntryL()
+// Reset the entry with null value and get the used maptile path as part of aLookupItem.
+// -----------------------------------------------------------------------------
+//
+void CLookupMapTileDatabase::ReSetEntryL(TLookupItem &aLookupItem)
+{
+ TFileName queryBuffer;
+ queryBuffer.Format(KQueryToDB, aLookupItem.iUid, aLookupItem.iSource);
+ TInt ret = Open();
+ if (ret != KErrNone)
+ {
+ Close();
+ ret = Open();
+ if( ret != KErrNone )
+ return;
+ }
+ iItemsDatabase.Begin();
+
+ // Create a view of the table based on the query created.
+ RDbView myView;
+ myView.Prepare(iItemsDatabase, TDbQuery(queryBuffer));
+ CleanupClosePushL(myView);
+
+ myView.EvaluateAll();
+ myView.FirstL();
+
+ if (myView.AtRow())
+ {
+ myView.GetL();
+ aLookupItem.iFilePath.Copy(myView.ColDes16(KColumnFilePath));
+ // found the entry. update it.
+ myView.UpdateL();
+ myView.SetColL(KColumnFilePath, KNullDesC);
+ myView.SetColL(KColumnMapTileFetchingStatus,
+ aLookupItem.iFetchingStatus); //MK
+ myView.PutL();
+ }
+
+ CleanupStack::PopAndDestroy(&myView); // myView
+ iItemsDatabase.Commit();
+
+ Close();
+}
+// -----------------------------------------------------------------------------
+// CLookupMapTileDatabase::UpdateEntryL()
+// Updates an entry in the lookup table.
+// -----------------------------------------------------------------------------
+//
+void CLookupMapTileDatabase::UpdateEntryL(const TLookupItem& aLookupItem)
+{
+ __TRACE_CALLSTACK;// Create the query to find the row to be updated.
+ TFileName queryBuffer;
+ queryBuffer.Format(KQueryToDB, aLookupItem.iUid, aLookupItem.iSource);
+ TInt ret = Open();
+ if (ret != KErrNone)
+ {
+ Close();
+ ret = Open();
+ if( ret != KErrNone )
+ return;
+ }
+ iItemsDatabase.Begin();
+
+ // Create a view of the table based on the query created.
+ RDbView myView;
+ myView.Prepare(iItemsDatabase, TDbQuery(queryBuffer));
+ CleanupClosePushL(myView);
+
+ myView.EvaluateAll();
+ myView.FirstL();
+
+ if (myView.AtRow())
+ {
+ // found the entry. update it.
+ myView.UpdateL();
+ myView.SetColL(KColumnFilePath, aLookupItem.iFilePath);
+ myView.SetColL(KColumnMapTileFetchingStatus, aLookupItem.iFetchingStatus); //MK
+ myView.PutL();
+ }
+
+ CleanupStack::PopAndDestroy(&myView); // myView
+ iItemsDatabase.Commit();
+
+ Close();
+
+}
+
+// -----------------------------------------------------------------------------
+// CLookupMapTileDatabase::DeleteEntryL()
+// Deletes an entry from the lookup table.
+// -----------------------------------------------------------------------------
+//
+void CLookupMapTileDatabase::DeleteEntryL(TLookupItem& aLookupItem)
+{
+ __TRACE_CALLSTACK;// Create the query to find the row to be deleted.
+
+ TFileName queryBuffer;
+ queryBuffer.Format(KQueryToDB, aLookupItem.iUid, aLookupItem.iSource);
+
+ TInt ret = Open();
+ if (ret != KErrNone)
+ {
+ Close();
+ ret = Open();
+ if( ret != KErrNone )
+ return;
+ }
+ iItemsDatabase.Begin();
+
+ RDbView myView;
+ // query buffer finds only the selected item row.
+ myView.Prepare(iItemsDatabase, TDbQuery(queryBuffer));
+ CleanupClosePushL(myView);
+
+ myView.EvaluateAll();
+
+ // positions the cursor on the first row of the rowset
+ myView.FirstL();
+
+ // Delete the entry found.
+ if (myView.AtRow())
+ {
+ myView.GetL();
+ if (aLookupItem.iUid == myView.ColUint(KColumncntUid))
+ {
+ aLookupItem.iFilePath.Copy(myView.ColDes16(KColumnFilePath));
+
+ }
+ myView.DeleteL();
+ }
+
+ CleanupStack::PopAndDestroy(&myView); // myView
+ iItemsDatabase.Commit();
+ // compacts the databse, by physicaly removing deleted data.
+ iItemsDatabase.Compact();
+
+ Close();
+}
+
+// -----------------------------------------------------------------------------
+// CLookupMapTileDatabase::DeleteMapTileL()
+// Deletes an maptile if there's no reference to maptile in lookupdb
+// -----------------------------------------------------------------------------
+//
+void CLookupMapTileDatabase::DeleteMapTileL( const TLookupItem& aLookupItem)
+{
+ __TRACE_CALLSTACK;// Create the query to find the row to be deleted.
+
+ TFileName queryBuffer;
+ queryBuffer.Format(KQueryMaptile, &aLookupItem.iFilePath);
+
+ TInt ret = Open();
+ if (ret != KErrNone)
+ {
+ Close();
+ ret = Open();
+ if( ret != KErrNone )
+ return;
+ }
+
+ iItemsDatabase.Begin();
+
+ RDbView myView;
+ // query buffer finds only the selected item row.
+ myView.Prepare(iItemsDatabase, TDbQuery(queryBuffer));
+ CleanupClosePushL(myView);
+
+ myView.EvaluateAll();
+
+ // positions the cursor on the first row of the rowset
+ myView.FirstL();
+
+ // Delete if no reference to maptile
+ if (!myView.AtRow())
+ {
+ QString filePath = QString::fromUtf16( aLookupItem.iFilePath.Ptr(), aLookupItem.iFilePath.Length() );
+ //delete all releted maptile
+ QString temp=filePath;
+ temp.append(MAPTILE_IMAGE_PORTRAIT);
+ QFile file;
+ file.remove(temp);
+
+ temp=filePath;
+ temp.append(MAPTILE_IMAGE_CONTACT);
+ temp.append(MAPTILE_IMAGE_LANDSCAPE);
+ file.remove(temp);
+
+ temp=filePath;
+ temp.append(MAPTILE_IMAGE_CALENDAR);
+ temp.append(MAPTILE_IMAGE_LANDSCAPE);
+ file.remove(temp);
+
+ temp=filePath;
+ temp.append(MAPTILE_IMAGE_HURRIGANES);
+ file.remove(temp);
+
+ // ret = iFsSession.Delete(aLookupItem.iFilePath);
+ }
+
+ CleanupStack::PopAndDestroy(&myView); // myView
+
+ Close();
+}
+
+
+// -----------------------------------------------------------------------------
+// CLookupMapTileDatabase::FindEntriesByMapTileFetchingStatusL()
+// Finds a list of lookup items given a landmark uid.
+// -----------------------------------------------------------------------------
+//
+void CLookupMapTileDatabase::FindEntriesByMapTileFetchingStateL(const TUint32 aFetchingState,
+ RArray<TLookupItem>& aLookupItemArray)
+{
+ __TRACE_CALLSTACK;// Create a query to find the item.
+ TFileName queryBuffer;
+ queryBuffer.Format(KQueryByMaptileFetchingState,aFetchingState);
+
+ TInt ret = Open();
+ if (ret != KErrNone)
+ {
+ Close();
+ ret = Open();
+ if( ret != KErrNone )
+ return;
+ }
+ iItemsDatabase.Begin();
+
+
+ // Create a view of the table with the above query.
+ RDbView myView;
+ myView.Prepare(iItemsDatabase, TDbQuery(queryBuffer));
+ CleanupClosePushL(myView);
+ myView.EvaluateAll();
+ myView.FirstL();
+
+ while (myView.AtRow())
+ {
+ // Item found. get the details.
+ myView.GetL();
+ TLookupItem newItem;
+ newItem.iUid = myView.ColUint(KColumnUid);
+ newItem.iSource = myView.ColUint(KColumnSource);
+ aLookupItemArray.Append(newItem);
+ myView.NextL();
+ }
+
+ CleanupStack::PopAndDestroy(&myView); // myView
+}
+
+// -----------------------------------------------------------------------------
+// CLookupMapTileDatabase::GetAllCalendarIdsL()
+// Gets the list of calendar ids .
+// -----------------------------------------------------------------------------
+//
+void CLookupMapTileDatabase::GetAllCalendarIdsL( RArray<TUint32>& aIdArray )
+{
+ __TRACE_CALLSTACK;// Create a query to find the item.
+ TFileName queryBuffer;
+ queryBuffer.Format( KQueryGetCalendaIds, ESourceCalendar );
+
+ TInt ret = Open();
+ if (ret != KErrNone)
+ {
+ Close();
+ ret = Open();
+ if( ret != KErrNone )
+ return;
+ }
+ iItemsDatabase.Begin();
+
+
+ // Create a view of the table with the above query.
+ RDbView myView;
+ myView.Prepare( iItemsDatabase, TDbQuery( queryBuffer ) );
+ CleanupClosePushL( myView );
+ myView.EvaluateAll();
+ myView.FirstL();
+
+ while( myView.AtRow() )
+ {
+ // Item found. get the details.
+ myView.GetL();
+ TUint32 id;
+ id = myView.ColUint( KColumnUid );
+ aIdArray.Append( id );
+ myView.NextL();
+ }
+
+ CleanupStack::PopAndDestroy( &myView ); // myView
+ Close();
+}
+
+// -----------------------------------------------------------------------------
+// CLookupMapTileDatabase::FindEntryL()
+// Finds an entry in the lookup table.
+// -----------------------------------------------------------------------------
+//
+TBool CLookupMapTileDatabase::FindEntryL(TLookupItem& aLookupItem)
+{
+ __TRACE_CALLSTACK;// used to store return value
+ TBool retVal = EFalse;
+ // Create a query to find the item.
+ TFileName queryBuffer;
+ queryBuffer.Format(KQueryToDB, aLookupItem.iUid, aLookupItem.iSource);
+
+ TInt ret = Open();
+ if (ret != KErrNone)
+ {
+ Close();
+ ret = Open();
+ if( ret != KErrNone )
+ return EFalse;
+
+ }
+ iItemsDatabase.Begin();
+
+ // Create a view of the table with the above query.
+ RDbView myView;
+ myView.Prepare(iItemsDatabase, TDbQuery(queryBuffer));
+ CleanupClosePushL(myView);
+ myView.EvaluateAll();
+ myView.FirstL();
+
+ if (myView.AtRow())
+ {
+ // Item found. get the details.
+ myView.GetL();
+ retVal = ETrue;
+ }
+
+ CleanupStack::PopAndDestroy(&myView); // myView
+ Close();
+ return retVal;
+}
+
+// -----------------------------------------------------------------------------
+// CLookupMapTileDatabase::FindEntryByFIlePathLL()
+// Finds an entry in the lookup table for maptile image file
+// -----------------------------------------------------------------------------
+//
+TBool CLookupMapTileDatabase::FindEntryByFilePathL(const TDesC& aFilePath)
+{
+ __TRACE_CALLSTACK;// used to store return value
+ TBool retVal = EFalse;
+
+ TInt ret = Open();
+ if (ret != KErrNone)
+ {
+ Close();
+ ret = Open();
+ if( ret != KErrNone )
+ return EFalse;
+ }
+
+ iItemsDatabase.Begin();
+
+ // Create a query to find the item.
+ TFileName queryBuffer;
+ _LIT(KFormatSpec, "%S%S%S%S%S'%S'");
+
+ queryBuffer.Format(KFormatSpec,
+ &KSelectfilepathFrom(),
+ &KMapTileLookupTable(),
+ &KStringWhere(),
+ &NCntColFilePath(),
+ &KStringEqual(),
+ &aFilePath);
+
+ // Create a view of the table with the above query.
+ RDbView myView;
+ TInt retPrep = myView.Prepare(iItemsDatabase, TDbQuery(queryBuffer));
+ CleanupClosePushL(myView);
+ myView.EvaluateAll();
+ myView.FirstL();
+
+ if (myView.AtRow())
+ {
+ // Item found, return true
+ retVal = ETrue;
+ }
+
+ CleanupStack::PopAndDestroy(&myView); // myView
+ Close();
+
+ return retVal;
+}
+
+// End of file
+