|
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__ |