LCOV - code coverage report
Current view: top level - ogr/ogrsf_frmts/hana - ogrhanautils.cpp (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 55 83 66.3 %
Date: 2024-11-21 22:18:42 Functions: 11 13 84.6 %

          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             :  * SPDX-License-Identifier: MIT
      11             :  ****************************************************************************/
      12             : 
      13             : #include "ogrhanautils.h"
      14             : #include "cpl_string.h"
      15             : 
      16             : #include <algorithm>
      17             : 
      18             : namespace OGRHANA
      19             : {
      20             : 
      21         112 : HanaVersion HanaVersion::fromString(const char *version)
      22             : {
      23         224 :     CPLString splVersion(version);
      24         112 :     splVersion.replaceAll('-', '.').replaceAll(' ', '.');
      25             : 
      26         224 :     const CPLStringList parts(CSLTokenizeString2(splVersion, ".", 0));
      27         112 :     if (parts.size() < 3)
      28           0 :         return HanaVersion(0, 0, 0);
      29             : 
      30         112 :     return HanaVersion(atoi(parts[0]), atoi(parts[1]), atoi(parts[2]));
      31             : }
      32             : 
      33          39 : const char *SkipLeadingSpaces(const char *value)
      34             : {
      35          39 :     while (*value == ' ')
      36           0 :         value++;
      37          39 :     return value;
      38             : }
      39             : 
      40         200 : CPLString JoinStrings(const std::vector<CPLString> &strs, const char *delimiter,
      41             :                       CPLString (*decorator)(const CPLString &str))
      42             : {
      43         200 :     CPLString ret;
      44        1576 :     for (std::size_t i = 0; i < strs.size(); ++i)
      45             :     {
      46        1376 :         ret += ((decorator != nullptr) ? decorator(strs[i]) : strs[i]);
      47        1376 :         if (i != strs.size() - 1)
      48        1176 :             ret += delimiter;
      49             :     }
      50         200 :     return ret;
      51             : }
      52             : 
      53          56 : std::vector<CPLString> SplitStrings(const char *str, const char *delimiter)
      54             : {
      55          56 :     std::vector<CPLString> ret;
      56          56 :     if (str != nullptr)
      57             :     {
      58          56 :         char **items = CSLTokenizeString2(str, delimiter, CSLT_HONOURSTRINGS);
      59          56 :         for (int i = 0; items[i] != nullptr; ++i)
      60             :         {
      61           0 :             CPLString item(items[i]);
      62           0 :             ret.push_back(item.Trim());
      63             :         }
      64             : 
      65          56 :         CSLDestroy(items);
      66             :     }
      67             : 
      68          56 :     return ret;
      69             : }
      70             : 
      71           0 : CPLString GetFullTableName(const CPLString &schemaName,
      72             :                            const CPLString &tableName)
      73             : {
      74           0 :     if (schemaName.empty())
      75           0 :         return tableName;
      76           0 :     return schemaName + "." + tableName;
      77             : }
      78             : 
      79         661 : CPLString GetFullTableNameQuoted(const CPLString &schemaName,
      80             :                                  const CPLString &tableName)
      81             : {
      82         661 :     if (schemaName.empty())
      83           0 :         return QuotedIdentifier(tableName);
      84        1322 :     return QuotedIdentifier(schemaName) + "." + QuotedIdentifier(tableName);
      85             : }
      86             : 
      87           0 : CPLString GetFullColumnNameQuoted(const CPLString &schemaName,
      88             :                                   const CPLString &tableName,
      89             :                                   const CPLString &columnName)
      90             : {
      91           0 :     return GetFullTableNameQuoted(schemaName, tableName) + "." +
      92           0 :            QuotedIdentifier(columnName);
      93             : }
      94             : 
      95           4 : CPLString Literal(const CPLString &value)
      96             : {
      97           4 :     CPLString ret("'");
      98           4 :     char *tmp = CPLEscapeString(value, -1, CPLES_SQL);
      99           4 :     ret += tmp;
     100           4 :     CPLFree(tmp);
     101           4 :     ret += "'";
     102           4 :     return ret;
     103             : }
     104             : 
     105        2378 : CPLString QuotedIdentifier(const CPLString &value)
     106             : {
     107        4756 :     return "\"" + value + "\"";
     108             : }
     109             : 
     110          87 : bool IsArrayField(OGRFieldType fieldType)
     111             : {
     112          82 :     return (fieldType == OFTIntegerList || fieldType == OFTInteger64List ||
     113         169 :             fieldType == OFTRealList || fieldType == OFTStringList ||
     114          87 :             fieldType == OFTWideStringList);
     115             : }
     116             : 
     117         126 : bool IsGeometryTypeSupported(OGRwkbGeometryType wkbType)
     118             : {
     119         126 :     switch (wkbFlatten(wkbType))
     120             :     {
     121         125 :         case OGRwkbGeometryType::wkbPoint:
     122             :         case OGRwkbGeometryType::wkbLineString:
     123             :         case OGRwkbGeometryType::wkbPolygon:
     124             :         case OGRwkbGeometryType::wkbMultiPoint:
     125             :         case OGRwkbGeometryType::wkbMultiLineString:
     126             :         case OGRwkbGeometryType::wkbMultiPolygon:
     127             :         case OGRwkbGeometryType::wkbCircularString:
     128             :         case OGRwkbGeometryType::wkbGeometryCollection:
     129         125 :             return true;
     130           1 :         default:
     131           1 :             return false;
     132             :     }
     133             : }
     134             : 
     135          16 : OGRwkbGeometryType ToWkbType(const char *type, bool hasZ, bool hasM)
     136             : {
     137          16 :     if (strcmp(type, "ST_POINT") == 0)
     138           1 :         return OGR_GT_SetModifier(OGRwkbGeometryType::wkbPoint, hasZ, hasM);
     139          15 :     else if (strcmp(type, "ST_MULTIPOINT") == 0)
     140           0 :         return OGR_GT_SetModifier(OGRwkbGeometryType::wkbMultiPoint, hasZ,
     141           0 :                                   hasM);
     142          15 :     else if (strcmp(type, "ST_LINESTRING") == 0)
     143           0 :         return OGR_GT_SetModifier(OGRwkbGeometryType::wkbLineString, hasZ,
     144           0 :                                   hasM);
     145          15 :     else if (strcmp(type, "ST_MULTILINESTRING") == 0)
     146           0 :         return OGR_GT_SetModifier(OGRwkbGeometryType::wkbMultiLineString, hasZ,
     147           0 :                                   hasM);
     148          15 :     else if (strcmp(type, "ST_POLYGON") == 0)
     149          15 :         return OGR_GT_SetModifier(OGRwkbGeometryType::wkbPolygon, hasZ, hasM);
     150           0 :     else if (strcmp(type, "ST_MULTIPOLYGON") == 0)
     151           0 :         return OGR_GT_SetModifier(OGRwkbGeometryType::wkbMultiPolygon, hasZ,
     152           0 :                                   hasM);
     153           0 :     else if (strcmp(type, "ST_CIRCULARSTRING") == 0)
     154           0 :         return OGR_GT_SetModifier(OGRwkbGeometryType::wkbCircularString, hasZ,
     155           0 :                                   hasM);
     156           0 :     else if (strcmp(type, "ST_GEOMETRYCOLLECTION") == 0)
     157           0 :         return OGR_GT_SetModifier(OGRwkbGeometryType::wkbGeometryCollection,
     158           0 :                                   hasZ, hasM);
     159           0 :     return OGRwkbGeometryType::wkbUnknown;
     160             : }
     161             : 
     162             : constexpr int PLANAR_SRID_OFFSET = 1000000000;
     163             : 
     164           4 : int ToPlanarSRID(int srid)
     165             : {
     166           4 :     return srid < PLANAR_SRID_OFFSET ? PLANAR_SRID_OFFSET + srid : srid;
     167             : }
     168             : 
     169             : }  // namespace OGRHANA

Generated by: LCOV version 1.14