Line data Source code
1 : /******************************************************************************
2 : *
3 : * Project: OpenGIS Simple Features Reference Implementation
4 : * Purpose: Implements OGRLayerDecorator class
5 : * Author: Even Rouault, even dot rouault at spatialys.com
6 : *
7 : ******************************************************************************
8 : * Copyright (c) 2012-2013, Even Rouault <even dot rouault at spatialys.com>
9 : *
10 : * SPDX-License-Identifier: MIT
11 : ****************************************************************************/
12 :
13 : #ifndef DOXYGEN_SKIP
14 :
15 : #include "ogrlayerdecorator.h"
16 : #include "ogr_recordbatch.h"
17 :
18 1059 : OGRLayerDecorator::OGRLayerDecorator(OGRLayer *poDecoratedLayer,
19 1059 : int bTakeOwnership)
20 1059 : : m_poDecoratedLayer(poDecoratedLayer), m_bHasOwnership(bTakeOwnership)
21 : {
22 1059 : CPLAssert(poDecoratedLayer != nullptr);
23 1059 : SetDescription(poDecoratedLayer->GetDescription());
24 1059 : }
25 :
26 1059 : OGRLayerDecorator::~OGRLayerDecorator()
27 : {
28 1059 : if (m_bHasOwnership)
29 410 : delete m_poDecoratedLayer;
30 1059 : }
31 :
32 20 : OGRGeometry *OGRLayerDecorator::GetSpatialFilter()
33 : {
34 20 : if (!m_poDecoratedLayer)
35 0 : return nullptr;
36 20 : return m_poDecoratedLayer->GetSpatialFilter();
37 : }
38 :
39 146 : void OGRLayerDecorator::SetSpatialFilter(OGRGeometry *poGeom)
40 : {
41 146 : if (!m_poDecoratedLayer)
42 0 : return;
43 146 : m_poDecoratedLayer->SetSpatialFilter(poGeom);
44 : }
45 :
46 100 : void OGRLayerDecorator::SetSpatialFilter(int iGeomField, OGRGeometry *poGeom)
47 : {
48 100 : if (!m_poDecoratedLayer)
49 0 : return;
50 100 : m_poDecoratedLayer->SetSpatialFilter(iGeomField, poGeom);
51 : }
52 :
53 0 : void OGRLayerDecorator::SetSpatialFilterRect(double dfMinX, double dfMinY,
54 : double dfMaxX, double dfMaxY)
55 : {
56 0 : if (!m_poDecoratedLayer)
57 0 : return;
58 0 : m_poDecoratedLayer->SetSpatialFilterRect(dfMinX, dfMinY, dfMaxX, dfMaxY);
59 : }
60 :
61 0 : void OGRLayerDecorator::SetSpatialFilterRect(int iGeomField, double dfMinX,
62 : double dfMinY, double dfMaxX,
63 : double dfMaxY)
64 : {
65 0 : if (!m_poDecoratedLayer)
66 0 : return;
67 0 : m_poDecoratedLayer->SetSpatialFilterRect(iGeomField, dfMinX, dfMinY, dfMaxX,
68 0 : dfMaxY);
69 : }
70 :
71 620 : OGRErr OGRLayerDecorator::SetAttributeFilter(const char *poAttrFilter)
72 : {
73 620 : if (!m_poDecoratedLayer)
74 0 : return OGRERR_FAILURE;
75 620 : return m_poDecoratedLayer->SetAttributeFilter(poAttrFilter);
76 : }
77 :
78 1066 : void OGRLayerDecorator::ResetReading()
79 : {
80 1066 : if (!m_poDecoratedLayer)
81 0 : return;
82 1066 : m_poDecoratedLayer->ResetReading();
83 : }
84 :
85 2361 : OGRFeature *OGRLayerDecorator::GetNextFeature()
86 : {
87 2361 : if (!m_poDecoratedLayer)
88 0 : return nullptr;
89 2361 : return m_poDecoratedLayer->GetNextFeature();
90 : }
91 :
92 75 : GDALDataset *OGRLayerDecorator::GetDataset()
93 : {
94 75 : if (!m_poDecoratedLayer)
95 0 : return nullptr;
96 75 : return m_poDecoratedLayer->GetDataset();
97 : }
98 :
99 111 : bool OGRLayerDecorator::GetArrowStream(struct ArrowArrayStream *out_stream,
100 : CSLConstList papszOptions)
101 : {
102 111 : if (!m_poDecoratedLayer)
103 : {
104 0 : memset(out_stream, 0, sizeof(*out_stream));
105 0 : return false;
106 : }
107 111 : return m_poDecoratedLayer->GetArrowStream(out_stream, papszOptions);
108 : }
109 :
110 82 : OGRErr OGRLayerDecorator::SetNextByIndex(GIntBig nIndex)
111 : {
112 82 : if (!m_poDecoratedLayer)
113 0 : return OGRERR_FAILURE;
114 82 : return m_poDecoratedLayer->SetNextByIndex(nIndex);
115 : }
116 :
117 152 : OGRFeature *OGRLayerDecorator::GetFeature(GIntBig nFID)
118 : {
119 152 : if (!m_poDecoratedLayer)
120 0 : return nullptr;
121 152 : return m_poDecoratedLayer->GetFeature(nFID);
122 : }
123 :
124 24 : OGRErr OGRLayerDecorator::ISetFeature(OGRFeature *poFeature)
125 : {
126 24 : if (!m_poDecoratedLayer)
127 0 : return OGRERR_FAILURE;
128 24 : return m_poDecoratedLayer->SetFeature(poFeature);
129 : }
130 :
131 1568 : OGRErr OGRLayerDecorator::ICreateFeature(OGRFeature *poFeature)
132 : {
133 1568 : if (!m_poDecoratedLayer)
134 0 : return OGRERR_FAILURE;
135 1568 : return m_poDecoratedLayer->CreateFeature(poFeature);
136 : }
137 :
138 0 : OGRErr OGRLayerDecorator::IUpsertFeature(OGRFeature *poFeature)
139 : {
140 0 : if (!m_poDecoratedLayer)
141 0 : return OGRERR_FAILURE;
142 0 : return m_poDecoratedLayer->UpsertFeature(poFeature);
143 : }
144 :
145 4 : OGRErr OGRLayerDecorator::IUpdateFeature(OGRFeature *poFeature,
146 : int nUpdatedFieldsCount,
147 : const int *panUpdatedFieldsIdx,
148 : int nUpdatedGeomFieldsCount,
149 : const int *panUpdatedGeomFieldsIdx,
150 : bool bUpdateStyleString)
151 : {
152 4 : if (!m_poDecoratedLayer)
153 0 : return OGRERR_FAILURE;
154 4 : return m_poDecoratedLayer->UpdateFeature(
155 : poFeature, nUpdatedFieldsCount, panUpdatedFieldsIdx,
156 4 : nUpdatedGeomFieldsCount, panUpdatedGeomFieldsIdx, bUpdateStyleString);
157 : }
158 :
159 46 : OGRErr OGRLayerDecorator::DeleteFeature(GIntBig nFID)
160 : {
161 46 : if (!m_poDecoratedLayer)
162 0 : return OGRERR_FAILURE;
163 46 : return m_poDecoratedLayer->DeleteFeature(nFID);
164 : }
165 :
166 1976 : const char *OGRLayerDecorator::GetName()
167 : {
168 1976 : if (!m_poDecoratedLayer)
169 0 : return GetDescription();
170 1976 : return m_poDecoratedLayer->GetName();
171 : }
172 :
173 470 : OGRwkbGeometryType OGRLayerDecorator::GetGeomType()
174 : {
175 470 : if (!m_poDecoratedLayer)
176 0 : return wkbNone;
177 470 : return m_poDecoratedLayer->GetGeomType();
178 : }
179 :
180 4908 : OGRFeatureDefn *OGRLayerDecorator::GetLayerDefn()
181 : {
182 4908 : if (!m_poDecoratedLayer)
183 0 : return nullptr;
184 4908 : return m_poDecoratedLayer->GetLayerDefn();
185 : }
186 :
187 66 : OGRSpatialReference *OGRLayerDecorator::GetSpatialRef()
188 : {
189 66 : if (!m_poDecoratedLayer)
190 0 : return nullptr;
191 66 : return m_poDecoratedLayer->GetSpatialRef();
192 : }
193 :
194 230 : GIntBig OGRLayerDecorator::GetFeatureCount(int bForce)
195 : {
196 230 : if (!m_poDecoratedLayer)
197 0 : return 0;
198 230 : return m_poDecoratedLayer->GetFeatureCount(bForce);
199 : }
200 :
201 34 : OGRErr OGRLayerDecorator::GetExtent(OGREnvelope *psExtent, int bForce)
202 : {
203 34 : if (!m_poDecoratedLayer)
204 0 : return OGRERR_FAILURE;
205 34 : return m_poDecoratedLayer->GetExtent(psExtent, bForce);
206 : }
207 :
208 72 : OGRErr OGRLayerDecorator::GetExtent(int iGeomField, OGREnvelope *psExtent,
209 : int bForce)
210 : {
211 72 : if (!m_poDecoratedLayer)
212 0 : return OGRERR_FAILURE;
213 72 : return m_poDecoratedLayer->GetExtent(iGeomField, psExtent, bForce);
214 : }
215 :
216 1231 : int OGRLayerDecorator::TestCapability(const char *pszCapability)
217 : {
218 1231 : if (!m_poDecoratedLayer)
219 0 : return FALSE;
220 1231 : return m_poDecoratedLayer->TestCapability(pszCapability);
221 : }
222 :
223 1369 : OGRErr OGRLayerDecorator::CreateField(const OGRFieldDefn *poField,
224 : int bApproxOK)
225 : {
226 1369 : if (!m_poDecoratedLayer)
227 0 : return OGRERR_FAILURE;
228 1369 : return m_poDecoratedLayer->CreateField(poField, bApproxOK);
229 : }
230 :
231 1 : OGRErr OGRLayerDecorator::DeleteField(int iField)
232 : {
233 1 : if (!m_poDecoratedLayer)
234 0 : return OGRERR_FAILURE;
235 1 : return m_poDecoratedLayer->DeleteField(iField);
236 : }
237 :
238 0 : OGRErr OGRLayerDecorator::ReorderFields(int *panMap)
239 : {
240 0 : if (!m_poDecoratedLayer)
241 0 : return OGRERR_FAILURE;
242 0 : return m_poDecoratedLayer->ReorderFields(panMap);
243 : }
244 :
245 0 : OGRErr OGRLayerDecorator::AlterFieldDefn(int iField,
246 : OGRFieldDefn *poNewFieldDefn,
247 : int nFlagsIn)
248 : {
249 0 : if (!m_poDecoratedLayer)
250 0 : return OGRERR_FAILURE;
251 0 : return m_poDecoratedLayer->AlterFieldDefn(iField, poNewFieldDefn, nFlagsIn);
252 : }
253 :
254 0 : OGRErr OGRLayerDecorator::AlterGeomFieldDefn(
255 : int iGeomField, const OGRGeomFieldDefn *poNewGeomFieldDefn, int nFlagsIn)
256 : {
257 0 : if (!m_poDecoratedLayer)
258 0 : return OGRERR_FAILURE;
259 0 : return m_poDecoratedLayer->AlterGeomFieldDefn(iGeomField,
260 0 : poNewGeomFieldDefn, nFlagsIn);
261 : }
262 :
263 0 : OGRErr OGRLayerDecorator::CreateGeomField(const OGRGeomFieldDefn *poField,
264 : int bApproxOK)
265 : {
266 0 : if (!m_poDecoratedLayer)
267 0 : return OGRERR_FAILURE;
268 0 : return m_poDecoratedLayer->CreateGeomField(poField, bApproxOK);
269 : }
270 :
271 0 : OGRErr OGRLayerDecorator::SyncToDisk()
272 : {
273 0 : if (!m_poDecoratedLayer)
274 0 : return OGRERR_FAILURE;
275 0 : return m_poDecoratedLayer->SyncToDisk();
276 : }
277 :
278 3 : OGRStyleTable *OGRLayerDecorator::GetStyleTable()
279 : {
280 3 : if (!m_poDecoratedLayer)
281 0 : return nullptr;
282 3 : return m_poDecoratedLayer->GetStyleTable();
283 : }
284 :
285 0 : void OGRLayerDecorator::SetStyleTableDirectly(OGRStyleTable *poStyleTable)
286 : {
287 0 : if (!m_poDecoratedLayer)
288 0 : return;
289 0 : m_poDecoratedLayer->SetStyleTableDirectly(poStyleTable);
290 : }
291 :
292 46 : void OGRLayerDecorator::SetStyleTable(OGRStyleTable *poStyleTable)
293 : {
294 46 : if (!m_poDecoratedLayer)
295 0 : return;
296 46 : m_poDecoratedLayer->SetStyleTable(poStyleTable);
297 : }
298 :
299 16 : OGRErr OGRLayerDecorator::StartTransaction()
300 : {
301 16 : if (!m_poDecoratedLayer)
302 0 : return OGRERR_FAILURE;
303 16 : return m_poDecoratedLayer->StartTransaction();
304 : }
305 :
306 14 : OGRErr OGRLayerDecorator::CommitTransaction()
307 : {
308 14 : if (!m_poDecoratedLayer)
309 0 : return OGRERR_FAILURE;
310 14 : return m_poDecoratedLayer->CommitTransaction();
311 : }
312 :
313 2 : OGRErr OGRLayerDecorator::RollbackTransaction()
314 : {
315 2 : if (!m_poDecoratedLayer)
316 0 : return OGRERR_FAILURE;
317 2 : return m_poDecoratedLayer->RollbackTransaction();
318 : }
319 :
320 397 : const char *OGRLayerDecorator::GetFIDColumn()
321 : {
322 397 : if (!m_poDecoratedLayer)
323 0 : return "";
324 397 : return m_poDecoratedLayer->GetFIDColumn();
325 : }
326 :
327 39 : const char *OGRLayerDecorator::GetGeometryColumn()
328 : {
329 39 : if (!m_poDecoratedLayer)
330 0 : return "";
331 39 : return m_poDecoratedLayer->GetGeometryColumn();
332 : }
333 :
334 237 : OGRErr OGRLayerDecorator::SetIgnoredFields(CSLConstList papszFields)
335 : {
336 237 : if (!m_poDecoratedLayer)
337 0 : return OGRERR_FAILURE;
338 237 : return m_poDecoratedLayer->SetIgnoredFields(papszFields);
339 : }
340 :
341 51 : char **OGRLayerDecorator::GetMetadata(const char *pszDomain)
342 : {
343 51 : if (!m_poDecoratedLayer)
344 0 : return nullptr;
345 51 : return m_poDecoratedLayer->GetMetadata(pszDomain);
346 : }
347 :
348 22 : CPLErr OGRLayerDecorator::SetMetadata(char **papszMetadata,
349 : const char *pszDomain)
350 : {
351 22 : if (!m_poDecoratedLayer)
352 0 : return CE_Failure;
353 22 : return m_poDecoratedLayer->SetMetadata(papszMetadata, pszDomain);
354 : }
355 :
356 80 : const char *OGRLayerDecorator::GetMetadataItem(const char *pszName,
357 : const char *pszDomain)
358 : {
359 80 : if (!m_poDecoratedLayer)
360 0 : return nullptr;
361 80 : return m_poDecoratedLayer->GetMetadataItem(pszName, pszDomain);
362 : }
363 :
364 0 : CPLErr OGRLayerDecorator::SetMetadataItem(const char *pszName,
365 : const char *pszValue,
366 : const char *pszDomain)
367 : {
368 0 : if (!m_poDecoratedLayer)
369 0 : return CE_Failure;
370 0 : return m_poDecoratedLayer->SetMetadataItem(pszName, pszValue, pszDomain);
371 : }
372 :
373 8 : OGRErr OGRLayerDecorator::Rename(const char *pszNewName)
374 : {
375 8 : if (!m_poDecoratedLayer)
376 0 : return OGRERR_FAILURE;
377 8 : OGRErr eErr = m_poDecoratedLayer->Rename(pszNewName);
378 8 : if (eErr == OGRERR_NONE)
379 : {
380 4 : SetDescription(m_poDecoratedLayer->GetDescription());
381 : }
382 8 : return eErr;
383 : }
384 :
385 : #endif /* #ifndef DOXYGEN_SKIP */
|