omadmadapters/fota/src/nsmldmfotaadapterdb.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 06 Jul 2010 14:06:19 +0300
changeset 42 aa33c2cb9a50
permissions -rw-r--r--
Revision: 201025 Kit: 2010127

/*
* Copyright (c) 2004 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:    Fota adapter's DB implementation file
*
*/





// INCLUDE FILES
#include <sysutil.h>
#include <bautils.h>

#include "nsmldmfotaadapterdb.h"
#include "nsmlconstants.h"
#include "nsmldebug.h"

#ifndef __WINS__
                                    // This lowers the unnecessary compiler warning (armv5) to remark.
                                    // "Warning: #174-D: expression has no effect..." is caused by 
                                    // DBG_ARGS8 macro in no-debug builds.
#pragma diag_remark 174
#endif

// ============================ MEMBER FUNCTIONS =============================

// ---------------------------------------------------------------------------
//  CNSmlDmFotaAdapterDb::NewL()
//  Creates a new instance of CNSmlDmFotaAdapterDb object.
// ---------------------------------------------------------------------------
// 
CNSmlDmFotaAdapterDb* CNSmlDmFotaAdapterDb::NewL()
    {
    _DBG_FILE("CNSmlDmFotaAdapterDb::NewL(): begin");
    
    CNSmlDmFotaAdapterDb* self = CNSmlDmFotaAdapterDb::NewLC(); 
    CleanupStack::Pop( self );

    _DBG_FILE("CNSmlDmFotaAdapterDb::NewL(): end");
    
    return self;
    }   

// ---------------------------------------------------------------------------
//  CNSmlDmFotaAdapterDb::NewLC()
//  Creates a new instance of CNSmlDmFotaAdapterDb object. 
//  Pushes and leaves new instance onto CleanupStack.
// ---------------------------------------------------------------------------
// 
CNSmlDmFotaAdapterDb* CNSmlDmFotaAdapterDb::NewLC()
    {
    _DBG_FILE("CNSmlDmFotaAdapterDb::NewLC(): begin");
    
    CNSmlDmFotaAdapterDb* self = new( ELeave ) CNSmlDmFotaAdapterDb();
    CleanupStack::PushL( self );
    self->ConstructL();
    
    _DBG_FILE("CNSmlDmFotaAdapterDb::NewLC(): end");
    
    return self;
    }

// ---------------------------------------------------------------------------
//  CNSmlDmFotaAdapterDb::ConstructL()
//  Second phase constructor.
// ---------------------------------------------------------------------------
// 
void CNSmlDmFotaAdapterDb::ConstructL()
    {
    _DBG_FILE("CNSmlDmFotaAdapterDb::ConstructL(): begin");
    
    User::LeaveIfError( iFsSession.Connect() );
    User::LeaveIfError( iRdbSession.Connect() );
    iFsSession.SetSessionToPrivate( KNSmlFotaAdapterDbDrive );

    TParse name;

#ifdef SYMBIAN_SECURE_DBMS
	name.Set( KNSmlFotaAdapterDbName(), NULL, NULL );
#else
    name.Set( KNSmlFotaAdapterDbName(), KNSmlDatabasesNonSecurePath, NULL );
#endif

	TInt err = iDatabase.Open( iRdbSession,
	                           name.FullName(),
	                           KNSmlDBMSSecureMDHostOneID );
    if ( err == KErrNotFound )
        {
        CreateDatabaseL( name.FullName() );
        err = iDatabase.Open( iRdbSession,
                              name.FullName(),
                              KNSmlDBMSSecureMDHostOneID );
        User::LeaveIfError( err );
        }
    else
        {
        
        if ( ( err == KErrEof ) || ( err == KErrCorrupt ) || 
             ( err == KErrArgument ) )
            {
            // something seriously wrong with the db, delete it and try 
            // to create new
            iRdbSession.DeleteDatabase( name.FullName(),
                                        KNSmlDMHostOnePolicyUID );
            CreateDatabaseL( name.FullName() );
            err = iDatabase.Open( iRdbSession,
                                  name.FullName(),
                                  KNSmlDBMSSecureMDHostOneID );
            }
        
        User::LeaveIfError( err );
        }

    User::LeaveIfError( iFwObjectTable.Open( iDatabase,
                                             KNSmlTableFwMgmtObject ) );
    iColSet = iFwObjectTable.ColSetL();
    
    _DBG_FILE("CNSmlDmFotaAdapterDb::ConstructL(): end");
    }

// ---------------------------------------------------------------------------
//  CNSmlDmFotaAdapterDb::CNSmlDmFotaAdapterDb()
//  Constructor.
// ---------------------------------------------------------------------------
// 
CNSmlDmFotaAdapterDb::CNSmlDmFotaAdapterDb()
    {
    _DBG_FILE("CNSmlDmFotaAdapterDb::CNSmlDmFotaAdapterDb(): begin");
    _DBG_FILE("CNSmlDmFotaAdapterDb::CNSmlDmFotaAdapterDb(): end");
    }
    
// ---------------------------------------------------------------------------
//  CNSmlDmFotaAdapterDb::~CNSmlDmFotaAdapterDb()
//  Destructor.
// ---------------------------------------------------------------------------
// 
CNSmlDmFotaAdapterDb::~CNSmlDmFotaAdapterDb()
    {
    _DBG_FILE("CNSmlDmFotaAdapterDb::~CNSmlDmFotaAdapterDb(): begin");

    iView.Close();
    
    delete iColSet;
    iFwObjectTable.Close();
        
    iDatabase.Close();
    iFsSession.Close();
    iRdbSession.Close();
    
    _DBG_FILE("CNSmlDmFotaAdapterDb::~CNSmlDmFotaAdapterDb(): ends");
    }

// ---------------------------------------------------------------------------
//  CNSmlDmFotaAdapterDb::AddFwObjectL()
//  Inserts new uninitialized row to FwMgmtObject table and returns its id.
// ---------------------------------------------------------------------------
// 
TNSmlDmFwObjectId CNSmlDmFotaAdapterDb::AddFwObjectL()
    {
    _DBG_FILE("CNSmlDmFotaAdapterDb::AddFwObjectL(): begin");
    
    // Check OOD before inserting new row into FwMgmtObject table
    if ( SysUtil::FFSSpaceBelowCriticalLevelL( &iFsSession, 
                                               KNSmlMaxFwMgmtObjectRowSize ) )
        {
        User::Leave( KErrDiskFull );
        }
    
    iDatabase.Begin();
    
    // Insert new row, and set finalt result to its null value
    iFwObjectTable.InsertL();
    iFwObjectTable.SetColL( iColSet->ColNo( KNSmlFwMgmtObjectResult ), 
                            KNSmlFotaNullResult );
    iFwObjectTable.PutL();
    
    CommitAndCompact();
    
    _DBG_FILE("CNSmlDmFotaAdapterDb::AddFwObjectL(): end");
    
    return iFwObjectTable.ColUint( iColSet->ColNo( KNSmlFwMgmtObjectId ) );
    }
    
// ---------------------------------------------------------------------------
//  CNSmlDmFotaAdapterDb::DeleteFwObjectL()
//  Deletes a row from FwMgmtObject table identified by aId. If such row is 
//  not found, returns KErrNotFound, KErrNone otherwise.
// ---------------------------------------------------------------------------
// 
TInt CNSmlDmFotaAdapterDb::DeleteFwObjectL( const TNSmlDmFwObjectId aId )
    {
    _DBG_FILE("CNSmlDmFotaAdapterDb::DeleteFwObjectL(): begin");
    
    HBufC* sql = HBufC::NewL( KNSmlDeleteFwMgmtObject().Length() + 
                              KNSmlFwMgmtObjectIntegerLength );
    sql->Des().Format( KNSmlDeleteFwMgmtObject, aId );
    
    iDatabase.Begin();
    TInt result = iDatabase.Execute( *sql );
    CommitAndCompact();
    
    delete sql;
    
    _DBG_FILE("CNSmlDmFotaAdapterDb::DeleteFwObjectL(): end");
    
    return ( result == 0 ) ? KErrNotFound : KErrNone;
    }
    
// ---------------------------------------------------------------------------
//  CNSmlDmFotaAdapterDb::GetEmptyFinalResultsL()
//  Finds all the rows in FwMgmtObject table that have null final result and
//  puts the PkgIds of those rows to aArray.
// ---------------------------------------------------------------------------
// 
void CNSmlDmFotaAdapterDb::GetEmptyFinalResultsL( RNSmlDmFwObjectArray& aArray )
    {
    _DBG_FILE("CNSmlDmFotaAdapterDb::GetEmptyFinalResultsL(): begin");
    
    aArray.Reset();
    
    HBufC* sql = HBufC::NewLC( KNSmlGetUnfinishedFwMgmtObjects().Length() + 
                               KNSmlFwMgmtObjectIntLength );
    sql->Des().Format( KNSmlGetUnfinishedFwMgmtObjects, KNSmlFotaNullResult );
    
    PrepareViewL( *sql, iView.EReadOnly );

    CleanupStack::PopAndDestroy( sql );
    
    while ( iView.NextL() )
        {
        // get final result and append it to aArray
        iView.GetL();
        aArray.AppendL( iView.ColUint( 
                        iColSet->ColNo( KNSmlFwMgmtObjectId ) ) );
        }
    
    _DBG_FILE("CNSmlDmFotaAdapterDb::GetEmptyFinalResultsL(): end");
    }
    
// ---------------------------------------------------------------------------
//  CNSmlDmFotaAdapterDb::GetEmptyFinalResultsL()
//  Finds all the rows in FwMgmtObject table that have null final result, 
//  server id equals to aServerId and management uri is not an empty string.
//  Puts the PkgIds of those rows to aArray.
// ---------------------------------------------------------------------------
// 
void CNSmlDmFotaAdapterDb::GetEmptyFinalResultsL( RNSmlDmFwObjectArray& aArray, 
                                                  const TDesC8& aServerId )
    {
    _DBG_FILE("CNSmlDmFotaAdapterDb::GetEmptyFinalResultsL(serverid): begin");
    
    aArray.Reset();
    
    HBufC* serverId = ConvertTo16BitLC( aServerId );
    
    HBufC* sql = HBufC::NewLC( 
                        KNSmlGetUnfinishedFwMgmtObjectByServerId().Length() + 
                        KNSmlFwMgmtObjectIntLength + 
                        serverId->Length() );
    
    sql->Des().Format( KNSmlGetUnfinishedFwMgmtObjectByServerId, 
                       KNSmlFotaNullResult, 
                       serverId );
    
    PrepareViewL( *sql, iView.EReadOnly );

    CleanupStack::PopAndDestroy( sql );
    CleanupStack::PopAndDestroy( serverId );
    
    while ( iView.NextL() )
        {
        // get final result and append it to aArray
        iView.GetL();
        aArray.AppendL( iView.ColUint( 
                        iColSet->ColNo( KNSmlFwMgmtObjectId ) ) );
        }
    
    _DBG_FILE("CNSmlDmFotaAdapterDb::GetEmptyFinalResultsL( serverid ): end");
    }
    
// ---------------------------------------------------------------------------
//  CNSmlDmFotaAdapterDb::PkgNameL()
//  Returns the PkgName field from FW object identified by aId. If no such 
//  object is found, returns NULL.
// ---------------------------------------------------------------------------
// 
HBufC8* CNSmlDmFotaAdapterDb::PkgNameL( const TNSmlDmFwObjectId aId )
    {
    return StrValueL( KNSmlFwMgmtObjectName, aId );
    }
    
// ---------------------------------------------------------------------------
//  CNSmlDmFotaAdapterDb::PkgVersionL()
//  Returns the PkgVersion field from FW object identified by aId. If no such 
//  object is found, returns NULL.
// ---------------------------------------------------------------------------
// 
HBufC8* CNSmlDmFotaAdapterDb::PkgVersionL( const TNSmlDmFwObjectId aId )
    {
    return StrValueL( KNSmlFwMgmtObjectVersion, aId );
    }
    
// ---------------------------------------------------------------------------
//  CNSmlDmFotaAdapterDb::PkgUrlL()
//  Returns the PkgUrl field from FW object identified by aId. If no such 
//  object is found, returns NULL.
// ---------------------------------------------------------------------------
// 
HBufC8* CNSmlDmFotaAdapterDb::PkgUrlL( const TNSmlDmFwObjectId aId )
    {
    return LongStrValueL( KNSmlFwMgmtObjectUrl, aId );
    }
    
// ---------------------------------------------------------------------------
//  CNSmlDmFotaAdapterDb::MgmtUriL()
//  Returns the MgmtUri field from FW object identified by aId. If no such 
//  object is found, returns NULL.
// ---------------------------------------------------------------------------
// 
HBufC8* CNSmlDmFotaAdapterDb::MgmtUriL( const TNSmlDmFwObjectId aId )
    {
    return StrValueL( KNSmlFwMgmtObjectMgmtUri, aId );
    }
    
// ---------------------------------------------------------------------------
//  CNSmlDmFotaAdapterDb::ProfileIdL()
//  Returns the ProfileId field from FW object identified by aId. If no such 
//  object is found, returns KErrNotFound.
// ---------------------------------------------------------------------------
// 
TSmlProfileId CNSmlDmFotaAdapterDb::ProfileIdL( const TNSmlDmFwObjectId aId )
    {
    return IntValueL( KNSmlFwMgmtObjectProfileId, aId );
    }
    
// ---------------------------------------------------------------------------
//  CNSmlDmFotaAdapterDb::ServerIdL()
//  Returns the ServerId field from FW object identified by aId. If no such 
//  object is found, returns NULL.
// ---------------------------------------------------------------------------
// 
HBufC8* CNSmlDmFotaAdapterDb::ServerIdL( const TNSmlDmFwObjectId aId )
    {
    return StrValueL( KNSmlFwMgmtObjectServerId, aId );
    }
    
// ---------------------------------------------------------------------------
//  CNSmlDmFotaAdapterDb::FinalResultL()
//  Returns the FinalResult field from FW object identified by aId. If no such 
//  object is found, returns KErrNotFound.
// ---------------------------------------------------------------------------
// 
TInt CNSmlDmFotaAdapterDb::FinalResultL( const TNSmlDmFwObjectId aId )
    {
    return IntValueL( KNSmlFwMgmtObjectResult, aId );
    }
    
// ---------------------------------------------------------------------------
//  CNSmlDmFotaAdapterDb::CorrelatorL()
//  Returns the Correlator field from FW object identified by aId. If no such 
//  object is found, returns NULL.
// ---------------------------------------------------------------------------
// 
HBufC8* CNSmlDmFotaAdapterDb::CorrelatorL( const TNSmlDmFwObjectId aId )
    {
    return StrValueL( KNSmlFwMgmtObjectCorrelator, aId );
    }
    
// ---------------------------------------------------------------------------
//  CNSmlDmFotaAdapterDb::SetPkgNameL()
//  Sets aName as the value of PkgName in FW object identified by aId. If no 
//  such object is found, returns KErrNotFound. If name is too large for the 
//  database, returns KErrOverflow.
// ---------------------------------------------------------------------------
// 
TInt CNSmlDmFotaAdapterDb::SetPkgNameL( const TDesC8& aName, 
                                        const TNSmlDmFwObjectId aId )
    {
    if ( aName.Length() > KFotaMaxPkgNameLength )
        {
        return KErrOverflow;
        }
    
    return SetStrValueL( KNSmlFwMgmtObjectName, aName, aId );
    }
    
// ---------------------------------------------------------------------------
//  CNSmlDmFotaAdapterDb::SetPkgVersionL()
//  Sets aVersion as the value of PkgVersion in FW object identified by aId.
//  If no such object is found, returns KErrNotFound. If version is too 
//  large for the database, returns KErrOverflow.
// ---------------------------------------------------------------------------
// 
TInt CNSmlDmFotaAdapterDb::SetPkgVersionL( const TDesC8& aVersion, 
                                           const TNSmlDmFwObjectId aId )
    {
    if ( aVersion.Length() > KFotaMaxPkgVersionLength )
        {
        return KErrOverflow;
        }
    
    return SetStrValueL( KNSmlFwMgmtObjectVersion, aVersion, aId );
    }
    
// ---------------------------------------------------------------------------
//  CNSmlDmFotaAdapterDb::SetPkgUrlL()
//  Sets aUrl as the value of PkgURL in FW object identified by aId. If no 
//  such object is found, returns KErrNotFound. If url is too large for the 
//  database, returns KErrOverflow.
// ---------------------------------------------------------------------------
// 
TInt CNSmlDmFotaAdapterDb::SetPkgUrlL( const TDesC8& aUrl, 
                                       const TNSmlDmFwObjectId aId )
    {
    if ( aUrl.Length() > KFotaMaxPkgURLLength )
        {
        return KErrOverflow;
        }
    
    return SetLongStrValueL( KNSmlFwMgmtObjectUrl, aUrl, aId );
    }
    
// ---------------------------------------------------------------------------
//  CNSmlDmFotaAdapterDb::SetMgmtUriL()
//  Sets aUri as the value of MgmtURI in FW object identified by aId. If no 
//  such object is found, returns KErrNotFound. If uri is too large for the 
//  database, returns KErrOverflow.
// ---------------------------------------------------------------------------
// 
TInt CNSmlDmFotaAdapterDb::SetMgmtUriL( const TDesC8& aUri, 
                                        const TNSmlDmFwObjectId aId )
    {
    if ( aUri.Length() > KNSmlMaxMgmtUriLength )
        {
        return KErrOverflow;
        }
    
    return SetStrValueL( KNSmlFwMgmtObjectMgmtUri, aUri, aId );
    }
    
// ---------------------------------------------------------------------------
//  CNSmlDmFotaAdapterDb::SetServerInfoL()
//  Sets aProfileId as the value of ProfileId and aServerId as the value of 
//  ServerId in FW object identified by aId. If no such object is found, 
//  returns KErrNotFound. If server id is too large for the database, 
//  returns KErrOverflow.
// ---------------------------------------------------------------------------
// 
TInt CNSmlDmFotaAdapterDb::SetServerInfoL( const TSmlProfileId aProfile, 
                                           const TDesC8& aServerId, 
                                           const TNSmlDmFwObjectId aId )
    {
    _DBG_FILE("CNSmlDmFotaAdapterDb::SetServerInfoL(): begin");
    
    if ( aServerId.Length() > KNSmlMaxServerIdLength )
        {
        return KErrOverflow;
        }
    
    HBufC* serverId = ConvertTo16BitLC( aServerId );
    TInt ret = UpdateRowL( aId );
    
    if ( ret == KErrNone )
        {
        // do update
        iView.SetColL( iColSet->ColNo( KNSmlFwMgmtObjectProfileId ), 
                       aProfile );
        iView.SetColL( iColSet->ColNo( KNSmlFwMgmtObjectServerId ), 
                       *serverId );
        iView.PutL();
        }
    
    CommitAndCompact();
    
    CleanupStack::PopAndDestroy( serverId );
    
    _DBG_FILE("CNSmlDmFotaAdapterDb::SetServerInfoL(): end");
    
    return ret;
    }
    
// ---------------------------------------------------------------------------
//  CNSmlDmFotaAdapterDb::SetFinalResultL()
//  Sets aResult as the value of FinalResult in FW object identified by aId.
//  If no such object is found, returns KErrNotFound.
// ---------------------------------------------------------------------------
// 
TInt CNSmlDmFotaAdapterDb::SetFinalResultL( const TInt aResult, 
                                            const TNSmlDmFwObjectId aId )
    {
    return SetIntValueL( KNSmlFwMgmtObjectResult, aResult, aId );
    }
    
// ---------------------------------------------------------------------------
//  CNSmlDmFotaAdapterDb::SetCorrelatorL()
//  Sets aCorrealtor as the value of Correlator in FW object identified by aId.
//  If no such object is found, returns KErrNotFound. If given correlator is 
//  too large for the database, returns KErrOverflow.
// ---------------------------------------------------------------------------
// 
TInt CNSmlDmFotaAdapterDb::SetCorrelatorL( const TDesC8& aCorrelator, 
                                           const TNSmlDmFwObjectId aId )
    {
    if ( aCorrelator.Length() > KNSmlMaxCorrelatorLength )
        {
        return KErrOverflow;
        }
    
    return SetStrValueL( KNSmlFwMgmtObjectCorrelator, aCorrelator, aId );
    }

// ---------------------------------------------------------------------------
//  CNSmlDmFotaAdapterDb::CreateDatabaseL()
//  Creates Fota database.
// ---------------------------------------------------------------------------
// 
void CNSmlDmFotaAdapterDb::CreateDatabaseL( const TDesC& aFullName )
    {
    _DBG_FILE("CNSmlDmFotaAdapterDb::CreateDatabaseL(): begin");

    // Check OOD before creating new Fota DB
    if ( SysUtil::FFSSpaceBelowCriticalLevelL( &iFsSession, 
                                               KNSmlFotaAdapterEmptyDbSize ) )
        {
        User::Leave( KErrDiskFull );
        }

    // create sql query string, 5 = amount of length integers used in Format()
    HBufC* createFwMgmtTable = HBufC::NewLC( 
                                    KNSmlCreateFwMgmtObjectTable().Length() + 
                                    KNSmlFwMgmtObjectIntLength*5 );
    
    createFwMgmtTable->Des().Format( KNSmlCreateFwMgmtObjectTable, 
                                     KFotaMaxPkgNameLength,
                                     KFotaMaxPkgVersionLength,
                                     KNSmlMaxMgmtUriLength,
                                     KNSmlMaxServerIdLength,
                                     KNSmlMaxCorrelatorLength );

    User::LeaveIfError( iDatabase.Create( iRdbSession,
	                                      aFullName,
	                                      KNSmlDBMSSecureMDHostOneID ) );
    iDatabase.Begin();
    iDatabase.Execute( *createFwMgmtTable );

    CommitAndCompact();
    iDatabase.Close();
    
    CleanupStack::PopAndDestroy( createFwMgmtTable );
    
    _DBG_FILE("CNSmlDmFotaAdapterDb::CreateDatabaseL(): end");
    }   


// ---------------------------------------------------------------------------
//  CNSmlDmFotaAdapterDb::SetStrValueL()
//  Sets aValue as the value of aColumn in FW object identified by aObject.
// ---------------------------------------------------------------------------
// 
TInt CNSmlDmFotaAdapterDb::SetStrValueL( const TDesC& aColumn, 
                                         const TDesC8& aValue,
                                         const TNSmlDmFwObjectId aObject )
    {
    _DBG_FILE("CNSmlDmFotaAdapterDb::SetStrValueL(): begin");
    
    HBufC* value = ConvertTo16BitLC( aValue );
    
    DBG_ARGS( _S16("CNSmlDmFotaAdapterDb::SetStrValueL(): ('%S', '%S', %d)"), 
              &aColumn, value, aObject );
    
    TInt ret = UpdateRowL( aObject );
    
    if ( ret == KErrNone )
        {
        // do update
        iView.SetColL( iColSet->ColNo( aColumn ), *value );
        iView.PutL();
        }
    
    CommitAndCompact();
    
    CleanupStack::PopAndDestroy( value );
    
    _DBG_FILE("CNSmlDmFotaAdapterDb::SetStrValueL(): end");
    
    return ret;
    }

// ---------------------------------------------------------------------------
//  CNSmlDmFotaAdapterDb::SetLongStrValueL()
//  Streams aValue and its length as the value of aColumn in FW object 
//  identified by aObject.
// ---------------------------------------------------------------------------
// 
TInt CNSmlDmFotaAdapterDb::SetLongStrValueL( const TDesC& aColumn, 
                                             const TDesC8& aValue, 
                                             const TNSmlDmFwObjectId aObject )
    {
    _DBG_FILE("CNSmlDmFotaAdapterDb::SetLongStrValueL(): begin");
    
    HBufC* value = ConvertTo16BitLC( aValue );
    
    DBG_ARGS( _S16("CNSmlDmFotaAdapterDb::SetStrValueL(): ('%S', '%S', %d)"),
              &aColumn, value, aObject );
    
    TInt ret = UpdateRowL( aObject );
    
    if ( ret == KErrNone )
        {
        // do update
        
        RDbColWriteStream wStream;
        wStream.OpenL( iView, iColSet->ColNo( aColumn ) );
        CleanupClosePushL( wStream );
        
        wStream.WriteInt32L( value->Length() );
        wStream.WriteL( *value, value->Length() );
        
        CleanupStack::PopAndDestroy( &wStream );
        
        iView.PutL();
        }
    
    CommitAndCompact();
    
    CleanupStack::PopAndDestroy( value );
    
    _DBG_FILE("CNSmlDmFotaAdapterDb::SetLongStrValueL(): end");
    
    return ret;
    }

// ---------------------------------------------------------------------------
//  CNSmlDmFotaAdapterDb::SetIntValueL()
//  Sets aValue as the value of aColumn in FW object identified by aObject.
// ---------------------------------------------------------------------------
// 
TInt CNSmlDmFotaAdapterDb::SetIntValueL( const TDesC& aColumn, 
                                         const TInt aValue, 
                                         const TNSmlDmFwObjectId aObject )
    {
    _DBG_FILE("CNSmlDmFotaAdapterDb::SetIntValueL(): begin");
    DBG_ARGS( _S16("CNSmlDmFotaAdapterDb::SetIntValueL(): ('%S', %d, %d)"), 
              &aColumn, aValue, aObject );
    
    TInt ret = UpdateRowL( aObject );
    
    if ( ret == KErrNone )
        {
        // do update
        iView.SetColL( iColSet->ColNo( aColumn ), aValue );
        iView.PutL();
        }
    
    CommitAndCompact();
    
    _DBG_FILE("CNSmlDmFotaAdapterDb::SetIntValueL(): end");
    
    return ret;
    }
    
// ---------------------------------------------------------------------------
//  CNSmlDmFotaAdapterDb::UpdateRowL()
//  Prepares iView when setting a value to one of the rows in DB table. 
// ---------------------------------------------------------------------------
// 
TInt CNSmlDmFotaAdapterDb::UpdateRowL( const TNSmlDmFwObjectId aObject )
    {
    TInt ret = KErrNone;
    
    HBufC* sql = FwMgmtObjectRowSqlLC( aObject );
    PrepareViewL( *sql, iView.EUpdatable );
    iDatabase.Begin();

    CleanupStack::PopAndDestroy( sql );
    
    if ( iView.FirstL() )
        {
        // fw object exists
        // Get current row for accessing and initiate update
        iView.GetL();
        iView.UpdateL();
        }
    else
        {
        // fw object does not exists, cannot update
        ret = KErrNotFound;
        }
    
    return ret;
    }
    
// ---------------------------------------------------------------------------
//  CNSmlDmFotaAdapterDb::StrValueL()
//  Returns the value in FW object identified by aObject in column aColumn.
// ---------------------------------------------------------------------------
// 
HBufC8* CNSmlDmFotaAdapterDb::StrValueL( const TDesC& aColumn, 
                                         const TNSmlDmFwObjectId aObject )
    {
    DBG_ARGS( _S16("CNSmlDmFotaAdapterDb::StrValueL('%S', %d): begin"), 
              &aColumn, aObject );
    
    HBufC8* value = NULL;
    
    FetchRowL( aObject );
    
    if ( iView.FirstL() )
        {
        // get value
        iView.GetL();
        TPtrC res = iView.ColDes( iColSet->ColNo( aColumn ) );
        
        // convert to 8-bit
        value = HBufC8::NewL( res.Length() );
        value->Des().Copy( res );
        }
    
    _DBG_FILE("CNSmlDmFotaAdapterDb::StrValueL(): end");
    
    return value;
    }

// ---------------------------------------------------------------------------
//  CNSmlDmFotaAdapterDb::LongStrValueL()
//  Returns the value in FW object identified by aObject in column aColumn.
// ---------------------------------------------------------------------------
// 
HBufC8* CNSmlDmFotaAdapterDb::LongStrValueL( const TDesC& aColumn, 
                                             const TNSmlDmFwObjectId aObject )
    {
    DBG_ARGS( _S16("CNSmlDmFotaAdapterDb::LongStrValueL('%S', %d): begin"), 
              &aColumn, aObject );
    
    HBufC8* value = NULL;
    
    FetchRowL( aObject );
    
    if ( iView.FirstL() )
        {
        // get value
        iView.GetL();
        
        RDbColReadStream rStream;
        rStream.OpenL( iView, iColSet->ColNo( aColumn ) );
        CleanupClosePushL( rStream );
        
        TInt length = 0;
        TRAPD( err, length = rStream.ReadInt32L() );
        
        HBufC* buf = HBufC::NewLC( length );
        TPtr bufPtr = buf->Des();
        
        if ( err == KErrNone )
            {
            rStream.ReadL( bufPtr, length );
            }
        
        // convert to 8-bit
        value = HBufC8::NewL( bufPtr.Length() );
        value->Des().Copy( bufPtr );
        
        CleanupStack::PopAndDestroy( buf );
        CleanupStack::PopAndDestroy( &rStream );
        }
    
    _DBG_FILE("CNSmlDmFotaAdapterDb::LongStrValueL(): end");
    
    return value;
    }

// ---------------------------------------------------------------------------
//  CNSmlDmFotaAdapterDb::IntValueL()
//  Returns the value in FW object identified by aObject in column aColumn.
// ---------------------------------------------------------------------------
// 
TInt CNSmlDmFotaAdapterDb::IntValueL( const TDesC& aColumn,
                                      const TNSmlDmFwObjectId aObject )
    {
    DBG_ARGS( _S16("CNSmlDmFotaAdapterDb::IntValueL('%S', %d): begin"), 
              &aColumn, aObject );
    
    TInt value = KErrNotFound;
    
    FetchRowL( aObject );
    
    if ( iView.FirstL() )
        {
        iView.GetL();
        value = iView.ColInt( iColSet->ColNo( aColumn ) );
        }
    
    _DBG_FILE("CNSmlDmFotaAdapterDb::IntValueL(): end");
    
    return value;
    }

// ---------------------------------------------------------------------------
//  CNSmlDmFotaAdapterDb::FetchRowL()
//  Prepares iView when getting a single row from DB.
// ---------------------------------------------------------------------------
// 
void CNSmlDmFotaAdapterDb::FetchRowL( const TNSmlDmFwObjectId aObject )
    {
    HBufC* sql = FwMgmtObjectRowSqlLC( aObject );
    
    PrepareViewL( *sql, iView.EReadOnly );

    CleanupStack::PopAndDestroy( sql );
    }

// ---------------------------------------------------------------------------
//  CNSmlDmFotaAdapterDb::FwMgmtObjectRowSqlLC()
//  Returns a buffer containing formatted SQL statement for getting a FW object 
//  identified by aId.
// ---------------------------------------------------------------------------
// 
HBufC* CNSmlDmFotaAdapterDb::FwMgmtObjectRowSqlLC( TNSmlDmFwObjectId aId ) const
    {
    HBufC* sql = HBufC::NewLC( KNSmlGetFwMgmtObject().Length() + 
                               KNSmlFwMgmtObjectIntegerLength );
    
    TPtr sqlPtr = sql->Des();
    sqlPtr.Format( KNSmlGetFwMgmtObject, aId );
    return sql;
    }

// ---------------------------------------------------------------------------
//  CNSmlDmFotaAdapterDb::PrepareViewL()
//  Closes and prepares the view
// ---------------------------------------------------------------------------
// 
void CNSmlDmFotaAdapterDb::PrepareViewL( const TDesC& aSql, 
                                         RDbRowSet::TAccess aAccess )
    {
    iView.Close();
    User::LeaveIfError( iView.Prepare( iDatabase, TDbQuery(aSql), aAccess ) );
    
    if ( iView.Unevaluated() )
        {
        User::LeaveIfError( iView.EvaluateAll() );
        }
    }

// ---------------------------------------------------------------------------
//  CNSmlDmFotaAdapterDb::CommitAndCompact()
//  Commits update and compacts the database
// ---------------------------------------------------------------------------
// 
void CNSmlDmFotaAdapterDb::CommitAndCompact() 
    {
    iDatabase.Commit();
    iDatabase.Compact();
    }

// ---------------------------------------------------------------------------
//  CNSmlDmFotaAdapterDb::ConvertTo16BitLC()
//  Returns a pointer to a unicode copy of the given 8-bit descriptor.
//  The pointer to the copy is allocated from heap and pushed on the 
//  CleanupStack.
// ---------------------------------------------------------------------------
// 
HBufC* CNSmlDmFotaAdapterDb::ConvertTo16BitLC( const TDesC8& aDes ) const
    {
    HBufC* buf = HBufC::NewLC( aDes.Length() );
    buf->Des().Copy( aDes );
    
    return buf;
    }