Line data Source code
1 : /******************************************************************************
2 : *
3 : * Project: OpenGIS Simple Features Reference Implementation
4 : * Purpose: Private definitions for OGR/PostgreSQL driver.
5 : * Author: Frank Warmerdam, warmerdam@pobox.com
6 : *
7 : ******************************************************************************
8 : * Copyright (c) 2000, Frank Warmerdam
9 : * Copyright (c) 2008-2013, Even Rouault <even dot rouault at spatialys.com>
10 : *
11 : * SPDX-License-Identifier: MIT
12 : ****************************************************************************/
13 :
14 : #ifndef OGR_PG_H_INCLUDED
15 : #define OGR_PG_H_INCLUDED
16 :
17 : #include "ogrsf_frmts.h"
18 : #include "libpq-fe.h"
19 : #include "cpl_string.h"
20 :
21 : #include "ogrpgutility.h"
22 : #include "ogr_pgdump.h"
23 :
24 : #include <map>
25 : #include <optional>
26 : #include <vector>
27 :
28 : /* These are the OIDs for some builtin types, as returned by PQftype(). */
29 : /* They were copied from pg_type.h in src/include/catalog/pg_type.h */
30 :
31 : #define BOOLOID 16
32 : #define BYTEAOID 17
33 : #define CHAROID 18
34 : #define NAMEOID 19
35 : #define INT8OID 20
36 : #define INT2OID 21
37 : #define INT2VECTOROID 22
38 : #define INT4OID 23
39 : #define REGPROCOID 24
40 : #define TEXTOID 25
41 : #define OIDOID 26
42 : #define TIDOID 27
43 : #define XIDOID 28
44 : #define CIDOID 29
45 : #define OIDVECTOROID 30
46 : #define JSONOID 114
47 : #define FLOAT4OID 700
48 : #define FLOAT8OID 701
49 : #define BOOLARRAYOID 1000
50 : #define INT2ARRAYOID 1005
51 : #define INT4ARRAYOID 1007
52 : #define TEXTARRAYOID 1009
53 : #define BPCHARARRAYOID 1014
54 : #define VARCHARARRAYOID 1015
55 : #define INT8ARRAYOID 1016
56 : #define FLOAT4ARRAYOID 1021
57 : #define FLOAT8ARRAYOID 1022
58 : #define BPCHAROID 1042
59 : #define VARCHAROID 1043
60 : #define DATEOID 1082
61 : #define TIMEOID 1083
62 : #define TIMESTAMPOID 1114
63 : #define TIMESTAMPTZOID 1184
64 : #define NUMERICOID 1700
65 : #define NUMERICARRAYOID 1231
66 : #define UUIDOID 2950
67 : #define JSONBOID 3802
68 :
69 : CPLString OGRPGEscapeString(void *hPGConn, const char *pszStrValue,
70 : int nMaxLength = -1, const char *pszTableName = "",
71 : const char *pszFieldName = "");
72 : CPLString OGRPGEscapeColumnName(const char *pszColumnName);
73 :
74 : #define UNDETERMINED_SRID \
75 : -2 /* Special value when we haven't yet looked for SRID */
76 :
77 : class OGRPGDataSource;
78 : class OGRPGLayer;
79 :
80 : typedef enum
81 : {
82 : GEOM_TYPE_UNKNOWN = 0,
83 : GEOM_TYPE_GEOMETRY = 1,
84 : GEOM_TYPE_GEOGRAPHY = 2,
85 : GEOM_TYPE_WKB = 3
86 : } PostgisType;
87 :
88 : typedef struct
89 : {
90 : char *pszName;
91 : char *pszGeomType;
92 : int GeometryTypeFlags;
93 : int nSRID;
94 : PostgisType ePostgisType;
95 : int bNullable;
96 : } PGGeomColumnDesc;
97 :
98 : /************************************************************************/
99 : /* OGRPGGeomFieldDefn */
100 : /************************************************************************/
101 :
102 : class OGRPGGeomFieldDefn final : public OGRGeomFieldDefn
103 : {
104 : OGRPGGeomFieldDefn(const OGRPGGeomFieldDefn &) = delete;
105 : OGRPGGeomFieldDefn &operator=(const OGRPGGeomFieldDefn &) = delete;
106 :
107 : protected:
108 : OGRPGLayer *poLayer;
109 :
110 : public:
111 566 : OGRPGGeomFieldDefn(OGRPGLayer *poLayerIn, const char *pszFieldName)
112 566 : : OGRGeomFieldDefn(pszFieldName, wkbUnknown), poLayer(poLayerIn),
113 : nSRSId(UNDETERMINED_SRID), GeometryTypeFlags(0),
114 566 : ePostgisType(GEOM_TYPE_UNKNOWN)
115 : {
116 566 : }
117 :
118 : const OGRSpatialReference *GetSpatialRef() const override;
119 :
120 566 : void UnsetLayer()
121 : {
122 566 : poLayer = nullptr;
123 566 : }
124 :
125 : mutable int nSRSId;
126 : mutable int GeometryTypeFlags;
127 : mutable PostgisType ePostgisType;
128 : };
129 :
130 : /************************************************************************/
131 : /* OGRPGFeatureDefn */
132 : /************************************************************************/
133 :
134 : class OGRPGFeatureDefn CPL_NON_FINAL : public OGRFeatureDefn
135 : {
136 : public:
137 954 : explicit OGRPGFeatureDefn(const char *pszName = nullptr)
138 954 : : OGRFeatureDefn(pszName)
139 : {
140 954 : SetGeomType(wkbNone);
141 954 : }
142 :
143 : virtual void UnsetLayer();
144 :
145 21724 : OGRPGGeomFieldDefn *GetGeomFieldDefn(int i) override
146 : {
147 21724 : return cpl::down_cast<OGRPGGeomFieldDefn *>(
148 21724 : OGRFeatureDefn::GetGeomFieldDefn(i));
149 : }
150 :
151 2425 : const OGRPGGeomFieldDefn *GetGeomFieldDefn(int i) const override
152 : {
153 2425 : return cpl::down_cast<const OGRPGGeomFieldDefn *>(
154 2425 : OGRFeatureDefn::GetGeomFieldDefn(i));
155 : }
156 : };
157 :
158 : /************************************************************************/
159 : /* OGRPGLayer */
160 : /************************************************************************/
161 :
162 : class OGRPGLayer CPL_NON_FINAL : public OGRLayer
163 : {
164 : OGRPGLayer(const OGRPGLayer &) = delete;
165 : OGRPGLayer &operator=(const OGRPGLayer &) = delete;
166 :
167 : protected:
168 : OGRPGFeatureDefn *poFeatureDefn = nullptr;
169 :
170 : int nCursorPage = 0;
171 : GIntBig iNextShapeId = 0;
172 :
173 : static char *GeometryToBYTEA(const OGRGeometry *, int nPostGISMajor,
174 : int nPostGISMinor);
175 : static GByte *BYTEAToGByteArray(const char *pszBytea, int *pnLength);
176 : static OGRGeometry *BYTEAToGeometry(const char *);
177 : Oid GeometryToOID(OGRGeometry *);
178 : OGRGeometry *OIDToGeometry(Oid);
179 :
180 : OGRPGDataSource *poDS = nullptr;
181 :
182 : char *pszQueryStatement = nullptr;
183 :
184 : char *pszCursorName = nullptr;
185 : PGresult *hCursorResult = nullptr;
186 : int bInvalidated = false;
187 :
188 : int nResultOffset = 0;
189 :
190 : int bWkbAsOid = false;
191 :
192 : char *pszFIDColumn = nullptr;
193 :
194 : int bCanUseBinaryCursor = true;
195 : int *m_panMapFieldNameToIndex = nullptr;
196 : int *m_panMapFieldNameToGeomIndex = nullptr;
197 :
198 : int ParsePGDate(const char *, OGRField *);
199 :
200 : void SetInitialQueryCursor();
201 : void CloseCursor();
202 :
203 : virtual CPLString GetFromClauseForGetExtent() = 0;
204 : OGRErr RunGetExtentRequest(OGREnvelope &sExtent, int bForce,
205 : const std::string &osCommand, int bErrorAsDebug);
206 : OGRErr RunGetExtent3DRequest(OGREnvelope3D &sExtent3D,
207 : const std::string &osCommand,
208 : int bErrorAsDebug);
209 : static void CreateMapFromFieldNameToIndex(PGresult *hResult,
210 : OGRFeatureDefn *poFeatureDefn,
211 : int *&panMapFieldNameToIndex,
212 : int *&panMapFieldNameToGeomIndex);
213 :
214 : int ReadResultDefinition(PGresult *hInitialResultIn);
215 :
216 : OGRFeature *RecordToFeature(PGresult *hResult,
217 : const int *panMapFieldNameToIndex,
218 : const int *panMapFieldNameToGeomIndex,
219 : int iRecord);
220 : OGRFeature *GetNextRawFeature();
221 :
222 : public:
223 : OGRPGLayer();
224 : ~OGRPGLayer() override;
225 :
226 : void ResetReading() override;
227 :
228 11820 : const OGRPGFeatureDefn *GetLayerDefn() const override
229 : {
230 11820 : return poFeatureDefn;
231 : }
232 :
233 : OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent,
234 : bool bForce) override;
235 :
236 : OGRErr IGetExtent3D(int iGeomField, OGREnvelope3D *psExtent3D,
237 : bool bForce) override;
238 :
239 : OGRErr StartTransaction() override;
240 : OGRErr CommitTransaction() override;
241 : OGRErr RollbackTransaction() override;
242 :
243 : void InvalidateCursor();
244 :
245 : const char *GetFIDColumn() const override;
246 :
247 : OGRErr SetNextByIndex(GIntBig nIndex) override;
248 :
249 33 : OGRPGDataSource *GetDS()
250 : {
251 33 : return poDS;
252 : }
253 :
254 : GDALDataset *GetDataset() override;
255 :
256 : virtual void ResolveSRID(const OGRPGGeomFieldDefn *poGFldDefn) = 0;
257 : };
258 :
259 : /************************************************************************/
260 : /* OGRPGTableLayer */
261 : /************************************************************************/
262 :
263 : class OGRPGTableLayer final : public OGRPGLayer
264 : {
265 : OGRPGTableLayer(const OGRPGTableLayer &) = delete;
266 : OGRPGTableLayer &operator=(const OGRPGTableLayer &) = delete;
267 :
268 : static constexpr int USE_COPY_UNSET = -10;
269 :
270 : int bUpdateAccess = false;
271 :
272 : void BuildWhere();
273 : CPLString BuildFields();
274 : void BuildFullQueryStatement();
275 :
276 : char *pszTableName = nullptr;
277 : char *pszSchemaName = nullptr;
278 : char *m_pszTableDescription = nullptr;
279 : CPLString osForcedDescription{};
280 : bool m_bMetadataLoaded = false;
281 : bool m_bMetadataModified = false;
282 : char *pszSqlTableName = nullptr;
283 : int bTableDefinitionValid = -1;
284 :
285 : CPLString osPrimaryKey{};
286 :
287 : int bGeometryInformationSet = false;
288 :
289 : /* Name of the parent table with the geometry definition if it is a derived
290 : * table or NULL */
291 : char *pszSqlGeomParentTableName = nullptr;
292 :
293 : char *pszGeomColForced = nullptr;
294 :
295 : CPLString osQuery{};
296 : CPLString osWHERE{};
297 :
298 : int bLaunderColumnNames = true;
299 : bool m_bUTF8ToASCII = false;
300 : int bPreservePrecision = true;
301 : int bUseCopy = USE_COPY_UNSET;
302 : int bCopyActive = false;
303 : bool bFIDColumnInCopyFields = false;
304 : int bFirstInsertion = true;
305 :
306 : OGRErr CreateFeatureViaCopy(OGRFeature *poFeature);
307 : OGRErr CreateFeatureViaInsert(OGRFeature *poFeature);
308 : CPLString BuildCopyFields();
309 :
310 : int bHasWarnedIncompatibleGeom = false;
311 : void CheckGeomTypeCompatibility(int iGeomField, OGRGeometry *poGeom);
312 :
313 : int bRetrieveFID = true;
314 : int bSkipConflicts = false;
315 : int bHasWarnedAlreadySetFID = false;
316 :
317 : char **papszOverrideColumnTypes = nullptr;
318 : int nForcedSRSId = UNDETERMINED_SRID;
319 : int nForcedGeometryTypeFlags = -1;
320 : bool bCreateSpatialIndexFlag = true;
321 : CPLString osSpatialIndexType = "GIST";
322 : int bInResetReading = false;
323 :
324 : int bAutoFIDOnCreateViaCopy = false;
325 : int bUseCopyByDefault = false;
326 : bool bNeedToUpdateSequence = false;
327 :
328 : int bDeferredCreation = false;
329 : CPLString osCreateTable{};
330 : std::vector<std::string> m_aosDeferredCommentOnColumns{};
331 :
332 : int iFIDAsRegularColumnIndex = -1;
333 :
334 : CPLString m_osFirstGeometryFieldName{};
335 :
336 : std::string m_osLCOGeomType{};
337 :
338 17 : CPLString GetFromClauseForGetExtent() override
339 : {
340 17 : return pszSqlTableName;
341 : }
342 :
343 : OGRErr RunAddGeometryColumn(const OGRPGGeomFieldDefn *poGeomField);
344 : OGRErr RunCreateSpatialIndex(const OGRPGGeomFieldDefn *poGeomField,
345 : int nIdx);
346 :
347 : void UpdateSequenceIfNeeded();
348 :
349 : void LoadMetadata();
350 : void SerializeMetadata();
351 :
352 : public:
353 : OGRPGTableLayer(OGRPGDataSource *, CPLString &osCurrentSchema,
354 : const char *pszTableName, const char *pszSchemaName,
355 : const char *pszDescriptionIn, const char *pszGeomColForced,
356 : int bUpdate);
357 : ~OGRPGTableLayer() override;
358 :
359 : void SetGeometryInformation(PGGeomColumnDesc *pasDesc, int nGeomFieldCount);
360 :
361 : OGRFeature *GetFeature(GIntBig nFeatureId) override;
362 : void ResetReading() override;
363 : OGRFeature *GetNextFeature() override;
364 : GIntBig GetFeatureCount(int) override;
365 :
366 : OGRErr ISetSpatialFilter(int iGeomField,
367 : const OGRGeometry *poGeom) override;
368 :
369 : OGRErr SetAttributeFilter(const char *) override;
370 :
371 : OGRErr ISetFeature(OGRFeature *poFeature) override;
372 : OGRErr IUpdateFeature(OGRFeature *poFeature, int nUpdatedFieldsCount,
373 : const int *panUpdatedFieldsIdx,
374 : int nUpdatedGeomFieldsCount,
375 : const int *panUpdatedGeomFieldsIdx,
376 : bool bUpdateStyleString) override;
377 : OGRErr DeleteFeature(GIntBig nFID) override;
378 : OGRErr ICreateFeature(OGRFeature *poFeature) override;
379 :
380 : virtual OGRErr CreateField(const OGRFieldDefn *poField,
381 : int bApproxOK = TRUE) override;
382 : virtual OGRErr CreateGeomField(const OGRGeomFieldDefn *poGeomField,
383 : int bApproxOK = TRUE) override;
384 : OGRErr DeleteField(int iField) override;
385 : virtual OGRErr AlterFieldDefn(int iField, OGRFieldDefn *poNewFieldDefn,
386 : int nFlags) override;
387 : virtual OGRErr
388 : AlterGeomFieldDefn(int iGeomFieldToAlter,
389 : const OGRGeomFieldDefn *poNewGeomFieldDefn,
390 : int nFlagsIn) override;
391 :
392 : int TestCapability(const char *) const override;
393 :
394 : OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent,
395 : bool bForce) override;
396 :
397 24 : const char *GetTableName()
398 : {
399 24 : return pszTableName;
400 : }
401 :
402 24 : const char *GetSchemaName()
403 : {
404 24 : return pszSchemaName;
405 : }
406 :
407 : const char *GetFIDColumn() const override;
408 :
409 : char **GetMetadataDomainList() override;
410 : char **GetMetadata(const char *pszDomain = "") override;
411 : virtual const char *GetMetadataItem(const char *pszName,
412 : const char *pszDomain = "") override;
413 : CPLErr SetMetadata(char **papszMD, const char *pszDomain = "") override;
414 : CPLErr SetMetadataItem(const char *pszName, const char *pszValue,
415 : const char *pszDomain = "") override;
416 :
417 : OGRErr Rename(const char *pszNewName) override;
418 :
419 : OGRGeometryTypeCounter *GetGeometryTypes(int iGeomField, int nFlagsGGT,
420 : int &nEntryCountOut,
421 : GDALProgressFunc pfnProgress,
422 : void *pProgressData) override;
423 :
424 : int FindFieldIndex(const char *pszFieldName, int bExactMatch) override;
425 :
426 : // follow methods are not base class overrides
427 226 : void SetLaunderFlag(int bFlag)
428 : {
429 226 : bLaunderColumnNames = bFlag;
430 226 : }
431 :
432 226 : void SetUTF8ToASCIIFlag(bool bFlag)
433 : {
434 226 : m_bUTF8ToASCII = bFlag;
435 226 : }
436 :
437 226 : void SetPrecisionFlag(int bFlag)
438 : {
439 226 : bPreservePrecision = bFlag;
440 226 : }
441 :
442 : void SetOverrideColumnTypes(const char *pszOverrideColumnTypes);
443 :
444 : OGRErr StartCopy();
445 : OGRErr EndCopy();
446 :
447 : int ReadTableDefinition();
448 :
449 72518 : int HasGeometryInformation()
450 : {
451 72518 : return bGeometryInformationSet;
452 : }
453 :
454 : void SetTableDefinition(const char *pszFIDColumnName,
455 : const char *pszGFldName, OGRwkbGeometryType eType,
456 : const char *pszGeomType, int nSRSId,
457 : int GeometryTypeFlags);
458 :
459 : void SetForcedSRSId(int nForcedSRSIdIn)
460 : {
461 : nForcedSRSId = nForcedSRSIdIn;
462 : }
463 :
464 226 : void SetForcedGeometryTypeFlags(int GeometryTypeFlagsIn)
465 : {
466 226 : nForcedGeometryTypeFlags = GeometryTypeFlagsIn;
467 226 : }
468 :
469 226 : void SetCreateSpatialIndex(bool bFlag, const char *pszSpatialIndexType)
470 : {
471 226 : bCreateSpatialIndexFlag = bFlag;
472 226 : osSpatialIndexType = pszSpatialIndexType;
473 226 : }
474 :
475 : void SetForcedDescription(const char *pszDescriptionIn);
476 :
477 226 : void AllowAutoFIDOnCreateViaCopy()
478 : {
479 226 : bAutoFIDOnCreateViaCopy = TRUE;
480 226 : }
481 :
482 220 : void SetUseCopy()
483 : {
484 220 : bUseCopy = TRUE;
485 220 : bUseCopyByDefault = TRUE;
486 220 : }
487 :
488 : void SetDeferredCreation(int bDeferredCreationIn,
489 : const std::string &osCreateTable);
490 : OGRErr RunDeferredCreationIfNecessary();
491 :
492 : void ResolveSRID(const OGRPGGeomFieldDefn *poGFldDefn) override;
493 : };
494 :
495 : /************************************************************************/
496 : /* OGRPGResultLayer */
497 : /************************************************************************/
498 :
499 : class OGRPGResultLayer final : public OGRPGLayer
500 : {
501 : OGRPGResultLayer(const OGRPGResultLayer &) = delete;
502 : OGRPGResultLayer &operator=(const OGRPGResultLayer &) = delete;
503 :
504 : void BuildFullQueryStatement();
505 :
506 : char *pszRawStatement = nullptr;
507 :
508 : char *pszGeomTableName = nullptr;
509 : char *pszGeomTableSchemaName = nullptr;
510 :
511 : CPLString osWHERE{};
512 :
513 6 : CPLString GetFromClauseForGetExtent() override
514 : {
515 6 : CPLString osStr("(");
516 6 : osStr += pszRawStatement;
517 6 : osStr += ")";
518 6 : return osStr;
519 : }
520 :
521 : public:
522 : OGRPGResultLayer(OGRPGDataSource *, const char *pszRawStatement,
523 : PGresult *hInitialResult);
524 : ~OGRPGResultLayer() override;
525 :
526 : void ResetReading() override;
527 : GIntBig GetFeatureCount(int) override;
528 :
529 : OGRErr ISetSpatialFilter(int iGeomField,
530 : const OGRGeometry *poGeom) override;
531 :
532 : int TestCapability(const char *) const override;
533 :
534 : OGRFeature *GetNextFeature() override;
535 :
536 : void ResolveSRID(const OGRPGGeomFieldDefn *poGFldDefn) override;
537 : };
538 :
539 : /************************************************************************/
540 : /* OGRPGDataSource */
541 : /************************************************************************/
542 :
543 432 : class OGRPGDataSource final : public GDALDataset
544 : {
545 : OGRPGDataSource(const OGRPGDataSource &) = delete;
546 : OGRPGDataSource &operator=(const OGRPGDataSource &) = delete;
547 :
548 : typedef struct
549 : {
550 : int nMajor;
551 : int nMinor;
552 : int nRelease;
553 : } PGver;
554 :
555 : OGRPGTableLayer **papoLayers = nullptr;
556 : int nLayers = 0;
557 :
558 : bool m_bUTF8ClientEncoding = false;
559 :
560 : int bDSUpdate = false;
561 : int bHavePostGIS = false;
562 : int bHaveGeography = false;
563 :
564 : bool bUserTransactionActive = false;
565 : int bSavePointActive = false;
566 : int nSoftTransactionLevel = 0;
567 :
568 : PGconn *hPGConn = nullptr;
569 :
570 : OGRErr DeleteLayer(int iLayer) override;
571 :
572 : Oid nGeometryOID = static_cast<Oid>(0);
573 : Oid nGeographyOID = static_cast<Oid>(0);
574 :
575 : // We maintain a list of known SRID to reduce the number of trips to
576 : // the database to get SRSes.
577 : std::map<int,
578 : std::unique_ptr<OGRSpatialReference, OGRSpatialReferenceReleaser>>
579 : m_oSRSCache{};
580 :
581 : OGRPGTableLayer *poLayerInCopyMode = nullptr;
582 :
583 : static void OGRPGDecodeVersionString(PGver *psVersion, const char *pszVer);
584 :
585 : CPLString osCurrentSchema{};
586 : CPLString GetCurrentSchema();
587 :
588 : // Actual value will be auto-detected if PostGIS >= 2.0 detected.
589 : int nUndefinedSRID = -1;
590 :
591 : char *pszForcedTables = nullptr;
592 : char **papszSchemaList = nullptr;
593 : int bHasLoadTables = false;
594 : CPLString osActiveSchema{};
595 : int bListAllTables = false;
596 : bool m_bSkipViews = false;
597 :
598 : bool m_bOgrSystemTablesMetadataTableExistenceTested = false;
599 : bool m_bOgrSystemTablesMetadataTableFound = false;
600 :
601 : bool m_bCreateMetadataTableIfNeededRun = false;
602 : bool m_bCreateMetadataTableIfNeededSuccess = false;
603 :
604 : bool m_bHasWritePermissionsOnMetadataTableRun = false;
605 : bool m_bHasWritePermissionsOnMetadataTableSuccess = false;
606 :
607 : void LoadTables();
608 :
609 : CPLString osDebugLastTransactionCommand{};
610 : OGRErr DoTransactionCommand(const char *pszCommand);
611 :
612 : OGRErr FlushSoftTransaction();
613 :
614 : OGRErr FlushCacheWithRet(bool bAtClosing);
615 :
616 : std::optional<std::string> FindSchema(const char *pszSchemaNameIn);
617 :
618 : bool IsSuperUser();
619 : bool OGRSystemTablesEventTriggerExists();
620 :
621 : public:
622 : PGver sPostgreSQLVersion = {0, 0, 0};
623 : PGver sPostGISVersion = {0, 0, 0};
624 :
625 : int bUseBinaryCursor = false;
626 : int bBinaryTimeFormatIsInt8 = false;
627 :
628 : bool m_bHasGeometryColumns = false;
629 : bool m_bHasSpatialRefSys = false;
630 :
631 750 : bool HavePostGIS() const
632 : {
633 750 : return bHavePostGIS;
634 : }
635 :
636 130 : int GetUndefinedSRID() const
637 : {
638 130 : return nUndefinedSRID;
639 : }
640 :
641 3739 : bool IsUTF8ClientEncoding() const
642 : {
643 3739 : return m_bUTF8ClientEncoding;
644 : }
645 :
646 : public:
647 : OGRPGDataSource();
648 : ~OGRPGDataSource() override;
649 :
650 248750 : PGconn *GetPGConn()
651 : {
652 248750 : return hPGConn;
653 : }
654 :
655 : int FetchSRSId(const OGRSpatialReference *poSRS);
656 : const OGRSpatialReference *FetchSRS(int nSRSId);
657 : static OGRErr InitializeMetadataTables();
658 :
659 : int Open(const char *, int bUpdate, int bTestOpen, char **papszOpenOptions);
660 : OGRPGTableLayer *
661 : OpenTable(CPLString &osCurrentSchema, const char *pszTableName,
662 : const char *pszSchemaName, const char *pszDescription,
663 : const char *pszGeomColForced, int bUpdate, int bTestOpen);
664 :
665 : int GetLayerCount() const override;
666 : const OGRLayer *GetLayer(int) const override;
667 : OGRLayer *GetLayerByName(const char *pszName) override;
668 :
669 : CPLErr FlushCache(bool bAtClosing) override;
670 :
671 : OGRLayer *ICreateLayer(const char *pszName,
672 : const OGRGeomFieldDefn *poGeomFieldDefn,
673 : CSLConstList papszOptions) override;
674 :
675 : int TestCapability(const char *) const override;
676 :
677 : OGRErr StartTransaction(int bForce = FALSE) override;
678 : OGRErr CommitTransaction() override;
679 : OGRErr RollbackTransaction() override;
680 :
681 : OGRErr SoftStartTransaction();
682 : OGRErr SoftCommitTransaction();
683 : OGRErr SoftRollbackTransaction();
684 :
685 421 : Oid GetGeometryOID()
686 : {
687 421 : return nGeometryOID;
688 : }
689 :
690 471 : Oid GetGeographyOID()
691 : {
692 471 : return nGeographyOID;
693 : }
694 :
695 : OGRLayer *ExecuteSQL(const char *pszSQLCommand,
696 : OGRGeometry *poSpatialFilter,
697 : const char *pszDialect) override;
698 : OGRErr AbortSQL() override;
699 : void ReleaseResultSet(OGRLayer *poLayer) override;
700 :
701 : virtual const char *GetMetadataItem(const char *pszKey,
702 : const char *pszDomain) override;
703 :
704 : int UseCopy();
705 : void StartCopy(OGRPGTableLayer *poPGLayer);
706 : OGRErr EndCopy();
707 :
708 16 : bool IsUserTransactionActive()
709 : {
710 16 : return bUserTransactionActive;
711 : }
712 :
713 : bool CreateMetadataTableIfNeeded();
714 : bool HasOgrSystemTablesMetadataTable();
715 : bool HasWritePermissionsOnMetadataTable();
716 : };
717 :
718 : #endif /* ndef OGR_PG_H_INCLUDED */
|