Warning, /pim/akonadi/src/server/storage/entities.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 <xsl:output method="text" encoding="utf-8"/>
0010
0011 <xsl:include href="entities-header.xsl"/>
0012 <xsl:include href="entities-source.xsl"/>
0013
0014 <!-- select whether to generate header or implementation code. -->
0015 <xsl:param name="code">header</xsl:param>
0016
0017 <xsl:template match="/">
0018 /*
0019 * This is an auto-generated file.
0020 * Do not edit! All changes made to it will be lost.
0021 */
0022
0023 <!-- header generation -->
0024 <xsl:if test="$code='header'">
0025 #ifndef AKONADI_ENTITIES_H
0026 #define AKONADI_ENTITIES_H
0027 #include "storage/entity.h"
0028
0029 #include <private/tristate_p.h>
0030
0031 #include <QtCore/QDebug>
0032 #include <QtCore/QSharedDataPointer>
0033 #include <QtCore/QString>
0034 #include <QtCore/QVariant>
0035 #include <QtCore/QStringList>
0036 template <typename T> class QList;
0037
0038 class QSqlQuery;
0039
0040 namespace Akonadi {
0041 namespace Server {
0042
0043 // forward declaration for table classes
0044 <xsl:for-each select="database/table">
0045 class <xsl:value-of select="@name"/>;
0046 </xsl:for-each>
0047
0048 // forward declaration for relation classes
0049 <xsl:for-each select="database/relation">
0050 class <xsl:value-of select="@table1"/><xsl:value-of select="@table2"/>Relation;
0051 </xsl:for-each>
0052
0053 <xsl:for-each select="database/table">
0054 <xsl:call-template name="table-header"/>
0055 </xsl:for-each>
0056
0057 <xsl:for-each select="database/relation">
0058 <xsl:call-template name="relation-header"/>
0059 </xsl:for-each>
0060
0061 /** Returns a list of all table names. */
0062 QList<QString> allDatabaseTables();
0063
0064 } // namespace Server
0065 } // namespace Akonadi
0066
0067 <xsl:for-each select="database/table">
0068 <xsl:call-template name="table-debug-header"/>
0069 </xsl:for-each>
0070
0071 <xsl:for-each select="database/table">
0072 Q_DECLARE_TYPEINFO(Akonadi::Server::<xsl:value-of select="@name"/>, Q_RELOCATABLE_TYPE);
0073 </xsl:for-each>
0074 #endif
0075
0076 </xsl:if>
0077
0078 <!-- cpp generation -->
0079 <xsl:if test="$code='source'">
0080 #include <entities.h>
0081 #include <storage/datastore.h>
0082 #include <storage/selectquerybuilder.h>
0083 #include <utils.h>
0084 #include <akonadiserver_debug.h>
0085
0086 #include <QSqlDatabase>
0087 #include <QSqlQuery>
0088 #include <QSqlError>
0089 #include <QSqlDriver>
0090 #include <QVariant>
0091 #include <QHash>
0092 #include <QMutex>
0093 #include <QThread>
0094
0095 using namespace Akonadi;
0096 using namespace Akonadi::Server;
0097
0098 static QStringList removeEntry(QStringList list, const QString& entry)
0099 {
0100 list.removeOne(entry);
0101 return list;
0102 }
0103
0104 <xsl:for-each select="database/table">
0105 <xsl:call-template name="table-source"/>
0106 </xsl:for-each>
0107
0108 <xsl:for-each select="database/relation">
0109 <xsl:call-template name="relation-source"/>
0110 </xsl:for-each>
0111
0112 QList<QString> Akonadi::Server::allDatabaseTables()
0113 {
0114 static const QList<QString> allTables = {
0115 <xsl:for-each select="database/table">
0116 QStringLiteral("<xsl:value-of select="@name"/>Table"),
0117 </xsl:for-each>
0118 <xsl:for-each select="database/relation">
0119 QStringLiteral("<xsl:value-of select="@table1"/><xsl:value-of select="@table2"/>Relation")
0120 <xsl:if test="position() != last()">,</xsl:if>
0121 </xsl:for-each>
0122 };
0123
0124 return allTables;
0125 }
0126
0127 </xsl:if>
0128
0129 </xsl:template>
0130
0131
0132 <!-- Helper templates -->
0133
0134 <!-- uppercase first letter -->
0135 <xsl:template name="uppercase-first">
0136 <xsl:param name="argument"/>
0137 <xsl:value-of select="concat(translate(substring($argument,1,1),'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'), substring($argument,2))"/>
0138 </xsl:template>
0139
0140 <xsl:template name="data-type">
0141 <xsl:choose>
0142 <xsl:when test="@type = 'enum'"><xsl:value-of select="../@name"/>::<xsl:value-of select="@enumType"/></xsl:when>
0143 <xsl:otherwise><xsl:value-of select="@type"/></xsl:otherwise>
0144 </xsl:choose>
0145 </xsl:template>
0146
0147 <!-- generates function argument code for the current column -->
0148 <xsl:template name="argument">
0149 <xsl:if test="starts-with(@type,'Q')">const </xsl:if><xsl:call-template name="data-type"/><xsl:text> </xsl:text>
0150 <xsl:if test="starts-with(@type,'Q')">&</xsl:if><xsl:value-of select="@name"/>
0151 </xsl:template>
0152
0153 <!-- signature of setter method -->
0154 <xsl:template name="setter-signature">
0155 <xsl:variable name="methodName">
0156 <xsl:value-of select="concat(translate(substring(@name,1,1),'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'), substring(@name,2))"/>
0157 </xsl:variable>
0158 set<xsl:value-of select="$methodName"/>(<xsl:call-template name="argument"/>)
0159 </xsl:template>
0160
0161 <!-- field name list -->
0162 <xsl:template name="column-list">
0163 <xsl:for-each select="column">
0164 <xsl:value-of select="@name"/>
0165 <xsl:if test="position() != last()"><xsl:text>, </xsl:text></xsl:if>
0166 </xsl:for-each>
0167 </xsl:template>
0168
0169 <!-- data retrieval for a given key field -->
0170 <xsl:template name="data-retrieval">
0171 <xsl:param name="dataStore"/>
0172 <xsl:param name="key"/>
0173 <xsl:param name="key2"/>
0174 <xsl:param name="lookupKey" select="$key"/>
0175 <xsl:param name="cache"/>
0176 <xsl:variable name="className"><xsl:value-of select="@name"/></xsl:variable>
0177 <xsl:if test="$cache != ''">
0178 if (Private::cacheEnabled) {
0179 QMutexLocker lock(&Private::cacheMutex);
0180 auto it = Private::<xsl:value-of select="$cache"/>.constFind(<xsl:value-of select="$lookupKey"/>);
0181 if (it != Private::<xsl:value-of select="$cache"/>.constEnd()) {
0182 return it.value();
0183 }
0184 }
0185 </xsl:if>
0186 QSqlDatabase db = <xsl:value-of select="$dataStore"/>->database();
0187 if (!db.isOpen()) {
0188 return <xsl:value-of select="$className"/>();
0189 }
0190
0191 QueryBuilder qb(<xsl:value-of select="$dataStore"/>, tableName(), QueryBuilder::Select);
0192 static const QStringList columns = removeEntry(columnNames(), <xsl:value-of select="$key"/>Column());
0193 qb.addColumns(columns);
0194 qb.addValueCondition(<xsl:value-of select="$key"/>Column(), Query::Equals, <xsl:value-of select="$key"/>);
0195 <xsl:if test="$key2 != ''">
0196 qb.addValueCondition(<xsl:value-of select="$key2"/>Column(), Query::Equals, <xsl:value-of select="$key2"/>);
0197 </xsl:if>
0198 if (!qb.exec()) {
0199 qCWarning(AKONADISERVER_LOG) << "Error during selection of record with <xsl:value-of select="$key"/>"
0200 << <xsl:value-of select="$key"/> << "from table" << tableName()
0201 << qb.query().lastError().text();
0202 return <xsl:value-of select="$className"/>();
0203 }
0204 if (!qb.query().next()) {
0205 return <xsl:value-of select="$className"/>();
0206 }
0207
0208 <!-- this indirection is required to prevent off-by-one access now that we skip the key column -->
0209 int valueIndex = 0;
0210 <xsl:for-each select="column">
0211 const <xsl:call-template name="data-type"/> &value<xsl:value-of select="position()"/> =
0212 <xsl:choose>
0213 <xsl:when test="@name=$key">
0214 <xsl:value-of select="$key"/>;
0215 </xsl:when>
0216 <xsl:otherwise>
0217 (qb.query().isNull(valueIndex)) ?
0218 <xsl:call-template name="data-type"/>(<xsl:value-of select="@default"/>) :
0219 <xsl:choose>
0220 <xsl:when test="starts-with(@type,'QString')">
0221 Utils::variantToString(qb.query().value( valueIndex))
0222 </xsl:when>
0223 <xsl:when test="starts-with(@type, 'enum')">
0224 static_cast<<xsl:value-of select="@enumType"/>>(qb.query().value( valueIndex ).value<int>())
0225 </xsl:when>
0226 <xsl:when test="starts-with(@type, 'QDateTime')">
0227 Utils::variantToDateTime(qb.query().value(valueIndex))
0228 </xsl:when>
0229 <xsl:otherwise>
0230 qb.query().value( valueIndex ).value<<xsl:value-of select="@type"/>>()
0231 </xsl:otherwise>
0232 </xsl:choose>
0233 ; ++valueIndex;
0234 </xsl:otherwise>
0235 </xsl:choose>
0236 </xsl:for-each>
0237
0238 <xsl:value-of select="$className"/> rv(
0239 <xsl:for-each select="column">
0240 value<xsl:value-of select="position()"/>
0241 <xsl:if test="position() != last()">,</xsl:if>
0242 </xsl:for-each>
0243 );
0244 if (Private::cacheEnabled) {
0245 Private::addToCache(rv);
0246 }
0247 return rv;
0248 </xsl:template>
0249
0250 <!-- method name for n:1 referred records -->
0251 <xsl:template name="method-name-n1">
0252 <xsl:param name="table" />
0253 <xsl:choose>
0254 <xsl:when test="@methodName != ''">
0255 <xsl:value-of select="@methodName"/>
0256 </xsl:when>
0257 <xsl:otherwise>
0258 <xsl:value-of select="concat(translate(substring($table,1,1),'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), substring($table,2))"/>
0259 </xsl:otherwise>
0260 </xsl:choose>
0261 </xsl:template>
0262
0263 </xsl:stylesheet>
0264