Line data Source code
1 : /******************************************************************************
2 : *
3 : * Project: OpenGIS Simple Features Reference Implementation
4 : * Purpose: Private definitions for OGR/PostgreSQL dump driver.
5 : * Author: Even Rouault, <even dot rouault at spatialys.com>
6 : *
7 : ******************************************************************************
8 : * Copyright (c) 2010-2013, Even Rouault <even dot rouault at spatialys.com>
9 : *
10 : * SPDX-License-Identifier: MIT
11 : ****************************************************************************/
12 :
13 : #ifndef OGR_PGDUMP_H_INCLUDED
14 : #define OGR_PGDUMP_H_INCLUDED
15 :
16 : #include "ogrsf_frmts.h"
17 : #include "cpl_string.h"
18 :
19 : #include <vector>
20 :
21 : // Cf https://www.postgresql.org/docs/current/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS
22 : constexpr int OGR_PG_NAMEDATALEN = 64;
23 :
24 : CPLString OGRPGDumpEscapeColumnName(const char *pszColumnName);
25 : CPLString OGRPGDumpEscapeString(const char *pszStrValue, int nMaxLength = -1,
26 : const char *pszFieldName = "");
27 : char CPL_DLL *OGRPGCommonGByteArrayToBYTEA(const GByte *pabyData, size_t nLen);
28 : CPLString CPL_DLL OGRPGCommonLayerGetType(const OGRFieldDefn &oField,
29 : bool bPreservePrecision,
30 : bool bApproxOK);
31 : bool CPL_DLL OGRPGCommonLayerSetType(OGRFieldDefn &oField, const char *pszType,
32 : const char *pszFormatType, int nWidth);
33 : void CPL_DLL OGRPGCommonLayerNormalizeDefault(OGRFieldDefn *poFieldDefn,
34 : const char *pszDefault);
35 : CPLString CPL_DLL OGRPGCommonLayerGetPGDefault(OGRFieldDefn *poFieldDefn);
36 :
37 : void CPL_DLL OGRPGCommonAppendCopyFID(CPLString &osCommand,
38 : OGRFeature *poFeature);
39 :
40 : typedef CPLString (*OGRPGCommonEscapeStringCbk)(void *userdata,
41 : const char *pszValue,
42 : int nWidth,
43 : const char *pszLayerName,
44 : const char *pszFieldRef);
45 : void CPL_DLL OGRPGCommonAppendCopyRegularFields(
46 : CPLString &osCommand, OGRFeature *poFeature, const char *pszFIDColumn,
47 : const std::vector<bool> &abFieldsToInclude,
48 : OGRPGCommonEscapeStringCbk pfnEscapeString, void *userdata);
49 :
50 : void CPL_DLL OGRPGCommonAppendFieldValue(
51 : CPLString &osCommand, OGRFeature *poFeature, int i,
52 : OGRPGCommonEscapeStringCbk pfnEscapeString, void *userdata);
53 :
54 : char CPL_DLL *OGRPGCommonLaunderName(const char *pszSrcName,
55 : const char *pszDebugPrefix,
56 : bool bUTF8ToASCII);
57 :
58 : std::string CPL_DLL
59 : OGRPGCommonGenerateShortEnoughIdentifier(const char *pszIdentifier);
60 :
61 : std::string CPL_DLL OGRPGCommonGenerateSpatialIndexName(
62 : const char *pszTableName, const char *pszGeomFieldName, int nGeomFieldIdx);
63 :
64 : /************************************************************************/
65 : /* OGRPGDumpGeomFieldDefn */
66 : /************************************************************************/
67 :
68 216 : class OGRPGDumpGeomFieldDefn final : public OGRGeomFieldDefn
69 : {
70 : OGRPGDumpGeomFieldDefn(const OGRPGDumpGeomFieldDefn &) = delete;
71 : OGRPGDumpGeomFieldDefn &operator=(const OGRPGDumpGeomFieldDefn &) = delete;
72 :
73 : public:
74 108 : explicit OGRPGDumpGeomFieldDefn(OGRGeomFieldDefn *poGeomField)
75 108 : : OGRGeomFieldDefn(poGeomField), m_nSRSId(-1), m_nGeometryTypeFlags(0)
76 : {
77 108 : }
78 :
79 : ~OGRPGDumpGeomFieldDefn() override;
80 :
81 : int m_nSRSId;
82 : int m_nGeometryTypeFlags;
83 : };
84 :
85 : /************************************************************************/
86 : /* OGRPGDumpLayer */
87 : /************************************************************************/
88 :
89 : class OGRPGDumpDataSource;
90 :
91 : class OGRPGDumpLayer final : public OGRLayer
92 : {
93 : OGRPGDumpLayer(const OGRPGDumpLayer &) = delete;
94 : OGRPGDumpLayer &operator=(const OGRPGDumpLayer &) = delete;
95 :
96 : static constexpr int USE_COPY_UNSET = -1;
97 :
98 : char *m_pszSchemaName = nullptr;
99 : char *m_pszSqlTableName = nullptr;
100 : CPLString m_osForcedDescription{};
101 : char *m_pszFIDColumn = nullptr;
102 : OGRFeatureDefn *m_poFeatureDefn = nullptr;
103 : OGRPGDumpDataSource *m_poDS = nullptr;
104 : bool m_bLaunderColumnNames = true;
105 : bool m_bUTF8ToASCII = false;
106 : bool m_bPreservePrecision = true;
107 : int m_bUseCopy = USE_COPY_UNSET;
108 : bool m_bWriteAsHex = false;
109 : bool m_bCopyActive = false;
110 : bool m_bFIDColumnInCopyFields = false;
111 : int m_bCreateTable = false;
112 : bool m_bSkipConflicts = false;
113 : int m_nUnknownSRSId = -1;
114 : int m_nForcedSRSId = -1;
115 : int m_nForcedGeometryTypeFlags = -2;
116 : bool m_bCreateSpatialIndexFlag = false;
117 : CPLString m_osSpatialIndexType{};
118 : int m_nPostGISMajor = 0;
119 : int m_nPostGISMinor = 0;
120 :
121 : GIntBig m_iNextShapeId = 0;
122 : int m_iFIDAsRegularColumnIndex = -1;
123 : bool m_bAutoFIDOnCreateViaCopy = true;
124 : bool m_bCopyStatementWithFID = true;
125 : bool m_bNeedToUpdateSequence = false;
126 : bool m_bGeomColumnPositionImmediate = true;
127 : std::vector<std::string> m_aosDeferredGeomFieldCreationCommands{};
128 : std::vector<std::string> m_aosDeferrentNonGeomFieldCreationCommands{};
129 : std::vector<std::string> m_aosSpatialIndexCreationCommands{};
130 :
131 : CPLStringList m_apszOverrideColumnTypes{};
132 :
133 : CPLString m_osFirstGeometryFieldName{};
134 :
135 : OGRErr StartCopy(int bSetFID);
136 : CPLString BuildCopyFields(int bSetFID);
137 :
138 : void UpdateSequenceIfNeeded();
139 :
140 : void LogDeferredFieldCreationIfNeeded();
141 :
142 : public:
143 : OGRPGDumpLayer(OGRPGDumpDataSource *poDS, const char *pszSchemaName,
144 : const char *pszLayerName, const char *pszFIDColumn,
145 : int bWriteAsHexIn, int bCreateTable, bool bSkipConflicts);
146 : virtual ~OGRPGDumpLayer();
147 :
148 583 : virtual OGRFeatureDefn *GetLayerDefn() override
149 : {
150 583 : return m_poFeatureDefn;
151 : }
152 :
153 7 : virtual const char *GetFIDColumn() override
154 : {
155 7 : return m_pszFIDColumn ? m_pszFIDColumn : "";
156 : }
157 :
158 16 : virtual void ResetReading() override
159 : {
160 16 : }
161 :
162 : virtual int TestCapability(const char *) override;
163 :
164 : virtual OGRErr ICreateFeature(OGRFeature *poFeature) override;
165 : OGRErr CreateFeatureViaInsert(OGRFeature *poFeature);
166 : OGRErr CreateFeatureViaCopy(OGRFeature *poFeature);
167 :
168 : virtual OGRErr CreateField(const OGRFieldDefn *poField,
169 : int bApproxOK = TRUE) override;
170 : virtual OGRErr CreateGeomField(const OGRGeomFieldDefn *poGeomField,
171 : int bApproxOK = TRUE) override;
172 :
173 : virtual OGRFeature *GetNextFeature() override;
174 :
175 : virtual CPLErr SetMetadata(char **papszMD,
176 : const char *pszDomain = "") override;
177 : virtual CPLErr SetMetadataItem(const char *pszName, const char *pszValue,
178 : const char *pszDomain = "") override;
179 :
180 : GDALDataset *GetDataset() override;
181 :
182 : // follow methods are not base class overrides
183 118 : void SetLaunderFlag(bool bFlag)
184 : {
185 118 : m_bLaunderColumnNames = bFlag;
186 118 : }
187 :
188 118 : void SetUTF8ToASCIIFlag(bool bFlag)
189 : {
190 118 : m_bUTF8ToASCII = bFlag;
191 118 : }
192 :
193 118 : void SetPrecisionFlag(bool bFlag)
194 : {
195 118 : m_bPreservePrecision = bFlag;
196 118 : }
197 :
198 : void SetOverrideColumnTypes(const char *pszOverrideColumnTypes);
199 :
200 118 : void SetUnknownSRSId(int nUnknownSRSIdIn)
201 : {
202 118 : m_nUnknownSRSId = nUnknownSRSIdIn;
203 118 : }
204 :
205 118 : void SetForcedSRSId(int nForcedSRSIdIn)
206 : {
207 118 : m_nForcedSRSId = nForcedSRSIdIn;
208 118 : }
209 :
210 118 : void SetForcedGeometryTypeFlags(int GeometryTypeFlagsIn)
211 : {
212 118 : m_nForcedGeometryTypeFlags = GeometryTypeFlagsIn;
213 118 : }
214 :
215 118 : void SetCreateSpatialIndex(bool bFlag, const char *pszSpatialIndexType)
216 : {
217 118 : m_bCreateSpatialIndexFlag = bFlag;
218 118 : m_osSpatialIndexType = pszSpatialIndexType;
219 118 : }
220 :
221 118 : void SetPostGISVersion(int nPostGISMajorIn, int nPostGISMinorIn)
222 : {
223 118 : m_nPostGISMajor = nPostGISMajorIn;
224 118 : m_nPostGISMinor = nPostGISMinorIn;
225 118 : }
226 :
227 6 : void SetGeometryFieldName(const char *pszGeomFieldName)
228 : {
229 6 : m_osFirstGeometryFieldName = pszGeomFieldName;
230 6 : }
231 :
232 : void SetForcedDescription(const char *pszDescriptionIn);
233 :
234 118 : void SetGeomColumnPositionImmediate(bool bGeomColumnPositionImmediate)
235 : {
236 118 : m_bGeomColumnPositionImmediate = bGeomColumnPositionImmediate;
237 118 : }
238 :
239 6 : void SetDeferredGeomFieldCreationCommands(
240 : const std::vector<std::string> &aosDeferredGeomFieldCreationCommands)
241 : {
242 : m_aosDeferredGeomFieldCreationCommands =
243 6 : aosDeferredGeomFieldCreationCommands;
244 6 : }
245 :
246 118 : void SetSpatialIndexCreationCommands(
247 : const std::vector<std::string> &aosSpatialIndexCreationCommands)
248 : {
249 118 : m_aosSpatialIndexCreationCommands = aosSpatialIndexCreationCommands;
250 118 : }
251 :
252 : OGRErr EndCopy();
253 : };
254 :
255 : /************************************************************************/
256 : /* OGRPGDumpDataSource */
257 : /************************************************************************/
258 : class OGRPGDumpDataSource final : public GDALDataset
259 : {
260 : OGRPGDumpDataSource(const OGRPGDumpDataSource &) = delete;
261 : OGRPGDumpDataSource &operator=(const OGRPGDumpDataSource &) = delete;
262 :
263 : std::vector<std::unique_ptr<OGRPGDumpLayer>> m_apoLayers{};
264 : VSILFILE *m_fp = nullptr;
265 : bool m_bInTransaction = false;
266 : OGRPGDumpLayer *m_poLayerInCopyMode = nullptr;
267 : const char *m_pszEOL = "\n";
268 :
269 : public:
270 : OGRPGDumpDataSource(const char *pszName, char **papszOptions);
271 : virtual ~OGRPGDumpDataSource();
272 :
273 : bool Log(const char *pszStr, bool bAddSemiColumn = true);
274 :
275 21 : virtual int GetLayerCount() override
276 : {
277 21 : return static_cast<int>(m_apoLayers.size());
278 : }
279 :
280 : virtual OGRLayer *GetLayer(int) override;
281 :
282 : virtual OGRLayer *ICreateLayer(const char *pszName,
283 : const OGRGeomFieldDefn *poGeomFieldDefn,
284 : CSLConstList papszOptions) override;
285 :
286 : virtual int TestCapability(const char *) override;
287 :
288 : void LogStartTransaction();
289 : void LogCommit();
290 :
291 : void StartCopy(OGRPGDumpLayer *poPGLayer);
292 : OGRErr EndCopy();
293 : };
294 :
295 : #endif /* ndef OGR_PGDUMP_H_INCLUDED */
|