1 /******************************************************************************
2 * Project: OGR
3 * Purpose: OGRGMLASDriver implementation
4 * Author: Even Rouault, <even dot rouault at spatialys dot com>
5 *
6 * Initial development funded by the European Earth observation programme
7 * Copernicus
8 *
9 ******************************************************************************
10 * Copyright (c) 2016, Even Rouault, <even dot rouault at spatialys dot 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 // Must be first for DEBUG_BOOL case
32 #include "ogr_gmlas.h"
33
34 CPL_CVSID("$Id: ogrgmlasfeatureclass.cpp 2ec160d4331d3d6b0fbd965d4875b1445b61717e 2019-09-29 23:20:49 +0200 Even Rouault $")
35
36 /************************************************************************/
37 /* GMLASField() */
38 /************************************************************************/
39
GMLASField()40 GMLASField::GMLASField()
41 : m_eType(GMLAS_FT_STRING)
42 , m_eGeomType(wkbNone)
43 , m_nWidth(0)
44 , m_bNotNullable(false)
45 , m_bArray(false)
46 , m_bList(false)
47 , m_eCategory(REGULAR)
48 , m_nMinOccurs(-1)
49 , m_nMaxOccurs(-1)
50 , m_bRepetitionOnSequence(false)
51 , m_bIncludeThisEltInBlob(false)
52 , m_bIgnored(false)
53 , m_bMayAppearOutOfOrder(false)
54 {
55 }
56
57 /************************************************************************/
58 /* GetTypeFromString() */
59 /************************************************************************/
60
GetTypeFromString(const CPLString & osType)61 GMLASFieldType GMLASField::GetTypeFromString( const CPLString& osType )
62 {
63 if( osType == szXS_STRING ||
64 osType == szXS_TOKEN ||
65 osType == szXS_NMTOKEN ||
66 osType == szXS_NCNAME ||
67 osType == szXS_QNAME ||
68 osType == szXS_IDREF )
69 {
70 // token has special processing by XML processor: all leading/trailing
71 // white space is removed
72 return GMLAS_FT_STRING;
73 }
74 else if( osType == szXS_ID )
75 return GMLAS_FT_ID;
76 else if( osType == szXS_BOOLEAN )
77 return GMLAS_FT_BOOLEAN;
78 else if( osType == szXS_SHORT )
79 return GMLAS_FT_SHORT;
80 else if( osType == szXS_INT )
81 return GMLAS_FT_INT32;
82 else if( osType == szXS_BYTE ||
83 osType == szXS_INTEGER ||
84 osType == szXS_NEGATIVE_INTEGER ||
85 osType == szXS_NON_NEGATIVE_INTEGER ||
86 osType == szXS_NON_POSITIVE_INTEGER ||
87 osType == szXS_POSITIVE_INTEGER ||
88 osType == szXS_UNSIGNED_BYTE ||
89 osType == szXS_UNSIGNED_SHORT ||
90 osType == szXS_UNSIGNED_INT) // FIXME ?
91 return GMLAS_FT_INT32;
92 else if( osType == szXS_LONG ||
93 osType == szXS_UNSIGNED_LONG )
94 return GMLAS_FT_INT64;
95 else if( osType == szXS_FLOAT )
96 return GMLAS_FT_FLOAT;
97 else if( osType == szXS_DOUBLE )
98 return GMLAS_FT_DOUBLE;
99 else if( osType == szXS_DECIMAL )
100 return GMLAS_FT_DECIMAL;
101 else if( osType == szXS_DATE )
102 return GMLAS_FT_DATE;
103 else if( osType == szXS_GYEAR )
104 return GMLAS_FT_GYEAR;
105 else if( osType == szXS_GYEAR_MONTH )
106 return GMLAS_FT_GYEAR_MONTH;
107 else if( osType == szXS_TIME )
108 return GMLAS_FT_TIME;
109 else if( osType == szXS_DATETIME )
110 return GMLAS_FT_DATETIME;
111 else if( osType == szXS_ANY_URI )
112 return GMLAS_FT_ANYURI;
113 else if( osType == szXS_ANY_TYPE )
114 return GMLAS_FT_ANYTYPE;
115 else if( osType == szXS_ANY_SIMPLE_TYPE )
116 return GMLAS_FT_ANYSIMPLETYPE;
117 else if( osType == szXS_DURATION )
118 return GMLAS_FT_STRING;
119 else if( osType == szXS_BASE64BINARY )
120 return GMLAS_FT_BASE64BINARY;
121 else if( osType == szXS_HEXBINARY )
122 return GMLAS_FT_HEXBINARY;
123 else
124 {
125 CPLError(CE_Warning, CPLE_AppDefined,
126 "Unhandled type: %s", osType.c_str());
127 return GMLAS_FT_STRING;
128 }
129 }
130
131 /************************************************************************/
132 /* SetType() */
133 /************************************************************************/
134
SetType(GMLASFieldType eType,const char * pszTypeName)135 void GMLASField::SetType(GMLASFieldType eType, const char* pszTypeName)
136 {
137 m_eType = eType;
138 m_osTypeName = pszTypeName;
139 }
140
141 /************************************************************************/
142 /* GMLASFeatureClass() */
143 /************************************************************************/
144
GMLASFeatureClass()145 GMLASFeatureClass::GMLASFeatureClass()
146 : m_bIsRepeatedSequence(false)
147 , m_bIsGroup(false)
148 , m_bIsTopLevelElt(false)
149 {
150 }
151
152 /************************************************************************/
153 /* SetName() */
154 /************************************************************************/
155
SetName(const CPLString & osName)156 void GMLASFeatureClass::SetName(const CPLString& osName)
157 {
158 m_osName = osName;
159 }
160
161 /************************************************************************/
162 /* SetXPath() */
163 /************************************************************************/
164
SetXPath(const CPLString & osXPath)165 void GMLASFeatureClass::SetXPath(const CPLString& osXPath)
166 {
167 m_osXPath = osXPath;
168 }
169
170 /************************************************************************/
171 /* AddField() */
172 /************************************************************************/
173
AddField(const GMLASField & oField)174 void GMLASFeatureClass::AddField( const GMLASField& oField )
175 {
176 m_aoFields.push_back(oField);
177 }
178
179 /************************************************************************/
180 /* PrependFields() */
181 /************************************************************************/
182
PrependFields(const std::vector<GMLASField> & aoFields)183 void GMLASFeatureClass::PrependFields( const std::vector<GMLASField>& aoFields )
184 {
185 m_aoFields.insert( m_aoFields.begin(), aoFields.begin(), aoFields.end() );
186 }
187
188 /************************************************************************/
189 /* AppendFields() */
190 /************************************************************************/
191
AppendFields(const std::vector<GMLASField> & aoFields)192 void GMLASFeatureClass::AppendFields( const std::vector<GMLASField>& aoFields )
193 {
194 m_aoFields.insert( m_aoFields.end(), aoFields.begin(), aoFields.end() );
195 }
196
197 /************************************************************************/
198 /* AddNestedClass() */
199 /************************************************************************/
200
AddNestedClass(const GMLASFeatureClass & oNestedClass)201 void GMLASFeatureClass::AddNestedClass( const GMLASFeatureClass& oNestedClass )
202 {
203 m_aoNestedClasses.push_back(oNestedClass);
204 }
205