Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: Feather Translator 4 : * Purpose: Implements OGRFeatherDriver. 5 : * Author: Even Rouault, <even.rouault at spatialys.com> 6 : * 7 : ****************************************************************************** 8 : * Copyright (c) 2022, Planet Labs 9 : * 10 : * SPDX-License-Identifier: MIT 11 : ****************************************************************************/ 12 : 13 : #include "ogr_feather.h" 14 : 15 : #include "../arrow_common/ograrrowwriterlayer.hpp" 16 : 17 : /************************************************************************/ 18 : /* OGRFeatherWriterDataset() */ 19 : /************************************************************************/ 20 : 21 150 : OGRFeatherWriterDataset::OGRFeatherWriterDataset( 22 : const char *pszFilename, 23 150 : const std::shared_ptr<arrow::io::OutputStream> &poOutputStream) 24 : : m_osFilename(pszFilename), 25 : m_poMemoryPool(arrow::MemoryPool::CreateDefault()), 26 150 : m_poOutputStream(poOutputStream) 27 : { 28 150 : } 29 : 30 : /************************************************************************/ 31 : /* ~OGRFeatherWriterDataset() */ 32 : /************************************************************************/ 33 : 34 300 : OGRFeatherWriterDataset::~OGRFeatherWriterDataset() 35 : { 36 150 : OGRFeatherWriterDataset::Close(); 37 300 : } 38 : 39 : /************************************************************************/ 40 : /* Close() */ 41 : /************************************************************************/ 42 : 43 300 : CPLErr OGRFeatherWriterDataset::Close() 44 : { 45 300 : CPLErr eErr = CE_None; 46 300 : if (nOpenFlags != OPEN_FLAGS_CLOSED) 47 : { 48 150 : if (m_poLayer && !m_poLayer->Close()) 49 : { 50 0 : eErr = CE_Failure; 51 : } 52 : 53 150 : if (GDALPamDataset::Close() != CE_None) 54 : { 55 0 : eErr = CE_Failure; 56 : } 57 : } 58 : 59 300 : return eErr; 60 : } 61 : 62 : /************************************************************************/ 63 : /* GetLayerCount() */ 64 : /************************************************************************/ 65 : 66 330 : int OGRFeatherWriterDataset::GetLayerCount() const 67 : { 68 330 : return m_poLayer ? 1 : 0; 69 : } 70 : 71 : /************************************************************************/ 72 : /* GetLayer() */ 73 : /************************************************************************/ 74 : 75 110 : const OGRLayer *OGRFeatherWriterDataset::GetLayer(int idx) const 76 : { 77 110 : return idx == 0 ? m_poLayer.get() : nullptr; 78 : } 79 : 80 : /************************************************************************/ 81 : /* TestCapability() */ 82 : /************************************************************************/ 83 : 84 366 : int OGRFeatherWriterDataset::TestCapability(const char *pszCap) const 85 : { 86 366 : if (EQUAL(pszCap, ODsCCreateLayer)) 87 133 : return m_poLayer == nullptr; 88 233 : if (EQUAL(pszCap, ODsCAddFieldDomain)) 89 6 : return m_poLayer != nullptr; 90 227 : return false; 91 : } 92 : 93 : /************************************************************************/ 94 : /* ICreateLayer() */ 95 : /************************************************************************/ 96 : 97 : OGRLayer * 98 157 : OGRFeatherWriterDataset::ICreateLayer(const char *pszName, 99 : const OGRGeomFieldDefn *poGeomFieldDefn, 100 : CSLConstList papszOptions) 101 : { 102 157 : if (m_poLayer) 103 : { 104 7 : CPLError(CE_Failure, CPLE_NotSupported, 105 : "Can write only one layer in a Feather file"); 106 7 : return nullptr; 107 : } 108 : 109 150 : const auto eGType = poGeomFieldDefn ? poGeomFieldDefn->GetType() : wkbNone; 110 : const auto poSpatialRef = 111 150 : poGeomFieldDefn ? poGeomFieldDefn->GetSpatialRef() : nullptr; 112 : 113 150 : m_poLayer = std::make_unique<OGRFeatherWriterLayer>( 114 150 : this, m_poMemoryPool.get(), m_poOutputStream, pszName); 115 150 : if (!m_poLayer->SetOptions(m_osFilename, papszOptions, poSpatialRef, 116 : eGType)) 117 : { 118 9 : m_poLayer.reset(); 119 9 : return nullptr; 120 : } 121 141 : return m_poLayer.get(); 122 : } 123 : 124 : /************************************************************************/ 125 : /* AddFieldDomain() */ 126 : /************************************************************************/ 127 : 128 6 : bool OGRFeatherWriterDataset::AddFieldDomain( 129 : std::unique_ptr<OGRFieldDomain> &&domain, std::string &failureReason) 130 : { 131 6 : if (m_poLayer == nullptr) 132 : { 133 0 : failureReason = "Layer must be created"; 134 0 : return false; 135 : } 136 6 : return m_poLayer->AddFieldDomain(std::move(domain), failureReason); 137 : } 138 : 139 : /************************************************************************/ 140 : /* GetFieldDomainNames() */ 141 : /************************************************************************/ 142 : 143 : std::vector<std::string> 144 0 : OGRFeatherWriterDataset::GetFieldDomainNames(CSLConstList) const 145 : { 146 0 : return m_poLayer ? m_poLayer->GetFieldDomainNames() 147 0 : : std::vector<std::string>(); 148 : } 149 : 150 : /************************************************************************/ 151 : /* GetFieldDomain() */ 152 : /************************************************************************/ 153 : 154 : const OGRFieldDomain * 155 9 : OGRFeatherWriterDataset::GetFieldDomain(const std::string &name) const 156 : { 157 9 : return m_poLayer ? m_poLayer->GetFieldDomain(name) : nullptr; 158 : }