Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge pull request #5317 from pblottiere/bugfix_style
[bugfix] Fixes #17234 save/load styles from Postgres when a service file is used
  • Loading branch information
m-kuhn committed Oct 16, 2017
2 parents afb2a6a + 562e9b4 commit d4635d0
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 7 deletions.
24 changes: 21 additions & 3 deletions src/providers/postgres/qgspostgresconn.cpp
Expand Up @@ -1010,7 +1010,7 @@ QString QgsPostgresConn::quotedValue( const QVariant &value )
}
}

PGresult *QgsPostgresConn::PQexec( const QString &query, bool logError )
PGresult *QgsPostgresConn::PQexec( const QString &query, bool logError ) const
{
if ( PQstatus() != CONNECTION_OK )
{
Expand Down Expand Up @@ -1192,13 +1192,13 @@ void QgsPostgresConn::PQfinish()
mConn = nullptr;
}

int QgsPostgresConn::PQstatus()
int QgsPostgresConn::PQstatus() const
{
Q_ASSERT( mConn );
return ::PQstatus( mConn );
}

QString QgsPostgresConn::PQerrorMessage()
QString QgsPostgresConn::PQerrorMessage() const
{
Q_ASSERT( mConn );
return QString::fromUtf8( ::PQerrorMessage( mConn ) );
Expand Down Expand Up @@ -1855,3 +1855,21 @@ bool QgsPostgresConn::cancel()

return res == 0;
}

QString QgsPostgresConn::currentDatabase() const
{
QString database;
QString sql = "SELECT current_database()";
QgsPostgresResult res( PQexec( sql ) );

if ( res.PQresultStatus() == PGRES_TUPLES_OK )
{
database = res.PQgetvalue( 0, 0 );
}
else
{
QgsMessageLog::logMessage( tr( "SQL:%1\nresult:%2\nerror:%3\n" ).arg( sql ).arg( res.PQresultStatus() ).arg( res.PQresultErrorMessage() ), tr( "PostGIS" ) );
}

return database;
}
13 changes: 10 additions & 3 deletions src/providers/postgres/qgspostgresconn.h
Expand Up @@ -244,11 +244,11 @@ class QgsPostgresConn : public QObject
//

// run a query and check for errors
PGresult *PQexec( const QString &query, bool logError = true );
PGresult *PQexec( const QString &query, bool logError = true ) const;
void PQfinish();
QString PQerrorMessage();
QString PQerrorMessage() const;
int PQsendQuery( const QString &query );
int PQstatus();
int PQstatus() const;
PGresult *PQgetResult();
PGresult *PQprepare( const QString &stmtName, const QString &query, int nParams, const Oid *paramTypes );
PGresult *PQexecPrepared( const QString &stmtName, const QStringList &params );
Expand Down Expand Up @@ -315,6 +315,13 @@ class QgsPostgresConn : public QObject

QString connInfo() const { return mConnInfo; }

/**
* Returns the underlying database.
*
* \since QGIS 3.0
*/
QString currentDatabase() const;

static const int GEOM_TYPE_SELECT_LIMIT;

static QString displayStringForWkbType( QgsWkbTypes::Type wkbType );
Expand Down
15 changes: 15 additions & 0 deletions src/providers/postgres/qgspostgresprovider.cpp
Expand Up @@ -4560,6 +4560,11 @@ QGISEXTERN bool saveStyle( const QString &uri, const QString &qmlStyle, const QS
}
}

if ( dsUri.database().isEmpty() ) // typically when a service file is used
{
dsUri.setDatabase( conn->currentDatabase() );
}

QString uiFileColumn;
QString uiFileValue;
if ( !uiFileContent.isEmpty() )
Expand Down Expand Up @@ -4680,6 +4685,11 @@ QGISEXTERN QString loadStyle( const QString &uri, QString &errCause )
return QLatin1String( "" );
}

if ( dsUri.database().isEmpty() ) // typically when a service file is used
{
dsUri.setDatabase( conn->currentDatabase() );
}

if ( !tableExists( *conn, QStringLiteral( "layer_styles" ) ) )
{
return QLatin1String( "" );
Expand Down Expand Up @@ -4718,6 +4728,11 @@ QGISEXTERN int listStyles( const QString &uri, QStringList &ids, QStringList &na
return -1;
}

if ( dsUri.database().isEmpty() ) // typically when a service file is used
{
dsUri.setDatabase( conn->currentDatabase() );
}

QString selectRelatedQuery = QString( "SELECT id,styleName,description"
" FROM layer_styles"
" WHERE f_table_catalog=%1"
Expand Down
24 changes: 23 additions & 1 deletion tests/src/python/test_provider_postgres.py
Expand Up @@ -32,7 +32,8 @@
QgsTransactionGroup,
QgsReadWriteContext,
QgsRectangle,
QgsDefaultValue
QgsDefaultValue,
QgsDataSourceUri
)
from qgis.gui import QgsGui
from qgis.PyQt.QtCore import QDate, QTime, QDateTime, QVariant, QDir, QObject
Expand Down Expand Up @@ -847,6 +848,27 @@ def receive(self, msg):

self.assertTrue(ok)

def testStyleDatabaseWithService(self):

myconn = 'service=\'qgis_test\''
if 'QGIS_PGTEST_DB' in os.environ:
myconn = os.environ['QGIS_PGTEST_DB']
myvl = QgsVectorLayer(myconn + ' sslmode=disable key=\'pk\' srid=4326 type=POINT table="qgis_test"."someData" (geom) sql=', 'test', 'postgres')

styles = myvl.listStylesInDatabase()
ids = styles[1]
self.assertEqual(len(ids), 0)

myvl.saveStyleToDatabase('mystyle', '', False, '')
styles = myvl.listStylesInDatabase()
ids = styles[1]
self.assertEqual(len(ids), 1)

myvl.deleteStyleFromDatabase(ids[0])
styles = myvl.listStylesInDatabase()
ids = styles[1]
self.assertEqual(len(ids), 0)


class TestPyQgsPostgresProviderCompoundKey(unittest.TestCase, ProviderTestCase):

Expand Down

0 comments on commit d4635d0

Please sign in to comment.