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; } }
QgsMssqlProvider::QgsMssqlProvider( QString uri ) : QgsVectorDataProvider( uri ) , mCrs() , mWkbType( QGis::WKBUnknown ) { QgsDataSourceURI anUri = QgsDataSourceURI( uri ); if ( !anUri.srid().isEmpty() ) mSRId = anUri.srid().toInt(); else mSRId = -1; mWkbType = anUri.wkbType(); mValid = true; mUseWkb = false; mSkipFailures = false; mUseEstimatedMetadata = anUri.useEstimatedMetadata(); mSqlWhereClause = anUri.sql(); mDatabase = GetDatabase( anUri.service(), anUri.host(), anUri.database(), anUri.username(), anUri.password() ); if ( !OpenDatabase( mDatabase ) ) { setLastError( mDatabase.lastError( ).text( ) ); mValid = false; return; } // Create a query for default connection mQuery = QSqlQuery( mDatabase ); // Database successfully opened; we can now issue SQL commands. if ( !anUri.schema().isEmpty() ) mSchemaName = anUri.schema(); else mSchemaName = "dbo"; if ( !anUri.table().isEmpty() ) { // the layer name has been specified mTableName = anUri.table(); QStringList sl = mTableName.split( '.' ); if ( sl.length() == 2 ) { mSchemaName = sl[0]; mTableName = sl[1]; } mTables = QStringList( mTableName ); } else { // Get a list of table mTables = mDatabase.tables( QSql::Tables ); if ( mTables.count() > 0 ) mTableName = mTables[0]; else mValid = false; } if ( mValid ) { if ( !anUri.keyColumn().isEmpty() ) mFidColName = anUri.keyColumn(); if ( !anUri.geometryColumn().isEmpty() ) mGeometryColName = anUri.geometryColumn(); if ( mSRId < 0 || mWkbType == QGis::WKBUnknown || mGeometryColName.isEmpty() ) loadMetadata(); loadFields(); UpdateStatistics( mUseEstimatedMetadata ); if ( mGeometryColName.isEmpty() ) { // table contains no geometries mWkbType = QGis::WKBNoGeometry; mSRId = 0; } } //fill type names into sets mNativeTypes // integer types << QgsVectorDataProvider::NativeType( tr( "8 Bytes integer" ), "bigint", QVariant::Int ) << QgsVectorDataProvider::NativeType( tr( "4 Bytes integer" ), "int", QVariant::Int ) << QgsVectorDataProvider::NativeType( tr( "2 Bytes integer" ), "smallint", QVariant::Int ) << QgsVectorDataProvider::NativeType( tr( "1 Bytes integer" ), "tinyint", QVariant::Int ) << QgsVectorDataProvider::NativeType( tr( "Decimal number (numeric)" ), "numeric", QVariant::Double, 1, 20, 0, 20 ) << QgsVectorDataProvider::NativeType( tr( "Decimal number (decimal)" ), "decimal", QVariant::Double, 1, 20, 0, 20 ) // floating point << QgsVectorDataProvider::NativeType( tr( "Decimal number (real)" ), "real", QVariant::Double ) << QgsVectorDataProvider::NativeType( tr( "Decimal number (double)" ), "float", QVariant::Double ) // string types << QgsVectorDataProvider::NativeType( tr( "Text, fixed length (char)" ), "char", QVariant::String, 1, 255 ) << QgsVectorDataProvider::NativeType( tr( "Text, limited variable length (varchar)" ), "varchar", QVariant::String, 1, 255 ) << QgsVectorDataProvider::NativeType( tr( "Text, fixed length unicode (nchar)" ), "nchar", QVariant::String, 1, 255 ) << QgsVectorDataProvider::NativeType( tr( "Text, limited variable length unicode (nvarchar)" ), "nvarchar", QVariant::String, 1, 255 ) << QgsVectorDataProvider::NativeType( tr( "Text, unlimited length (text)" ), "text", QVariant::String ) << QgsVectorDataProvider::NativeType( tr( "Text, unlimited length unicode (ntext)" ), "text", QVariant::String ) ; }
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; } } }