Skip to content

Commit 1b43de3

Browse files
Emilio Loijef-n
authored andcommittedMay 9, 2013
Ask for confirmation before overwrite a layer style
1 parent bfe2f9f commit 1b43de3

File tree

3 files changed

+347
-339
lines changed

3 files changed

+347
-339
lines changed
 

‎src/app/qgsvectorlayerproperties.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -728,6 +728,7 @@ void QgsVectorLayerProperties::saveStyleAs( StyleType styleType )
728728
apply();
729729

730730
layer->saveStyleToDatabase( styleName, styleDesc, isDefault, uiFileContent, msgError );
731+
731732
if( !msgError.isNull() )
732733
{
733734
QMessageBox::warning( this, infoWindowTitle, msgError );
@@ -736,6 +737,7 @@ void QgsVectorLayerProperties::saveStyleAs( StyleType styleType )
736737
{
737738
QMessageBox::information( this, infoWindowTitle, tr( "Style saved" ) );
738739
}
740+
739741
}
740742
else
741743
{

‎src/core/qgsvectorlayer.cpp

Lines changed: 128 additions & 129 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
#include <QString>
3333
#include <QDomNode>
3434
#include <QVector>
35+
#include <QMessageBox>
3536

3637
#include "qgsvectorlayer.h"
3738

@@ -73,40 +74,39 @@
7374
#include "qgsdiagramrendererv2.h"
7475
#include "qgsstylev2.h"
7576
#include "qgssymbologyv2conversion.h"
76-
#include "qgspallabeling.h"
7777

7878
#ifdef TESTPROVIDERLIB
7979
#include <dlfcn.h>
8080
#endif
8181

8282
typedef bool saveStyle_t(
83-
const QString& uri,
84-
const QString& qmlStyle,
85-
const QString& sldStyle,
86-
const QString& styleName,
87-
const QString& styleDescription,
88-
const QString& uiFileContent,
89-
bool useAsDefault,
90-
QString& errCause
83+
const QString& uri,
84+
const QString& qmlStyle,
85+
const QString& sldStyle,
86+
const QString& styleName,
87+
const QString& styleDescription,
88+
const QString& uiFileContent,
89+
bool useAsDefault,
90+
QString& errCause
9191
);
9292

9393
typedef QString loadStyle_t(
94-
const QString& uri,
95-
QString& errCause
94+
const QString& uri,
95+
QString& errCause
9696
);
9797

9898
typedef int listStyles_t(
99-
const QString& uri,
100-
QStringList &ids,
101-
QStringList &names,
102-
QStringList &descriptions,
103-
QString& errCause
99+
const QString& uri,
100+
QVector<QString> &ids,
101+
QVector<QString> &names,
102+
QVector<QString> &descriptions,
103+
QString& errCause
104104
);
105105

106106
typedef QString getStyleById_t(
107-
const QString& uri,
108-
QString styleID,
109-
QString& errCause
107+
const QString& uri,
108+
QString styleID,
109+
QString& errCause
110110
);
111111

112112

@@ -3731,87 +3731,86 @@ QDomElement QgsAttributeEditorField::toDomElement( QDomDocument& doc ) const
37313731
return elem;
37323732
}
37333733

3734-
int QgsVectorLayer::listStylesInDatabase( QStringList &ids, QStringList &names, QStringList &descriptions, QString &msgError )
3734+
int QgsVectorLayer::listStylesInDatabase( QVector<QString> &ids, QVector<QString> &names, QVector<QString> &descriptions, QString &msgError )
37353735
{
3736-
QgsProviderRegistry * pReg = QgsProviderRegistry::instance();
3737-
QLibrary *myLib = pReg->providerLibrary( mProviderKey );
3738-
if ( !myLib )
3739-
{
3740-
msgError = QObject::tr( "Unable to load %1 provider" ).arg( mProviderKey );
3741-
return -1;
3742-
}
3743-
listStyles_t* listStylesExternalMethod = ( listStyles_t * ) cast_to_fptr( myLib->resolve( "listStyles" ) );
3736+
QgsProviderRegistry * pReg = QgsProviderRegistry::instance();
3737+
QLibrary *myLib = pReg->providerLibrary( mProviderKey );
3738+
if ( !myLib )
3739+
{
3740+
msgError = QObject::tr( "Unable to load %1 provider" ).arg( mProviderKey );
3741+
return -1;
3742+
}
3743+
listStyles_t* listStylesExternalMethod = ( listStyles_t * ) cast_to_fptr(myLib->resolve("listStyles"));
37443744

3745-
if ( !listStylesExternalMethod )
3746-
{
3747-
delete myLib;
3748-
msgError = QObject::tr( "Provider %1 has no %2 method" ).arg( mProviderKey ).arg( "listStyles" );
3749-
return -1;
3750-
}
3745+
if ( !listStylesExternalMethod )
3746+
{
3747+
delete myLib;
3748+
msgError = QObject::tr( "Provider %1 has no listStyles method" ).arg( mProviderKey );
3749+
return -1;
3750+
}
37513751

3752-
return listStylesExternalMethod( mDataSource, ids, names, descriptions, msgError );
3752+
return listStylesExternalMethod(mDataSource, ids, names, descriptions, msgError);
37533753
}
37543754

3755-
QString QgsVectorLayer::getStyleFromDatabase( QString styleId, QString &msgError )
3755+
QString QgsVectorLayer::getStyleFromDatabase(QString styleId, QString &msgError)
37563756
{
3757-
QgsProviderRegistry * pReg = QgsProviderRegistry::instance();
3758-
QLibrary *myLib = pReg->providerLibrary( mProviderKey );
3759-
if ( !myLib )
3760-
{
3761-
msgError = QObject::tr( "Unable to load %1 provider" ).arg( mProviderKey );
3762-
return QObject::tr( "" );
3763-
}
3764-
getStyleById_t* getStyleByIdMethod = ( getStyleById_t * ) cast_to_fptr( myLib->resolve( "getStyleById" ) );
3757+
QgsProviderRegistry * pReg = QgsProviderRegistry::instance();
3758+
QLibrary *myLib = pReg->providerLibrary( mProviderKey );
3759+
if ( !myLib )
3760+
{
3761+
msgError = QObject::tr( "Unable to load %1 provider" ).arg( mProviderKey );
3762+
return QObject::tr( "" );
3763+
}
3764+
getStyleById_t* getStyleByIdMethod = ( getStyleById_t * ) cast_to_fptr(myLib->resolve("getStyleById"));
37653765

3766-
if ( !getStyleByIdMethod )
3767-
{
3768-
delete myLib;
3769-
msgError = QObject::tr( "Provider %1 has no %2 method" ).arg( mProviderKey ).arg( "getStyleById" );
3770-
return QObject::tr( "" );
3771-
}
3766+
if ( !getStyleByIdMethod )
3767+
{
3768+
delete myLib;
3769+
msgError = QObject::tr( "Provider %1 has no getStyleById method" ).arg( mProviderKey );
3770+
return QObject::tr( "" );
3771+
}
37723772

3773-
return getStyleByIdMethod( mDataSource, styleId, msgError );
3773+
return getStyleByIdMethod( mDataSource, styleId, msgError );
37743774
}
37753775

37763776

3777-
void QgsVectorLayer::saveStyleToDatabase( QString name, QString description,
3778-
bool useAsDefault, QString uiFileContent, QString &msgError )
3779-
{
3777+
void QgsVectorLayer::saveStyleToDatabase(QString name, QString description,
3778+
bool useAsDefault, QString uiFileContent, QString &msgError){
37803779

3781-
QString sldStyle, qmlStyle;
3782-
QgsProviderRegistry * pReg = QgsProviderRegistry::instance();
3783-
QLibrary *myLib = pReg->providerLibrary( mProviderKey );
3784-
if ( !myLib )
3785-
{
3786-
msgError = QObject::tr( "Unable to load %1 provider" ).arg( mProviderKey );
3787-
return;
3788-
}
3789-
saveStyle_t* saveStyleExternalMethod = ( saveStyle_t * ) cast_to_fptr( myLib->resolve( "saveStyle" ) );
3780+
QString sldStyle, qmlStyle;
3781+
QgsProviderRegistry * pReg = QgsProviderRegistry::instance();
3782+
QLibrary *myLib = pReg->providerLibrary( mProviderKey );
3783+
if ( !myLib )
3784+
{
3785+
msgError = QObject::tr( "Unable to load %1 provider" ).arg( mProviderKey );
3786+
return;
3787+
}
3788+
saveStyle_t* saveStyleExternalMethod = ( saveStyle_t * ) cast_to_fptr(myLib->resolve("saveStyle"));
37903789

3791-
if ( !saveStyleExternalMethod )
3792-
{
3793-
delete myLib;
3794-
msgError = QObject::tr( "Provider %1 has no %2 method" ).arg( mProviderKey ).arg( "saveStyle" );
3795-
return;
3796-
}
3790+
if ( !saveStyleExternalMethod )
3791+
{
3792+
delete myLib;
3793+
msgError = QObject::tr( "Provider %1 has no saveStyle method" ).arg( mProviderKey );
3794+
return;
3795+
}
37973796

3798-
QDomDocument qmlDocument, sldDocument;
3799-
this->exportNamedStyle( qmlDocument, msgError );
3800-
if ( !msgError.isNull() )
3801-
{
3802-
return;
3803-
}
3804-
qmlStyle = qmlDocument.toString();
3797+
QDomDocument qmlDocument, sldDocument;
3798+
this->exportNamedStyle(qmlDocument, msgError);
3799+
if( !msgError.isNull() )
3800+
{
3801+
return;
3802+
}
3803+
qmlStyle = qmlDocument.toString();
38053804

3806-
this->exportSldStyle( sldDocument, msgError );
3807-
if ( !msgError.isNull() )
3808-
{
3809-
return;
3810-
}
3811-
sldStyle = sldDocument.toString();
3805+
this->exportSldStyle(sldDocument, msgError);
3806+
if( !msgError.isNull() )
3807+
{
3808+
return;
3809+
}
3810+
sldStyle = sldDocument.toString();
38123811

3813-
saveStyleExternalMethod( mDataSource, qmlStyle, sldStyle, name,
3814-
description, uiFileContent, useAsDefault, msgError );
3812+
saveStyleExternalMethod( mDataSource, qmlStyle, sldStyle, name,
3813+
description, uiFileContent, useAsDefault, msgError );
38153814
}
38163815

38173816

@@ -3823,60 +3822,60 @@ QString QgsVectorLayer::loadNamedStyle( const QString theURI, bool &theResultFla
38233822

38243823
QString QgsVectorLayer::loadNamedStyle( const QString theURI, bool &theResultFlag , bool loadFromLocalDB )
38253824
{
3826-
QgsDataSourceURI dsUri( theURI );
3827-
if ( !loadFromLocalDB && !dsUri.database().isEmpty() )
3828-
{
3829-
QgsProviderRegistry * pReg = QgsProviderRegistry::instance();
3830-
QLibrary *myLib = pReg->providerLibrary( mProviderKey );
3831-
if ( myLib )
3825+
QgsDataSourceURI dsUri( theURI );
3826+
if ( !loadFromLocalDB && !dsUri.database().isEmpty() )
38323827
{
3833-
loadStyle_t* loadStyleExternalMethod = ( loadStyle_t * ) cast_to_fptr( myLib->resolve( "loadStyle" ) );
3834-
if ( loadStyleExternalMethod )
3835-
{
3836-
QString qml, errorMsg;
3837-
qml = loadStyleExternalMethod( mDataSource, errorMsg );
3838-
if ( !qml.isEmpty() )
3828+
QgsProviderRegistry * pReg = QgsProviderRegistry::instance();
3829+
QLibrary *myLib = pReg->providerLibrary( mProviderKey );
3830+
if ( myLib )
38393831
{
3840-
theResultFlag = this->applyNamedStyle( qml, errorMsg );
3832+
loadStyle_t* loadStyleExternalMethod = ( loadStyle_t * ) cast_to_fptr( myLib->resolve( "loadStyle" ) );
3833+
if ( loadStyleExternalMethod )
3834+
{
3835+
QString qml, errorMsg;
3836+
qml = loadStyleExternalMethod( mDataSource, errorMsg );
3837+
if( !qml.isEmpty() )
3838+
{
3839+
theResultFlag = this->applyNamedStyle( qml, errorMsg );
3840+
}
3841+
}
38413842
}
3842-
}
3843-
}
38443843

3845-
}
3846-
if ( !theResultFlag )
3847-
{
3848-
return QgsMapLayer::loadNamedStyle( theURI, theResultFlag );
3849-
}
3850-
return QObject::tr( "Loaded from Provider" );
3844+
}
3845+
if( !theResultFlag )
3846+
{
3847+
return QgsMapLayer::loadNamedStyle( theURI, theResultFlag );
3848+
}
3849+
return QObject::tr( "Loaded from Provider" );
38513850
}
38523851

3853-
bool QgsVectorLayer::applyNamedStyle( QString namedStyle, QString errorMsg )
3852+
bool QgsVectorLayer::applyNamedStyle(QString namedStyle, QString errorMsg )
38543853
{
3855-
QDomDocument myDocument( "qgis" );
3856-
myDocument.setContent( namedStyle );
3854+
QDomDocument myDocument( "qgis" );
3855+
myDocument.setContent( namedStyle );
38573856

3858-
QDomElement myRoot = myDocument.firstChildElement( "qgis" );
3857+
QDomElement myRoot = myDocument.firstChildElement( "qgis" );
38593858

3860-
if ( myRoot.isNull() )
3861-
{
3862-
errorMsg = tr( "Error: qgis element could not be found" );
3863-
return false;
3864-
}
3865-
toggleScaleBasedVisibility( myRoot.attribute( "hasScaleBasedVisibilityFlag" ).toInt() == 1 );
3866-
setMinimumScale( myRoot.attribute( "minimumScale" ).toFloat() );
3867-
setMaximumScale( myRoot.attribute( "maximumScale" ).toFloat() );
3859+
if( myRoot.isNull() )
3860+
{
3861+
errorMsg = tr( "Error: qgis element could not be found" );
3862+
return false;
3863+
}
3864+
toggleScaleBasedVisibility( myRoot.attribute( "hasScaleBasedVisibilityFlag" ).toInt() == 1 );
3865+
setMinimumScale( myRoot.attribute( "minimumScale" ).toFloat() );
3866+
setMaximumScale( myRoot.attribute( "maximumScale" ).toFloat() );
38683867

3869-
#if 0
3870-
//read transparency level
3871-
QDomNode transparencyNode = myRoot.namedItem( "transparencyLevelInt" );
3872-
if ( ! transparencyNode.isNull() )
3873-
{
3874-
// set transparency level only if it's in project
3875-
// (otherwise it sets the layer transparent)
3876-
QDomElement myElement = transparencyNode.toElement();
3877-
setTransparency( myElement.text().toInt() );
3878-
}
3879-
#endif
3868+
#if 0
3869+
//read transparency level
3870+
QDomNode transparencyNode = myRoot.namedItem( "transparencyLevelInt" );
3871+
if ( ! transparencyNode.isNull() )
3872+
{
3873+
// set transparency level only if it's in project
3874+
// (otherwise it sets the layer transparent)
3875+
QDomElement myElement = transparencyNode.toElement();
3876+
setTransparency( myElement.text().toInt() );
3877+
}
3878+
#endif
38803879

3881-
return readSymbology( myRoot, errorMsg );
3880+
return readSymbology( myRoot, errorMsg );
38823881
}

‎src/providers/postgres/qgspostgresprovider.cpp

Lines changed: 217 additions & 210 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include <qgsmessagelog.h>
2424
#include <qgsrectangle.h>
2525
#include <qgscoordinatereferencesystem.h>
26+
#include <QMessageBox>
2627

2728
#include "qgsvectorlayerimport.h"
2829
#include "qgsprovidercountcalcevent.h"
@@ -3169,7 +3170,7 @@ QGISEXTERN bool deleteLayer( const QString& uri, QString& errCause )
31693170
}
31703171
schemaTableName += QgsPostgresConn::quotedIdentifier( tableName );
31713172

3172-
QgsPostgresConn *conn = QgsPostgresConn::connectDb( dsUri.connectionInfo(), false );
3173+
QgsPostgresConn* conn = QgsPostgresConn::connectDb( dsUri.connectionInfo(), false );
31733174
if ( !conn )
31743175
{
31753176
errCause = QObject::tr( "Connection to database failed" );
@@ -3231,254 +3232,260 @@ QGISEXTERN bool saveStyle( const QString& uri, const QString& qmlStyle, const QS
32313232
const QString& uiFileContent, bool useAsDefault, QString& errCause )
32323233
{
32333234
QgsDataSourceURI dsUri( uri );
3235+
QString f_table_catalog, f_table_schema, f_table_name, f_geometry_column, owner, isdef, name, desc;
3236+
QString styleTableName = QObject::tr( "layer_styles" );
3237+
QgsPostgresResult res;
32343238

3235-
QgsPostgresConn *conn = QgsPostgresConn::connectDb( dsUri.connectionInfo(), false );
3239+
QgsPostgresConn* conn = QgsPostgresConn::connectDb( dsUri.connectionInfo(), false );
32363240
if ( !conn )
32373241
{
32383242
errCause = QObject::tr( "Connection to database failed" );
32393243
return false;
32403244
}
32413245

3242-
QgsPostgresResult res = conn->PQexec( "SELECT COUNT(*) FROM information_schema.tables WHERE table_name='layer_styles'" );
3243-
if ( res.PQgetvalue( 0, 0 ).toInt() == 0 )
3244-
{
3245-
res = conn->PQexec( "CREATE TABLE layer_styles("
3246-
"id SERIAL PRIMARY KEY"
3247-
",f_table_catalog varchar(256)"
3248-
",f_table_schema varchar(256)"
3249-
",f_table_name varchar(256)"
3250-
",f_geometry_column varchar(256)"
3251-
",styleName varchar(30)"
3252-
",styleQML xml"
3253-
",styleSLD xml"
3254-
",useAsDefault boolean"
3255-
",description text"
3256-
",owner varchar(30)"
3257-
",ui xml"
3258-
",update_time timestamp DEFAULT CURRENT_TIMESTAMP"
3259-
")" );
3260-
if ( res.PQresultStatus() != PGRES_COMMAND_OK )
3261-
{
3262-
errCause = QObject::tr( "Unable to save layer style. It's not possible to create the destination table on the database. Maybe this is due to table permissions (user=%1). Please contact your database admin" ).arg( dsUri.username() );
3263-
conn->disconnect();
3264-
return false;
3265-
}
3266-
}
3267-
3268-
QString uiFileColumn;
3269-
QString uiFileValue;
3270-
if ( !uiFileContent.isEmpty() )
3271-
{
3272-
uiFileColumn = ",ui";
3273-
uiFileValue = QString( ",XMLPARSE(DOCUMENT %1)" ).arg( QgsPostgresConn::quotedValue( uiFileContent ) );
3274-
}
3275-
3276-
QString sql = QString( "INSERT INTO layer_styles("
3277-
"f_table_catalog,f_table_schema,f_table_name,f_geometry_column,styleName,styleQML,styleSLD,useAsDefault,description,owner%11"
3278-
") VALUES ("
3279-
"%1,%2,%3,%4,%5,XMLPARSE(DOCUMENT %6),XMLPARSE(DOCUMENT %7),%8,%9,%10%12"
3280-
")" )
3281-
.arg( QgsPostgresConn::quotedValue( dsUri.database() ) )
3282-
.arg( QgsPostgresConn::quotedValue( dsUri.schema() ) )
3283-
.arg( QgsPostgresConn::quotedValue( dsUri.table() ) )
3284-
.arg( QgsPostgresConn::quotedValue( dsUri.geometryColumn() ) )
3285-
.arg( QgsPostgresConn::quotedValue( styleName.isEmpty() ? dsUri.table() : styleName ) )
3286-
.arg( QgsPostgresConn::quotedValue( qmlStyle ) )
3287-
.arg( QgsPostgresConn::quotedValue( sldStyle ) )
3288-
.arg( useAsDefault ? "true" : "false" )
3289-
.arg( QgsPostgresConn::quotedValue( styleDescription.isEmpty() ? QDateTime::currentDateTime().toString() : styleDescription ) )
3290-
.arg( QgsPostgresConn::quotedValue( dsUri.username() ) )
3291-
.arg( uiFileColumn )
3292-
.arg( uiFileValue );
3293-
3294-
QString checkQuery = QString( "SELECT styleName"
3295-
" FROM layer_styles"
3296-
" WHERE f_table_catalog=%1"
3297-
" AND f_table_schema=%2"
3298-
" AND f_table_name=%3"
3299-
" AND f_geometry_column=%4"
3300-
" AND styleName=%5" )
3301-
.arg( QgsPostgresConn::quotedValue( dsUri.database() ) )
3302-
.arg( QgsPostgresConn::quotedValue( dsUri.schema() ) )
3303-
.arg( QgsPostgresConn::quotedValue( dsUri.table() ) )
3304-
.arg( QgsPostgresConn::quotedValue( dsUri.geometryColumn() ) )
3305-
.arg( QgsPostgresConn::quotedValue( styleName.isEmpty() ? dsUri.table() : styleName ) );
3306-
3307-
res = conn->PQexec( checkQuery );
3308-
if ( res.PQntuples() > 0 )
3309-
{
3310-
sql = QString( "UPDATE layer_styles"
3311-
" SET useAsDefault=%1"
3312-
",styleQML=XMLPARSE(DOCUMENT %2)"
3313-
",styleSLD=XMLPARSE(DOCUMENT %3)"
3314-
",description=%4"
3315-
",owner=%5"
3316-
" WHERE f_table_catalog=%6"
3317-
" AND f_table_schema=%7"
3318-
" AND f_table_name=%8"
3319-
" AND f_geometry_column=%9"
3320-
" AND styleName=%10" )
3321-
.arg( useAsDefault ? "true" : "false" )
3322-
.arg( QgsPostgresConn::quotedValue( qmlStyle ) )
3323-
.arg( QgsPostgresConn::quotedValue( sldStyle ) )
3324-
.arg( QgsPostgresConn::quotedValue( styleDescription.isEmpty() ? QDateTime::currentDateTime().toString() : styleDescription ) )
3325-
.arg( QgsPostgresConn::quotedValue( dsUri.username() ) )
3326-
.arg( QgsPostgresConn::quotedValue( dsUri.database() ) )
3327-
.arg( QgsPostgresConn::quotedValue( dsUri.schema() ) )
3328-
.arg( QgsPostgresConn::quotedValue( dsUri.table() ) )
3329-
.arg( QgsPostgresConn::quotedValue( dsUri.geometryColumn() ) )
3330-
.arg( QgsPostgresConn::quotedValue( styleName.isEmpty() ? dsUri.table() : styleName ) );
3331-
}
3332-
3333-
if ( useAsDefault )
3334-
{
3335-
QString removeDefaultSql = QString( "UPDATE layer_styles"
3336-
" SET useAsDefault=false"
3337-
" WHERE f_table_catalog=%1"
3338-
" AND f_table_schema=%2"
3339-
" AND f_table_name=%3"
3340-
" AND f_geometry_column=%4" )
3341-
.arg( QgsPostgresConn::quotedValue( dsUri.database() ) )
3342-
.arg( QgsPostgresConn::quotedValue( dsUri.schema() ) )
3343-
.arg( QgsPostgresConn::quotedValue( dsUri.table() ) )
3344-
.arg( QgsPostgresConn::quotedValue( dsUri.geometryColumn() ) );
3345-
sql = QString( "BEGIN; %1; %2; COMMIT;" ).arg( removeDefaultSql ).arg( sql );
3246+
QString checkExitingTableQuery = QObject::tr( "SELECT COUNT(*) FROM information_schema.tables WHERE table_name='%1'" ).arg( styleTableName );
3247+
3248+
PGresult* result = conn->PQexec( checkExitingTableQuery );
3249+
char* c = PQgetvalue( result, 0, 0 );
3250+
if( *c == '0' )
3251+
{
3252+
QString createTabeQuery = QObject::tr( "CREATE TABLE public.%1 (id SERIAL PRIMARY KEY, f_table_catalog varchar(256), f_table_schema varchar(256), f_table_name varchar(256), f_geometry_column varchar(256), styleName varchar(30), styleQML xml, styleSLD xml, useAsDefault boolean, description text, owner varchar(30), ui xml, update_time timestamp DEFAULT CURRENT_TIMESTAMP );" ).arg( styleTableName );
3253+
3254+
res = conn->PQexec( createTabeQuery );
3255+
if ( res.PQresultStatus() != PGRES_COMMAND_OK )
3256+
{
3257+
errCause = QObject::tr( "Unable to save layer style. It's not possible to create the destination table on the database. Maybe this is due to table permissions (user=%1). Please contact your database admin" ).arg( dsUri.username() );
3258+
conn->disconnect();
3259+
return false;
3260+
}
3261+
}
3262+
3263+
f_table_catalog = dsUri.database();
3264+
f_table_schema = dsUri.schema();
3265+
f_table_name = dsUri.table();
3266+
f_geometry_column = dsUri.geometryColumn();
3267+
owner = dsUri.username();
3268+
isdef = (useAsDefault) ? QObject::tr( "true" ) : QObject::tr( "false" );
3269+
name = ( styleName.isEmpty() ) ? dsUri.table() : styleName;
3270+
desc = ( styleDescription.isEmpty() ) ? QDateTime::currentDateTime().toString() : styleDescription;
3271+
3272+
QString uiFileColumn( "" );
3273+
QString uiFileValue( "" );
3274+
if( !uiFileContent.isEmpty() )
3275+
{
3276+
uiFileColumn.append( QObject::tr( ", ui" ) );
3277+
uiFileValue.append( QObject::tr( ",XMLPARSE(DOCUMENT %1)" ).arg( QgsPostgresConn::quotedValue( uiFileContent ) ) );
3278+
}
3279+
3280+
QString sql = QObject::tr( "INSERT INTO %1 ( f_table_catalog, "
3281+
"f_table_schema, f_table_name, f_geometry_column, "
3282+
"styleName, styleQML, styleSLD, useAsDefault, "
3283+
"description, owner %12) "
3284+
"VALUES(%2,%3,%4,%5,%6,XMLPARSE(DOCUMENT %7),"
3285+
"XMLPARSE(DOCUMENT %8),%9,%10,%11 %13);" )
3286+
.arg( styleTableName )
3287+
.arg( QgsPostgresConn::quotedValue( f_table_catalog ) )
3288+
.arg( QgsPostgresConn::quotedValue( f_table_schema ) )
3289+
.arg( QgsPostgresConn::quotedValue( f_table_name ) )
3290+
.arg( QgsPostgresConn::quotedValue( f_geometry_column ) )
3291+
.arg( QgsPostgresConn::quotedValue( name ) )
3292+
.arg( QgsPostgresConn::quotedValue( qmlStyle ) )
3293+
.arg( QgsPostgresConn::quotedValue( sldStyle ) )
3294+
.arg( isdef )
3295+
.arg( QgsPostgresConn::quotedValue( desc ) )
3296+
.arg( QgsPostgresConn::quotedValue( owner ) )
3297+
.arg( uiFileColumn )
3298+
.arg( uiFileValue );
3299+
3300+
QString checkQuery = QObject::tr( "SELECT styleName FROM %1 WHERE f_table_catalog=%2 AND f_table_schema=%3 AND f_table_name=%4 AND f_geometry_column=%5 AND styleName=%6" )
3301+
.arg( styleTableName )
3302+
.arg( QgsPostgresConn::quotedValue( f_table_catalog ) )
3303+
.arg( QgsPostgresConn::quotedValue( f_table_schema ) )
3304+
.arg( QgsPostgresConn::quotedValue(f_table_name ) )
3305+
.arg( QgsPostgresConn::quotedValue(f_geometry_column ) )
3306+
.arg( QgsPostgresConn::quotedValue( name ) );
3307+
3308+
result = conn->PQexec( checkQuery );
3309+
if( PQntuples( result ) > 0 )
3310+
{
3311+
3312+
QString message = QObject::tr( "A style named \"%1\" already exists in the database for this layer. Do you want to overwrite it?" ).arg( name );
3313+
QMessageBox* duplicateMessageBox = new QMessageBox( QMessageBox::Question, "Save style in database", message, QMessageBox::Yes|QMessageBox::No );
3314+
3315+
if( duplicateMessageBox->exec() == QMessageBox::No ){
3316+
errCause = QObject::tr( "Operation aborted. No changes were made in the database" );
3317+
return false;
3318+
}
3319+
3320+
sql = QObject::tr( "UPDATE %1 SET useAsDefault=%2, styleQML=XMLPARSE(DOCUMENT %3), styleSLD=XMLPARSE(DOCUMENT %4), description=%5, owner=%6 WHERE f_table_catalog=%7 AND f_table_schema=%8 AND f_table_name=%9 AND f_geometry_column=%10 AND styleName=%11;")
3321+
.arg( styleTableName )
3322+
.arg( isdef )
3323+
.arg( QgsPostgresConn::quotedValue( qmlStyle
3324+
) )
3325+
.arg( QgsPostgresConn::quotedValue( sldStyle ) )
3326+
.arg( QgsPostgresConn::quotedValue( desc ) )
3327+
.arg( QgsPostgresConn::quotedValue( owner ) )
3328+
.arg( QgsPostgresConn::quotedValue( f_table_catalog ) )
3329+
.arg( QgsPostgresConn::quotedValue( f_table_schema ) )
3330+
.arg( QgsPostgresConn::quotedValue( f_table_name ) )
3331+
.arg( QgsPostgresConn::quotedValue( f_geometry_column ) )
3332+
.arg( QgsPostgresConn::quotedValue( name ) );
3333+
}
3334+
3335+
if( useAsDefault )
3336+
{
3337+
QString removeDefaultSql = QObject::tr( "UPDATE %1 SET useAsDefault=false WHERE f_table_catalog=%2 AND f_table_schema=%3 AND f_table_name=%4 AND f_geometry_column=%5;")
3338+
.arg( styleTableName )
3339+
.arg( QgsPostgresConn::quotedValue( f_table_catalog ) )
3340+
.arg( QgsPostgresConn::quotedValue( f_table_schema ) )
3341+
.arg( QgsPostgresConn::quotedValue(f_table_name ) )
3342+
.arg( QgsPostgresConn::quotedValue(f_geometry_column ) );
3343+
sql = QObject::tr("BEGIN; %1 %2 COMMIT;")
3344+
.arg( removeDefaultSql ).arg( sql );
33463345
}
33473346

33483347
res = conn->PQexec( sql );
33493348
conn->disconnect();
33503349
if ( res.PQresultStatus() != PGRES_COMMAND_OK )
33513350
{
3352-
errCause = QObject::tr( "Unable to save layer style. It's not possible to insert a new record into the style table. Maybe this is due to table permissions (user=%1). Please contact your database administrator." ).arg( dsUri.username() );
3351+
errCause = QObject::tr( "Unable to save layer style. It's not possible to insert a new record in style table. Maybe this is due to table permissions (user=%1). Please contact your database admin" ).arg( owner );
33533352
return false;
33543353
}
3355-
33563354
return true;
33573355
}
33583356

33593357

33603358
QGISEXTERN QString loadStyle( const QString& uri, QString& errCause )
33613359
{
3362-
QgsDataSourceURI dsUri( uri );
3360+
QgsDataSourceURI dsUri( uri );
3361+
QString styleTableName = QObject::tr( "layer_styles" );
3362+
QString f_table_catalog, f_table_schema, f_table_name, f_geometry_column;
33633363

3364-
QgsPostgresConn *conn = QgsPostgresConn::connectDb( dsUri.connectionInfo(), false );
3365-
if ( !conn )
3366-
{
3367-
errCause = QObject::tr( "Connection to database failed" );
3368-
return "";
3369-
}
3364+
QgsPostgresConn* conn = QgsPostgresConn::connectDb( dsUri.connectionInfo(), false );
3365+
if ( !conn )
3366+
{
3367+
errCause = QObject::tr( "Connection to database failed" );
3368+
return QObject::tr( "" );
3369+
}
3370+
3371+
f_table_catalog = dsUri.database();
3372+
f_table_schema = dsUri.schema();
3373+
f_table_name = dsUri.table();
3374+
f_geometry_column = dsUri.geometryColumn();
33703375

3371-
QString selectQmlQuery = QString( "SELECT styleQML"
3372-
" FROM layer_styles"
3373-
" WHERE f_table_catalog=%1"
3374-
" AND f_table_schema=%2"
3375-
" AND f_table_name=%3"
3376-
" AND f_geometry_column=%4"
3377-
" ORDER BY CASE WHEN useAsDefault THEN 1 ELSE 2 END"
3378-
",update_time DESC LIMIT 1" )
3379-
.arg( QgsPostgresConn::quotedValue( dsUri.database() ) )
3380-
.arg( QgsPostgresConn::quotedValue( dsUri.schema() ) )
3381-
.arg( QgsPostgresConn::quotedValue( dsUri.table() ) )
3382-
.arg( QgsPostgresConn::quotedValue( dsUri.geometryColumn() ) );
3376+
QString selectQmlQuery = QObject::tr( "SELECT styleQML FROM %1 WHERE f_table_catalog=%2 AND f_table_schema=%3 AND f_table_name=%4 AND f_geometry_column=%5 ORDER BY (CASE WHEN useAsDefault THEN 1 ELSE 2 END), update_time DESC LIMIT 1;")
3377+
.arg( styleTableName )
3378+
.arg( QgsPostgresConn::quotedValue( f_table_catalog ) )
3379+
.arg( QgsPostgresConn::quotedValue( f_table_schema ) )
3380+
.arg( QgsPostgresConn::quotedValue( f_table_name ) )
3381+
.arg( QgsPostgresConn::quotedValue( f_geometry_column ) );
33833382

3384-
QgsPostgresResult result = conn->PQexec( selectQmlQuery );
3383+
PGresult* result = conn->PQexec( selectQmlQuery );
3384+
if( PQntuples(result) == 1 )
3385+
{
3386+
char* c = PQgetvalue( result, 0, 0 );
3387+
return QObject::tr( c );;
3388+
}
33853389

3386-
return result.PQntuples() == 1 ? result.PQgetvalue( 0, 0 ) : "";
3390+
return QObject::tr( "" );
33873391
}
33883392

3389-
QGISEXTERN int listStyles( const QString &uri, QStringList &ids, QStringList &names,
3390-
QStringList &descriptions, QString& errCause )
3393+
QGISEXTERN int listStyles( const QString& uri, QVector<QString> &ids, QVector<QString> &names,
3394+
QVector<QString> &descriptions, QString& errCause )
33913395
{
3392-
QgsDataSourceURI dsUri( uri );
3396+
QgsDataSourceURI dsUri( uri );
3397+
QString styleTableName = QObject::tr( "layer_styles" );
3398+
QString f_table_catalog, f_table_schema, f_table_name, f_geometry_column;
33933399

3394-
QgsPostgresConn *conn = QgsPostgresConn::connectDb( dsUri.connectionInfo(), false );
3395-
if ( !conn )
3396-
{
3397-
errCause = QObject::tr( "Connection to database failed using username: %1" ).arg( dsUri.username() );
3398-
return -1;
3399-
}
3400+
QgsPostgresConn* conn = QgsPostgresConn::connectDb( dsUri.connectionInfo(), false );
3401+
if ( !conn )
3402+
{
3403+
errCause = QObject::tr( "Connection to database failed using username: %1" ).arg( dsUri.username() );
3404+
return -1;
3405+
}
34003406

3401-
// ORDER BY (CASE WHEN useAsDefault THEN 1 ELSE 2 END), update_time DESC;")
3402-
QString selectRelatedQuery = QString( "SELECT id,styleName,description"
3403-
" FROM layer_styles"
3404-
" WHERE f_table_catalog=%1"
3405-
" AND f_table_schema=%2"
3406-
" AND f_table_name=%3"
3407-
" AND f_geometry_column=%4" )
3408-
.arg( QgsPostgresConn::quotedValue( dsUri.database() ) )
3409-
.arg( QgsPostgresConn::quotedValue( dsUri.schema() ) )
3410-
.arg( QgsPostgresConn::quotedValue( dsUri.table() ) )
3411-
.arg( QgsPostgresConn::quotedValue( dsUri.geometryColumn() ) );
3407+
f_table_catalog = dsUri.database();
3408+
f_table_schema = dsUri.schema();
3409+
f_table_name = dsUri.table();
3410+
f_geometry_column = dsUri.geometryColumn();
34123411

3413-
QgsPostgresResult result = conn->PQexec( selectRelatedQuery );
3414-
if ( result.PQresultStatus() != PGRES_TUPLES_OK )
3415-
{
3416-
QgsMessageLog::logMessage( QObject::tr( "Error executing query: %1" ).arg( selectRelatedQuery ) );
3417-
errCause = QObject::tr( "Error executing the select query for related styles. The query was logged" );
3418-
return -1;
3419-
}
3412+
// ORDER BY (CASE WHEN useAsDefault THEN 1 ELSE 2 END), update_time DESC;")
3413+
QString selectRelatedQuery = QObject::tr( "SELECT id, styleName, description FROM %1 WHERE f_table_catalog=%2 AND f_table_schema=%3 AND f_table_name=%4 AND f_geometry_column=%5;" )
3414+
.arg( styleTableName )
3415+
.arg( QgsPostgresConn::quotedValue( f_table_catalog ) )
3416+
.arg( QgsPostgresConn::quotedValue( f_table_schema ) )
3417+
.arg( QgsPostgresConn::quotedValue( f_table_name ) )
3418+
.arg( QgsPostgresConn::quotedValue( f_geometry_column ) );
34203419

3421-
int numberOfRelatedStyles = result.PQntuples();
3422-
for ( int i = 0; i < numberOfRelatedStyles; i++ )
3423-
{
3424-
ids.append( result.PQgetvalue( i, 0 ) );
3425-
names.append( result.PQgetvalue( i, 1 ) );
3426-
descriptions.append( result.PQgetvalue( i, 2 ) );
3427-
}
3420+
PGresult* result = conn->PQexec( selectRelatedQuery );
3421+
if ( PQresultStatus( result ) != PGRES_TUPLES_OK )
3422+
{
3423+
QgsMessageLog::logMessage( QObject::tr( "Error executing query: %1" ).arg( selectRelatedQuery ) );
3424+
errCause = QObject::tr( "Error executing the select query for related styles. The query was logged" );
3425+
return -1;
3426+
}
3427+
int numberOfRelatedStyles = PQntuples( result );
3428+
for( int i=0; i<numberOfRelatedStyles; i++ )
3429+
{
3430+
ids.append( QObject::tr( PQgetvalue( result, i, 0 ) ) );
3431+
names.append( QObject::tr( PQgetvalue( result, i, 1 ) ) );
3432+
descriptions.append( QObject::tr( PQgetvalue( result, i, 2 ) ) );
3433+
}
34283434

3429-
QString selectOthersQuery = QString( "SELECT id,styleName,description"
3430-
" FROM layer_styles"
3431-
" WHERE NOT (f_table_catalog=%1 AND f_table_schema=%2 AND f_table_name=%3 AND f_geometry_column=%4)"
3432-
" ORDER BY update_time DESC" )
3433-
.arg( QgsPostgresConn::quotedValue( dsUri.database() ) )
3434-
.arg( QgsPostgresConn::quotedValue( dsUri.schema() ) )
3435-
.arg( QgsPostgresConn::quotedValue( dsUri.table() ) )
3436-
.arg( QgsPostgresConn::quotedValue( dsUri.geometryColumn() ) );
3435+
QString selectOthersQuery = QObject::tr( "SELECT id, styleName, description FROM %1 WHERE NOT(f_table_catalog=%2 AND f_table_schema=%3 AND f_table_name=%4 AND f_geometry_column=%5) ORDER BY update_time DESC;")
3436+
.arg( styleTableName )
3437+
.arg( QgsPostgresConn::quotedValue( f_table_catalog ) )
3438+
.arg( QgsPostgresConn::quotedValue( f_table_schema ) )
3439+
.arg( QgsPostgresConn::quotedValue( f_table_name ) )
3440+
.arg( QgsPostgresConn::quotedValue( f_geometry_column ) );
34373441

3438-
result = conn->PQexec( selectOthersQuery );
3439-
if ( result.PQresultStatus() != PGRES_TUPLES_OK )
3440-
{
3441-
QgsMessageLog::logMessage( QObject::tr( "Error executing query: %1" ).arg( selectOthersQuery ) );
3442-
errCause = QObject::tr( "Error executing the select query for unrelated styles. The query was logged" );
3443-
return -1;
3444-
}
3445-
for ( int i = 0; i < result.PQntuples(); i++ )
3446-
{
3447-
ids.append( result.PQgetvalue( i, 0 ) );
3448-
names.append( result.PQgetvalue( i, 1 ) );
3449-
descriptions.append( result.PQgetvalue( i, 2 ) );
3450-
}
3442+
result = conn->PQexec( selectOthersQuery );
3443+
if ( PQresultStatus( result ) != PGRES_TUPLES_OK )
3444+
{
3445+
QgsMessageLog::logMessage( QObject::tr( "Error executing query: %1" ).arg( selectOthersQuery ) );
3446+
errCause = QObject::tr( "Error executing the select query for unrelated styles. The query was logged" );
3447+
return -1;
3448+
}
3449+
for( int i=0; i<PQntuples( result ); i++ )
3450+
{
3451+
ids.append( QObject::tr( PQgetvalue( result, i, 0 ) ) );
3452+
names.append( QObject::tr( PQgetvalue( result, i, 1 ) ) );
3453+
descriptions.append( QObject::tr( PQgetvalue( result, i, 2 ) ) );
3454+
}
34513455

3452-
return numberOfRelatedStyles;
3456+
return numberOfRelatedStyles;
34533457
}
34543458

3455-
QGISEXTERN QString getStyleById( const QString& uri, QString styleId, QString& errCause )
3459+
QGISEXTERN QString getStyleById(const QString& uri, QString styleId, QString& errCause )
34563460
{
3457-
QgsDataSourceURI dsUri( uri );
3461+
QgsDataSourceURI dsUri( uri );
3462+
QString styleTableName = QObject::tr( "layer_styles" );
34583463

3459-
QgsPostgresConn *conn = QgsPostgresConn::connectDb( dsUri.connectionInfo(), false );
3460-
if ( !conn )
3461-
{
3462-
errCause = QObject::tr( "Connection to database failed using username: %1" ).arg( dsUri.username() );
3463-
return QObject::tr( "" );
3464-
}
3464+
QgsPostgresConn* conn = QgsPostgresConn::connectDb( dsUri.connectionInfo(), false );
3465+
if ( !conn )
3466+
{
3467+
errCause = QObject::tr( "Connection to database failed using username: %1" ).arg( dsUri.username() );
3468+
return QObject::tr( "" );
3469+
}
34653470

3466-
QString selectQmlQuery = QString( "SELECT styleQml FROM layer_styles WHERE id=%1" ).arg( QgsPostgresConn::quotedValue( styleId ) );
3467-
QgsPostgresResult result = conn->PQexec( selectQmlQuery );
3468-
if ( result.PQresultStatus() != PGRES_TUPLES_OK )
3469-
{
3470-
QgsMessageLog::logMessage( QObject::tr( "Error executing query: %1" ).arg( selectQmlQuery ) );
3471-
errCause = QObject::tr( "Error executing the select query. The query was logged" );
3472-
return "";
3473-
}
3471+
QString selectQmlQuery = QObject::tr( "SELECT styleQml FROM %1 WHERE id=%2")
3472+
.arg( styleTableName )
3473+
.arg( styleId );
3474+
PGresult* result = conn->PQexec( selectQmlQuery );
3475+
if ( PQresultStatus( result ) != PGRES_TUPLES_OK )
3476+
{
3477+
QgsMessageLog::logMessage( QObject::tr( "Error executing query: %1" ).arg( selectQmlQuery ) );
3478+
errCause = QObject::tr( "Error executing the select query. The query was logged" );
3479+
return QObject::tr( "" );
3480+
}
3481+
if( PQntuples( result ) == 1)
3482+
{
3483+
return PQgetvalue( result, 0, 0 );
3484+
}
3485+
else
3486+
{
3487+
errCause = QObject::tr( "Consistence error in table '%1'. Style id should be unique" ).arg( styleTableName );
3488+
return QObject::tr( "" );
3489+
}
34743490

3475-
if ( result.PQntuples() == 1 )
3476-
{
3477-
return result.PQgetvalue( 0, 0 );
3478-
}
3479-
else
3480-
{
3481-
errCause = QObject::tr( "Consistency error in table '%1'. Style id should be unique" ).arg( "layer_styles" );
3482-
return "";
3483-
}
34843491
}

0 commit comments

Comments
 (0)
Please sign in to comment.