[Qgis-developer] Proposed plan to fix issue with concurrent opening of OGR datasources (aka QGIS and MapInfo)
even.rouault at spatialys.com
Tue Mar 22 03:22:02 PDT 2016
> > - go back to read-only mode when the user exists the edition mode (this
> > would need a new method in the QgsVectorDataProvider API to warn about
> > that, since the provider has currently no way of knowing that)
> I think the postgres provider already has a similar concept for
> connection pooling. For read-only operations, a shared r/o connection
> from the connection pool is obtained. When writing is required, a new
> "transaction" connection with write capabilities is opened for the
> duration of the r/w session. Maybe this concept can be mirrored by the
> ogr provider?
Hum, I've just looked at QgsTransaction / QgsPostgresTransaction and it is
really meant at providers that can implement a real SQL transaction mechanism
with BEGIN / COMMIT / ROLLBACK which most OGR datasources don't support, and
in particular the MapInfo driver does not. In QgsVectorLayer::startEditing(),
if there's a transaction returned by the provider, it goes through "pass-
through" mode instead of the edition buffer that gets "committed" only when the
user saves its edition session. So I don't think the postgres way can be used
in the OGR provider.
> > There would be of course a cost to pay due to this open / close
> > operations, so I think I would limit it to shapefiles and mapinfo for
> > now, since the opening of such datasets doesn't involve a lot of I/O (
> > the most costly is for shapefiles where the whole .shx is ingested into
> > memory ).
> > Another related fix would be to implement reloadData() in the OGR
> > provider so that the user can resynchronize its QGIS session for a
> > dataset modified by another software.
> Concerning the reloadData() method, there is already a forceReload()
> method which reloads a changed dataset (on request) in QGIS.
Hum, there's indeed a forceReload() method, only implemented by the OGR
provider AFAICS and only used by qgsattributetabledialog (when you hit the
Refresh button in the attribute dialog), that refreshes the read-only
connections, but not the main connection maintained by the provider.
There's also the reloadData() method implemented by the WFS/WCS/WMS providers,
and called by QgsVectorLayer/QgsRasterLayer::reload(), for example when you
refresh the view with F5. By implementing that one, I'd also close and re-
open the OGRDataSourceH ogrDataSource member of the OGR provider.
The existence of both API is a bit confusing. I guess the implementations
should do the same thing. Hum.
> Is your
> plan to implement a "change detection" and trigger this action
I've considered this, but this is not in my immediate plans. With GDAL 2.0,
GDALDatasetGetFileList() could be potentially used for that (since GDAL 2.0, a
OGRDataSourceH can be cast as a GDALDatasetH).
Spatialys - Geospatial professional services
More information about the Qgis-developer