[gdal-dev] OGR : OCI driver improvement
Nicolas Simon
nicolas.simon at spw.wallonie.be
Mon Jul 4 11:17:27 EDT 2011
Frank, Peter and others,
> -----Message d'origine-----
> De : Peter J Halls [mailto:P.Halls at york.ac.uk]
> Envoyé : lundi 4 juillet 2011 15:19
> À : Nicolas Simon
> Cc : gdal-dev at lists.osgeo.org
> Objet : Re: [gdal-dev] OGR : OCI driver improvement
>
>
> Nicolas,
>
> I had a play with some of this a few years back, using
> GDAl 6.3, I think.
> I've back out of most of it ... It is good to see another
> person interested in
> improving the OCI driver.
>
> Nicolas Simon wrote:
> > Hi all,
> >
> > I'd like to propose some OCI driver improvement.
> >
> > 1) Enable insert from different client. This could be done
> by managing the generation of new FID on DB side instead of
> client side.
> > Technically this could be done with an oracle sequence and
> a trigger to fill the FID.
> > This proposition modify the way FID are handled ( I propose
> to do as in PostGIS driver). This means that the FID of a
> feature (i.e. usually the value of the OGC_FID column for the
> feature) inserted into a table with CreateFeature() will be
> retrieved from the database and can be obtained with GetFID()
> even if an non-null FID was provided.
> > This could be easily implemented in UnboundCreateFeature
> with a 'returning' clause.
> > But I don't known if it's feasible in BoundCreateFeature
> since truth FIDs will be know later when
> OGROCITableLayer::FlushPendingFeatures() is called.
>
> I tried this, but it seemed to slow inserts down dramatically
> - as does setting
> Primary Key, etc. I was seeking a means of incrementally
> building a very large
> spatial database - at least several hundred million entries
> (a road network). I
> would be happy if the table were opened for exclusive writing
> but the FID read
> from the table and used to seed the value used in OGR. Maybe
> I got the code wrong.
>
It's not tricky to manage speed, integrity and compatibility
Well the driver (on client side) could initialize itself with the maxFID and generate a new 'default' FID for Feature. As done presently.
If no trigger/sequence where in place, the 'default' FID will be used. Nice: full compatibility.
If a trigger/sequence are in place, the 'default' FID will be overwritten by DB trigger.
A trigger/sequence could be setup with a special sql command ( ie. like DELLAYER:<table_name> ) or with a -lco when creating the layer.
A subsisting problem is how to handle CreateFeature with preset FID ? It could corrupt the FID sequence ( the 'default' one in the driver and the sequence in the DB). So to preserve integrity, I think that the preset FID should be ignored and overwritten by the 'default' FID or 'DB' FID -> We gain in integrity but lose in compatibility. What's the best chose ?
> >
> > 2) By providing true update operation instead of delete +
> insert operations (cf SetFeture).
> > This should provide better performance and enable to
> develop trigger on update if needed for other purpose.
> > With this modification, OCI driver will have the following
> mapping between OGR concepts and Oracle operations:
> > OGRFeature::CreateFeature() <==> INSERT operation
> > OGRFeature::SetFeature() <==> UPDATE operation
> > OGRFeature::DeleteFeature() <==> DELETE operation
> > This modify slightly the actual behavior since it disable
> the possibility of inserting a new record through SetFeature
> (in case of they were no record to delete, the subsequent
> insert did the job). With the proposed implementation it'll
> be no longer the case. "Update ... set ... where FID =
> provided FID" command doesn't insert new record.
>
> The concept is great, but doing it this way is not: it will
> mean that existing
> applications written to be output agnostic will need to be
> rewritten. It would
> be better to introduce an UpdateFeature method that detects
> whether an update
> operation is supported and used delete/insert where update is
> unavailable. This
> would not break existing software.
>
It'is ok for me, it tries update and if no row is updated produce a CreateFeature ... but in this last case with the FID provided by the driver or the DB (see previous comment)
> >
> > 3) Add transaction support in the normal SQL sense.
> > Since transaction is handled within a session and we have a
> session per OGROCIDataSource, a transaction will include
> operation on any layer of that datasource.
> > I propose the following operating mode.
> >
> > Outside a transaction, we'll be in 'auto commit' mode.
> > This commit on success DeleteFeature, SetFeature and
> CreateFeature (not in MULTI_LOAD mode).
> > For CreateFeature (in MULTI_LOAD mode) data will be commited
> > - each time the buffer is full (when
> OGROCITableLayer::FlushPendingFeatures() is called)
> > - when OGROCITableLayer::SyncToDisk() is call
> > - before a new transaction start.
> >
> > Transaction start (through a call
> OGRLayer::StartTransaction()) for all layer in the DataSource.
> > OGRLayer::CommitTransaction() will call
> OGROCITableLayer::SyncToDisk() for each layer of the
> DataSource and issues one commit command for the session, and
> then return in auto commit mode (cf outside transaction mechanism)
> > OGRLayer::RollbackTransaction() will drop PendingFeature
> (may be through a private function that reset
> nWriteCacheUsed to 0) for each layer of the datasource and
> issues one rollback command for the session, and then return
> to auto commit mode.
> >
>
> I see the benefit of implementing transactions, although I
> very rarely use this
> approach in my work. For many users, this may not be a
> necessity, so it should
> be available to initiate, rather than as default. I guess
> this means an option
> at connection time?
>
If StartTransaction() is not called, the driver will operate as presently.
If StartTransaction() is called, the driver will operate as exposed, in a SQL sense. this is better than the undefined way it does presently. (In fact it does nothing, the present driver should answers FALSE to Transaction support in TestCapability)
> > I would like to know if someone else is interested in these
> improvements ?
> > Is it the way you want things work ?
> >
> > An other information is that I'm ready to work for these
> improvements.
> >
> > Regards,
> >
> > Nicolas
>
> Best wishes,
>
> Peter
>
> --------------------------------------------------------------
> ------------------
> Peter J Halls, GIS Advisor & Acting Team Leader Applications
> Support Group,
> Information Directorate, University of York
> Telephone: 01904 323806 Fax: 01904 323740
> Snail mail: Harry Fairhurst Building, University of York,
> Heslington, York YO10 5DD
> This message has the status of a private and personal communication
> --------------------------------------------------------------
> ------------------
>
>
>
More information about the gdal-dev
mailing list