Warning, /pim/akonadi/src/server/storage/entities-source.xsl is written in an unsupported language. File is not indexed.
0001 <!-- 0002 SPDX-FileCopyrightText: 2006-2007 Volker Krause <vkrause@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 --> 0006 0007 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 0008 version="1.0"> 0009 0010 <!-- table class source template --> 0011 <xsl:template name="table-source"> 0012 <xsl:variable name="className"><xsl:value-of select="@name"/></xsl:variable> 0013 <xsl:variable name="tableName"><xsl:value-of select="@name"/>Table</xsl:variable> 0014 <xsl:variable name="entityName"><xsl:value-of select="@name"/></xsl:variable> 0015 0016 // private class 0017 class <xsl:value-of select="$className"/>::Private : public QSharedData 0018 { 0019 public: 0020 Private() : QSharedData() // NOLINT(readability-redundant-member-init) 0021 <!-- BEGIN Variable Initializers - order as Variable Declarations below --> 0022 <xsl:for-each select="column[@type = 'bool']"> 0023 , <xsl:value-of select="@name"/>(<xsl:choose><xsl:when test="@default"><xsl:value-of select="@default"/></xsl:when><xsl:otherwise>false</xsl:otherwise></xsl:choose>) 0024 </xsl:for-each> 0025 <xsl:for-each select="column[@name != 'id']"> 0026 , <xsl:value-of select="@name"/>_changed(false) 0027 </xsl:for-each> 0028 <!-- END Variable Initializers - order as Variable Declarations below --> 0029 {} 0030 0031 <!-- BEGIN Variable Declarations - order by decreasing sizeof() --> 0032 <xsl:for-each select="column[@type = 'qint64' and @name != 'id']"> 0033 qint64 <xsl:value-of select="@name"/> = <xsl:choose><xsl:when test="@default"><xsl:value-of select="@default"/></xsl:when><xsl:otherwise>0</xsl:otherwise></xsl:choose>; 0034 </xsl:for-each> 0035 <xsl:if test="column[@type = 'QDateTime']"> 0036 </xsl:if> 0037 <xsl:for-each select="column[@type = 'QString']"> 0038 QString <xsl:value-of select="@name"/>; 0039 </xsl:for-each> 0040 <xsl:for-each select="column[@type = 'QByteArray']"> 0041 QByteArray <xsl:value-of select="@name"/>; 0042 </xsl:for-each> 0043 <xsl:if test="column[@type = 'QDateTime']"> 0044 // on non-wince, QDateTime is one int 0045 <xsl:for-each select="column[@type = 'QDateTime']"> 0046 QDateTime <xsl:value-of select="@name"/>; 0047 </xsl:for-each> 0048 </xsl:if> 0049 <xsl:for-each select="column[@type = 'int']"> 0050 int <xsl:value-of select="@name"/> = <xsl:choose><xsl:when test="@default"><xsl:value-of select="@default"/></xsl:when><xsl:otherwise>0</xsl:otherwise></xsl:choose>; 0051 </xsl:for-each> 0052 <xsl:for-each select="column[@type = 'bool']"> 0053 bool <xsl:value-of select="@name"/> : 1; 0054 </xsl:for-each> 0055 <xsl:for-each select="column[@type = 'Tristate']"> 0056 Tristate <xsl:value-of select="@name"/>; 0057 </xsl:for-each> 0058 <xsl:for-each select="column[@type = 'enum']"> 0059 <xsl:value-of select="@enumType"/><xsl:text> </xsl:text><xsl:value-of select="@name"/> = <xsl:choose><xsl:when test="@default"><xsl:value-of select="@default"/></xsl:when><xsl:otherwise>0</xsl:otherwise></xsl:choose>; 0060 </xsl:for-each> 0061 <xsl:for-each select="column[@name != 'id']"> 0062 bool <xsl:value-of select="@name"/>_changed : 1; 0063 </xsl:for-each> 0064 <!-- END Variable Declarations - order by decreasing sizeof() --> 0065 0066 static void addToCache(const <xsl:value-of select="$className"/> &entry); 0067 0068 // cache 0069 static QAtomicInt cacheEnabled; 0070 static QMutex cacheMutex; 0071 <xsl:if test="column[@name = 'id']"> 0072 static QHash<qint64, <xsl:value-of select="$className"/>> idCache; 0073 </xsl:if> 0074 <xsl:if test="column[@name = 'name']"> 0075 static QHash<<xsl:value-of select="column[@name = 'name']/@type"/>, <xsl:value-of select="$className"/>> nameCache; 0076 </xsl:if> 0077 }; 0078 0079 0080 // static members 0081 QAtomicInt <xsl:value-of select="$className"/>::Private::cacheEnabled(0); 0082 QMutex <xsl:value-of select="$className"/>::Private::cacheMutex; 0083 <xsl:if test="column[@name = 'id']"> 0084 QHash<qint64, <xsl:value-of select="$className"/>> <xsl:value-of select="$className"/>::Private::idCache; 0085 </xsl:if> 0086 <xsl:if test="column[@name = 'name']"> 0087 QHash<<xsl:value-of select="column[@name = 'name']/@type"/>, <xsl:value-of select="$className"/>> <xsl:value-of select="$className"/>::Private::nameCache; 0088 </xsl:if> 0089 0090 0091 void <xsl:value-of select="$className"/>::Private::addToCache(const <xsl:value-of select="$className"/> &entry) 0092 { 0093 Q_ASSERT(cacheEnabled); 0094 Q_UNUSED(entry); <!-- in case the table has neither an id nor name column --> 0095 QMutexLocker lock(&cacheMutex); 0096 <xsl:if test="column[@name = 'id']"> 0097 idCache.insert(entry.id(), entry); 0098 </xsl:if> 0099 <xsl:if test="column[@name = 'name']"> 0100 <xsl:choose> 0101 <xsl:when test="$className = 'PartType'"> 0102 <!-- special case for PartType, which is identified as "NS:NAME" --> 0103 nameCache.insert(entry.ns() + QLatin1Char(':') + entry.name(), entry); 0104 </xsl:when> 0105 <xsl:otherwise> 0106 nameCache.insert(entry.name(), entry); 0107 </xsl:otherwise> 0108 </xsl:choose> 0109 </xsl:if> 0110 } 0111 0112 0113 // constructor 0114 <xsl:value-of select="$className"/>::<xsl:value-of select="$className"/>() 0115 : d(new Private) 0116 { 0117 } 0118 0119 <xsl:value-of select="$className"/>::<xsl:value-of select="$className"/>( 0120 <xsl:for-each select="column[@name != 'id']"> 0121 <xsl:call-template name="argument"/><xsl:if test="position() != last()">, </xsl:if> 0122 </xsl:for-each> 0123 ) : d(new Private) 0124 { 0125 <xsl:for-each select="column[@name != 'id']"> 0126 d-><xsl:value-of select="@name"/> = <xsl:value-of select="@name"/>; 0127 d-><xsl:value-of select="@name"/>_changed = true; 0128 </xsl:for-each> 0129 } 0130 0131 <xsl:if test="column[@name = 'id']"> 0132 <xsl:value-of select="$className"/>::<xsl:value-of select="$className"/>( 0133 <xsl:for-each select="column"> 0134 <xsl:call-template name="argument"/><xsl:if test="position() != last()">, </xsl:if> 0135 </xsl:for-each> 0136 ) : 0137 Entity(id), 0138 d(new Private) 0139 { 0140 <xsl:for-each select="column[@name != 'id']"> 0141 d-><xsl:value-of select="@name"/> = <xsl:value-of select="@name"/>; 0142 d-><xsl:value-of select="@name"/>_changed = true; 0143 </xsl:for-each> 0144 } 0145 </xsl:if> 0146 0147 <xsl:value-of select="$className"/>::<xsl:value-of select="$className"/>(const <xsl:value-of select="$className"/> &other) 0148 : Entity(other), d(other.d) 0149 { 0150 } 0151 0152 // destructor 0153 <xsl:value-of select="$className"/>::~<xsl:value-of select="$className"/>() {} 0154 0155 // assignment operator 0156 <xsl:value-of select="$className"/>& <xsl:value-of select="$className"/>::operator=(const <xsl:value-of select="$className"/> &other) 0157 { 0158 if (this != &other) { 0159 d = other.d; 0160 setId(other.id()); 0161 } 0162 return *this; 0163 } 0164 0165 // comparison operator 0166 bool <xsl:value-of select="$className"/>::operator==(const <xsl:value-of select="$className"/> &other) const 0167 { 0168 return id() == other.id(); 0169 } 0170 0171 // accessor methods 0172 <xsl:for-each select="column[@name != 'id']"> 0173 <xsl:call-template name="data-type"/><xsl:text> </xsl:text><xsl:value-of select="$className"/>::<xsl:value-of select="@name"/>() const 0174 { 0175 <xsl:text>return d-></xsl:text><xsl:value-of select="@name"/>; 0176 } 0177 0178 void <xsl:value-of select="$className"/>::<xsl:call-template name="setter-signature"/> 0179 { 0180 d-><xsl:value-of select="@name"/> = <xsl:value-of select="@name"/>; 0181 d-><xsl:value-of select="@name"/>_changed = true; 0182 } 0183 0184 </xsl:for-each> 0185 0186 // SQL table information 0187 <xsl:text>QString </xsl:text><xsl:value-of select="$className"/>::tableName() 0188 { 0189 static const QString tableName = QStringLiteral("<xsl:value-of select="$tableName"/>"); 0190 return tableName; 0191 } 0192 0193 QStringList <xsl:value-of select="$className"/>::columnNames() 0194 { 0195 static const QStringList columns = { 0196 <xsl:for-each select="column"> 0197 <xsl:value-of select="@name"/>Column() 0198 <xsl:if test="position() != last()">,</xsl:if> 0199 </xsl:for-each> 0200 }; 0201 return columns; 0202 } 0203 0204 QStringList <xsl:value-of select="$className"/>::fullColumnNames() 0205 { 0206 static const QStringList columns = { 0207 <xsl:for-each select="column"> 0208 <xsl:value-of select="@name"/>FullColumnName() 0209 <xsl:if test="position() != last()">,</xsl:if> 0210 </xsl:for-each> 0211 }; 0212 return columns; 0213 } 0214 0215 <xsl:for-each select="column"> 0216 QString <xsl:value-of select="$className"/>::<xsl:value-of select="@name"/>Column() 0217 { 0218 static const QString column = QStringLiteral("<xsl:value-of select="@name"/>"); 0219 return column; 0220 } 0221 0222 QString <xsl:value-of select="$className"/>::<xsl:value-of select="@name"/>FullColumnName() 0223 { 0224 static const QString column = QStringLiteral("<xsl:value-of select="$tableName"/>.<xsl:value-of select="@name"/>"); 0225 return column; 0226 } 0227 </xsl:for-each> 0228 0229 0230 // count records 0231 int <xsl:value-of select="$className"/>::count(const QString &column, const QVariant &value) 0232 { 0233 return count(DataStore::self(), column, value); 0234 } 0235 0236 int <xsl:value-of select="$className"/>::count(DataStore *store, const QString &column, const QVariant &value) 0237 { 0238 return Entity::count<<xsl:value-of select="$className"/>>(store, column, value); 0239 } 0240 0241 0242 // check existence 0243 <xsl:if test="column[@name = 'id']"> 0244 bool <xsl:value-of select="$className"/>::exists(qint64 id) 0245 { 0246 if (Private::cacheEnabled) { 0247 QMutexLocker lock(&Private::cacheMutex); 0248 if (Private::idCache.contains(id)) { 0249 return true; 0250 } 0251 } 0252 return count(idColumn(), id) > 0; 0253 } 0254 </xsl:if> 0255 <xsl:if test="column[@name = 'name']"> 0256 bool <xsl:value-of select="$className"/>::exists(const <xsl:value-of select="column[@name = 'name']/@type" /> &name) 0257 { 0258 return exists(DataStore::self(), name); 0259 } 0260 0261 bool <xsl:value-of select="$className"/>::exists(DataStore *store, const <xsl:value-of select="column[@name = 'name']/@type"/> &name) 0262 { 0263 if (Private::cacheEnabled) { 0264 QMutexLocker lock(&Private::cacheMutex); 0265 if (Private::nameCache.contains(name)) { 0266 return true; 0267 } 0268 } 0269 return count(store, nameColumn(), name) > 0; 0270 } 0271 </xsl:if> 0272 0273 0274 // result extraction 0275 QList<<xsl:value-of select="$className"/>> <xsl:value-of select="$className"/>::extractResult(QSqlQuery &query) 0276 { 0277 return extractResult(DataStore::self(), query); 0278 } 0279 0280 QList<<xsl:value-of select="$className"/>> <xsl:value-of select="$className"/>::extractResult(DataStore *store, QSqlQuery &query) 0281 { 0282 Q_UNUSED(store); // only used in specfic case when the entity has a QDateTime column (e.g. PimItem). This will suppress 0283 // "unused parameter" warning for other entities that do not have a QDateTime column. 0284 QList<<xsl:value-of select="$className"/>> rv; 0285 if (query.driver()->hasFeature(QSqlDriver::QuerySize)) { 0286 rv.reserve(query.size()); 0287 } 0288 while (query.next()) { 0289 rv.append(<xsl:value-of select="$className"/>( 0290 <xsl:for-each select="column"> 0291 (query.isNull(<xsl:value-of select="position() - 1"/>) 0292 ? <xsl:call-template name="data-type"/>() 0293 <xsl:text>: </xsl:text> 0294 <xsl:choose> 0295 <xsl:when test="starts-with(@type,'QString')"> 0296 <xsl:text>Utils::variantToString(query.value(</xsl:text><xsl:value-of select="position() - 1"/><xsl:text>))</xsl:text> 0297 </xsl:when> 0298 <xsl:when test="starts-with(@type, 'enum')"> 0299 <xsl:text>static_cast<</xsl:text><xsl:value-of select="@enumType"/>>(query.value(<xsl:value-of select="position() - 1"/><xsl:text>).value<int>())</xsl:text> 0300 </xsl:when> 0301 <xsl:when test="starts-with(@type, 'QDateTime')"> 0302 <xsl:text>Utils::variantToDateTime(query.value(</xsl:text><xsl:value-of select="position() - 1" /><xsl:text>), store)</xsl:text> 0303 </xsl:when> 0304 <xsl:otherwise> 0305 <xsl:text>query.value(</xsl:text><xsl:value-of select="position() - 1"/>).value<<xsl:value-of select="@type"/>><xsl:text>()</xsl:text> 0306 </xsl:otherwise> 0307 </xsl:choose> 0308 <xsl:text>)</xsl:text><xsl:if test="position() != last()"><xsl:text>,</xsl:text></xsl:if> 0309 </xsl:for-each> 0310 )); 0311 } 0312 query.finish(); 0313 return rv; 0314 } 0315 0316 // data retrieval 0317 <xsl:if test="column[@name='id']"> 0318 <xsl:value-of select="$className"/><xsl:text> </xsl:text><xsl:value-of select="$className"/>::retrieveById(qint64 id) 0319 { 0320 return retrieveById(DataStore::self(), id); 0321 } 0322 <xsl:value-of select="$className"/><xsl:text> </xsl:text><xsl:value-of select="$className"/>::retrieveById(DataStore *store, qint64 id) 0323 { 0324 <xsl:call-template name="data-retrieval"> 0325 <xsl:with-param name="dataStore">store</xsl:with-param> 0326 <xsl:with-param name="key">id</xsl:with-param> 0327 <xsl:with-param name="cache">idCache</xsl:with-param> 0328 </xsl:call-template> 0329 } 0330 0331 </xsl:if> 0332 <xsl:if test="column[@name = 'name'] and $className != 'PartType'"> 0333 <xsl:value-of select="$className"/><xsl:text> </xsl:text><xsl:value-of select="$className"/>::retrieveByName(const <xsl:value-of select="column[@name = 'name']/@type"/> &name) 0334 { 0335 return retrieveByName(DataStore::self(), name); 0336 } 0337 0338 <xsl:value-of select="$className"/><xsl:text> </xsl:text><xsl:value-of select="$className"/>::retrieveByName(DataStore *store, const <xsl:value-of select="column[@name = 'name']/@type"/> &name) 0339 { 0340 <xsl:call-template name="data-retrieval"> 0341 <xsl:with-param name="dataStore">store</xsl:with-param> 0342 <xsl:with-param name="key">name</xsl:with-param> 0343 <xsl:with-param name="cache">nameCache</xsl:with-param> 0344 </xsl:call-template> 0345 } 0346 0347 <xsl:value-of select="$className"/><xsl:text> </xsl:text><xsl:value-of select="$className"/>::retrieveByNameOrCreate(const <xsl:value-of select="column[@name = 'name']/@type"/> &name) 0348 { 0349 return retrieveByNameOrCreate(DataStore::self(), name); 0350 } 0351 0352 <xsl:value-of select="$className"/><xsl:text> </xsl:text><xsl:value-of select="$className"/>::retrieveByNameOrCreate(DataStore *store, const <xsl:value-of select="column[@name = 'name']/@type"/> &name) 0353 { 0354 static QMutex lock; 0355 QMutexLocker locker(&lock); 0356 auto rv = retrieveByName(store, name); 0357 if (rv.isValid()) { 0358 return rv; 0359 } 0360 0361 rv.setName(name); 0362 if (!rv.insert(store)) { 0363 return <xsl:value-of select="$className"/>(); 0364 } 0365 0366 if (Private::cacheEnabled) { 0367 Private::addToCache(rv); 0368 } 0369 return rv; 0370 } 0371 </xsl:if> 0372 0373 <xsl:if test="column[@name = 'name'] and $className = 'PartType'"> 0374 <xsl:text>PartType PartType::retrieveByFQName(const QString &ns, const QString &name)</xsl:text> 0375 { 0376 return retrieveByFQName(DataStore::self(), ns, name); 0377 } 0378 0379 <xsl:text>PartType PartType::retrieveByFQName(DataStore *store, const QString &ns, const QString &name)</xsl:text> 0380 { 0381 const QString fqname = ns + QLatin1Char(':') + name; 0382 <xsl:call-template name="data-retrieval"> 0383 <xsl:with-param name="dataStore">store</xsl:with-param> 0384 <xsl:with-param name="key">ns</xsl:with-param> 0385 <xsl:with-param name="key2">name</xsl:with-param> 0386 <xsl:with-param name="lookupKey">fqname</xsl:with-param> 0387 <xsl:with-param name="cache">nameCache</xsl:with-param> 0388 </xsl:call-template> 0389 } 0390 0391 <xsl:text>PartType PartType::retrieveByFQNameOrCreate(const QString &ns, const QString &name)</xsl:text> 0392 { 0393 return retrieveByFQNameOrCreate(DataStore::self(), ns, name); 0394 } 0395 0396 <xsl:text>PartType PartType::retrieveByFQNameOrCreate(DataStore *store, const QString &ns, const QString &name)</xsl:text> 0397 { 0398 static QMutex lock; 0399 QMutexLocker locker(&lock); 0400 PartType rv = retrieveByFQName(store, ns, name); 0401 if (rv.isValid()) { 0402 return rv; 0403 } 0404 0405 rv.setNs(ns); 0406 rv.setName(name); 0407 if (!rv.insert(store)) { 0408 return PartType(); 0409 } 0410 0411 if (Private::cacheEnabled) { 0412 Private::addToCache(rv); 0413 } 0414 return rv; 0415 } 0416 </xsl:if> 0417 0418 QList<<xsl:value-of select="$className"/>> <xsl:value-of select="$className"/>::retrieveAll() 0419 { 0420 return retrieveAll(DataStore::self()); 0421 } 0422 0423 QList<<xsl:value-of select="$className"/>> <xsl:value-of select="$className"/>::retrieveAll(DataStore *store) 0424 { 0425 QSqlDatabase db = store->database(); 0426 if (!db.isOpen()) { 0427 return {}; 0428 } 0429 0430 QueryBuilder qb(store, tableName(), QueryBuilder::Select); 0431 qb.addColumns(columnNames()); 0432 if (!qb.exec()) { 0433 qCWarning(AKONADISERVER_LOG) << "Error during selection of all records from table" << tableName() 0434 << qb.query().lastError().text() << qb.query().lastQuery(); 0435 return {}; 0436 } 0437 return extractResult(store, qb.query()); 0438 } 0439 0440 QList<<xsl:value-of select="$className"/>> <xsl:value-of select="$className"/>::retrieveFiltered(const QString &key, const QVariant &value) 0441 { 0442 return retrieveFiltered(DataStore::self(), key, value); 0443 } 0444 0445 QList<<xsl:value-of select="$className"/>> <xsl:value-of select="$className"/>::retrieveFiltered(DataStore *store, const QString &key, const QVariant &value) 0446 { 0447 QSqlDatabase db = store->database(); 0448 if (!db.isOpen()) { 0449 return {}; 0450 } 0451 0452 SelectQueryBuilder<<xsl:value-of select="$className"/>> qb(store); 0453 if (value.isNull()) { 0454 qb.addValueCondition(key, Query::Is, QVariant()); 0455 } else { 0456 qb.addValueCondition(key, Query::Equals, value); 0457 } 0458 if (!qb.exec()) { 0459 qCWarning(AKONADISERVER_LOG) << "Error during selection of records from table" << tableName() 0460 << "filtered by" << key << "=" << value 0461 << qb.query().lastError().text(); 0462 return {}; 0463 } 0464 return qb.result(); 0465 } 0466 0467 // data retrieval for referenced tables 0468 <xsl:for-each select="column[@refTable != '']"> 0469 <xsl:variable name="method-name"><xsl:call-template name="method-name-n1"><xsl:with-param name="table" select="@refTable"/></xsl:call-template></xsl:variable> 0470 0471 <xsl:value-of select="@refTable"/><xsl:text> </xsl:text><xsl:value-of select="$className"/>::<xsl:value-of select="$method-name"/>() const 0472 { 0473 return <xsl:value-of select="$method-name"/>(DataStore::self()); 0474 } 0475 0476 <xsl:value-of select="@refTable"/><xsl:text> </xsl:text><xsl:value-of select="$className"/>::<xsl:value-of select="$method-name"/>(DataStore *store) const 0477 { 0478 return <xsl:value-of select="@refTable"/>::retrieveById(store, <xsl:value-of select="@name"/>()); 0479 } 0480 0481 void <xsl:value-of select="$className"/>:: 0482 set<xsl:call-template name="uppercase-first"><xsl:with-param name="argument"><xsl:value-of select="$method-name"/></xsl:with-param></xsl:call-template> 0483 (const <xsl:value-of select="@refTable"/> &value) 0484 { 0485 d-><xsl:value-of select="@name"/> = value.id(); 0486 d-><xsl:value-of select="@name"/>_changed = true; 0487 } 0488 </xsl:for-each> 0489 0490 // data retrieval for inverse referenced tables 0491 <xsl:for-each select="reference"> 0492 QList<<xsl:value-of select="@table"/>> <xsl:value-of select="$className"/>::<xsl:value-of select="@name"/>() const 0493 { 0494 return <xsl:value-of select="@name"/>(DataStore::self()); 0495 } 0496 0497 QList<<xsl:value-of select="@table"/>> <xsl:value-of select="$className"/>::<xsl:value-of select="@name"/>(DataStore *store) const 0498 { 0499 return <xsl:value-of select="@table"/>::retrieveFiltered(store, <xsl:value-of select="@table"/>::<xsl:value-of select="@key"/>Column(), id()); 0500 } 0501 </xsl:for-each> 0502 0503 <!-- methods for n:m relations --> 0504 <xsl:for-each select="../relation[@table1 = $entityName]"> 0505 <xsl:variable name="relationName"><xsl:value-of select="@table1"/><xsl:value-of select="@table2"/>Relation</xsl:variable> 0506 <xsl:variable name="rightSideClass"><xsl:value-of select="@table2"/></xsl:variable> 0507 <xsl:variable name="rightSideEntity"><xsl:value-of select="@table2"/></xsl:variable> 0508 <xsl:variable name="methodName"><xsl:call-template name="method-name-n1"><xsl:with-param name="table" select="@table2"/></xsl:call-template>s</xsl:variable> 0509 0510 // data retrieval for n:m relations 0511 QList<<xsl:value-of select="$rightSideClass"/>> <xsl:value-of select="$className"/>::<xsl:value-of select="$methodName"/>() const 0512 { 0513 return <xsl:value-of select="$methodName"/>(DataStore::self()); 0514 } 0515 0516 QList<<xsl:value-of select="$rightSideClass"/>> <xsl:value-of select="$className"/>::<xsl:value-of select="$methodName"/>(DataStore *store) const 0517 { 0518 QSqlDatabase db = store->database(); 0519 if (!db.isOpen()) { 0520 return {}; 0521 } 0522 0523 QueryBuilder qb(store, <xsl:value-of select="$rightSideClass"/>::tableName(), QueryBuilder::Select); 0524 static const QStringList columns = { 0525 <xsl:for-each select="/database/table[@name = $rightSideEntity]/column"> 0526 <xsl:value-of select="$rightSideClass"/>::<xsl:value-of select="@name"/>FullColumnName() 0527 <xsl:if test="position() != last()">,</xsl:if> 0528 </xsl:for-each> 0529 }; 0530 qb.addColumns(columns); 0531 qb.addJoin(QueryBuilder::InnerJoin, <xsl:value-of select="$relationName"/>::tableName(), 0532 <xsl:value-of select="$relationName"/>::rightFullColumnName(), 0533 <xsl:value-of select="$rightSideClass"/>::<xsl:value-of select="@column2"/>FullColumnName()); 0534 qb.addValueCondition(<xsl:value-of select="$relationName"/>::leftFullColumnName(), Query::Equals, id()); 0535 0536 if (!qb.exec()) { 0537 qCWarning(AKONADISERVER_LOG) << "Error during selection of records from table <xsl:value-of select="@table1"/><xsl:value-of select="@table2"/>Relation" 0538 << qb.query().lastError().text(); 0539 return {}; 0540 } 0541 0542 return <xsl:value-of select="$rightSideClass"/>::extractResult(store, qb.query()); 0543 } 0544 0545 // manipulate n:m relations 0546 bool <xsl:value-of select="$className"/>::relatesTo<xsl:value-of select="@table2"/>(const <xsl:value-of select="$rightSideClass"/> &value) const 0547 { 0548 return relatesTo<xsl:value-of select="@table2"/>(DataStore::self(), value); 0549 } 0550 0551 bool <xsl:value-of select="$className"/>::relatesTo<xsl:value-of select="@table2"/>(DataStore *store, const <xsl:value-of select="$rightSideClass"/> &value) const 0552 { 0553 return Entity::relatesTo<<xsl:value-of select="$relationName"/>>(store, id(), value.id()); 0554 } 0555 0556 bool <xsl:value-of select="$className"/>::relatesTo<xsl:value-of select="@table2"/>(qint64 leftId, qint64 rightId) 0557 { 0558 return relatesTo<xsl:value-of select="@table2"/>(DataStore::self(), leftId, rightId); 0559 } 0560 0561 bool <xsl:value-of select="$className"/>::relatesTo<xsl:value-of select="@table2"/>(DataStore *store, qint64 leftId, qint64 rightId) 0562 { 0563 return Entity::relatesTo<<xsl:value-of select="$relationName"/>>(store, leftId, rightId); 0564 } 0565 0566 bool <xsl:value-of select="$className"/>::add<xsl:value-of select="@table2"/>(const <xsl:value-of select="$rightSideClass"/> &value) const 0567 { 0568 return add<xsl:value-of select="@table2"/>(DataStore::self(), value); 0569 } 0570 0571 bool <xsl:value-of select="$className"/>::add<xsl:value-of select="@table2"/>(DataStore *store, const <xsl:value-of select="$rightSideClass"/> &value) const 0572 { 0573 return Entity::addToRelation<<xsl:value-of select="$relationName"/>>(store, id(), value.id()); 0574 } 0575 0576 bool <xsl:value-of select="$className"/>::add<xsl:value-of select="@table2"/>(qint64 leftId, qint64 rightId) 0577 { 0578 return add<xsl:value-of select="@table2"/>(DataStore::self(), leftId, rightId); 0579 } 0580 0581 bool <xsl:value-of select="$className"/>::add<xsl:value-of select="@table2"/>(DataStore *store, qint64 leftId, qint64 rightId) 0582 { 0583 return Entity::addToRelation<<xsl:value-of select="$relationName"/>>(store, leftId, rightId); 0584 } 0585 0586 bool <xsl:value-of select="$className"/>::remove<xsl:value-of select="@table2"/>(const <xsl:value-of select="$rightSideClass"/> &value) const 0587 { 0588 return remove<xsl:value-of select="@table2"/>(DataStore::self(), value); 0589 } 0590 0591 bool <xsl:value-of select="$className"/>::remove<xsl:value-of select="@table2"/>(DataStore *store, const <xsl:value-of select="$rightSideClass"/> &value) const 0592 { 0593 return Entity::removeFromRelation<<xsl:value-of select="$relationName"/>>(store, id(), value.id()); 0594 } 0595 0596 bool <xsl:value-of select="$className"/>::remove<xsl:value-of select="@table2"/>(qint64 leftId, qint64 rightId) 0597 { 0598 return remove<xsl:value-of select="@table2"/>(DataStore::self(), leftId, rightId); 0599 } 0600 0601 bool <xsl:value-of select="$className"/>::remove<xsl:value-of select="@table2"/>(DataStore *store, qint64 leftId, qint64 rightId) 0602 { 0603 return Entity::removeFromRelation<<xsl:value-of select="$relationName"/>>(store, leftId, rightId); 0604 } 0605 0606 bool <xsl:value-of select="$className"/>::clear<xsl:value-of select="@table2"/>s() const 0607 { 0608 return clear<xsl:value-of select="@table2"/>s(DataStore::self()); 0609 } 0610 0611 bool <xsl:value-of select="$className"/>::clear<xsl:value-of select="@table2"/>s(DataStore *store) const 0612 { 0613 return Entity::clearRelation<<xsl:value-of select="$relationName"/>>(store, id()); 0614 } 0615 0616 bool <xsl:value-of select="$className"/>::clear<xsl:value-of select="@table2"/>s(qint64 id) 0617 { 0618 return clear<xsl:value-of select="@table2"/>s(DataStore::self(), id); 0619 } 0620 0621 bool <xsl:value-of select="$className"/>::clear<xsl:value-of select="@table2"/>s(DataStore *store, qint64 id) 0622 { 0623 return Entity::clearRelation<<xsl:value-of select="$relationName"/>>(store, id); 0624 } 0625 0626 </xsl:for-each> 0627 0628 #ifndef QT_NO_DEBUG_STREAM 0629 // debug stream operator 0630 QDebug &operator<<(QDebug &d, const <xsl:value-of select="$className"/> &entity) 0631 { 0632 d << "[<xsl:value-of select="$className"/>: " 0633 <xsl:for-each select="column"> 0634 << "<xsl:value-of select="@name"/> = " << 0635 <xsl:choose> 0636 <xsl:when test="starts-with(@type, 'enum')"> 0637 static_cast<int>(entity.<xsl:value-of select="@name"/>()) 0638 </xsl:when> 0639 <xsl:otherwise> 0640 entity.<xsl:value-of select="@name"/>() 0641 </xsl:otherwise> 0642 </xsl:choose> 0643 <xsl:if test="position() != last()"><< ", "</xsl:if> 0644 </xsl:for-each> 0645 << "]"; 0646 return d; 0647 } 0648 #endif 0649 0650 // inserting new data 0651 bool <xsl:value-of select="$className"/>::insert(qint64* insertId) 0652 { 0653 return insert(DataStore::self(), insertId); 0654 } 0655 0656 bool <xsl:value-of select="$className"/>::insert(DataStore *store, qint64* insertId) 0657 { 0658 QSqlDatabase db = store->database(); 0659 if (!db.isOpen()) { 0660 return false; 0661 } 0662 0663 QueryBuilder qb(store, tableName(), QueryBuilder::Insert); 0664 <xsl:if test="@identificationColumn"> 0665 qb.setIdentificationColumn(QLatin1StringView("<xsl:value-of select="@identificationColumn"/>")); 0666 </xsl:if> 0667 <xsl:for-each select="column[@name != 'id']"> 0668 <xsl:variable name="refColumn"><xsl:value-of select="@refColumn"/></xsl:variable> 0669 <xsl:if test="$refColumn = 'id'"> 0670 if (d-><xsl:value-of select="@name"/>_changed && d-><xsl:value-of select="@name"/> > 0) { 0671 qb.setColumnValue( <xsl:value-of select="@name"/>Column(), this-><xsl:value-of select="@name"/>() ); 0672 } 0673 </xsl:if> 0674 <xsl:if test="$refColumn != 'id'"> 0675 if (d-><xsl:value-of select="@name"/>_changed) { 0676 <xsl:choose> 0677 <xsl:when test="starts-with(@type, 'enum')"> 0678 qb.setColumnValue(<xsl:value-of select="@name"/>Column(), static_cast<int>(this-><xsl:value-of select="@name"/>())); 0679 </xsl:when> 0680 <xsl:otherwise> 0681 qb.setColumnValue(<xsl:value-of select="@name"/>Column(), this-><xsl:value-of select="@name"/>()); 0682 </xsl:otherwise> 0683 </xsl:choose> 0684 } 0685 </xsl:if> 0686 </xsl:for-each> 0687 0688 if (!qb.exec()) { 0689 qCWarning(AKONADISERVER_LOG) << "Error during insertion into table" << tableName() 0690 << qb.query().lastError().text(); 0691 return false; 0692 } 0693 0694 setId(qb.insertId()); 0695 if (insertId) { 0696 *insertId = id(); 0697 } 0698 return true; 0699 } 0700 0701 bool <xsl:value-of select="$className"/>::hasPendingChanges() const 0702 { 0703 return false // NOLINT(readability-simplify-boolean-expr) 0704 <xsl:for-each select="column[@name != 'id']"> 0705 || d-><xsl:value-of select="@name"/>_changed 0706 </xsl:for-each>; 0707 } 0708 0709 // update existing data 0710 bool <xsl:value-of select="$className"/>::update() 0711 { 0712 return update(DataStore::self()); 0713 } 0714 0715 bool <xsl:value-of select="$className"/>::update(DataStore *store) 0716 { 0717 invalidateCache(); 0718 QSqlDatabase db = store->database(); 0719 if (!db.isOpen()) { 0720 return false; 0721 } 0722 0723 QueryBuilder qb(store, tableName(), QueryBuilder::Update); 0724 0725 <xsl:for-each select="column[@name != 'id']"> 0726 <xsl:variable name="refColumn"><xsl:value-of select="@refColumn"/></xsl:variable> 0727 if (d-><xsl:value-of select="@name"/>_changed) { 0728 <xsl:if test="$refColumn = 'id'"> 0729 if (d-><xsl:value-of select="@name"/> <= 0) { 0730 qb.setColumnValue(<xsl:value-of select="@name"/>Column(), QVariant()); 0731 } else { 0732 </xsl:if> 0733 <xsl:choose> 0734 <xsl:when test="starts-with(@type, 'enum')"> 0735 qb.setColumnValue(<xsl:value-of select="@name"/>Column(), static_cast<int>(this-><xsl:value-of select="@name"/>())); 0736 </xsl:when> 0737 <xsl:otherwise> 0738 qb.setColumnValue(<xsl:value-of select="@name"/>Column(), this-><xsl:value-of select="@name"/>()); 0739 </xsl:otherwise> 0740 </xsl:choose> 0741 <xsl:if test="$refColumn = 'id'"> 0742 } 0743 </xsl:if> 0744 } 0745 </xsl:for-each> 0746 0747 <xsl:if test="column[@name = 'id']"> 0748 qb.addValueCondition(idColumn(), Query::Equals, id()); 0749 </xsl:if> 0750 0751 if (!qb.exec()) { 0752 qCWarning(AKONADISERVER_LOG) << "Error during updating record with id" << id() 0753 << " in table" << tableName() << qb.query().lastError().text(); 0754 return false; 0755 } 0756 return true; 0757 } 0758 0759 // delete records 0760 bool <xsl:value-of select="$className"/>::remove(const QString &column, const QVariant &value) 0761 { 0762 return remove(DataStore::self(), column, value); 0763 } 0764 0765 bool <xsl:value-of select="$className"/>::remove(DataStore *store, const QString &column, const QVariant &value) 0766 { 0767 invalidateCompleteCache(); 0768 return Entity::remove<<xsl:value-of select="$className"/>>(store, column, value); 0769 } 0770 0771 <xsl:if test="column[@name = 'id']"> 0772 bool <xsl:value-of select="$className"/>::remove() 0773 { 0774 return remove(DataStore::self()); 0775 } 0776 0777 bool <xsl:value-of select="$className"/>::remove(DataStore *store) 0778 { 0779 invalidateCache(); 0780 return Entity::remove<<xsl:value-of select="$className"/>>(store, idColumn(), id()); 0781 } 0782 0783 bool <xsl:value-of select="$className"/>::remove(qint64 id) 0784 { 0785 return remove(DataStore::self(), id); 0786 } 0787 0788 bool <xsl:value-of select="$className"/>::remove(DataStore *store, qint64 id) 0789 { 0790 return remove(store, idColumn(), id); 0791 } 0792 </xsl:if> 0793 0794 // cache stuff 0795 void <xsl:value-of select="$className"/>::invalidateCache() const 0796 { 0797 if (Private::cacheEnabled) { 0798 QMutexLocker lock(&Private::cacheMutex); 0799 <xsl:if test="column[@name = 'id']"> 0800 Private::idCache.remove(id()); 0801 </xsl:if> 0802 <xsl:if test="column[@name = 'name']"> 0803 <xsl:choose> 0804 <xsl:when test="$className = 'PartType'"> 0805 <!-- Special handling for PartType, which is identified as "NS:NAME" --> 0806 Private::nameCache.remove(ns() + QLatin1Char(':') + name()); 0807 </xsl:when> 0808 <xsl:otherwise> 0809 Private::nameCache.remove(name()); 0810 </xsl:otherwise> 0811 </xsl:choose> 0812 </xsl:if> 0813 } 0814 } 0815 0816 void <xsl:value-of select="$className"/>::invalidateCompleteCache() 0817 { 0818 if (Private::cacheEnabled) { 0819 QMutexLocker lock(&Private::cacheMutex); 0820 <xsl:if test="column[@name = 'id']"> 0821 Private::idCache.clear(); 0822 </xsl:if> 0823 <xsl:if test="column[@name = 'name']"> 0824 Private::nameCache.clear(); 0825 </xsl:if> 0826 } 0827 } 0828 0829 void <xsl:value-of select="$className"/>::enableCache(bool enable) 0830 { 0831 Private::cacheEnabled = enable; 0832 } 0833 0834 </xsl:template> 0835 0836 0837 <!-- relation class source template --> 0838 <xsl:template name="relation-source"> 0839 <xsl:variable name="className"><xsl:value-of select="@table1"/><xsl:value-of select="@table2"/>Relation</xsl:variable> 0840 <xsl:variable name="tableName"><xsl:value-of select="@table1"/><xsl:value-of select="@table2"/>Relation</xsl:variable> 0841 0842 // SQL table information 0843 QString <xsl:value-of select="$className"/>::tableName() 0844 { 0845 static const QString table = QStringLiteral("<xsl:value-of select="$tableName"/>" ); 0846 return table; 0847 } 0848 0849 QString <xsl:value-of select="$className"/>::leftColumn() 0850 { 0851 static const QString column = QStringLiteral("<xsl:value-of select="@table1"/>_<xsl:value-of select="@column1"/>"); 0852 return column; 0853 } 0854 0855 QString <xsl:value-of select="$className"/>::leftFullColumnName() 0856 { 0857 static const QString column = QStringLiteral("<xsl:value-of select="$tableName"/>.<xsl:value-of select="@table1"/>_<xsl:value-of select="@column1"/>"); 0858 return column; 0859 } 0860 0861 QString <xsl:value-of select="$className"/>::rightColumn() 0862 { 0863 static const QString column = QStringLiteral("<xsl:value-of select="@table2"/>_<xsl:value-of select="@column2"/>"); 0864 return column; 0865 } 0866 0867 QString <xsl:value-of select="$className"/>::rightFullColumnName() 0868 { 0869 static const QString column = QStringLiteral("<xsl:value-of select="$tableName"/>.<xsl:value-of select="@table2"/>_<xsl:value-of select="@column2"/>"); 0870 return column; 0871 } 0872 </xsl:template> 0873 0874 </xsl:stylesheet>