19 #include <nlohmann/json.hpp>
21 using namespace nlohmann;
23 static void jumpSpace(
const QString &txt,
int &i )
25 while ( i < txt.length() && txt.at( i ).isSpace() )
29 QString QgsPostgresStringUtils::getNextString(
const QString &txt,
int &i,
const QString &sep )
32 QString cur = txt.mid( i );
33 if ( cur.startsWith(
'"' ) )
35 QRegExp stringRe(
"^\"((?:\\\\.|[^\"\\\\])*)\".*" );
36 if ( !stringRe.exactMatch( cur ) )
38 QgsMessageLog::logMessage( QObject::tr(
"Cannot find end of double quoted string: %1" ).arg( txt ), QObject::tr(
"PostgresStringUtils" ) );
41 i += stringRe.cap( 1 ).length() + 2;
43 if ( !QStringView{txt}.mid( i ).startsWith( sep ) && i < txt.length() )
45 QgsMessageLog::logMessage( QObject::tr(
"Cannot find separator: %1" ).arg( txt.mid( i ) ), QObject::tr(
"PostgresStringUtils" ) );
49 return stringRe.cap( 1 ).replace( QLatin1String(
"\\\"" ), QLatin1String(
"\"" ) ).replace( QLatin1String(
"\\\\" ), QLatin1String(
"\\" ) );
53 int sepPos = cur.indexOf( sep );
59 i += sepPos + sep.length();
60 return cur.left( sepPos ).trimmed();
66 QVariantList variantList;
69 QString newVal =
string.mid( 1,
string.length() - 2 );
71 if ( newVal.trimmed().startsWith(
'{' ) )
75 QString subarray = newVal;
76 while ( !subarray.isEmpty() )
79 int openedBrackets = 1;
81 while ( i < subarray.length() && openedBrackets > 0 )
85 if ( subarray.at( i ) ==
'}' && !escaped ) openedBrackets--;
86 else if ( subarray.at( i ) ==
'{' && !escaped ) openedBrackets++;
88 escaped = !escaped ? subarray.at( i ) ==
'\\' :
false;
91 variantList.append( subarray.left( ++i ) );
92 i = subarray.indexOf(
',', i );
93 i = i > 0 ? subarray.indexOf(
'{', i ) : -1;
97 subarray = subarray.mid( i );
103 while ( i < newVal.length() )
105 const QString value = getNextString( newVal, i, QStringLiteral(
"," ) );
106 if ( value.isNull() )
108 QgsMessageLog::logMessage( QObject::tr(
"Error parsing PG like array: %1" ).arg( newVal ), QObject::tr(
"PostgresStringUtils" ) );
111 variantList.append( value );
122 for (
const QVariant &v : std::as_const( list ) )
127 case QVariant::Type::Int:
128 case QVariant::Type::LongLong:
129 sl.push_back( v.toString() );
132 QString newS = v.toString();
133 if ( newS.startsWith(
'{' ) )
135 sl.push_back( newS );
139 newS.replace(
'\\', QLatin1String( R
"(\\)" ) );
140 newS.replace( '\"', QLatin1String( R
"(\")" ) );
141 sl.push_back( "\"" + newS +
"\"" );
147 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,...