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 290 : OGRParquetWriterDataset::OGRParquetWriterDataset( 22 290 : const std::shared_ptr<arrow::io::OutputStream> &poOutputStream) 23 : : m_poMemoryPool(arrow::MemoryPool::CreateDefault()), 24 290 : m_poOutputStream(poOutputStream) 25 : { 26 290 : } 27 : 28 : /************************************************************************/ 29 : /* ~OGRParquetWriterDataset() */ 30 : /************************************************************************/ 31 : 32 576 : OGRParquetWriterDataset::~OGRParquetWriterDataset() 33 : { 34 290 : OGRParquetWriterDataset::Close(); 35 576 : } 36 : 37 : /************************************************************************/ 38 : /* Close() */ 39 : /************************************************************************/ 40 : 41 568 : CPLErr OGRParquetWriterDataset::Close() 42 : { 43 568 : CPLErr eErr = CE_None; 44 568 : if (nOpenFlags != OPEN_FLAGS_CLOSED) 45 : { 46 290 : if (m_poLayer && !m_poLayer->Close()) 47 : { 48 0 : eErr = CE_Failure; 49 : } 50 : 51 290 : if (GDALPamDataset::Close() != CE_None) 52 : { 53 0 : eErr = CE_Failure; 54 : } 55 : } 56 : 57 568 : 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 309 : OGRParquetWriterDataset::ICreateLayer(const char *pszName, 97 : const OGRGeomFieldDefn *poGeomFieldDefn, 98 : CSLConstList papszOptions) 99 : { 100 309 : 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 292 : m_poLayer = std::make_unique<OGRParquetWriterLayer>( 108 292 : this, m_poMemoryPool.get(), m_poOutputStream, pszName); 109 292 : if (!m_poLayer->SetOptions(poGeomFieldDefn, papszOptions)) 110 : { 111 3 : m_poLayer.reset(); 112 3 : return nullptr; 113 : } 114 289 : return m_poLayer.get(); 115 : } 116 : 117 : /************************************************************************/ 118 : /* AddFieldDomain() */ 119 : /************************************************************************/ 120 : 121 6 : bool OGRParquetWriterDataset::AddFieldDomain( 122 : std::unique_ptr<OGRFieldDomain> &&domain, std::string &failureReason) 123 : { 124 6 : if (m_poLayer == nullptr) 125 : { 126 1 : failureReason = "Layer must be created"; 127 1 : return false; 128 : } 129 5 : return m_poLayer->AddFieldDomain(std::move(domain), failureReason); 130 : } 131 : 132 : /************************************************************************/ 133 : /* GetFieldDomainNames() */ 134 : /************************************************************************/ 135 : 136 : std::vector<std::string> 137 1 : OGRParquetWriterDataset::GetFieldDomainNames(CSLConstList) const 138 : { 139 0 : return m_poLayer ? m_poLayer->GetFieldDomainNames() 140 1 : : std::vector<std::string>(); 141 : } 142 : 143 : /************************************************************************/ 144 : /* GetFieldDomain() */ 145 : /************************************************************************/ 146 : 147 : const OGRFieldDomain * 148 7 : OGRParquetWriterDataset::GetFieldDomain(const std::string &name) const 149 : { 150 7 : return m_poLayer ? m_poLayer->GetFieldDomain(name) : nullptr; 151 : }