File indexing completed on 2024-12-01 07:24:56

0001 /* This file is part of the KDE project
0002    Copyright (C) 2010 Jarosław Staniek <staniek@kde.org>
0003 
0004    This program is free software; you can redistribute it and/or
0005    modify it under the terms of the GNU Library General Public
0006    License as published by the Free Software Foundation; either
0007    version 2 of the License, or (at your option) any later version.
0008 
0009    This program is distributed in the hope that it will be useful,
0010    but WITHOUT ANY WARRANTY; without even the implied warranty of
0011    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
0012    Library General Public License for more details.
0013 
0014    You should have received a copy of the GNU Library General Public License
0015    along with this program; see the file COPYING.  If not, write to
0016    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
0017  * Boston, MA 02110-1301, USA.
0018 */
0019 
0020 #ifndef KDB_ESCAPEDSTRING_H
0021 #define KDB_ESCAPEDSTRING_H
0022 
0023 #include <QByteArray>
0024 #include <QString>
0025 #include <QList>
0026 
0027 #include "kdb_export.h"
0028 
0029 //! Specialized string for escaping.
0030 //! In addition to byte array, contains "validity" flag that is transferred
0031 //! when strings are concatenated or in general when any operation with invalid
0032 //! escaped string is performed.
0033 class KDB_EXPORT KDbEscapedString : protected QByteArray
0034 {
0035 public:
0036     inline KDbEscapedString() : m_valid(true) {}
0037 
0038     explicit inline KDbEscapedString(char ch)
0039         : QByteArray(1, ch), m_valid(true) {}
0040 
0041     explicit inline KDbEscapedString(QChar ch)
0042         : QByteArray(1, ch.toLatin1()), m_valid(true) {}
0043 
0044     explicit inline KDbEscapedString(const char* string)
0045         : QByteArray(string), m_valid(true) {}
0046 
0047     explicit inline KDbEscapedString(const QByteArray& string)
0048         : QByteArray(string), m_valid(true) {}
0049 
0050     explicit inline KDbEscapedString(const QString& string)
0051         : QByteArray(string.toUtf8()), m_valid(true) {}
0052 
0053     inline KDbEscapedString(const KDbEscapedString& string)
0054         : QByteArray(string), m_valid(string.isValid()) {}
0055 
0056     inline ~KDbEscapedString() {}
0057 
0058     //! @return invalid escaped string.
0059     static inline KDbEscapedString invalid() { return KDbEscapedString(false); }
0060 
0061     //! @return true if the string is valid. Valid string means that the escaping process
0062     //! has finished successfully. It does not mean that the statement itself parses
0063     //! or can be executed without errors.
0064     inline bool isValid() const { return m_valid; }
0065 
0066     inline QByteArray toByteArray() const { return static_cast<const QByteArray&>(*this); }
0067 
0068     inline QString toString() const {
0069         return QString::fromUtf8(static_cast<const QByteArray&>(*this).constData(), length());
0070     }
0071 
0072     inline KDbEscapedString &operator=(const KDbEscapedString& string) {
0073         QByteArray::operator=(string);
0074         m_valid = string.isValid();
0075         return *this;
0076     }
0077     inline KDbEscapedString &operator=(const QByteArray& string) {
0078         QByteArray::operator=(string);
0079         m_valid = true;
0080         return *this;
0081     }
0082     inline KDbEscapedString &operator=(const char *string) {
0083         QByteArray::operator=(string);
0084         m_valid = true;
0085         return *this;
0086     }
0087 
0088     inline bool operator==(const KDbEscapedString &other) const
0089     {
0090         return isValid() == other.isValid()
0091                && static_cast<const QByteArray&>(*this) == other.toByteArray();
0092     }
0093     inline int size() const { return QByteArray::size(); }
0094     inline bool isEmpty() const { return QByteArray::isEmpty(); }
0095     inline void resize(int size) { QByteArray::resize(size); }
0096 
0097     inline KDbEscapedString &fill(char c, int size = -1) {
0098         m_valid = true;
0099         QByteArray::fill(c, size);
0100         return *this;
0101     }
0102 
0103     inline int capacity() const { return QByteArray::isEmpty(); }
0104     inline void reserve(int size) { QByteArray::reserve(size); }
0105     inline void squeeze() { QByteArray::squeeze(); }
0106 
0107     inline char *data() { return QByteArray::data(); }
0108     inline const char *data() const { return QByteArray::data(); }
0109     inline const char *constData() const { return QByteArray::constData(); }
0110     inline void clear() { m_valid = true; QByteArray::clear(); }
0111 
0112 #ifdef Q_COMPILER_MANGLES_RETURN_TYPE
0113     inline const char at(int i) const { return QByteArray::at(i); }
0114     inline const char operator[](int i) const { return QByteArray::operator[](i); }
0115     inline const char operator[](uint i) const { return QByteArray::operator[](i); }
0116 #else
0117     inline char at(int i) const { return QByteArray::at(i); }
0118     inline char operator[](int i) const { return QByteArray::operator[](i); }
0119     inline char operator[](uint i) const { return QByteArray::operator[](i); }
0120 #endif
0121     inline QByteRef operator[](int i) { return QByteArray::operator[](i); }
0122     inline QByteRef operator[](uint i) { return QByteArray::operator[](i); }
0123 
0124     inline int indexOf(char c, int from = 0) const { return QByteArray::indexOf(c, from); }
0125     inline int indexOf(const char *c, int from = 0) const { return QByteArray::indexOf(c, from); }
0126     inline int indexOf(const QByteArray &a, int from = 0) const { return QByteArray::indexOf(a, from); }
0127     inline int indexOf(const KDbEscapedString &s, int from = 0) const {
0128         return s.isValid() ? QByteArray::indexOf(s, from) : -1;
0129     }
0130     inline int lastIndexOf(char c, int from = -1) const { return QByteArray::lastIndexOf(c, from); }
0131     inline int lastIndexOf(const char *c, int from = -1) const { return QByteArray::lastIndexOf(c, from); }
0132     inline int lastIndexOf(const QByteArray &a, int from = -1) const { return QByteArray::lastIndexOf(a, from); }
0133     inline int lastIndexOf(const KDbEscapedString &s, int from = 0) const {
0134         return s.isValid() ? QByteArray::lastIndexOf(s, from) : -1;
0135     }
0136 
0137     inline int count(char c) const { return QByteArray::count(c); }
0138     inline int count(const char *a) const { return QByteArray::count(a); }
0139     inline int count(const QByteArray &a) const { return QByteArray::count(a); }
0140     inline int count(const KDbEscapedString &s) const {
0141         return s.isValid() ? QByteArray::count(s) : -1;
0142     }
0143 
0144     inline KDbEscapedString left(int len) const {
0145         return m_valid ? KDbEscapedString(QByteArray::left(len)) : KDbEscapedString::invalid();
0146     }
0147     inline KDbEscapedString right(int len) const {
0148         return m_valid ? KDbEscapedString(QByteArray::right(len)) : KDbEscapedString::invalid();
0149     }
0150     inline KDbEscapedString mid(int index, int len = -1) const {
0151         return m_valid ? KDbEscapedString(QByteArray::mid(index, len)) : KDbEscapedString::invalid();
0152     }
0153 
0154     inline bool startsWith(const KDbEscapedString &s) const {
0155         return (m_valid && s.isValid()) ? QByteArray::startsWith(s) : false;
0156     }
0157     inline bool startsWith(const QByteArray &a) const {
0158         return m_valid ? QByteArray::startsWith(a) : false;
0159     }
0160     inline bool startsWith(char c) const {
0161         return m_valid ? QByteArray::startsWith(c) : false;
0162     }
0163     inline bool startsWith(const char *c) const {
0164         return m_valid ? QByteArray::startsWith(c) : false;
0165     }
0166 
0167     inline bool endsWith(const KDbEscapedString &s) const {
0168         return (m_valid && s.isValid()) ? QByteArray::endsWith(s) : false;
0169     }
0170     inline bool endsWith(const QByteArray &a) const {
0171         return m_valid ? QByteArray::endsWith(a) : false;
0172     }
0173     inline bool endsWith(char c) const {
0174         return m_valid ? QByteArray::endsWith(c) : false;
0175     }
0176     inline bool endsWith(const char *c) const {
0177         return m_valid ? QByteArray::endsWith(c) : false;
0178     }
0179 
0180     inline void truncate(int pos) { QByteArray::truncate(pos); }
0181     inline void chop(int n) { QByteArray::chop(n); }
0182 
0183     inline KDbEscapedString toLower() const {
0184         return m_valid ? KDbEscapedString(QByteArray::toLower()) : KDbEscapedString::invalid();
0185     }
0186     inline KDbEscapedString toUpper() const {
0187         return m_valid ? KDbEscapedString(QByteArray::toUpper()) : KDbEscapedString::invalid();
0188     }
0189 
0190     inline KDbEscapedString trimmed() const {
0191         return m_valid ? KDbEscapedString(QByteArray::trimmed()) : KDbEscapedString::invalid();
0192     }
0193     inline KDbEscapedString simplified() const {
0194         return m_valid ? KDbEscapedString(QByteArray::simplified()) : KDbEscapedString::invalid();
0195     }
0196     inline KDbEscapedString leftJustified(int width, char fill = ' ', bool truncate = false) const
0197     {
0198         return m_valid ? KDbEscapedString(QByteArray::leftJustified(width, fill, truncate)) : KDbEscapedString::invalid();
0199     }
0200     inline KDbEscapedString rightJustified(int width, char fill = ' ', bool truncate = false) const
0201     {
0202         return m_valid ? KDbEscapedString(QByteArray::rightJustified(width, fill, truncate)) : KDbEscapedString::invalid();
0203     }
0204 
0205     inline KDbEscapedString &prepend(char c) {
0206         if (m_valid)
0207             QByteArray::prepend(c);
0208         return *this;
0209     }
0210     inline KDbEscapedString &prepend(const char *s) {
0211         if (m_valid)
0212             QByteArray::prepend(s);
0213         return *this;
0214     }
0215     inline KDbEscapedString &prepend(const QByteArray &a) {
0216         if (m_valid)
0217             QByteArray::prepend(a);
0218         return *this;
0219     }
0220     KDbEscapedString &prepend(const KDbEscapedString &s);
0221     inline KDbEscapedString &append(char c) {
0222         if (m_valid)
0223             QByteArray::append(c);
0224         return *this;
0225     }
0226     inline KDbEscapedString &append(const char *s) {
0227         if (m_valid)
0228             QByteArray::append(s);
0229         return *this;
0230     }
0231     inline KDbEscapedString &append(const char *s, int len) {
0232         if (m_valid)
0233             QByteArray::append(s, len);
0234         return *this;
0235     }
0236     inline KDbEscapedString &append(const QByteArray &a) {
0237         if (m_valid)
0238             QByteArray::append(a);
0239         return *this;
0240     }
0241     inline KDbEscapedString &append(const QString &a) {
0242         if (m_valid)
0243             QByteArray::append(a.toUtf8());
0244         return *this;
0245     }
0246     KDbEscapedString &append(const KDbEscapedString &s);
0247     inline KDbEscapedString &insert(int i, char c) {
0248         if (m_valid)
0249             QByteArray::insert(i, c);
0250         return *this;
0251     }
0252     inline KDbEscapedString &insert(int i, const char *s) {
0253         if (m_valid)
0254             QByteArray::insert(i, s);
0255         return *this;
0256     }
0257     inline KDbEscapedString &insert(int i, const QByteArray &a) {
0258         if (m_valid)
0259             QByteArray::insert(i, a);
0260         return *this;
0261     }
0262     KDbEscapedString &insert(int i, const KDbEscapedString &s);
0263     inline KDbEscapedString &remove(int index, int len) {
0264         if (m_valid)
0265             QByteArray::remove(index, len);
0266         return *this;
0267     }
0268     inline KDbEscapedString &replace(int index, int len, const char *s) {
0269         if (m_valid)
0270             QByteArray::replace(index, len, s);
0271         return *this;
0272     }
0273     inline KDbEscapedString &replace(int index, int len, const QByteArray &s) {
0274         if (m_valid)
0275             QByteArray::replace(index, len, s);
0276         return *this;
0277     }
0278     KDbEscapedString &replace(int index, int len, const KDbEscapedString &s);
0279     inline KDbEscapedString &replace(char before, const char *after) {
0280         if (m_valid)
0281             QByteArray::replace(before, after);
0282         return *this;
0283     }
0284     inline KDbEscapedString &replace(char before, const QByteArray &after) {
0285         if (m_valid)
0286             QByteArray::replace(before, after);
0287         return *this;
0288     }
0289     KDbEscapedString &replace(char before, const KDbEscapedString &after);
0290     inline KDbEscapedString &replace(const char *before, const char *after) {
0291         if (m_valid)
0292             QByteArray::replace(before, after);
0293         return *this;
0294     }
0295     inline KDbEscapedString &replace(const char *before, int bsize, const char *after, int asize) {
0296         if (m_valid)
0297             QByteArray::replace(before, bsize, after, asize);
0298         return *this;
0299     }
0300     inline KDbEscapedString &replace(const QByteArray &before, const QByteArray &after) {
0301         if (m_valid)
0302             QByteArray::replace(before, after);
0303         return *this;
0304     }
0305     KDbEscapedString &replace(const KDbEscapedString &before, const QByteArray &after);
0306     KDbEscapedString &replace(const QByteArray &before, const KDbEscapedString &after);
0307     KDbEscapedString &replace(const KDbEscapedString &before, const KDbEscapedString &after);
0308     inline KDbEscapedString &replace(const QByteArray &before, const char *after) {
0309         if (m_valid)
0310             QByteArray::replace(before, after);
0311         return *this;
0312     }
0313     inline KDbEscapedString &replace(const char *before, const QByteArray &after) {
0314         if (m_valid)
0315             QByteArray::replace(before, after);
0316         return *this;
0317     }
0318     inline KDbEscapedString &replace(char before, char after) {
0319         if (m_valid)
0320             QByteArray::replace(before, after);
0321         return *this;
0322     }
0323     inline KDbEscapedString &operator+=(char c) { return append(c); }
0324     inline KDbEscapedString &operator+=(const char *s) { return append(s); }
0325     inline KDbEscapedString &operator+=(const QByteArray &a) { return append(a); }
0326     inline KDbEscapedString &operator+=(const QString &a) { return append(a); }
0327     inline KDbEscapedString &operator+=(const KDbEscapedString &s) { return append(s); }
0328 
0329     //KDbEscapedString operator+(const QVector<T> & other ) const
0330 
0331     QList<KDbEscapedString> split(char sep) const;
0332 
0333     inline KDbEscapedString repeated(int times) const {
0334         return m_valid ? KDbEscapedString(QByteArray::repeated(times)) : KDbEscapedString::invalid();
0335     }
0336     short toShort(bool *ok = nullptr, int base = 10) const;
0337     ushort toUShort(bool *ok = nullptr, int base = 10) const;
0338     int toInt(bool *ok = nullptr, int base = 10) const;
0339     uint toUInt(bool *ok = nullptr, int base = 10) const;
0340     long toLong(bool *ok = nullptr, int base = 10) const;
0341     ulong toULong(bool *ok = nullptr, int base = 10) const;
0342     qlonglong toLongLong(bool *ok = nullptr, int base = 10) const;
0343     qulonglong toULongLong(bool *ok = nullptr, int base = 10) const;
0344     float toFloat(bool *ok = nullptr) const;
0345     double toDouble(bool *ok = nullptr) const;
0346     inline KDbEscapedString toBase64() const {
0347         return m_valid ? KDbEscapedString(QByteArray::toBase64()) : KDbEscapedString::invalid();
0348     }
0349     inline KDbEscapedString toHex() const {
0350         return m_valid ? KDbEscapedString(QByteArray::toHex()) : KDbEscapedString::invalid();
0351     }
0352     inline KDbEscapedString toPercentEncoding(const QByteArray &exclude = QByteArray(),
0353                                  const QByteArray &include = QByteArray(),
0354                                  char percent = '%') const
0355     {
0356         Q_UNUSED(percent);
0357         return m_valid ? KDbEscapedString(QByteArray::toPercentEncoding(exclude, include))
0358                        : KDbEscapedString::invalid();
0359     }
0360 
0361     inline KDbEscapedString &setNum(short val, int base = 10) {
0362         m_valid = true;
0363         QByteArray::setNum(val, base);
0364         return *this;
0365     }
0366     inline KDbEscapedString &setNum(ushort val, int base = 10) {
0367         m_valid = true;
0368         QByteArray::setNum(val, base);
0369         return *this;
0370     }
0371     inline KDbEscapedString &setNum(int val, int base = 10) {
0372         m_valid = true;
0373         QByteArray::setNum(val, base);
0374         return *this;
0375     }
0376     inline KDbEscapedString &setNum(uint val, int base = 10) {
0377         m_valid = true;
0378         QByteArray::setNum(val, base);
0379         return *this;
0380     }
0381     inline KDbEscapedString &setNum(qlonglong val, int base = 10) {
0382         m_valid = true;
0383         QByteArray::setNum(val, base);
0384         return *this;
0385     }
0386     inline KDbEscapedString &setNum(qulonglong val, int base = 10) {
0387         m_valid = true;
0388         QByteArray::setNum(val, base);
0389         return *this;
0390     }
0391     inline KDbEscapedString &setNum(float val, char f = 'g', int prec = 6) {
0392         m_valid = true;
0393         QByteArray::setNum(val, f, prec);
0394         return *this;
0395     }
0396     inline KDbEscapedString &setNum(double val, char f = 'g', int prec = 6) {
0397         m_valid = true;
0398         QByteArray::setNum(val, f, prec);
0399         return *this;
0400     }
0401 
0402     static inline KDbEscapedString number(int val, int base = 10) {
0403         return KDbEscapedString(QByteArray::number(val, base));
0404     }
0405     static inline KDbEscapedString number(uint val, int base = 10) {
0406         return KDbEscapedString(QByteArray::number(val, base));
0407     }
0408     static inline KDbEscapedString number(qlonglong val, int base = 10) {
0409         return KDbEscapedString(QByteArray::number(val, base));
0410     }
0411     static inline KDbEscapedString number(qulonglong val, int base = 10) {
0412         return KDbEscapedString(QByteArray::number(val, base));
0413     }
0414     static inline KDbEscapedString number(double val, char f = 'g', int prec = 6) {
0415         return KDbEscapedString(QByteArray::number(val, f, prec));
0416     }
0417     static inline KDbEscapedString fromRawData(const char *s, int size) {
0418         return KDbEscapedString(QByteArray::fromRawData(s, size));
0419     }
0420     static inline KDbEscapedString fromBase64(const QByteArray &base64) {
0421         return KDbEscapedString(QByteArray::fromBase64(base64));
0422     }
0423     static inline KDbEscapedString fromBase64(const KDbEscapedString &base64) {
0424         return base64.isValid() ? KDbEscapedString(QByteArray::fromBase64(base64)) : KDbEscapedString::invalid();
0425     }
0426     static inline KDbEscapedString fromHex(const QByteArray &hexEncoded) {
0427         return KDbEscapedString(QByteArray::fromHex(hexEncoded));
0428     }
0429     static inline KDbEscapedString fromHex(const KDbEscapedString &hexEncoded) {
0430         return hexEncoded.isValid() ? KDbEscapedString(QByteArray::fromHex(hexEncoded))
0431                                     : KDbEscapedString::invalid();
0432     }
0433     static inline KDbEscapedString fromPercentEncoding(const QByteArray &pctEncoded, char percent = '%') {
0434         return KDbEscapedString(QByteArray::fromPercentEncoding(pctEncoded, percent));
0435     }
0436     static inline KDbEscapedString fromPercentEncoding(const KDbEscapedString &pctEncoded, char percent = '%') {
0437         return pctEncoded.isValid() ? KDbEscapedString(QByteArray::fromPercentEncoding(pctEncoded, percent))
0438                                     : KDbEscapedString::invalid();
0439     }
0440 
0441     inline int count() const { return QByteArray::count(); }
0442     inline int length() const { return QByteArray::length(); }
0443     inline bool isNull() const { return QByteArray::isNull(); }
0444 
0445     KDbEscapedString arg(const KDbEscapedString &a1, const KDbEscapedString &a2) const;
0446     KDbEscapedString arg(const KDbEscapedString &a1, const KDbEscapedString &a2, const KDbEscapedString &a3) const;
0447     KDbEscapedString arg(const KDbEscapedString &a1, const KDbEscapedString &a2, const KDbEscapedString &a3,
0448                       const KDbEscapedString &a4) const;
0449     KDbEscapedString arg(const KDbEscapedString &a1, const KDbEscapedString &a2, const KDbEscapedString &a3,
0450                       const KDbEscapedString &a4, const KDbEscapedString &a5) const;
0451     KDbEscapedString arg(const KDbEscapedString &a1, const KDbEscapedString &a2, const KDbEscapedString &a3,
0452                       const KDbEscapedString &a4, const KDbEscapedString &a5, const KDbEscapedString &a6) const;
0453     KDbEscapedString arg(const KDbEscapedString &a1, const KDbEscapedString &a2, const KDbEscapedString &a3,
0454                       const KDbEscapedString &a4, const KDbEscapedString &a5, const KDbEscapedString &a6,
0455                       const KDbEscapedString &a7) const;
0456     KDbEscapedString arg(const KDbEscapedString &a1, const KDbEscapedString &a2, const KDbEscapedString &a3,
0457                       const KDbEscapedString &a4, const KDbEscapedString &a5, const KDbEscapedString &a6,
0458                       const KDbEscapedString &a7, const KDbEscapedString &a8) const;
0459     KDbEscapedString arg(const KDbEscapedString &a1, const KDbEscapedString &a2, const KDbEscapedString &a3,
0460                       const KDbEscapedString &a4, const KDbEscapedString &a5, const KDbEscapedString &a6,
0461                       const KDbEscapedString &a7, const KDbEscapedString &a8, const KDbEscapedString &a9) const;
0462     KDbEscapedString arg(const KDbEscapedString &a, int fieldWidth = 0, const QChar & fillChar = QLatin1Char( ' ' )) const;
0463     KDbEscapedString arg(const QString &a, int fieldWidth = 0, const QChar & fillChar = QLatin1Char( ' ' )) const;
0464     KDbEscapedString arg(const QByteArray &a, int fieldWidth = 0, const QChar & fillChar = QLatin1Char( ' ' )) const;
0465     KDbEscapedString arg(int a, int fieldWidth = 0, int base = 10, const QChar & fillChar = QLatin1Char( ' ' )) const;
0466     KDbEscapedString arg(uint a, int fieldWidth = 0, int base = 10, const QChar & fillChar = QLatin1Char( ' ' )) const;
0467     KDbEscapedString arg(long a, int fieldWidth = 0, int base = 10, const QChar & fillChar = QLatin1Char( ' ' )) const;
0468     KDbEscapedString arg(ulong a, int fieldWidth = 0, int base = 10, const QChar & fillChar = QLatin1Char( ' ' )) const;
0469     KDbEscapedString arg(qlonglong a, int fieldWidth = 0, int base = 10, const QChar & fillChar = QLatin1Char( ' ' )) const;
0470     KDbEscapedString arg(qulonglong a, int fieldWidth = 0, int base = 10, const QChar & fillChar = QLatin1Char( ' ' )) const;
0471     KDbEscapedString arg(short a, int fieldWidth = 0, int base = 10, const QChar & fillChar = QLatin1Char( ' ' )) const;
0472     KDbEscapedString arg(ushort a, int fieldWidth = 0, int base = 10, const QChar & fillChar = QLatin1Char( ' ' )) const;
0473     KDbEscapedString arg(QChar a, int fieldWidth = 0, const QChar & fillChar = QLatin1Char( ' ' )) const;
0474     KDbEscapedString arg(char a, int fieldWidth = 0, const QChar & fillChar = QLatin1Char( ' ' )) const;
0475     KDbEscapedString arg(double a, int fieldWidth = 0, char format = 'g', int precision = -1, const QChar & fillChar = QLatin1Char( ' ' )) const;
0476 
0477     typedef QByteArray::DataPtr DataPtr;
0478     inline DataPtr &data_ptr() { return QByteArray::data_ptr(); }
0479 
0480 private:
0481     //! Used to create invalid string
0482     explicit inline KDbEscapedString(bool) : m_valid(false) {}
0483 
0484     //! Helper for methods having "bool* ok" argument
0485     inline bool checkValid(bool *ok) const {
0486         if (!m_valid) {
0487             if (ok)
0488                 *ok = false;
0489             return false;
0490         }
0491         return true;
0492     }
0493     //! true if the string is valid; true by default
0494     bool m_valid;
0495 };
0496 
0497 #ifndef QT_NO_DATASTREAM
0498 KDB_EXPORT QDataStream &operator<<(QDataStream &stream, const KDbEscapedString &string);
0499 KDB_EXPORT QDataStream &operator>>(QDataStream &stream, KDbEscapedString &string);
0500 #endif
0501 
0502 inline KDbEscapedString operator+(const KDbEscapedString &a1, const KDbEscapedString &a2)
0503 {
0504     if (!a1.isValid() || !a2.isValid())
0505         return KDbEscapedString::invalid();
0506     return KDbEscapedString(a1.toByteArray() + a2.toByteArray());
0507 }
0508 inline KDbEscapedString operator+(const KDbEscapedString &a1, const QString &a2)
0509 {
0510     if (!a1.isValid())
0511         return KDbEscapedString::invalid();
0512     return a1 + KDbEscapedString(a2);
0513 }
0514 inline KDbEscapedString operator+(const KDbEscapedString &a1, const QByteArray &a2)
0515 {
0516     if (!a1.isValid())
0517         return KDbEscapedString::invalid();
0518     return a1 + KDbEscapedString(a2);
0519 }
0520 inline KDbEscapedString operator+(const KDbEscapedString &a1, const char* a2)
0521 {
0522     if (!a1.isValid())
0523         return KDbEscapedString::invalid();
0524     return a1 + KDbEscapedString(a2);
0525 }
0526 inline KDbEscapedString operator+(const KDbEscapedString &a1, QChar a2)
0527 {
0528     if (!a1.isValid())
0529         return KDbEscapedString::invalid();
0530     return a1 + KDbEscapedString(a2.toLatin1());
0531 }
0532 inline KDbEscapedString operator+(const KDbEscapedString &a1, char a2)
0533 {
0534     if (!a1.isValid())
0535         return KDbEscapedString::invalid();
0536     return a1 + KDbEscapedString(a2);
0537 }
0538 inline KDbEscapedString operator+(const QString &a1, const KDbEscapedString &a2)
0539 {
0540     if (!a2.isValid())
0541         return KDbEscapedString::invalid();
0542     return KDbEscapedString(a1) + a2;
0543 }
0544 inline KDbEscapedString operator+(const QByteArray &a1, const KDbEscapedString &a2)
0545 {
0546     if (!a2.isValid())
0547         return KDbEscapedString::invalid();
0548     return KDbEscapedString(a1) + a2;
0549 }
0550 inline KDbEscapedString operator+(const char* a1, const KDbEscapedString &a2)
0551 {
0552     if (!a2.isValid())
0553         return KDbEscapedString::invalid();
0554     return KDbEscapedString(a1) + a2;
0555 }
0556 inline KDbEscapedString operator+(QChar a1, const KDbEscapedString &a2)
0557 {
0558     if (!a2.isValid())
0559         return KDbEscapedString::invalid();
0560     return KDbEscapedString(a1.toLatin1()) + a2;
0561 }
0562 inline KDbEscapedString operator+(char a1, const KDbEscapedString &a2)
0563 {
0564     if (!a2.isValid())
0565         return KDbEscapedString::invalid();
0566     return KDbEscapedString(a1) + a2;
0567 }
0568 
0569 inline bool operator==(const KDbEscapedString &a1, const QByteArray &a2)
0570 {
0571     return a1.isValid() && a1.toByteArray() == a2;
0572 }
0573 
0574 inline bool operator==(const KDbEscapedString &a1, const char *a2)
0575 {
0576     return a1.isValid() && a1.toByteArray() == a2;
0577 }
0578 
0579 inline bool operator==(const QByteArray &a1, const KDbEscapedString &a2)
0580 {
0581     return a2.isValid() && a1 == a2.toByteArray();
0582 }
0583 
0584 inline bool operator==(const char *a1, const KDbEscapedString &a2)
0585 {
0586     return a2.isValid() && a1 == a2.toByteArray();
0587 }
0588 
0589 Q_DECLARE_TYPEINFO(KDbEscapedString, Q_MOVABLE_TYPE);
0590 //Q_DECLARE_SHARED(KDbEscapedString)
0591 
0592 //! Sends escaped string @a string to debug output @a dbg.
0593 KDB_EXPORT QDebug operator<<(QDebug dbg, const KDbEscapedString& string);
0594 
0595 #endif