File indexing completed on 2024-12-01 07:24:57
0001 /* This file is part of the KDE project 0002 Copyright (C) 2003-2016 Jarosław Staniek <staniek@kde.org> 0003 0004 This library 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 library 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 library; see the file COPYING.LIB. 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_INDEXSCHEMA_H 0021 #define KDB_INDEXSCHEMA_H 0022 0023 #include <QSet> 0024 0025 #include "KDbObject.h" 0026 #include "KDbFieldList.h" 0027 0028 class KDbConnection; 0029 class KDbTableSchema; 0030 class KDbQuerySchema; 0031 class KDbRelationship; 0032 0033 /*! @short Provides information about database index that can be created for a database table. 0034 0035 KDbIndexSchema object stores information about table fields that 0036 defines this index and additional properties like: whether index is unique 0037 or primary key (requires unique). Single-field index can be also auto generated. 0038 */ 0039 class KDB_EXPORT KDbIndexSchema : public KDbFieldList, public KDbObject 0040 { 0041 public: 0042 /*! Constructs empty index schema object that not assigned to any @a table. 0043 KDbTableSchema::addIndex() should be called afterwards, before adding any fields 0044 or attaching relationships. 0045 Any fields added with addField() will not be owned by index but by their table. 0046 */ 0047 KDbIndexSchema(); 0048 0049 /*! Deletes the index. Referenced KDbField objects are not deleted. 0050 All KDbRelationship objects listed by masterRelationships() are detached from 0051 detail-side indices and then deleted. 0052 KDbRelationship objects listed by detailsRelationships() are not deleted. */ 0053 ~KDbIndexSchema() override; 0054 0055 /*! Adds field at the end of field list. 0056 KDbField will not be owned by index. KDbField must belong to a table 0057 specified by a KDbTableSchema::addIndex() call, otherwise field couldn't be added. 0058 @note Do not forget to add the field to a table, because adding it only to 0059 the KDbIndexSchema is not enough. */ 0060 virtual bool addField(KDbField *field); 0061 0062 /*! @return table that index belongs to 0063 Index should be assigned to a table using KDbTableSchema::addIndex(). 0064 If it is not, table() returns @c nullptr. */ 0065 KDbTableSchema* table(); 0066 0067 /*! @return table that index is defined for, const version. */ 0068 const KDbTableSchema* table() const; 0069 0070 /*! @return list of relationships from the table (of this index), 0071 i.e. any such relationship in which this table is at 'master' side. 0072 See KDbRelationship class documentation for more information. 0073 All objects on this list will be automatically deleted when this KDbIndexSchema 0074 object is deleted. */ 0075 QList<const KDbRelationship*> masterRelationships() const; 0076 0077 /*! @return list of relationships to the table (of this index), 0078 i.e. any such relationship in which this table is at 'details' side. 0079 See KDbRelationship class documentation for more information. */ 0080 QList<const KDbRelationship*> detailsRelationships() const; 0081 0082 /*! Attaches relationship definition @a rel to this KDbIndexSchema object. 0083 If @a rel relationship has this KDbIndexSchema defined at the master-side, 0084 @a rel is added to the list of master relationships (available with masterRelationships()). 0085 If @a rel relationship has this KDbIndexSchema defined at the details-side, 0086 @a rel is added to the list of details relationships (available with detailsRelationships()). 0087 For the former case, attached @a rel object is now owned by this KDbIndexSchema object. 0088 0089 Note: call detachRelationship() for KDbIndexSchema object that @a rel 0090 was previously attached to, if any. 0091 @note Before using attachRelationship() the index KDbField must already belong to a table 0092 specified by a KDbTableSchema::addIndex() call. */ 0093 void attachRelationship(KDbRelationship *rel); 0094 0095 /*! Detaches relationship definition @a rel for this KDbIndexSchema object 0096 from the list of master relationships (available with masterRelationships()), 0097 or from details relationships list, depending for which side of the relationship 0098 is this IndexSchem object assigned. 0099 0100 Note: If @a rel was detached from masterRelationships() list, 0101 this object now has no parent, so it must be attached to other index or deleted. 0102 */ 0103 void detachRelationship(KDbRelationship *rel); 0104 0105 /*! @return true if index is auto-generated. 0106 Auto-generated index is one-field index 0107 that was automatically generated 0108 for CREATE TABLE statement when the field has 0109 UNIQUE or PRIMARY KEY constraint enabled. 0110 0111 Any newly created KDbIndexSchema object 0112 has this flag set to false. 0113 0114 This flag is handled internally by KDbTableSchema. 0115 It can be usable for GUI application if we do not 0116 want display implicity/auto generated indices 0117 on the indices list or we if want to show these 0118 indices to the user in a special way. 0119 */ 0120 bool isAutoGenerated() const; 0121 0122 /*! @return true if this index is primary key of its table. 0123 This can be one or multifield. */ 0124 bool isPrimaryKey() const; 0125 0126 /*! Sets PRIMARY KEY flag. @see isPrimary(). 0127 Note: Setting PRIMARY KEY on (true), 0128 UNIQUE flag will be also implicity set. */ 0129 void setPrimaryKey(bool set); 0130 0131 /*! @return true if this is unique index. 0132 This can be one or multifield. */ 0133 bool isUnique() const; 0134 0135 /*! Sets UNIQUE flag. @see isUnique(). 0136 Note: Setting UNIQUE off (false), PRIMARY KEY flag will 0137 be also implicity set off, because this UNIQUE 0138 is the requirement for PRIMARY KEYS. */ 0139 void setUnique(bool set); 0140 0141 /*! @return true if the index defines a foreign key, 0142 Created implicity for KDbRelationship object.*/ 0143 bool isForeignKey() const; 0144 0145 protected: 0146 //! Used by KDbTableSchema::copyIndex(const KDbIndexSchema&) 0147 KDbIndexSchema(const KDbIndexSchema& index, KDbTableSchema* parentTable); 0148 0149 //! Assigns this index to @a table 0150 //! table() must be @c nullptr and @a table must be not be @a nullptr. 0151 //! @since 3.1 0152 void setTable(KDbTableSchema *table); 0153 0154 /*! Sets auto-generated flag. This method should be called only 0155 from KDbTableSchema code 0156 @see isAutoGenerated(). */ 0157 void setAutoGenerated(bool set); 0158 0159 /*! If @a set is true, declares that the index defines a foreign key, 0160 created implicity for KDbRelationship object. Setting this to true, implies 0161 clearing 'primary key', 'unique' and 'auto generated' flags. 0162 If this index contains just single field, it's 'foreign field' 0163 flag will be set to true as well. */ 0164 void setForeignKey(bool set); 0165 0166 /*! Internal version of attachRelationship(). If @a ownedByMaster is true, 0167 attached @a rel object will be owned by this index. */ 0168 void attachRelationship(KDbRelationship *rel, bool ownedByMaster); 0169 0170 friend class KDbConnection; 0171 friend class KDbTableSchema; 0172 friend class KDbQuerySchema; 0173 friend class KDbRelationship; 0174 private: 0175 class Private; 0176 Private * const d; 0177 Q_DISABLE_COPY(KDbIndexSchema) 0178 }; 0179 0180 //! Sends information about index schema @a index to debug output @a dbg. 0181 KDB_EXPORT QDebug operator<<(QDebug dbg, const KDbIndexSchema& index); 0182 0183 #endif