From cdc9ae7c5d19b7ab3cf05b6b65f38f3666a16a2d Mon Sep 17 00:00:00 2001 From: jef Date: Thu, 24 Feb 2011 17:53:50 +0000 Subject: [PATCH] implement #3522 git-svn-id: http://svn.osgeo.org/qgis/trunk@15258 c8812cc2-4d05-0410-92ff-de0c093fc19c --- python/core/qgsdatasourceuri.sip | 11 ++++++ src/app/postgres/qgspgnewconnection.cpp | 24 +++++++++--- src/app/postgres/qgspgsourceselect.cpp | 31 +++++++++------ src/core/qgsdatasourceuri.cpp | 51 +++++++++++++++++++------ src/core/qgsdatasourceuri.h | 17 ++++++++- src/ui/qgspgnewconnectionbase.ui | 50 ++++++++++++++++-------- 6 files changed, 137 insertions(+), 47 deletions(-) diff --git a/python/core/qgsdatasourceuri.sip b/python/core/qgsdatasourceuri.sip index 4889814cd9a..a19f86d9606 100644 --- a/python/core/qgsdatasourceuri.sip +++ b/python/core/qgsdatasourceuri.sip @@ -39,6 +39,14 @@ public: const QString& aPassword, SSLmode sslmode = SSLprefer ); + //! Set all connection related members at once + //! \note added in 1.7 + void setConnection(const QString& service, + const QString& aDatabase, + const QString& aUsername, + const QString& aPassword, + SSLmode sslmode = SSLprefer ); + //! Set database //! \note added in 1.4 void setDatabase( const QString &database ); @@ -73,6 +81,9 @@ public: QString port() const; SSLmode sslMode() const; + // added in 1.7 + QString service() const; + void setSql(QString sql); // added in 1.2 diff --git a/src/app/postgres/qgspgnewconnection.cpp b/src/app/postgres/qgspgnewconnection.cpp index 20108be23ed..a3527a516d8 100644 --- a/src/app/postgres/qgspgnewconnection.cpp +++ b/src/app/postgres/qgspgnewconnection.cpp @@ -48,14 +48,15 @@ QgsPgNewConnection::QgsPgNewConnection( QWidget *parent, const QString& connName QSettings settings; QString key = "/PostgreSQL/connections/" + connName; + txtService->setText( settings.value( key + "/service" ).toString() ); txtHost->setText( settings.value( key + "/host" ).toString() ); - txtDatabase->setText( settings.value( key + "/database" ).toString() ); QString port = settings.value( key + "/port" ).toString(); if ( port.length() == 0 ) { port = "5432"; } txtPort->setText( port ); + txtDatabase->setText( settings.value( key + "/database" ).toString() ); cb_publicSchemaOnly->setChecked( settings.value( key + "/publicOnly", false ).toBool() ); cb_geometryColumnsOnly->setChecked( settings.value( key + "/geometrycolumnsOnly", false ).toBool() ); cb_allowGeometrylessTables->setChecked( settings.value( key + "/allowGeometrylessTables", false ).toBool() ); @@ -102,7 +103,8 @@ void QgsPgNewConnection::accept() // warn if entry was renamed to an existing connection if (( mOriginalConnName.isNull() || mOriginalConnName != txtName->text() ) && - settings.contains( baseKey + txtName->text() + "/host" ) && + ( settings.contains( baseKey + txtName->text() + "/service" ) || + settings.contains( baseKey + txtName->text() + "/host" ) ) && QMessageBox::question( this, tr( "Save connection" ), tr( "Should the existing connection %1 be overwritten?" ).arg( txtName->text() ), @@ -119,9 +121,10 @@ void QgsPgNewConnection::accept() } baseKey += txtName->text(); + settings.setValue( baseKey + "/service", txtService->text() ); settings.setValue( baseKey + "/host", txtHost->text() ); - settings.setValue( baseKey + "/database", txtDatabase->text() ); settings.setValue( baseKey + "/port", txtPort->text() ); + settings.setValue( baseKey + "/database", txtDatabase->text() ); settings.setValue( baseKey + "/username", chkStoreUsername->isChecked() ? txtUsername->text() : "" ); settings.setValue( baseKey + "/password", chkStorePassword->isChecked() ? txtPassword->text() : "" ); settings.setValue( baseKey + "/publicOnly", cb_publicSchemaOnly->isChecked() ); @@ -160,9 +163,18 @@ QgsPgNewConnection::~QgsPgNewConnection() void QgsPgNewConnection::testConnection() { QgsDataSourceURI uri; - uri.setConnection( txtHost->text(), txtPort->text(), txtDatabase->text(), - txtUsername->text(), txtPassword->text(), - ( QgsDataSourceURI::SSLmode ) cbxSSLmode->itemData( cbxSSLmode->currentIndex() ).toInt() ); + if ( !txtService->text().isEmpty() ) + { + uri.setConnection( txtService->text(), txtDatabase->text(), + txtUsername->text(), txtPassword->text(), + ( QgsDataSourceURI::SSLmode ) cbxSSLmode->itemData( cbxSSLmode->currentIndex() ).toInt() ); + } + else + { + uri.setConnection( txtHost->text(), txtPort->text(), txtDatabase->text(), + txtUsername->text(), txtPassword->text(), + ( QgsDataSourceURI::SSLmode ) cbxSSLmode->itemData( cbxSSLmode->currentIndex() ).toInt() ); + } QString conninfo = uri.connectionInfo(); QgsDebugMsg( "PQconnectdb(\"" + conninfo + "\");" ); diff --git a/src/app/postgres/qgspgsourceselect.cpp b/src/app/postgres/qgspgsourceselect.cpp index 6c4728001b7..022e94591f5 100644 --- a/src/app/postgres/qgspgsourceselect.cpp +++ b/src/app/postgres/qgspgsourceselect.cpp @@ -137,11 +137,12 @@ void QgsPgSourceSelect::on_btnDelete_clicked() if ( QMessageBox::Ok != QMessageBox::information( this, tr( "Confirm Delete" ), msg, QMessageBox::Ok | QMessageBox::Cancel ) ) return; + settings.remove( key + "/service" ); settings.remove( key + "/host" ); + settings.remove( key + "/port" ); settings.remove( key + "/database" ); settings.remove( key + "/username" ); settings.remove( key + "/password" ); - settings.remove( key + "/port" ); settings.remove( key + "/sslmode" ); settings.remove( key + "/publicOnly" ); settings.remove( key + "/geometryColumnsOnly" ); @@ -415,17 +416,23 @@ void QgsPgSourceSelect::on_btnConnect_clicked() QString key = "/PostgreSQL/connections/" + cmbConnections->currentText(); - QString database = settings.value( key + "/database" ).toString(); - QString username = settings.value( key + "/username" ).toString(); - QString password = settings.value( key + "/password" ).toString(); + QString service = settings.value( key + "/service" ).toString(); + QString host = settings.value( key + "/host" ).toString(); + QString port = settings.value( key + "/port" ).toString(); + QString database = settings.value( key + "/database" ).toString(); + QString username = settings.value( key + "/username" ).toString(); + QString password = settings.value( key + "/password" ).toString(); + QgsDataSourceURI::SSLmode sslmode = ( QgsDataSourceURI::SSLmode ) settings.value( key + "/sslmode", QgsDataSourceURI::SSLprefer ).toInt(); QgsDataSourceURI uri; - uri.setConnection( settings.value( key + "/host" ).toString(), - settings.value( key + "/port" ).toString(), - database, - username, - password, - ( QgsDataSourceURI::SSLmode ) settings.value( key + "/sslmode", QgsDataSourceURI::SSLprefer ).toInt() ); + if ( !service.isEmpty() ) + { + uri.setConnection( service, database, username, password, sslmode ); + } + else + { + uri.setConnection( host, port, database, username, password, sslmode ); + } bool searchPublicOnly = settings.value( key + "/publicOnly" ).toBool(); bool searchGeometryColumnsOnly = settings.value( key + "/geometryColumnsOnly" ).toBool(); @@ -511,7 +518,9 @@ void QgsPgSourceSelect::on_btnConnect_clicked() "Check your username and password and try again.\n\n" "The database said:\n%3" ) .arg( settings.value( key + "/database" ).toString() ) - .arg( settings.value( key + "/host" ).toString() ) + .arg( !settings.value( key + "/service" ).toString().isEmpty() + ? settings.value( key + "/service" ).toString() + : settings.value( key + "/host" ).toString() ) .arg( QString::fromUtf8( PQerrorMessage( pd ) ) ) ); } diff --git a/src/core/qgsdatasourceuri.cpp b/src/core/qgsdatasourceuri.cpp index 685e7b0a88c..414e661f017 100644 --- a/src/core/qgsdatasourceuri.cpp +++ b/src/core/qgsdatasourceuri.cpp @@ -118,7 +118,7 @@ QgsDataSourceURI::QgsDataSourceURI( QString uri ) : mSSLmode( SSLprefer ), mKeyC } else if ( pname == "service" ) { - QgsDebugMsg( "service keyword ignored" ); + mService = pval; } else if ( pname == "user" ) { @@ -234,6 +234,11 @@ void QgsDataSourceURI::setUsername( QString username ) mUsername = username; } +QString QgsDataSourceURI::service() const +{ + return mService; +} + QString QgsDataSourceURI::host() const { return mHost; @@ -401,37 +406,46 @@ QString QgsDataSourceURI::getValue( const QString &uri, int &i ) QString QgsDataSourceURI::connectionInfo() const { - QString connectionInfo = "dbname='" + escape( mDatabase ) + "'"; + QStringList connectionItems; - if ( mHost != "" ) + if ( mDatabase != "" ) { - connectionInfo += " host=" + mHost; + connectionItems << "dbname='" + escape( mDatabase ) + "'"; + } + + if ( mService != "" ) + { + connectionItems << "service='" + escape( mService ) + "'"; + } + else if ( mHost != "" ) + { + connectionItems << "host=" + mHost; if ( mPort != "" ) - connectionInfo += " port=" + mPort; + connectionItems << "port=" + mPort; } if ( mUsername != "" ) { - connectionInfo += " user='" + escape( mUsername ) + "'"; + connectionItems << "user='" + escape( mUsername ) + "'"; if ( mPassword != "" ) { - connectionInfo += " password='" + escape( mPassword ) + "'"; + connectionItems << "password='" + escape( mPassword ) + "'"; } } if ( mSSLmode == SSLdisable ) - connectionInfo += " sslmode=disable"; + connectionItems << "sslmode=disable"; else if ( mSSLmode == SSLallow ) - connectionInfo += " sslmode=allow"; + connectionItems << "sslmode=allow"; else if ( mSSLmode == SSLrequire ) - connectionInfo += " sslmode=require"; + connectionItems << "sslmode=require"; #if 0 else if ( mSSLmode == SSLprefer ) - connectionInfo += " sslmode=prefer"; + connectionItems << "sslmode=prefer"; #endif - return connectionInfo; + return connectionItems.join( " " ); } QString QgsDataSourceURI::uri() const @@ -482,6 +496,19 @@ void QgsDataSourceURI::setConnection( const QString &host, mSSLmode = sslmode; } +void QgsDataSourceURI::setConnection( const QString &service, + const QString &database, + const QString &username, + const QString &password, + SSLmode sslmode ) +{ + mService = service; + mDatabase = database; + mUsername = username; + mPassword = password; + mSSLmode = sslmode; +} + void QgsDataSourceURI::setDataSource( const QString &schema, const QString &table, const QString &geometryColumn, diff --git a/src/core/qgsdatasourceuri.h b/src/core/qgsdatasourceuri.h index cb9efc93265..4b288c10154 100644 --- a/src/core/qgsdatasourceuri.h +++ b/src/core/qgsdatasourceuri.h @@ -57,6 +57,14 @@ class CORE_EXPORT QgsDataSourceURI const QString& aPassword, SSLmode sslmode = SSLprefer ); + //! Set all connection related members at once (for the service case) + //! \note This optional sslmode parameter has been added in version 1.7 + void setConnection( const QString& aService, + const QString& aDatabase, + const QString& aUsername, + const QString& aPassword, + SSLmode sslmode = SSLprefer ); + //! Set database // \note added in 1.4 void setDatabase( const QString &database ); @@ -100,6 +108,9 @@ class CORE_EXPORT QgsDataSourceURI QString password() const; enum SSLmode sslMode() const; + // added in 1.7 + QString service() const; + // added in version 1.2 QString keyColumn() const; void setKeyColumn( QString column ); @@ -113,10 +124,12 @@ class CORE_EXPORT QgsDataSourceURI //! host name QString mHost; - //! database name - QString mDatabase; //! port the database server listens on QString mPort; + //! service name + QString mService; + //! database name + QString mDatabase; //! schema QString mSchema; //! spatial table diff --git a/src/ui/qgspgnewconnectionbase.ui b/src/ui/qgspgnewconnectionbase.ui index 6d7e1667742..6164a4f9a1d 100644 --- a/src/ui/qgspgnewconnectionbase.ui +++ b/src/ui/qgspgnewconnectionbase.ui @@ -7,7 +7,7 @@ 0 0 352 - 413 + 428 @@ -70,6 +70,16 @@ + + + + Service + + + txtService + + + @@ -80,16 +90,6 @@ - - - - Database - - - txtDatabase - - - @@ -100,11 +100,24 @@ + + + + Database + + + txtDatabase + + + SSL mode + + cbxSSLmode + @@ -145,10 +158,10 @@ - + - + @@ -157,6 +170,9 @@ + + + @@ -255,7 +271,7 @@ Allow geometryless tables - true + false @@ -274,18 +290,20 @@ txtName + txtService txtHost - txtDatabase txtPort + txtDatabase cbxSSLmode txtUsername txtPassword chkStoreUsername chkStorePassword + btnConnect cb_geometryColumnsOnly cb_publicSchemaOnly + cb_allowGeometrylessTables cb_useEstimatedMetadata - btnConnect buttonBox