@@ -24,7 +24,7 @@ QgsPgQueryBuilder::QgsPgQueryBuilder(QWidget *parent, Qt::WFlags fl)
24
24
: QDialog(parent, fl)
25
25
{
26
26
setupUi (this );
27
- setupListViews ();
27
+ setupGuiViews ();
28
28
}
29
29
// constructor used when the query builder must make its own
30
30
// connection to the database
@@ -33,7 +33,7 @@ QgsPgQueryBuilder::QgsPgQueryBuilder(QgsDataSourceURI *uri,
33
33
: QDialog(parent, fl), mUri(uri)
34
34
{
35
35
setupUi (this );
36
- setupListViews ();
36
+ setupGuiViews ();
37
37
// The query builder must make its own connection to the database when
38
38
// using this constructor
39
39
QString connInfo = mUri ->connInfo ();
@@ -71,7 +71,7 @@ QgsPgQueryBuilder::QgsPgQueryBuilder(QString tableName, PGconn *con,
71
71
: QDialog(parent, fl), mPgConnection(con)
72
72
{
73
73
setupUi (this );
74
- setupListViews ();
74
+ setupGuiViews ();
75
75
mOwnConnection = false ; // we don't own this connection since it was passed to us
76
76
mUri = new QgsDataSourceURI ( " table=" + tableName);
77
77
QString datasource = QString (tr (" Table <b>%1</b> in database <b>%2</b> on host <b>%3</b>, user <b>%4</b>" ))
@@ -138,8 +138,10 @@ void QgsPgQueryBuilder::populateFields()
138
138
mFieldMap [fieldName] = QgsField (fieldName, type, fieldType);
139
139
QStandardItem *myItem = new QStandardItem (fieldName);
140
140
myItem->setEditable (false );
141
- mModelFields ->insertRow (mModelFields ->rowCount (),myItem);
141
+ mModelFields ->insertRow (mModelFields ->rowCount (),myItem);
142
142
}
143
+ // All fields get ... setup
144
+ setupLstFieldsModel ();
143
145
}
144
146
else
145
147
{
@@ -148,13 +150,16 @@ void QgsPgQueryBuilder::populateFields()
148
150
PQclear (result);
149
151
}
150
152
151
- void QgsPgQueryBuilder::setupListViews ()
153
+ void QgsPgQueryBuilder::setupLstFieldsModel ()
152
154
{
153
- // Models
155
+ lstFields->setModel (mModelFields );
156
+ }
157
+
158
+ void QgsPgQueryBuilder::setupGuiViews ()
159
+ {
160
+ // Initialize the models
154
161
mModelFields = new QStandardItemModel ();
155
162
mModelValues = new QStandardItemModel ();
156
- lstFields->setModel (mModelFields );
157
- lstValues->setModel (mModelValues );
158
163
// Modes
159
164
lstFields->setViewMode (QListView::ListMode);
160
165
lstValues->setViewMode (QListView::ListMode);
@@ -163,99 +168,88 @@ void QgsPgQueryBuilder::setupListViews()
163
168
// Performance tip since Qt 4.1
164
169
lstFields->setUniformItemSizes (true );
165
170
lstValues->setUniformItemSizes (true );
171
+ // Colored rows
172
+ lstFields->setAlternatingRowColors (true );
173
+ lstValues->setAlternatingRowColors (true );
166
174
}
167
175
168
- void QgsPgQueryBuilder::on_btnSampleValues_clicked ( )
176
+ void QgsPgQueryBuilder::fillValues (QString theSQL )
169
177
{
170
- QString myFieldName = mModelFields ->data (lstFields->currentIndex ()).toString ();
171
- if (myFieldName.isEmpty ())
172
- return ;
173
-
174
- QString sql = " SELECT DISTINCT \" " + myFieldName + " \" " +
175
- " FROM (SELECT \" " + myFieldName + " \" " +
176
- " FROM " + mUri ->quotedTablename () + " " +
177
- " LIMIT 5000) AS foo " +
178
- " ORDER BY \" " + myFieldName + " \" " +
179
- " LIMIT 25" ;
180
- // clear the values list
178
+ // clear the model
181
179
mModelValues ->clear ();
180
+
182
181
// determine the field type
183
- QgsField field = mFieldMap [myFieldName];
184
- bool isCharField = field.typeName ().find (" char" ) > -1 ;
185
- PGresult *result = PQexec (mPgConnection , (const char *) (sql.utf8 ()));
182
+ QgsField field = mFieldMap [mModelFields ->data (lstFields->currentIndex ()).toString ()];
183
+ bool mActualFieldIsChar = field.typeName ().find (" char" ) > -1 ;
184
+
185
+ PGresult *result = PQexec (mPgConnection , (const char *) (theSQL.utf8 ()));
186
186
187
187
if (PQresultStatus (result) == PGRES_TUPLES_OK)
188
188
{
189
189
int rowCount = PQntuples (result);
190
190
for (int i=0 ; i < rowCount; i++)
191
191
{
192
192
QString value = QString::fromUtf8 (PQgetvalue (result, i, 0 ));
193
- if (isCharField)
194
- {
195
- value = " '" + value + " '" ;
196
- }
197
193
QStandardItem *myItem = new QStandardItem (value);
198
194
myItem->setEditable (false );
199
195
mModelValues ->insertRow (mModelValues ->rowCount (),myItem);
200
196
}
201
197
}else
202
198
{
203
- QMessageBox::warning (this , tr (" Database error" ), tr (" <p>Failed to get sample of field values using SQL:</p><p>" ) + sql + " </p><p>Error message was: " + QString (PQerrorMessage (mPgConnection )) + " </p>" );
199
+ QMessageBox::warning (this , tr (" Database error" ), tr (" <p>Failed to get sample of field values using SQL:</p><p>" ) + theSQL + " </p><p>Error message was: " + QString (PQerrorMessage (mPgConnection )) + " </p>" );
204
200
}
205
201
// free the result set
206
202
PQclear (result);
207
203
}
208
204
205
+ void QgsPgQueryBuilder::on_btnSampleValues_clicked ()
206
+ {
207
+ lstValues->setCursor (Qt::WaitCursor);
208
+ QString myFieldName = mModelFields ->data (lstFields->currentIndex ()).toString ();
209
+ if (myFieldName.isEmpty ())
210
+ return ;
211
+
212
+ QgsField field = mFieldMap [mModelFields ->data (lstFields->currentIndex ()).toString ()];
213
+ bool mActualFieldIsChar = field.typeName ().find (" char" ) > -1 ;
214
+
215
+ QString sql = " SELECT DISTINCT \" " + myFieldName + " \" " +
216
+ " FROM (SELECT \" " + myFieldName + " \" " +
217
+ " FROM " + mUri ->quotedTablename () + " " +
218
+ " LIMIT 5000) AS foo " +
219
+ " ORDER BY \" " + myFieldName + " \" " +
220
+ " LIMIT 25" ;
221
+
222
+ // delete connection mModelValues and lstValues
223
+ QStandardItemModel *tmp = new QStandardItemModel ();
224
+ lstValues->setModel (tmp);
225
+ // Clear and fill the mModelValues
226
+ fillValues (sql);
227
+ lstValues->setModel (mModelValues );
228
+ lstValues->setCursor (Qt::ArrowCursor);
229
+ // delete the tmp
230
+ delete tmp;
231
+
232
+ }
233
+
209
234
void QgsPgQueryBuilder::on_btnGetAllValues_clicked ()
210
235
{
236
+ lstValues->setCursor (Qt::WaitCursor);
211
237
QString myFieldName = mModelFields ->data (lstFields->currentIndex ()).toString ();
212
238
if (myFieldName.isEmpty ())
213
239
return ;
214
240
215
241
QString sql = " select distinct \" " + myFieldName
216
242
+ " \" from " + mUri ->quotedTablename () + " order by \" " + myFieldName + " \" " ;
217
- // clear the values list
218
- mModelValues ->clear ();
219
- // determine the field type
220
- QgsField field = mFieldMap [myFieldName];
221
- bool isCharField = field.typeName ().find (" char" ) > -1 ;
222
-
223
- PGresult *result = PQexec (mPgConnection , (const char *) (sql.utf8 ()));
224
-
225
- if (PQresultStatus (result) == PGRES_TUPLES_OK)
226
- {
227
- int rowCount = PQntuples (result);
228
-
229
- lstValues->setCursor (Qt::WaitCursor);
230
- // Block for better performance
231
- mModelValues ->blockSignals (true );
232
- lstValues->setUpdatesEnabled (false );
233
-
234
- for (int i=0 ; i < rowCount; i++)
235
- {
236
- QString value = QString::fromUtf8 (PQgetvalue (result, i, 0 ));
237
- if (isCharField)
238
- {
239
- value = " '" + value + " '" ;
240
- }
241
- QStandardItem *myItem = new QStandardItem (value);
242
- myItem->setEditable (false );
243
- mModelValues ->insertRow (mModelValues ->rowCount (),myItem);
244
- }
245
-
246
- // Unblock for normal use
247
- mModelValues ->blockSignals (false );
248
- lstValues->setUpdatesEnabled (true );
249
- // TODO: already sorted, signal emit to refresh model
250
- mModelValues ->sort (0 );
251
- lstValues->setCursor (Qt::ArrowCursor);
252
-
253
- }else
254
- {
255
- QMessageBox::warning (this , tr (" Database error" ), tr (" Failed to get sample of field values" ) + QString (PQerrorMessage (mPgConnection )) );
256
- }
257
- // free the result set
258
- PQclear (result);
243
+
244
+ // delete connection mModelValues and lstValues
245
+ QStandardItemModel *tmp = new QStandardItemModel ();
246
+ lstValues->setModel (tmp);
247
+ // Clear and fill the mModelValues
248
+ fillValues (sql);
249
+ lstValues->setModel (mModelValues );
250
+ lstValues->setCursor (Qt::ArrowCursor);
251
+ // delete the tmp
252
+ delete tmp;
259
253
}
260
254
261
255
void QgsPgQueryBuilder::on_btnTest_clicked ()
@@ -398,14 +392,41 @@ void QgsPgQueryBuilder::setSql( QString sqlStatement)
398
392
txtSQL->setText (sqlStatement);
399
393
}
400
394
395
+ void QgsPgQueryBuilder::on_lstFields_clicked ( const QModelIndex &index )
396
+ {
397
+ if (mPreviousFieldRow != index.row ())
398
+ {
399
+ mPreviousFieldRow = index.row ();
400
+
401
+ // If type is gemetry .. normal users don't want to get values?
402
+ QgsField field = mFieldMap [mModelFields ->data (lstFields->currentIndex ()).toString ()];
403
+ if (field.typeName ().find (" geometry" ) > -1 )
404
+ {
405
+ btnSampleValues->setEnabled (false );
406
+ btnGetAllValues->setEnabled (false );
407
+ }else
408
+ {
409
+ btnSampleValues->setEnabled (true );
410
+ btnGetAllValues->setEnabled (true );
411
+ }
412
+ mModelValues ->clear ();
413
+ }
414
+ }
415
+
401
416
void QgsPgQueryBuilder::on_lstFields_doubleClicked ( const QModelIndex &index )
402
417
{
403
418
txtSQL->insert (" \" " + mModelFields ->data (index).toString () + " \" " );
404
419
}
405
420
406
421
void QgsPgQueryBuilder::on_lstValues_doubleClicked ( const QModelIndex &index )
407
422
{
408
- txtSQL->insert (mModelValues ->data (index).toString ());
423
+ if (mActualFieldIsChar )
424
+ {
425
+ txtSQL->insert (" '" + mModelValues ->data (index).toString () + " '" );
426
+ }else
427
+ {
428
+ txtSQL->insert (mModelValues ->data (index).toString ());
429
+ }
409
430
}
410
431
411
432
void QgsPgQueryBuilder::on_btnLessEqual_clicked ()
0 commit comments