File indexing completed on 2024-06-23 05:07:01

0001 /*
0002     SPDX-FileCopyrightText: 2009 Volker Krause <vkrause@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "itemdeletehandler.h"
0008 
0009 #include "connection.h"
0010 #include "storage/datastore.h"
0011 #include "storage/itemqueryhelper.h"
0012 #include "storage/selectquerybuilder.h"
0013 #include "storage/transaction.h"
0014 
0015 #include "private/scope_p.h"
0016 
0017 using namespace Akonadi;
0018 using namespace Akonadi::Server;
0019 
0020 ItemDeleteHandler::ItemDeleteHandler(AkonadiServer &akonadi)
0021     : Handler(akonadi)
0022 {
0023 }
0024 
0025 bool ItemDeleteHandler::parseStream()
0026 {
0027     const auto &cmd = Protocol::cmdCast<Protocol::DeleteItemsCommand>(m_command);
0028 
0029     CommandContext context = connection()->context();
0030     if (!context.setScopeContext(cmd.scopeContext())) {
0031         return failureResponse(QStringLiteral("Invalid scope context"));
0032     }
0033 
0034     SelectQueryBuilder<PimItem> qb;
0035     ItemQueryHelper::scopeToQuery(cmd.items(), context, qb);
0036 
0037     DataStore *store = connection()->storageBackend();
0038     Transaction transaction(store, QStringLiteral("REMOVE"));
0039 
0040     if (!qb.exec()) {
0041         return failureResponse("Unable to execute query");
0042     }
0043 
0044     const QList<PimItem> items = qb.result();
0045     if (items.isEmpty()) {
0046         return failureResponse("No items found");
0047     }
0048     if (!store->cleanupPimItems(items)) {
0049         return failureResponse("Deletion failed");
0050     }
0051 
0052     if (!transaction.commit()) {
0053         return failureResponse("Unable to commit transaction");
0054     }
0055 
0056     return successResponse<Protocol::DeleteItemsResponse>();
0057 }