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