1 /* This file is part of the KDE project
2  Copyright (C) 2003-2016 JarosÅ‚aw Staniek <[email protected]>
4  This library is free software; you can redistribute it and/or
5  modify it under the terms of the GNU Library General Public
6  License as published by the Free Software Foundation; either
7  version 2 of the License, or (at your option) any later version.
9  This library is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  Library General Public License for more details.
14  You should have received a copy of the GNU Library General Public License
15  along with this library; see the file COPYING.LIB. If not, write to
16  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  * Boston, MA 02110-1301, USA.
18 */
23 #include <QSet>
25 #include "KDbObject.h"
26 #include "KDbFieldList.h"
28 class KDbConnection;
29 class KDbTableSchema;
30 class KDbQuerySchema;
31 class KDbRelationship;
33 /*! @short Provides information about database index that can be created for a database table.
35  KDbIndexSchema object stores information about table fields that
36  defines this index and additional properties like: whether index is unique
37  or primary key (requires unique). Single-field index can be also auto generated.
38 */
39 class KDB_EXPORT KDbIndexSchema : public KDbFieldList, public KDbObject
40 {
41 public:
42  /*! Constructs empty index schema object that not assigned to any @a table.
43  KDbTableSchema::addIndex() should be called afterwards, before adding any fields
44  or attaching relationships.
45  Any fields added with addField() will not be owned by index but by their table.
46  */
49  /*! Deletes the index. Referenced KDbField objects are not deleted.
50  All KDbRelationship objects listed by masterRelationships() are detached from
51  detail-side indices and then deleted.
52  KDbRelationship objects listed by detailsRelationships() are not deleted. */
53  ~KDbIndexSchema() override;
55  /*! Adds field at the end of field list.
56  KDbField will not be owned by index. KDbField must belong to a table
57  specified by a KDbTableSchema::addIndex() call, otherwise field couldn't be added.
58  @note Do not forget to add the field to a table, because adding it only to
59  the KDbIndexSchema is not enough. */
60  virtual bool addField(KDbField *field);
62  /*! @return table that index belongs to
63  Index should be assigned to a table using KDbTableSchema::addIndex().
64  If it is not, table() returns @c nullptr. */
65  KDbTableSchema* table();
67  /*! @return table that index is defined for, const version. */
68  const KDbTableSchema* table() const;
70  /*! @return list of relationships from the table (of this index),
71  i.e. any such relationship in which this table is at 'master' side.
72  See KDbRelationship class documentation for more information.
73  All objects on this list will be automatically deleted when this KDbIndexSchema
74  object is deleted. */
75  QList<const KDbRelationship*> masterRelationships() const;
77  /*! @return list of relationships to the table (of this index),
78  i.e. any such relationship in which this table is at 'details' side.
79  See KDbRelationship class documentation for more information. */
80  QList<const KDbRelationship*> detailsRelationships() const;
82  /*! Attaches relationship definition @a rel to this KDbIndexSchema object.
83  If @a rel relationship has this KDbIndexSchema defined at the master-side,
84  @a rel is added to the list of master relationships (available with masterRelationships()).
85  If @a rel relationship has this KDbIndexSchema defined at the details-side,
86  @a rel is added to the list of details relationships (available with detailsRelationships()).
87  For the former case, attached @a rel object is now owned by this KDbIndexSchema object.
89  Note: call detachRelationship() for KDbIndexSchema object that @a rel
90  was previously attached to, if any.
91  @note Before using attachRelationship() the index KDbField must already belong to a table
92  specified by a KDbTableSchema::addIndex() call. */
93  void attachRelationship(KDbRelationship *rel);
95  /*! Detaches relationship definition @a rel for this KDbIndexSchema object
96  from the list of master relationships (available with masterRelationships()),
97  or from details relationships list, depending for which side of the relationship
98  is this IndexSchem object assigned.
100  Note: If @a rel was detached from masterRelationships() list,
101  this object now has no parent, so it must be attached to other index or deleted.
102  */
103  void detachRelationship(KDbRelationship *rel);
105  /*! @return true if index is auto-generated.
106  Auto-generated index is one-field index
107  that was automatically generated
108  for CREATE TABLE statement when the field has
109  UNIQUE or PRIMARY KEY constraint enabled.
111  Any newly created KDbIndexSchema object
112  has this flag set to false.
114  This flag is handled internally by KDbTableSchema.
115  It can be usable for GUI application if we do not
116  want display implicity/auto generated indices
117  on the indices list or we if want to show these
118  indices to the user in a special way.
119  */
120  bool isAutoGenerated() const;
122  /*! @return true if this index is primary key of its table.
123  This can be one or multifield. */
124  bool isPrimaryKey() const;
126  /*! Sets PRIMARY KEY flag. @see isPrimary().
127  Note: Setting PRIMARY KEY on (true),
128  UNIQUE flag will be also implicity set. */
129  void setPrimaryKey(bool set);
131  /*! @return true if this is unique index.
132  This can be one or multifield. */
133  bool isUnique() const;
135  /*! Sets UNIQUE flag. @see isUnique().
136  Note: Setting UNIQUE off (false), PRIMARY KEY flag will
137  be also implicity set off, because this UNIQUE
138  is the requirement for PRIMARY KEYS. */
139  void setUnique(bool set);
141  /*! @return true if the index defines a foreign key,
142  Created implicity for KDbRelationship object.*/
143  bool isForeignKey() const;
145 protected:
146  //! Used by KDbTableSchema::copyIndex(const KDbIndexSchema&)
147  KDbIndexSchema(const KDbIndexSchema& index, KDbTableSchema* parentTable);
149  //! Assigns this index to @a table
150  //! table() must be @c nullptr and @a table must be not be @a nullptr.
151  //! @since 3.1
152  void setTable(KDbTableSchema *table);
154  /*! Sets auto-generated flag. This method should be called only
155  from KDbTableSchema code
156  @see isAutoGenerated(). */
157  void setAutoGenerated(bool set);
159  /*! If @a set is true, declares that the index defines a foreign key,
160  created implicity for KDbRelationship object. Setting this to true, implies
161  clearing 'primary key', 'unique' and 'auto generated' flags.
162  If this index contains just single field, it's 'foreign field'
163  flag will be set to true as well. */
164  void setForeignKey(bool set);
166  /*! Internal version of attachRelationship(). If @a ownedByMaster is true,
167  attached @a rel object will be owned by this index. */
168  void attachRelationship(KDbRelationship *rel, bool ownedByMaster);
170  friend class KDbConnection;
171  friend class KDbTableSchema;
172  friend class KDbQuerySchema;
173  friend class KDbRelationship;
174 private:
175  class Private;
176  Private * const d;
177  Q_DISABLE_COPY(KDbIndexSchema)
178 };
180 //! Sends information about index schema @a index to debug output @a dbg.
181 KDB_EXPORT QDebug operator<<(QDebug dbg, const KDbIndexSchema& index);
183 #endif
KCALENDARCORE_EXPORT QDataStream & operator<<(QDataStream &out, const KCalendarCore::Alarm::Ptr &)
bool addField(KDbField *field)
Provides information about database index that can be created for a database table.
KDbQuerySchema provides information about database query.
Meta-data for a field.
Definition: KDbField.h:71
Provides database connection, allowing queries and data modification.
Definition: KDbConnection.h:51
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Wed Sep 27 2023 04:08:32 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.