File indexing completed on 2024-06-23 05:07:02
0001 /*************************************************************************** 0002 * SPDX-FileCopyrightText: 2014 Christian Mollekopf <mollekopf@kolabsys.com> * 0003 * * 0004 * SPDX-License-Identifier: LGPL-2.0-or-later * 0005 ***************************************************************************/ 0006 0007 #include "relationfetchhandler.h" 0008 #include "connection.h" 0009 #include "handlerhelper.h" 0010 #include "storage/selectquerybuilder.h" 0011 0012 #include "private/imapset_p.h" 0013 0014 using namespace Akonadi; 0015 using namespace Akonadi::Server; 0016 0017 RelationFetchHandler::RelationFetchHandler(AkonadiServer &akonadi) 0018 : Handler(akonadi) 0019 { 0020 } 0021 0022 bool RelationFetchHandler::parseStream() 0023 { 0024 const auto &cmd = Protocol::cmdCast<Protocol::FetchRelationsCommand>(m_command); 0025 0026 SelectQueryBuilder<Relation> relationQuery; 0027 if (cmd.side() > 0) { 0028 Query::Condition c; 0029 c.setSubQueryMode(Query::Or); 0030 c.addValueCondition(Relation::leftIdFullColumnName(), Query::Equals, cmd.side()); 0031 c.addValueCondition(Relation::rightIdFullColumnName(), Query::Equals, cmd.side()); 0032 relationQuery.addCondition(c); 0033 } else { 0034 if (cmd.left() > 0) { 0035 relationQuery.addValueCondition(Relation::leftIdFullColumnName(), Query::Equals, cmd.left()); 0036 } 0037 if (cmd.right() > 0) { 0038 relationQuery.addValueCondition(Relation::rightIdFullColumnName(), Query::Equals, cmd.right()); 0039 } 0040 } 0041 0042 const auto cmdTypes = cmd.types(); 0043 if (!cmdTypes.isEmpty()) { 0044 relationQuery.addJoin(QueryBuilder::InnerJoin, RelationType::tableName(), Relation::typeIdFullColumnName(), RelationType::idFullColumnName()); 0045 QStringList types; 0046 types.reserve(cmdTypes.size()); 0047 for (const QByteArray &type : cmdTypes) { 0048 types << QString::fromUtf8(type); 0049 } 0050 relationQuery.addValueCondition(RelationType::nameFullColumnName(), Query::In, types); 0051 } 0052 if (!cmd.resource().isEmpty()) { 0053 Resource res = Resource::retrieveByName(cmd.resource()); 0054 if (!res.isValid()) { 0055 return failureResponse("Invalid resource"); 0056 } 0057 Query::Condition condition; 0058 condition.setSubQueryMode(Query::Or); 0059 condition.addColumnCondition(PimItem::idFullColumnName(), Query::Equals, Relation::leftIdFullColumnName()); 0060 condition.addColumnCondition(PimItem::idFullColumnName(), Query::Equals, Relation::rightIdFullColumnName()); 0061 relationQuery.addJoin(QueryBuilder::InnerJoin, PimItem::tableName(), condition); 0062 0063 relationQuery.addJoin(QueryBuilder::InnerJoin, Collection::tableName(), PimItem::collectionIdFullColumnName(), Collection::idFullColumnName()); 0064 0065 relationQuery.addValueCondition(Collection::resourceIdFullColumnName(), Query::Equals, res.id()); 0066 relationQuery.addGroupColumns(QStringList() << Relation::leftIdFullColumnName() << Relation::rightIdFullColumnName() 0067 << Relation::typeIdFullColumnName()); 0068 } 0069 0070 if (!relationQuery.exec()) { 0071 return failureResponse("Failed to query for existing relation"); 0072 } 0073 const Relation::List existingRelations = relationQuery.result(); 0074 for (const Relation &relation : existingRelations) { 0075 sendResponse(HandlerHelper::fetchRelationsResponse(relation)); 0076 } 0077 0078 return successResponse<Protocol::FetchRelationsResponse>(); 0079 }