--- /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 <e32base.h>
+#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<class T>
+ 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<class T>
+ 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<class T>
+ 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<class T>
+ 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<class T>
+ 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__