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 : * Permission is hereby granted, free of charge, to any person obtaining a
11 : * copy of this software and associated documentation files (the "Software"),
12 : * to deal in the Software without restriction, including without limitation
13 : * the rights to use, copy, modify, merge, publish, distribute, sublicense,
14 : * and/or sell copies of the Software, and to permit persons to whom the
15 : * Software is furnished to do so, subject to the following conditions:
16 : *
17 : * The above copyright notice and this permission notice shall be included
18 : * in all copies or substantial portions of the Software.
19 : *
20 : * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
21 : * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22 : * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
23 : * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24 : * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
25 : * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
26 : * DEALINGS IN THE SOFTWARE.
27 : ****************************************************************************/
28 :
29 : #define INCLUDE_ONLY_TILEDB_VERSION
30 : #include "include_tiledb.h"
31 :
32 : #include "tiledbdrivercore.h"
33 :
34 : /************************************************************************/
35 : /* TileDBDriverIdentifySimplified() */
36 : /************************************************************************/
37 :
38 24588 : static int TileDBDriverIdentifySimplified(GDALOpenInfo *poOpenInfo)
39 :
40 : {
41 24588 : if (STARTS_WITH_CI(poOpenInfo->pszFilename, "TILEDB:"))
42 : {
43 0 : return TRUE;
44 : }
45 :
46 : const char *pszConfig =
47 24588 : CSLFetchNameValue(poOpenInfo->papszOpenOptions, "TILEDB_CONFIG");
48 :
49 24588 : if (pszConfig != nullptr)
50 : {
51 0 : return TRUE;
52 : }
53 :
54 49176 : const bool bIsS3OrGS = STARTS_WITH_CI(poOpenInfo->pszFilename, "/VSIS3/") ||
55 24588 : STARTS_WITH_CI(poOpenInfo->pszFilename, "/VSIGS/");
56 : // If this is a /vsi virtual file systems, bail out, except if it is S3 or GS.
57 24588 : if (!bIsS3OrGS && STARTS_WITH(poOpenInfo->pszFilename, "/vsi"))
58 : {
59 15165 : return false;
60 : }
61 :
62 9423 : if (poOpenInfo->bIsDirectory)
63 : {
64 81 : return GDAL_IDENTIFY_UNKNOWN;
65 : }
66 :
67 9342 : if (bIsS3OrGS && !EQUAL(CPLGetExtension(poOpenInfo->pszFilename), "tif"))
68 : {
69 0 : return GDAL_IDENTIFY_UNKNOWN;
70 : }
71 :
72 9342 : return FALSE;
73 : }
74 :
75 : /************************************************************************/
76 : /* TileDBDriverSetCommonMetadata() */
77 : /************************************************************************/
78 :
79 : #define XSTRINGIFY(X) #X
80 : #define STRINGIFY(X) XSTRINGIFY(X)
81 :
82 1236 : void TileDBDriverSetCommonMetadata(GDALDriver *poDriver)
83 : {
84 1236 : poDriver->SetDescription(DRIVER_NAME);
85 1236 : poDriver->SetMetadataItem(GDAL_DCAP_RASTER, "YES");
86 1236 : poDriver->SetMetadataItem(GDAL_DCAP_VECTOR, "YES");
87 1236 : poDriver->SetMetadataItem(GDAL_DCAP_SUBCREATECOPY, "YES");
88 1236 : poDriver->SetMetadataItem(GDAL_DMD_LONGNAME, "TileDB");
89 1236 : poDriver->SetMetadataItem(GDAL_DMD_HELPTOPIC, "drivers/raster/tiledb.html");
90 1236 : poDriver->SetMetadataItem(GDAL_DMD_CREATIONDATATYPES,
91 : "Byte UInt16 Int16 UInt32 Int32 Float32 "
92 1236 : "Float64 CInt16 CInt32 CFloat32 CFloat64");
93 1236 : poDriver->SetMetadataItem(GDAL_DCAP_VIRTUALIO, "YES");
94 1236 : poDriver->SetMetadataItem(GDAL_DCAP_MEASURED_GEOMETRIES, "YES");
95 1236 : poDriver->SetMetadataItem(GDAL_DCAP_CURVE_GEOMETRIES, "YES");
96 1236 : poDriver->SetMetadataItem(GDAL_DCAP_Z_GEOMETRIES, "YES");
97 1236 : poDriver->SetMetadataItem(GDAL_DMD_SUBDATASETS, "YES");
98 :
99 1236 : poDriver->SetMetadataItem(GDAL_DCAP_CREATE_FIELD, "YES");
100 1236 : poDriver->SetMetadataItem(
101 : GDAL_DMD_CREATIONFIELDDATATYPES,
102 : "Integer Integer64 Real String Date Time DateTime "
103 1236 : "IntegerList Integer64List RealList Binary");
104 1236 : poDriver->SetMetadataItem(GDAL_DMD_CREATIONFIELDDATASUBTYPES,
105 1236 : "Boolean Int16 Float32");
106 1236 : poDriver->SetMetadataItem(
107 : GDAL_DMD_CREATIONOPTIONLIST,
108 : "<CreationOptionList>\n"
109 : " <Option name='COMPRESSION' scope='raster' type='string-select' "
110 : "description='image "
111 : "compression to use' default='NONE'>\n"
112 : " <Value>NONE</Value>\n"
113 : " <Value>GZIP</Value>\n"
114 : " <Value>ZSTD</Value>\n"
115 : " <Value>LZ4</Value>\n"
116 : " <Value>RLE</Value>\n"
117 : " <Value>BZIP2</Value>\n"
118 : " <Value>DOUBLE-DELTA</Value>\n"
119 : " <Value>POSITIVE-DELTA</Value>\n"
120 : " </Option>\n"
121 : " <Option name='COMPRESSION_LEVEL' scope='raster' type='int' "
122 : "description='Compression level'/>\n"
123 : " <Option name='BLOCKXSIZE' scope='raster' type='int' "
124 : "description='Tile Width'/>"
125 : " <Option name='BLOCKYSIZE' scope='raster' type='int' "
126 : "description='Tile Height'/>"
127 : " <Option name='STATS' scope='raster' type='boolean' default='false' "
128 : "description='Dump TileDB stats'/>"
129 : " <Option name='TILEDB_CONFIG' type='string' "
130 : "description='location "
131 : "of configuration file for TileDB'/>"
132 : " <Option name='TILEDB_ATTRIBUTE' scope='raster' type='string' "
133 : "description='co-registered file to add as TileDB attributes, only "
134 : "applicable for interleave types of band or pixel'/>"
135 : " <Option name='INTERLEAVE' scope='raster' type='string-select' "
136 : "description='Indexing order' default='BAND'>\n"
137 : " <Value>BAND</Value>\n"
138 : " <Value>PIXEL</Value>\n"
139 : " <Value>ATTRIBUTES</Value>\n"
140 : " </Option>\n"
141 : " <Option name='TILEDB_TIMESTAMP' scope='raster' type='int' "
142 : "description='Create "
143 : "array at this timestamp, the timestamp should be > 0'/>\n"
144 : " <Option name='BOUNDS' scope='raster' type='string' "
145 : "description='Specify "
146 : "bounds for sparse array, minx, miny, maxx, maxy'/>\n"
147 : " <Option name='CREATE_GROUP' scope='vector' type='boolean' "
148 : "description='Whether to create a group for multiple layer support' "
149 : "default='NO'/>"
150 1236 : "</CreationOptionList>\n");
151 :
152 : // clang-format off
153 1236 : poDriver->SetMetadataItem(
154 : GDAL_DMD_OPENOPTIONLIST,
155 : "<OpenOptionList>"
156 : " <Option name='STATS' scope='raster' type='boolean' default='false' "
157 : "description='Dump TileDB stats'/>"
158 : " <Option name='TILEDB_ATTRIBUTE' scope='raster' type='string' "
159 : "description='Attribute to read from each band'/>"
160 : " <Option name='TILEDB_CONFIG' type='string' description='location "
161 : "of configuration file for TileDB'/>"
162 : " <Option name='TILEDB_TIMESTAMP' type='int' description='Open array "
163 : "at this timestamp, the timestamp should be > 0'/>"
164 : " <Option name='BATCH_SIZE' scope='vector' type='int' default='"
165 : STRINGIFY(DEFAULT_BATCH_SIZE) "' "
166 : "description='Number of features to fetch/write at once'/>"
167 : " <Option name='DIM_X' type='string' scope='vector' default='_X' "
168 : "description='Name of the X dimension.'/>"
169 : " <Option name='DIM_Y' type='string' scope='vector' default='_Y' "
170 : "description='Name of the Y dimension.'/>"
171 : " <Option name='DIM_Z' type='string' scope='vector' default='_Z' "
172 : "description='Name of the Z dimension.'/>"
173 1236 : "</OpenOptionList>");
174 : // clang-format on
175 :
176 : // clang-format off
177 1236 : poDriver->SetMetadataItem(
178 : GDAL_DS_LAYER_CREATIONOPTIONLIST,
179 : "<LayerCreationOptionList>"
180 : " <Option name='COMPRESSION' type='string-select' description='"
181 : "Compression to use' default='NONE'>\n"
182 : " <Value>NONE</Value>\n"
183 : " <Value>GZIP</Value>\n"
184 : " <Value>ZSTD</Value>\n"
185 : " <Value>LZ4</Value>\n"
186 : " <Value>RLE</Value>\n"
187 : " <Value>BZIP2</Value>\n"
188 : " <Value>DOUBLE-DELTA</Value>\n"
189 : " <Value>POSITIVE-DELTA</Value>\n"
190 : " </Option>\n"
191 : " <Option name='COMPRESSION_LEVEL' type='int' "
192 : "description='Compression level'/>\n"
193 : " <Option name='BATCH_SIZE' type='int' default='"
194 : STRINGIFY(DEFAULT_BATCH_SIZE) "' "
195 : "description='Number of features to write at once'/>"
196 : " <Option name='TILE_CAPACITY' type='int' default='"
197 : STRINGIFY(DEFAULT_TILE_CAPACITY) "' "
198 : "description='Number of non-empty cells stored in a data tile'/>"
199 : " <Option name='BOUNDS' type='string' description='Specify "
200 : "bounds for sparse array, minx, miny, [minz,] maxx, maxy [, maxz]'/>\n"
201 : " <Option name='TILE_EXTENT' type='float' description='Specify "
202 : "square X/Y tile extents for a sparse array'/>\n"
203 : " <Option name='TILE_Z_EXTENT' type='float' description='Specify "
204 : "Z tile extents for a sparse array'/>\n"
205 : " <Option name='ADD_Z_DIM' type='string-select' description='"
206 : "Whether to add a Z dimension' default='AUTO'>"
207 : " <Value>AUTO</Value>"
208 : " <Value>YES</Value>"
209 : " <Value>NO</Value>"
210 : " </Option>"
211 : " <Option name='FID' type='string' description='Feature id column "
212 : "name. Set to empty to disable its creation.' default='FID'/>"
213 : " <Option name='GEOMETRY_NAME' type='string' description='Name "
214 : "of the geometry column that will receive WKB encoded geometries. "
215 : "Set to empty to disable its creation (only for point).' "
216 : "default='wkb_geometry'/>"
217 : " <Option name='TILEDB_TIMESTAMP' type='int' description='Create "
218 : "array at this timestamp, the timestamp should be > 0'/>"
219 : " <Option name='TILEDB_STRING_TYPE' type='string-select' "
220 : "description='Which TileDB type to create string attributes' "
221 : "default='UTF8'"
222 : ">"
223 : " <Value>UTF8</Value>"
224 : " <Value>ASCII</Value>"
225 : " </Option>"
226 : " <Option name='STATS' type='boolean' default='false' "
227 : "description='Dump TileDB stats'/>"
228 1236 : "</LayerCreationOptionList>");
229 : // clang-format on
230 :
231 1236 : poDriver->SetMetadataItem(GDAL_DCAP_MULTIDIM_RASTER, "YES");
232 1236 : poDriver->SetMetadataItem(GDAL_DCAP_CREATE_MULTIDIMENSIONAL, "YES");
233 :
234 1236 : poDriver->SetMetadataItem(
235 : GDAL_DMD_MULTIDIM_DATASET_CREATIONOPTIONLIST,
236 : "<MultiDimDatasetCreationOptionList>"
237 : " <Option name='TILEDB_CONFIG' type='string' description='location "
238 : "of configuration file for TileDB'/>"
239 : " <Option name='TILEDB_TIMESTAMP' type='int' description='Create "
240 : "arrays at this timestamp, the timestamp should be > 0'/>"
241 : " <Option name='STATS' type='boolean' default='false' "
242 : "description='Dump TileDB stats'/>"
243 1236 : "</MultiDimDatasetCreationOptionList>");
244 :
245 1236 : poDriver->SetMetadataItem(
246 : GDAL_DMD_MULTIDIM_ARRAY_OPENOPTIONLIST,
247 : "<MultiDimArrayOpenOptionList>"
248 : " <Option name='TILEDB_TIMESTAMP' type='int' description='Open "
249 : "array at this timestamp, the timestamp should be > 0'/>"
250 1236 : "</MultiDimArrayOpenOptionList>");
251 :
252 1236 : poDriver->SetMetadataItem(
253 : GDAL_DMD_MULTIDIM_ARRAY_CREATIONOPTIONLIST,
254 : "<MultiDimArrayCreationOptionList>"
255 : " <Option name='TILEDB_TIMESTAMP' type='int' description='Create "
256 : "array at this timestamp, the timestamp should be > 0'/>"
257 : " <Option name='BLOCKSIZE' type='int' description='Block size in "
258 : "pixels'/>"
259 : " <Option name='COMPRESSION' type='string-select' description='"
260 : "Compression to use' default='NONE'>\n"
261 : " <Value>NONE</Value>\n"
262 : " <Value>GZIP</Value>\n"
263 : " <Value>ZSTD</Value>\n"
264 : " <Value>LZ4</Value>\n"
265 : " <Value>RLE</Value>\n"
266 : " <Value>BZIP2</Value>\n"
267 : " <Value>DOUBLE-DELTA</Value>\n"
268 : " <Value>POSITIVE-DELTA</Value>\n"
269 : " </Option>\n"
270 : " <Option name='COMPRESSION_LEVEL' type='int' "
271 : "description='Compression level'/>\n"
272 : " <Option name='STATS' type='boolean' default='false' "
273 : "description='Dump TileDB stats'/>"
274 : " <Option name='IN_MEMORY' type='boolean' default='false' "
275 : "description='Whether the array should be only in-memory. Useful to "
276 : "create an indexing variable that is serialized as a dimension label'/>"
277 1236 : "</MultiDimArrayCreationOptionList>");
278 :
279 1236 : poDriver->pfnIdentify = TileDBDriverIdentifySimplified;
280 1236 : poDriver->SetMetadataItem(GDAL_DCAP_OPEN, "YES");
281 1236 : poDriver->SetMetadataItem(GDAL_DCAP_CREATE, "YES");
282 1236 : poDriver->SetMetadataItem(GDAL_DCAP_CREATECOPY, "YES");
283 1236 : }
284 :
285 : /************************************************************************/
286 : /* DeclareDeferredTileDBPlugin() */
287 : /************************************************************************/
288 :
289 : #ifdef PLUGIN_FILENAME
290 1522 : void DeclareDeferredTileDBPlugin()
291 : {
292 1522 : if (GDALGetDriverByName(DRIVER_NAME) != nullptr)
293 : {
294 301 : return;
295 : }
296 1221 : auto poDriver = new GDALPluginDriverProxy(PLUGIN_FILENAME);
297 : #ifdef PLUGIN_INSTALLATION_MESSAGE
298 : poDriver->SetMetadataItem(GDAL_DMD_PLUGIN_INSTALLATION_MESSAGE,
299 : PLUGIN_INSTALLATION_MESSAGE);
300 : #endif
301 1221 : TileDBDriverSetCommonMetadata(poDriver);
302 1221 : GetGDALDriverManager()->DeclareDeferredPluginDriver(poDriver);
303 : }
304 : #endif
|