Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: OpenGIS Simple Features Reference Implementation 4 : * Purpose: Implements FileGDB OGR result layer. 5 : * Author: Even Rouault, <even dot rouault at spatialys.com> 6 : * 7 : ****************************************************************************** 8 : * Copyright (c) 2012, Even Rouault <even dot rouault at spatialys.com> 9 : * 10 : * SPDX-License-Identifier: MIT 11 : ****************************************************************************/ 12 : 13 : #include "ogr_fgdb.h" 14 : #include "cpl_conv.h" 15 : #include "cpl_string.h" 16 : #include "FGdbUtils.h" 17 : 18 : using std::string; 19 : using std::wstring; 20 : 21 : /************************************************************************/ 22 : /* FGdbResultLayer() */ 23 : /************************************************************************/ 24 2 : FGdbResultLayer::FGdbResultLayer(FGdbDataSource *pParentDataSource, 25 2 : const char *pszSQL, EnumRows *pEnumRows) 26 : { 27 2 : m_pFeatureDefn = new OGRFeatureDefn("result"); 28 2 : SetDescription(m_pFeatureDefn->GetName()); 29 2 : m_pFeatureDefn->Reference(); 30 2 : m_pEnumRows = pEnumRows; 31 2 : m_pDS = pParentDataSource; 32 2 : osSQL = pszSQL; 33 : 34 2 : m_suppressColumnMappingError = false; 35 : 36 4 : FieldInfo fieldInfo; 37 2 : m_pEnumRows->GetFieldInformation(fieldInfo); 38 : 39 : int fieldCount; 40 2 : fieldInfo.GetFieldCount(fieldCount); 41 8 : for (int i = 0; i < fieldCount; i++) 42 : { 43 : FieldType fieldType; 44 12 : string strFieldType; 45 12 : wstring fieldName; 46 6 : fieldInfo.GetFieldType(i, fieldType); 47 6 : fieldInfo.GetFieldName(i, fieldName); 48 : 49 6 : OGRFieldType eType = OFTString; 50 6 : int bSkip = FALSE; 51 : 52 6 : switch (fieldType) 53 : { 54 0 : case fieldTypeSmallInteger: 55 : case fieldTypeInteger: 56 0 : eType = OFTInteger; 57 0 : break; 58 : 59 0 : case fieldTypeSingle: 60 0 : eType = OFTReal; 61 0 : strFieldType = "esriFieldTypeSingle"; 62 0 : break; 63 : 64 2 : case fieldTypeDouble: 65 2 : eType = OFTReal; 66 2 : break; 67 : 68 1 : case fieldTypeString: 69 1 : eType = OFTString; 70 1 : break; 71 : 72 0 : case fieldTypeDate: 73 0 : eType = OFTDateTime; 74 0 : break; 75 : 76 2 : case fieldTypeOID: 77 2 : bSkip = TRUE; 78 2 : break; 79 : 80 1 : case fieldTypeGeometry: 81 1 : bSkip = TRUE; 82 1 : break; 83 : 84 0 : case fieldTypeBlob: 85 0 : eType = OFTBinary; 86 0 : break; 87 : 88 0 : case fieldTypeRaster: 89 0 : bSkip = TRUE; 90 0 : break; 91 : 92 0 : case fieldTypeGUID: 93 0 : break; 94 : 95 0 : case fieldTypeGlobalID: 96 0 : break; 97 : 98 0 : case fieldTypeXML: 99 0 : break; 100 : 101 0 : default: 102 0 : CPLAssert(false); 103 : break; 104 : } 105 : 106 6 : if (!bSkip) 107 : { 108 6 : OGRFieldDefn oFieldDefn(WStringToString(fieldName).c_str(), eType); 109 : // cppcheck-suppress danglingTemporaryLifetime 110 3 : m_pFeatureDefn->AddFieldDefn(&oFieldDefn); 111 : 112 3 : m_vOGRFieldToESRIField.push_back(fieldName); 113 3 : m_vOGRFieldToESRIFieldType.push_back(strFieldType); 114 : } 115 : } 116 2 : } 117 : 118 : /************************************************************************/ 119 : /* ~FGdbResultLayer() */ 120 : /************************************************************************/ 121 : 122 4 : FGdbResultLayer::~FGdbResultLayer() 123 : { 124 4 : } 125 : 126 : /************************************************************************/ 127 : /* ResetReading() */ 128 : /************************************************************************/ 129 : 130 0 : void FGdbResultLayer::ResetReading() 131 : { 132 0 : m_pEnumRows->Close(); 133 : long hr; 134 0 : if (FAILED(hr = m_pDS->GetGDB()->ExecuteSQL(StringToWString(osSQL), true, 135 : *m_pEnumRows))) 136 : { 137 0 : GDBErr(hr, CPLSPrintf("Failed at executing '%s'", osSQL.c_str())); 138 : } 139 0 : } 140 : 141 : /************************************************************************/ 142 : /* TestCapability() */ 143 : /************************************************************************/ 144 : 145 0 : int FGdbResultLayer::TestCapability(const char *) 146 : { 147 0 : return FALSE; 148 : }