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