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) ); |
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) ); |
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; |