LCOV - code coverage report
Current view: top level - frmts/zarr - zarrdrivercore.cpp (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 39 39 100.0 %
Date: 2025-02-20 10:14:44 Functions: 3 3 100.0 %

          Line data    Source code
       1             : /******************************************************************************
       2             :  *
       3             :  * Project:  GDAL
       4             :  * Purpose:  Zarr driver
       5             :  * Author:   Even Rouault <even dot rouault at spatialys.com>
       6             :  *
       7             :  ******************************************************************************
       8             :  * Copyright (c) 2021, Even Rouault <even dot rouault at spatialys.com>
       9             :  *
      10             :  * SPDX-License-Identifier: MIT
      11             :  ****************************************************************************/
      12             : 
      13             : #include "zarrdrivercore.h"
      14             : 
      15             : /************************************************************************/
      16             : /*                    CheckExistenceOfOneZarrFile()                     */
      17             : /************************************************************************/
      18             : 
      19        1425 : static bool CheckExistenceOfOneZarrFile(const char *pszFilename)
      20             : {
      21             : 
      22             :     CPLString osMDFilename =
      23        2850 :         CPLFormFilenameSafe(pszFilename, ".zarray", nullptr);
      24             : 
      25             :     VSIStatBufL sStat;
      26        1425 :     if (VSIStatL(osMDFilename, &sStat) == 0)
      27         470 :         return true;
      28             : 
      29         955 :     osMDFilename = CPLFormFilenameSafe(pszFilename, ".zgroup", nullptr);
      30         955 :     if (VSIStatL(osMDFilename, &sStat) == 0)
      31         438 :         return true;
      32             : 
      33             :     // Zarr V3
      34         517 :     osMDFilename = CPLFormFilenameSafe(pszFilename, "zarr.json", nullptr);
      35         517 :     if (VSIStatL(osMDFilename, &sStat) == 0)
      36         420 :         return true;
      37             : 
      38          97 :     return false;
      39             : }
      40             : 
      41             : /************************************************************************/
      42             : /*                     ZARRDriverIdentify()                             */
      43             : /************************************************************************/
      44             : 
      45       50672 : int ZARRDriverIdentify(GDALOpenInfo *poOpenInfo)
      46             : 
      47             : {
      48       50672 :     if (STARTS_WITH(poOpenInfo->pszFilename, "ZARR:"))
      49             :     {
      50          46 :         return TRUE;
      51             :     }
      52             : 
      53       50626 :     if (!poOpenInfo->bIsDirectory)
      54             :     {
      55       49178 :         return FALSE;
      56             :     }
      57             : 
      58        1448 :     return CheckExistenceOfOneZarrFile(poOpenInfo->pszFilename);
      59             : }
      60             : 
      61             : /************************************************************************/
      62             : /*                     ZARRDriverSetCommonMetadata()                    */
      63             : /************************************************************************/
      64             : 
      65        1384 : void ZARRDriverSetCommonMetadata(GDALDriver *poDriver)
      66             : {
      67        1384 :     poDriver->SetDescription(DRIVER_NAME);
      68        1384 :     poDriver->SetMetadataItem(GDAL_DCAP_RASTER, "YES");
      69        1384 :     poDriver->SetMetadataItem(GDAL_DCAP_MULTIDIM_RASTER, "YES");
      70        1384 :     poDriver->SetMetadataItem(GDAL_DMD_LONGNAME, "Zarr");
      71        1384 :     poDriver->SetMetadataItem(GDAL_DMD_EXTENSION, "zarr");
      72        1384 :     poDriver->SetMetadataItem(
      73             :         GDAL_DMD_CREATIONDATATYPES,
      74             :         "Int8 Byte Int16 UInt16 Int32 UInt32 Int64 UInt64 "
      75        1384 :         "Float16 Float32 Float64 CFLoat16 CFloat32 CFloat64");
      76        1384 :     poDriver->SetMetadataItem(GDAL_DCAP_VIRTUALIO, "YES");
      77        1384 :     poDriver->SetMetadataItem(GDAL_DMD_SUBDATASETS, "YES");
      78             : 
      79        1384 :     poDriver->SetMetadataItem(
      80             :         GDAL_DMD_OPENOPTIONLIST,
      81             :         "<OpenOptionList>"
      82             :         "   <Option name='USE_ZMETADATA' type='boolean' description='Whether "
      83             :         "to use consolidated metadata from .zmetadata' default='YES'/>"
      84             :         "   <Option name='CACHE_TILE_PRESENCE' type='boolean' "
      85             :         "description='Whether to establish an initial listing of present "
      86             :         "tiles' default='NO'/>"
      87             :         "   <Option name='MULTIBAND' type='boolean' default='YES' "
      88             :         "description='Whether to expose >= 3D arrays as GDAL multiband "
      89             :         "datasets "
      90             :         "(when using the classic 2D API)'/>"
      91             :         "   <Option name='DIM_X' type='string' description="
      92             :         "'Name or index of the X dimension (only used when MULTIBAND=YES)'/>"
      93             :         "   <Option name='DIM_Y' type='string' description="
      94             :         "'Name or index of the Y dimension (only used when MULTIBAND=YES)'/>"
      95             :         "   <Option name='LOAD_EXTRA_DIM_METADATA_DELAY' type='string' "
      96             :         "description="
      97             :         "'Maximum delay in seconds allowed to set the DIM_{dimname}_VALUE band "
      98             :         "metadata items'/>"
      99        1384 :         "</OpenOptionList>");
     100             : 
     101        1384 :     poDriver->SetMetadataItem(
     102             :         GDAL_DMD_MULTIDIM_DATASET_CREATIONOPTIONLIST,
     103             :         "<MultiDimDatasetCreationOptionList>"
     104             :         "   <Option name='FORMAT' type='string-select' default='ZARR_V2'>"
     105             :         "     <Value>ZARR_V2</Value>"
     106             :         "     <Value>ZARR_V3</Value>"
     107             :         "   </Option>"
     108             :         "   <Option name='CREATE_ZMETADATA' type='boolean' "
     109             :         "description='Whether to create consolidated metadata into .zmetadata "
     110             :         "(Zarr V2 only)' default='YES'/>"
     111        1384 :         "</MultiDimDatasetCreationOptionList>");
     112             : 
     113        1384 :     poDriver->pfnIdentify = ZARRDriverIdentify;
     114        1384 :     poDriver->SetMetadataItem(GDAL_DCAP_OPEN, "YES");
     115        1384 :     poDriver->SetMetadataItem(GDAL_DCAP_CREATE, "YES");
     116        1384 :     poDriver->SetMetadataItem(GDAL_DCAP_CREATE_MULTIDIMENSIONAL, "YES");
     117             : 
     118        1384 :     poDriver->SetMetadataItem(GDAL_DCAP_UPDATE, "YES");
     119        1384 :     poDriver->SetMetadataItem(GDAL_DMD_UPDATE_ITEMS,
     120             :                               "GeoTransform SRS NoData "
     121             :                               "RasterValues "
     122        1384 :                               "DatasetMetadata BandMetadata");
     123        1384 : }
     124             : 
     125             : /************************************************************************/
     126             : /*                    DeclareDeferredZarrPlugin()                       */
     127             : /************************************************************************/
     128             : 
     129             : #ifdef PLUGIN_FILENAME
     130             : void DeclareDeferredZarrPlugin()
     131             : {
     132             :     if (GDALGetDriverByName(DRIVER_NAME) != nullptr)
     133             :     {
     134             :         return;
     135             :     }
     136             :     auto poDriver = new GDALPluginDriverProxy(PLUGIN_FILENAME);
     137             : #ifdef PLUGIN_INSTALLATION_MESSAGE
     138             :     poDriver->SetMetadataItem(GDAL_DMD_PLUGIN_INSTALLATION_MESSAGE,
     139             :                               PLUGIN_INSTALLATION_MESSAGE);
     140             : #endif
     141             :     ZARRDriverSetCommonMetadata(poDriver);
     142             :     GetGDALDriverManager()->DeclareDeferredPluginDriver(poDriver);
     143             : }
     144             : #endif

Generated by: LCOV version 1.14