LCOV - code coverage report
Current view: top level - ogr/ogrsf_frmts/adbc - ogr_adbc.h (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 0 47 0.0 %
Date: 2024-11-21 22:18:42 Functions: 0 18 0.0 %

          Line data    Source code
       1             : /******************************************************************************
       2             :  *
       3             :  * Project:  GDAL
       4             :  * Purpose:  Arrow Database Connectivity driver
       5             :  * Author:   Even Rouault, <even dot rouault at spatialys.com>
       6             :  *
       7             :  ******************************************************************************
       8             :  * Copyright (c) 2024, Even Rouault <even dot rouault at spatialys.com>
       9             :  *
      10             :  * SPDX-License-Identifier: MIT
      11             :  ****************************************************************************/
      12             : 
      13             : #ifndef OGR_ADBC_INCLUDED
      14             : #define OGR_ADBC_INCLUDED
      15             : 
      16             : #include "gdal_priv.h"
      17             : #include "ogrsf_frmts.h"
      18             : #include "ogrlayerarrow.h"
      19             : 
      20             : #include "ogr_adbc_internal.h"
      21             : 
      22             : /************************************************************************/
      23             : /*                 OGRArrowArrayToOGRFeatureAdapterLayer                */
      24             : /************************************************************************/
      25             : 
      26             : class OGRArrowArrayToOGRFeatureAdapterLayer final : public OGRLayer
      27             : {
      28             :     friend class OGRADBCLayer;
      29             :     OGRFeatureDefn *m_poLayerDefn = nullptr;
      30             :     std::vector<std::unique_ptr<OGRFeature>> m_apoFeatures{};
      31             : 
      32             :     CPL_DISALLOW_COPY_ASSIGN(OGRArrowArrayToOGRFeatureAdapterLayer)
      33             : 
      34             :   public:
      35           0 :     explicit OGRArrowArrayToOGRFeatureAdapterLayer(const char *pszName)
      36           0 :     {
      37           0 :         m_poLayerDefn = new OGRFeatureDefn(pszName);
      38           0 :         m_poLayerDefn->SetGeomType(wkbNone);
      39           0 :         m_poLayerDefn->Reference();
      40           0 :     }
      41             : 
      42           0 :     ~OGRArrowArrayToOGRFeatureAdapterLayer()
      43           0 :     {
      44           0 :         m_poLayerDefn->Release();
      45           0 :     }
      46             : 
      47           0 :     OGRFeatureDefn *GetLayerDefn() override
      48             :     {
      49           0 :         return m_poLayerDefn;
      50             :     }
      51             : 
      52           0 :     void ResetReading() override
      53             :     {
      54           0 :     }
      55             : 
      56           0 :     OGRFeature *GetNextFeature() override
      57             :     {
      58           0 :         return nullptr;
      59             :     }
      60             : 
      61           0 :     int TestCapability(const char *pszCap) override
      62             :     {
      63           0 :         return EQUAL(pszCap, OLCCreateField) ||
      64           0 :                EQUAL(pszCap, OLCSequentialWrite);
      65             :     }
      66             : 
      67           0 :     OGRErr CreateField(const OGRFieldDefn *poFieldDefn, int) override
      68             :     {
      69           0 :         m_poLayerDefn->AddFieldDefn(poFieldDefn);
      70           0 :         return OGRERR_NONE;
      71             :     }
      72             : 
      73           0 :     OGRErr ICreateFeature(OGRFeature *poFeature) override
      74             :     {
      75             :         m_apoFeatures.emplace_back(
      76           0 :             std::unique_ptr<OGRFeature>(poFeature->Clone()));
      77           0 :         return OGRERR_NONE;
      78             :     }
      79             : };
      80             : 
      81             : /************************************************************************/
      82             : /*                            OGRADBCLayer                              */
      83             : /************************************************************************/
      84             : 
      85             : class OGRADBCDataset;
      86             : 
      87             : class OGRADBCLayer final : public OGRLayer,
      88             :                            public OGRGetNextFeatureThroughRaw<OGRADBCLayer>
      89             : {
      90             :     friend class OGRADBCDataset;
      91             : 
      92             :     OGRADBCDataset *m_poDS = nullptr;
      93             :     std::unique_ptr<AdbcStatement> m_statement{};
      94             :     std::unique_ptr<OGRArrowArrayToOGRFeatureAdapterLayer> m_poAdapterLayer{};
      95             :     std::unique_ptr<OGRArrowArrayStream> m_stream{};
      96             : 
      97             :     struct ArrowSchema m_schema
      98             :     {
      99             :     };
     100             : 
     101             :     bool m_bEOF = false;
     102             :     size_t m_nIdx = 0;
     103             :     GIntBig m_nFeatureID = 0;
     104             :     bool m_bIsParquetLayer = false;
     105             : 
     106             :     OGRFeature *GetNextRawFeature();
     107             :     bool GetArrowStreamInternal(struct ArrowArrayStream *out_stream);
     108             :     GIntBig GetFeatureCountParquet();
     109             : 
     110             :     CPL_DISALLOW_COPY_ASSIGN(OGRADBCLayer)
     111             : 
     112             :   public:
     113             :     OGRADBCLayer(OGRADBCDataset *poDS, const char *pszName,
     114             :                  std::unique_ptr<AdbcStatement> poStatement,
     115             :                  std::unique_ptr<OGRArrowArrayStream> poStream,
     116             :                  ArrowSchema *schema);
     117             :     ~OGRADBCLayer() override;
     118             : 
     119           0 :     OGRFeatureDefn *GetLayerDefn() override
     120             :     {
     121           0 :         return m_poAdapterLayer->GetLayerDefn();
     122             :     }
     123             : 
     124             :     void ResetReading() override;
     125           0 :     DEFINE_GET_NEXT_FEATURE_THROUGH_RAW(OGRADBCLayer)
     126             :     int TestCapability(const char *) override;
     127             :     GDALDataset *GetDataset() override;
     128             :     bool GetArrowStream(struct ArrowArrayStream *out_stream,
     129             :                         CSLConstList papszOptions = nullptr) override;
     130             :     GIntBig GetFeatureCount(int bForce) override;
     131             : };
     132             : 
     133             : /************************************************************************/
     134             : /*                            OGRADBCDataset                            */
     135             : /************************************************************************/
     136             : 
     137             : class OGRADBCDataset final : public GDALDataset
     138             : {
     139             :     friend class OGRADBCLayer;
     140             : 
     141             :     AdbcDriver m_driver{};
     142             :     AdbcDatabase m_database{};
     143             :     std::unique_ptr<AdbcConnection> m_connection{};
     144             :     std::vector<std::unique_ptr<OGRLayer>> m_apoLayers{};
     145             :     std::string m_osParquetFilename{};
     146             : 
     147             :   public:
     148           0 :     OGRADBCDataset() = default;
     149             :     ~OGRADBCDataset() override;
     150             : 
     151             :     bool Open(const GDALOpenInfo *poOpenInfo);
     152             : 
     153           0 :     int GetLayerCount() override
     154             :     {
     155           0 :         return static_cast<int>(m_apoLayers.size());
     156             :     }
     157             : 
     158           0 :     OGRLayer *GetLayer(int idx) override
     159             :     {
     160           0 :         return (idx >= 0 && idx < GetLayerCount()) ? m_apoLayers[idx].get()
     161           0 :                                                    : nullptr;
     162             :     }
     163             : 
     164             :     OGRLayer *GetLayerByName(const char *pszName) override;
     165             : 
     166             :     std::unique_ptr<OGRADBCLayer> CreateLayer(const char *pszStatement,
     167             :                                               const char *pszLayerName);
     168             : 
     169             :     OGRLayer *ExecuteSQL(const char *pszStatement, OGRGeometry *poSpatialFilter,
     170             :                          const char *pszDialect) override;
     171             : };
     172             : 
     173             : /************************************************************************/
     174             : /*                            OGRADBCError                              */
     175             : /************************************************************************/
     176             : 
     177             : struct OGRADBCError
     178             : {
     179             :     AdbcError error{ADBC_ERROR_INIT};
     180             : 
     181             :     inline OGRADBCError() = default;
     182             : 
     183           0 :     inline ~OGRADBCError()
     184           0 :     {
     185           0 :         clear();
     186           0 :     }
     187             : 
     188           0 :     inline void clear()
     189             :     {
     190           0 :         if (error.release)
     191           0 :             error.release(&error);
     192           0 :         memset(&error, 0, sizeof(error));
     193           0 :     }
     194             : 
     195           0 :     inline const char *message() const
     196             :     {
     197           0 :         return error.message ? error.message : "";
     198             :     }
     199             : 
     200           0 :     inline operator AdbcError *()
     201             :     {
     202           0 :         return &error;
     203             :     }
     204             : 
     205             :     CPL_DISALLOW_COPY_ASSIGN(OGRADBCError)
     206             : };
     207             : 
     208             : #endif  // OGR_ADBC_INCLUDED

Generated by: LCOV version 1.14