23#include "connection.h"
25#include "expression.h"
32#include <tqdatetime.h>
67 uint cconst, uint options, uint length, uint precision,
68 TQVariant defaultValue,
const TQString& caption,
const TQString& description,
73 ,m_precision(precision)
74 ,m_visibleDecimalPlaces(-1)
76 ,m_defaultValue(defaultValue)
82 ,m_customProperties(0)
96 if (f.m_customProperties)
110 delete m_customProperties;
115 return new Field(*
this);
126 m_options = NoOptions;
127 m_defaultValue = TQVariant(TQString());
131 m_customProperties = 0;
137 return m_expr->type();
149 return TQVariant::Int;
151 return TQVariant::Bool;
153 return TQVariant::Date;
155 return TQVariant::DateTime;
157 return TQVariant::Time;
160 return TQVariant::Double;
163 return TQVariant::String;
165 return TQVariant::ByteArray;
167 return TQVariant::Invalid;
170 return TQVariant::Invalid;
252 case Field::DateTime:
292 return DateTimeGroup;
333 KexiDBWarn << TQString(
"Field::setType(%1)").arg(t)
334 <<
" could not set type because the field has expression assigned!" << endl;
391 m_options |= Unsigned;
392 m_options ^= (!u * Unsigned);
398 m_defaultValue = def;
405 m_defaultValue = TQVariant();
413 unsigned int v = def.toUInt(&ok);
415 m_defaultValue = TQVariant();
417 m_defaultValue = TQVariant(v);
420 int v = def.toInt(&ok);
421 if (!ok || (!(m_options & Unsigned) && (v < -32768 || v > 32767)) || ((m_options & Unsigned) && (v < 0 || v > 65535)))
422 m_defaultValue = TQVariant();
424 m_defaultValue = TQVariant(v);
427 long v = def.toLong(&ok);
429 if (!ok || (!(m_options & Unsigned) && (-v > (
int)0x07FFFFFFF || v > (
int)(0x080000000-1))))
430 m_defaultValue = TQVariant();
432 m_defaultValue = TQVariant((TQ_LLONG)v);
448 unsigned short v = def.toUShort(&ok);
450 m_defaultValue = TQVariant();
452 m_defaultValue = TQVariant((
bool)v);
455 TQDate date = TQDate::fromString( def, TQt::ISODate );
457 m_defaultValue = TQVariant();
459 m_defaultValue = TQVariant(date);
462 TQDateTime dt = TQDateTime::fromString( def, TQt::ISODate );
464 m_defaultValue = TQVariant();
466 m_defaultValue = TQVariant(dt);
469 TQTime time = TQTime::fromString( def, TQt::ISODate );
471 m_defaultValue = TQVariant();
473 m_defaultValue = TQVariant(time);
476 float v = def.toFloat(&ok);
477 if (!ok || ((m_options & Unsigned) && (v < 0.0)))
478 m_defaultValue = TQVariant();
480 m_defaultValue = TQVariant(v);
483 double v = def.toDouble(&ok);
484 if (!ok || ((m_options & Unsigned) && (v < 0.0)))
485 m_defaultValue = TQVariant();
487 m_defaultValue = TQVariant(v);
490 if (def.isNull() || (def.length() > 255))
491 m_defaultValue = TQVariant();
493 m_defaultValue = TQVariant((TQString)def);
497 m_defaultValue = TQVariant();
499 m_defaultValue = TQVariant((TQString)def);
504 m_defaultValue = TQVariant();
506 m_defaultValue = TQVariant(def);
509 m_defaultValue = TQVariant();
511 return m_defaultValue.isNull();
586 TQString dbg = (m_name.isEmpty() ?
"<NONAME> " : m_name +
" ");
587 if (m_options & Field::Unsigned)
592 dbg += TQString::fromLatin1(
"(%1,%2)").arg(m_precision).arg(
scale());
594 dbg += TQString::fromLatin1(
"(%1)").arg(m_precision);
597 dbg += TQString::fromLatin1(
"(%1)").arg(
m_length);
598 if (m_constraints & Field::AutoInc)
600 if (m_constraints & Field::Unique)
602 if (m_constraints & Field::PrimaryKey)
604 if (m_constraints & Field::ForeignKey)
606 if (m_constraints & Field::NotNull)
610 if (!m_defaultValue.isNull())
613 dbg +=
" EXPRESSION=" + m_expr->debugString();
614 if (m_customProperties && !m_customProperties->isEmpty()) {
615 dbg += TQString(
" CUSTOM PROPERTIES (%1): ").arg(m_customProperties->count());
617 foreach (CustomPropertiesMap::ConstIterator, it, *m_customProperties) {
622 dbg += TQString(
"%1 = %2 (%3)").arg(TQString(it.key())).arg(TQString(it.data().toString())).arg(TQString(it.data().typeName()));
645 const TQVariant& defaultValue)
const
647 if (!m_customProperties)
649 CustomPropertiesMap::ConstIterator it(m_customProperties->find(propertyName));
650 if (it==m_customProperties->constEnd())
657 if (propertyName.isEmpty())
659 if (!m_customProperties)
661 m_customProperties->insert(propertyName, value);
665#define ADDTYPE(type, i18, str) this->at(Field::type) = i18; \
666 this->at(Field::type+Field::LastType+1) = str; \
667 str2num.insert(TQString::fromLatin1(str).lower(), type)
668#define ADDGROUP(type, i18, str) this->at(Field::type) = i18; \
669 this->at(Field::type+Field::LastTypeGroup+1) = str; \
670 str2num.insert(TQString::fromLatin1(str).lower(), type)
672Field::FieldTypeNames::FieldTypeNames()
673 : TQValueVector<TQString>()
674 , m_initialized(false)
678void Field::FieldTypeNames::init()
682 m_initialized =
true;
685 ADDTYPE( InvalidType, i18n(
"Invalid Type"),
"InvalidType" );
686 ADDTYPE( Byte, i18n(
"Byte"),
"Byte" );
687 ADDTYPE( ShortInteger, i18n(
"Short Integer Number"),
"ShortInteger" );
688 ADDTYPE( Integer, i18n(
"Integer Number"),
"Integer" );
689 ADDTYPE( BigInteger, i18n(
"Big Integer Number"),
"BigInteger" );
690 ADDTYPE( Boolean, i18n(
"Yes/No Value"),
"Boolean" );
691 ADDTYPE( Date, i18n(
"Date"),
"Date" );
692 ADDTYPE( DateTime, i18n(
"Date and Time"),
"DateTime" );
693 ADDTYPE( Time, i18n(
"Time"),
"Time" );
694 ADDTYPE( Float, i18n(
"Single Precision Number"),
"Float" );
695 ADDTYPE( Double, i18n(
"Double Precision Number"),
"Double" );
696 ADDTYPE( Text, i18n(
"Text"),
"Text" );
697 ADDTYPE( LongText, i18n(
"Long Text"),
"LongText" );
698 ADDTYPE( BLOB, i18n(
"Object"),
"BLOB" );
703Field::FieldTypeGroupNames::FieldTypeGroupNames()
704 : TQValueVector<TQString>()
705 , m_initialized(false)
709void Field::FieldTypeGroupNames::init()
713 m_initialized =
true;
714 resize((Field::LastTypeGroup + 1)*2);
716 ADDGROUP( InvalidGroup, i18n(
"Invalid Group"),
"InvalidGroup" );
717 ADDGROUP( TextGroup, i18n(
"Text"),
"TextGroup" );
718 ADDGROUP( IntegerGroup, i18n(
"Integer Number"),
"IntegerGroup" );
719 ADDGROUP( FloatGroup, i18n(
"Floating Point Number"),
"FloatGroup" );
720 ADDGROUP( BooleanGroup, i18n(
"Yes/No"),
"BooleanGroup" );
721 ADDGROUP( DateTimeGroup, i18n(
"Date/Time"),
"DateTimeGroup" );
722 ADDGROUP( BLOBGroup, i18n(
"Object"),
"BLOBGroup" );
A base class for all expressions.
Provides database connection, allowing queries and data modification.
static TQString defaultSQLTypeName(int id_t)
virtual TQString sqlTypeName(int id_t, int p=0) const
bool isPrimaryKey() const
TQString typeName() const
virtual Field * copy() const
bool isAutoIncrementAllowed() const
virtual TQString debugString() const
@ NotEmpty
only legal for string-like and blob fields
void setName(const TQString &name)
TQVariant customProperty(const TQCString &propertyName, const TQVariant &defaultValue=TQVariant()) const
void setVisibleDecimalPlaces(int p)
QuerySchema * query() const
TQVariant::Type variantType() const
Converts field's type to TQVariant equivalent as accurate as possible.
const CustomPropertiesMap customProperties() const
TQString typeString() const
void setConstraints(uint c)
void setPrecision(uint p)
TQString typeGroupString() const
void setQuery(QuerySchema *query)
void setDefaultValue(const TQVariant &def)
bool hasEmptyProperty() const
static TypeGroup typeGroupForString(const TQString &typeGroupString)
FieldList * m_parent
In most cases this points to a TableSchema object that field is assigned.
uint m_length
also used for storing scale for floating point types
bool isFPNumericType() const
virtual void setTable(TableSchema *table)
void setPrimaryKey(bool p)
bool isIntegerType() const
bool isAutoIncrement() const
void setUniqueKey(bool u)
static Type typeForString(const TQString &typeString)
void setAutoIncrement(bool a)
void setCustomProperty(const TQCString &propertyName, const TQVariant &value)
Sets value value for custom property propertyName.
static FieldTypeGroupNames m_typeGroupNames
real i18n'd type group names (and not-i18n'd group name strings)
bool isNumericType() const
TypeGroup typeGroup() const
TQString typeGroupName() const
bool isForeignKey() const
int m_visibleDecimalPlaces
used in visibleDecimalPlaces()
void setExpression(KexiDB::BaseExpr *expr)
TQMap< TQCString, TQVariant > CustomPropertiesMap
A data type used for handling custom properties of a field.
void setForeignKey(bool f)
virtual TableSchema * table() const
TQVariant defaultValue() const
bool isDateTimeType() const
static FieldTypeNames m_typeNames
real i18n'd type names (and not-i18n'd type name strings)
KexiDB::QuerySchema provides information about database query.
Connection * connection() const
High-level database connectivity library with database backend drivers.
KEXI_DB_EXPORT bool supportsVisibleDecimalPlacesProperty(Field::Type type)
KEXI_DB_EXPORT TQString variantToString(const TQVariant &v)