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