164
164
/* --- ItemFlags ----------------------------------------------------- */
166
bool DataStore::setItemFlags( const PimItem &item, const QVector<Flag> &flags )
166
bool DataStore::setItemsFlags( const PimItem::List &items, const QVector<Flag> &flags )
168
168
// first delete all old flags of this pim item
169
if ( !item.clearFlags() )
172
// then add the new flags
173
for ( int i = 0; i < flags.count(); ++i ) {
174
if ( !item.addFlag( flags[i] ) )
178
mNotificationCollector->itemChanged( item, QSet<QByteArray>() << "FLAGS" );
169
QSet<QByteArray> removedFlags;
170
QSet<QByteArray> addedFlags;
173
QVariantList insFlags;
175
Q_FOREACH( const PimItem &item, items ) {
176
Q_FOREACH( const Flag &flag, item.flags() ) {
177
if ( !removedFlags.contains( flag.name().toLatin1() ) ) {
178
removedFlags << flag.name().toLatin1();
182
// create a bind values for the insert query - every item repeats exactly
183
// flags.count()-times
184
for ( int i = 0; i < flags.count(); ++i ) {
191
// Clear all flags of all given items at once
192
QueryBuilder qb( PimItemFlagRelation::tableName(), QueryBuilder::Delete );
193
Query::Condition cond;
194
cond.addValueCondition( PimItemFlagRelation::leftFullColumnName(), Query::In, ids );
195
qb.addCondition( cond );
200
// create bind values for the insert quest - every flags repeats exactly
201
// items.count()-times
202
Q_FOREACH( const Flag &flag, flags ) {
203
for ( int i = 0; i < items.count(); ++i ) {
204
insFlags << flag.id();
207
addedFlags << flag.name().toLatin1();
210
QueryBuilder qb2( PimItemFlagRelation::tableName(), QueryBuilder::Insert );
211
qb2.setColumnValue( PimItemFlagRelation::leftFullColumnName(), insIds );
212
qb2.setColumnValue( PimItemFlagRelation::rightFullColumnName(), insFlags );
217
mNotificationCollector->itemsFlagsChanged( items, addedFlags, removedFlags );
182
bool DataStore::appendItemFlags( const PimItem &item, const QVector<Flag> &flags,
221
bool DataStore::appendItemsFlags( const PimItem::List &items, const QVector<Flag> &flags,
183
222
bool& flagsChanged, bool checkIfExists,
184
223
const Collection &col )
186
flagsChanged = false;
187
if ( !item.isValid() )
225
QSet<QByteArray> added;
226
Q_FOREACH( const PimItem &item, items ) {
227
flagsChanged = false;
228
if ( !item.isValid() )
230
if ( flags.isEmpty() )
233
for ( int i = 0; i < flags.count(); ++i ) {
234
if ( !checkIfExists || !item.relatesToFlag( flags[ i ] ) ) {
236
added << flags[ i ].name().toLatin1();
237
if ( !item.addFlag( flags[i] ) )
243
mNotificationCollector->itemsFlagsChanged( items, added, QSet<QByteArray>(), col );
247
bool DataStore::removeItemsFlags( const PimItem::List &items, const QVector<Flag> &flags )
249
QSet<QByteArray> removedFlags;
250
QVariantList itemsIds;
251
QVariantList flagsIds;
252
Q_FOREACH ( const PimItem &item, items ) {
253
itemsIds << item.id();
254
for ( int i = 0; i < flags.count(); ++i ) {
255
const QByteArray flagName = flags[ i ].name().toLatin1();
256
if ( !flagsIds.contains( flagName ) ) {
257
flagsIds << flags[ i ].id();
258
removedFlags << flagName;
263
// Delete all given flags from all given items in one go
264
QueryBuilder qb( PimItemFlagRelation::tableName(), QueryBuilder::Delete );
265
Query::Condition cond( Query::And );
266
cond.addValueCondition( PimItemFlagRelation::rightFullColumnName(), Query::In, flagsIds );
267
cond.addValueCondition( PimItemFlagRelation::leftFullColumnName(), Query::In, itemsIds );
268
qb.addCondition( cond );
189
if ( flags.isEmpty() )
192
for ( int i = 0; i < flags.count(); ++i ) {
193
if ( !checkIfExists || !item.relatesToFlag( flags[ i ] ) ) {
195
if ( !item.addFlag( flags[i] ) )
200
mNotificationCollector->itemChanged( item, QSet<QByteArray>() << "FLAGS", col );
204
bool DataStore::removeItemFlags( const PimItem &item, const QVector<Flag> &flags )
206
for ( int i = 0; i < flags.count(); ++i ) {
207
if ( !item.removeFlag( flags[ i ] ) )
211
mNotificationCollector->itemChanged( item, QSet<QByteArray>() << "FLAGS" );
273
mNotificationCollector->itemsFlagsChanged( items, QSet<QByteArray>(), removedFlags );
274
336
// collect item deletion notifications
275
337
const PimItem::List items = collection.items();
276
338
const QByteArray resource = collection.resource().name().toLatin1();
277
Q_FOREACH ( const PimItem &item, items ) {
279
// generate the notification before actually removing the data
280
// TODO: we should try to get rid of this, requires client side changes to resources and Monitor though
281
mNotificationCollector->itemRemoved( item, collection, QString(), resource );
340
// generate the notification before actually removing the data
341
// TODO: we should try to get rid of this, requires client side changes to resources and Monitor though
342
mNotificationCollector->itemsRemoved( items, collection, resource );
284
344
// remove all external payload parts
285
345
QueryBuilder qb( Part::tableName(), QueryBuilder::Select );
286
346
qb.addColumn( Part::dataFullColumnName() );
287
qb.addValueCondition( Part::externalFullColumnName(), Query::Equals, true );
288
qb.addValueCondition( Part::dataFullColumnName(), Query::IsNot, QVariant() );
289
347
qb.addJoin( QueryBuilder::InnerJoin, PimItem::tableName(), Part::pimItemIdFullColumnName(), PimItem::idFullColumnName() );
290
348
qb.addJoin( QueryBuilder::InnerJoin, Collection::tableName(), PimItem::collectionIdFullColumnName(), Collection::idFullColumnName() );
349
qb.addValueCondition( Collection::idFullColumnName(), Query::Equals, collection.id() );
350
qb.addValueCondition( Part::externalFullColumnName(), Query::Equals, true );
351
qb.addValueCondition( Part::dataFullColumnName(), Query::IsNot, QVariant() );
291
352
if ( !qb.exec() )
484
543
return Collection::extractResult( qb.query() );
546
QMap<Entity::Id,PimItem> DataStore::virtualCollections( const PimItem::List &items )
548
QueryBuilder qb( CollectionPimItemRelation::tableName(), QueryBuilder::Select );
549
qb.addJoin( QueryBuilder::InnerJoin, Collection::tableName(),
550
Collection::idFullColumnName(), CollectionPimItemRelation::leftFullColumnName() );
551
qb.addJoin( QueryBuilder::InnerJoin, PimItem::tableName(),
552
PimItem::idFullColumnName(), CollectionPimItemRelation::rightFullColumnName() );
553
qb.addColumn( Collection::idFullColumnName() );
554
qb.addColumns( QStringList() << PimItem::idFullColumnName()
555
<< PimItem::remoteIdFullColumnName()
556
<< PimItem::remoteRevisionFullColumnName() );
558
Query::Condition condition( Query::Or );
560
Q_FOREACH( const PimItem &item, items ) {
561
ids << QString::number( item.id() );
563
qb.addValueCondition( CollectionPimItemRelation::rightFullColumnName(), Query::In, ids );
566
akDebug() << "Error during selection of records from table CollectionPimItemRelation"
567
<< qb.query().lastError().text();
568
return QMap<Entity::Id,PimItem>();
571
QSqlQuery query = qb.query();
572
QMap<Entity::Id,PimItem> map;
573
while ( query.next() ) {
575
item.setId( query.value( 1 ).toLongLong() );
576
item.setRemoteId( query.value( 2 ).toString() );
577
item.setRemoteRevision( query.value( 3 ).toString() );
578
map.insertMulti( query.value( 0 ).toLongLong(), item );
488
585
/* --- MimeType ------------------------------------------------------ */
489
586
bool DataStore::appendMimeType( const QString & mimetype, qint64 *insertId )
572
669
return PartHelper::remove( Part::nameFullColumnName(), QLatin1String( "ATR:HIDDEN" ) );
575
bool DataStore::cleanupPimItem( const PimItem &item )
672
bool DataStore::cleanupPimItems( const PimItem::List &items )
577
if ( !item.isValid() )
580
674
// generate the notification before actually removing the data
581
mNotificationCollector->itemRemoved( item );
583
if ( !item.clearFlags() )
585
if ( !PartHelper::remove( Part::pimItemIdColumn(), item.id() ) )
587
if ( !PimItem::remove( PimItem::idColumn(), item.id() ) )
590
if ( !Entity::clearRelation<CollectionPimItemRelation>( item.id(), Entity::Right ) )
675
mNotificationCollector->itemsRemoved( items );
677
// FIXME: Create a single query to do this
678
Q_FOREACH( const PimItem &item, items ) {
679
if ( !item.clearFlags() )
681
if ( !PartHelper::remove( Part::pimItemIdColumn(), item.id() ) )
683
if ( !PimItem::remove( PimItem::idColumn(), item.id() ) )
686
if ( !Entity::clearRelation<CollectionPimItemRelation>( item.id(), Entity::Right ) )