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