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