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