mmappcomponents/harvester/filehandler/src/mpxharvesterdbtable.cpp
changeset 0 a2952bb97e68
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmappcomponents/harvester/filehandler/src/mpxharvesterdbtable.cpp	Thu Dec 17 08:55:47 2009 +0200
@@ -0,0 +1,554 @@
+/*
+* Copyright (c) 2006 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:  Encapsulates operations on a table in the db
+*
+*/
+
+
+#include <e32base.h>
+#include <mpxlog.h>
+#include "mpxharvesterdbtable.h"
+#include "mpxdbcommon.h"
+#include "mpxharvesterdbitem.h"
+
+const TInt KStringLength = 300;
+
+// ---------------------------------------------------------------------------
+// Constructor 
+// ---------------------------------------------------------------------------
+//
+CMPXHarvesterDatabaseTable::CMPXHarvesterDatabaseTable( RDbStoreDatabase& aDb )
+                                                                  : iDb( aDb ),
+                                                        iState( EInvalidState )
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// Two-Phased Constructor
+// ---------------------------------------------------------------------------
+//
+CMPXHarvesterDatabaseTable* CMPXHarvesterDatabaseTable::NewLC( 
+                                                       RDbStoreDatabase& aDb )
+    {
+    CMPXHarvesterDatabaseTable* self = 
+                               new( ELeave ) CMPXHarvesterDatabaseTable( aDb );
+    CleanupStack::PushL( self );
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// destructor
+// ---------------------------------------------------------------------------
+//
+CMPXHarvesterDatabaseTable::~CMPXHarvesterDatabaseTable()
+    {
+    iView.Close();
+    }
+
+// ---------------------------------------------------------------------------
+// Open the Table to list all files in the db
+// ---------------------------------------------------------------------------
+//
+void CMPXHarvesterDatabaseTable::OpenAllFilesTableL()
+    {
+    MPX_DEBUG1("CMPXHarvesterDatabaseTable::OpenAllFilesTableL <---");
+    
+    // Close old view just in case
+    iView.Close();
+    
+    // Open all files query
+    // select * from files
+    //
+    TBuf<KDbMaxTableCreationSQLLength> query;
+    query.Append( KSelectAll );
+    query.Append( KHarvesterMainTable );
+    
+    // Open the view
+    User::LeaveIfError( iView.Prepare( iDb, query ) );
+    User::LeaveIfError( iView.Evaluate() );
+    
+    iState = EAllItems;
+    
+    MPX_DEBUG1("CMPXHarvesterDatabaseTable::OpenAllFilesTableL --->");
+    } 
+       
+// ---------------------------------------------------------------------------
+// Open the Table to a specific directory ( drive:\\path )
+// ---------------------------------------------------------------------------
+//
+void CMPXHarvesterDatabaseTable::OpenDirectoryL( const TDesC& aDirectory )
+    {
+    MPX_DEBUG1("CMPXHarvesterDatabaseTable::OpenDirectoryL <---");
+    
+    // Close old view just in case
+    iView.Close();
+    
+    HBufC* buffer = HBufC::NewLC(KStringLength); // 255 file path + 45 for single quotes
+                                                 // magic, this would break if we have >
+                                                 // 45 single quotes in a file name.
+    TParsePtrC parse( aDirectory );
+    TPtr ptr = buffer->Des(); 
+    FindAndReplaceSingleQuote( parse.DriveAndPath(), ptr );
+    
+    // Open all files query
+    // select * from files where filepath='aDirectory'
+    //
+    TBuf<KDbMaxTableCreationSQLLength> query;
+    query += KSelectAll;
+    query += KHarvesterMainTable;
+    query += KWhere;
+    query += KHarPathName;
+    query += KLike; 
+    query += KItemBracket;
+    query += ptr;
+    query += KWildcard;
+    query += KItemBracket;
+    
+    // Open the view
+    TDbQuery sqlQuery( query, EDbCompareFolded ); 
+    User::LeaveIfError( iView.Prepare( iDb, sqlQuery ) );
+    User::LeaveIfError( iView.Evaluate() );
+    
+    iState = EDirectory;
+    CleanupStack::PopAndDestroy(buffer);
+    MPX_DEBUG1("CMPXHarvesterDatabaseTable::OpenDirectoryL --->");
+    } 
+       
+// ---------------------------------------------------------------------------
+// Open the Table to a specific song view
+// ---------------------------------------------------------------------------
+//
+void CMPXHarvesterDatabaseTable::OpenItemL( const TDesC& aSongName )
+    {
+    MPX_DEBUG1("CMPXHarvesterDatabaseTable::OpenItemL <---");
+    
+    // Close old view just in case
+    iView.Close();
+    
+    HBufC* buffer = HBufC::NewLC(KStringLength); // 255 file path + 45 for single quotes
+                                                 // magic, this would break if we have > 45 single quotes in a file name.
+    TPtr ptr = buffer->Des();
+    // Open all files query
+    // select * from files where path='path' AND filename='aSongName'
+    //
+    TParsePtrC parse( aSongName );
+    TBuf<KDbMaxTableCreationSQLLength> query;
+    query += KSelectAll;
+    query += KHarvesterMainTable;
+    query += KWhere;
+    query += KHarFileName;
+    query += KEquals;
+    query += KItemBracket;
+    ptr.Copy( KNullDesC );
+    FindAndReplaceSingleQuote( parse.NameAndExt(), ptr );
+    query += ptr;
+    query += KItemBracket;
+    query += KAnd;
+    query += KHarPathName;
+    query += KEquals;
+    query += KItemBracket;
+    ptr.Copy( KNullDesC );
+    FindAndReplaceSingleQuote( parse.DriveAndPath(), ptr );
+    query += ptr;
+    query += KItemBracket;
+    
+    // Open the view
+    TDbQuery sqlQuery( query, EDbCompareFolded ); 
+    User::LeaveIfError( iView.Prepare( iDb, sqlQuery ) );
+    User::LeaveIfError( iView.Evaluate() );
+    
+    iState = EFile;
+    CleanupStack::PopAndDestroy( buffer );
+    MPX_DEBUG1("CMPXHarvesterDatabaseTable::OpenItemL --->");
+    } 
+       
+// ---------------------------------------------------------------------------
+// Open a table to list of files with DRM flag set.
+// ---------------------------------------------------------------------------
+//
+void CMPXHarvesterDatabaseTable::OpenDrmL()
+    {
+    MPX_DEBUG1("CMPXHarvesterDatabaseTable::OpenDrmL <---");
+    
+    // Close old view just in case
+    iView.Close();
+    
+    HBufC* buffer = HBufC::NewLC(KStringLength); // 255 file path + 45 for single quotes
+                                                 // magic, this would break if we have > 45 single quotes in a file name.
+    TPtr ptr = buffer->Des();
+    // Open all files query
+    // select * from files where path='path' AND filename='aSongName'
+    //
+    TBuf<KDbMaxTableCreationSQLLength> query;
+    query += KSelectAll;
+    query += KHarvesterMainTable;
+    query += KWhere;
+    query += KHarItemDRM;
+    query += KEquals;
+    query += KOn;
+    
+    // Open the view
+    TDbQuery sqlQuery( query, EDbCompareFolded ); 
+    User::LeaveIfError( iView.Prepare( iDb, sqlQuery ) );
+    User::LeaveIfError( iView.Evaluate() );
+    
+    iState = EDrm;
+    CleanupStack::PopAndDestroy( buffer );
+    MPX_DEBUG1("CMPXHarvesterDatabaseTable::OpenDrmL --->");
+    } 
+       
+// ---------------------------------------------------------------------------
+// Delete the item pointed to at the current row
+// ---------------------------------------------------------------------------
+//
+void CMPXHarvesterDatabaseTable::DeleteItemL(TBool aEndTransaction)
+    {
+    MPX_DEBUG1("CMPXHarvesterDatabaseTable::DeleteItemL <---");
+
+#ifdef __PRINTDB__     
+    PrintItemsInTableL();
+#endif //__PRINTDB__
+        
+    if (!iDb.InTransaction())
+        {
+        iDb.Begin();
+        }
+    // Safe row update
+    TBool found = iView.FirstL();
+    if( !found )
+        {
+        if ( aEndTransaction )
+            {
+            iDb.Commit();
+            }
+        User::Leave(KErrNotFound);    
+        }
+    iView.GetL();
+    
+    TRAPD( err, iView.DeleteL() );
+    if( err != KErrNone )
+        {
+        iView.Cancel();
+        if ( aEndTransaction )
+            {
+            iDb.Commit();
+            }
+        User::Leave( err );
+        }
+    if ( aEndTransaction )
+        {
+        iDb.Commit();
+        }
+    // DB Compaction
+    struct RDbDatabase::TSize size = iDb.Size();
+    const TInt waterMark = 60;
+    if (size.iUsage <= waterMark)
+        {
+        MPX_DEBUG1( "Compacting DB" );
+        iDb.Compact();
+        }
+        
+    MPX_DEBUG1("CMPXHarvesterDatabaseTable::DeleteItemL --->");
+    }  
+
+// ---------------------------------------------------------------------------
+// Return the number of rows in the current view
+// ---------------------------------------------------------------------------
+//
+TInt CMPXHarvesterDatabaseTable::CountL()
+    {
+    return iView.CountL();
+    }
+    
+// ---------------------------------------------------------------------------
+// Add an item to the table
+// ---------------------------------------------------------------------------
+//
+void CMPXHarvesterDatabaseTable::AddItemL( const TDesC& aPath, 
+                                           const TDesC& aFileName, 
+                                           const TTime aLastModTime,
+                                           const TInt  aColId,
+                                           const TBool aDRM )
+    {
+    MPX_DEBUG1("CMPXHarvesterDatabaseTable::AddItemL <---");
+    
+    // Add the item into the db
+    iView.InsertL();
+    iView.SetColL( KHarPathNameColumn, aPath );
+    iView.SetColL( KHarFileNameColumn, aFileName );
+    iView.SetColL( KHarModTimeColumn,  aLastModTime );
+    iView.SetColL( KHarColDBIDColumn,  aColId );
+    iView.SetColL( KHarDRMColumn, (TUint) aDRM );
+    
+    // Safe update to database
+    TRAPD( err, iView.PutL() );
+    if( KErrNone != err )
+        {
+        iView.Cancel();
+        User::Leave( err );
+        }
+   
+#ifdef __PRINTDB__     
+    PrintItemsInTableL();
+#endif //__PRINTDB__
+ 
+    MPX_DEBUG1("CMPXHarvesterDatabaseTable::AddItemL --->");
+    }
+    
+// ---------------------------------------------------------------------------
+// Update the current row with the updated info
+// ---------------------------------------------------------------------------
+//    
+void CMPXHarvesterDatabaseTable::UpdateItemL( const TDesC& /*aPath*/, 
+                                              const TTime aLastModTime,
+                                              const TInt  aColId,
+                                              const TBool aDrm,
+                                              TBool aNewTransaction )    
+    {
+    // Safe row update
+    //
+    TBool newTransaction = aNewTransaction && !iDb.InTransaction();
+    if ( newTransaction )
+        {
+        iDb.Begin();
+        }
+    TBool valid = iView.FirstL();
+    if( valid )
+        {
+        iView.UpdateL();
+        iView.SetColL( KHarModTimeColumn, aLastModTime );
+        iView.SetColL( KHarColDBIDColumn, aColId );
+        iView.SetColL( KHarDRMColumn, (TUint) aDrm );
+        }
+    else
+        {
+        if( newTransaction )
+            {
+            iDb.Commit();
+            }
+        User::Leave( KErrNotFound );    
+        }
+        
+    TRAPD( err, iView.PutL() );
+    if( err != KErrNone )
+        {
+        iView.Cancel();
+        if ( newTransaction )
+            {
+            iDb.Commit();
+            }
+        User::Leave( err );
+        }
+    if ( newTransaction )
+        {
+        iDb.Commit();
+        }
+              
+    // DB Compaction
+    struct RDbDatabase::TSize size = iDb.Size();
+    const TInt waterMark = 60;
+    if (size.iUsage <= waterMark)
+        {
+        if ( newTransaction )
+            {
+            MPX_DEBUG1( "Compacting DB" );
+            iDb.Compact();
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Update the current row with the updated info
+// ---------------------------------------------------------------------------
+//    
+void CMPXHarvesterDatabaseTable::UpdateItemL( const TTime aLastModTime,
+                                              const TInt  aColId,
+                                              TBool aNewTransaction,
+                                              const TDesC& aPath )    
+    {
+    // Safe row update
+    //
+    TBool newTransaction = aNewTransaction && !iDb.InTransaction();
+    if( iView.FirstL() )
+        {
+        if ( newTransaction )
+            {
+            iDb.Begin();
+            }
+        iView.UpdateL();
+        if ( aPath != KNullDesC )
+            {
+            TParsePtrC parser( aPath );
+            iView.SetColL( KHarPathNameColumn, parser.DriveAndPath() );
+            iView.SetColL( KHarFileNameColumn, parser.NameAndExt() );        
+            }
+        iView.SetColL( KHarModTimeColumn, aLastModTime );
+        if ( aColId != KNullUid.iUid )
+            {
+            iView.SetColL( KHarColDBIDColumn, aColId );
+            }
+        }
+    else
+        {
+        User::Leave( KErrNotFound );    
+        }
+        
+    TRAPD( err, iView.PutL() );
+    if( err != KErrNone )
+        {
+        iView.Cancel();
+        if ( newTransaction )
+            {
+            iDb.Commit();
+            }
+        
+        User::Leave( err );
+        }
+    if ( newTransaction )
+        {
+        iDb.Commit();
+        }
+
+    // DB Compaction
+    struct RDbDatabase::TSize size = iDb.Size();
+    const TInt waterMark = 60;
+    if (size.iUsage <= waterMark)
+        {
+        if ( newTransaction )
+            {
+            MPX_DEBUG1( "Compacting DB" );
+            iDb.Compact();
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Local function to cleanup an array
+// ---------------------------------------------------------------------------
+//
+static void CleanupArray( TAny* item )
+    {
+    ((RPointerArray<CMPXHarvesterDbItem>*) item )->ResetAndDestroy();
+    }
+
+// ---------------------------------------------------------------------------
+// Create an array representing the table that is generated
+// ---------------------------------------------------------------------------
+//     
+RPointerArray<CMPXHarvesterDbItem>* CMPXHarvesterDatabaseTable::CreateTableRepresentationL()
+    {
+    MPX_DEBUG1("CMPXHarvesterDatabaseTable::CreateTableRepresentationL <---");
+    
+    RPointerArray<CMPXHarvesterDbItem>* array = 
+                              new (ELeave) RPointerArray<CMPXHarvesterDbItem>;
+    CleanupStack::PushL( TCleanupItem( CleanupArray, array) );
+    
+    for (iView.FirstL();iView.AtRow();iView.NextL())
+        {
+        // Retrieve the row
+        iView.GetL();
+        
+        CMPXHarvesterDbItem* item = new(ELeave) CMPXHarvesterDbItem();
+        CleanupStack::PushL( item );
+        
+        // Setup the item
+        HBufC* filepath = ReadLongTextLC( KHarPathNameColumn );
+        HBufC* songname = ReadLongTextLC( KHarFileNameColumn );
+        item->iFile = HBufC::NewL( filepath->Length() + songname->Length() );
+        TPtr buf = item->iFile->Des();
+        buf.Append( *filepath );
+        buf.Append( *songname );
+        CleanupStack::PopAndDestroy( 2, filepath );
+        
+        item->iLastModifiedTime = iView.ColTime( KHarModTimeColumn );
+        item->iColId = iView.ColInt( KHarColDBIDColumn );
+        item->iDrm   = iView.ColUint( KHarDRMColumn );
+        
+        User::LeaveIfError( array->InsertInOrderAllowRepeats( item, 
+                            CMPXHarvesterDbItem::Compare ) );
+        CleanupStack::Pop( item );
+        }
+  
+    CleanupStack::Pop();  // cleanup
+    MPX_DEBUG1("CMPXHarvesterDatabaseTable::CreateTableRepresentationL --->");
+    return array;
+    }
+    
+// ---------------------------------------------------------------------------
+// Read out the text at the current row and at a specific column
+// ---------------------------------------------------------------------------
+// 
+HBufC* CMPXHarvesterDatabaseTable::ReadLongTextLC( TInt aColumn )
+    {
+    TInt len = iView.ColLength( aColumn );
+
+    HBufC* buf = HBufC::NewLC(len);
+    TPtr value( buf->Des() );
+    if ( len>0 )
+        {
+        RDbColReadStream strm;
+        strm.OpenLC(iView, aColumn );
+        strm.ReadL( value, len );
+        strm.Close();
+        CleanupStack::PopAndDestroy( &strm );
+        }
+    return buf;
+    }
+
+// ---------------------------------------------------------------------------
+// Fixes single quote query issues
+// ---------------------------------------------------------------------------
+// 
+void CMPXHarvesterDatabaseTable::FindAndReplaceSingleQuote(const TDesC& aSrc,
+                                                           TDes& aTrg)
+    {
+
+    TPtrC ch;
+
+    TInt srcLen = aSrc.Length();
+    
+    for (TInt i = 0; i < srcLen; ++i)
+        {
+        ch.Set(&aSrc[i], 1);
+        aTrg.Append(ch);
+        if ( ch.CompareF(_L("'")) == 0)
+            {
+            aTrg.Append(ch);
+            }
+        }
+    }
+
+#ifdef __PRINTDB__ 
+// ---------------------------------------------------------------------------
+// Print out all items in the current table
+// ---------------------------------------------------------------------------
+//  
+void CMPXHarvesterDatabaseTable::PrintItemsInTableL()
+    {
+    for (iView.FirstL();iView.AtRow();iView.NextL())
+        {
+        // Retrieve the row
+        iView.GetL();
+        
+        // Print out each row
+        HBufC* filepath = ReadLongTextLC( KHarPathNameColumn );
+        HBufC* songname = ReadLongTextLC( KHarFileNameColumn );
+        TTime time = iView.ColTime( KHarModTimeColumn );
+        MPX_DEBUG4("Filepath: %S Filename:%S Time %i", filepath, songname, time.Int64() );
+        CleanupStack::PopAndDestroy( 2, filepath );
+        }
+  }   
+#endif // __PRINTDB__
+