Changeset View
Changeset View
Standalone View
Standalone View
src/KDbDriver.cpp
1 | /* This file is part of the KDE project | 1 | /* This file is part of the KDE project | ||
---|---|---|---|---|---|
2 | Copyright (C) 2003-2017 Jarosław Staniek <staniek@kde.org> | 2 | Copyright (C) 2003-2018 Jarosław Staniek <staniek@kde.org> | ||
3 | 3 | | |||
4 | This program is free software; you can redistribute it and/or | 4 | This program is free software; you can redistribute it and/or | ||
5 | modify it under the terms of the GNU Library General Public | 5 | modify it under the terms of the GNU Library General Public | ||
6 | License as published by the Free Software Foundation; either | 6 | License as published by the Free Software Foundation; either | ||
7 | version 2 of the License, or (at your option) any later version. | 7 | version 2 of the License, or (at your option) any later version. | ||
8 | 8 | | |||
9 | This program is distributed in the hope that it will be useful, | 9 | This program is distributed in the hope that it will be useful, | ||
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
▲ Show 20 Lines • Show All 169 Lines • ▼ Show 20 Line(s) | 179 | { | |||
180 | if (!d->driverBehavior.ROW_ID_FIELD_NAME.isEmpty() | 180 | if (!d->driverBehavior.ROW_ID_FIELD_NAME.isEmpty() | ||
181 | && 0 == name.compare(d->driverBehavior.ROW_ID_FIELD_NAME, Qt::CaseInsensitive)) | 181 | && 0 == name.compare(d->driverBehavior.ROW_ID_FIELD_NAME, Qt::CaseInsensitive)) | ||
182 | { | 182 | { | ||
183 | return true; | 183 | return true; | ||
184 | } | 184 | } | ||
185 | return drv_isSystemFieldName(name); | 185 | return drv_isSystemFieldName(name); | ||
186 | } | 186 | } | ||
187 | 187 | | |||
188 | static KDbEscapedString valueToSqlInternal(const KDbDriver *driver, KDbField::Type ftype, const QVariant& v) | 188 | KDbEscapedString valueToSqlInternal(const KDbDriver *driver, KDbField::Type ftype, const QVariant& v) | ||
189 | { | 189 | { | ||
190 | if (v.isNull() || ftype == KDbField::Null) { | 190 | if (v.isNull() || ftype == KDbField::Null) { | ||
191 | return KDbEscapedString("NULL"); | 191 | return KDbEscapedString("NULL"); | ||
192 | } | 192 | } | ||
193 | switch (ftype) { | 193 | switch (ftype) { | ||
194 | case KDbField::Text: | 194 | case KDbField::Text: | ||
195 | case KDbField::LongText: { | 195 | case KDbField::LongText: { | ||
196 | return driver ? driver->escapeString(v.toString()) | 196 | return driver ? driver->escapeString(v.toString()) | ||
Show All 15 Lines | |||||
212 | } | 212 | } | ||
213 | //! @todo here special encoding method needed | 213 | //! @todo here special encoding method needed | ||
214 | case KDbField::Boolean: | 214 | case KDbField::Boolean: | ||
215 | return driver | 215 | return driver | ||
216 | ? KDbEscapedString(v.toInt() == 0 ? KDbDriverPrivate::behavior(driver)->BOOLEAN_FALSE_LITERAL | 216 | ? KDbEscapedString(v.toInt() == 0 ? KDbDriverPrivate::behavior(driver)->BOOLEAN_FALSE_LITERAL | ||
217 | : KDbDriverPrivate::behavior(driver)->BOOLEAN_TRUE_LITERAL) | 217 | : KDbDriverPrivate::behavior(driver)->BOOLEAN_TRUE_LITERAL) | ||
218 | : KDbEscapedString(v.toInt() == 0 ? "FALSE" : "TRUE"); | 218 | : KDbEscapedString(v.toInt() == 0 ? "FALSE" : "TRUE"); | ||
219 | case KDbField::Time: | 219 | case KDbField::Time: | ||
220 | return KDbEscapedString('\'') + v.toTime().toString(Qt::ISODate) + '\''; | 220 | return driver ? driver->timeToSql(v) : KDb::timeToSql(v); | ||
221 | case KDbField::Date: | 221 | case KDbField::Date: | ||
222 | return KDbEscapedString('\'') + v.toDate().toString(Qt::ISODate) + '\''; | 222 | return driver ? driver->dateToSql(v) : KDb::dateToSql(v); | ||
223 | case KDbField::DateTime: | 223 | case KDbField::DateTime: | ||
224 | return driver ? driver->dateTimeToSql(v.toDateTime()) | 224 | return driver ? driver->dateTimeToSql(v) : KDb::dateTimeToSql(v); | ||
225 | : KDb::dateTimeToSql(v.toDateTime()); | | |||
226 | case KDbField::BLOB: { | 225 | case KDbField::BLOB: { | ||
227 | if (v.toByteArray().isEmpty()) { | 226 | if (v.toByteArray().isEmpty()) { | ||
228 | return KDbEscapedString("NULL"); | 227 | return KDbEscapedString("NULL"); | ||
229 | } | 228 | } | ||
230 | if (v.type() == QVariant::String) { | 229 | if (v.type() == QVariant::String) { | ||
231 | return driver ? driver->escapeBLOB(v.toString().toUtf8()) | 230 | return driver ? driver->escapeBLOB(v.toString().toUtf8()) | ||
232 | : KDbEscapedString(KDb::escapeBLOB(v.toString().toUtf8(), KDb::BLOBEscapingType::ZeroXHex)); | 231 | : KDbEscapedString(KDb::escapeBLOB(v.toString().toUtf8(), KDb::BLOBEscapingType::ZeroXHex)); | ||
233 | } | 232 | } | ||
234 | return driver ? driver->escapeBLOB(v.toByteArray()) | 233 | return driver ? driver->escapeBLOB(v.toByteArray()) | ||
235 | : KDbEscapedString(KDb::escapeBLOB(v.toByteArray(), KDb::BLOBEscapingType::ZeroXHex)); | 234 | : KDbEscapedString(KDb::escapeBLOB(v.toByteArray(), KDb::BLOBEscapingType::ZeroXHex)); | ||
236 | } | 235 | } | ||
237 | case KDbField::InvalidType: | 236 | case KDbField::InvalidType: | ||
238 | return KDbEscapedString("!INVALIDTYPE!"); | 237 | return KDbEscapedString("!INVALIDTYPE!"); | ||
239 | default: | 238 | default: | ||
240 | kdbDebug() << KDbEscapedString("UNKNOWN!"); | 239 | kdbDebug() << KDbEscapedString("UNKNOWN!"); | ||
241 | } | 240 | } | ||
242 | return KDbEscapedString(); | 241 | return KDbEscapedString(); | ||
243 | } | 242 | } | ||
244 | 243 | | |||
245 | KDbEscapedString KDbDriver::valueToSql(KDbField::Type ftype, const QVariant& v) const | 244 | KDbEscapedString KDbDriver::valueToSql(KDbField::Type ftype, const QVariant& v) const | ||
246 | { | 245 | { | ||
247 | //! note, it was compatible with SQLite: https://www.sqlite.org/cvstrac/wiki?p=DateAndTimeFunctions. | 246 | //! @note it was compatible with SQLite: https://www.sqlite.org/lang_datefunc.html | ||
248 | return valueToSqlInternal(this, ftype, v); | 247 | return valueToSqlInternal(this, ftype, v); | ||
249 | } | 248 | } | ||
250 | 249 | | |||
251 | KDbEscapedString KDb::valueToSql(KDbField::Type ftype, const QVariant& v) | 250 | KDbEscapedString KDbDriver::dateToSql(const QVariant &v) const | ||
252 | { | 251 | { | ||
253 | return valueToSqlInternal(nullptr, ftype, v); | 252 | return KDb::dateToIsoString(v); | ||
254 | } | 253 | } | ||
255 | 254 | | |||
256 | KDbEscapedString KDb::dateTimeToSql(const QDateTime& v) | 255 | KDbEscapedString KDbDriver::timeToSql(const QVariant& v) const | ||
257 | { | 256 | { | ||
258 | /*! (was compatible with SQLite: https://www.sqlite.org/cvstrac/wiki?p=DateAndTimeFunctions) | 257 | return KDb::timeToIsoString(v); | ||
259 | Now it's ISO 8601 DateTime format - with "T" delimiter: | 258 | } | ||
260 | https://www.w3.org/TR/NOTE-datetime | 259 | | ||
261 | (e.g. "1994-11-05T13:15:30" not "1994-11-05 13:15:30") | 260 | KDbEscapedString KDbDriver::dateTimeToSql(const QVariant& v) const | ||
262 | @todo add support for time zones? | 261 | { | ||
263 | */ | 262 | return KDb::dateTimeToIsoString(v); | ||
264 | return KDbEscapedString('\'') + v.toString(Qt::ISODate) + KDbEscapedString('\''); | | |||
265 | } | 263 | } | ||
266 | 264 | | |||
267 | KDbEscapedString KDbDriver::dateTimeToSql(const QDateTime& v) const | 265 | KDbEscapedString KDbDriver::dateTimeToSql(const QDateTime& v) const | ||
268 | { | 266 | { | ||
269 | return KDb::dateTimeToSql(v); | 267 | return dateTimeToSql(QVariant(v)); | ||
270 | } | 268 | } | ||
271 | 269 | | |||
272 | QString KDbDriver::escapeIdentifier(const QString& str) const | 270 | QString KDbDriver::escapeIdentifier(const QString& str) const | ||
273 | { | 271 | { | ||
274 | return QLatin1Char(d->driverBehavior.OPENING_QUOTATION_MARK_BEGIN_FOR_IDENTIFIER) | 272 | return QLatin1Char(d->driverBehavior.OPENING_QUOTATION_MARK_BEGIN_FOR_IDENTIFIER) | ||
275 | + drv_escapeIdentifier(str) | 273 | + drv_escapeIdentifier(str) | ||
276 | + QLatin1Char(d->driverBehavior.CLOSING_QUOTATION_MARK_BEGIN_FOR_IDENTIFIER); | 274 | + QLatin1Char(d->driverBehavior.CLOSING_QUOTATION_MARK_BEGIN_FOR_IDENTIFIER); | ||
277 | } | 275 | } | ||
▲ Show 20 Lines • Show All 145 Lines • Show Last 20 Lines |