--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mpxplugins/serviceplugins/collectionplugins/mpxsqlitedbcommon/src/mpxdbtable.cpp Wed Sep 01 12:32:02 2010 +0100
@@ -0,0 +1,907 @@
+/*
+* Copyright (c) 2007 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: Base class for all table classes.
+*
+*/
+
+
+// INCLUDE FILES
+#include <mpxlog.h>
+#include <mpxmedia.h>
+#include <mpxmediaarray.h>
+
+#include "mpxdbcommonstd.h"
+#include "mpxdbcommonutil.h"
+#include "mpxdbmanager.h"
+#include "mpxdbtable.h"
+
+// ============================ MEMBER FUNCTIONS ==============================
+
+// ----------------------------------------------------------------------------
+// Constructor
+// ----------------------------------------------------------------------------
+//
+EXPORT_C CMPXDbTable::CMPXDbTable(
+ CMPXDbManager& aDbManager) :
+ iDbManager(aDbManager)
+ {
+ MPX_FUNC("CMPXDbTable::CMPXDbTable");
+ }
+
+// ----------------------------------------------------------------------------
+// Second phase constructor.
+// ----------------------------------------------------------------------------
+//
+EXPORT_C void CMPXDbTable::BaseConstructL()
+ {
+ MPX_FUNC("CMPXDbTable::BaseConstructL");
+ iDbManager.RegisterTableL(*this);
+ }
+
+// ----------------------------------------------------------------------------
+// Destructor
+// ----------------------------------------------------------------------------
+//
+EXPORT_C CMPXDbTable::~CMPXDbTable()
+ {
+ MPX_FUNC("CMPXDbTable::~CMPXDbTable");
+ }
+
+// ----------------------------------------------------------------------------
+// CMPXDbTable::UpdateMediaL default implementation
+// ----------------------------------------------------------------------------
+//
+EXPORT_C void CMPXDbTable::UpdateMediaL(
+ RSqlStatement& /* aRecord */,
+ const TArray<TMPXAttribute>& /* aAttrs */,
+ CMPXMedia& /* aMedia */)
+ {
+ // do nothing
+ }
+
+// ----------------------------------------------------------------------------
+// CMPXDbTable::ExecuteMediaQueryL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C void CMPXDbTable::ExecuteMediaQueryL(
+ const TArray<TMPXAttribute>& aAttrs,
+ CMPXMediaArray& aMediaArray,
+ const TDesC& aQuery,
+ TInt aValue)
+ {
+ MPX_FUNC("CMPXDbTable::ExecuteMediaQueryL");
+
+ HBufC* query = HBufC::NewLC(aQuery.Length() + KMCIntegerLen);
+ query->Des().Format(aQuery, aValue);
+ ExecuteMediaQueryL(aAttrs, aMediaArray, *query);
+ CleanupStack::PopAndDestroy(query);
+ }
+
+// ----------------------------------------------------------------------------
+// CMPXDbTable::ExecuteMediaQueryL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C void CMPXDbTable::ExecuteMediaQueryL(
+ const TArray<TMPXAttribute>& aAttrs,
+ CMPXMediaArray& aMediaArray,
+ const TDesC& aQuery,
+ const TDesC& aValue)
+ {
+ MPX_FUNC("CMPXDbTable::ExecuteMediaQueryL");
+
+ HBufC* query = HBufC::NewLC(aQuery.Length() + aValue.Length());
+ query->Des().Format(aQuery, &aValue);
+ ExecuteMediaQueryL(aAttrs, aMediaArray, *query);
+ CleanupStack::PopAndDestroy(query);
+ }
+
+// ----------------------------------------------------------------------------
+// CMPXDbTable::ExecuteMediaQueryL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C void CMPXDbTable::ExecuteMediaQueryL(
+ const TArray<TMPXAttribute>& aAttrs,
+ CMPXMediaArray& aMediaArray,
+ const TDesC& aQuery,
+ TInt aValue1,
+ TInt aValue2)
+ {
+ MPX_FUNC("CMPXDbTable::ExecuteMediaQueryL");
+
+ HBufC* query = HBufC::NewLC(aQuery.Length() + 2 * KMCIntegerLen);
+ query->Des().Format(aQuery, aValue1, aValue2);
+ ExecuteMediaQueryL(aAttrs, aMediaArray, *query);
+ CleanupStack::PopAndDestroy(query);
+ }
+
+// ----------------------------------------------------------------------------
+// CMPXDbTable::ExecuteMediaQueryL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C void CMPXDbTable::ExecuteMediaQueryL(
+ const TArray<TMPXAttribute>& aAttrs,
+ CMPXMediaArray& aMediaArray,
+ const TDesC& aQuery,
+ const TDesC& aValue1,
+ TInt aValue2)
+ {
+ MPX_FUNC("CMPXDbTable::ExecuteMediaQueryL");
+
+ HBufC* query = HBufC::NewLC(aQuery.Length() + aValue1.Length() + KMCIntegerLen);
+ query->Des().Format(aQuery, &aValue1, aValue2);
+ ExecuteMediaQueryL(aAttrs, aMediaArray, *query);
+ CleanupStack::PopAndDestroy(query);
+ }
+
+// ----------------------------------------------------------------------------
+// CMPXDbTable::ExecuteMediaQueryL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C void CMPXDbTable::ExecuteMediaQueryL(
+ const TArray<TMPXAttribute>& aAttrs,
+ CMPXMediaArray& aMediaArray,
+ const TDesC& aQuery,
+ const TDesC& aValue1,
+ TInt aValue2,
+ const TDesC& aValue3,
+ TInt aValue4)
+ {
+ MPX_FUNC("CMPXDbTable::ExecuteMediaQueryL");
+
+ HBufC* query = HBufC::NewLC(aQuery.Length() +
+ aValue1.Length() +
+ aValue3.Length() +
+ 2*KMCIntegerLen);
+ query->Des().Format(aQuery, &aValue1, aValue2, &aValue3, aValue4);
+ ExecuteMediaQueryL(aAttrs, aMediaArray, *query);
+ CleanupStack::PopAndDestroy(query);
+ }
+
+// ----------------------------------------------------------------------------
+// CMPXDbTable::ExecuteMediaQueryL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C void CMPXDbTable::ExecuteMediaQueryL(
+ const TArray<TMPXAttribute>& aAttrs,
+ CMPXMediaArray& aMediaArray,
+ const TDesC& aQuery)
+ {
+ MPX_FUNC("CMPXDbTable::ExecuteMediaQueryL");
+
+ RSqlStatement recordset(iDbManager.ExecuteSelectQueryL(aQuery));
+ CleanupClosePushL(recordset);
+
+ TInt pPath(0);
+ if (aMediaArray.Count())
+ {
+ CMPXMedia* pMedia = aMediaArray[0];
+ if (pMedia->IsSupported(KMPXMediaGeneralValue))
+ { // Query excuted by OpenL
+ pPath = pMedia->ValueTObjectL<TInt>(KMPXMediaGeneralValue);
+ MPX_ASSERT(pPath);
+ }
+ }
+
+ TInt err(KErrNone);
+ RArray<TMPXItemId> ids;
+ CleanupClosePushL(ids);
+ while ((err = recordset.Next()) == KSqlAtRow)
+ {
+ CMPXMedia* media = CMPXMedia::NewL();
+ CleanupStack::PushL(media);
+
+ UpdateMediaL(recordset, aAttrs, *media);
+ if (media->IsSupported(KMPXMediaGeneralId) && pPath)
+ {
+ ids.AppendL(media->ValueTObjectL<TMPXItemId>(KMPXMediaGeneralId));
+ }
+ aMediaArray.AppendL(*media);
+ CleanupStack::PopAndDestroy(media);
+ }
+
+ // Append ids to the returned path
+ if (pPath)
+ {
+ ((CMPXCollectionPath*)pPath)->AppendL(ids.Array());
+ }
+ CleanupStack::PopAndDestroy(&ids);
+ CleanupStack::PopAndDestroy(&recordset);
+
+ if (err!= KSqlAtEnd)
+ {
+ User::Leave(KErrCorrupt);
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CMPXDbTable::ExecuteMediaQueryL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C void CMPXDbTable::ExecuteMediaQueryL(
+ TInt aDrive,
+ const TArray<TMPXAttribute>& aAttrs,
+ CMPXMediaArray& aMediaArray,
+ const TDesC& aQuery,
+ TInt aPlaylistId)
+ {
+ MPX_FUNC("CMPXDbTable::ExecuteMediaQueryL");
+
+ HBufC* query = HBufC::NewLC(aQuery.Length() + KMCIntegerLen);
+ query->Des().Format(aQuery, aPlaylistId);
+ ExecuteMediaQueryOnDriveL(aDrive, aAttrs, aMediaArray, *query);
+ CleanupStack::PopAndDestroy(query);
+ }
+
+// ----------------------------------------------------------------------------
+// CMPXDbTable::ExecuteMediaQueryOnDriveL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C void CMPXDbTable::ExecuteMediaQueryOnDriveL(
+ TInt aDrive,
+ const TArray<TMPXAttribute>& aAttrs,
+ CMPXMediaArray& aMediaArray,
+ const TDesC& aQuery)
+ {
+ MPX_FUNC("CMPXDbTable::ExecuteMediaQueryL");
+
+ RSqlStatement recordset(iDbManager.ExecuteSelectQueryOnAllDrivesL(aDrive,aQuery));
+ CleanupClosePushL(recordset);
+
+ TInt pPath(0);
+ if (aMediaArray.Count())
+ {
+ CMPXMedia* pMedia = aMediaArray[0];
+ if (pMedia->IsSupported(KMPXMediaGeneralValue))
+ { // Query excuted by OpenL
+ pPath = pMedia->ValueTObjectL<TInt>(KMPXMediaGeneralValue);
+ MPX_ASSERT(pPath);
+ }
+ }
+
+ TInt err(KErrNone);
+ RArray<TMPXItemId> ids;
+ CleanupClosePushL(ids);
+ while ((err = recordset.Next()) == KSqlAtRow)
+ {
+ CMPXMedia* media = CMPXMedia::NewL();
+ CleanupStack::PushL(media);
+
+ UpdateMediaL(recordset, aAttrs, *media);
+ if (media->IsSupported(KMPXMediaGeneralId) && pPath)
+ {
+ ids.AppendL(media->ValueTObjectL<TMPXItemId>(KMPXMediaGeneralId));
+ }
+ aMediaArray.AppendL(*media);
+ CleanupStack::PopAndDestroy(media);
+ }
+
+ // Append ids to the returned path
+ if (pPath)
+ {
+ ((CMPXCollectionPath*)pPath)->AppendL(ids.Array());
+ }
+ CleanupStack::PopAndDestroy(&ids);
+ CleanupStack::PopAndDestroy(&recordset);
+
+ if (err!= KSqlAtEnd)
+ {
+ User::Leave(KErrCorrupt);
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CMPXDbTable::ExecuteMediaQueryL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C void CMPXDbTable::ExecuteMediaQueryL(
+ const TArray<TMPXAttribute>& aAttrs,
+ CMPXMediaArray& aMediaArray,
+ const TBool aAsc,
+ const TDesC& aQuery)
+ {
+
+ MPX_FUNC("CMPXDbTable::ExecuteMediaQueryL");
+
+ RSqlStatement recordset(iDbManager.ExecuteSelectQueryL(aQuery));
+ CleanupClosePushL(recordset);
+
+ TInt err(KErrNone);
+ while ((err = recordset.Next()) == KSqlAtRow)
+ {
+ CMPXMedia* media = CMPXMedia::NewL();
+ CleanupStack::PushL(media);
+
+ UpdateMediaL(recordset, aAttrs, *media);
+ if (aAsc != EFalse)
+ {
+ aMediaArray.AppendL(*media);
+ }
+ else
+ {
+ aMediaArray.InsertL(*media, 0);
+ }
+ CleanupStack::PopAndDestroy(media);
+ }
+
+ CleanupStack::PopAndDestroy(&recordset);
+
+
+ if (err!= KSqlAtEnd)
+ {
+ User::Leave(KErrCorrupt);
+ }
+ }
+
+
+// ----------------------------------------------------------------------------
+// CMPXDbTable::ExecuteMediaQueryL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C void CMPXDbTable::ExecuteMediaQueryL(
+ const TArray<TMPXAttribute>& aAttrs,
+ CMPXMedia& aMedia,
+ const TDesC& aQuery)
+ {
+ MPX_FUNC("CMPXDbTable::ExecuteMediaQueryL");
+
+ RSqlStatement recordset(iDbManager.ExecuteSelectQueryL(aQuery));
+ CleanupClosePushL(recordset);
+
+ if (recordset.Next() != KSqlAtRow)
+ {
+ User::Leave(KErrNotFound);
+ }
+
+ UpdateMediaL(recordset, aAttrs, aMedia);
+ CleanupStack::PopAndDestroy(&recordset);
+ }
+
+// ----------------------------------------------------------------------------
+// CMPXDbTable::ExecuteMediaQueryL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C void CMPXDbTable::ExecuteMediaQueryL(
+ const TArray<TMPXAttribute>& aAttrs,
+ CMPXMedia& aMedia,
+ const TDesC& aQuery,
+ TInt aValue)
+ {
+ MPX_FUNC("CMPXDbTable::ExecuteMediaQueryL");
+
+ HBufC* query = HBufC::NewLC(aQuery.Length() + KMCIntegerLen);
+ query->Des().Format(aQuery, aValue);
+ ExecuteMediaQueryL(aAttrs, aMedia, *query);
+ CleanupStack::PopAndDestroy(query);
+ }
+
+// ----------------------------------------------------------------------------
+// CMPXDbTable::ExecuteMediaQueryL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C void CMPXDbTable::ExecuteMediaQueryL(
+ const TArray<TMPXAttribute>& aAttrs,
+ CMPXMediaArray& aMediaArray,
+ const TDesC& aQuery,
+ const TDesC& aValue1,
+ const TDesC& aValue2)
+ {
+ MPX_FUNC("CMPXDbTable::ExecuteMediaQueryL");
+
+ HBufC* query = HBufC::NewLC(aQuery.Length() + aValue1.Length() + aValue2.Length());
+ query->Des().Format(aQuery, &aValue1, &aValue2);
+ ExecuteMediaQueryL(aAttrs, aMediaArray, *query);
+ CleanupStack::PopAndDestroy(query);
+ }
+
+// ----------------------------------------------------------------------------
+// CMPXDbTable::ExecuteIntQueryL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C TUint32 CMPXDbTable::ExecuteIntQueryL(
+ const TDesC& aQuery)
+ {
+ RSqlStatement recordset(iDbManager.ExecuteSelectQueryL(aQuery));
+ CleanupClosePushL(recordset);
+
+ if (recordset.Next() != KSqlAtRow)
+ {
+ User::Leave(KErrNotFound);
+ }
+
+ TUint32 value(recordset.ColumnInt64(KMPXTableDefaultIndex));
+ CleanupStack::PopAndDestroy(&recordset);
+
+ return value;
+ }
+
+// ----------------------------------------------------------------------------
+// CMPXDbTable::ExecuteIntQueryL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C TUint32 CMPXDbTable::ExecuteIntQueryL(
+ const TDesC& aQuery,
+ TUint32 aValue)
+ {
+ MPX_FUNC("CMPXDbTable::ExecuteIntQueryL");
+
+ HBufC* query = HBufC::NewLC(aQuery.Length() + KMCIntegerLen);
+ query->Des().Format(aQuery, aValue);
+ TUint32 ret(ExecuteIntQueryL(*query));
+ CleanupStack::PopAndDestroy(query);
+
+ return ret;
+ }
+
+// ----------------------------------------------------------------------------
+// CMPXDbTable::ExecuteIntQueryL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C TUint32 CMPXDbTable::ExecuteIntQueryL(
+ const TDesC& aQuery,
+ const TDesC& aValue1,
+ TUint32 aValue2)
+ {
+ MPX_FUNC("CMPXDbTable::ExecuteIntQueryL");
+
+ // replace single quotes
+ // reserve double the value length for single quote duplicates
+ HBufC* value1 = HBufC::NewLC(aValue1.Length() * 2);
+ TPtr value1Ptr(value1->Des());
+ MPXDbCommonUtil::FindAndReplaceSingleQuote(aValue1, value1Ptr);
+
+ // construct the query
+ HBufC* query = HBufC::NewLC(aQuery.Length() + value1Ptr.Length() + KMCIntegerLen);
+ query->Des().Format(aQuery, value1, aValue2);
+
+ // execute the query
+ TUint32 ret(ExecuteIntQueryL(*query));
+
+ CleanupStack::PopAndDestroy(query);
+ CleanupStack::PopAndDestroy(value1);
+
+ return ret;
+ }
+
+// ----------------------------------------------------------------------------
+// CMPXDbTable::ExecuteIntQueryL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C TUint32 CMPXDbTable::ExecuteIntQueryL(
+ const TDesC& aQuery,
+ const TDesC& aValue)
+ {
+ MPX_FUNC("CMPXDbTable::ExecuteIntQueryL");
+
+ // replace single quotes
+ HBufC* value = HBufC::NewLC(aValue.Length() * 2);
+ TPtr valuePtr(value->Des());
+ MPXDbCommonUtil::FindAndReplaceSingleQuote(aValue, valuePtr);
+
+ // construct the query
+ HBufC* query = HBufC::NewLC(aQuery.Length() + valuePtr.Length());
+ query->Des().Format(aQuery, value);
+
+ // execute the query
+ TUint32 ret(ExecuteIntQueryL(*query));
+
+ CleanupStack::PopAndDestroy(query);
+ CleanupStack::PopAndDestroy(value);
+
+ return ret;
+ }
+
+// ----------------------------------------------------------------------------
+// CMPXDbTable::ExecuteIntQueryL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C TUint32 CMPXDbTable::ExecuteIntQueryL(
+ const TDesC& aQuery,
+ TUint32 aValue1,
+ TUint32 aValue2)
+ {
+ MPX_FUNC("CMPXDbTable::ExecuteIntQueryL");
+
+ HBufC* query = HBufC::NewLC(aQuery.Length() + 2 * KMCIntegerLen);
+ query->Des().Format(aQuery, aValue1, aValue2);
+ TUint32 ret(ExecuteIntQueryL(*query));
+ CleanupStack::PopAndDestroy(query);
+
+ return ret;
+ }
+
+// ----------------------------------------------------------------------------
+// CMPXDbTable::ExecuteIntQueryL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C TUint32 CMPXDbTable::ExecuteIntQueryL(TInt aDriveID,const TDesC& aQuery)
+ {
+ MPX_FUNC("CMPXDbTable::ExecuteIntQueryL");
+ RSqlStatement recordset(iDbManager.ExecuteSelectQueryL(aDriveID,aQuery));
+ CleanupClosePushL(recordset);
+
+ if (recordset.Next() != KSqlAtRow)
+ {
+ User::Leave(KErrNotFound);
+ }
+
+ TUint32 value(recordset.ColumnInt64(KMPXTableDefaultIndex));
+ CleanupStack::PopAndDestroy(&recordset);
+
+ return value;
+ }
+
+// ----------------------------------------------------------------------------
+// CMPXDbTable::ExecuteSumQueryL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C TInt CMPXDbTable::ExecuteSumQueryL(
+ const TDesC& aQuery)
+ {
+ MPX_FUNC("CMPXDbTable::ExecuteSumQueryL");
+
+ RSqlStatement recordset(iDbManager.ExecuteSelectQueryL(aQuery));
+ CleanupClosePushL(recordset);
+
+ TInt sum(0);
+ TInt err(KErrNone);
+ while ((err = recordset.Next()) == KSqlAtRow)
+ {
+ sum += recordset.ColumnInt64(KMPXTableDefaultIndex);
+ }
+
+ CleanupStack::PopAndDestroy(&recordset);
+
+ if (err != KSqlAtEnd)
+ {
+ User::Leave(KErrCorrupt);
+ }
+
+ return sum;
+ }
+
+// ----------------------------------------------------------------------------
+// CMPXDbTable::ExecuteSumQueryL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C TInt CMPXDbTable::ExecuteSumQueryL(
+ const TDesC& aQuery,
+ TUint32 aValue)
+ {
+ MPX_FUNC("CMPXDbTable::ExecuteSumQueryL");
+
+ HBufC* query = HBufC::NewLC(aQuery.Length() + KMCIntegerLen);
+ query->Des().Format(aQuery, aValue);
+ TUint32 ret(ExecuteSumQueryL(*query));
+ CleanupStack::PopAndDestroy(query);
+
+ return ret;
+ }
+
+// ----------------------------------------------------------------------------
+// CMPXDbTable::ExecuteSumQueryL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C TInt CMPXDbTable::ExecuteSumQueryL(
+ const TDesC& aQuery,
+ TUint32 aValue1,
+ TUint32 aValue2)
+ {
+ MPX_FUNC("CMPXDbTable::ExecuteSumQueryL");
+
+ HBufC* query = HBufC::NewLC(aQuery.Length() + 2 * KMCIntegerLen);
+ query->Des().Format(aQuery, aValue1, aValue2);
+ TUint32 ret(ExecuteSumQueryL(*query));
+ CleanupStack::PopAndDestroy(query);
+
+ return ret;
+ }
+
+// ----------------------------------------------------------------------------
+// CMPXDbTable::ExecuteSumQueryL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C TInt CMPXDbTable::ExecuteSumQueryL(
+ const TDesC& aQuery,
+ TUint32 aValue1,
+ TUint32 aValue2,
+ TUint32 aValue3)
+ {
+ MPX_FUNC("CMPXDbTable::ExecuteSumQueryL");
+
+ HBufC* query = HBufC::NewLC(aQuery.Length() + 3 * KMCIntegerLen);
+ query->Des().Format(aQuery, aValue1, aValue2, aValue3);
+ TUint32 ret(ExecuteSumQueryL(*query));
+ CleanupStack::PopAndDestroy(query);
+
+ return ret;
+ }
+
+// ----------------------------------------------------------------------------
+// CMPXDbTable::ExecuteSumQueryL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C TUint32 CMPXDbTable::ExecuteSumQueryL(
+ const TDesC& aQuery,
+ const TDesC& aValue1,
+ TUint32 aValue2)
+ {
+ MPX_FUNC("CMPXDbTable::ExecuteSumQueryL");
+
+ // replace single quotes
+ // reserve double the value length for single quote duplicates
+ HBufC* value1 = HBufC::NewLC(aValue1.Length() * 2);
+ TPtr value1Ptr(value1->Des());
+ MPXDbCommonUtil::FindAndReplaceSingleQuote(aValue1, value1Ptr);
+
+ // construct the query
+ HBufC* query = HBufC::NewLC(aQuery.Length() + value1Ptr.Length() + KMCIntegerLen);
+ query->Des().Format(aQuery, value1, aValue2);
+
+ // execute the query
+ TUint32 ret(ExecuteSumQueryL(*query));
+
+ CleanupStack::PopAndDestroy(query);
+ CleanupStack::PopAndDestroy(value1);
+
+ return ret;
+ }
+
+// ----------------------------------------------------------------------------
+// CMPXDbTable::ExecuteSumQueryL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C TInt CMPXDbTable::ExecuteSumQueryL(
+ const TDesC& aQuery,
+ const TDesC& aValue1,
+ const TDesC& aValue2)
+ {
+ MPX_FUNC("CMPXDbTable::ExecuteSumQueryL");
+
+ // replace single quotes
+ // reserve double the value length for single quote duplicates
+ HBufC* value1 = HBufC::NewLC(aValue1.Length() * 2);
+ TPtr value1Ptr(value1->Des());
+ MPXDbCommonUtil::FindAndReplaceSingleQuote(aValue1, value1Ptr);
+
+ HBufC* value2 = HBufC::NewLC(aValue2.Length() * 2);
+ TPtr value2Ptr(value2->Des());
+ MPXDbCommonUtil::FindAndReplaceSingleQuote(aValue2, value2Ptr);
+
+ // construct the query
+ HBufC* query = HBufC::NewLC(aQuery.Length() + value1Ptr.Length() + value2Ptr.Length());
+ query->Des().Format(aQuery, value1, value2);
+
+ // execute the query
+ TUint32 ret(ExecuteSumQueryL(*query));
+
+ CleanupStack::PopAndDestroy(query);
+ CleanupStack::PopAndDestroy(value2);
+ CleanupStack::PopAndDestroy(value1);
+
+ return ret;
+ }
+
+// ----------------------------------------------------------------------------
+// CMPXDbTable::ExecuteSumQueryL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C TInt CMPXDbTable::ExecuteSumQueryL(
+ const TDesC& aQuery,
+ const TDesC& aValue)
+ {
+ MPX_FUNC("CMPXDbTable::ExecuteSumQueryL");
+
+ // replace single quotes
+ // reserve double the value length for single quote duplicates
+ HBufC* value = HBufC::NewLC(aValue.Length() * 2);
+ TPtr valuePtr(value->Des());
+ MPXDbCommonUtil::FindAndReplaceSingleQuote(aValue, valuePtr);
+
+ // construct the query
+ HBufC* query = HBufC::NewLC(aQuery.Length() + valuePtr.Length());
+ query->Des().Format(aQuery, value);
+
+ // execute the query
+ TUint32 ret(ExecuteSumQueryL(*query));
+
+ CleanupStack::PopAndDestroy(query);
+ CleanupStack::PopAndDestroy(value);
+
+ return ret;
+ }
+
+// ----------------------------------------------------------------------------
+// CMPXDbTable::ExecuteSumQueryL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C TInt CMPXDbTable::ExecuteSumQueryL(
+ const TDesC& aQuery,
+ const TDesC& aValue1,
+ TUint32 aValue2,
+ const TDesC& aValue3,
+ TUint32 aValue4)
+ {
+ MPX_FUNC("CMPXDbTable::ExecuteSumQueryL");
+
+ // replace single quotes
+ // reserve double the value length for single quote duplicates
+ HBufC* value1 = HBufC::NewLC(aValue1.Length() * 2);
+ TPtr value1Ptr(value1->Des());
+ MPXDbCommonUtil::FindAndReplaceSingleQuote(aValue1, value1Ptr);
+
+ // replace single quotes
+ // reserve double the value length for single quote duplicates
+ HBufC* value3 = HBufC::NewLC(aValue3.Length() * 2);
+ TPtr value3Ptr(value3->Des());
+ MPXDbCommonUtil::FindAndReplaceSingleQuote(aValue3, value3Ptr);
+
+ // construct the query
+ HBufC* query = HBufC::NewLC( aQuery.Length() +
+ value1Ptr.Length() +
+ 2 * KMCIntegerLen +
+ value3Ptr.Length() );
+ query->Des().Format(aQuery, value1, aValue2, value3, aValue4);
+
+ // execute the query
+ TUint32 ret(ExecuteSumQueryL(*query));
+
+ CleanupStack::PopAndDestroy(query);
+ CleanupStack::PopAndDestroy(value3);
+ CleanupStack::PopAndDestroy(value1);
+
+ return ret;
+ }
+
+// ----------------------------------------------------------------------------
+// CMPXDbTable::ExecuteSumExQueryL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C TInt CMPXDbTable::ExecuteSumExQueryL(
+ const TDesC& aQuery,
+ TUint32 aPlaylistId,
+ TInt aDrive)
+ {
+ MPX_FUNC("CMPXDbTable::ExecuteSumExQueryL");
+
+ HBufC* query = HBufC::NewLC(aQuery.Length() + KMCIntegerLen);
+ query->Des().Format(aQuery, aPlaylistId);
+
+ RSqlStatement recordset(iDbManager.ExecuteSelectQueryOnAllDrivesL(aDrive, *query));
+ CleanupClosePushL(recordset);
+
+ TInt sum(0);
+ TInt err(KErrNone);
+ while ((err = recordset.Next()) == KSqlAtRow)
+ {
+ sum += recordset.ColumnInt64(KMPXTableDefaultIndex);
+ }
+
+ CleanupStack::PopAndDestroy(&recordset);
+ CleanupStack::PopAndDestroy(query);
+
+ if (err != KSqlAtEnd)
+ {
+ User::Leave(KErrCorrupt);
+ }
+
+ return sum;
+ }
+
+// ----------------------------------------------------------------------------
+// CMPXDbTable::ExecuteMediaQueryL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C void CMPXDbTable::ExecuteMediaQueryL(
+ const TArray<TMPXAttribute>& aAttrs,
+ CMPXMediaArray& aMediaArray,
+ const TDesC& aQuery,
+ TInt aValue1,
+ TInt aValue2,
+ TUint aQueryId )
+ {
+ MPX_FUNC("CMPXDbTable::ExecuteMediaOffsetQueryL");
+
+ RSqlStatement& recordset(iDbManager.ExecuteSelectQueryL(aQueryId,
+ aValue1,
+ aValue2,
+ aQuery));
+ CleanupClosePushL(recordset);
+
+ TInt err(KErrNone);
+ while ((err = recordset.Next()) == KSqlAtRow)
+ {
+ CMPXMedia* media = CMPXMedia::NewL();
+ CleanupStack::PushL(media);
+
+ UpdateMediaL(recordset, aAttrs, *media);
+
+ aMediaArray.AppendL(*media);
+ CleanupStack::PopAndDestroy(media);
+ }
+ CleanupStack::Pop(&recordset);
+
+ if (err!= KSqlAtEnd)
+ {
+ User::Leave(KErrCorrupt);
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CMPXDbTable::ExecuteMediaQueryL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C void CMPXDbTable::ExecuteMediaQueryL( const TArray<TMPXAttribute>& aAttrs,
+ CMPXMediaArray& aMediaArray,
+ const TDesC& aQuery,
+ const TDesC& aValue1,
+ TInt aValue2,
+ TBool aAsc,
+ TUint aQueryId )
+ {
+ MPX_DEBUG1("CMPXDbTable::ExecuteMediaAscQueryL <--");
+
+ RSqlStatement& recordset(iDbManager.ExecuteSelectQueryL(aQueryId,
+ aValue1,
+ aValue2,
+ aQuery));
+ CleanupClosePushL(recordset);
+
+ TInt err(KErrNone);
+ while ((err = recordset.Next()) == KSqlAtRow)
+ {
+ CMPXMedia* media = CMPXMedia::NewL();
+ CleanupStack::PushL(media);
+
+ UpdateMediaL(recordset, aAttrs, *media);
+
+ if( aAsc )
+ {
+ aMediaArray.AppendL(*media);
+ }
+ else
+ {
+ aMediaArray.InsertL(*media, 0);
+ }
+ CleanupStack::PopAndDestroy(media);
+ }
+
+ CleanupStack::Pop(&recordset);
+
+ if (err!= KSqlAtEnd)
+ {
+ User::Leave(KErrCorrupt);
+ }
+
+ MPX_DEBUG1("CMPXDbTable::ExecuteMediaAscQueryL -->");
+ }
+
+// ----------------------------------------------------------------------------
+// CMPXDbTable::DoCheckTable
+// ----------------------------------------------------------------------------
+//
+EXPORT_C TBool CMPXDbTable::DoCheckTable(
+ RSqlDatabase& aDatabase,
+ const TDesC& aQuery)
+ {
+ MPX_FUNC("CMPXDbTable::DoCheckTable");
+
+ RSqlStatement statement;
+ TInt err(statement.Prepare(aDatabase, aQuery));
+ statement.Close();
+
+ return (err == KErrNone);
+ }
+
+
+// End of File