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