LCOV - code coverage report
Current view: top level - frmts/icechunk - icechunkdrivercore.cpp (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 31 31 100.0 %
Date: 2026-06-19 21:24:00 Functions: 2 2 100.0 %

          Line data    Source code
       1             : /******************************************************************************
       2             :  *
       3             :  * Project:  GDAL
       4             :  * Purpose:  Icechunk driver
       5             :  * Author:   Even Rouault <even dot rouault at spatialys.com>
       6             :  *
       7             :  ******************************************************************************
       8             :  * Copyright (c) 2026, Even Rouault <even dot rouault at spatialys.com>
       9             :  *
      10             :  * SPDX-License-Identifier: MIT
      11             :  ****************************************************************************/
      12             : 
      13             : #include "icechunkdrivercore.h"
      14             : #include "gdal_frmts.h"
      15             : #include "gdal_dataset.h"
      16             : #include "gdalplugindriverproxy.h"
      17             : #include "cpl_vsi_virtual.h"
      18             : 
      19             : /************************************************************************/
      20             : /*                       IcechunkDriverIdentify()                       */
      21             : /************************************************************************/
      22             : 
      23       58123 : int IcechunkDriverIdentify(GDALOpenInfo *poOpenInfo)
      24             : {
      25      116230 :     if (STARTS_WITH_CI(poOpenInfo->pszFilename, ICECHUNK_PREFIX) ||
      26       58107 :         poOpenInfo->IsSingleAllowedDriver(DRIVER_NAME))
      27             :     {
      28          16 :         return true;
      29             :     }
      30             : 
      31             :     // Detect /repo file
      32       58107 :     if (poOpenInfo->nHeaderBytes >= HEADER_SIZE &&
      33        1441 :         memcmp(poOpenInfo->pabyHeader, abySIG, SIG_SIZE) == 0 &&
      34          54 :         poOpenInfo->pabyHeader[SIG_SIZE + IMPLEMENTATION_NAME_SIZE +
      35          54 :                                SPEC_VERSION_SIZE] == FILE_TYPE_REPO_INFO)
      36             :     {
      37          54 :         return true;
      38             :     }
      39             : 
      40       58053 :     if (poOpenInfo->bIsDirectory)
      41             :     {
      42             :         VSIStatBufL sStat;
      43         848 :         return VSIStatL(CPLFormFilenameSafe(poOpenInfo->pszFilename,
      44             :                                             "snapshots", nullptr)
      45             :                             .c_str(),
      46         200 :                         &sStat) == 0 &&
      47         524 :                VSIStatL(CPLFormFilenameSafe(poOpenInfo->pszFilename,
      48             :                                             "transactions", nullptr)
      49             :                             .c_str(),
      50         948 :                         &sStat) == 0 &&
      51         524 :                (VSIStatL(CPLFormFilenameSafe(poOpenInfo->pszFilename, "repo",
      52             :                                              nullptr)
      53             :                              .c_str(),
      54          16 :                          &sStat) == 0 ||
      55         432 :                 VSIStatL(CPLFormFilenameSafe(poOpenInfo->pszFilename, "refs",
      56             :                                              nullptr)
      57             :                              .c_str(),
      58         424 :                          &sStat) == 0);
      59             :     }
      60             : 
      61       57629 :     return false;
      62             : }
      63             : 
      64             : /************************************************************************/
      65             : /*                  IcechunkDriverSetCommonMetadata()                   */
      66             : /************************************************************************/
      67             : 
      68        1872 : void IcechunkDriverSetCommonMetadata(GDALDriver *poDriver)
      69             : {
      70        1872 :     poDriver->SetDescription(DRIVER_NAME);
      71        1872 :     poDriver->SetMetadataItem(GDAL_DCAP_RASTER, "YES");
      72        1872 :     poDriver->SetMetadataItem(GDAL_DCAP_MULTIDIM_RASTER, "YES");
      73        1872 :     poDriver->SetMetadataItem(GDAL_DMD_LONGNAME, "Icechunk");
      74        1872 :     poDriver->SetMetadataItem(GDAL_DCAP_VIRTUALIO, "YES");
      75        1872 :     poDriver->SetMetadataItem(GDAL_DMD_CONNECTION_PREFIX, ICECHUNK_PREFIX);
      76             : 
      77        3744 :     poDriver->DeclareAlgorithm({LIST_BRANCHES});
      78        3744 :     poDriver->DeclareAlgorithm({LIST_TAGS});
      79             : 
      80        1872 :     poDriver->pfnIdentify = IcechunkDriverIdentify;
      81        1872 :     poDriver->SetMetadataItem(GDAL_DCAP_OPEN, "YES");
      82        1872 : }
      83             : 
      84             : /************************************************************************/
      85             : /*                   DeclareDeferredIcechunkPlugin()                    */
      86             : /************************************************************************/
      87             : 
      88             : #ifdef PLUGIN_FILENAME
      89             : void DeclareDeferredIcechunkPlugin()
      90             : {
      91             :     if (GDALGetDriverByName(DRIVER_NAME) != nullptr)
      92             :     {
      93             :         return;
      94             :     }
      95             :     auto poDriver = std::make_unique<GDALPluginDriverProxy>(PLUGIN_FILENAME);
      96             : #ifdef PLUGIN_INSTALLATION_MESSAGE
      97             :     poDriver->SetMetadataItem(GDAL_DMD_PLUGIN_INSTALLATION_MESSAGE,
      98             :                               PLUGIN_INSTALLATION_MESSAGE);
      99             : #endif
     100             :     IcechunkDriverSetCommonMetadata(poDriver.get());
     101             :     GetGDALDriverManager()->DeclareDeferredPluginDriver(poDriver.release());
     102             : 
     103             :     // trigger the loading of the plugin if /vsiicechunk/ is queried
     104             :     VSIFileManager::RegisterHandlerLoader(
     105             :         FS_PREFIX,
     106             :         []()
     107             :         {
     108             :             auto poDrv = GetGDALDriverManager()->GetDriverByName(DRIVER_NAME);
     109             :             // Querying any non-standard driver metadata forces the plugin
     110             :             // to be loaded.
     111             :             if (poDrv)
     112             :                 poDrv->GetMetadata("FORCE_LOAD");
     113             :         });
     114             : }
     115             : #endif

Generated by: LCOV version 1.14