@@ -4217,7 +4217,7 @@ static void jumpSpace( const QString &txt, int &i )
42174217 ++i;
42184218}
42194219
4220- static QString getNextString ( const QString &txt, int &i, const QString &sep )
4220+ QString QgsPostgresProvider:: getNextString ( const QString &txt, int &i, const QString &sep )
42214221{
42224222 jumpSpace ( txt, i );
42234223 QString cur = txt.mid ( i );
@@ -4226,14 +4226,14 @@ static QString getNextString( const QString &txt, int &i, const QString &sep )
42264226 QRegExp stringRe ( " ^\" ((?:\\\\ .|[^\"\\\\ ])*)\" .*" );
42274227 if ( !stringRe.exactMatch ( cur ) )
42284228 {
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 " ) );
42304230 return QString ();
42314231 }
42324232 i += stringRe.cap ( 1 ).length () + 2 ;
42334233 jumpSpace ( txt, i );
42344234 if ( !txt.midRef ( i ).startsWith ( sep ) && i < txt.length () )
42354235 {
4236- QgsLogger::warning ( " Cannot find separator: " + txt.mid ( i ) );
4236+ QgsMessageLog::logMessage ( tr ( " Cannot find separator: %1 " ). arg ( txt.mid ( i ) ), tr ( " PostGIS " ) );
42374237 return QString ();
42384238 }
42394239 i += sep.length ();
@@ -4252,7 +4252,7 @@ static QString getNextString( const QString &txt, int &i, const QString &sep )
42524252 }
42534253}
42544254
4255- static QVariant parseHstore ( const QString &txt )
4255+ QVariant QgsPostgresProvider:: parseHstore ( const QString &txt )
42564256{
42574257 QVariantMap result;
42584258 int i = 0 ;
@@ -4262,7 +4262,7 @@ static QVariant parseHstore( const QString &txt )
42624262 QString value = getNextString ( txt, i, QStringLiteral ( " ," ) );
42634263 if ( key.isNull () || value.isNull () )
42644264 {
4265- QgsLogger::warning ( " Error parsing hstore: " + txt );
4265+ QgsMessageLog::logMessage ( tr ( " Error parsing hstore: %1 " ). arg ( txt ), tr ( " PostGIS " ) );
42664266 break ;
42674267 }
42684268 result.insert ( key, value );
@@ -4271,7 +4271,7 @@ static QVariant parseHstore( const QString &txt )
42714271 return result;
42724272}
42734273
4274- static QVariant parseJson ( const QString &txt )
4274+ QVariant QgsPostgresProvider:: parseJson ( const QString &txt )
42754275{
42764276 QVariant result;
42774277 QJsonDocument jsonResponse = QJsonDocument::fromJson ( txt.toUtf8 () );
@@ -4280,7 +4280,7 @@ static QVariant parseJson( const QString &txt )
42804280 return result;
42814281}
42824282
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 )
42844284{
42854285 int i = 0 ;
42864286 QVariantList result;
@@ -4289,15 +4289,15 @@ static QVariant parseOtherArray( const QString &txt, QVariant::Type subType, con
42894289 const QString value = getNextString ( txt, i, QStringLiteral ( " ," ) );
42904290 if ( value.isNull () )
42914291 {
4292- QgsLogger::warning ( " Error parsing array: " + txt );
4292+ QgsMessageLog::logMessage ( tr ( " Error parsing array: %1 " ). arg ( txt ), tr ( " PostGIS " ) );
42934293 break ;
42944294 }
42954295 result.append ( QgsPostgresProvider::convertValue ( subType, QVariant::Invalid, value, typeName ) );
42964296 }
42974297 return result;
42984298}
42994299
4300- static QVariant parseStringArray ( const QString &txt )
4300+ QVariant QgsPostgresProvider:: parseStringArray ( const QString &txt )
43014301{
43024302 int i = 0 ;
43034303 QStringList result;
@@ -4306,24 +4306,64 @@ static QVariant parseStringArray( const QString &txt )
43064306 const QString value = getNextString ( txt, i, QStringLiteral ( " ," ) );
43074307 if ( value.isNull () )
43084308 {
4309- QgsLogger::warning ( " Error parsing array: " + txt );
4309+ QgsMessageLog::logMessage ( tr ( " Error parsing array: %1 " ). arg ( txt ), tr ( " PostGIS " ) );
43104310 break ;
43114311 }
43124312 result.append ( value );
43134313 }
43144314 return result;
43154315}
43164316
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 )
43184356{
43194357 if ( !txt.startsWith ( ' {' ) || !txt.endsWith ( ' }' ) )
43204358 {
43214359 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 " ) );
43234361 return QVariant ( type );
43244362 }
43254363 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 )
43274367 return parseStringArray ( inner );
43284368 else
43294369 return parseOtherArray ( inner, subType, typeName );
0 commit comments