metadataengine/server/inc/mdspreferences.h
changeset 0 c53acadfccc6
child 19 b73252188534
equal deleted inserted replaced
-1:000000000000 0:c53acadfccc6
       
     1 /*
       
     2 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  Stores and load preference values to and from DB
       
    15 *
       
    16 */
       
    17 
       
    18 #ifndef __MDSPREFERENCES_H__
       
    19 #define __MDSPREFERENCES_H__
       
    20 
       
    21 #include <e32base.h>
       
    22 #include "mdsclausebuffer.h"
       
    23 #include "mdssqliteconnection.h"
       
    24 #include "mdsdbconnectionpool.h"
       
    25 #include "mdsfindsqlclausedef.h"
       
    26 
       
    27 _LIT( KMdsPreferencesDeleteKey,   "DELETE FROM MdE_Preferences WHERE Key = ?;");
       
    28 
       
    29 /**
       
    30  *  Metadata preference class
       
    31  *
       
    32  *  This class is responsible for storing and loading preferences to and from DB
       
    33  *
       
    34  */
       
    35 class MMdsPreferences
       
    36     {
       
    37 public:
       
    38 
       
    39 	enum TMdsPreferencesFlags
       
    40 		{
       
    41 		EPreferenceNone          = 0x00000000,
       
    42 		EPreferenceValueSet      = 0x00000001,
       
    43 		EPreferenceValueGet      = 0x00000002,
       
    44 		EPreferenceExtraSet      = 0x00000004,
       
    45 		EPreferenceExtraGet      = 0x00000008,
       
    46 		EPreferenceValueSortAsc  = 0x00000010,
       
    47 		EPreferenceValueSortDesc = 0x00000020,
       
    48 		EPreferenceExtraSortAsc  = 0x00000040,
       
    49 		EPreferenceExtraSortDesc = 0x00000080,
       
    50 		EPreferenceBothSet       = EPreferenceValueSet | EPreferenceExtraSet,
       
    51 		EPreferenceBothGet       = EPreferenceValueGet | EPreferenceExtraGet,
       
    52 		EPreferenceValueUse      = EPreferenceValueSet | EPreferenceValueGet,
       
    53 		EPreferenceExtraUse      = EPreferenceExtraSet | EPreferenceExtraGet,
       
    54 		EPreferenceAllUse        = EPreferenceValueUse | EPreferenceExtraUse
       
    55 		};
       
    56 
       
    57 	/**
       
    58 	 * HOW TO USE
       
    59     _LIT( KTestNameValue, "TestNameValue" );
       
    60     _LIT( KTestNameExtra, "TestNameExtra" );
       
    61     _LIT( KTestNameAll,   "TestNameAll" );
       
    62     CMdsPreferences::InsertToDefaultDBL( db, KTestNameValue, CMdsPreferences::EPreferenceValueSet, 12.5f );
       
    63     CMdsPreferences::InsertToDefaultDBL( db, KTestNameExtra, CMdsPreferences::EPreferenceExtraSet, 99 );
       
    64     CMdsPreferences::InsertToDefaultDBL( db, KTestNameAll, CMdsPreferences::EPreferenceBothSet, KTestNameExtra, -10 );
       
    65     
       
    66     CMdsPreferences::UpdateDefaultDBL( db, KTestNameValue, CMdsPreferences::EPreferenceValueSet, 578 );
       
    67     CMdsPreferences::UpdateDefaultDBL( db, KTestNameExtra, CMdsPreferences::EPreferenceExtraSet, 12 );
       
    68     CMdsPreferences::UpdateDefaultDBL( db, KTestNameAll, CMdsPreferences::EPreferenceBothSet, 345.64f, -666 );
       
    69 
       
    70     CMdsPreferences::DeleteFromDefaultDBL( db, KTestNameValue );
       
    71     CMdsPreferences::DeleteFromDefaultDBL( db, KTestNameValue, CMdsPreferences::EPreferenceValueSet, 578 );
       
    72     CMdsPreferences::DeleteFromDefaultDBL( db, KTestNameExtra, CMdsPreferences::EPreferenceExtraSet, 12 );
       
    73     CMdsPreferences::DeleteFromDefaultDBL( db, KTestNameAll, CMdsPreferences::EPreferenceBothSet, 345.64f, -666 );
       
    74     */
       
    75 
       
    76 
       
    77 	template<class T>
       
    78 	static TInt InsertL( const TDesC& aKey, TUint32 aFlags, const T& aValue, TInt64 aExtraValue = 0 )
       
    79 		{
       
    80 		_LIT( KMdsPreferencesInsertValue,   "INSERT INTO MdE_Preferences(Key, Value) VALUES(?, ?);");
       
    81 		_LIT( KMdsPreferencesInsertAll,     "INSERT INTO MdE_Preferences(Key, Value, ExtraValue) VALUES(?, ?, ?);");
       
    82 		
       
    83 		TInt result = 0;
       
    84 		RRowData data;
       
    85 		CleanupClosePushL( data );
       
    86 		data.AppendL( TColumn(aKey) );
       
    87 		data.AppendL( TColumn(aValue) );
       
    88 		
       
    89 		CMdSSqLiteConnection& connection = MMdSDbConnectionPool::GetDefaultDBL();
       
    90 		if ( aFlags & EPreferenceValueSet && aFlags & EPreferenceExtraSet )
       
    91 			{
       
    92 			data.AppendL( TColumn(aExtraValue) );
       
    93 			result = connection.ExecuteL( KMdsPreferencesInsertAll, data );
       
    94 			}
       
    95 		else if ( aFlags & EPreferenceValueSet )
       
    96 			{
       
    97 			result = connection.ExecuteL( KMdsPreferencesInsertValue, data );
       
    98 			}
       
    99 		
       
   100 		else
       
   101 			{
       
   102 			User::Leave( KErrCorrupt );
       
   103 			}
       
   104 		
       
   105 		CleanupStack::PopAndDestroy( &data );
       
   106 		return result;
       
   107 		}
       
   108 
       
   109 	template<class T>
       
   110 	static TInt UpdateL( const TDesC& aKey, TUint32 aFlags, const T& aValue, TInt64 aExtraValue = 0 )
       
   111 		{
       
   112 		_LIT( KMdsPreferencesUpdateValue, "UPDATE MdE_Preferences SET Value = ? WHERE Key = ?;");
       
   113 		_LIT( KMdsPreferencesUpdateExtra, "UPDATE MdE_Preferences SET ExtraValue = ? WHERE Key = ? AND Value = ?;");
       
   114 		_LIT( KMdsPreferencesUpdateBoth,  "UPDATE MdE_Preferences SET Value = ?, ExtraValue = ? WHERE Key = ?;");
       
   115 		
       
   116 		TInt result = 0;
       
   117 		RRowData data;
       
   118 		CleanupClosePushL( data );
       
   119 		
       
   120 		CMdSSqLiteConnection& connection = MMdSDbConnectionPool::GetDefaultDBL();
       
   121 		if ( aFlags & EPreferenceValueSet && aFlags & EPreferenceExtraSet )
       
   122 			{
       
   123 			data.AppendL( TColumn(aValue) );
       
   124 			data.AppendL( TColumn(aExtraValue) );
       
   125 			data.AppendL( TColumn(aKey) );
       
   126 			result = connection.ExecuteL( KMdsPreferencesUpdateBoth, data );
       
   127 			}
       
   128 		else if ( aFlags & EPreferenceValueSet )
       
   129 			{
       
   130 			data.AppendL( TColumn(aValue) );
       
   131 			data.AppendL( TColumn(aKey) );
       
   132 			result = connection.ExecuteL( KMdsPreferencesUpdateValue, data );
       
   133 			}
       
   134 		else if ( aFlags & EPreferenceExtraSet )
       
   135 			{
       
   136 			data.AppendL( TColumn(aExtraValue) );
       
   137 			data.AppendL( TColumn(aKey) );
       
   138 			data.AppendL( TColumn(aValue) );
       
   139 			result = connection.ExecuteL( KMdsPreferencesUpdateExtra, data );
       
   140 			}
       
   141 		else
       
   142 			{
       
   143 			User::Leave( KErrCorrupt );
       
   144 			}
       
   145 		
       
   146 		CleanupStack::PopAndDestroy( &data );
       
   147 		return result;
       
   148 		}
       
   149 
       
   150 	template<class T>
       
   151 	static TInt DeleteL( const TDesC& aKey )
       
   152 		{	
       
   153 		TInt result = 0;
       
   154 		RRowData data;
       
   155 		CleanupClosePushL( data );
       
   156 		data.AppendL( TColumn(aKey) );
       
   157 		
       
   158 		CMdSSqLiteConnection& connection = MMdSDbConnectionPool::GetDefaultDBL();
       
   159 		result = connection.ExecuteL( KMdsPreferencesDeleteKey, data );
       
   160 		
       
   161 		CleanupStack::PopAndDestroy( &data );
       
   162 		return result;
       
   163 		}
       
   164 
       
   165 	template<class T>
       
   166 	static TInt DeleteL( const TDesC& aKey, TUint32 aFlags, const T& aValue, TInt64 aExtraValue = 0 )
       
   167 		{
       
   168 		_LIT( KMdsPreferencesDeleteValue, "DELETE FROM MdE_Preferences WHERE Key = ? AND Value = ?;");
       
   169 		_LIT( KMdsPreferencesDeleteExtra, "DELETE FROM MdE_Preferences WHERE Key = ? AND ExtraValue = ?;");
       
   170 		_LIT( KMdsPreferencesDeleteAll,   "DELETE FROM MdE_Preferences WHERE Key = ? AND Value = ? AND ExtraValue = ?;");
       
   171 		
       
   172 		TInt result = 0;
       
   173 		RRowData data;
       
   174 		CleanupClosePushL( data );
       
   175 		data.AppendL( TColumn(aKey) );
       
   176 		
       
   177 		CMdSSqLiteConnection& connection = MMdSDbConnectionPool::GetDefaultDBL();
       
   178 		if ( aFlags == EPreferenceNone )
       
   179 			{
       
   180 			result = connection.ExecuteL( KMdsPreferencesDeleteKey, data );
       
   181 			}
       
   182 		else if ( aFlags & EPreferenceValueSet && aFlags & EPreferenceExtraSet )
       
   183 			{
       
   184 			data.AppendL( TColumn(aValue) );
       
   185 			data.AppendL( TColumn(aExtraValue) );
       
   186 			result = connection.ExecuteL( KMdsPreferencesDeleteAll, data );
       
   187 			}
       
   188 		else if ( aFlags & EPreferenceValueSet )
       
   189 			{
       
   190 			data.AppendL( TColumn(aValue) );
       
   191 			result = connection.ExecuteL( KMdsPreferencesDeleteValue, data );
       
   192 			}
       
   193 		else if ( aFlags & EPreferenceExtraSet )
       
   194 			{
       
   195 			data.AppendL( TColumn(aExtraValue) );
       
   196 			result = connection.ExecuteL( KMdsPreferencesDeleteExtra, data );
       
   197 			}
       
   198 		else
       
   199 			{
       
   200 			User::Leave( KErrCorrupt );
       
   201 			}
       
   202 		
       
   203 		CleanupStack::PopAndDestroy( &data );
       
   204 		return result;
       
   205 		}
       
   206 
       
   207 	template<class T>
       
   208 	static TInt GetL( const TDesC& aKey, TUint32 aFlags, T& aValue, TInt64* aExtraValue = NULL )
       
   209 		{
       
   210 		_LIT( KMdsPreferencesGetKey,        "SELECT Value, ExtraValue FROM MdE_Preferences WHERE Key = ? ");
       
   211 
       
   212 		_LIT( KMdsPreferencesGetValue,      "AND Value = ? ");
       
   213 		_LIT( KMdsPreferencesGetExtra,      "AND ExtraValue = ? ");
       
   214 		_LIT( KMdsPreferencesGetAll,        "AND Value = ? AND ExtraValue = ? ");
       
   215 
       
   216 		_LIT( KMdsPreferencesSortBegin,     "ORDER BY ");
       
   217 		_LIT( KMdsPreferencesSortValueAsc,  "Value ASC ");
       
   218 		_LIT( KMdsPreferencesSortValueDesc, "Value DESC ");
       
   219 		_LIT( KMdsPreferencesSortExtraAsc,  "ExtraValue ASC ");
       
   220 		_LIT( KMdsPreferencesSortExtraDesc, "ExtraValue DESC ");
       
   221 		_LIT( KMdsPreferencesSortEnd,       "LIMIT 1;");
       
   222 
       
   223 		const TUint32 KSortFlags = 	EPreferenceValueSortAsc  | 
       
   224 									EPreferenceValueSortDesc | 
       
   225 									EPreferenceExtraSortAsc  | 
       
   226 									EPreferenceExtraSortDesc;
       
   227 
       
   228 		CMdsClauseBuffer* sortBuffer = CMdsClauseBuffer::NewLC( 8 ); // estimated minimum lenght for sort rules
       
   229 
       
   230 		// check if there is some order rules
       
   231 		if( KSortFlags & aFlags )
       
   232 			{
       
   233 			sortBuffer->AppendL( KMdsPreferencesSortBegin );
       
   234 			
       
   235 			TBool notFirstOrderRule = EFalse;
       
   236 			
       
   237 			if( EPreferenceValueSortAsc & aFlags )
       
   238 				{
       
   239 				sortBuffer->AppendL( KMdsPreferencesSortValueAsc );
       
   240 				
       
   241 				notFirstOrderRule = ETrue;
       
   242 				}
       
   243 			
       
   244 			if( EPreferenceValueSortDesc & aFlags )
       
   245 				{
       
   246 				if( notFirstOrderRule )
       
   247 					{
       
   248 					sortBuffer->AppendL( KComma );
       
   249 					}
       
   250 				sortBuffer->AppendL( KMdsPreferencesSortValueDesc );
       
   251 				notFirstOrderRule = ETrue;
       
   252 				}
       
   253 			
       
   254 			if( EPreferenceExtraSortAsc & aFlags )
       
   255 				{
       
   256 				if( notFirstOrderRule )
       
   257 					{
       
   258 					sortBuffer->AppendL( KComma );
       
   259 					}
       
   260 				sortBuffer->AppendL( KMdsPreferencesSortExtraAsc );
       
   261 				notFirstOrderRule = ETrue;
       
   262 				}
       
   263 
       
   264 			if( EPreferenceExtraSortDesc & aFlags )
       
   265 				{
       
   266 				if( notFirstOrderRule )
       
   267 					{
       
   268 					sortBuffer->AppendL( KComma );
       
   269 					}
       
   270 				sortBuffer->AppendL( KMdsPreferencesSortExtraDesc );
       
   271 				notFirstOrderRule = ETrue;
       
   272 				}
       
   273 			}
       
   274 
       
   275 		// always added because it limits result count to 1
       
   276 		sortBuffer->AppendL( KMdsPreferencesSortEnd );
       
   277 
       
   278 		CMdsClauseBuffer* selectBuffer = CMdsClauseBuffer::NewLC( 
       
   279 				64 + sortBuffer->ConstBufferL().Length() ); // estimated minimum lenght for select and sort rules
       
   280 		
       
   281 		/// always added default select
       
   282 		selectBuffer->AppendL( KMdsPreferencesGetKey );
       
   283 
       
   284 		TInt result = 0;
       
   285 		RRowData data;
       
   286 		CleanupClosePushL( data );
       
   287 		data.AppendL( TColumn(aKey) );
       
   288 		
       
   289 		RRowData getData;
       
   290 		CleanupClosePushL( getData );
       
   291 		getData.AppendL( TColumn(aValue) );
       
   292 		getData.AppendL( TColumn(EColumnInt64) );
       
   293 		
       
   294 		if ( !aExtraValue && (aFlags & EPreferenceExtraSet || aFlags & EPreferenceExtraGet) )
       
   295 			{
       
   296 			User::Leave( KErrArgument );
       
   297 			}
       
   298 		
       
   299 		CMdSSqLiteConnection& connection = MMdSDbConnectionPool::GetDefaultDBL();
       
   300 		RMdsStatement query;
       
   301 		CleanupClosePushL( query );
       
   302 		if ( aFlags == EPreferenceNone )
       
   303 			{
       
   304 			// do nothing
       
   305 			}
       
   306 		else if ( aFlags & EPreferenceValueSet && aFlags & EPreferenceExtraSet )
       
   307 			{
       
   308 			data.AppendL( TColumn(aValue) );
       
   309 			data.AppendL( TColumn(*aExtraValue) );
       
   310 			
       
   311 			selectBuffer->AppendL( KMdsPreferencesGetAll );
       
   312 			selectBuffer->AppendL( sortBuffer->ConstBufferL() );
       
   313 
       
   314 			connection.ExecuteQueryL( selectBuffer->ConstBufferL(), query, data );
       
   315 			
       
   316 			
       
   317 			if ( connection.NextRowL( query, getData ) )
       
   318 				{
       
   319 				result = 1;
       
   320 				if (aFlags & EPreferenceValueGet)
       
   321 					{
       
   322 					getData.Column( 0 ).Get( aValue );
       
   323 					}
       
   324 				
       
   325 				if (aFlags & EPreferenceExtraGet)
       
   326 					{
       
   327 					getData.Column( 1 ).Get( *aExtraValue );
       
   328 					}
       
   329 				}
       
   330 			}
       
   331 		else if ( aFlags & EPreferenceValueSet )
       
   332 			{
       
   333 			data.AppendL( TColumn(aValue) );
       
   334 			
       
   335 			selectBuffer->AppendL( KMdsPreferencesGetValue );
       
   336 			selectBuffer->AppendL( sortBuffer->ConstBufferL() );
       
   337 			
       
   338 			connection.ExecuteQueryL( selectBuffer->ConstBufferL(), query, data );
       
   339 			if ( connection.NextRowL( query, getData ) )
       
   340 				{
       
   341 				result = 1;
       
   342 				if (aFlags & EPreferenceValueGet)
       
   343 					{
       
   344 					getData.Column( 0 ).Get( aValue );
       
   345 					}
       
   346 				
       
   347 				if (aFlags & EPreferenceExtraGet)
       
   348 					{
       
   349 					getData.Column( 1 ).Get( *aExtraValue );
       
   350 					}
       
   351 				}
       
   352 			}
       
   353 		else if ( aFlags & EPreferenceExtraSet )
       
   354 			{
       
   355 			data.AppendL( TColumn(*aExtraValue) );
       
   356 			
       
   357 			selectBuffer->AppendL( KMdsPreferencesGetExtra );
       
   358 			selectBuffer->AppendL( sortBuffer->ConstBufferL() );
       
   359 
       
   360 			connection.ExecuteQueryL( selectBuffer->ConstBufferL(), query, data );
       
   361 			if ( connection.NextRowL( query, getData ) )
       
   362 				{
       
   363 				result = 1;
       
   364 				if (aFlags & EPreferenceValueGet)
       
   365 					{
       
   366 					getData.Column( 0 ).Get( aValue );
       
   367 					}
       
   368 				
       
   369 				if (aFlags & EPreferenceExtraGet)
       
   370 					{
       
   371 					getData.Column( 1 ).Get( *aExtraValue );
       
   372 					}
       
   373 				}
       
   374 			}
       
   375 		else
       
   376 			{
       
   377 			selectBuffer->AppendL( sortBuffer->ConstBufferL() );
       
   378 
       
   379 			connection.ExecuteQueryL( selectBuffer->ConstBufferL(), query, data );
       
   380 			if ( connection.NextRowL( query, getData ) )
       
   381 				{
       
   382 				result = 1;
       
   383 				if (aFlags & EPreferenceValueGet)
       
   384 					{
       
   385 					getData.Column( 0 ).Get( aValue );
       
   386 					}
       
   387 				
       
   388 				if (aFlags & EPreferenceExtraGet)
       
   389 					{
       
   390 					getData.Column( 1 ).Get( *aExtraValue );
       
   391 					}
       
   392 				}
       
   393 			}
       
   394 
       
   395 		CleanupStack::PopAndDestroy( &query );
       
   396 		CleanupStack::PopAndDestroy( &getData );
       
   397 		CleanupStack::PopAndDestroy( &data );
       
   398 		
       
   399 		CleanupStack::PopAndDestroy( selectBuffer );
       
   400 		CleanupStack::PopAndDestroy( sortBuffer );
       
   401 
       
   402 		return result;
       
   403 		}    
       
   404     
       
   405 private:
       
   406 
       
   407     };
       
   408 
       
   409 
       
   410 #endif // __MDSPREFERENCES_H__