harvesterplugins/media/mediautils/src/cpixmdedbmanager.cpp
changeset 0 ccd0fd43f247
child 3 6832643895f7
equal deleted inserted replaced
-1:000000000000 0:ccd0fd43f247
       
     1 /*
       
     2 * Copyright (c) 2010 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:  Utility class for creating and accessing the mde and Cpix Sync Table 
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 #include "cpixmdedbmanager.h"
       
    20 #include <harvesterserverlogger.h>
       
    21 #include <s32strm.h> //to support RDbColReadStream::ReadL
       
    22 #include <bautils.h>
       
    23 #include "mdsitementity.h"
       
    24 
       
    25 //database name
       
    26 _LIT(KDriveC, "c:");
       
    27 _LIT(KDBNAME, "_Sync.db");
       
    28 _LIT(KMDECPIXSYNCTable,"MdeCpixSync");
       
    29 _LIT(KObjectId, "ObjectId");
       
    30 _LIT(KUri, "Uri");
       
    31 _LIT(KDrive, "Drive");
       
    32 _LIT(KMdeCpixSyncDbSqlInsert, "SELECT * FROM MdeCpixSync");
       
    33 _LIT(KMdeCpixSyncDbSqlCheckExist, "SELECT * FROM MdeCpixSync WHERE ObjectId=%d");
       
    34 //Not used. Can be deleted.
       
    35 //_LIT(KMdeCpixSyncDbSqlDelete, "DELETE FROM MdeCpixSync WHERE ObjectId="); //39 chars
       
    36 const TInt KMdeCpixSyncDbSqlDeleteSize(100); // %d costs 10 chars in max
       
    37 _LIT(KUIDSTRINGHEX,"%x");
       
    38 
       
    39 enum TNotepadColumnType
       
    40     {
       
    41     EKey = 1, // this must be 1 (DBMS/SQL restriction) mapped to ObjectID of MDS
       
    42     EUri,
       
    43     EDrive
       
    44     };
       
    45 
       
    46 // -----------------------------------------------------------------------------
       
    47 // CCPixIndexerUtils::NewL()
       
    48 // -----------------------------------------------------------------------------
       
    49 //
       
    50 CCPIXMDEDbManager* CCPIXMDEDbManager::NewL(const TUid& aPluginImplUid)
       
    51     {
       
    52     CCPIXMDEDbManager* self = CCPIXMDEDbManager::NewLC(aPluginImplUid);
       
    53     CleanupStack::Pop(self);
       
    54     return self;
       
    55     }
       
    56 
       
    57 // -----------------------------------------------------------------------------
       
    58 // CCPIXMDEDbManager::NewLC()
       
    59 // -----------------------------------------------------------------------------
       
    60 //
       
    61 CCPIXMDEDbManager* CCPIXMDEDbManager::NewLC(const TUid& aPluginImplUid)
       
    62     {
       
    63     CCPIXMDEDbManager* self = new (ELeave) CCPIXMDEDbManager();
       
    64     CleanupStack::PushL(self);
       
    65     self->ConstructL(aPluginImplUid);
       
    66     return self;
       
    67     }
       
    68 
       
    69 // -----------------------------------------------------------------------------
       
    70 // CCPIXMDEDbManager::~CCPIXMDEDbManager()
       
    71 // -----------------------------------------------------------------------------
       
    72 //
       
    73 CCPIXMDEDbManager::~CCPIXMDEDbManager()
       
    74     {
       
    75     if(iOpened)
       
    76         {    
       
    77         iDatabase.Close();        
       
    78         }
       
    79     iFs.Close();
       
    80     }
       
    81     
       
    82 
       
    83 // -----------------------------------------------------------------------------
       
    84 // CCPixIndexerUtils::CCPixIndexerUtils()
       
    85 // -----------------------------------------------------------------------------
       
    86 //
       
    87 CCPIXMDEDbManager::CCPIXMDEDbManager()
       
    88     {    
       
    89     }
       
    90 
       
    91 // -----------------------------------------------------------------------------
       
    92 // CCPixIndexerUtils::ConstructL()
       
    93 // -----------------------------------------------------------------------------
       
    94 //
       
    95 void CCPIXMDEDbManager::ConstructL(const TUid& aPluginImplUid)
       
    96     {
       
    97     CPIXLOGSTRING("START CCPIXMDEDbManager::ConstructL : Enter");
       
    98     User::LeaveIfError(iFs.Connect());
       
    99     //Secure database needes policy file for every database and it is comparitively
       
   100     //lacks in performance from non secure database so we can use non secure
       
   101     //Create the database filename.
       
   102     HBufC* dataFile = HBufC::NewLC( KMaxFileName );    
       
   103     TBuf <10> aUidString;
       
   104     aUidString.Format(KUIDSTRINGHEX, aPluginImplUid);
       
   105     TFileName  privatePath;
       
   106     iFs.CreatePrivatePath(EDriveC);
       
   107     iFs.PrivatePath(privatePath);//data caged path of loading process
       
   108     dataFile->Des().Copy(KDriveC);
       
   109     dataFile->Des().Append(privatePath);//data caged path of Plugin        
       
   110     dataFile->Des().Append( aUidString );
       
   111     dataFile->Des().Append( KDBNAME );
       
   112     //Open the database
       
   113     TInt err(iDatabase.Open(iFs,*dataFile));
       
   114     switch (err)
       
   115          {
       
   116          case KErrNone:
       
   117              {
       
   118              iOpened = ETrue;            
       
   119              }
       
   120              break;
       
   121          case KErrNotFound:
       
   122              {
       
   123              //create the database and register for notifier
       
   124              TRAP( err , CreateMdeCPIXSyncDBL(*dataFile));
       
   125              if(err == KErrNone)
       
   126                  {
       
   127                  iOpened = ETrue;
       
   128                  }
       
   129              }
       
   130              break;
       
   131          default:            
       
   132              CPIXLOGSTRING("CNotesPlugin::ConstructL : Error in Database Open");
       
   133              break;
       
   134          }    
       
   135      CleanupStack::PopAndDestroy( dataFile );  
       
   136      CPIXLOGSTRING("END CCPIXMDEDbManager::ConstructL : Enter");
       
   137     }
       
   138 
       
   139 void CCPIXMDEDbManager::CreateMdeCPIXSyncDBL(const TDesC& aDatabaseFile)
       
   140     {
       
   141     CPIXLOGSTRING("START CCPIXMDEDbManager::CreateMdeCPIXSyncDBL");
       
   142     iDatabase.Close();
       
   143     //Create the database filename.
       
   144     //create the database
       
   145     User::LeaveIfError(iDatabase.Create(iFs,aDatabaseFile));
       
   146     CDbColSet* columns = CreateColumnSetLC();//creates the columns and push to cleanupstack
       
   147     User::LeaveIfError( iDatabase.CreateTable( KMDECPIXSYNCTable , *columns ) );
       
   148     //clean up of variables (columns and dataFile)
       
   149     CleanupStack::PopAndDestroy( 1 ); //columns    
       
   150     CPIXLOGSTRING("END CCPixIndexerUtils::MountAllAvailableDriveL");
       
   151     }
       
   152 
       
   153 
       
   154 // -----------------------------------------------------------------------------
       
   155 // CNotesPlugin::CreateColSetLC
       
   156 // -----------------------------------------------------------------------------
       
   157 //
       
   158 CDbColSet* CCPIXMDEDbManager::CreateColumnSetLC()
       
   159     {
       
   160     CPIXLOGSTRING("CCPIXMDEDbManager::CreateColSetLC: Entered");
       
   161     CDbColSet* columns = CDbColSet::NewLC();
       
   162     
       
   163     //Add Key column
       
   164     TDbCol col( KObjectId , EDbColInt32 );
       
   165     col.iAttributes = TDbCol::ENotNull;
       
   166     columns->AddL( col );
       
   167     
       
   168     col.iName = KUri;
       
   169     col.iType = EDbColLongText;
       
   170     col.iAttributes = TDbCol::ENotNull;
       
   171     columns->AddL(col);
       
   172 
       
   173     col.iName = KDrive;
       
   174     col.iType = EDbColInt32;
       
   175     col.iAttributes = TDbCol::ENotNull;
       
   176     columns->AddL(col);
       
   177     
       
   178     return columns; // columns stays on CleanupStack
       
   179     }
       
   180 
       
   181 // -----------------------------------------------------------------------------
       
   182 // CCPIXMDEDbManager::AddL
       
   183 // -----------------------------------------------------------------------------
       
   184 //
       
   185 TCPIXMDEDBAPIReturnType CCPIXMDEDbManager::AddL(const TUint& aObjId,CMDSEntity& aMdsItem)
       
   186     {
       
   187     CPIXLOGSTRING("START CCPIXMDEDbManager::AddL");
       
   188     TCPIXMDEDBAPIReturnType retVal = EOperationUndefined;
       
   189     // Database is not openend
       
   190     // return Not ready
       
   191     if(!iOpened)
       
   192      {
       
   193      User::Leave(KErrNotReady);
       
   194      }
       
   195     iDatabase.Begin();    
       
   196     RDbView dbView;
       
   197     CleanupClosePushL(dbView);
       
   198     TBuf<KMdeCpixSyncDbSqlDeleteSize> sql;
       
   199     sql.Copy(KMdeCpixSyncDbSqlInsert);
       
   200     TInt err =  dbView.Prepare(iDatabase, TDbQuery(sql));
       
   201     User::LeaveIfError(dbView.EvaluateAll());
       
   202     //Getthe pointer to the Content recieved as part of the Command
       
   203     if(KErrNone == err) 
       
   204      {       
       
   205      dbView.InsertL();
       
   206      dbView.SetColL(EKey,aObjId);
       
   207      dbView.SetColL(EDrive, aMdsItem.DriveNumber());
       
   208      dbView.SetColL(EUri,aMdsItem.Uri());
       
   209      //Inserts the row       
       
   210      dbView.PutL();
       
   211      CPIXLOGSTRING("CCPIXMDEDbManager::AddL PutL");          
       
   212      retVal = EOperationSuccess;         
       
   213      }
       
   214     CleanupStack::PopAndDestroy(&dbView); // dbView
       
   215     if(retVal == EOperationSuccess)
       
   216         {
       
   217         iDatabase.Commit();
       
   218         iDatabase.Compact();
       
   219         }
       
   220     else
       
   221         {
       
   222         iDatabase.Rollback();
       
   223         }
       
   224     User::LeaveIfError(err);
       
   225     CPIXLOGSTRING("END CCPIXMDEDbManager::AddL");
       
   226     return retVal;
       
   227     }
       
   228 
       
   229 // -----------------------------------------------------------------------------
       
   230 // CCPIXMDEDbManager::UpdateL
       
   231 // -----------------------------------------------------------------------------
       
   232 //
       
   233 TCPIXMDEDBAPIReturnType CCPIXMDEDbManager::UpdateL(const TUint& aObjId,CMDSEntity& aMdsItem)
       
   234     {
       
   235     CPIXLOGSTRING("START CCPIXMDEDbManager::UpdateL");
       
   236     TCPIXMDEDBAPIReturnType retVal = EOperationUndefined;
       
   237     // Database is not openend return Not ready
       
   238     if(!iOpened)
       
   239      {
       
   240      User::Leave(KErrNotReady);
       
   241      }
       
   242     iDatabase.Begin();
       
   243     RDbView dbView;
       
   244     CleanupClosePushL(dbView);
       
   245     TBuf<KMdeCpixSyncDbSqlDeleteSize> sql;
       
   246     sql.Format(KMdeCpixSyncDbSqlCheckExist,aObjId);
       
   247     User::LeaveIfError(dbView.Prepare(iDatabase, TDbQuery(sql)));
       
   248     User::LeaveIfError(dbView.EvaluateAll());
       
   249     dbView.FirstL();
       
   250     if(dbView.AtRow())
       
   251         {
       
   252         dbView.UpdateL();
       
   253         dbView.SetColL(EKey,aObjId);
       
   254         dbView.SetColL(EDrive, aMdsItem.DriveNumber());
       
   255         dbView.SetColL(EUri,aMdsItem.Uri());
       
   256         //Update record 
       
   257         dbView.PutL();
       
   258         retVal = EOperationSuccess;
       
   259         }
       
   260     CleanupStack::PopAndDestroy(&dbView); // dbView
       
   261     if(retVal == EOperationSuccess)
       
   262         {
       
   263         iDatabase.Commit();
       
   264         iDatabase.Compact();
       
   265         }
       
   266     else
       
   267         {
       
   268         iDatabase.Rollback();
       
   269         }
       
   270     CPIXLOGSTRING("END CCPIXMDEDbManager::UpdateL");
       
   271     return retVal;
       
   272     }
       
   273 
       
   274 // -----------------------------------------------------------------------------
       
   275 // CNotesPlugin::RemoveL
       
   276 // -----------------------------------------------------------------------------
       
   277 //
       
   278 TCPIXMDEDBAPIReturnType CCPIXMDEDbManager::RemoveL(const TUint& aObjId)
       
   279     {
       
   280     CPIXLOGSTRING("START CCPIXMDEDbManager::RemoveL");
       
   281     TCPIXMDEDBAPIReturnType retVal = EOperationUndefined;
       
   282     //If the database was not opened.
       
   283     // return Not ready
       
   284     if(!iOpened)
       
   285         {
       
   286         User::Leave(KErrNotReady);
       
   287         }
       
   288     TBuf<KMdeCpixSyncDbSqlDeleteSize> sql;
       
   289     sql.Format(KMdeCpixSyncDbSqlCheckExist,aObjId);
       
   290     iDatabase.Begin();
       
   291     //Prepare the view
       
   292     RDbView dbView;
       
   293     CleanupClosePushL(dbView);
       
   294     User::LeaveIfError(dbView.Prepare(iDatabase, TDbQuery(sql)));
       
   295     User::LeaveIfError(dbView.EvaluateAll());
       
   296     //Get the note property from the database for the given key.
       
   297     TBool isAtRow(dbView.FirstL());
       
   298     if ( isAtRow )
       
   299         {
       
   300         dbView.DeleteL();
       
   301         retVal = EOperationSuccess;
       
   302         CPIXLOGSTRING("CCPIXMDEDbManager::RemoveL Successful!");
       
   303         }
       
   304     else
       
   305         {
       
   306         //If the specified key was not found.
       
   307         retVal= EOperationFailure;
       
   308         }
       
   309     CleanupStack::PopAndDestroy(&dbView); // dbView
       
   310     if(EOperationSuccess == retVal)
       
   311         {
       
   312         iDatabase.Commit();
       
   313         iDatabase.Compact();
       
   314         }
       
   315     else
       
   316         {
       
   317         iDatabase.Rollback();
       
   318         }
       
   319     CPIXLOGSTRING("END CCPIXMDEDbManager::RemoveL");
       
   320     return retVal; 
       
   321     }
       
   322 
       
   323 TBool CCPIXMDEDbManager::IsAlreadyExistL(const TUint& aObjectId)
       
   324     {
       
   325     CPIXLOGSTRING("START CCPIXMDEDbManager::IsAlreadyExistL");
       
   326     TBool retVal(EFalse);
       
   327     //If the database was not opened.
       
   328     // return Not ready
       
   329     if(!iOpened)
       
   330         {
       
   331         User::Leave(KErrNotReady);
       
   332         }
       
   333     TBuf<KMdeCpixSyncDbSqlDeleteSize> sql;
       
   334     sql.Format(KMdeCpixSyncDbSqlCheckExist,aObjectId);
       
   335     //Prepare the view
       
   336     RDbView dbView;
       
   337     CleanupClosePushL(dbView);
       
   338     User::LeaveIfError(dbView.Prepare(iDatabase, TDbQuery(sql), RDbView::EReadOnly ));
       
   339     User::LeaveIfError(dbView.EvaluateAll());
       
   340     //Get the note property from the database for the given key.
       
   341     TBool isAtRow(dbView.FirstL());
       
   342     if ( isAtRow )
       
   343         {
       
   344         retVal= ETrue; //Found 
       
   345         }
       
   346     CleanupStack::PopAndDestroy(&dbView); // dbView
       
   347     CPIXLOGSTRING("END CCPIXMDEDbManager::IsAlreadyExistL");
       
   348     return retVal; 
       
   349     }
       
   350 
       
   351 void CCPIXMDEDbManager::GetItemL(const TInt aKey, CMDSEntity& aMdsItem)
       
   352     {
       
   353     CPIXLOGSTRING2("START CCPIXMDEDbManager::GetItemL aKey = %d",aKey);
       
   354     TInt err(KErrNone);
       
   355     //dataBase is not opened. return Not Ready
       
   356     if(!iOpened)
       
   357         {
       
   358         User::Leave(KErrNotReady);
       
   359         }
       
   360     TBuf<KMdeCpixSyncDbSqlDeleteSize> sql;
       
   361     sql.Format(KMdeCpixSyncDbSqlCheckExist, aKey);
       
   362     //Prepare the view
       
   363     RDbView dbView;
       
   364     CleanupClosePushL(dbView);
       
   365     User::LeaveIfError(dbView.Prepare(iDatabase, TDbQuery(sql), RDbView::EReadOnly ));
       
   366     User::LeaveIfError(dbView.EvaluateAll());
       
   367     //Get the note property from the database for the given key.
       
   368     TBool isAtRow(dbView.FirstL());
       
   369     if ( isAtRow )
       
   370         {
       
   371         //HBufC* content = NULL;
       
   372         dbView.GetL();
       
   373         //Get the key and modified time
       
   374         TInt key = dbView.ColInt32(EKey);
       
   375         TInt drive = dbView.ColInt32(EDrive);
       
   376         RDbColReadStream blob;
       
   377         blob.OpenLC(dbView, EUri);
       
   378         //Get the length of the content.
       
   379         TInt colLength( dbView.ColLength(EUri));
       
   380         //Get the length of the content to be read as filename       
       
   381         TInt uriLength(0);
       
   382         if(colLength > KMaxFileName )
       
   383             {
       
   384             uriLength = KMaxFileName;            
       
   385             }
       
   386         else
       
   387             {
       
   388             uriLength = colLength;
       
   389             }       
       
   390         
       
   391         //Create the buffer to get the filename
       
   392         HBufC* content = HBufC::NewLC(uriLength);
       
   393         TPtr ptr = content->Des();            
       
   394         //read the data from the database for the given length
       
   395         blob.ReadL(ptr,uriLength);         
       
   396         //Set the properties of the note to the Note Entity.
       
   397         TDriveNumber drivenumber = TDriveNumber(drive);
       
   398         aMdsItem.Set(key,*content,drivenumber);
       
   399         CleanupStack::PopAndDestroy( content ); // content
       
   400         //CleanupStack::Pop(content); // content
       
   401         //delete content;
       
   402         CleanupStack::PopAndDestroy(&blob); // blob
       
   403         }
       
   404     else 
       
   405         {
       
   406         //return not found for an invlaid key.
       
   407         err = KErrNotFound;
       
   408         }
       
   409     CleanupStack::PopAndDestroy(&dbView); // dbView/
       
   410     CPIXLOGSTRING2("END CCPIXMDEDbManager::GetItemL err = %d",err);
       
   411     User::LeaveIfError(err);      
       
   412     }
       
   413 
       
   414 // -----------------------------------------------------------------------------
       
   415 // CNotesPlugin::ResetL
       
   416 // -----------------------------------------------------------------------------
       
   417 //
       
   418 TCPIXMDEDBAPIReturnType CCPIXMDEDbManager::ResetL()
       
   419     {
       
   420     CPIXLOGSTRING("START CCPIXMDEDbManager::ResetL");
       
   421     TCPIXMDEDBAPIReturnType retVal = EOperationUndefined;
       
   422     TBuf<KMdeCpixSyncDbSqlDeleteSize> sql;
       
   423     sql.Copy(KMdeCpixSyncDbSqlInsert);
       
   424     iDatabase.Begin();
       
   425     //Prepare the view
       
   426     RDbView dbView;
       
   427     CleanupClosePushL(dbView);
       
   428     User::LeaveIfError(dbView.Prepare(iDatabase, TDbQuery(sql)));
       
   429     User::LeaveIfError(dbView.EvaluateAll());
       
   430     CPIXLOGSTRING2("CCPIXMDEDbManager::ResetL dbView.CountL = %d",dbView.CountL());
       
   431     while(dbView.NextL())
       
   432         {
       
   433 #ifdef _DEBUG
       
   434         TRAPD(err,dbView.DeleteL());
       
   435         CPIXLOGSTRING2("CCPIXMDEDbManager::ResetL dbView.DeleteL success err = %d",err);
       
   436 #else
       
   437         TRAP_IGNORE( dbView.DeleteL() );
       
   438 #endif
       
   439         }
       
   440     if(dbView.CountL() == 0)
       
   441         {
       
   442         CPIXLOGSTRING("CCPIXMDEDbManager::ResetL Success!"); 
       
   443         retVal= EOperationSuccess;
       
   444         }
       
   445     else
       
   446         {
       
   447         CPIXLOGSTRING("CCPIXMDEDbManager::ResetL Failure!");
       
   448         retVal= EOperationFailure;
       
   449         }
       
   450     CleanupStack::PopAndDestroy(1); // Myview
       
   451     if(retVal == EOperationSuccess)
       
   452         {
       
   453         iDatabase.Commit();
       
   454         iDatabase.Compact();
       
   455         }
       
   456     else
       
   457         {
       
   458         iDatabase.Rollback();
       
   459         }
       
   460     CPIXLOGSTRING("END CCPIXMDEDbManager::ResetL");
       
   461     return retVal; 
       
   462     }
       
   463 
       
   464 // -----------------------------------------------------------------------------
       
   465 // CMTPNotesDpDataController::Rollback
       
   466 // -----------------------------------------------------------------------------
       
   467 //
       
   468 void CCPIXMDEDbManager::Rollback()
       
   469     {
       
   470     iDatabase.Rollback();
       
   471     if ( iDatabase.IsDamaged() )
       
   472         {
       
   473         iDatabase.Recover();
       
   474         }
       
   475     }
       
   476 
       
   477 // End of file
       
   478