Line data Source code
1 : /******************************************************************************
2 : *
3 : * Project: SAP HANA Spatial Driver
4 : * Purpose: OGRHanaUtils class implementation
5 : * Author: Maxim Rylov
6 : *
7 : ******************************************************************************
8 : * Copyright (c) 2020, SAP SE
9 : *
10 : * Permission is hereby granted, free of charge, to any person obtaining a
11 : * copy of this software and associated documentation files (the "Software"),
12 : * to deal in the Software without restriction, including without limitation
13 : * the rights to use, copy, modify, merge, publish, distribute, sublicense,
14 : * and/or sell copies of the Software, and to permit persons to whom the
15 : * Software is furnished to do so, subject to the following conditions:
16 : *
17 : * The above copyright notice and this permission notice shall be included
18 : * in all copies or substantial portions of the Software.
19 : *
20 : * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
21 : * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22 : * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
23 : * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24 : * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
25 : * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
26 : * DEALINGS IN THE SOFTWARE.
27 : ****************************************************************************/
28 :
29 : #include "ogrhanautils.h"
30 :
31 : #include <algorithm>
32 :
33 : namespace OGRHANA
34 : {
35 :
36 39 : const char *SkipLeadingSpaces(const char *value)
37 : {
38 39 : while (*value == ' ')
39 0 : value++;
40 39 : return value;
41 : }
42 :
43 186 : CPLString JoinStrings(const std::vector<CPLString> &strs, const char *delimiter,
44 : CPLString (*decorator)(const CPLString &str))
45 : {
46 186 : CPLString ret;
47 1469 : for (std::size_t i = 0; i < strs.size(); ++i)
48 : {
49 1283 : ret += ((decorator != nullptr) ? decorator(strs[i]) : strs[i]);
50 1283 : if (i != strs.size() - 1)
51 1097 : ret += delimiter;
52 : }
53 186 : return ret;
54 : }
55 :
56 52 : std::vector<CPLString> SplitStrings(const char *str, const char *delimiter)
57 : {
58 52 : std::vector<CPLString> ret;
59 52 : if (str != nullptr)
60 : {
61 52 : char **items = CSLTokenizeString2(str, delimiter, CSLT_HONOURSTRINGS);
62 52 : for (int i = 0; items[i] != nullptr; ++i)
63 : {
64 0 : CPLString item(items[i]);
65 0 : ret.push_back(item.Trim());
66 : }
67 :
68 52 : CSLDestroy(items);
69 : }
70 :
71 52 : return ret;
72 : }
73 :
74 0 : CPLString GetFullTableName(const CPLString &schemaName,
75 : const CPLString &tableName)
76 : {
77 0 : if (schemaName.empty())
78 0 : return tableName;
79 0 : return schemaName + "." + tableName;
80 : }
81 :
82 579 : CPLString GetFullTableNameQuoted(const CPLString &schemaName,
83 : const CPLString &tableName)
84 : {
85 579 : if (schemaName.empty())
86 0 : return QuotedIdentifier(tableName);
87 1158 : return QuotedIdentifier(schemaName) + "." + QuotedIdentifier(tableName);
88 : }
89 :
90 0 : CPLString GetFullColumnNameQuoted(const CPLString &schemaName,
91 : const CPLString &tableName,
92 : const CPLString &columnName)
93 : {
94 0 : return GetFullTableNameQuoted(schemaName, tableName) + "." +
95 0 : QuotedIdentifier(columnName);
96 : }
97 :
98 4 : CPLString Literal(const CPLString &value)
99 : {
100 4 : CPLString ret("'");
101 4 : char *tmp = CPLEscapeString(value, -1, CPLES_SQL);
102 4 : ret += tmp;
103 4 : CPLFree(tmp);
104 4 : ret += "'";
105 4 : return ret;
106 : }
107 :
108 2145 : CPLString QuotedIdentifier(const CPLString &value)
109 : {
110 4290 : return "\"" + value + "\"";
111 : }
112 :
113 87 : bool IsArrayField(OGRFieldType fieldType)
114 : {
115 82 : return (fieldType == OFTIntegerList || fieldType == OFTInteger64List ||
116 169 : fieldType == OFTRealList || fieldType == OFTStringList ||
117 87 : fieldType == OFTWideStringList);
118 : }
119 :
120 124 : bool IsGeometryTypeSupported(OGRwkbGeometryType wkbType)
121 : {
122 124 : switch (wkbFlatten(wkbType))
123 : {
124 123 : case OGRwkbGeometryType::wkbPoint:
125 : case OGRwkbGeometryType::wkbLineString:
126 : case OGRwkbGeometryType::wkbPolygon:
127 : case OGRwkbGeometryType::wkbMultiPoint:
128 : case OGRwkbGeometryType::wkbMultiLineString:
129 : case OGRwkbGeometryType::wkbMultiPolygon:
130 : case OGRwkbGeometryType::wkbCircularString:
131 : case OGRwkbGeometryType::wkbGeometryCollection:
132 123 : return true;
133 1 : default:
134 1 : return false;
135 : }
136 : }
137 :
138 16 : OGRwkbGeometryType ToWkbType(const char *type, bool hasZ, bool hasM)
139 : {
140 16 : if (strcmp(type, "ST_POINT") == 0)
141 1 : return OGR_GT_SetModifier(OGRwkbGeometryType::wkbPoint, hasZ, hasM);
142 15 : else if (strcmp(type, "ST_MULTIPOINT") == 0)
143 0 : return OGR_GT_SetModifier(OGRwkbGeometryType::wkbMultiPoint, hasZ,
144 0 : hasM);
145 15 : else if (strcmp(type, "ST_LINESTRING") == 0)
146 0 : return OGR_GT_SetModifier(OGRwkbGeometryType::wkbLineString, hasZ,
147 0 : hasM);
148 15 : else if (strcmp(type, "ST_MULTILINESTRING") == 0)
149 0 : return OGR_GT_SetModifier(OGRwkbGeometryType::wkbMultiLineString, hasZ,
150 0 : hasM);
151 15 : else if (strcmp(type, "ST_POLYGON") == 0)
152 15 : return OGR_GT_SetModifier(OGRwkbGeometryType::wkbPolygon, hasZ, hasM);
153 0 : else if (strcmp(type, "ST_MULTIPOLYGON") == 0)
154 0 : return OGR_GT_SetModifier(OGRwkbGeometryType::wkbMultiPolygon, hasZ,
155 0 : hasM);
156 0 : else if (strcmp(type, "ST_CIRCULARSTRING") == 0)
157 0 : return OGR_GT_SetModifier(OGRwkbGeometryType::wkbCircularString, hasZ,
158 0 : hasM);
159 0 : else if (strcmp(type, "ST_GEOMETRYCOLLECTION") == 0)
160 0 : return OGR_GT_SetModifier(OGRwkbGeometryType::wkbGeometryCollection,
161 0 : hasZ, hasM);
162 0 : return OGRwkbGeometryType::wkbUnknown;
163 : }
164 :
165 : constexpr int PLANAR_SRID_OFFSET = 1000000000;
166 :
167 2 : int ToPlanarSRID(int srid)
168 : {
169 2 : return srid < PLANAR_SRID_OFFSET ? PLANAR_SRID_OFFSET + srid : srid;
170 : }
171 :
172 : } // namespace OGRHANA
|