LCOV - code coverage report
Current view: top level - frmts/tiledb - tiledbdrivercore.cpp (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 72 73 98.6 %
Date: 2026-05-07 02:17:31 Functions: 4 4 100.0 %

          Line data    Source code
       1             : /******************************************************************************
       2             :  *
       3             :  * Project:  GDAL TileDB Driver
       4             :  * Purpose:  Implement GDAL TileDB Support based on https://www.tiledb.io
       5             :  * Author:   TileDB, Inc
       6             :  *
       7             :  ******************************************************************************
       8             :  * Copyright (c) 2023, TileDB, Inc
       9             :  *
      10             :  * SPDX-License-Identifier: MIT
      11             :  ****************************************************************************/
      12             : 
      13             : #define INCLUDE_ONLY_TILEDB_VERSION
      14             : #include "include_tiledb.h"
      15             : 
      16             : #include "gdal_frmts.h"
      17             : 
      18             : #ifdef PLUGIN_FILENAME
      19             : #include "gdalplugindriverproxy.h"
      20             : #endif
      21             : 
      22             : #include "tiledbdrivercore.h"
      23             : 
      24             : /************************************************************************/
      25             : /*                   TileDBDriverIdentifySimplified()                   */
      26             : /************************************************************************/
      27             : 
      28       72588 : int TileDBDriverIdentifySimplified(GDALOpenInfo *poOpenInfo)
      29             : 
      30             : {
      31       72588 :     if (poOpenInfo->pszFilename[0] == 0)
      32             :     {
      33         342 :         return FALSE;
      34             :     }
      35       72246 :     if (STARTS_WITH_CI(poOpenInfo->pszFilename, "TILEDB:"))
      36             :     {
      37           4 :         return TRUE;
      38             :     }
      39             : 
      40       72242 :     if (poOpenInfo->IsSingleAllowedDriver("TileDB"))
      41             :     {
      42         113 :         return TRUE;
      43             :     }
      44             : 
      45             :     const char *pszConfig =
      46       72129 :         CSLFetchNameValue(poOpenInfo->papszOpenOptions, "TILEDB_CONFIG");
      47             : 
      48       72129 :     if (pszConfig != nullptr)
      49             :     {
      50           0 :         return TRUE;
      51             :     }
      52             : 
      53       72129 :     if (!poOpenInfo->bIsDirectory &&
      54       69017 :         !STARTS_WITH_CI(poOpenInfo->pszFilename, "/VSI"))
      55             :     {
      56       29510 :         return false;
      57             :     }
      58             : 
      59       42619 :     const bool bIsS3OrGSOrAz =
      60       85234 :         STARTS_WITH_CI(poOpenInfo->pszFilename, "/VSIS3/") ||
      61       85233 :         STARTS_WITH_CI(poOpenInfo->pszFilename, "/VSIGS/") ||
      62       42614 :         STARTS_WITH_CI(poOpenInfo->pszFilename, "/VSIAZ/");
      63             :     // If this is a /vsi virtual file systems, bail out, except if it is AZ, S3 or GS.
      64       42619 :     if (bIsS3OrGSOrAz)
      65             :     {
      66             :         // HACK: probing a non existing object takes a lot of time, so avoid
      67             :         // doing that on filenames that are (hopefully) not TileDB.
      68           6 :         if (poOpenInfo->IsExtensionEqualToCI("tif"))
      69           6 :             return false;
      70             :     }
      71       42613 :     else if (STARTS_WITH_CI(poOpenInfo->pszFilename, "/VSI"))
      72             :     {
      73       41272 :         return false;
      74             :     }
      75             : 
      76        1341 :     return GDAL_IDENTIFY_UNKNOWN;
      77             : }
      78             : 
      79             : /************************************************************************/
      80             : /*                   TileDBDriverSetCommonMetadata()                    */
      81             : /************************************************************************/
      82             : 
      83             : #define XSTRINGIFY(X) #X
      84             : #define STRINGIFY(X) XSTRINGIFY(X)
      85             : 
      86        1832 : void TileDBDriverSetCommonMetadata(GDALDriver *poDriver)
      87             : {
      88        1832 :     poDriver->SetDescription(DRIVER_NAME);
      89        1832 :     poDriver->SetMetadataItem(GDAL_DCAP_RASTER, "YES");
      90        1832 :     poDriver->SetMetadataItem(GDAL_DCAP_VECTOR, "YES");
      91        1832 :     poDriver->SetMetadataItem(GDAL_DCAP_SUBCREATECOPY, "YES");
      92        1832 :     poDriver->SetMetadataItem(GDAL_DMD_LONGNAME, "TileDB");
      93        1832 :     poDriver->SetMetadataItem(GDAL_DMD_HELPTOPIC, "drivers/raster/tiledb.html");
      94        1832 :     poDriver->SetMetadataItem(GDAL_DMD_CREATIONDATATYPES,
      95             :                               "Byte UInt16 Int16 UInt32 Int32 Float32 "
      96        1832 :                               "Float64 CInt16 CInt32 CFloat32 CFloat64");
      97        1832 :     poDriver->SetMetadataItem(GDAL_DCAP_VIRTUALIO, "YES");
      98        1832 :     poDriver->SetMetadataItem(GDAL_DCAP_MEASURED_GEOMETRIES, "YES");
      99        1832 :     poDriver->SetMetadataItem(GDAL_DCAP_CURVE_GEOMETRIES, "YES");
     100        1832 :     poDriver->SetMetadataItem(GDAL_DCAP_Z_GEOMETRIES, "YES");
     101        1832 :     poDriver->SetMetadataItem(GDAL_DMD_SUBDATASETS, "YES");
     102        1832 :     poDriver->SetMetadataItem(GDAL_DCAP_CREATE_SUBDATASETS, "YES");
     103             : 
     104        1832 :     poDriver->SetMetadataItem(GDAL_DCAP_CREATE_LAYER, "YES");
     105        1832 :     poDriver->SetMetadataItem(GDAL_DCAP_CREATE_FIELD, "YES");
     106        1832 :     poDriver->SetMetadataItem(
     107             :         GDAL_DMD_CREATIONFIELDDATATYPES,
     108             :         "Integer Integer64 Real String Date Time DateTime "
     109        1832 :         "IntegerList Integer64List RealList Binary");
     110        1832 :     poDriver->SetMetadataItem(GDAL_DMD_CREATIONFIELDDATASUBTYPES,
     111        1832 :                               "Boolean Int16 Float32");
     112        1832 :     poDriver->SetMetadataItem(
     113             :         GDAL_DMD_CREATIONOPTIONLIST,
     114             :         "<CreationOptionList>\n"
     115             :         "   <Option name='COMPRESSION' scope='raster' type='string-select' "
     116             :         "description='image "
     117             :         "compression to use' default='NONE'>\n"
     118             :         "       <Value>NONE</Value>\n"
     119             :         "       <Value>GZIP</Value>\n"
     120             :         "       <Value>ZSTD</Value>\n"
     121             :         "       <Value>LZ4</Value>\n"
     122             :         "       <Value>RLE</Value>\n"
     123             :         "       <Value>BZIP2</Value>\n"
     124             :         "       <Value>DOUBLE-DELTA</Value>\n"
     125             :         "       <Value>POSITIVE-DELTA</Value>\n"
     126             :         "   </Option>\n"
     127             :         "   <Option name='COMPRESSION_LEVEL' scope='raster' type='int' "
     128             :         "description='Compression level'/>\n"
     129             :         "   <Option name='BLOCKXSIZE' scope='raster' type='int' "
     130             :         "description='Tile Width'/>"
     131             :         "   <Option name='BLOCKYSIZE' scope='raster' type='int' "
     132             :         "description='Tile Height'/>"
     133             :         "   <Option name='STATS' scope='raster' type='boolean' default='false' "
     134             :         "description='Dump TileDB stats'/>"
     135             :         "   <Option name='TILEDB_CONFIG' type='string' "
     136             :         "description='location "
     137             :         "of configuration file for TileDB'/>"
     138             :         "   <Option name='TILEDB_ATTRIBUTE' scope='raster' type='string' "
     139             :         "description='co-registered file to add as TileDB attributes, only "
     140             :         "applicable for interleave types of band or pixel'/>"
     141             :         "   <Option name='INTERLEAVE' scope='raster' type='string-select' "
     142             :         "description='Indexing order' default='BAND'>\n"
     143             :         "        <Value>BAND</Value>\n"
     144             :         "        <Value>PIXEL</Value>\n"
     145             :         "        <Value>ATTRIBUTES</Value>\n"
     146             :         "   </Option>\n"
     147             :         "   <Option name='TILEDB_TIMESTAMP' scope='raster' type='int' "
     148             :         "description='Create "
     149             :         "array at this timestamp, the timestamp should be > 0'/>\n"
     150             :         "   <Option name='CREATE_GROUP' type='boolean' "
     151             :         "description='Whether to create a group for multiple vector layer "
     152             :         "support (defaults to NO), or raster with overviews "
     153             :         "(defaults to YES)'/>"
     154        1832 :         "</CreationOptionList>\n");
     155             : 
     156             :     // clang-format off
     157        1832 :     poDriver->SetMetadataItem(
     158             :         GDAL_DMD_OPENOPTIONLIST,
     159             :         "<OpenOptionList>"
     160             :         "   <Option name='STATS' scope='raster' type='boolean' default='false' "
     161             :         "description='Dump TileDB stats'/>"
     162             :         "   <Option name='TILEDB_ATTRIBUTE' scope='raster' type='string' "
     163             :         "description='Attribute to read from each band'/>"
     164             :         "   <Option name='TILEDB_CONFIG' type='string' description='location "
     165             :         "of configuration file for TileDB'/>"
     166             :         "   <Option name='TILEDB_TIMESTAMP' type='int' description='Open array "
     167             :         "at this timestamp, the timestamp should be > 0'/>"
     168             :         "   <Option name='BATCH_SIZE' scope='vector' type='int' default='"
     169             :         STRINGIFY(DEFAULT_BATCH_SIZE) "' "
     170             :         "description='Number of features to fetch/write at once'/>"
     171             :         "   <Option name='DIM_X' type='string' scope='vector' default='_X' "
     172             :         "description='Name of the X dimension.'/>"
     173             :         "   <Option name='DIM_Y' type='string' scope='vector' default='_Y' "
     174             :         "description='Name of the Y dimension.'/>"
     175             :         "   <Option name='DIM_Z' type='string' scope='vector' default='_Z' "
     176             :         "description='Name of the Z dimension.'/>"
     177        1832 :         "</OpenOptionList>");
     178             :     // clang-format on
     179             : 
     180             :     // clang-format off
     181        1832 :     poDriver->SetMetadataItem(
     182             :         GDAL_DS_LAYER_CREATIONOPTIONLIST,
     183             :         "<LayerCreationOptionList>"
     184             :         "   <Option name='COMPRESSION' type='string-select' description='"
     185             :         "Compression to use' default='NONE'>\n"
     186             :         "       <Value>NONE</Value>\n"
     187             :         "       <Value>GZIP</Value>\n"
     188             :         "       <Value>ZSTD</Value>\n"
     189             :         "       <Value>LZ4</Value>\n"
     190             :         "       <Value>RLE</Value>\n"
     191             :         "       <Value>BZIP2</Value>\n"
     192             :         "       <Value>DOUBLE-DELTA</Value>\n"
     193             :         "       <Value>POSITIVE-DELTA</Value>\n"
     194             :         "   </Option>\n"
     195             :         "   <Option name='COMPRESSION_LEVEL' type='int' "
     196             :         "description='Compression level'/>\n"
     197             :         "   <Option name='BATCH_SIZE' type='int' default='"
     198             :         STRINGIFY(DEFAULT_BATCH_SIZE) "' "
     199             :         "description='Number of features to write at once'/>"
     200             :         "   <Option name='TILE_CAPACITY' type='int' default='"
     201             :         STRINGIFY(DEFAULT_TILE_CAPACITY) "' "
     202             :         "description='Number of non-empty cells stored in a data tile'/>"
     203             :         "   <Option name='BOUNDS' type='string' description='Specify "
     204             :         "bounds for sparse array, minx, miny, [minz,] maxx, maxy [, maxz]'/>\n"
     205             :         "   <Option name='TILE_EXTENT' type='float' description='Specify "
     206             :         "square X/Y tile extents for a sparse array'/>\n"
     207             :         "   <Option name='TILE_Z_EXTENT' type='float' description='Specify "
     208             :         "Z tile extents for a sparse array'/>\n"
     209             :         "   <Option name='ADD_Z_DIM' type='string-select' description='"
     210             :         "Whether to add a Z dimension' default='AUTO'>"
     211             :         "       <Value>AUTO</Value>"
     212             :         "       <Value>YES</Value>"
     213             :         "       <Value>NO</Value>"
     214             :         "   </Option>"
     215             :         "   <Option name='FID' type='string' description='Feature id column "
     216             :         "name. Set to empty to disable its creation.' default='FID'/>"
     217             :         "   <Option name='GEOMETRY_NAME' type='string' description='Name "
     218             :         "of the geometry column that will receive WKB encoded geometries. "
     219             :         "Set to empty to disable its creation (only for point).' "
     220             :         "default='wkb_geometry'/>"
     221             :         "   <Option name='TILEDB_TIMESTAMP' type='int' description='Create "
     222             :         "array at this timestamp, the timestamp should be > 0'/>"
     223             :         "   <Option name='TILEDB_STRING_TYPE' type='string-select' "
     224             :         "description='Which TileDB type to create string attributes' "
     225             :        "default='UTF8'"
     226             :         ">"
     227             :         "       <Value>UTF8</Value>"
     228             :         "       <Value>ASCII</Value>"
     229             :         "   </Option>"
     230             :         "   <Option name='STATS' type='boolean' default='false' "
     231             :         "description='Dump TileDB stats'/>"
     232        1832 :         "</LayerCreationOptionList>");
     233             :     // clang-format on
     234             : 
     235        1832 :     poDriver->SetMetadataItem(GDAL_DCAP_MULTIDIM_RASTER, "YES");
     236        1832 :     poDriver->SetMetadataItem(GDAL_DCAP_CREATE_MULTIDIMENSIONAL, "YES");
     237             : 
     238        1832 :     poDriver->SetMetadataItem(
     239             :         GDAL_DMD_MULTIDIM_DATASET_CREATIONOPTIONLIST,
     240             :         "<MultiDimDatasetCreationOptionList>"
     241             :         "   <Option name='TILEDB_CONFIG' type='string' description='location "
     242             :         "of configuration file for TileDB'/>"
     243             :         "   <Option name='TILEDB_TIMESTAMP' type='int' description='Create "
     244             :         "arrays at this timestamp, the timestamp should be > 0'/>"
     245             :         "   <Option name='STATS' type='boolean' default='false' "
     246             :         "description='Dump TileDB stats'/>"
     247        1832 :         "</MultiDimDatasetCreationOptionList>");
     248             : 
     249        1832 :     poDriver->SetMetadataItem(
     250             :         GDAL_DMD_MULTIDIM_ARRAY_OPENOPTIONLIST,
     251             :         "<MultiDimArrayOpenOptionList>"
     252             :         "   <Option name='TILEDB_TIMESTAMP' type='int' description='Open "
     253             :         "array at this timestamp, the timestamp should be > 0'/>"
     254        1832 :         "</MultiDimArrayOpenOptionList>");
     255             : 
     256        1832 :     poDriver->SetMetadataItem(
     257             :         GDAL_DMD_MULTIDIM_ARRAY_CREATIONOPTIONLIST,
     258             :         "<MultiDimArrayCreationOptionList>"
     259             :         "   <Option name='TILEDB_TIMESTAMP' type='int' description='Create "
     260             :         "array at this timestamp, the timestamp should be > 0'/>"
     261             :         "   <Option name='BLOCKSIZE' type='int' description='Block size in "
     262             :         "pixels'/>"
     263             :         "   <Option name='COMPRESSION' type='string-select' description='"
     264             :         "Compression to use' default='NONE'>\n"
     265             :         "       <Value>NONE</Value>\n"
     266             :         "       <Value>GZIP</Value>\n"
     267             :         "       <Value>ZSTD</Value>\n"
     268             :         "       <Value>LZ4</Value>\n"
     269             :         "       <Value>RLE</Value>\n"
     270             :         "       <Value>BZIP2</Value>\n"
     271             :         "       <Value>DOUBLE-DELTA</Value>\n"
     272             :         "       <Value>POSITIVE-DELTA</Value>\n"
     273             :         "   </Option>\n"
     274             :         "   <Option name='COMPRESSION_LEVEL' type='int' "
     275             :         "description='Compression level'/>\n"
     276             :         "   <Option name='STATS' type='boolean' default='false' "
     277             :         "description='Dump TileDB stats'/>"
     278             :         "   <Option name='IN_MEMORY'  type='boolean' default='false' "
     279             :         "description='Whether the array should be only in-memory. Useful to "
     280             :         "create an indexing variable that is serialized as a dimension label'/>"
     281        1832 :         "</MultiDimArrayCreationOptionList>");
     282             : 
     283        1832 :     poDriver->pfnIdentify = TileDBDriverIdentifySimplified;
     284        1832 :     poDriver->SetMetadataItem(GDAL_DCAP_OPEN, "YES");
     285        1832 :     poDriver->SetMetadataItem(GDAL_DCAP_CREATE, "YES");
     286        1832 :     poDriver->SetMetadataItem(GDAL_DCAP_CREATECOPY, "YES");
     287             : 
     288        1832 :     poDriver->SetMetadataItem(GDAL_DCAP_UPDATE, "YES");
     289        1832 :     poDriver->SetMetadataItem(GDAL_DMD_UPDATE_ITEMS, "RasterValues Features");
     290             : 
     291        1832 :     poDriver->SetMetadataItem(
     292             :         "TILEDB_VERSION",
     293             :         STRINGIFY(TILEDB_VERSION_MAJOR) "." STRINGIFY(
     294        1832 :             TILEDB_VERSION_MINOR) "." STRINGIFY(TILEDB_VERSION_PATCH));
     295        1832 : }
     296             : 
     297             : /************************************************************************/
     298             : /*                    DeclareDeferredTileDBPlugin()                     */
     299             : /************************************************************************/
     300             : 
     301             : #ifdef PLUGIN_FILENAME
     302        2068 : void DeclareDeferredTileDBPlugin()
     303             : {
     304        2068 :     if (GDALGetDriverByName(DRIVER_NAME) != nullptr)
     305             :     {
     306         263 :         return;
     307             :     }
     308        1805 :     auto poDriver = new GDALPluginDriverProxy(PLUGIN_FILENAME);
     309             : #ifdef PLUGIN_INSTALLATION_MESSAGE
     310             :     poDriver->SetMetadataItem(GDAL_DMD_PLUGIN_INSTALLATION_MESSAGE,
     311             :                               PLUGIN_INSTALLATION_MESSAGE);
     312             : #endif
     313        1805 :     TileDBDriverSetCommonMetadata(poDriver);
     314        1805 :     GetGDALDriverManager()->DeclareDeferredPluginDriver(poDriver);
     315             : }
     316             : #endif

Generated by: LCOV version 1.14