@@ -4214,7 +4214,7 @@ static void jumpSpace( const QString &txt, int &i )
4214
4214
++i;
4215
4215
}
4216
4216
4217
- static QString getNextString ( const QString &txt, int &i, const QString &sep )
4217
+ QString QgsPostgresProvider:: getNextString ( const QString &txt, int &i, const QString &sep )
4218
4218
{
4219
4219
jumpSpace ( txt, i );
4220
4220
QString cur = txt.mid ( i );
@@ -4223,14 +4223,14 @@ static QString getNextString( const QString &txt, int &i, const QString &sep )
4223
4223
QRegExp stringRe ( " ^\" ((?:\\\\ .|[^\"\\\\ ])*)\" .*" );
4224
4224
if ( !stringRe.exactMatch ( cur ) )
4225
4225
{
4226
- QgsLogger::warning ( " Cannot find end of double quoted string: " + txt );
4226
+ QgsMessageLog::logMessage ( tr ( " Cannot find end of double quoted string: %1 " ). arg ( txt ), tr ( " PostGIS " ) );
4227
4227
return QString ();
4228
4228
}
4229
4229
i += stringRe.cap ( 1 ).length () + 2 ;
4230
4230
jumpSpace ( txt, i );
4231
4231
if ( !txt.midRef ( i ).startsWith ( sep ) && i < txt.length () )
4232
4232
{
4233
- QgsLogger::warning ( " Cannot find separator: " + txt.mid ( i ) );
4233
+ QgsMessageLog::logMessage ( tr ( " Cannot find separator: %1 " ). arg ( txt.mid ( i ) ), tr ( " PostGIS " ) );
4234
4234
return QString ();
4235
4235
}
4236
4236
i += sep.length ();
@@ -4249,7 +4249,7 @@ static QString getNextString( const QString &txt, int &i, const QString &sep )
4249
4249
}
4250
4250
}
4251
4251
4252
- static QVariant parseHstore ( const QString &txt )
4252
+ QVariant QgsPostgresProvider:: parseHstore ( const QString &txt )
4253
4253
{
4254
4254
QVariantMap result;
4255
4255
int i = 0 ;
@@ -4259,7 +4259,7 @@ static QVariant parseHstore( const QString &txt )
4259
4259
QString value = getNextString ( txt, i, QStringLiteral ( " ," ) );
4260
4260
if ( key.isNull () || value.isNull () )
4261
4261
{
4262
- QgsLogger::warning ( " Error parsing hstore: " + txt );
4262
+ QgsMessageLog::logMessage ( tr ( " Error parsing hstore: %1 " ). arg ( txt ), tr ( " PostGIS " ) );
4263
4263
break ;
4264
4264
}
4265
4265
result.insert ( key, value );
@@ -4268,7 +4268,7 @@ static QVariant parseHstore( const QString &txt )
4268
4268
return result;
4269
4269
}
4270
4270
4271
- static QVariant parseJson ( const QString &txt )
4271
+ QVariant QgsPostgresProvider:: parseJson ( const QString &txt )
4272
4272
{
4273
4273
QVariant result;
4274
4274
QJsonDocument jsonResponse = QJsonDocument::fromJson ( txt.toUtf8 () );
@@ -4277,7 +4277,7 @@ static QVariant parseJson( const QString &txt )
4277
4277
return result;
4278
4278
}
4279
4279
4280
- static QVariant parseOtherArray ( const QString &txt, QVariant::Type subType, const QString &typeName )
4280
+ QVariant QgsPostgresProvider:: parseOtherArray ( const QString &txt, QVariant::Type subType, const QString &typeName )
4281
4281
{
4282
4282
int i = 0 ;
4283
4283
QVariantList result;
@@ -4286,15 +4286,15 @@ static QVariant parseOtherArray( const QString &txt, QVariant::Type subType, con
4286
4286
const QString value = getNextString ( txt, i, QStringLiteral ( " ," ) );
4287
4287
if ( value.isNull () )
4288
4288
{
4289
- QgsLogger::warning ( " Error parsing array: " + txt );
4289
+ QgsMessageLog::logMessage ( tr ( " Error parsing array: %1 " ). arg ( txt ), tr ( " PostGIS " ) );
4290
4290
break ;
4291
4291
}
4292
4292
result.append ( QgsPostgresProvider::convertValue ( subType, QVariant::Invalid, value, typeName ) );
4293
4293
}
4294
4294
return result;
4295
4295
}
4296
4296
4297
- static QVariant parseStringArray ( const QString &txt )
4297
+ QVariant QgsPostgresProvider:: parseStringArray ( const QString &txt )
4298
4298
{
4299
4299
int i = 0 ;
4300
4300
QStringList result;
@@ -4303,24 +4303,64 @@ static QVariant parseStringArray( const QString &txt )
4303
4303
const QString value = getNextString ( txt, i, QStringLiteral ( " ," ) );
4304
4304
if ( value.isNull () )
4305
4305
{
4306
- QgsLogger::warning ( " Error parsing array: " + txt );
4306
+ QgsMessageLog::logMessage ( tr ( " Error parsing array: %1 " ). arg ( txt ), tr ( " PostGIS " ) );
4307
4307
break ;
4308
4308
}
4309
4309
result.append ( value );
4310
4310
}
4311
4311
return result;
4312
4312
}
4313
4313
4314
- static QVariant parseArray ( const QString &txt, QVariant::Type type, QVariant::Type subType, const QString &typeName )
4314
+ QVariant QgsPostgresProvider::parseMultidimensionalArray ( const QString &txt )
4315
+ {
4316
+ QStringList result;
4317
+ if ( !txt.startsWith ( ' {' ) || !txt.endsWith ( ' }' ) )
4318
+ {
4319
+ QgsMessageLog::logMessage ( tr ( " Error parsing array, missing curly braces: %1" ).arg ( txt ), tr ( " PostGIS" ) );
4320
+ return result;
4321
+ }
4322
+
4323
+ QStringList values;
4324
+ QString text = txt;
4325
+ while ( !text.isEmpty () )
4326
+ {
4327
+ bool escaped = false ;
4328
+ int openedBrackets = 1 ;
4329
+ int i = 0 ;
4330
+ while ( i < text.length () && openedBrackets > 0 )
4331
+ {
4332
+ ++i;
4333
+
4334
+ if ( text.at ( i ) == ' }' && !escaped ) openedBrackets--;
4335
+ else if ( text.at ( i ) == ' {' && !escaped ) openedBrackets++;
4336
+
4337
+ escaped = !escaped ? text.at ( i ) == ' \\ ' : false ;
4338
+ }
4339
+
4340
+ values.append ( text.left ( ++i ) );
4341
+ i = text.indexOf ( ' ,' , i );
4342
+ i = i > 0 ? text.indexOf ( ' {' , i ) : -1 ;
4343
+ if ( i == -1 )
4344
+ break ;
4345
+
4346
+ text = text.mid ( i );
4347
+ }
4348
+ return values;
4349
+
4350
+ }
4351
+
4352
+ QVariant QgsPostgresProvider::parseArray ( const QString &txt, QVariant::Type type, QVariant::Type subType, const QString &typeName )
4315
4353
{
4316
4354
if ( !txt.startsWith ( ' {' ) || !txt.endsWith ( ' }' ) )
4317
4355
{
4318
4356
if ( !txt.isEmpty () )
4319
- QgsLogger::warning ( " Error parsing array, missing curly braces: " + txt );
4357
+ QgsMessageLog::logMessage ( tr ( " Error parsing array, missing curly braces: %1 " ). arg ( txt ), tr ( " PostGIS " ) );
4320
4358
return QVariant ( type );
4321
4359
}
4322
4360
QString inner = txt.mid ( 1 , txt.length () - 2 );
4323
- if ( type == QVariant::StringList )
4361
+ if ( ( type == QVariant::StringList || type == QVariant::List ) && inner.startsWith ( " {" ) )
4362
+ return parseMultidimensionalArray ( inner );
4363
+ else if ( type == QVariant::StringList )
4324
4364
return parseStringArray ( inner );
4325
4365
else
4326
4366
return parseOtherArray ( inner, subType, typeName );
0 commit comments