File indexing completed on 2024-10-06 12:46:17
0001 /* This file is part of the KDE project 0002 Copyright (C) 2004-2015 Jarosław Staniek <staniek@kde.org> 0003 Copyright (c) 2006, 2007 Thomas Braxton <kde.braxton@gmail.com> 0004 Copyright (c) 1999 Preston Brown <pbrown@kde.org> 0005 Copyright (c) 1997 Matthias Kalle Dalheimer <kalle@kde.org> 0006 0007 This library is free software; you can redistribute it and/or 0008 modify it under the terms of the GNU Library General Public 0009 License as published by the Free Software Foundation; either 0010 version 2 of the License, or (at your option) any later version. 0011 0012 This library is distributed in the hope that it will be useful, 0013 but WITHOUT ANY WARRANTY; without even the implied warranty of 0014 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 0015 Library General Public License for more details. 0016 0017 You should have received a copy of the GNU Library General Public License 0018 along with this library; see the file COPYING.LIB. If not, write to 0019 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 0020 * Boston, MA 02110-1301, USA. 0021 */ 0022 0023 #include "KDbTableOrQuerySchema.h" 0024 #include "KDbConnection.h" 0025 #include "KDbQuerySchema.h" 0026 #include "kdb_debug.h" 0027 0028 class Q_DECL_HIDDEN KDbTableOrQuerySchema::Private 0029 { 0030 public: 0031 Private() {} 0032 //! The name is kept here because m_table and m_table can be 0 0033 //! and we still want name() and acptionOrName() work. 0034 QByteArray name; 0035 0036 KDbTableSchema* table; 0037 0038 KDbQuerySchema* query; 0039 private: 0040 Q_DISABLE_COPY(Private) 0041 }; 0042 0043 KDbTableOrQuerySchema::KDbTableOrQuerySchema(KDbConnection *conn, const QByteArray& name) 0044 : d(new Private) 0045 { 0046 d->name = name; 0047 d->table = conn->tableSchema(QLatin1String(name)); 0048 d->query = d->table ? nullptr : conn->querySchema(QLatin1String(name)); 0049 if (!d->table && !d->query) { 0050 kdbWarning() << "tableOrQuery is neither table nor query!"; 0051 } 0052 } 0053 0054 KDbTableOrQuerySchema::KDbTableOrQuerySchema(KDbConnection *conn, const QByteArray& name, Type type) 0055 : d(new Private) 0056 { 0057 d->name = name; 0058 d->table = type == Type::Table ? conn->tableSchema(QLatin1String(name)) : nullptr; 0059 d->query = type == Type::Query ? conn->querySchema(QLatin1String(name)) : nullptr; 0060 if (type == Type::Table && !d->table) { 0061 kdbWarning() << "no table specified!"; 0062 } 0063 if (type == Type::Query && !d->query) { 0064 kdbWarning() << "no query specified!"; 0065 } 0066 } 0067 0068 KDbTableOrQuerySchema::KDbTableOrQuerySchema(KDbFieldList *tableOrQuery) 0069 : d(new Private) 0070 { 0071 d->table = dynamic_cast<KDbTableSchema*>(tableOrQuery); 0072 d->query = dynamic_cast<KDbQuerySchema*>(tableOrQuery); 0073 if (!d->table && !d->query) { 0074 kdbWarning() << "tableOrQuery is neither table nor query!"; 0075 } 0076 } 0077 0078 KDbTableOrQuerySchema::KDbTableOrQuerySchema(KDbConnection *conn, int id) 0079 : d(new Private) 0080 { 0081 d->table = conn->tableSchema(id); 0082 d->query = d->table ? nullptr : conn->querySchema(id); 0083 if (!d->table && !d->query) { 0084 kdbWarning() << "no table or query found for id==" << id; 0085 } 0086 } 0087 0088 KDbTableOrQuerySchema::KDbTableOrQuerySchema(KDbTableSchema* table) 0089 : d(new Private) 0090 { 0091 d->table = table; 0092 d->query = nullptr; 0093 if (!d->table) { 0094 kdbWarning() << "no table specified!"; 0095 } 0096 } 0097 0098 KDbTableOrQuerySchema::KDbTableOrQuerySchema(KDbQuerySchema* query) 0099 : d(new Private) 0100 { 0101 d->table = nullptr; 0102 d->query = query; 0103 if (!d->query) { 0104 kdbWarning() << "no query specified!"; 0105 } 0106 } 0107 0108 KDbTableOrQuerySchema::~KDbTableOrQuerySchema() 0109 { 0110 delete d; 0111 } 0112 0113 int KDbTableOrQuerySchema::fieldCount(KDbConnection *conn) const 0114 { 0115 if (d->table) 0116 return d->table->fieldCount(); 0117 if (d->query && conn) 0118 return d->query->fieldsExpanded(conn).size(); 0119 return -1; 0120 } 0121 0122 const KDbQueryColumnInfo::Vector KDbTableOrQuerySchema::columns(KDbConnection * conn, ColumnsMode mode) 0123 { 0124 if (d->table) { 0125 return d->table->query()->fieldsExpanded(conn, mode == ColumnsMode::Unique 0126 ? KDbQuerySchema::FieldsExpandedMode::Unique 0127 : KDbQuerySchema::FieldsExpandedMode::Default); 0128 } 0129 if (d->query) { 0130 return d->query->fieldsExpanded(conn, mode == ColumnsMode::Unique 0131 ? KDbQuerySchema::FieldsExpandedMode::Unique 0132 : KDbQuerySchema::FieldsExpandedMode::Default); 0133 } 0134 kdbWarning() << "no query or table specified!"; 0135 return KDbQueryColumnInfo::Vector(); 0136 } 0137 0138 QByteArray KDbTableOrQuerySchema::name() const 0139 { 0140 if (d->table) 0141 return d->table->name().toLatin1(); 0142 if (d->query) 0143 return d->query->name().toLatin1(); 0144 return d->name; 0145 } 0146 0147 QString KDbTableOrQuerySchema::captionOrName() const 0148 { 0149 KDbObject *object = d->table ? static_cast<KDbObject *>(d->table) : static_cast<KDbObject *>(d->query); 0150 if (!object) 0151 return QLatin1String(d->name); 0152 return object->caption().isEmpty() ? object->name() : object->caption(); 0153 } 0154 0155 KDbField* KDbTableOrQuerySchema::field(const QString& name) 0156 { 0157 if (d->table) 0158 return d->table->field(name); 0159 if (d->query) 0160 return d->query->field(name); 0161 0162 return nullptr; 0163 } 0164 0165 KDbQueryColumnInfo* KDbTableOrQuerySchema::columnInfo(KDbConnection *conn, const QString& name) 0166 { 0167 if (d->table) 0168 return d->table->query()->columnInfo(conn, name); 0169 0170 if (d->query) 0171 return d->query->columnInfo(conn, name); 0172 0173 return nullptr; 0174 } 0175 0176 //! Sends information about table or query schema @a schema to debug output @a dbg. 0177 QDebug operator<<(QDebug dbg, const KDbConnectionAndSchema &connectionAndSchema) 0178 { 0179 if (std::get<1>(connectionAndSchema).table()) { 0180 dbg.nospace() << *std::get<1>(connectionAndSchema).table(); 0181 } else if (std::get<1>(connectionAndSchema).query()) { 0182 dbg.nospace() << KDbConnectionAndQuerySchema(std::get<0>(connectionAndSchema), 0183 *std::get<1>(connectionAndSchema).query()); 0184 } 0185 return dbg.space(); 0186 } 0187 0188 KDbQuerySchema* KDbTableOrQuerySchema::query() const 0189 { 0190 return d->query; 0191 } 0192 0193 KDbTableSchema* KDbTableOrQuerySchema::table() const 0194 { 0195 return d->table; 0196 }