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