19 #include <QRegularExpression>
21 #include <nlohmann/json.hpp>
23 using namespace nlohmann;
25 static void jumpSpace(
const QString &txt,
int &i )
27 while ( i < txt.length() && txt.at( i ).isSpace() )
31 QString QgsPostgresStringUtils::getNextString(
const QString &txt,
int &i,
const QString &sep )
34 QString cur = txt.mid( i );
35 if ( cur.startsWith(
'"' ) )
37 const QRegularExpression stringRe( QRegularExpression::anchoredPattern(
"^\"((?:\\\\.|[^\"\\\\])*)\".*" ) );
38 const QRegularExpressionMatch match = stringRe.match( cur );
39 if ( !match.hasMatch() )
41 QgsMessageLog::logMessage( QObject::tr(
"Cannot find end of double quoted string: %1" ).arg( txt ), QObject::tr(
"PostgresStringUtils" ) );
44 i += match.captured( 1 ).length() + 2;
46 if ( !QStringView{txt}.mid( i ).startsWith( sep ) && i < txt.length() )
48 QgsMessageLog::logMessage( QObject::tr(
"Cannot find separator: %1" ).arg( txt.mid( i ) ), QObject::tr(
"PostgresStringUtils" ) );
52 return match.captured( 1 ).replace( QLatin1String(
"\\\"" ), QLatin1String(
"\"" ) ).replace( QLatin1String(
"\\\\" ), QLatin1String(
"\\" ) );
56 int sepPos = cur.indexOf( sep );
62 i += sepPos + sep.length();
63 return cur.left( sepPos ).trimmed();
69 QVariantList variantList;
72 QString newVal =
string.mid( 1,
string.length() - 2 );
74 if ( newVal.trimmed().startsWith(
'{' ) )
78 QString subarray = newVal;
79 while ( !subarray.isEmpty() )
82 int openedBrackets = 1;
84 while ( i < subarray.length() && openedBrackets > 0 )
88 if ( subarray.at( i ) ==
'}' && !escaped ) openedBrackets--;
89 else if ( subarray.at( i ) ==
'{' && !escaped ) openedBrackets++;
91 escaped = !escaped ? subarray.at( i ) ==
'\\' :
false;
94 variantList.append( subarray.left( ++i ) );
95 i = subarray.indexOf(
',', i );
96 i = i > 0 ? subarray.indexOf(
'{', i ) : -1;
100 subarray = subarray.mid( i );
106 while ( i < newVal.length() )
108 const QString value = getNextString( newVal, i, QStringLiteral(
"," ) );
109 if ( value.isNull() )
111 QgsMessageLog::logMessage( QObject::tr(
"Error parsing PG like array: %1" ).arg( newVal ), QObject::tr(
"PostgresStringUtils" ) );
114 variantList.append( value );
125 for (
const QVariant &v : std::as_const( list ) )
130 case QVariant::Type::Int:
131 case QVariant::Type::LongLong:
132 sl.push_back( v.toString() );
135 QString newS = v.toString();
136 if ( newS.startsWith(
'{' ) )
138 sl.push_back( newS );
142 newS.replace(
'\\', QLatin1String( R
"(\\)" ) );
143 newS.replace( '\"', QLatin1String( R
"(\")" ) );
144 sl.push_back( "\"" + newS +
"\"" );
150 QString s = sl.join(
',' ).prepend(
'{' ).append(
'}' );
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::MessageLevel::Warning, bool notifyUser=true)
Adds a message to the log instance (and creates it if necessary).
static QString buildArray(const QVariantList &list)
Build a postgres array like formatted list in a string from a QVariantList.
static QVariantList parseArray(const QString &string)
Returns a QVariantList created out of a string containing an array in postgres array format {1,...