mtpdataproviders/mtpimagedp/mediasyncserver/src/cmediasyncdatabase.cpp
changeset 51 64200268cac2
parent 50 965bb42340b2
child 52 866b4af7ffbe
--- a/mtpdataproviders/mtpimagedp/mediasyncserver/src/cmediasyncdatabase.cpp	Thu Sep 09 18:17:36 2010 +0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,501 +0,0 @@
-// 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:
-//
-
-/**
- @file
- @internalTechnology
-*/
-
-#include <bautils.h>
-#include <mdesession.h>
-#include <mdequery.h>
-#include <mdeconstants.h>
-
-#include "cmediasyncserverdef.h"
-#include "cmediasyncdatabase.h"
-#include "cmediasyncdatawriter.h"
-
-__FLOG_STMT(_LIT8(KComponent,"MediaSyncDatabase");)
-
-const TInt KCompactThreshold = 50;
-const TInt KMaxRetryTimes = 3;
-const TInt KDelayPeriod = 3 * 1000000;
-
-CMediaSyncDatabase* CMediaSyncDatabase::NewL(RFs& aFs)
-    {
-    CMediaSyncDatabase* self = new (ELeave) CMediaSyncDatabase(aFs);
-    CleanupStack::PushL(self);
-    self->ConstructL();
-    CleanupStack::Pop(self);
-    return self;
-    }
-
-void CMediaSyncDatabase::ConstructL()
-    {
-    __FLOG_OPEN(KMSSSubsystem, KComponent);
-    __FLOG(_L8("CMediaSyncDatabase::ConstructL - Entry"));
-
-    //Connect to the file server
-    User::LeaveIfError(iFs.Connect());
-
-    TFileName databasePath;
-    iFs.PrivatePath(databasePath);
-    TDriveUnit driveNum = RFs::GetSystemDrive();
-    databasePath.Insert(0, driveNum.Name());
-    databasePath.Append(KMssDbName);
-
-    CreateTableL(databasePath);    
-    
-    User::LeaveIfError(iBatched.Open(iDatabase, KImageTableName, RDbRowSet::EUpdatable));
-    
-    __FLOG(_L8("CMediaSyncDatabase::ConstructL - Exit"));
-    }
-
-CMediaSyncDatabase::CMediaSyncDatabase(RFs& aFs) :
-    iFs(aFs),
-    iDbCorrupt(EFalse),
-    iSavePosition(EFalse)
-    {
-    }
-
-CMediaSyncDatabase::~CMediaSyncDatabase()
-    {
-    __FLOG(_L8("CMediaSyncDatabase::~CMediaSyncDatabase - Entry"));
-    
-    iBatched.Close();
-    iDatabase.Close();
-    
-    __FLOG(_L8("CMediaSyncDatabase::~CMediaSyncDatabase - Exit"));
-    __FLOG_CLOSE;
-    }
-
-void CMediaSyncDatabase::CreateTableL(const TDesC& aDbFile)
-    {
-    __FLOG(_L8("CMediaSyncDatabase::CreateTableL - Entry"));
-    
-    _LIT(KSQLCreateTable, "CREATE TABLE ImageStore(ObjectId UNSIGNED INTEGER, NotificationType UNSIGNED INTEGER, URI VARCHAR(255))");           
-    
-    TInt err = KErrNone;
-    if (!BaflUtils::FileExists(iFs, aDbFile))
-        {
-        __FLOG(_L8("CreateTableL - Table ImageStore does not exist"));
-        
-        BaflUtils::EnsurePathExistsL(iFs, aDbFile);
-        
-        User::LeaveIfError(iDatabase.Create(iFs, aDbFile));
-        User::LeaveIfError(iDatabase.Execute(KSQLCreateTable));
-        TRAP_IGNORE(CreateTabIndexL());
-        }    
-    else
-        {
-        //Open the database
-        TBool recreateDbFile = EFalse;
-        err = iDatabase.Open(iFs, aDbFile);
-        if (err == KErrNone)
-            {
-            if (iDatabase.IsDamaged())
-                {
-                recreateDbFile = (iDatabase.Recover() == KErrNone) ? EFalse : ETrue;
-                }
-            }
-        else
-            {
-            recreateDbFile = ETrue;
-            }
-        
-        if (recreateDbFile)
-            {
-            __FLOG_VA((_L8("CreateTableL - Open Table ImageStore failed: %d"), err));
-            iDatabase.Close();
-
-            TInt retryCount = KMaxRetryTimes;
-            TInt result = KErrNone;            
-            for (; retryCount > 0; retryCount--)
-                {
-                result = BaflUtils::DeleteFile(iFs, aDbFile);
-                if (result == KErrNone)
-                    {
-                    // We have succesfully delete corrupt database file
-                    break;
-                    }       
-                else
-                    {
-                    User::After(KDelayPeriod);
-                    }
-                }
-            
-            User::LeaveIfError(result);
-            User::LeaveIfError(iDatabase.Create(iFs, aDbFile));
-            User::LeaveIfError(iDatabase.Execute(KSQLCreateTable));
-            TRAP_IGNORE(CreateTabIndexL());
-            iDbCorrupt = ETrue;          
-            }
-        }    
-    
-    __FLOG(_L8("CMediaSyncDatabase::CreateTableL - Exit"));
-    }
-
-void CMediaSyncDatabase::CreateTabIndexL()
-    {    
-    __FLOG(_L8("CMediaSyncDatabase::CreateTabIndexL - Entry"));
-    
-    _LIT(KSQLCreateCombinedIndexText,"CREATE UNIQUE INDEX CombinedIndex on ImageStore (ObjectId, NotificationType)");      
-    User::LeaveIfError(iDatabase.Execute(KSQLCreateCombinedIndexText));
-    
-    __FLOG(_L8("CMediaSyncDatabase::CreateTabIndexL - Exit"));
-    }
-
-void CMediaSyncDatabase::SaveNotificationsL(const RArray<TItemId>& aObjectIdArray, TObserverNotificationType aType, CMdESession& aSession)
-    {    
-    iDatabase.Begin();  
-
-    switch (aType)
-        {
-        case ENotifyAdd:
-            __FLOG(_L8("CMediaSyncDatabase::SaveNotificationsL Addition - Entry"));
-            SaveAddNotificationsL(aObjectIdArray, aSession);
-            break;
-            
-        case ENotifyRemove:
-            __FLOG(_L8("CMediaSyncDatabase::SaveNotificationsL Remove - Entry"));
-            SaveWithoutUriL(aObjectIdArray, KMssRemoval);
-            break;
-            
-        case ENotifyModify:
-            __FLOG(_L8("CMediaSyncDatabase::SaveNotificationsL Modify - Entry"));
-            SaveAndCheckWithUriL(aObjectIdArray, KMssChange, aSession);
-            break;
-            
-        default:
-            __FLOG_VA((_L8("SaveNotificationsL - Unknown argument: %d"), aType));
-            User::Leave(KErrArgument);
-            break;
-        }
-   
-    iDatabase.Commit();
-    
-    __FLOG(_L8("CMediaSyncDatabase::SaveNotificationsL - Exit"));
-    }
-
-inline TBool CMediaSyncDatabase::OptimizeL(TItemId aObjectId, TUint aType)
-    {    
-    return OptimizeL(aObjectId, aType, KNullDesC);
-    }
-
-void CMediaSyncDatabase::Rollback()
-    {
-    __ASSERT_DEBUG(iDatabase.InTransaction(), User::Invariant());
-    iDatabase.Rollback();
-    }
-
-TBool CMediaSyncDatabase::OptimizeL(TItemId aObjectId, TUint aType, const TDesC& aUri)
-    {
-    __FLOG(_L8("CMediaSyncDatabase::OptimizeL - Entry"));
-    
-    TBool saveNotification = ETrue;
-    
-    switch (aType)
-        {                
-    case KMssChange:
-        if ( UpdateUriColumnL(aObjectId, KMssAddition, aUri) ||
-             UpdateUriColumnL(aObjectId, KMssChange, aUri) )
-            {
-            saveNotification = EFalse;// ignore this update notification
-            }
-        __FLOG_VA((_L8("OptimizeL - KMssChange ObjectId: %u, Ignore saving: %d"), aObjectId, saveNotification));
-        break;
-                
-    case KMssPresent:
-        if (RemoveNotificationL(aObjectId, KMssNotPresent))
-            {
-            saveNotification = EFalse;// ignore this present notification
-            }
-        __FLOG_VA((_L8("OptimizeL - KMssPresent ObjectId: %u, Ignore saving: %d"), aObjectId, saveNotification));
-        break;        
-        
-    case KMssRemoval:
-        if (RemoveNotificationL(aObjectId, KMssAddition))
-            {
-            saveNotification = EFalse;// ignore this removal notification
-            }        
-        else
-            {
-            RemoveNotificationL(aObjectId, KMssChange);
-            }
-        __FLOG_VA((_L8("OptimizeL - KMssRemoval ObjectId: %u, Ignore saving: %d"), aObjectId, saveNotification));
-        break;
-        
-    case KMssNotPresent:
-        if (RemoveNotificationL(aObjectId, KMssPresent))
-            {
-            saveNotification = EFalse;// ignore this not present notification
-            }
-        __FLOG_VA((_L8("OptimizeL - KMssNotPresent ObjectId: %u, Ignore saving: %d"), aObjectId, saveNotification));
-        break;
-        
-    default:
-        // Nothing to do
-        break;
-        }
-    
-    __FLOG(_L8("CMediaSyncDatabase::OptimizeL - Exit"));
-    
-    return saveNotification;
-    }
-
-void CMediaSyncDatabase::SaveNotificationsL(const RArray<TItemId>& aObjectIdArray, TBool aPresent, CMdESession& aSession)
-    {        
-    iDatabase.Begin();
-   
-    if (aPresent)
-        {
-        __FLOG(_L8("CMediaSyncDatabase::SaveNotificationsL Present - Entry"));
-        SaveAndCheckWithUriL(aObjectIdArray, KMssPresent, aSession);
-        }
-    else
-        {
-        __FLOG(_L8("CMediaSyncDatabase::SaveNotificationsL Not Present - Entry"));
-        SaveWithoutUriL(aObjectIdArray, KMssNotPresent);
-        }      
-    
-    iDatabase.Commit();  
-    
-    __FLOG(_L8("CMediaSyncDatabase::SaveNotificationsL Present - Exit"));
-    }
-
-void CMediaSyncDatabase::SaveAddNotificationsL(const RArray<TItemId>& aObjectIdArray, CMdESession& aSession)
-    {
-    __FLOG(_L8("CMediaSyncDatabase::SaveAddNotificationsL - Entry"));
-    
-    CMdENamespaceDef& defaultNamespaceDef = aSession.GetDefaultNamespaceDefL();
-    CMdEObjectDef& imageObjDef = defaultNamespaceDef.GetObjectDefL(MdeConstants::Image::KImageObject); 
-
-    TInt objectCount = aObjectIdArray.Count();   
-    for (TInt i(0);i < objectCount;i++)
-        {       
-        TItemId objectId = aObjectIdArray[i];
-        CMdEObject* addObject = aSession.GetObjectL(objectId, imageObjDef);
-        if (addObject)
-            {
-            CleanupStack::PushL(addObject);
-            CleanupStack::PushL(TCleanupItem(CMediaSyncDatabase::RollbackTable, &iBatched));
-            iBatched.InsertL();
-            iBatched.SetColL(1, (TUint32)objectId);
-            iBatched.SetColL(2, KMssAddition);
-            iBatched.SetColL(3, addObject->Uri());
-            iBatched.PutL();
-            CleanupStack::Pop(&iBatched);            
-            __FLOG_VA((_L16("CMediaSyncDatabase::SaveAndCheckWithUriL - ObjectId:%u, Type:%u, URI:%S"), objectId, KMssAddition, &addObject->Uri()));
-            CleanupStack::PopAndDestroy(addObject); 
-            }                                 
-        }      
-    
-    __FLOG(_L8("CMediaSyncDatabase::SaveAddNotificationsL - Exit"));
-    }
-
-void CMediaSyncDatabase::SaveAndCheckWithUriL(const RArray<TItemId>& aObjectIdArray, TUint aType, CMdESession& aSession)
-    {
-    __FLOG(_L8("CMediaSyncDatabase::SaveAndCheckWithUriL - Entry"));
-    
-    CMdENamespaceDef& defaultNamespaceDef = aSession.GetDefaultNamespaceDefL();
-    CMdEObjectDef& imageObjDef = defaultNamespaceDef.GetObjectDefL(MdeConstants::Image::KImageObject); 
-    CMdEPropertyDef& itemTypePropDef = imageObjDef.GetPropertyDefL(MdeConstants::Object::KItemTypeProperty);    
-
-    TInt objectCount = aObjectIdArray.Count();   
-    for (TInt i(0);i < objectCount;i++)
-        {       
-        TItemId objectId = aObjectIdArray[i];          
-        CMdEObject* changeObject = aSession.GetObjectL(objectId, imageObjDef);
-        if (changeObject)
-            {
-            CleanupStack::PushL(changeObject);            
-            //only support jpeg format image files             
-            CMdEProperty* itemType = NULL;
-            TInt err = changeObject->Property(itemTypePropDef, itemType);
-            
-            if (err >= KErrNone && itemType != NULL && itemType->TextValueL().Compare(KJpegMime) == 0)
-                {                        
-                if (OptimizeL(objectId, aType, changeObject->Uri()))
-                    {                    
-                    CleanupStack::PushL(TCleanupItem(CMediaSyncDatabase::RollbackTable, &iBatched));
-                    iBatched.InsertL();
-                    iBatched.SetColL(1, (TUint32)objectId);
-                    iBatched.SetColL(2, aType);                    
-                    iBatched.SetColL(3, changeObject->Uri());
-                    iBatched.PutL();                    
-                    CleanupStack::Pop(&iBatched);
-                    __FLOG_VA((_L16("CMediaSyncDatabase::SaveAndCheckWithUriL - ObjectId:%u, Type:%u, URI:%S"), objectId, aType, &changeObject->Uri()));
-                    }
-                }
-            CleanupStack::PopAndDestroy(changeObject);            
-            }
-        }  
-    
-    __FLOG(_L8("CMediaSyncDatabase::SaveAndCheckWithUriL - Exit"));
-    }
-
-void CMediaSyncDatabase::SaveWithoutUriL(const RArray<TItemId>& aObjectIdArray, TUint aType)
-    {
-    TInt objectCount = aObjectIdArray.Count();   
-    for (TInt i(0);i < objectCount;i++)
-        {       
-        TItemId objectId = aObjectIdArray[i];        
-        if (OptimizeL(objectId, aType))
-            {
-            CleanupStack::PushL(TCleanupItem(CMediaSyncDatabase::RollbackTable, &iBatched));
-            iBatched.InsertL();
-            iBatched.SetColL(1, (TUint32)objectId);
-            iBatched.SetColL(2, aType);
-            iBatched.PutL();
-            __FLOG_VA((_L8("CMediaSyncDatabase::SaveWithoutUriL - ObjectId:%u, Type: %u"), objectId, aType));
-            CleanupStack::Pop(&iBatched);
-            }
-        }
-    
-    __FLOG(_L8("CMediaSyncDatabase::SaveWithoutUriL - Exit"));
-    }
-
-TBool CMediaSyncDatabase::UpdateUriColumnL(TItemId aObjectId, TUint aType, const TDesC& aUri)
-    {
-    __FLOG(_L8("CMediaSyncDatabase::UpdateUriColumnL - Entry"));
-    
-    TBool update = EFalse;
-    
-    iBatched.SetIndex(KSQLCombinedIndex);
-    TDbSeekMultiKey<2> seekKey;
-    seekKey.Add((TUint)aObjectId);
-    seekKey.Add(aType);
-    if (iBatched.SeekL(seekKey))
-        {
-        CleanupStack::PushL(TCleanupItem(CMediaSyncDatabase::RollbackTable, &iBatched));
-        iBatched.UpdateL();                 
-        iBatched.SetColL(3, aUri);
-        iBatched.PutL();        
-        CleanupStack::Pop(&iBatched);
-        update = ETrue;
-        __FLOG_VA((_L16("CMediaSyncDatabase::UpdateUriColumnL - ObjectId:%u, Type:%u, URI:%S"), aObjectId, aType, &aUri));
-        }    
-    
-    __FLOG(_L8("CMediaSyncDatabase::UpdateUriColumnL - Exit"));
-    return update;
-    }
-
-void CMediaSyncDatabase::RemoveAllNotificationsL()
-    {        
-    _LIT(KSQLDeleteAllNotifications, "DELETE FROM ImageStore");
-  
-    User::LeaveIfError(iDatabase.Execute(KSQLDeleteAllNotifications));    
-    iDatabase.Compact();    
-    iSavePosition = EFalse;    
-    
-    __FLOG_VA((_L8("CMediaSyncDatabase::RemoveAllNotificationsL")));
-    }
-
-TBool CMediaSyncDatabase::RemoveNotificationL(TItemId aObjectId, TUint aType)
-    {
-    TBool remove = EFalse;
-    
-    iBatched.SetIndex(KSQLCombinedIndex);
-    TDbSeekMultiKey<2> seekKey;
-    seekKey.Add((TUint)aObjectId);
-    seekKey.Add(aType);
-    if (iBatched.SeekL(seekKey))
-        {
-        iBatched.DeleteL();
-        CompactDatabase();
-        iSavePosition = EFalse;
-        remove = ETrue;
-        __FLOG_VA((_L8("CMediaSyncDatabase::RemoveNotificationL - ObjectId:%u, Type: %u"), aObjectId, aType));
-        }    
-    return remove;
-    }
-
-void CMediaSyncDatabase::CompactDatabase()
-    {
-    if (++iCompactCounter > KCompactThreshold)
-        {
-        iDatabase.Compact();
-        iCompactCounter = 0;
-        }    
-    }
-
-void CMediaSyncDatabase::FetchNotificationsL(CMediaSyncDataWriter& aResulWriter, TInt aMaxtFetchCount, TBool& aIsFinished)
-    {
-    __FLOG(_L8("CMediaSyncDatabase::FetchNotificationsL - Entry"));
-    
-    _LIT(KSQLQuery, "SELECT ObjectId, NotificationType, URI FROM ImageStore");
-    
-    RDbView view;
-    CleanupClosePushL(view);
-    
-    User::LeaveIfError(view.Prepare(iDatabase, TDbQuery(KSQLQuery)));
-    User::LeaveIfError(view.EvaluateAll());
-    
-    //goto the last fetch position
-    if (iSavePosition)
-        {
-        view.GotoL(iBookmark);
-        }
-    else        
-        {
-        view.FirstL();   
-        }
-    
-    TInt entrySize = 0;
-    //tranvers records
-    while (view.AtRow() && (aMaxtFetchCount > 0))
-        {
-        view.GetL();        
-        TPtrC16 uri = view.ColDes16(3);
-        
-        entrySize = uri.Size();
-        entrySize += sizeof(TUint32);//object id size
-        entrySize += sizeof(TUint8);//type size 
-        entrySize += sizeof(TUint8);//uri size
-        
-        if (entrySize > aResulWriter.FreeSpaceBytes())
-            {
-            //there is no enought space to save entry
-            break;
-            }
-        else
-            {
-            aResulWriter.AppendEntryL(view.ColUint32(1), (TUint8)view.ColUint32(2), uri);
-            view.NextL();
-            --aMaxtFetchCount;
-            }                                       
-        }
-    
-    //save current fetch position
-    if (view.AtEnd())
-        {
-        iSavePosition = EFalse;
-        aIsFinished = ETrue;
-        }
-    else
-        {
-        iBookmark = view.Bookmark();
-        iSavePosition = ETrue;
-        aIsFinished = EFalse;
-        }
-    CleanupStack::PopAndDestroy(&view);
-    
-    __FLOG(_L8("CMediaSyncDatabase::FetchNotificationsL - Exit"));
-    }
-
-void CMediaSyncDatabase::RollbackTable(TAny* aTable)
-    {
-    reinterpret_cast<RDbTable*> (aTable)->Cancel();
-    }