Skip to content

Commit d161612

Browse files
committed
[FEATURE] oracle provider: basic support for Oracle Workspace Manager
(switches to a given workspace on connect)
1 parent fb9d60d commit d161612

5 files changed

+50
-2
lines changed

src/gui/qgsmanageconnectionsdialog.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -496,6 +496,7 @@ QDomDocument QgsManageConnectionsDialog::saveOracleConnections( const QStringLis
496496
el.setAttribute( "port", settings.value( path + "/port", "" ).toString() );
497497
el.setAttribute( "database", settings.value( path + "/database", "" ).toString() );
498498
el.setAttribute( "dboptions", settings.value( path + "/dboptions", "" ).toString() );
499+
el.setAttribute( "dbworkspace", settings.value( path + "/dbworkspace", "" ).toString() );
499500
el.setAttribute( "estimatedMetadata", settings.value( path + "/estimatedMetadata", "0" ).toString() );
500501
el.setAttribute( "userTablesOnly", settings.value( path + "/userTablesOnly", "0" ).toString() );
501502
el.setAttribute( "geometryColumnsOnly", settings.value( path + "/geometryColumnsOnly", "0" ).toString() );
@@ -940,6 +941,7 @@ void QgsManageConnectionsDialog::loadOracleConnections( const QDomDocument &doc,
940941
settings.setValue( "/port", child.attribute( "port" ) );
941942
settings.setValue( "/database", child.attribute( "database" ) );
942943
settings.setValue( "/dboptions", child.attribute( "dboptions" ) );
944+
settings.setValue( "/dbworkspace", child.attribute( "dbworkspace" ) );
943945
settings.setValue( "/estimatedMetadata", child.attribute( "estimatedMetadata" ) );
944946
settings.setValue( "/userTablesOnly", child.attribute( "userTablesOnly" ) );
945947
settings.setValue( "/geometryColumnsOnly", child.attribute( "geometryColumnsOnly" ) );

src/providers/oracle/qgsoraclecolumntypethread.cpp

+6-2
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,14 @@ void QgsOracleColumnTypeThread::run()
4141
mStopped = false;
4242

4343
QgsDataSourceURI uri = QgsOracleConn::connUri( mName );
44-
QgsOracleConn *conn = QgsOracleConnPool::instance()->acquireConnection( uri.connectionInfo() );
44+
QString conninfo = uri.connectionInfo();
45+
if ( uri.hasParam( "dbworkspace" ) )
46+
conninfo += " dbworkspace=" + uri.param( "dbworkspace" );
47+
48+
QgsOracleConn *conn = QgsOracleConnPool::instance()->acquireConnection( conninfo );
4549
if ( !conn )
4650
{
47-
QgsDebugMsg( "Connection failed - " + uri.connectionInfo() );
51+
QgsDebugMsg( "Connection failed - " + conninfo );
4852
mStopped = true;
4953
return;
5054
}

src/providers/oracle/qgsoracleconn.cpp

+20
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ const int QgsOracleConn::sGeomTypeSelectLimit = 100;
3434
QgsOracleConn *QgsOracleConn::connectDb( QgsDataSourceURI uri )
3535
{
3636
QString conninfo = uri.connectionInfo();
37+
if ( uri.hasParam( "dbworkspace" ) )
38+
conninfo += " dbworkspace=" + uri.param( "dbworkspace" );
3739

3840
if ( sConnections.contains( conninfo ) )
3941
{
@@ -68,6 +70,7 @@ QgsOracleConn::QgsOracleConn( QgsDataSourceURI uri )
6870
mDatabase = QSqlDatabase::addDatabase( "QOCISPATIAL", QString( "oracle%1" ).arg( snConnections++ ) );
6971
mDatabase.setDatabaseName( database );
7072
QString options = uri.hasParam( "dboptions" ) ? uri.param( "dboptions" ) : "OCI_ATTR_PREFETCH_ROWS=1000";
73+
QString workspace = uri.hasParam( "dbworkspace" ) ? uri.param( "dbworkspace" ) : QString::null;
7174
mDatabase.setConnectOptions( options );
7275
mDatabase.setUserName( uri.username() );
7376
mDatabase.setPassword( uri.password() );
@@ -118,6 +121,19 @@ QgsOracleConn::QgsOracleConn( QgsDataSourceURI uri )
118121
mRef = 0;
119122
return;
120123
}
124+
125+
if ( !workspace.isNull() )
126+
{
127+
QSqlQuery qry( mDatabase );
128+
129+
if ( !qry.exec( QString( "BEGIN\nDBMS_WM.GotoWorkspace(%1);\nEND;" ).arg( quotedValue( workspace ) ) ) )
130+
{
131+
mDatabase.close();
132+
QgsMessageLog::logMessage( tr( "Could not with to workspace %1 [%2]" ).arg( workspace, qry.lastError().databaseText() ), tr( "Oracle" ) );
133+
mRef = 0;
134+
return;
135+
}
136+
}
121137
}
122138

123139
QgsOracleConn::~QgsOracleConn()
@@ -713,6 +729,10 @@ QgsDataSourceURI QgsOracleConn::connUri( QString theConnName )
713729
{
714730
uri.setParam( "dboptions", settings.value( key + "/dboptions" ).toString() );
715731
}
732+
if ( !settings.value( key + "/dbworkspace" ).toString().isEmpty() )
733+
{
734+
uri.setParam( "dbworkspace", settings.value( key + "/dbworkspace" ).toString() );
735+
}
716736

717737
return uri;
718738
}

src/providers/oracle/qgsoraclenewconnection.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ QgsOracleNewConnection::QgsOracleNewConnection( QWidget *parent, const QString&
4646
}
4747
txtPort->setText( port );
4848
txtOptions->setText( settings.value( key + "/dboptions" ).toString() );
49+
txtWorkspace->setText( settings.value( key + "/dbworkspace" ).toString() );
4950
cb_userTablesOnly->setChecked( settings.value( key + "/userTablesOnly", false ).toBool() );
5051
cb_geometryColumnsOnly->setChecked( settings.value( key + "/geometryColumnsOnly", true ).toBool() );
5152
cb_allowGeometrylessTables->setChecked( settings.value( key + "/allowGeometrylessTables", false ).toBool() );
@@ -128,6 +129,7 @@ void QgsOracleNewConnection::accept()
128129
settings.setValue( baseKey + "/saveUsername", chkStoreUsername->isChecked() ? "true" : "false" );
129130
settings.setValue( baseKey + "/savePassword", chkStorePassword->isChecked() ? "true" : "false" );
130131
settings.setValue( baseKey + "/dboptions", txtOptions->text() );
132+
settings.setValue( baseKey + "/dbworkspace", txtWorkspace->text() );
131133

132134
QDialog::accept();
133135
}
@@ -138,6 +140,8 @@ void QgsOracleNewConnection::on_btnConnect_clicked()
138140
uri.setConnection( txtHost->text(), txtPort->text(), txtDatabase->text(), txtUsername->text(), txtPassword->text() );
139141
if ( !txtOptions->text().isEmpty() )
140142
uri.setParam( "dboptions", txtOptions->text() );
143+
if ( !txtWorkspace->text().isEmpty() )
144+
uri.setParam( "dbworkspace", txtWorkspace->text() );
141145

142146
QgsOracleConn *conn = QgsOracleConnPool::instance()->acquireConnection( uri.connectionInfo() );
143147

src/ui/qgsoraclenewconnectionbase.ui

+18
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,23 @@
235235
</property>
236236
</widget>
237237
</item>
238+
<item row="7" column="1" colspan="2">
239+
<widget class="QLineEdit" name="txtWorkspace">
240+
<property name="echoMode">
241+
<enum>QLineEdit::Normal</enum>
242+
</property>
243+
</widget>
244+
</item>
245+
<item row="7" column="0">
246+
<widget class="QLabel" name="TextLabel3_4">
247+
<property name="text">
248+
<string>Workspace</string>
249+
</property>
250+
<property name="buddy">
251+
<cstring>txtPassword</cstring>
252+
</property>
253+
</widget>
254+
</item>
238255
</layout>
239256
</widget>
240257
</item>
@@ -249,6 +266,7 @@
249266
<tabstop>txtUsername</tabstop>
250267
<tabstop>txtPassword</tabstop>
251268
<tabstop>txtOptions</tabstop>
269+
<tabstop>txtWorkspace</tabstop>
252270
<tabstop>chkStoreUsername</tabstop>
253271
<tabstop>chkStorePassword</tabstop>
254272
<tabstop>btnConnect</tabstop>

0 commit comments

Comments
 (0)