metadataengine/server/src/mdsmanipulationengine.cpp
branchRCL_3
changeset 6 646a02f170b9
parent 2 b73a2e62868f
child 7 3cebc1a84278
equal deleted inserted replaced
3:6752808b2036 6:646a02f170b9
    32 #include "mdeinternalerror.h"
    32 #include "mdeinternalerror.h"
    33 #include "mdeerror.h"
    33 #include "mdeerror.h"
    34 
    34 
    35 __USES_LOGGER
    35 __USES_LOGGER
    36 
    36 
    37 // ======== LOCAL FUNCTIONS ========
       
    38 
       
    39 static void TransactionCleanupL(void* aConn)
       
    40    {
       
    41    CMdSSqLiteConnection* conn = (CMdSSqLiteConnection*)aConn;
       
    42    conn->TransactionRollbackL();
       
    43    }
       
    44 
       
    45 // ---------------------------------------------------------------------------
    37 // ---------------------------------------------------------------------------
    46 // NewL
    38 // NewL
    47 // ---------------------------------------------------------------------------
    39 // ---------------------------------------------------------------------------
    48 //
    40 //
    49 CMdSManipulationEngine* CMdSManipulationEngine::NewL( CMdsSchema& aSchema,
    41 CMdSManipulationEngine* CMdSManipulationEngine::NewL( CMdsSchema& aSchema,
   154         RMdsStatement baseObjStmt;
   146         RMdsStatement baseObjStmt;
   155         CleanupClosePushL(baseObjStmt);
   147         CleanupClosePushL(baseObjStmt);
   156         RMdsStatement objStmt;
   148         RMdsStatement objStmt;
   157         CleanupClosePushL(objStmt);
   149         CleanupClosePushL(objStmt);
   158 		
   150 		
   159 		if( KObjectCount > 1 )
   151         RMdSTransaction transaction( connection );
   160 		    {
   152         CleanupClosePushL(transaction);
   161 	        RMdSTransaction transaction( connection );
   153         const TInt beginError( transaction.Error() );
   162 	        CleanupClosePushL(transaction);
   154         if( beginError != KErrNone )
   163 	        const TInt beginError( transaction.Error() );
   155             {
   164 	        if( beginError != KErrNone )
   156             CleanupStack::PopAndDestroy( &transaction );
   165 	            {
   157             }
   166 	            CleanupStack::PopAndDestroy( &transaction );
   158     
   167 	            }
   159         for ( TInt i = 0; i < KObjectCount; ++i )
   168 	    
   160             {
   169 		    for ( TInt i = 0; i < KObjectCount; ++i )
   161             aBuffer.PositionL( items.iObjects.iPtr.iOffset + i * sizeof(TMdCObject) );
   170 			    {
   162             TItemId id = KNoId;
   171 			    aBuffer.PositionL( items.iObjects.iPtr.iOffset + i * sizeof(TMdCObject) );
   163             TRAPD( err, id = iManipulate->AddObjectL( connection, aBuffer, 
   172 			    TItemId id = KNoId;
   164                     baseObjStmt, objStmt, aServerSession ) );
   173 			    TRAPD( err, id = iManipulate->AddObjectL( connection, aBuffer, 
   165             if (err == KErrNone)
   174 			            baseObjStmt, objStmt, aServerSession ) );
       
   175 			    if (err == KErrNone)
       
   176 				    {
       
   177 				    aResultBuffer.InsertL( id );
       
   178 				    }
       
   179 			    else
       
   180 				    {
       
   181 				    aResultBuffer.InsertL( KNoId );
       
   182 				    if(resultIds.iErrorCode == KErrNone)
       
   183 					    {
       
   184 					    resultIds.iErrorCode = err;
       
   185 					    }
       
   186 				    }
       
   187 			    }
       
   188 		    if( beginError == KErrNone )
       
   189 		        {
       
   190 	            transaction.CommitL();
       
   191 	            CleanupStack::PopAndDestroy( &transaction );
       
   192 		        }
       
   193 		    }
       
   194 		else
       
   195 		    {
       
   196             for ( TInt i = 0; i < KObjectCount; ++i )
       
   197                 {
   166                 {
   198                 aBuffer.PositionL( items.iObjects.iPtr.iOffset + i * sizeof(TMdCObject) );
   167                 aResultBuffer.InsertL( id );
   199                 TItemId id = KNoId;
   168                 }
   200                 TRAPD( err, id = iManipulate->AddObjectL( connection, aBuffer, 
   169             else
   201                         baseObjStmt, objStmt, aServerSession ) );
   170                 {
   202                 if (err == KErrNone)
   171                 aResultBuffer.InsertL( KNoId );
       
   172                 if(resultIds.iErrorCode == KErrNone)
   203                     {
   173                     {
   204                     aResultBuffer.InsertL( id );
   174                     resultIds.iErrorCode = err;
   205                     }
       
   206                 else
       
   207                     {
       
   208                     aResultBuffer.InsertL( KNoId );
       
   209                     if(resultIds.iErrorCode == KErrNone)
       
   210                         {
       
   211                         resultIds.iErrorCode = err;
       
   212                         }
       
   213                     }
   175                     }
   214                 }
   176                 }
   215 		    }
   177             }
       
   178         if( beginError == KErrNone )
       
   179             {
       
   180             transaction.CommitL();
       
   181             CleanupStack::PopAndDestroy( &transaction );
       
   182             }
       
   183 
   216         CleanupStack::PopAndDestroy(&objStmt);
   184         CleanupStack::PopAndDestroy(&objStmt);
   217         CleanupStack::PopAndDestroy(&baseObjStmt);
   185         CleanupStack::PopAndDestroy(&baseObjStmt);
   218 		}
   186 		}
   219 	else
   187 	else
   220 		{
   188 		{
   227     if ( KEventCount > 0 )
   195     if ( KEventCount > 0 )
   228 		{
   196 		{
   229 		resultIds.iEventIds.iPtr.iOffset = aResultBuffer.Position();
   197 		resultIds.iEventIds.iPtr.iOffset = aResultBuffer.Position();
   230 		resultIds.iEventIds.iPtr.iCount = KEventCount;
   198 		resultIds.iEventIds.iPtr.iCount = KEventCount;
   231 	    
   199 	    
   232 	    if( KEventCount > 1 )
   200         RMdSTransaction transaction( connection );
   233 	        {
   201         CleanupClosePushL(transaction);
   234 	        //More than 1 event, transaction will be used.
   202         const TInt beginError( transaction.Error() );
   235 	        connection.TransactionBeginL();
   203         if( beginError != KErrNone )
   236 	        CleanupStack::PushL(TCleanupItem(&TransactionCleanupL, &connection));
   204             {
   237 	        }
   205             CleanupStack::PopAndDestroy( &transaction );
       
   206             }
   238 
   207 
   239 		for ( TInt i = 0; i < KEventCount; ++i )
   208 		for ( TInt i = 0; i < KEventCount; ++i )
   240 			{
   209 			{
   241 			aBuffer.PositionL( items.iEvents.iPtr.iOffset + 
   210 			aBuffer.PositionL( items.iEvents.iPtr.iOffset + 
   242 					i * sizeof(TMdCEvent) );
   211 					i * sizeof(TMdCEvent) );
   255 					resultIds.iErrorCode = err;
   224 					resultIds.iErrorCode = err;
   256 					}
   225 					}
   257 				}
   226 				}
   258 			}
   227 			}
   259 
   228 
   260 		if( KEventCount > 1 )
   229         if( beginError == KErrNone )
   261 		    {
   230             {
   262 		    connection.TransactionCommitL();
   231             transaction.CommitL();
   263 		    CleanupStack::Pop();  //TransactionCleanup()
   232             CleanupStack::PopAndDestroy( &transaction );
   264 	        }
   233             }
   265 		}
   234 		}
   266 	else
   235 	else
   267 		{
   236 		{
   268 		resultIds.iEventIds.iPtr.iOffset = KNoOffset;
   237 		resultIds.iEventIds.iPtr.iOffset = KNoOffset;
   269 		resultIds.iEventIds.iPtr.iCount = 0;
   238 		resultIds.iEventIds.iPtr.iCount = 0;
   274     if ( KRelationCount > 0 )
   243     if ( KRelationCount > 0 )
   275 		{
   244 		{
   276 		resultIds.iRelationIds.iPtr.iOffset = aResultBuffer.Position();
   245 		resultIds.iRelationIds.iPtr.iOffset = aResultBuffer.Position();
   277 		resultIds.iRelationIds.iPtr.iCount = KRelationCount;
   246 		resultIds.iRelationIds.iPtr.iCount = KRelationCount;
   278 	    
   247 	    
   279 	    if( KRelationCount > 1 )
   248         RMdSTransaction transaction( connection );
   280 	        {
   249         CleanupClosePushL(transaction);
   281 	        //More than 1 relation, transaction will be used.
   250         const TInt beginError( transaction.Error() );
   282 	        connection.TransactionBeginL();
   251         if( beginError != KErrNone )
   283 	        CleanupStack::PushL(TCleanupItem(&TransactionCleanupL, &connection));
   252             {
   284 	        }
   253             CleanupStack::PopAndDestroy( &transaction );
       
   254             }
   285 
   255 
   286 	    for ( TInt i = 0; i < KRelationCount; ++i )
   256 	    for ( TInt i = 0; i < KRelationCount; ++i )
   287 			{
   257 			{
   288 			aBuffer.PositionL( items.iRelations.iPtr.iOffset + 
   258 			aBuffer.PositionL( items.iRelations.iPtr.iOffset + 
   289 					i * sizeof(TMdCRelation) );
   259 					i * sizeof(TMdCRelation) );
   302 					resultIds.iErrorCode = err;
   272 					resultIds.iErrorCode = err;
   303 					}
   273 					}
   304 				}
   274 				}
   305 			}
   275 			}
   306 
   276 
   307 	    if( KRelationCount > 1 )
   277         if( beginError == KErrNone )
   308 	        {
   278             {
   309 	        connection.TransactionCommitL();
   279             transaction.CommitL();
   310 	        CleanupStack::Pop();   //TransactionCleanup()
   280             CleanupStack::PopAndDestroy( &transaction );
   311 	        }
   281             }
   312 		}
   282 		}
   313 	else
   283 	else
   314 		{
   284 		{
   315 		resultIds.iRelationIds.iPtr.iOffset = KNoOffset;
   285 		resultIds.iRelationIds.iPtr.iOffset = KNoOffset;
   316 		resultIds.iRelationIds.iPtr.iCount = 0;
   286 		resultIds.iRelationIds.iPtr.iCount = 0;
   594 	if ( items.iObjects.iPtr.iCount > 0 )
   564 	if ( items.iObjects.iPtr.iCount > 0 )
   595 		{
   565 		{
   596 		resultIds.iObjectIds.iPtr.iOffset = aResultBuffer.Position();
   566 		resultIds.iObjectIds.iPtr.iOffset = aResultBuffer.Position();
   597 		resultIds.iObjectIds.iPtr.iCount = items.iObjects.iPtr.iCount;
   567 		resultIds.iObjectIds.iPtr.iCount = items.iObjects.iPtr.iCount;
   598 
   568 
       
   569         RMdSTransaction transaction( connection );
       
   570         CleanupClosePushL(transaction);
       
   571         const TInt beginError( transaction.Error() );
       
   572         if( beginError != KErrNone )
       
   573             {
       
   574             CleanupStack::PopAndDestroy( &transaction );
       
   575             }
       
   576 		
   599 		for ( TInt i = 0; i < items.iObjects.iPtr.iCount; ++i )
   577 		for ( TInt i = 0; i < items.iObjects.iPtr.iCount; ++i )
   600 			{
   578 			{
   601 			aBuffer.PositionL( items.iObjects.iPtr.iOffset + i * sizeof(TMdCObject) );
   579 			aBuffer.PositionL( items.iObjects.iPtr.iOffset + i * sizeof(TMdCObject) );
   602 
   580 
   603 			TItemId id = KNoId;
   581 			TItemId id = KNoId;
   613 					{
   591 					{
   614 					resultIds.iErrorCode = err;
   592 					resultIds.iErrorCode = err;
   615 					}
   593 					}
   616 				}
   594 				}
   617 			}
   595 			}
       
   596         if( beginError == KErrNone )
       
   597             {
       
   598             transaction.CommitL();
       
   599             CleanupStack::PopAndDestroy( &transaction );
       
   600             }
   618 		}
   601 		}
   619 	else
   602 	else
   620 		{
   603 		{
   621 		resultIds.iObjectIds.iPtr.iOffset = KNoOffset;
   604 		resultIds.iObjectIds.iPtr.iOffset = KNoOffset;
   622 		resultIds.iObjectIds.iPtr.iCount = 0;
   605 		resultIds.iObjectIds.iPtr.iCount = 0;