diff -r 000000000000 -r c53acadfccc6 metadataengine/server/inc/mdspreferences.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/metadataengine/server/inc/mdspreferences.h Mon Jan 18 20:34:07 2010 +0200 @@ -0,0 +1,410 @@ +/* +* 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: Stores and load preference values to and from DB +* +*/ + +#ifndef __MDSPREFERENCES_H__ +#define __MDSPREFERENCES_H__ + +#include +#include "mdsclausebuffer.h" +#include "mdssqliteconnection.h" +#include "mdsdbconnectionpool.h" +#include "mdsfindsqlclausedef.h" + +_LIT( KMdsPreferencesDeleteKey, "DELETE FROM MdE_Preferences WHERE Key = ?;"); + +/** + * Metadata preference class + * + * This class is responsible for storing and loading preferences to and from DB + * + */ +class MMdsPreferences + { +public: + + enum TMdsPreferencesFlags + { + EPreferenceNone = 0x00000000, + EPreferenceValueSet = 0x00000001, + EPreferenceValueGet = 0x00000002, + EPreferenceExtraSet = 0x00000004, + EPreferenceExtraGet = 0x00000008, + EPreferenceValueSortAsc = 0x00000010, + EPreferenceValueSortDesc = 0x00000020, + EPreferenceExtraSortAsc = 0x00000040, + EPreferenceExtraSortDesc = 0x00000080, + EPreferenceBothSet = EPreferenceValueSet | EPreferenceExtraSet, + EPreferenceBothGet = EPreferenceValueGet | EPreferenceExtraGet, + EPreferenceValueUse = EPreferenceValueSet | EPreferenceValueGet, + EPreferenceExtraUse = EPreferenceExtraSet | EPreferenceExtraGet, + EPreferenceAllUse = EPreferenceValueUse | EPreferenceExtraUse + }; + + /** + * HOW TO USE + _LIT( KTestNameValue, "TestNameValue" ); + _LIT( KTestNameExtra, "TestNameExtra" ); + _LIT( KTestNameAll, "TestNameAll" ); + CMdsPreferences::InsertToDefaultDBL( db, KTestNameValue, CMdsPreferences::EPreferenceValueSet, 12.5f ); + CMdsPreferences::InsertToDefaultDBL( db, KTestNameExtra, CMdsPreferences::EPreferenceExtraSet, 99 ); + CMdsPreferences::InsertToDefaultDBL( db, KTestNameAll, CMdsPreferences::EPreferenceBothSet, KTestNameExtra, -10 ); + + CMdsPreferences::UpdateDefaultDBL( db, KTestNameValue, CMdsPreferences::EPreferenceValueSet, 578 ); + CMdsPreferences::UpdateDefaultDBL( db, KTestNameExtra, CMdsPreferences::EPreferenceExtraSet, 12 ); + CMdsPreferences::UpdateDefaultDBL( db, KTestNameAll, CMdsPreferences::EPreferenceBothSet, 345.64f, -666 ); + + CMdsPreferences::DeleteFromDefaultDBL( db, KTestNameValue ); + CMdsPreferences::DeleteFromDefaultDBL( db, KTestNameValue, CMdsPreferences::EPreferenceValueSet, 578 ); + CMdsPreferences::DeleteFromDefaultDBL( db, KTestNameExtra, CMdsPreferences::EPreferenceExtraSet, 12 ); + CMdsPreferences::DeleteFromDefaultDBL( db, KTestNameAll, CMdsPreferences::EPreferenceBothSet, 345.64f, -666 ); + */ + + + template + static TInt InsertL( const TDesC& aKey, TUint32 aFlags, const T& aValue, TInt64 aExtraValue = 0 ) + { + _LIT( KMdsPreferencesInsertValue, "INSERT INTO MdE_Preferences(Key, Value) VALUES(?, ?);"); + _LIT( KMdsPreferencesInsertAll, "INSERT INTO MdE_Preferences(Key, Value, ExtraValue) VALUES(?, ?, ?);"); + + TInt result = 0; + RRowData data; + CleanupClosePushL( data ); + data.AppendL( TColumn(aKey) ); + data.AppendL( TColumn(aValue) ); + + CMdSSqLiteConnection& connection = MMdSDbConnectionPool::GetDefaultDBL(); + if ( aFlags & EPreferenceValueSet && aFlags & EPreferenceExtraSet ) + { + data.AppendL( TColumn(aExtraValue) ); + result = connection.ExecuteL( KMdsPreferencesInsertAll, data ); + } + else if ( aFlags & EPreferenceValueSet ) + { + result = connection.ExecuteL( KMdsPreferencesInsertValue, data ); + } + + else + { + User::Leave( KErrCorrupt ); + } + + CleanupStack::PopAndDestroy( &data ); + return result; + } + + template + static TInt UpdateL( const TDesC& aKey, TUint32 aFlags, const T& aValue, TInt64 aExtraValue = 0 ) + { + _LIT( KMdsPreferencesUpdateValue, "UPDATE MdE_Preferences SET Value = ? WHERE Key = ?;"); + _LIT( KMdsPreferencesUpdateExtra, "UPDATE MdE_Preferences SET ExtraValue = ? WHERE Key = ? AND Value = ?;"); + _LIT( KMdsPreferencesUpdateBoth, "UPDATE MdE_Preferences SET Value = ?, ExtraValue = ? WHERE Key = ?;"); + + TInt result = 0; + RRowData data; + CleanupClosePushL( data ); + + CMdSSqLiteConnection& connection = MMdSDbConnectionPool::GetDefaultDBL(); + if ( aFlags & EPreferenceValueSet && aFlags & EPreferenceExtraSet ) + { + data.AppendL( TColumn(aValue) ); + data.AppendL( TColumn(aExtraValue) ); + data.AppendL( TColumn(aKey) ); + result = connection.ExecuteL( KMdsPreferencesUpdateBoth, data ); + } + else if ( aFlags & EPreferenceValueSet ) + { + data.AppendL( TColumn(aValue) ); + data.AppendL( TColumn(aKey) ); + result = connection.ExecuteL( KMdsPreferencesUpdateValue, data ); + } + else if ( aFlags & EPreferenceExtraSet ) + { + data.AppendL( TColumn(aExtraValue) ); + data.AppendL( TColumn(aKey) ); + data.AppendL( TColumn(aValue) ); + result = connection.ExecuteL( KMdsPreferencesUpdateExtra, data ); + } + else + { + User::Leave( KErrCorrupt ); + } + + CleanupStack::PopAndDestroy( &data ); + return result; + } + + template + static TInt DeleteL( const TDesC& aKey ) + { + TInt result = 0; + RRowData data; + CleanupClosePushL( data ); + data.AppendL( TColumn(aKey) ); + + CMdSSqLiteConnection& connection = MMdSDbConnectionPool::GetDefaultDBL(); + result = connection.ExecuteL( KMdsPreferencesDeleteKey, data ); + + CleanupStack::PopAndDestroy( &data ); + return result; + } + + template + static TInt DeleteL( const TDesC& aKey, TUint32 aFlags, const T& aValue, TInt64 aExtraValue = 0 ) + { + _LIT( KMdsPreferencesDeleteValue, "DELETE FROM MdE_Preferences WHERE Key = ? AND Value = ?;"); + _LIT( KMdsPreferencesDeleteExtra, "DELETE FROM MdE_Preferences WHERE Key = ? AND ExtraValue = ?;"); + _LIT( KMdsPreferencesDeleteAll, "DELETE FROM MdE_Preferences WHERE Key = ? AND Value = ? AND ExtraValue = ?;"); + + TInt result = 0; + RRowData data; + CleanupClosePushL( data ); + data.AppendL( TColumn(aKey) ); + + CMdSSqLiteConnection& connection = MMdSDbConnectionPool::GetDefaultDBL(); + if ( aFlags == EPreferenceNone ) + { + result = connection.ExecuteL( KMdsPreferencesDeleteKey, data ); + } + else if ( aFlags & EPreferenceValueSet && aFlags & EPreferenceExtraSet ) + { + data.AppendL( TColumn(aValue) ); + data.AppendL( TColumn(aExtraValue) ); + result = connection.ExecuteL( KMdsPreferencesDeleteAll, data ); + } + else if ( aFlags & EPreferenceValueSet ) + { + data.AppendL( TColumn(aValue) ); + result = connection.ExecuteL( KMdsPreferencesDeleteValue, data ); + } + else if ( aFlags & EPreferenceExtraSet ) + { + data.AppendL( TColumn(aExtraValue) ); + result = connection.ExecuteL( KMdsPreferencesDeleteExtra, data ); + } + else + { + User::Leave( KErrCorrupt ); + } + + CleanupStack::PopAndDestroy( &data ); + return result; + } + + template + static TInt GetL( const TDesC& aKey, TUint32 aFlags, T& aValue, TInt64* aExtraValue = NULL ) + { + _LIT( KMdsPreferencesGetKey, "SELECT Value, ExtraValue FROM MdE_Preferences WHERE Key = ? "); + + _LIT( KMdsPreferencesGetValue, "AND Value = ? "); + _LIT( KMdsPreferencesGetExtra, "AND ExtraValue = ? "); + _LIT( KMdsPreferencesGetAll, "AND Value = ? AND ExtraValue = ? "); + + _LIT( KMdsPreferencesSortBegin, "ORDER BY "); + _LIT( KMdsPreferencesSortValueAsc, "Value ASC "); + _LIT( KMdsPreferencesSortValueDesc, "Value DESC "); + _LIT( KMdsPreferencesSortExtraAsc, "ExtraValue ASC "); + _LIT( KMdsPreferencesSortExtraDesc, "ExtraValue DESC "); + _LIT( KMdsPreferencesSortEnd, "LIMIT 1;"); + + const TUint32 KSortFlags = EPreferenceValueSortAsc | + EPreferenceValueSortDesc | + EPreferenceExtraSortAsc | + EPreferenceExtraSortDesc; + + CMdsClauseBuffer* sortBuffer = CMdsClauseBuffer::NewLC( 8 ); // estimated minimum lenght for sort rules + + // check if there is some order rules + if( KSortFlags & aFlags ) + { + sortBuffer->AppendL( KMdsPreferencesSortBegin ); + + TBool notFirstOrderRule = EFalse; + + if( EPreferenceValueSortAsc & aFlags ) + { + sortBuffer->AppendL( KMdsPreferencesSortValueAsc ); + + notFirstOrderRule = ETrue; + } + + if( EPreferenceValueSortDesc & aFlags ) + { + if( notFirstOrderRule ) + { + sortBuffer->AppendL( KComma ); + } + sortBuffer->AppendL( KMdsPreferencesSortValueDesc ); + notFirstOrderRule = ETrue; + } + + if( EPreferenceExtraSortAsc & aFlags ) + { + if( notFirstOrderRule ) + { + sortBuffer->AppendL( KComma ); + } + sortBuffer->AppendL( KMdsPreferencesSortExtraAsc ); + notFirstOrderRule = ETrue; + } + + if( EPreferenceExtraSortDesc & aFlags ) + { + if( notFirstOrderRule ) + { + sortBuffer->AppendL( KComma ); + } + sortBuffer->AppendL( KMdsPreferencesSortExtraDesc ); + notFirstOrderRule = ETrue; + } + } + + // always added because it limits result count to 1 + sortBuffer->AppendL( KMdsPreferencesSortEnd ); + + CMdsClauseBuffer* selectBuffer = CMdsClauseBuffer::NewLC( + 64 + sortBuffer->ConstBufferL().Length() ); // estimated minimum lenght for select and sort rules + + /// always added default select + selectBuffer->AppendL( KMdsPreferencesGetKey ); + + TInt result = 0; + RRowData data; + CleanupClosePushL( data ); + data.AppendL( TColumn(aKey) ); + + RRowData getData; + CleanupClosePushL( getData ); + getData.AppendL( TColumn(aValue) ); + getData.AppendL( TColumn(EColumnInt64) ); + + if ( !aExtraValue && (aFlags & EPreferenceExtraSet || aFlags & EPreferenceExtraGet) ) + { + User::Leave( KErrArgument ); + } + + CMdSSqLiteConnection& connection = MMdSDbConnectionPool::GetDefaultDBL(); + RMdsStatement query; + CleanupClosePushL( query ); + if ( aFlags == EPreferenceNone ) + { + // do nothing + } + else if ( aFlags & EPreferenceValueSet && aFlags & EPreferenceExtraSet ) + { + data.AppendL( TColumn(aValue) ); + data.AppendL( TColumn(*aExtraValue) ); + + selectBuffer->AppendL( KMdsPreferencesGetAll ); + selectBuffer->AppendL( sortBuffer->ConstBufferL() ); + + connection.ExecuteQueryL( selectBuffer->ConstBufferL(), query, data ); + + + if ( connection.NextRowL( query, getData ) ) + { + result = 1; + if (aFlags & EPreferenceValueGet) + { + getData.Column( 0 ).Get( aValue ); + } + + if (aFlags & EPreferenceExtraGet) + { + getData.Column( 1 ).Get( *aExtraValue ); + } + } + } + else if ( aFlags & EPreferenceValueSet ) + { + data.AppendL( TColumn(aValue) ); + + selectBuffer->AppendL( KMdsPreferencesGetValue ); + selectBuffer->AppendL( sortBuffer->ConstBufferL() ); + + connection.ExecuteQueryL( selectBuffer->ConstBufferL(), query, data ); + if ( connection.NextRowL( query, getData ) ) + { + result = 1; + if (aFlags & EPreferenceValueGet) + { + getData.Column( 0 ).Get( aValue ); + } + + if (aFlags & EPreferenceExtraGet) + { + getData.Column( 1 ).Get( *aExtraValue ); + } + } + } + else if ( aFlags & EPreferenceExtraSet ) + { + data.AppendL( TColumn(*aExtraValue) ); + + selectBuffer->AppendL( KMdsPreferencesGetExtra ); + selectBuffer->AppendL( sortBuffer->ConstBufferL() ); + + connection.ExecuteQueryL( selectBuffer->ConstBufferL(), query, data ); + if ( connection.NextRowL( query, getData ) ) + { + result = 1; + if (aFlags & EPreferenceValueGet) + { + getData.Column( 0 ).Get( aValue ); + } + + if (aFlags & EPreferenceExtraGet) + { + getData.Column( 1 ).Get( *aExtraValue ); + } + } + } + else + { + selectBuffer->AppendL( sortBuffer->ConstBufferL() ); + + connection.ExecuteQueryL( selectBuffer->ConstBufferL(), query, data ); + if ( connection.NextRowL( query, getData ) ) + { + result = 1; + if (aFlags & EPreferenceValueGet) + { + getData.Column( 0 ).Get( aValue ); + } + + if (aFlags & EPreferenceExtraGet) + { + getData.Column( 1 ).Get( *aExtraValue ); + } + } + } + + CleanupStack::PopAndDestroy( &query ); + CleanupStack::PopAndDestroy( &getData ); + CleanupStack::PopAndDestroy( &data ); + + CleanupStack::PopAndDestroy( selectBuffer ); + CleanupStack::PopAndDestroy( sortBuffer ); + + return result; + } + +private: + + }; + + +#endif // __MDSPREFERENCES_H__