Skip to content

Commit ab9e926

Browse files
author
jef
committedMar 10, 2010
apply #2460 (slightly modified). Thanks Jeremy Palmer.
git-svn-id: http://svn.osgeo.org/qgis/trunk/qgis@13044 c8812cc2-4d05-0410-92ff-de0c093fc19c

10 files changed

+157
-44
lines changed
 

‎python/core/qgsdatasourceuri.sip

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,11 @@ public:
6060
QString table() const;
6161
QString sql() const;
6262
QString geometryColumn() const;
63+
64+
//! set use Estimated Metadata
65+
// added in 1.5
66+
void setUseEstimatedMetadata( bool theFlag );
67+
bool useEstimatedMetadata() const;
6368

6469
// added in 1.1
6570
QString host() const;

‎src/app/postgres/qgspgnewconnection.cpp

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -56,17 +56,13 @@ QgsPgNewConnection::QgsPgNewConnection( QWidget *parent, const QString& connName
5656
port = "5432";
5757
}
5858
txtPort->setText( port );
59-
Qt::CheckState s = Qt::Checked;
60-
if ( ! settings.value( key + "/publicOnly", false ).toBool() )
61-
s = Qt::Unchecked;
62-
cb_publicSchemaOnly->setCheckState( s );
63-
s = Qt::Checked;
64-
if ( ! settings.value( key + "/geometrycolumnsOnly", false ).toBool() )
65-
s = Qt::Unchecked;
66-
cb_geometryColumnsOnly->setCheckState( s );
59+
cb_publicSchemaOnly->setChecked( settings.value( key + "/publicOnly", false ).toBool() );
60+
cb_geometryColumnsOnly->setChecked( settings.value( key + "/geometrycolumnsOnly", false ).toBool() );
6761
// Ensure that cb_plublicSchemaOnly is set correctly
6862
on_cb_geometryColumnsOnly_clicked();
6963

64+
cb_useEstimatedMetadata->setChecked( settings.value( key + "/estimatedMetadata", false ).toBool() );
65+
7066
cbxSSLmode->setCurrentIndex( cbxSSLmode->findData( settings.value( key + "/sslmode", QgsDataSourceURI::SSLprefer ).toInt() ) );
7167

7268
if ( settings.value( key + "/saveUsername" ).toString() == "true" )
@@ -132,6 +128,7 @@ void QgsPgNewConnection::accept()
132128
settings.setValue( baseKey + "/sslmode", cbxSSLmode->itemData( cbxSSLmode->currentIndex() ).toInt() );
133129
settings.setValue( baseKey + "/saveUsername", chkStoreUsername->isChecked() ? "true" : "false" );
134130
settings.setValue( baseKey + "/savePassword", chkStorePassword->isChecked() ? "true" : "false" );
131+
settings.setValue( baseKey + "/estimatedMetadata", cb_useEstimatedMetadata->isChecked() );
135132

136133
// remove old save setting
137134
settings.remove( baseKey + "/save" );

‎src/app/postgres/qgspgsourceselect.cpp

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ email : sherman at mrcc.com
4141
#include <pg_config.h>
4242
#endif
4343

44+
// Note: Because the the geometry type select SQL is also in the qgspostgresprovider
45+
// code this parameter is duplicated there.
46+
static const int sGeomTypeSelectLimit = 100;
47+
4448
QgsPgSourceSelect::QgsPgSourceSelect( QWidget *parent, Qt::WFlags fl )
4549
: QDialog( parent, fl ), mColumnTypeThread( NULL ), pd( 0 )
4650
{
@@ -142,6 +146,7 @@ void QgsPgSourceSelect::on_btnDelete_clicked()
142146
settings.remove( key + "/sslmode" );
143147
settings.remove( key + "/publicOnly" );
144148
settings.remove( key + "/geometryColumnsOnly" );
149+
settings.remove( key + "/estimatedMetadata" );
145150
settings.remove( key + "/saveUsername" );
146151
settings.remove( key + "/savePassword" );
147152
settings.remove( key + "/save" );
@@ -352,6 +357,11 @@ QString QgsPgSourceSelect::layerURI( const QModelIndex &index )
352357
uri += QString( " key=\"%1\"" ).arg( pkColumnName );
353358
}
354359

360+
if ( mUseEstimatedMetadata )
361+
{
362+
uri += QString( " estimatedmetadata=true" );
363+
}
364+
355365
uri += QString( " table=\"%1\".\"%2\" (%3) sql=%4" )
356366
.arg( schemaName ).arg( tableName )
357367
.arg( geomColumnName )
@@ -419,7 +429,7 @@ void QgsPgSourceSelect::on_btnConnect_clicked()
419429

420430
bool searchPublicOnly = settings.value( key + "/publicOnly" ).toBool();
421431
bool searchGeometryColumnsOnly = settings.value( key + "/geometryColumnsOnly" ).toBool();
422-
432+
mUseEstimatedMetadata = settings.value( key + "/estimatedMetadata" ).toBool();
423433
// Need to escape the password to allow for single quotes and backslashes
424434

425435
QgsDebugMsg( "Connection info: " + uri.connectionInfo() );
@@ -562,7 +572,7 @@ void QgsPgSourceSelect::addSearchGeometryColumn( const QString &schema, const QS
562572
if ( mColumnTypeThread == NULL )
563573
{
564574
mColumnTypeThread = new QgsGeomColumnTypeThread();
565-
mColumnTypeThread->setConnInfo( m_privConnInfo );
575+
mColumnTypeThread->setConnInfo( m_privConnInfo, mUseEstimatedMetadata );
566576
}
567577
mColumnTypeThread->addGeometryColumn( schema, table, column );
568578
}
@@ -794,9 +804,10 @@ void QgsPgSourceSelect::setSearchExpression( const QString& regexp )
794804
{
795805
}
796806

797-
void QgsGeomColumnTypeThread::setConnInfo( QString s )
807+
void QgsGeomColumnTypeThread::setConnInfo( QString conninfo, bool useEstimatedMetadata )
798808
{
799-
mConnInfo = s;
809+
mConnInfo = conninfo;
810+
mUseEstimatedMetadata = useEstimatedMetadata;
800811
}
801812

802813
void QgsGeomColumnTypeThread::addGeometryColumn( QString schema, QString table, QString column )
@@ -828,8 +839,19 @@ void QgsGeomColumnTypeThread::getLayerTypes()
828839
" when geometrytype(%1) IN ('LINESTRING','MULTILINESTRING') THEN 'LINESTRING'"
829840
" when geometrytype(%1) IN ('POLYGON','MULTIPOLYGON') THEN 'POLYGON'"
830841
" end "
831-
"from "
832-
"\"%2\".\"%3\"" ).arg( "\"" + columns[i] + "\"" ).arg( schemas[i] ).arg( tables[i] );
842+
"from " ).arg( "\"" + columns[i] + "\"" );
843+
if ( mUseEstimatedMetadata )
844+
{
845+
query += QString( "(select %1 from %2 where %1 is not null limit %3) as t" )
846+
.arg( "\"" + columns[i] + "\"" )
847+
.arg( "\"" + schemas[i] + "\".\"" + tables[i] + "\"" )
848+
.arg( sGeomTypeSelectLimit );
849+
}
850+
else
851+
{
852+
query += "\"" + schemas[i] + "\".\"" + tables[i] + "\"";
853+
}
854+
833855
PGresult* gresult = PQexec( pd, query.toUtf8() );
834856
QString type;
835857
if ( PQresultStatus( gresult ) == PGRES_TUPLES_OK )

‎src/app/postgres/qgspgsourceselect.h

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -154,11 +154,6 @@ class QgsPgSourceSelect : public QDialog, private Ui::QgsPgSourceSelectBase
154154
typedef QPair<QString, QString> geomPair;
155155
typedef QList<geomPair> geomCol;
156156

157-
bool getGeometryColumnInfo( PGconn *pd,
158-
geomCol& details,
159-
bool searchGeometryColumnsOnly,
160-
bool searchPublicOnly );
161-
162157
/**Inserts information about the spatial tables into mTableModel*/
163158
bool getTableInfo( PGconn *pg, bool searchGeometryColumnsOnly, bool searchPublicOnly );
164159

@@ -181,6 +176,7 @@ class QgsPgSourceSelect : public QDialog, private Ui::QgsPgSourceSelectBase
181176
QString m_connInfo;
182177
QString m_privConnInfo;
183178
QStringList m_selectedTables;
179+
bool mUseEstimatedMetadata;
184180
// Storage for the range of layer type icons
185181
QMap<QString, QPair<QString, QIcon> > mLayerIcons;
186182
PGconn *pd;
@@ -205,7 +201,7 @@ class QgsGeomColumnTypeThread : public QThread
205201
Q_OBJECT
206202
public:
207203

208-
void setConnInfo( QString s );
204+
void setConnInfo( QString s, bool useEstimatedMetadata );
209205
void addGeometryColumn( QString schema, QString table, QString column );
210206

211207
// These functions get the layer types and pass that information out
@@ -226,6 +222,7 @@ class QgsGeomColumnTypeThread : public QThread
226222

227223
private:
228224
QString mConnInfo;
225+
bool mUseEstimatedMetadata;
229226
bool mStopped;
230227
std::vector<QString> schemas, tables, columns;
231228
};

‎src/app/qgsmanageconnectionsdialog.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,7 @@ QDomDocument QgsManageConnectionsDialog::savePgConnections( const QStringList &c
291291
el.setAttribute( "port", settings.value( path + "/port", "" ).toString() );
292292
el.setAttribute( "database", settings.value( path + "/database", "" ).toString() );
293293
el.setAttribute( "sslmode", settings.value( path + "/sslmode", "1" ).toString() );
294+
el.setAttribute( "estimatedMetadata", settings.value( path + "/estimatedMetadata", "0" ).toString() );
294295

295296
el.setAttribute( "saveUsername", settings.value( path + "/saveUsername", "false" ).toString() );
296297

@@ -415,9 +416,10 @@ void QgsManageConnectionsDialog::loadPgConnections( const QDomDocument &doc, con
415416
settings.setValue( "/port", child.attribute( "port" ) );
416417
settings.setValue( "/database", child.attribute( "database" ) );
417418
settings.setValue( "/sslmode", child.attribute( "sslmode" ) );
418-
settings.setValue( "/saveUsername", child.attribute( "saveUsername" ) );
419+
settings.setValue( "/estimatedMetadata", child.attribute( "estimatedMetadata" ) );
420+
settings.setValue( "/saveUsername", child.attribute( "saveUsername" ) );
419421
settings.setValue( "/username", child.attribute( "username" ) );
420-
settings.setValue( "/savePassword", child.attribute( "savePassword" ) );
422+
settings.setValue( "/savePassword", child.attribute( "savePassword" ) );
421423
settings.setValue( "/password", child.attribute( "password" ) );
422424
settings.endGroup();
423425

‎src/core/qgsdatasourceuri.cpp

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,12 @@
2323
#include <QStringList>
2424
#include <QRegExp>
2525

26-
QgsDataSourceURI::QgsDataSourceURI() : mSSLmode( SSLprefer ), mKeyColumn( "" )
26+
QgsDataSourceURI::QgsDataSourceURI() : mSSLmode( SSLprefer ), mKeyColumn( "" ), mUseEstimatedMetadata( false )
2727
{
2828
// do nothing
2929
}
3030

31-
QgsDataSourceURI::QgsDataSourceURI( QString uri ) : mSSLmode( SSLprefer ), mKeyColumn( "" )
31+
QgsDataSourceURI::QgsDataSourceURI( QString uri ) : mSSLmode( SSLprefer ), mKeyColumn( "" ), mUseEstimatedMetadata( false )
3232
{
3333
int i = 0;
3434
while ( i < uri.length() )
@@ -108,6 +108,10 @@ QgsDataSourceURI::QgsDataSourceURI( QString uri ) : mSSLmode( SSLprefer ), mKeyC
108108
{
109109
mKeyColumn = pval;
110110
}
111+
else if ( pname == "estimatedmetadata" )
112+
{
113+
mUseEstimatedMetadata = pval == "true";
114+
}
111115
else if ( pname == "service" )
112116
{
113117
QgsDebugMsg( "service keyword ignored" );
@@ -281,6 +285,17 @@ void QgsDataSourceURI::setKeyColumn( QString column )
281285
mKeyColumn = column;
282286
}
283287

288+
289+
void QgsDataSourceURI::setUseEstimatedMetadata( bool theFlag )
290+
{
291+
mUseEstimatedMetadata = theFlag;
292+
}
293+
294+
bool QgsDataSourceURI::useEstimatedMetadata() const
295+
{
296+
return mUseEstimatedMetadata;
297+
}
298+
284299
void QgsDataSourceURI::setSql( QString sql )
285300
{
286301
mSql = sql;
@@ -419,6 +434,11 @@ QString QgsDataSourceURI::uri() const
419434
theUri += QString( " key='%1'" ).arg( escape( mKeyColumn ) );
420435
}
421436

437+
if ( mUseEstimatedMetadata )
438+
{
439+
theUri += QString( " estimatedmetadata=true" );
440+
}
441+
422442
theUri += QString( " table=%1 (%2) sql=%3" )
423443
.arg( quotedTablename() )
424444
.arg( mGeometryColumn )

‎src/core/qgsdatasourceuri.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,11 @@ class CORE_EXPORT QgsDataSourceURI
8585
QString sql() const;
8686
QString geometryColumn() const;
8787

88+
//! set use Estimated Metadata
89+
// added in 1.5
90+
void setUseEstimatedMetadata( bool theFlag );
91+
bool useEstimatedMetadata() const;
92+
8893
void clearSchema();
8994
void setSql( QString sql );
9095

@@ -128,6 +133,8 @@ class CORE_EXPORT QgsDataSourceURI
128133
enum SSLmode mSSLmode;
129134
//! key column
130135
QString mKeyColumn;
136+
//Use estimated metadata flag
137+
bool mUseEstimatedMetadata;
131138
};
132139

133140
#endif //QGSDATASOURCEURI_H

‎src/providers/postgres/qgspostgresprovider.cpp

Lines changed: 48 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -49,17 +49,23 @@
4949
const QString POSTGRES_KEY = "postgres";
5050
const QString POSTGRES_DESCRIPTION = "PostgreSQL/PostGIS data provider";
5151

52+
// Note: Because the the geometry type select SQL is also in the qgspgsourceselect
53+
// code this parameter is duplicated there.
54+
static const int sGeomTypeSelectLimit = 100;
55+
5256
QMap<QString, QgsPostgresProvider::Conn *> QgsPostgresProvider::Conn::connectionsRO;
5357
QMap<QString, QgsPostgresProvider::Conn *> QgsPostgresProvider::Conn::connectionsRW;
5458
QMap<QString, QString> QgsPostgresProvider::Conn::passwordCache;
5559
int QgsPostgresProvider::providerIds = 0;
5660

5761
QgsPostgresProvider::QgsPostgresProvider( QString const & uri )
58-
: QgsVectorDataProvider( uri ),
59-
mFetching( false ),
60-
geomType( QGis::WKBUnknown ),
61-
mFeatureQueueSize( 200 ),
62-
mPrimaryKeyDefault( QString::null )
62+
: QgsVectorDataProvider( uri )
63+
, mFetching( false )
64+
, mIsDbPrimaryKey( false )
65+
, geomType( QGis::WKBUnknown )
66+
, mFeatureQueueSize( 200 )
67+
, mUseEstimatedMetadata( false )
68+
, mPrimaryKeyDefault( QString::null )
6369
{
6470
// assume this is a valid layer until we determine otherwise
6571
valid = true;
@@ -77,6 +83,7 @@ QgsPostgresProvider::QgsPostgresProvider( QString const & uri )
7783
geometryColumn = mUri.geometryColumn();
7884
sqlWhereClause = mUri.sql();
7985
primaryKey = mUri.keyColumn();
86+
mUseEstimatedMetadata = mUri.useEstimatedMetadata();
8087

8188
// Keep a schema qualified table name for convenience later on.
8289
mSchemaTableName = mUri.quotedTablename();
@@ -1029,6 +1036,10 @@ void QgsPostgresProvider::loadFields()
10291036

10301037
QString QgsPostgresProvider::getPrimaryKey()
10311038
{
1039+
// If we find a database primary key we will set this to true. If it is a column which is serving
1040+
// as a primary key, then this will remain false.
1041+
mIsDbPrimaryKey = false;
1042+
10321043
// check to see if there is an unique index on the relation, which
10331044
// can be used as a key into the table. Primary keys are always
10341045
// unique indices, so we catch them as well.
@@ -1079,6 +1090,7 @@ QString QgsPostgresProvider::getPrimaryKey()
10791090
// primary key to the table)
10801091
primaryKey = "oid";
10811092
primaryKeyType = "int4";
1093+
mIsDbPrimaryKey = true;
10821094
}
10831095
else
10841096
{
@@ -1102,6 +1114,7 @@ QString QgsPostgresProvider::getPrimaryKey()
11021114
// fallback to ctid
11031115
primaryKey = "ctid";
11041116
primaryKeyType = "tid";
1117+
mIsDbPrimaryKey = true;
11051118
}
11061119
}
11071120
}
@@ -1188,7 +1201,10 @@ QString QgsPostgresProvider::getPrimaryKey()
11881201
log.append( tr( "The unique index on column '%1' is unsuitable because Qgis does not currently "
11891202
"support non-int4 type columns as a key into the table.\n" ).arg( columnName ) );
11901203
else
1204+
{
1205+
mIsDbPrimaryKey = true;
11911206
suitableKeyColumns.push_back( std::make_pair( columnName, columnType ) );
1207+
}
11921208
}
11931209
else
11941210
{
@@ -2647,7 +2663,7 @@ bool QgsPostgresProvider::setSubsetString( QString theSQL )
26472663

26482664
sqlWhereClause = theSQL;
26492665

2650-
if ( !uniqueData( mSchemaName, mTableName, primaryKey ) )
2666+
if ( !mIsDbPrimaryKey && !uniqueData( mSchemaName, mTableName, primaryKey ) )
26512667
{
26522668
sqlWhereClause = prevWhere;
26532669
return false;
@@ -2672,18 +2688,21 @@ long QgsPostgresProvider::getFeatureCount()
26722688

26732689
// First get an approximate count; then delegate to
26742690
// a thread the task of getting the full count.
2691+
QString sql;
26752692

2676-
#ifdef POSTGRESQL_THREADS
2677-
QString sql = QString( "select reltuples from pg_catalog.pg_class where relname=%1" ).arg( quotedValue( tableName ) );
2678-
QgsDebugMsg( "Running SQL: " + sql );
2679-
#else
2680-
QString sql = QString( "select count(*) from %1" ).arg( mSchemaTableName );
2681-
2682-
if ( sqlWhereClause.length() > 0 )
2693+
if ( mUseEstimatedMetadata )
26832694
{
2684-
sql += " where " + sqlWhereClause;
2695+
sql = QString( "select reltuples::int from pg_catalog.pg_class where oid=regclass(%1)::oid" ).arg( quotedValue( mSchemaTableName ) );
2696+
}
2697+
else
2698+
{
2699+
sql = QString( "select count(*) from %1" ).arg( mSchemaTableName );
2700+
2701+
if ( sqlWhereClause.length() > 0 )
2702+
{
2703+
sql += " where " + sqlWhereClause;
2704+
}
26852705
}
2686-
#endif
26872706

26882707
Result result = connectionRO->PQexec( sql );
26892708

@@ -2746,7 +2765,7 @@ void QgsPostgresProvider::calculateExtents()
27462765
QString ext;
27472766

27482767
// get the extents
2749-
if ( sqlWhereClause.isEmpty() && !connectionRO->hasNoExtentEstimate() )
2768+
if (( mUseEstimatedMetadata || sqlWhereClause.isEmpty() ) && !connectionRO->hasNoExtentEstimate() )
27502769
{
27512770
result = connectionRO->PQexec( QString( "select estimated_extent(%1,%2,%3)" )
27522771
.arg( quotedValue( mSchemaName ) )
@@ -2955,7 +2974,19 @@ bool QgsPostgresProvider::getGeometryDetails()
29552974
" when geometrytype(%1) IN ('LINESTRING','MULTILINESTRING') THEN 'LINESTRING'"
29562975
" when geometrytype(%1) IN ('POLYGON','MULTIPOLYGON') THEN 'POLYGON'"
29572976
" end "
2958-
"from %2" ).arg( quotedIdentifier( geometryColumn ) ).arg( mSchemaTableName );
2977+
"from " ).arg( quotedIdentifier( geometryColumn ) );
2978+
if ( mUseEstimatedMetadata )
2979+
{
2980+
sql += QString( "(select %1 from %2 where %1 is not null limit %3) as t" )
2981+
.arg( quotedIdentifier( geometryColumn ) )
2982+
.arg( mSchemaTableName )
2983+
.arg( sGeomTypeSelectLimit );
2984+
}
2985+
else
2986+
{
2987+
sql += mSchemaTableName;
2988+
}
2989+
29592990
if ( mUri.sql() != "" )
29602991
sql += " where " + mUri.sql();
29612992

‎src/providers/postgres/qgspostgresprovider.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -372,7 +372,6 @@ class QgsPostgresProvider : public QgsVectorDataProvider
372372
//! Data source URI struct for this layer
373373
QgsDataSourceURI mUri;
374374

375-
376375
//! Child thread for calculating extents.
377376
QgsPostgresExtentThread mExtentThread;
378377

@@ -408,6 +407,10 @@ class QgsPostgresProvider : public QgsVectorDataProvider
408407
* the oid is used to fetch features.
409408
*/
410409
QString primaryKey;
410+
/**
411+
* Primary key column is "real" primary key
412+
*/
413+
bool mIsDbPrimaryKey;
411414
/**
412415
* Data type for the primary key
413416
*/
@@ -461,10 +464,13 @@ class QgsPostgresProvider : public QgsVectorDataProvider
461464
bool deduceEndian();
462465
bool getGeometryDetails();
463466

467+
/* Use estimated metadata. Uses fast table counts, geometry type and extent determination */
468+
bool mUseEstimatedMetadata;
469+
464470
// Produces a QMessageBox with the given title and text. Doesn't
465471
// return until the user has dismissed the dialog box.
466-
static void showMessageBox( const QString& title, const QString& text );
467-
static void showMessageBox( const QString& title, const QStringList& text );
472+
static void showMessageBox( const QString& title, const QString &text );
473+
static void showMessageBox( const QString& title, const QStringList &text );
468474

469475
// A simple class to store the rows of the sql executed in the
470476
// findColumns() function.

‎src/ui/qgspgnewconnectionbase.ui

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,27 @@
228228
</item>
229229
</layout>
230230
</item>
231+
<item row="4" column="0">
232+
<widget class="QCheckBox" name="cb_useEstimatedMetadata">
233+
<property name="toolTip">
234+
<string>Use estimated table statistics for the layer metadata.</string>
235+
</property>
236+
<property name="whatsThis">
237+
<string>&lt;html&gt;
238+
&lt;body&gt;
239+
&lt;p&gt;When the layer is setup various metadata is required for the PostGIS table. This includes information such as the table row count, geometry type and spatial extents of the data in the geometry column. If the table contains a large number of rows determining this metadata is time consuming.&lt;/p&gt;
240+
&lt;p&gt;By activating this option the following fast table metadata operations are done:&lt;/p&gt;
241+
&lt;p&gt;1) Row count is determined from table statistics obtained from running the PostgreSQL table analyse function.&lt;/p&gt;
242+
&lt;p&gt;2) Table extents are always determined with the estimated_extent PostGIS function even if a layer filter is applied.&lt;/p&gt;
243+
&lt;p&gt;3) If the table geometry type is unknown and is not exclusively taken from the geometry_columns table, then it is determined from the first 100 non-null geometry rows in the table.&lt;/p&gt;
244+
&lt;/body&gt;
245+
&lt;/html&gt;</string>
246+
</property>
247+
<property name="text">
248+
<string>Use estimated table metadata</string>
249+
</property>
250+
</widget>
251+
</item>
231252
</layout>
232253
</widget>
233254
</item>
@@ -246,10 +267,15 @@
246267
<tabstop>txtHost</tabstop>
247268
<tabstop>txtDatabase</tabstop>
248269
<tabstop>txtPort</tabstop>
270+
<tabstop>cbxSSLmode</tabstop>
249271
<tabstop>txtUsername</tabstop>
250272
<tabstop>txtPassword</tabstop>
273+
<tabstop>chkStoreUsername</tabstop>
274+
<tabstop>chkStorePassword</tabstop>
251275
<tabstop>cb_geometryColumnsOnly</tabstop>
252276
<tabstop>cb_publicSchemaOnly</tabstop>
277+
<tabstop>cb_useEstimatedMetadata</tabstop>
278+
<tabstop>btnConnect</tabstop>
253279
<tabstop>buttonBox</tabstop>
254280
</tabstops>
255281
<resources/>

0 commit comments

Comments
 (0)
Please sign in to comment.