QVector<QgsDataItem*> QgsPGConnectionItem::createChildren() { QgsDebugMsg( "Entered" ); QVector<QgsDataItem*>items; QgsDataSourceURI uri = QgsPostgresConn::connUri( mName ); QgsPostgresConn *conn = QgsPostgresConnPool::instance()->acquireConnection( uri.connectionInfo() ); if ( !conn ) { items.append( new QgsErrorItem( this, tr( "Connection failed" ), mPath + "/error" ) ); QgsDebugMsg( "Connection failed - " + uri.connectionInfo() ); return items; } QVector<QgsPostgresLayerProperty> layerProperties; bool ok = conn->supportedLayers( layerProperties, QgsPostgresConn::geometryColumnsOnly( mName ), QgsPostgresConn::publicSchemaOnly( mName ), QgsPostgresConn::allowGeometrylessTables( mName ) ); QgsPostgresConnPool::instance()->releaseConnection( conn ); if ( !ok ) { items.append( new QgsErrorItem( this, tr( "Failed to get schemas" ), mPath + "/error" ) ); return items; } QSet<QString> schemaNames; foreach ( QgsPostgresLayerProperty layerProperty, layerProperties ) { schemaNames.insert( layerProperty.schemaName ); }
QVector<QgsDataItem*> QgsPGConnectionItem::createChildren() { QgsDebugMsg( "Entered" ); QVector<QgsDataItem*>items; QgsDataSourceURI uri = QgsPostgresConn::connUri( mName ); // TODO: wee need to cancel somehow acquireConnection() if deleteLater() was called on this item to avoid later credential dialog if connection failed QgsPostgresConn *conn = QgsPostgresConnPool::instance()->acquireConnection( uri.connectionInfo( false ) ); if ( !conn ) { items.append( new QgsErrorItem( this, tr( "Connection failed" ), mPath + "/error" ) ); QgsDebugMsg( "Connection failed - " + uri.connectionInfo( false ) ); return items; } QList<QgsPostgresSchemaProperty> schemas; bool ok = conn->getSchemas( schemas ); QgsPostgresConnPool::instance()->releaseConnection( conn ); if ( !ok ) { items.append( new QgsErrorItem( this, tr( "Failed to get schemas" ), mPath + "/error" ) ); return items; } Q_FOREACH ( const QgsPostgresSchemaProperty& schema, schemas ) { QgsPGSchemaItem * schemaItem = new QgsPGSchemaItem( this, mName, schema.name, mPath + '/' + schema.name ); if ( !schema.description.isEmpty() ) { schemaItem->setToolTip( schema.description ); } items.append( schemaItem ); }
void QgsOracleColumnTypeThread::run() { mStopped = false; QgsDataSourceURI uri = QgsOracleConn::connUri( mName ); QgsOracleConn *conn = QgsOracleConn::connectDb( uri.connectionInfo() ); if ( !conn ) { QgsDebugMsg( "Connection failed - " + uri.connectionInfo() ); mStopped = true; return; } emit progressMessage( tr( "Retrieving tables of %1..." ).arg( mName ) ); QVector<QgsOracleLayerProperty> layerProperties; if ( !conn->supportedLayers( layerProperties, QgsOracleConn::geometryColumnsOnly( mName ), QgsOracleConn::userTablesOnly( mName ), mAllowGeometrylessTables ) || layerProperties.isEmpty() ) { return; } int i = 0, n = layerProperties.size(); for ( QVector<QgsOracleLayerProperty>::iterator it = layerProperties.begin(), end = layerProperties.end(); it != end; ++it ) { QgsOracleLayerProperty &layerProperty = *it; if ( !mStopped ) { emit progress( i++, n ); emit progressMessage( tr( "Scanning column %1.%2.%3..." ) .arg( layerProperty.ownerName ) .arg( layerProperty.tableName ) .arg( layerProperty.geometryColName ) ); conn->retrieveLayerTypes( layerProperty, mUseEstimatedMetadata, QgsOracleConn::onlyExistingTypes( mName ) ); } if ( mStopped ) { layerProperty.types.clear(); layerProperty.srids.clear(); } // Now tell the layer list dialog box... emit setLayerType( layerProperty ); } // store the list for later use (cache) if ( !mStopped ) mLayerProperties = layerProperties; emit progress( 0, 0 ); emit progressMessage( tr( "Table retrieval finished." ) ); conn->disconnect(); }
QVector<QgsDataItem*> QgsPGConnectionItem::createChildren() { QgsDebugMsg( "Entered" ); QVector<QgsDataItem*> children; QgsDataSourceURI uri = QgsPostgresConn::connUri( mName ); mConn = QgsPostgresConn::connectDb( uri.connectionInfo(), true ); if ( !mConn ) return children; QVector<QgsPostgresLayerProperty> layerProperties; if ( !mConn->supportedLayers( layerProperties, false, true, false ) ) { children.append( new QgsErrorItem( this, tr( "Failed to retrieve layers" ), mPath + "/error" ) ); return children; } QgsGeomColumnTypeThread *columnTypeThread = 0; foreach( QgsPostgresLayerProperty layerProperty, layerProperties ) { QgsPGSchemaItem *schemaItem = mSchemaMap.value( layerProperty.schemaName, 0 ); if ( !schemaItem ) { schemaItem = new QgsPGSchemaItem( this, layerProperty.schemaName, mPath + "/" + layerProperty.schemaName ); children.append( schemaItem ); mSchemaMap[ layerProperty.schemaName ] = schemaItem; } if ( layerProperty.type == "GEOMETRY" ) { if ( !columnTypeThread ) { QgsPostgresConn *conn = QgsPostgresConn::connectDb( uri.connectionInfo(), true /* readonly */ ); if ( conn ) { columnTypeThread = new QgsGeomColumnTypeThread( conn, true /* use estimated metadata */ ); connect( columnTypeThread, SIGNAL( setLayerType( QgsPostgresLayerProperty ) ), this, SLOT( setLayerType( QgsPostgresLayerProperty ) ) ); connect( this, SIGNAL( addGeometryColumn( QgsPostgresLayerProperty ) ), columnTypeThread, SLOT( addGeometryColumn( QgsPostgresLayerProperty ) ) ); } } emit addGeometryColumn( layerProperty ); continue; } schemaItem->addLayer( layerProperty ); }
QString QgsOracleConn::toPoolName( QgsDataSourceURI uri ) { QString conninfo = uri.connectionInfo(); if ( uri.hasParam( "dbworkspace" ) ) conninfo += " dbworkspace=" + uri.param( "dbworkspace" ); return conninfo; }
void QgsOracleNewConnection::on_btnConnect_clicked() { QgsDataSourceURI uri; uri.setConnection( txtHost->text(), txtPort->text(), txtDatabase->text(), txtUsername->text(), txtPassword->text() ); if ( !txtOptions->text().isEmpty() ) uri.setParam( "dboptions", txtOptions->text() ); QgsOracleConn *conn = QgsOracleConnPool::instance()->acquireConnection( uri.connectionInfo() ); if ( conn ) { // Database successfully opened; we can now issue SQL commands. QMessageBox::information( this, tr( "Test connection" ), tr( "Connection to %1 was successful" ).arg( txtDatabase->text() ) ); // free connection resources QgsOracleConnPool::instance()->releaseConnection( conn ); } else { QMessageBox::information( this, tr( "Test connection" ), tr( "Connection failed - consult message log for details.\n\n" ) ); } }
QgsOracleConn::QgsOracleConn( QgsDataSourceURI uri ) : mRef( 1 ) , mCurrentUser( QString::null ) , mHasSpatial( -1 ) { QgsDebugMsg( QString( "New Oracle connection for " ) + uri.connectionInfo() ); QString database = databaseName( uri.database(), uri.host(), uri.port() ); QgsDebugMsg( QString( "New Oracle database " ) + database ); mDatabase = QSqlDatabase::addDatabase( "QOCISPATIAL", QString( "oracle%1" ).arg( snConnections++ ) ); mDatabase.setDatabaseName( database ); mDatabase.setConnectOptions( "OCI_ATTR_PREFETCH_ROWS=1000" ); mDatabase.setUserName( uri.username() ); mDatabase.setPassword( uri.password() ); if ( !mDatabase.open() ) { QString username = uri.username(); QString password = uri.password(); while ( !mDatabase.open() ) { bool ok = QgsCredentials::instance()->get( database, username, password, mDatabase.lastError().text() ); if ( !ok ) break; if ( !username.isEmpty() ) uri.setUsername( username ); if ( !password.isEmpty() ) uri.setPassword( password ); QgsDebugMsg( "Connecting to " + database ); mDatabase.setUserName( username ); mDatabase.setPassword( password ); } if ( mDatabase.isOpen() ) QgsCredentials::instance()->put( database, username, password ); } if ( !mDatabase.isOpen() ) { mDatabase.close(); QgsMessageLog::logMessage( tr( "Connection to database failed" ), tr( "Oracle" ) ); mRef = 0; return; } }
void QgsPgNewConnection::testConnection() { QgsDataSourceURI uri; if ( !txtService->text().isEmpty() ) { uri.setConnection( txtService->text(), txtDatabase->text(), txtUsername->text(), txtPassword->text(), ( QgsDataSourceURI::SSLmode ) cbxSSLmode->itemData( cbxSSLmode->currentIndex() ).toInt(), mAuthConfigSelect->configId() ); } else { uri.setConnection( txtHost->text(), txtPort->text(), txtDatabase->text(), txtUsername->text(), txtPassword->text(), ( QgsDataSourceURI::SSLmode ) cbxSSLmode->itemData( cbxSSLmode->currentIndex() ).toInt(), mAuthConfigSelect->configId() ); } QString conninfo = uri.connectionInfo(); QgsPostgresConn *conn = QgsPostgresConn::connectDb( conninfo, true ); if ( conn ) { // Database successfully opened; we can now issue SQL commands. QMessageBox::information( this, tr( "Test connection" ), tr( "Connection to %1 was successful" ).arg( txtDatabase->text() ) ); // free pg connection resources conn->unref(); } else { QMessageBox::information( this, tr( "Test connection" ), tr( "Connection failed - consult message log for details.\n\n" ) ); } }
void QgsGeomColumnTypeThread::run() { QgsDataSourceURI uri = QgsPostgresConn::connUri( mName ); mConn = QgsPostgresConnPool::instance()->acquireConnection( uri.connectionInfo( false ) ); if ( !mConn ) { QgsDebugMsg( "Connection failed - " + uri.connectionInfo( false ) ); return; } mStopped = false; bool dontResolveType = QgsPostgresConn::dontResolveType( mName ); emit progressMessage( tr( "Retrieving tables of %1..." ).arg( mName ) ); QVector<QgsPostgresLayerProperty> layerProperties; if ( !mConn->supportedLayers( layerProperties, QgsPostgresConn::geometryColumnsOnly( mName ), QgsPostgresConn::publicSchemaOnly( mName ), mAllowGeometrylessTables ) || layerProperties.isEmpty() ) { QgsPostgresConnPool::instance()->releaseConnection( mConn ); mConn = nullptr; return; } int i = 0, n = layerProperties.size(); for ( QVector<QgsPostgresLayerProperty>::iterator it = layerProperties.begin(), end = layerProperties.end(); it != end; ++it ) { QgsPostgresLayerProperty& layerProperty = *it; if ( !mStopped ) { emit progress( i++, n ); emit progressMessage( tr( "Scanning column %1.%2.%3..." ) .arg( layerProperty.schemaName, layerProperty.tableName, layerProperty.geometryColName ) ); if ( !layerProperty.geometryColName.isNull() && ( layerProperty.types.value( 0, QGis::WKBUnknown ) == QGis::WKBUnknown || layerProperty.srids.value( 0, INT_MIN ) == INT_MIN ) ) { if ( dontResolveType ) { QgsDebugMsg( QString( "skipping column %1.%2 without type constraint" ).arg( layerProperty.schemaName, layerProperty.tableName ) ); continue; } mConn->retrieveLayerTypes( layerProperty, mUseEstimatedMetadata ); } } if ( mStopped ) { layerProperty.types.clear(); layerProperty.srids.clear(); break; } // Now tell the layer list dialog box... emit setLayerType( layerProperty ); } emit progress( 0, 0 ); emit progressMessage( mStopped ? tr( "Table retrieval stopped." ) : tr( "Table retrieval finished." ) ); QgsPostgresConnPool::instance()->releaseConnection( mConn ); mConn = nullptr; }
QgsOracleConn::QgsOracleConn( QgsDataSourceURI uri ) : mRef( 1 ) , mCurrentUser( QString::null ) , mHasSpatial( -1 ) { QgsDebugMsg( QString( "New Oracle connection for " ) + uri.connectionInfo() ); QString database = databaseName( uri.database(), uri.host(), uri.port() ); QgsDebugMsg( QString( "New Oracle database " ) + database ); mDatabase = QSqlDatabase::addDatabase( "QOCISPATIAL", QString( "oracle%1" ).arg( snConnections++ ) ); mDatabase.setDatabaseName( database ); QString options = uri.hasParam( "dboptions" ) ? uri.param( "dboptions" ) : "OCI_ATTR_PREFETCH_ROWS=1000"; QString workspace = uri.hasParam( "dbworkspace" ) ? uri.param( "dbworkspace" ) : QString::null; mDatabase.setConnectOptions( options ); mDatabase.setUserName( uri.username() ); mDatabase.setPassword( uri.password() ); QgsDebugMsg( QString( "Connecting with options: " ) + options ); if ( !mDatabase.open() ) { QString username = uri.username(); QString password = uri.password(); QString realm( database ); if ( !username.isEmpty() ) realm.prepend( username + "@" ); QgsCredentials::instance()->lock(); while ( !mDatabase.open() ) { bool ok = QgsCredentials::instance()->get( realm, username, password, mDatabase.lastError().text() ); if ( !ok ) break; if ( !username.isEmpty() ) { uri.setUsername( username ); realm = username + "@" + database; } if ( !password.isEmpty() ) uri.setPassword( password ); QgsDebugMsg( "Connecting to " + database ); mDatabase.setUserName( username ); mDatabase.setPassword( password ); } if ( mDatabase.isOpen() ) QgsCredentials::instance()->put( realm, username, password ); QgsCredentials::instance()->unlock(); } if ( !mDatabase.isOpen() ) { mDatabase.close(); QgsMessageLog::logMessage( tr( "Connection to database failed" ), tr( "Oracle" ) ); mRef = 0; return; } if ( !workspace.isNull() ) { QSqlQuery qry( mDatabase ); if ( !qry.exec( QString( "BEGIN\nDBMS_WM.GotoWorkspace(%1);\nEND;" ).arg( quotedValue( workspace ) ) ) ) { mDatabase.close(); QgsMessageLog::logMessage( tr( "Could not switch to workspace %1 [%2]" ).arg( workspace, qry.lastError().databaseText() ), tr( "Oracle" ) ); mRef = 0; return; } } }