@@ -68,7 +68,7 @@ const QString POSTGRES_DESCRIPTION = "PostgreSQL/PostGIS data provider";
68
68
QgsPostgresProvider::QgsPostgresProvider (QString const & uri)
69
69
: QgsVectorDataProvider(uri),
70
70
geomType(QGis::WKBUnknown),
71
- mFeatureQueueSize(200 ),
71
+ mFeatureQueueSize(200 ),
72
72
gotPostgisVersion(FALSE )
73
73
{
74
74
// assume this is a valid layer until we determine otherwise
@@ -397,9 +397,18 @@ bool QgsPostgresProvider::getNextFeature(QgsFeature& feature)
397
397
{
398
398
QString fetch = QString (" fetch forward %1 from qgisf" )
399
399
.arg (mFeatureQueueSize );
400
-
401
- queryResult = PQexec (connection, (const char *)fetch);
402
-
400
+
401
+ if (mFirstFetch )
402
+ {
403
+ if (PQsendQuery (connection, (const char *)fetch) == 0 ) // fetch features in asynchronously
404
+ {
405
+ qWarning (" PQsendQuery failed (1)" );
406
+ }
407
+ }
408
+ mFirstFetch = false ;
409
+ queryResult = PQgetResult (connection);
410
+ PGresult* bla = PQgetResult (connection); // just to get the 0 pointer...
411
+
403
412
int rows = PQntuples (queryResult);
404
413
405
414
if (rows == 0 )
@@ -434,7 +443,7 @@ bool QgsPostgresProvider::getNextFeature(QgsFeature& feature)
434
443
char * attribute = PQgetvalue (queryResult, row, PQfnumber (queryResult,*name_it));
435
444
436
445
QString val = QString::fromUtf8 (attribute);
437
- switch (attributeFields[*index_it].type ())
446
+ switch (attributeFields[*index_it].type ())
438
447
{
439
448
case QVariant::Int:
440
449
feature.addAttribute (*index_it, val.toInt ());
@@ -463,19 +472,20 @@ bool QgsPostgresProvider::getNextFeature(QgsFeature& feature)
463
472
}
464
473
else
465
474
{
466
- // QgsDebugMsg("Couldn't get the feature geometry in binary form");
475
+ QgsDebugMsg (" Couldn't get the feature geometry in binary form" );
467
476
}
468
- }
469
-
470
- // QgsDebugMsg(" pushing " + QString::number(f->featureId());
477
+ }
471
478
472
479
mFeatureQueue .push (feature);
473
480
474
481
} // for each row in queue
475
-
476
- // QgsDebugMsg("retrieved batch of features.");
477
482
478
483
PQclear (queryResult);
484
+
485
+ if (PQsendQuery (connection, (const char *)fetch) == 0 ) // already fetch the next couple of features asynchronously
486
+ {
487
+ qWarning (" PQsendQuery failed (2)" );
488
+ }
479
489
480
490
} // if new queue is required
481
491
@@ -486,11 +496,9 @@ bool QgsPostgresProvider::getNextFeature(QgsFeature& feature)
486
496
}
487
497
else
488
498
{
489
- // QgsDebugMsg("Read attempt on an invalid postgresql data source");
499
+ QgsDebugMsg (" Read attempt on an invalid postgresql data source" );
490
500
return false ;
491
501
}
492
-
493
- // QgsDebugMsg("returning feature " + QString::number(feat.featureId()));
494
502
495
503
return true ;
496
504
}
@@ -583,6 +591,7 @@ void QgsPostgresProvider::select(QgsAttributeList fetchAttributes,
583
591
PQexec (connection, (const char *)(declare.utf8 ()));
584
592
585
593
mFeatureQueue .empty ();
594
+ mFirstFetch = true ;
586
595
}
587
596
588
597
bool QgsPostgresProvider::getFeatureAtId (int featureId,
0 commit comments