Line data Source code
1 : /******************************************************************************
2 : * $Id$
3 : *
4 : * Project: OpenGIS Simple Features Reference Implementation
5 : * Purpose: Private definitions within the OGR Memory driver.
6 : * Author: Frank Warmerdam, warmerdam@pobox.com
7 : *
8 : ******************************************************************************
9 : * Copyright (c) 2003, Frank Warmerdam <warmerdam@pobox.com>
10 : * Copyright (c) 2011-2013, Even Rouault <even dot rouault at spatialys.com>
11 : *
12 : * Permission is hereby granted, free of charge, to any person obtaining a
13 : * copy of this software and associated documentation files (the "Software"),
14 : * to deal in the Software without restriction, including without limitation
15 : * the rights to use, copy, modify, merge, publish, distribute, sublicense,
16 : * and/or sell copies of the Software, and to permit persons to whom the
17 : * Software is furnished to do so, subject to the following conditions:
18 : *
19 : * The above copyright notice and this permission notice shall be included
20 : * in all copies or substantial portions of the Software.
21 : *
22 : * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
23 : * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24 : * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
25 : * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26 : * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
27 : * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
28 : * DEALINGS IN THE SOFTWARE.
29 : ****************************************************************************/
30 :
31 : #ifndef OGRMEM_H_INCLUDED
32 : #define OGRMEM_H_INCLUDED
33 :
34 : #include "ogrsf_frmts.h"
35 :
36 : #include <map>
37 :
38 : /************************************************************************/
39 : /* OGRMemLayer */
40 : /************************************************************************/
41 : class OGRMemDataSource;
42 :
43 : class IOGRMemLayerFeatureIterator;
44 :
45 : class CPL_DLL OGRMemLayer CPL_NON_FINAL : public OGRLayer
46 : {
47 : CPL_DISALLOW_COPY_ASSIGN(OGRMemLayer)
48 :
49 : typedef std::map<GIntBig, std::unique_ptr<OGRFeature>> FeatureMap;
50 : typedef FeatureMap::iterator FeatureIterator;
51 :
52 : OGRFeatureDefn *m_poFeatureDefn = nullptr;
53 :
54 : GIntBig m_nFeatureCount = 0;
55 :
56 : GIntBig m_iNextReadFID = 0;
57 : GIntBig m_nMaxFeatureCount = 0; // Max size of papoFeatures.
58 : OGRFeature **m_papoFeatures = nullptr;
59 : bool m_bHasHoles = false;
60 :
61 : FeatureMap m_oMapFeatures{};
62 : FeatureIterator m_oMapFeaturesIter{};
63 :
64 : GIntBig m_iNextCreateFID = 0;
65 :
66 : bool m_bUpdatable = true;
67 : bool m_bAdvertizeUTF8 = false;
68 :
69 : bool m_bUpdated = false;
70 :
71 : std::string m_osFIDColumn{};
72 :
73 : GDALDataset *m_poDS{};
74 :
75 : // Only use it in the lifetime of a function where the list of features
76 : // doesn't change.
77 : IOGRMemLayerFeatureIterator *GetIterator();
78 :
79 : OGRFeature *GetFeatureRef(GIntBig nFeatureId);
80 :
81 : public:
82 : // Clone poSRS if not nullptr
83 : OGRMemLayer(const char *pszName, const OGRSpatialReference *poSRS,
84 : OGRwkbGeometryType eGeomType);
85 : virtual ~OGRMemLayer();
86 :
87 : void ResetReading() override;
88 : OGRFeature *GetNextFeature() override;
89 : virtual OGRErr SetNextByIndex(GIntBig nIndex) override;
90 :
91 : OGRFeature *GetFeature(GIntBig nFeatureId) override;
92 : OGRErr ISetFeature(OGRFeature *poFeature) override;
93 : OGRErr ICreateFeature(OGRFeature *poFeature) override;
94 : OGRErr IUpsertFeature(OGRFeature *poFeature) override;
95 : OGRErr IUpdateFeature(OGRFeature *poFeature, int nUpdatedFieldsCount,
96 : const int *panUpdatedFieldsIdx,
97 : int nUpdatedGeomFieldsCount,
98 : const int *panUpdatedGeomFieldsIdx,
99 : bool bUpdateStyleString) override;
100 : virtual OGRErr DeleteFeature(GIntBig nFID) override;
101 :
102 304807 : OGRFeatureDefn *GetLayerDefn() override
103 : {
104 304807 : return m_poFeatureDefn;
105 : }
106 :
107 : GIntBig GetFeatureCount(int) override;
108 :
109 : virtual OGRErr CreateField(const OGRFieldDefn *poField,
110 : int bApproxOK = TRUE) override;
111 : virtual OGRErr DeleteField(int iField) override;
112 : virtual OGRErr ReorderFields(int *panMap) override;
113 : virtual OGRErr AlterFieldDefn(int iField, OGRFieldDefn *poNewFieldDefn,
114 : int nFlags) override;
115 : virtual OGRErr
116 : AlterGeomFieldDefn(int iGeomField,
117 : const OGRGeomFieldDefn *poNewGeomFieldDefn,
118 : int nFlagsIn) override;
119 : virtual OGRErr CreateGeomField(const OGRGeomFieldDefn *poGeomField,
120 : int bApproxOK = TRUE) override;
121 :
122 : int TestCapability(const char *) override;
123 :
124 1979 : const char *GetFIDColumn() override
125 : {
126 1979 : return m_osFIDColumn.c_str();
127 : }
128 :
129 895 : bool IsUpdatable() const
130 : {
131 895 : return m_bUpdatable;
132 : }
133 :
134 1324 : void SetUpdatable(bool bUpdatableIn)
135 : {
136 1324 : m_bUpdatable = bUpdatableIn;
137 1324 : }
138 :
139 890 : void SetAdvertizeUTF8(bool bAdvertizeUTF8In)
140 : {
141 890 : m_bAdvertizeUTF8 = bAdvertizeUTF8In;
142 890 : }
143 :
144 793 : void SetFIDColumn(const char *pszFIDColumn)
145 : {
146 793 : m_osFIDColumn = pszFIDColumn;
147 793 : }
148 :
149 430 : bool HasBeenUpdated() const
150 : {
151 430 : return m_bUpdated;
152 : }
153 :
154 319 : void SetUpdated(bool bUpdated)
155 : {
156 319 : m_bUpdated = bUpdated;
157 319 : }
158 :
159 25 : GIntBig GetNextReadFID()
160 : {
161 25 : return m_iNextReadFID;
162 : }
163 :
164 793 : void SetDataset(GDALDataset *poDS)
165 : {
166 793 : m_poDS = poDS;
167 793 : }
168 :
169 403 : GDALDataset *GetDataset() override
170 : {
171 403 : return m_poDS;
172 : }
173 : };
174 :
175 : /************************************************************************/
176 : /* OGRMemDataSource */
177 : /************************************************************************/
178 :
179 : class OGRMemDataSource CPL_NON_FINAL : public OGRDataSource
180 : {
181 : CPL_DISALLOW_COPY_ASSIGN(OGRMemDataSource)
182 :
183 : OGRMemLayer **papoLayers;
184 : int nLayers;
185 :
186 : char *pszName;
187 :
188 : public:
189 : OGRMemDataSource(const char *, char **);
190 : virtual ~OGRMemDataSource();
191 :
192 1358 : const char *GetName() override
193 : {
194 1358 : return pszName;
195 : }
196 :
197 2655 : int GetLayerCount() override
198 : {
199 2655 : return nLayers;
200 : }
201 :
202 : OGRLayer *GetLayer(int) override;
203 :
204 : OGRLayer *ICreateLayer(const char *pszName,
205 : const OGRGeomFieldDefn *poGeomFieldDefn,
206 : CSLConstList papszOptions) override;
207 : OGRErr DeleteLayer(int iLayer) override;
208 :
209 : int TestCapability(const char *) override;
210 :
211 : bool AddFieldDomain(std::unique_ptr<OGRFieldDomain> &&domain,
212 : std::string &failureReason) override;
213 :
214 : bool DeleteFieldDomain(const std::string &name,
215 : std::string &failureReason) override;
216 :
217 : bool UpdateFieldDomain(std::unique_ptr<OGRFieldDomain> &&domain,
218 : std::string &failureReason) override;
219 : };
220 :
221 : /************************************************************************/
222 : /* OGRMemDriver */
223 : /************************************************************************/
224 :
225 : class OGRMemDriver final : public OGRSFDriver
226 : {
227 : public:
228 : virtual ~OGRMemDriver();
229 :
230 : const char *GetName() override;
231 : OGRDataSource *Open(const char *, int) override;
232 :
233 : virtual OGRDataSource *CreateDataSource(const char *pszName,
234 : char ** = nullptr) override;
235 :
236 : int TestCapability(const char *) override;
237 : };
238 :
239 : #endif // ndef OGRMEM_H_INCLUDED
|