File indexing completed on 2024-10-13 04:14:17
0001 /* This file is part of the KDE project 0002 Copyright (C) 2002 Lucijan Busch <lucijan@gmx.at> 0003 Copyright (C) 2002 Joseph Wenninger <jowenn@kde.org> 0004 Copyright (C) 2003-2017 Jarosław Staniek <staniek@kde.org> 0005 0006 This library is free software; you can redistribute it and/or 0007 modify it under the terms of the GNU Library General Public 0008 License as published by the Free Software Foundation; either 0009 version 2 of the License, or (at your option) any later version. 0010 0011 This library is distributed in the hope that it will be useful, 0012 but WITHOUT ANY WARRANTY; without even the implied warranty of 0013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 0014 Library General Public License for more details. 0015 0016 You should have received a copy of the GNU Library General Public License 0017 along with this library; see the file COPYING.LIB. If not, write to 0018 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 0019 * Boston, MA 02110-1301, USA. 0020 */ 0021 0022 #ifndef KDB_FIELD_H 0023 #define KDB_FIELD_H 0024 0025 #include <QPair> 0026 #include <QVector> 0027 #include <QStringList> 0028 #include <QHash> 0029 #include <QCoreApplication> 0030 0031 #include "KDbUtils.h" 0032 0033 class KDbTableSchema; 0034 class KDbQuerySchema; 0035 class KDbFieldList; 0036 class KDbExpression; 0037 0038 //! Meta-data for a field 0039 /*! KDbField provides information about single database field. 0040 0041 KDbField class has defined following members: 0042 - name 0043 - type 0044 - database constraints 0045 - additional options 0046 - maxLength (makes sense mostly for string types) 0047 - maxLengthStrategy (makes sense mostly for string types) 0048 - precision (for floating-point type) 0049 - defaultValue 0050 - caption (user readable name that can be e.g. translated) 0051 - description (user readable name additional text, can be useful for developers) 0052 - defaultWidth (a hint for displaying in tabular mode or as text box) 0053 0054 KDbField can also have assigned expression (see KDbExpression class, 0055 and expression() method). 0056 0057 Note that aliases for fields are defined within query, not in KDbField object, 0058 because the same field can be used in different queries with different alias. 0059 0060 Notes for advanced use: KDbField obeject is designed to be owned by a parent object. 0061 Such a parent object can be KDbTableSchema, if the field defines single table column, 0062 or KDbQuerySchema, if the field defines an expression (KDbExpression class). 0063 0064 Using expression class for fields allos to define expressions within queries like 0065 "SELECT AVG(price) FROM products" 0066 0067 You can choose whether your field is owned by query or table, 0068 using appropriate constructor, or using parameterless constructor and 0069 calling setTable() or setQuery() later. 0070 */ 0071 class KDB_EXPORT KDbField 0072 { 0073 Q_GADGET 0074 Q_FLAGS(Constraints Constraint Options Option) 0075 Q_DECLARE_TR_FUNCTIONS(KDbField) 0076 public: 0077 typedef KDbUtils::AutodeletedList<KDbField*> List; //!< list of fields 0078 typedef QVector<KDbField*> Vector; //!< vector of fields 0079 typedef QList<KDbField*>::ConstIterator ListIterator; //!< iterator for list of fields 0080 typedef QPair<KDbField*, KDbField*> Pair; //!< fields pair 0081 typedef QList<Pair> PairList; //!< list of fields pair 0082 0083 /*! Unified (most common used) types of fields. */ 0084 enum Type { 0085 //-- Normal types: 0086 InvalidType = 0, /*!< Unsupported/Unimplemented type */ 0087 Byte = 1, /*!< 1 byte, signed or unsigned */ 0088 FirstType = 1, /*! First type */ 0089 ShortInteger = 2,/*!< 2 bytes, signed or unsigned */ 0090 Integer = 3, /*!< 4 bytes, signed or unsigned */ 0091 BigInteger = 4, /*!< 8 bytes, signed or unsigned */ 0092 Boolean = 5, /*!< 0 or 1 */ 0093 Date = 6, /*!< */ 0094 DateTime = 7, /*!< */ 0095 Time = 8, /*!< */ 0096 Float = 9, /*!< 4 bytes */ 0097 Double = 10, /*!< 8 bytes */ 0098 Text = 11, /*!< Other name: Varchar */ 0099 LongText = 12, /*!< Other name: Memo */ 0100 BLOB = 13, /*!< Large binary object */ 0101 0102 LastType = 13, /*!< This line should be at the end of the list of types! */ 0103 0104 Null = 128, /*!< Used for fields that are "NULL" expressions. */ 0105 0106 //-- Special, internal types: 0107 Asterisk = 129, /*!< Used in KDbQueryAsterisk subclass objects only, 0108 not used in table definitions, 0109 but only in query definitions */ 0110 Enum = 130, /*!< An integer internal with a string list of hints */ 0111 Map = 131, /*!< Mapping from string to string list (more generic than Enum) */ 0112 Tuple = 132, /*!< A list of values (e.g. arguments of a function) */ 0113 LastSpecialType = Tuple /*!< This line should be at the end of the list of special types! */ 0114 }; 0115 Q_ENUM(Type) 0116 0117 /*! Type groups for fields. */ 0118 enum TypeGroup { 0119 InvalidGroup = 0, 0120 TextGroup = 1, 0121 IntegerGroup = 2, 0122 FloatGroup = 3, 0123 BooleanGroup = 4, 0124 DateTimeGroup = 5, 0125 BLOBGroup = 6, /* large binary object */ 0126 0127 LastTypeGroup = 6 // This line should be at the end of the enum! 0128 }; 0129 Q_ENUM(TypeGroup) 0130 0131 /*! Possible constraints defined for a field. */ 0132 enum Constraint { 0133 NoConstraints = 0, 0134 AutoInc = 1, 0135 Unique = 2, 0136 PrimaryKey = 4, 0137 ForeignKey = 8, 0138 NotNull = 16, 0139 NotEmpty = 32, //!< only legal for string-like and blob fields 0140 Indexed = 64 0141 }; 0142 Q_DECLARE_FLAGS(Constraints, Constraint) 0143 0144 /*! Possible options defined for a field. */ 0145 enum Option { 0146 NoOptions = 0, 0147 Unsigned = 1 0148 }; 0149 Q_DECLARE_FLAGS(Options, Option) 0150 0151 /*! Creates a database field as a child of @a tableSchema table. 0152 No other properties are set (even the name), so these should be set later. */ 0153 explicit KDbField(KDbTableSchema *tableSchema); 0154 0155 /*! Creates a database field. 0156 maxLength property is set to 0 (unlimited length). 0157 No other properties are set (even the name), so these should be set later. */ 0158 KDbField(); 0159 0160 /*! Creates a database field with specified properties. 0161 For meaning of @a maxLength argument please refer to setMaxLength(). */ 0162 KDbField(const QString &name, Type type, Constraints constr = NoConstraints, 0163 Options options = NoOptions, int maxLength = 0, int precision = 0, 0164 const QVariant &defaultValue = QVariant(), const QString &caption = QString(), 0165 const QString &description = QString()); 0166 0167 /*! Constructs a deep copy of field @a f. */ 0168 KDbField(const KDbField &f); 0169 0170 virtual ~KDbField(); 0171 0172 //! @return parent for this field (table, query, etc.) 0173 KDbFieldList *parent(); 0174 0175 //! @overload 0176 const KDbFieldList *parent() const; 0177 0178 //! @return number of normal types available, i.e. types > InvalidType and <= LastType. 0179 static int typesCount(); 0180 0181 //! @return number of special types available (Asterisk, Enum, etc.), that means 0182 static int specialTypesCount(); 0183 0184 //! @return number of type groups available 0185 static int typeGroupsCount(); 0186 0187 //! Converts type @a type to QVariant equivalent as accurate as possible 0188 /*! Only normal types are supported. 0189 @see typesCount() specialTypesCount() */ 0190 static QVariant::Type variantType(Type type); 0191 0192 //! Converts value @a value to variant corresponding to type @a type. 0193 /*! Only normal types are supported. 0194 If converting is not possible a null value is returned. */ 0195 static QVariant convertToType(const QVariant &value, Type type); 0196 0197 //! @return a translated type name for @a type 0198 /*! @a type has to be an element from KDbField::Type, not greater than KDbField::LastType. 0199 Only normal types and KDbField::Null are supported. 0200 For unsupported types empty string is returned. */ 0201 //! @see typesCount() specialTypesCount() 0202 static QString typeName(Type type); 0203 0204 //! @return list of all available translated names of normal types 0205 /*! The first element of the list is the name of KDbField::InvalidType, the last one 0206 is a name of KDbField::LastType. 0207 @see typesCount() specialTypesCount() */ 0208 static QStringList typeNames(); 0209 0210 //! @return a nontranslated type string for @a type 0211 /*! For example returns "Integer" for KDbType::Integer. 0212 @a type has to be an element from KDbField::Type, not greater than KDbField::LastType; 0213 KDbField::Null is also supported. 0214 For unsupported types empty string is returned. */ 0215 static QString typeString(Type type); 0216 0217 //! @return type for a given nontranslated type string @a typeString 0218 /*! For example returns KDbType::Integer for "Integer". 0219 @a typeString has to be name of type not greater than KDbField::LastType; 0220 KDbField::Null is also supported. 0221 For unsupported value KDbField::InvalidType is returned. */ 0222 static Type typeForString(const QString& typeString); 0223 0224 //! @return type group for a given nontranslated type group @a typeGroupString 0225 /*! For example returns KDbField::TextGroup for "TextGroup" string. 0226 For unsupported value KDbField::InvalidGroup is returned. */ 0227 static TypeGroup typeGroupForString(const QString& typeGroupString); 0228 0229 //! @return group for @a type 0230 /*! For example returns KDbField::TextGroup for KDbField::Text type. 0231 @a type has to be an element from KDbField::Type, not greater than KDbField::LastType. 0232 For unsupported type KDbField::InvalidGroup is returned. */ 0233 static TypeGroup typeGroup(Type type); 0234 0235 //! @return a translated group name for @a typeGroup 0236 static QString typeGroupName(TypeGroup typeGroup); 0237 0238 //! @return list of all available translated type group names 0239 /*! The first element of the list is the name of KDbField::InvalidGroup, the last one 0240 is a name of KDbField::LastTypeGroup. */ 0241 static QStringList typeGroupNames(); 0242 0243 //! @return a nontranslated type group string for @a typeGroup, e.g. "IntegerGroup" for IntegerGroup type 0244 static QString typeGroupString(TypeGroup typeGroup); 0245 0246 /*! @return the name of this field */ 0247 QString name() const; 0248 0249 /*! @return table schema of table that owns this field 0250 or null if it has no table assigned. 0251 @see query() */ 0252 KDbTableSchema* table(); 0253 0254 //! @overload KDbTableSchema* table() 0255 const KDbTableSchema* table() const; 0256 0257 /*! Sets @a table schema of table that owns this field. 0258 This does not adds the field to @a table object. 0259 You do not need to call this method by hand. 0260 Call KDbTableSchema::addField(KDbField *field) instead. 0261 @see setQuery() */ 0262 void setTable(KDbTableSchema *table); 0263 0264 /*! For special use when the field defines expression. 0265 @return query schema of query that owns this field 0266 or null if it has no query assigned. 0267 @see table() */ 0268 KDbQuerySchema* query(); 0269 0270 //! @overload KDbQuerySchema* query() 0271 const KDbQuerySchema* query() const; 0272 0273 /*! For special use when field defines expression. 0274 Sets @a query schema of query that owns this field. 0275 This does not adds the field to @a query object. 0276 You do not need to call this method by hand. 0277 Call KDbQuerySchema::addField() instead. 0278 @see setQuery() */ 0279 void setQuery(KDbQuerySchema *query); 0280 0281 /*! @return true if the field is autoincrement (e.g. integer/numeric) */ 0282 inline bool isAutoIncrement() const { 0283 return constraints() & AutoInc; 0284 } 0285 0286 /*! @return true if the field is member of single-field primary key */ 0287 inline bool isPrimaryKey() const { 0288 return constraints() & PrimaryKey; 0289 } 0290 0291 /*! @return true if the field is member of single-field unique key */ 0292 inline bool isUniqueKey() const { 0293 return constraints() & Unique; 0294 } 0295 0296 /*! @return true if the field is member of single-field foreign key */ 0297 inline bool isForeignKey() const { 0298 return constraints() & ForeignKey; 0299 } 0300 0301 /*! @return true if the field is not allowed to be null */ 0302 inline bool isNotNull() const { 0303 return constraints() & NotNull; 0304 } 0305 0306 /*! @return true if the field is not allowed to be null */ 0307 inline bool isNotEmpty() const { 0308 return constraints() & NotEmpty; 0309 } 0310 0311 /*! @return true if the field is indexed using single-field database index. */ 0312 inline bool isIndexed() const { 0313 return constraints() & Indexed; 0314 } 0315 0316 /*! @return true if the field is of any numeric type (integer or floating point) */ 0317 inline bool isNumericType() const { 0318 return KDbField::isNumericType(type()); 0319 } 0320 0321 /*! Static version of isNumericType() method 0322 @return true if the field is of any numeric type (integer or floating point)*/ 0323 static bool isNumericType(Type type); 0324 0325 /*! @return true if the field is of any integer type */ 0326 inline bool isIntegerType() const { 0327 return KDbField::isIntegerType(type()); 0328 } 0329 0330 /*! Static version of isIntegerType() method 0331 @return true if the field is of any integer type */ 0332 static bool isIntegerType(Type type); 0333 0334 /*! @return true if the field is of any floating point numeric type */ 0335 inline bool isFPNumericType() const { 0336 return KDbField::isFPNumericType(type()); 0337 } 0338 0339 /*! static version of isFPNumericType() method 0340 @return true if the field is of any floating point numeric type */ 0341 static bool isFPNumericType(Type type); 0342 0343 /*! @return true if the field is of any date or time related type */ 0344 inline bool isDateTimeType() const { 0345 return KDbField::isDateTimeType(type()); 0346 } 0347 0348 /*! Static version of isDateTimeType() method 0349 @return true if the field is of any date or time related type */ 0350 static bool isDateTimeType(Type type); 0351 0352 /*! @return true if the field is of any text type */ 0353 inline bool isTextType() const { 0354 return KDbField::isTextType(type()); 0355 } 0356 0357 /*! Static version of isTextType() method 0358 @return true if the field is of any text type */ 0359 static bool isTextType(Type type); 0360 0361 /*! @return options defined for this field. */ 0362 Options options() const; 0363 0364 /*! Sets options for this field. */ 0365 void setOptions(Options options); 0366 0367 //! Converts field's type to QVariant equivalent as accurate as possible 0368 inline QVariant::Type variantType() const { 0369 return variantType(type()); 0370 } 0371 0372 /*! @return a type for this field. If there's expression assigned, 0373 type of the expression (after evaluation) is returned instead. */ 0374 Type type() const; 0375 0376 //! @return a translated type name for this field 0377 inline QString typeName() const { 0378 return KDbField::typeName(type()); 0379 } 0380 0381 //! @return type group for this field 0382 inline TypeGroup typeGroup() const { 0383 return KDbField::typeGroup(type()); 0384 } 0385 0386 //! @return a translated type group name for this field 0387 inline QString typeGroupName() const { 0388 return KDbField::typeGroupName(typeGroup()); 0389 } 0390 0391 //! @return a type string for this field, 0392 //! for example "Integer" string for KDbField::Integer type. 0393 inline QString typeString() const { 0394 return KDbField::typeString(type()); 0395 } 0396 0397 //! @return a type group string for this field, 0398 //! for example "Integer" string for KDbField::IntegerGroup. 0399 inline QString typeGroupString() const { 0400 return KDbField::typeGroupString(typeGroup()); 0401 } 0402 0403 /*! @return (optional) subtype for this field. 0404 Subtype is a string providing additional hint for field's type. 0405 E.g. for BLOB type, it can be a MIME type or certain QVariant type name, 0406 for example: "QPixmap", "QColor" or "QFont" */ 0407 QString subType() const; 0408 0409 /*! Sets (optional) subtype for this field. 0410 @see subType() */ 0411 void setSubType(const QString& subType); 0412 0413 //! @return default value for this field. Null value means there 0414 //! is no default value declared. The variant value is compatible with field's type. 0415 QVariant defaultValue() const; 0416 0417 /*! @return default maximum length of text. 0418 Default is 0, i.e unlimited length (if the engine supports it). */ 0419 static int defaultMaxLength(); 0420 0421 /*! Sets default maximum length of text. 0 means unlimited length, 0422 greater than 0 means specific maximum length. */ 0423 static void setDefaultMaxLength(int maxLength); 0424 0425 /*! Strategy for defining maximum length of text for this field. 0426 Only makes sense if the field type is of Text type. 0427 Default strategy is DefinedMaxLength. 0428 */ 0429 enum MaxLengthStrategy { 0430 DefaultMaxLength, //!< Default maximum text length defined globally by the application. 0431 //!< @see defaultMaxLength() 0432 DefinedMaxLength //!< Used if setMaxLength() was called to set specific maximum value 0433 //!< or to unlimited (0). 0434 }; 0435 Q_ENUM(MaxLengthStrategy) 0436 0437 /*! @return a hint that indicates if the maximum length of text for this field is based on default setting 0438 (defaultMaxLength()) or was explicitly set. 0439 Only makes sense if the field type is Text. */ 0440 MaxLengthStrategy maxLengthStrategy() const; 0441 0442 /*! Sets strategy for defining maximum length of text for this field. 0443 Only makes sense if the field type is Text. 0444 Default strategy is DefinedMaxLength. 0445 Changing this value does not affect maxLength property. 0446 0447 Fields with DefaultMaxLength strategy does not follow changes made by calling setDefaultMaxLength() 0448 so to update the default maximum lengths in fields, the app has to iterate over all fields of type Text, 0449 and reset to the new default as explained in setMaxLength() documentation. 0450 See documentation for setMaxLength() for information how to reset maxLength to default value. 0451 0452 @see maxLengthStrategy(), setMaxLength() */ 0453 void setMaxLengthStrategy(MaxLengthStrategy strategy); 0454 0455 /*! @return maximum length of text allowed for this field. Only meaningful if the type is Text. 0456 @see setMaxLength() */ 0457 int maxLength() const; 0458 0459 /*! Sets maximum length for this field. Only works for Text type. 0460 It can be specific maximum value or 0 for unlimited length (which will work if engine supports). 0461 Resets maxLengthStrategy property to DefinedMaxLength. 0462 To reset to default maximum length, call setMaxLength(defaultMaxLength()) and then 0463 to indicate this is based on default setting, call setMaxLengthStrategy(DefaultMaxLength). 0464 @see maxLength(), maxLengthStrategy() */ 0465 void setMaxLength(int maxLength); 0466 0467 /*! @return precision for numeric and other fields that have both length (scale) 0468 and precision (floating point types). */ 0469 int precision() const; 0470 0471 /*! @return scale for numeric and other fields that have both length (scale) 0472 and precision (floating point types). 0473 The scale of a numeric is the count of decimal digits in the fractional part, 0474 to the right of the decimal point. The precision of a numeric is the total count 0475 of significant digits in the whole number, that is, the number of digits 0476 to both sides of the decimal point. So the number 23.5141 has a precision 0477 of 6 and a scale of 4. Integers can be considered to have a scale of zero. */ 0478 int scale() const; 0479 0480 //! @todo should we keep extended properties here or move them to a QVariant dictionary? 0481 /*! @return number of decimal places that should be visible to the user, 0482 e.g. within table view widget, form or printout. 0483 Only meaningful if the field type is floating point or (in the future: decimal or currency). 0484 0485 - Any value less than 0 (-1 is the default) means that there should be displayed all digits 0486 of the fractional part, except the ending zeros. This is known as "auto" mode. 0487 For example, 12.345000 becomes 12.345. 0488 0489 - Value of 0 means that all the fractional part should be hidden (as well as the dot or comma). 0490 For example, 12.345000 becomes 12. 0491 0492 - Value N > 0 means that the fractional part should take exactly N digits. 0493 If the fractional part is shorter than N, additional zeros are appended. 0494 For example, "12.345" becomes "12.345000" if N=6. 0495 */ 0496 int visibleDecimalPlaces() const; 0497 0498 /*! @return the constraints defined for this field. */ 0499 Constraints constraints() const; 0500 0501 /*! @return order of this field in containing table (counting starts from 0) 0502 (-1 if unspecified). */ 0503 int order() const; 0504 0505 /*! @return caption of this field. */ 0506 QString caption() const; 0507 0508 /*! @return caption of this field or - if empty - return its name. */ 0509 QString captionOrName() const; 0510 0511 /*! @return description text for this field. */ 0512 QString description() const; 0513 0514 //! if the type has the unsigned attribute 0515 inline bool isUnsigned() const { 0516 return options() & Unsigned; 0517 } 0518 0519 /*! @return true if this field has EMPTY property (i.e. it is of type 0520 string or is a BLOB). */ 0521 inline bool hasEmptyProperty() const { 0522 return KDbField::hasEmptyProperty(type()); 0523 } 0524 0525 /*! static version of hasEmptyProperty() method 0526 @return true if this field type has EMPTY property (i.e. it is string or BLOB type) */ 0527 static bool hasEmptyProperty(Type type); 0528 0529 /*! @return true if this field can be auto-incremented. 0530 Actually, returns true for integer field type. @see IntegerType, isAutoIncrement() */ 0531 inline bool isAutoIncrementAllowed() const { 0532 return KDbField::isAutoIncrementAllowed(type()); 0533 } 0534 0535 /*! static version of isAutoIncrementAllowed() method 0536 @return true if this field type can be auto-incremented. */ 0537 static bool isAutoIncrementAllowed(Type type); 0538 0539 /*! Sets type @a t for this field. 0540 This does nothing if there's expression assigned. 0541 @see setExpression() */ 0542 void setType(Type t); 0543 0544 /*! Sets name @a name for this field. */ 0545 void setName(const QString& name); 0546 0547 /*! Sets constraints to @a c. If PrimaryKey is set in @a c, also 0548 constraits implied by being primary key are enforced (see setPrimaryKey()). 0549 If Indexed is not set in @a c, constraits implied by not being are 0550 enforced as well (see setIndexed()). */ 0551 void setConstraints(Constraints c); 0552 0553 /*! Sets scale for this field. Only works for floating-point types. 0554 @see scale() */ 0555 void setScale(int s); 0556 0557 /*! Sets number of decimal places that should be visible to the user. 0558 @see visibleDecimalPlaces() */ 0559 void setVisibleDecimalPlaces(int p); 0560 0561 /*! Sets scale for this field. Only works for floating-point types. */ 0562 void setPrecision(int p); 0563 0564 /*! Sets unsigned flag for this field. Only works for integer types. */ 0565 void setUnsigned(bool u); 0566 0567 /*! Sets default value for this field. Setting null value removes the default value. 0568 @see defaultValue() */ 0569 void setDefaultValue(const QVariant& def); 0570 0571 /*! Sets default value decoded from QByteArray. 0572 Decoding errors are detected (value is strictly checked against field type) 0573 - if one is encountered, default value is cleared (defaultValue()==QVariant()). 0574 @return true if given value was valid for field type. */ 0575 bool setDefaultValue(const QByteArray& def); 0576 0577 /*! Sets auto increment flag. Only available to set true, 0578 if isAutoIncrementAllowed() is true. */ 0579 void setAutoIncrement(bool a); 0580 0581 /*! Specifies whether the field is single-field primary key or not 0582 (KDb::PrimeryKey item). 0583 Use this with caution. Setting this to true implies setting: 0584 - setUniqueKey(true) 0585 - setNotNull(true) 0586 - setNotEmpty(true) 0587 - setIndexed(true) 0588 0589 Setting this to false implies setting setAutoIncrement(false). */ 0590 void setPrimaryKey(bool p); 0591 0592 /*! Specifies whether the field has single-field unique constraint or not 0593 (KDb::Unique item). Setting this to true implies setting Indexed flag 0594 to true (setIndexed(true)), because index is required it control unique constraint. */ 0595 void setUniqueKey(bool u); 0596 0597 /*! Sets whether the field has to be declared with single-field foreign key. 0598 Used in KDbIndexSchema::setForeigKey(). */ 0599 void setForeignKey(bool f); 0600 0601 /*! Specifies whether the field has single-field unique constraint or not 0602 (KDb::NotNull item). Setting this to true implies setting Indexed flag 0603 to true (setIndexed(true)), because index is required it control 0604 not null constraint. */ 0605 void setNotNull(bool n); 0606 0607 /*! Specifies whether the field has single-field unique constraint or not 0608 (KDb::NotEmpty item). Setting this to true implies setting Indexed flag 0609 to true (setIndexed(true)), because index is required it control 0610 not empty constraint. */ 0611 void setNotEmpty(bool n); 0612 0613 /*! Specifies whether the field is indexed (KDb::Indexed item) 0614 (by single-field implicit index) or not. 0615 Use this with caution. Since index is used to control unique, 0616 not null/empty constratins, setting this to false implies setting: 0617 - setPrimaryKey(false) 0618 - setUniqueKey(false) 0619 - setNotNull(false) 0620 - setNotEmpty(false) 0621 because above flags need index to be present. 0622 Similarly, setting one of the above flags to true, will automatically 0623 do setIndexed(true) for the same reason. */ 0624 void setIndexed(bool s); 0625 0626 /*! Sets caption for this field to @a caption. */ 0627 void setCaption(const QString& caption); 0628 0629 /*! Sets description for this field to @a description. */ 0630 void setDescription(const QString& description); 0631 0632 /*! There can be added asterisks (KDbQueryAsterisk objects) 0633 to query schemas' field list. KDbQueryAsterisk subclasses KDbField class, 0634 and to check if the given object (pointed by KDbField*) 0635 is asterisk or just ordinary field definition, 0636 you can call this method. This is just effective version of QObject::isA(). 0637 Every KDbQueryAsterisk object returns true here, 0638 and every KDbField object returns false. 0639 */ 0640 inline bool isQueryAsterisk() const { 0641 return type() == KDbField::Asterisk; 0642 } 0643 0644 /*! @return KDbExpression object if the field value is an 0645 expression. Unless the expression is set with setExpression(), it is null. 0646 */ 0647 KDbExpression expression(); 0648 0649 //! @overload KDbExpression expression() 0650 const KDbExpression expression() const; 0651 0652 /*! Sets expression data @a expr. If there was already expression set, it is removed before new 0653 assignment. 0654 This KDbField object becames logical owner of @a expr object, so do not use the expression 0655 for other objects (you can call KDbExpression::clone()). 0656 Current field's expression is deleted, if exists. 0657 0658 Because the field defines an expression, it should be assigned to a query, not to a table, 0659 otherwise this call will not have any effect. 0660 */ 0661 void setExpression(const KDbExpression& expr); 0662 0663 /*! @return true if there is expression defined for this field. 0664 This method is provided for better readibility 0665 - does the same as expression().isNull(). */ 0666 bool isExpression() const; 0667 0668 //<TMP> 0669 /*! @return the hints for enum fields. */ 0670 QVector<QString> enumHints() const; 0671 0672 /*! @return hint name for enum value @a num. */ 0673 QString enumHint(int num); 0674 0675 /*! Sets the hint for enum fields */ 0676 void setEnumHints(const QVector<QString> &hints); 0677 //</TMP> 0678 0679 /*! @return custom property @a propertyName. 0680 If there is no such a property, @a defaultValue is returned. */ 0681 QVariant customProperty(const QByteArray& propertyName, 0682 const QVariant& defaultValue = QVariant()) const; 0683 0684 //! Sets value @a value for custom property @a propertyName 0685 void setCustomProperty(const QByteArray& propertyName, const QVariant& value); 0686 0687 //! A data type used for handling custom properties of a field 0688 typedef QHash<QByteArray, QVariant> CustomPropertiesMap; 0689 0690 //! @return all custom properties 0691 CustomPropertiesMap customProperties() const; 0692 0693 protected: 0694 explicit KDbField(KDbFieldList *aParent, int aOrder = -1); 0695 0696 /*! Creates a database field as a child of @a querySchema table 0697 Assigns @a expr expression to this field, if present. 0698 Used internally by query schemas, e.g. to declare asterisks or 0699 to add expression columns. 0700 No other properties are set, so these should be set later. */ 0701 KDbField(KDbQuerySchema *querySchema, const KDbExpression& expr); 0702 0703 /*! @overload KDbField(KDbQuerySchema*, const KDbExpression&) */ 0704 explicit KDbField(KDbQuerySchema *querySchema); 0705 0706 //! Sets parent for this field. 0707 void setParent(KDbFieldList *parent); 0708 0709 /*! Sets order of this field in containing table. Counting starts from 0. -1 if unspecified. */ 0710 void setOrder(int order); 0711 0712 //! @return a deep copy of this object. Used in @ref KDbFieldList(const KDbFieldList& fl). 0713 virtual KDbField* copy(); 0714 0715 private: 0716 friend class KDbConnection; 0717 friend class KDbFieldList; 0718 friend class KDbTableSchema; 0719 friend class KDbQuerySchema; 0720 0721 class Private; 0722 Private * const d; 0723 }; 0724 0725 Q_DECLARE_OPERATORS_FOR_FLAGS(KDbField::Constraints) 0726 Q_DECLARE_OPERATORS_FOR_FLAGS(KDbField::Options) 0727 0728 //! Sends information about field @a field to debug output @a dbg. 0729 KDB_EXPORT QDebug operator<<(QDebug dbg, const KDbField& field); 0730 0731 //! Sends information about field type @a type to debug output @a dbg. 0732 KDB_EXPORT QDebug operator<<(QDebug dbg, KDbField::Type type); 0733 0734 //! Sends information about field type group @a typeGroup to debug output @a dbg. 0735 KDB_EXPORT QDebug operator<<(QDebug dbg, KDbField::TypeGroup typeGroup); 0736 0737 #endif