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