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