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 : ~OGRPGDumpLayer() override;
147 :
148 : using OGRLayer::GetLayerDefn;
149 :
150 583 : const OGRFeatureDefn *GetLayerDefn() const override
151 : {
152 583 : return m_poFeatureDefn;
153 : }
154 :
155 7 : const char *GetFIDColumn() const override
156 : {
157 7 : return m_pszFIDColumn ? m_pszFIDColumn : "";
158 : }
159 :
160 16 : void ResetReading() override
161 : {
162 16 : }
163 :
164 : int TestCapability(const char *) const override;
165 :
166 : OGRErr ICreateFeature(OGRFeature *poFeature) override;
167 : OGRErr CreateFeatureViaInsert(OGRFeature *poFeature);
168 : OGRErr CreateFeatureViaCopy(OGRFeature *poFeature);
169 :
170 : virtual OGRErr CreateField(const OGRFieldDefn *poField,
171 : int bApproxOK = TRUE) override;
172 : virtual OGRErr CreateGeomField(const OGRGeomFieldDefn *poGeomField,
173 : int bApproxOK = TRUE) override;
174 :
175 : OGRFeature *GetNextFeature() override;
176 :
177 : CPLErr SetMetadata(char **papszMD, const char *pszDomain = "") override;
178 : CPLErr SetMetadataItem(const char *pszName, const char *pszValue,
179 : const char *pszDomain = "") override;
180 :
181 : GDALDataset *GetDataset() override;
182 :
183 : // follow methods are not base class overrides
184 118 : void SetLaunderFlag(bool bFlag)
185 : {
186 118 : m_bLaunderColumnNames = bFlag;
187 118 : }
188 :
189 118 : void SetUTF8ToASCIIFlag(bool bFlag)
190 : {
191 118 : m_bUTF8ToASCII = bFlag;
192 118 : }
193 :
194 118 : void SetPrecisionFlag(bool bFlag)
195 : {
196 118 : m_bPreservePrecision = bFlag;
197 118 : }
198 :
199 : void SetOverrideColumnTypes(const char *pszOverrideColumnTypes);
200 :
201 118 : void SetUnknownSRSId(int nUnknownSRSIdIn)
202 : {
203 118 : m_nUnknownSRSId = nUnknownSRSIdIn;
204 118 : }
205 :
206 118 : void SetForcedSRSId(int nForcedSRSIdIn)
207 : {
208 118 : m_nForcedSRSId = nForcedSRSIdIn;
209 118 : }
210 :
211 118 : void SetForcedGeometryTypeFlags(int GeometryTypeFlagsIn)
212 : {
213 118 : m_nForcedGeometryTypeFlags = GeometryTypeFlagsIn;
214 118 : }
215 :
216 118 : void SetCreateSpatialIndex(bool bFlag, const char *pszSpatialIndexType)
217 : {
218 118 : m_bCreateSpatialIndexFlag = bFlag;
219 118 : m_osSpatialIndexType = pszSpatialIndexType;
220 118 : }
221 :
222 118 : void SetPostGISVersion(int nPostGISMajorIn, int nPostGISMinorIn)
223 : {
224 118 : m_nPostGISMajor = nPostGISMajorIn;
225 118 : m_nPostGISMinor = nPostGISMinorIn;
226 118 : }
227 :
228 6 : void SetGeometryFieldName(const char *pszGeomFieldName)
229 : {
230 6 : m_osFirstGeometryFieldName = pszGeomFieldName;
231 6 : }
232 :
233 : void SetForcedDescription(const char *pszDescriptionIn);
234 :
235 118 : void SetGeomColumnPositionImmediate(bool bGeomColumnPositionImmediate)
236 : {
237 118 : m_bGeomColumnPositionImmediate = bGeomColumnPositionImmediate;
238 118 : }
239 :
240 6 : void SetDeferredGeomFieldCreationCommands(
241 : const std::vector<std::string> &aosDeferredGeomFieldCreationCommands)
242 : {
243 : m_aosDeferredGeomFieldCreationCommands =
244 6 : aosDeferredGeomFieldCreationCommands;
245 6 : }
246 :
247 118 : void SetSpatialIndexCreationCommands(
248 : const std::vector<std::string> &aosSpatialIndexCreationCommands)
249 : {
250 118 : m_aosSpatialIndexCreationCommands = aosSpatialIndexCreationCommands;
251 118 : }
252 :
253 : OGRErr EndCopy();
254 : };
255 :
256 : /************************************************************************/
257 : /* OGRPGDumpDataSource */
258 : /************************************************************************/
259 : class OGRPGDumpDataSource final : public GDALDataset
260 : {
261 : OGRPGDumpDataSource(const OGRPGDumpDataSource &) = delete;
262 : OGRPGDumpDataSource &operator=(const OGRPGDumpDataSource &) = delete;
263 :
264 : std::vector<std::unique_ptr<OGRPGDumpLayer>> m_apoLayers{};
265 : VSILFILE *m_fp = nullptr;
266 : bool m_bInTransaction = false;
267 : OGRPGDumpLayer *m_poLayerInCopyMode = nullptr;
268 : const char *m_pszEOL = "\n";
269 :
270 : public:
271 : OGRPGDumpDataSource(const char *pszName, char **papszOptions);
272 : ~OGRPGDumpDataSource() override;
273 :
274 : bool Log(const char *pszStr, bool bAddSemiColumn = true);
275 :
276 21 : int GetLayerCount() const override
277 : {
278 21 : return static_cast<int>(m_apoLayers.size());
279 : }
280 :
281 : const OGRLayer *GetLayer(int) const override;
282 :
283 : virtual OGRLayer *ICreateLayer(const char *pszName,
284 : const OGRGeomFieldDefn *poGeomFieldDefn,
285 : CSLConstList papszOptions) override;
286 :
287 : int TestCapability(const char *) const override;
288 :
289 : void LogStartTransaction();
290 : void LogCommit();
291 :
292 : void StartCopy(OGRPGDumpLayer *poPGLayer);
293 : OGRErr EndCopy();
294 : };
295 :
296 : #endif /* ndef OGR_PGDUMP_H_INCLUDED */
|