23 #include <QDataStream>
26 #include <QJsonDocument>
37 : mName( nam ), mType( typ ), mLength( len ), mPrecision( prec ), mNumeric( num )
48 const QString &
typeName,
int len,
int prec,
const QString &comment, QVariant::Type subType )
75 return *( other.d ) == *d;
80 return !( *
this == other );
90 if ( !d->alias.isEmpty() )
98 if (
alias().isEmpty() )
102 return QStringLiteral(
"%1 (%2)" ).arg(
name() ).arg(
alias() );
110 typeStr += QStringLiteral(
"(%1, %2)" ).arg(
length() ).arg(
precision() );
112 typeStr += QStringLiteral(
"(%1)" ).arg(
length() );
114 if ( showConstraints )
117 ? QStringLiteral(
" NOT NULL" )
118 : QStringLiteral(
" NULL" );
121 ? QStringLiteral(
" UNIQUE" )
160 return d->type == QVariant::Double || d->type == QVariant::Int || d->type == QVariant::UInt || d->type == QVariant::LongLong || d->type == QVariant::ULongLong;
165 return d->type == QVariant::Date || d->type == QVariant::Time || d->type == QVariant::DateTime;
210 return d->defaultValueDefinition;
225 return d->constraints;
262 if ( d->type == QVariant::Double )
272 if ( QLocale().decimalPoint() !=
'.' ||
273 !( QLocale().numberOptions() & QLocale::NumberOption::OmitGroupSeparator ) )
275 if ( d->precision > 0 )
277 if ( -1 < v.toDouble() && v.toDouble() < 1 )
279 return QLocale().toString( v.toDouble(),
'g', d->precision );
283 return QLocale().toString( v.toDouble(),
'f', d->precision );
290 QString s( v.toString() );
291 int dotPosition( s.indexOf(
'.' ) );
293 if ( dotPosition < 0 && s.indexOf(
'e' ) < 0 )
296 return QLocale().toString( v.toDouble(),
'f',
precision );
301 else precision = s.length() - dotPosition - 1;
303 if ( -1 < v.toDouble() && v.toDouble() < 1 )
305 return QLocale().toString( v.toDouble(),
'g',
precision );
309 return QLocale().toString( v.toDouble(),
'f',
precision );
315 else if ( d->type == QVariant::Double && d->precision > 0 )
317 if ( -1 < v.toDouble() && v.toDouble() < 1 )
319 return QString::number( v.toDouble(),
'g', d->precision );
323 return QString::number( v.toDouble(),
'f', d->precision );
329 !( QLocale().numberOptions() & QLocale::NumberOption::OmitGroupSeparator ) )
332 qlonglong converted( v.toLongLong( &ok ) );
334 return QLocale().toString( converted );
336 else if ( d->typeName.compare( QLatin1String(
"json" ), Qt::CaseInsensitive ) == 0 || d->typeName == QLatin1String(
"jsonb" ) )
338 QJsonDocument doc = QJsonDocument::fromVariant( v );
339 return QString::fromUtf8( doc.toJson().data() );
341 else if ( d->type == QVariant::ByteArray )
343 return QObject::tr(
"BLOB" );
354 return QObject::tr(
"None" );
356 return QObject::tr(
"Not searchable" );
358 return QStringLiteral(
"Do not expose via WMS" );
360 return QStringLiteral(
"Do not expose via WFS" );
373 const QVariant original = v;
375 errorMessage->clear();
379 v.convert( d->type );
383 if ( d->type == QVariant::Int && v.toInt() != v.toLongLong() )
385 v = QVariant( d->type );
387 *errorMessage = QObject::tr(
"Value \"%1\" is too large for integer field" ).arg( original.toLongLong() );
393 if ( d->type == QVariant::Double && v.type() == QVariant::String )
396 if ( !tmp.convert( d->type ) )
407 if ( QLocale().decimalPoint() !=
'.' )
409 d = QLocale( QLocale::C ).toDouble( v.toString(), &ok );
420 if ( d->type == QVariant::Int && v.type() == QVariant::String )
423 if ( !tmp.convert( d->type ) )
437 if ( d->type == QVariant::LongLong && v.type() == QVariant::String )
440 if ( !tmp.convert( d->type ) )
455 if ( d->type == QVariant::Int && v.canConvert( QVariant::Double ) )
458 double dbl = v.toDouble( &ok );
462 v = QVariant( d->type );
465 *errorMessage = QObject::tr(
"Value \"%1\" is not a number" ).arg( original.toString() );
470 double round = std::round( dbl );
471 if ( round > std::numeric_limits<int>::max() || round < -std::numeric_limits<int>::max() )
474 v = QVariant( d->type );
477 *errorMessage = QObject::tr(
"Value \"%1\" is too large for integer field" ).arg( original.toDouble() );
481 v = QVariant(
static_cast< int >( std::round( dbl ) ) );
487 if ( d->type == QVariant::LongLong && v.canConvert( QVariant::Double ) )
491 if ( !tmp.convert( d->type ) )
494 double dbl = v.toDouble( &ok );
498 v = QVariant( d->type );
501 *errorMessage = QObject::tr(
"Value \"%1\" is not a number" ).arg( original.toString() );
506 double round = std::round( dbl );
507 if ( round >
static_cast<double>( std::numeric_limits<long long>::max() ) || round <
static_cast<double>( -std::numeric_limits<long long>::max() ) )
510 v = QVariant( d->type );
513 *errorMessage = QObject::tr(
"Value \"%1\" is too large for long long field" ).arg( original.toDouble() );
517 v = QVariant(
static_cast< long long >( std::round( dbl ) ) );
522 if ( !v.convert( d->type ) )
524 v = QVariant( d->type );
527 *errorMessage = QObject::tr(
"Could not convert value \"%1\" to target type" ).arg( original.toString() );
532 if ( d->type == QVariant::Double && d->precision > 0 )
534 double s = std::pow( 10, d->precision );
535 double d = v.toDouble() * s;
536 v = QVariant( ( d < 0 ? std::ceil( d - 0.5 ) : std::floor( d + 0.5 ) ) / s );
540 if ( d->type == QVariant::String && d->length > 0 && v.toString().length() > d->length )
542 const int length = v.toString().length();
543 v = v.toString().left( d->length );
546 *errorMessage = QObject::tr(
"String of length %1 exceeds maximum field length (%2)" ).arg(
length ).arg( d->length );
556 d->editorWidgetSetup = v;
561 return d->editorWidgetSetup;
573 out << static_cast< quint32 >(
field.
type() );
601 quint32 originNotNull;
602 quint32 originUnique;
603 quint32 originExpression;
604 quint32 strengthNotNull;
605 quint32 strengthUnique;
606 quint32 strengthExpression;
614 QString defaultValueExpression;
615 QString constraintExpression;
616 QString constraintDescription;
619 >> defaultValueExpression >> applyOnUpdate >> constraints >> originNotNull >> originUnique >> originExpression >> strengthNotNull >> strengthUnique >> strengthExpression >>
620 constraintExpression >> constraintDescription >> subType;