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 : /* GetLayerCount() */ 32 : /************************************************************************/ 33 : 34 330 : int OGRFeatherWriterDataset::GetLayerCount() 35 : { 36 330 : return m_poLayer ? 1 : 0; 37 : } 38 : 39 : /************************************************************************/ 40 : /* GetLayer() */ 41 : /************************************************************************/ 42 : 43 110 : OGRLayer *OGRFeatherWriterDataset::GetLayer(int idx) 44 : { 45 110 : return idx == 0 ? m_poLayer.get() : nullptr; 46 : } 47 : 48 : /************************************************************************/ 49 : /* TestCapability() */ 50 : /************************************************************************/ 51 : 52 366 : int OGRFeatherWriterDataset::TestCapability(const char *pszCap) 53 : { 54 366 : if (EQUAL(pszCap, ODsCCreateLayer)) 55 133 : return m_poLayer == nullptr; 56 233 : if (EQUAL(pszCap, ODsCAddFieldDomain)) 57 6 : return m_poLayer != nullptr; 58 227 : return false; 59 : } 60 : 61 : /************************************************************************/ 62 : /* ICreateLayer() */ 63 : /************************************************************************/ 64 : 65 : OGRLayer * 66 157 : OGRFeatherWriterDataset::ICreateLayer(const char *pszName, 67 : const OGRGeomFieldDefn *poGeomFieldDefn, 68 : CSLConstList papszOptions) 69 : { 70 157 : if (m_poLayer) 71 : { 72 7 : CPLError(CE_Failure, CPLE_NotSupported, 73 : "Can write only one layer in a Feather file"); 74 7 : return nullptr; 75 : } 76 : 77 150 : const auto eGType = poGeomFieldDefn ? poGeomFieldDefn->GetType() : wkbNone; 78 : const auto poSpatialRef = 79 150 : poGeomFieldDefn ? poGeomFieldDefn->GetSpatialRef() : nullptr; 80 : 81 150 : m_poLayer = std::make_unique<OGRFeatherWriterLayer>( 82 150 : this, m_poMemoryPool.get(), m_poOutputStream, pszName); 83 150 : if (!m_poLayer->SetOptions(m_osFilename, papszOptions, poSpatialRef, 84 : eGType)) 85 : { 86 9 : m_poLayer.reset(); 87 9 : return nullptr; 88 : } 89 141 : return m_poLayer.get(); 90 : } 91 : 92 : /************************************************************************/ 93 : /* AddFieldDomain() */ 94 : /************************************************************************/ 95 : 96 6 : bool OGRFeatherWriterDataset::AddFieldDomain( 97 : std::unique_ptr<OGRFieldDomain> &&domain, std::string &failureReason) 98 : { 99 6 : if (m_poLayer == nullptr) 100 : { 101 0 : failureReason = "Layer must be created"; 102 0 : return false; 103 : } 104 6 : return m_poLayer->AddFieldDomain(std::move(domain), failureReason); 105 : } 106 : 107 : /************************************************************************/ 108 : /* GetFieldDomainNames() */ 109 : /************************************************************************/ 110 : 111 : std::vector<std::string> 112 0 : OGRFeatherWriterDataset::GetFieldDomainNames(CSLConstList) const 113 : { 114 0 : return m_poLayer ? m_poLayer->GetFieldDomainNames() 115 0 : : std::vector<std::string>(); 116 : } 117 : 118 : /************************************************************************/ 119 : /* GetFieldDomain() */ 120 : /************************************************************************/ 121 : 122 : const OGRFieldDomain * 123 9 : OGRFeatherWriterDataset::GetFieldDomain(const std::string &name) const 124 : { 125 9 : return m_poLayer ? m_poLayer->GetFieldDomain(name) : nullptr; 126 : }