diff --git a/autotest/gdrivers/tiledb_multidim.py b/autotest/gdrivers/tiledb_multidim.py index 774a4c29f299..6e163a05d4e2 100755 --- a/autotest/gdrivers/tiledb_multidim.py +++ b/autotest/gdrivers/tiledb_multidim.py @@ -38,18 +38,7 @@ from osgeo import gdal, osr - -def has_tiledb_multidim(): - drv = gdal.GetDriverByName("TileDB") - if drv is None: - return False - return drv.GetMetadataItem(gdal.DCAP_CREATE_MULTIDIMENSIONAL) == "YES" - - -pytestmark = [ - pytest.mark.require_driver("TileDB"), - pytest.mark.skipif(not has_tiledb_multidim(), reason="TileDB >= 2.15 required"), -] +pytestmark = pytest.mark.require_driver("TileDB") def test_tiledb_multidim_basic(): diff --git a/autotest/ogr/ogr_tiledb.py b/autotest/ogr/ogr_tiledb.py index e9fcf1f2c2bd..c88bef3ffb9b 100644 --- a/autotest/ogr/ogr_tiledb.py +++ b/autotest/ogr/ogr_tiledb.py @@ -45,7 +45,7 @@ ############################################################################### -def create_tiledb_dataset(nullable, batch_size, include_bool, extra_feature=False): +def create_tiledb_dataset(nullable, batch_size, extra_feature=False): ds = ogr.GetDriverByName("TileDB").CreateDataSource("tmp/test.tiledb") srs = osr.SpatialReference() @@ -79,11 +79,10 @@ def create_tiledb_dataset(nullable, batch_size, include_bool, extra_feature=Fals with gdal.config_option("TILEDB_INT_TYPE", "UINT16"): lyr.CreateField(fld_defn) - if include_bool: - fld_defn = ogr.FieldDefn("boolfield", ogr.OFTInteger) - fld_defn.SetNullable(nullable) - fld_defn.SetSubType(ogr.OFSTBoolean) - lyr.CreateField(fld_defn) + fld_defn = ogr.FieldDefn("boolfield", ogr.OFTInteger) + fld_defn.SetNullable(nullable) + fld_defn.SetSubType(ogr.OFSTBoolean) + lyr.CreateField(fld_defn) fld_defn = ogr.FieldDefn("int64field", ogr.OFTInteger64) fld_defn.SetNullable(nullable) @@ -111,11 +110,10 @@ def create_tiledb_dataset(nullable, batch_size, include_bool, extra_feature=Fals fld_defn.SetSubType(ogr.OFSTInt16) lyr.CreateField(fld_defn) - if include_bool: - fld_defn = ogr.FieldDefn("boollistfield", ogr.OFTIntegerList) - fld_defn.SetNullable(nullable) - fld_defn.SetSubType(ogr.OFSTBoolean) - lyr.CreateField(fld_defn) + fld_defn = ogr.FieldDefn("boollistfield", ogr.OFTIntegerList) + fld_defn.SetNullable(nullable) + fld_defn.SetSubType(ogr.OFSTBoolean) + lyr.CreateField(fld_defn) fld_defn = ogr.FieldDefn("doublelistfield", ogr.OFTRealList) fld_defn.SetNullable(nullable) @@ -148,8 +146,7 @@ def create_tiledb_dataset(nullable, batch_size, include_bool, extra_feature=Fals f["strfield"] = "foo" f["intfield"] = -123456789 f["int16field"] = -32768 - if include_bool: - f["boolfield"] = True + f["boolfield"] = True f["uint8field"] = 0 f["uint16field"] = 0 f["int64field"] = -1234567890123456 @@ -158,8 +155,7 @@ def create_tiledb_dataset(nullable, batch_size, include_bool, extra_feature=Fals f["binaryfield"] = b"\xDE\xAD\xBE\xEF" f["intlistfield"] = [-123456789, 123] f["int16listfield"] = [-32768, 32767] - if include_bool: - f["boollistfield"] = [True, False] + f["boollistfield"] = [True, False] f["doublelistfield"] = [1.2345, -1.2345] f["floatlistfield"] = [1.5, -1.5, 0] f["datetimefield"] = "2023-04-07T12:34:56.789Z" @@ -184,8 +180,7 @@ def create_tiledb_dataset(nullable, batch_size, include_bool, extra_feature=Fals f["strfield"] = "barbaz" f["intfield"] = 123456789 f["int16field"] = 32767 - if include_bool: - f["boolfield"] = False + f["boolfield"] = False f["uint8field"] = 255 f["uint16field"] = 65535 f["int64field"] = 1234567890123456 @@ -194,8 +189,7 @@ def create_tiledb_dataset(nullable, batch_size, include_bool, extra_feature=Fals f["binaryfield"] = b"\xBE\xEF\xDE\xAD" f["intlistfield"] = [123456789, -123] f["int16listfield"] = [32767, -32768] - if include_bool: - f["boollistfield"] = [False, True] + f["boollistfield"] = [False, True] f["doublelistfield"] = [-1.2345, 1.2345] f["floatlistfield"] = [0.0, -1.5, 1.5] # Will be transformed to "2023/04/07 10:19:56.789+00" @@ -212,8 +206,7 @@ def create_tiledb_dataset(nullable, batch_size, include_bool, extra_feature=Fals f["strfield"] = "something" f["intfield"] = 8765432 f["int16field"] = 32767 - if include_bool: - f["boolfield"] = False + f["boolfield"] = False f["uint8field"] = 255 f["uint16field"] = 65535 f["int64field"] = 9876543210123456 @@ -222,8 +215,7 @@ def create_tiledb_dataset(nullable, batch_size, include_bool, extra_feature=Fals f["binaryfield"] = b"\xDE\xAD\xBE\xEF" f["intlistfield"] = [-123456789, -123] f["int16listfield"] = [32767, -32768] - if include_bool: - f["boollistfield"] = [False, True] + f["boollistfield"] = [False, True] f["doublelistfield"] = [-1.2345, 1.2345] f["floatlistfield"] = [0.0, -1.5, 1.5] # Will be transformed to "2023/04/07 10:19:56.789+00" @@ -248,7 +240,7 @@ def test_ogr_tiledb_basic(nullable, batch_size): if os.path.exists("tmp/test.tiledb"): shutil.rmtree("tmp/test.tiledb") - field_count, srs, options = create_tiledb_dataset(nullable, batch_size, True) + field_count, srs, options = create_tiledb_dataset(nullable, batch_size) ds = gdal.OpenEx("tmp/test.tiledb", open_options=options) lyr = ds.GetLayer(0) @@ -586,38 +578,33 @@ def test_ogr_tiledb_basic(nullable, batch_size): assert set(f.GetFID() for f in lyr) == set([1]) # Test OR - has_working_or_filter = ( - gdal.GetDriverByName("TileDB").GetMetadataItem("HAS_TILEDB_WORKING_OR_FILTER") - != "NO" - ) - if has_working_or_filter: - lyr.SetAttributeFilter("intfield = 321 OR intfield = -123456789") - assert lyr.GetMetadataItem("ATTRIBUTE_FILTER_TRANSLATION", "_DEBUG_") == "WHOLE" - assert set(f.GetFID() for f in lyr) == set([1]) + lyr.SetAttributeFilter("intfield = 321 OR intfield = -123456789") + assert lyr.GetMetadataItem("ATTRIBUTE_FILTER_TRANSLATION", "_DEBUG_") == "WHOLE" + assert set(f.GetFID() for f in lyr) == set([1]) - lyr.SetAttributeFilter("intfield = -123456789 OR intfield = 321") - assert lyr.GetMetadataItem("ATTRIBUTE_FILTER_TRANSLATION", "_DEBUG_") == "WHOLE" - assert set(f.GetFID() for f in lyr) == set([1]) + lyr.SetAttributeFilter("intfield = -123456789 OR intfield = 321") + assert lyr.GetMetadataItem("ATTRIBUTE_FILTER_TRANSLATION", "_DEBUG_") == "WHOLE" + assert set(f.GetFID() for f in lyr) == set([1]) - lyr.SetAttributeFilter("intfield = 321 OR intfield = 123") - assert lyr.GetMetadataItem("ATTRIBUTE_FILTER_TRANSLATION", "_DEBUG_") == "WHOLE" - assert set(f.GetFID() for f in lyr) == set([]) + lyr.SetAttributeFilter("intfield = 321 OR intfield = 123") + assert lyr.GetMetadataItem("ATTRIBUTE_FILTER_TRANSLATION", "_DEBUG_") == "WHOLE" + assert set(f.GetFID() for f in lyr) == set([]) - lyr.SetAttributeFilter("(1 = 1) OR intfield = -123456789") - assert lyr.GetMetadataItem("ATTRIBUTE_FILTER_TRANSLATION", "_DEBUG_") == "NONE" - assert set(f.GetFID() for f in lyr) == set([1, 2, 3]) + lyr.SetAttributeFilter("(1 = 1) OR intfield = -123456789") + assert lyr.GetMetadataItem("ATTRIBUTE_FILTER_TRANSLATION", "_DEBUG_") == "NONE" + assert set(f.GetFID() for f in lyr) == set([1, 2, 3]) - lyr.SetAttributeFilter("(1 = 0) OR intfield = -123456789") - assert lyr.GetMetadataItem("ATTRIBUTE_FILTER_TRANSLATION", "_DEBUG_") == "NONE" - assert set(f.GetFID() for f in lyr) == set([1]) + lyr.SetAttributeFilter("(1 = 0) OR intfield = -123456789") + assert lyr.GetMetadataItem("ATTRIBUTE_FILTER_TRANSLATION", "_DEBUG_") == "NONE" + assert set(f.GetFID() for f in lyr) == set([1]) - lyr.SetAttributeFilter("intfield = -123456789 OR (1 = 1)") - assert lyr.GetMetadataItem("ATTRIBUTE_FILTER_TRANSLATION", "_DEBUG_") == "NONE" - assert set(f.GetFID() for f in lyr) == set([1, 2, 3]) + lyr.SetAttributeFilter("intfield = -123456789 OR (1 = 1)") + assert lyr.GetMetadataItem("ATTRIBUTE_FILTER_TRANSLATION", "_DEBUG_") == "NONE" + assert set(f.GetFID() for f in lyr) == set([1, 2, 3]) - lyr.SetAttributeFilter("intfield = -123456789 OR (1 = 0)") - assert lyr.GetMetadataItem("ATTRIBUTE_FILTER_TRANSLATION", "_DEBUG_") == "NONE" - assert set(f.GetFID() for f in lyr) == set([1]) + lyr.SetAttributeFilter("intfield = -123456789 OR (1 = 0)") + assert lyr.GetMetadataItem("ATTRIBUTE_FILTER_TRANSLATION", "_DEBUG_") == "NONE" + assert set(f.GetFID() for f in lyr) == set([1]) # Test NOT lyr.SetAttributeFilter("NOT (intfield = -123456789)") @@ -625,14 +612,13 @@ def test_ogr_tiledb_basic(nullable, batch_size): assert set(f.GetFID() for f in lyr) == (set([3]) if nullable else set([2, 3])) # Test IN - if has_working_or_filter: - lyr.SetAttributeFilter("intfield IN (321, -123456789)") - assert lyr.GetMetadataItem("ATTRIBUTE_FILTER_TRANSLATION", "_DEBUG_") == "WHOLE" - assert set(f.GetFID() for f in lyr) == set([1]) + lyr.SetAttributeFilter("intfield IN (321, -123456789)") + assert lyr.GetMetadataItem("ATTRIBUTE_FILTER_TRANSLATION", "_DEBUG_") == "WHOLE" + assert set(f.GetFID() for f in lyr) == set([1]) - lyr.SetAttributeFilter("intfield IN (-123456789, 321)") - assert lyr.GetMetadataItem("ATTRIBUTE_FILTER_TRANSLATION", "_DEBUG_") == "WHOLE" - assert set(f.GetFID() for f in lyr) == set([1]) + lyr.SetAttributeFilter("intfield IN (-123456789, 321)") + assert lyr.GetMetadataItem("ATTRIBUTE_FILTER_TRANSLATION", "_DEBUG_") == "WHOLE" + assert set(f.GetFID() for f in lyr) == set([1]) # Test IS NULL / IS NOT NULL lyr.SetAttributeFilter("strfield IS NULL") @@ -696,54 +682,46 @@ def test_ogr_tiledb_basic(nullable, batch_size): assert set(f.GetFID() for f in lyr) == set() # Test IS NULL and OR (for always_false situations) - if has_working_or_filter: - lyr.SetAttributeFilter("intfield IS NULL OR intfieldextra <> 4") - assert lyr.GetMetadataItem("ATTRIBUTE_FILTER_TRANSLATION", "_DEBUG_") == "WHOLE" - assert set(f.GetFID() for f in lyr) == set([1, 2, 3]) + lyr.SetAttributeFilter("intfield IS NULL OR intfieldextra <> 4") + assert lyr.GetMetadataItem("ATTRIBUTE_FILTER_TRANSLATION", "_DEBUG_") == "WHOLE" + assert set(f.GetFID() for f in lyr) == set([1, 2, 3]) - lyr.SetAttributeFilter("intfield IS NULL OR intfield IS NULL") - assert lyr.GetMetadataItem("ATTRIBUTE_FILTER_TRANSLATION", "_DEBUG_") == "WHOLE" - assert set(f.GetFID() for f in lyr) == (set([2]) if nullable else set()) + lyr.SetAttributeFilter("intfield IS NULL OR intfield IS NULL") + assert lyr.GetMetadataItem("ATTRIBUTE_FILTER_TRANSLATION", "_DEBUG_") == "WHOLE" + assert set(f.GetFID() for f in lyr) == (set([2]) if nullable else set()) - lyr.SetAttributeFilter("intfieldextra <> 4 OR intfield IS NULL") - assert lyr.GetMetadataItem("ATTRIBUTE_FILTER_TRANSLATION", "_DEBUG_") == "WHOLE" - assert set(f.GetFID() for f in lyr) == set([1, 2, 3]) + lyr.SetAttributeFilter("intfieldextra <> 4 OR intfield IS NULL") + assert lyr.GetMetadataItem("ATTRIBUTE_FILTER_TRANSLATION", "_DEBUG_") == "WHOLE" + assert set(f.GetFID() for f in lyr) == set([1, 2, 3]) - lyr.SetAttributeFilter("intfield IS NULL OR intfieldextra = 4") - assert lyr.GetMetadataItem("ATTRIBUTE_FILTER_TRANSLATION", "_DEBUG_") == "WHOLE" - assert set(f.GetFID() for f in lyr) == (set([2]) if nullable else set()) + lyr.SetAttributeFilter("intfield IS NULL OR intfieldextra = 4") + assert lyr.GetMetadataItem("ATTRIBUTE_FILTER_TRANSLATION", "_DEBUG_") == "WHOLE" + assert set(f.GetFID() for f in lyr) == (set([2]) if nullable else set()) - lyr.SetAttributeFilter("intfieldextra = 4 OR intfield IS NULL") - assert lyr.GetMetadataItem("ATTRIBUTE_FILTER_TRANSLATION", "_DEBUG_") == "WHOLE" - assert set(f.GetFID() for f in lyr) == (set([2]) if nullable else set()) + lyr.SetAttributeFilter("intfieldextra = 4 OR intfield IS NULL") + assert lyr.GetMetadataItem("ATTRIBUTE_FILTER_TRANSLATION", "_DEBUG_") == "WHOLE" + assert set(f.GetFID() for f in lyr) == (set([2]) if nullable else set()) # Test IS NOT NULL and OR (for always_true situations) - if has_working_or_filter: - lyr.SetAttributeFilter("intfield IS NOT NULL OR intfieldextra <> 4") - assert lyr.GetMetadataItem("ATTRIBUTE_FILTER_TRANSLATION", "_DEBUG_") == "WHOLE" - assert set(f.GetFID() for f in lyr) == set([1, 2, 3]) - - lyr.SetAttributeFilter("intfield IS NOT NULL OR intfield IS NOT NULL") - assert lyr.GetMetadataItem("ATTRIBUTE_FILTER_TRANSLATION", "_DEBUG_") == "WHOLE" - assert set(f.GetFID() for f in lyr) == ( - set([1, 3]) if nullable else set([1, 2, 3]) - ) + lyr.SetAttributeFilter("intfield IS NOT NULL OR intfieldextra <> 4") + assert lyr.GetMetadataItem("ATTRIBUTE_FILTER_TRANSLATION", "_DEBUG_") == "WHOLE" + assert set(f.GetFID() for f in lyr) == set([1, 2, 3]) - lyr.SetAttributeFilter("intfieldextra <> 4 OR intfield IS NOT NULL") - assert lyr.GetMetadataItem("ATTRIBUTE_FILTER_TRANSLATION", "_DEBUG_") == "WHOLE" - assert set(f.GetFID() for f in lyr) == set([1, 2, 3]) + lyr.SetAttributeFilter("intfield IS NOT NULL OR intfield IS NOT NULL") + assert lyr.GetMetadataItem("ATTRIBUTE_FILTER_TRANSLATION", "_DEBUG_") == "WHOLE" + assert set(f.GetFID() for f in lyr) == (set([1, 3]) if nullable else set([1, 2, 3])) - lyr.SetAttributeFilter("intfield IS NOT NULL OR intfieldextra = 4") - assert lyr.GetMetadataItem("ATTRIBUTE_FILTER_TRANSLATION", "_DEBUG_") == "WHOLE" - assert set(f.GetFID() for f in lyr) == ( - set([1, 3]) if nullable else set([1, 2, 3]) - ) + lyr.SetAttributeFilter("intfieldextra <> 4 OR intfield IS NOT NULL") + assert lyr.GetMetadataItem("ATTRIBUTE_FILTER_TRANSLATION", "_DEBUG_") == "WHOLE" + assert set(f.GetFID() for f in lyr) == set([1, 2, 3]) - lyr.SetAttributeFilter("intfieldextra = 4 OR intfield IS NOT NULL") - assert lyr.GetMetadataItem("ATTRIBUTE_FILTER_TRANSLATION", "_DEBUG_") == "WHOLE" - assert set(f.GetFID() for f in lyr) == ( - set([1, 3]) if nullable else set([1, 2, 3]) - ) + lyr.SetAttributeFilter("intfield IS NOT NULL OR intfieldextra = 4") + assert lyr.GetMetadataItem("ATTRIBUTE_FILTER_TRANSLATION", "_DEBUG_") == "WHOLE" + assert set(f.GetFID() for f in lyr) == (set([1, 3]) if nullable else set([1, 2, 3])) + + lyr.SetAttributeFilter("intfieldextra = 4 OR intfield IS NOT NULL") + assert lyr.GetMetadataItem("ATTRIBUTE_FILTER_TRANSLATION", "_DEBUG_") == "WHOLE" + assert set(f.GetFID() for f in lyr) == (set([1, 3]) if nullable else set([1, 2, 3])) tiledb_md = json.loads(lyr.GetMetadata_List("json:TILEDB")[0]) md = tiledb_md["array"]["metadata"] @@ -1029,11 +1007,6 @@ def test_ogr_tiledb_switch_between_read_and_write(): def test_ogr_tiledb_create_group(): - if "CREATE_GROUP" not in gdal.GetDriverByName("TileDB").GetMetadataItem( - gdal.DMD_CREATIONOPTIONLIST - ): - pytest.skip("CREATE_GROUP not supported in TileDB < 2.9") - if os.path.exists("tmp/test.tiledb"): shutil.rmtree("tmp/test.tiledb") @@ -1137,10 +1110,7 @@ def test_ogr_tiledb_arrow_stream_pyarrow(nullable, batch_size): if os.path.exists("tmp/test.tiledb"): shutil.rmtree("tmp/test.tiledb") - include_bool = "Boolean" in gdal.GetDriverByName("TileDB").GetMetadataItem( - gdal.DMD_CREATIONFIELDDATASUBTYPES - ) - _, _, options = create_tiledb_dataset(nullable, batch_size, include_bool) + _, _, options = create_tiledb_dataset(nullable, batch_size) ds = gdal.OpenEx("tmp/test.tiledb", open_options=options) lyr = ds.GetLayer(0) @@ -1178,11 +1148,10 @@ def test_ogr_tiledb_arrow_stream_pyarrow(nullable, batch_size): ("timefield", "time32[ms]"), ("intfieldextra", "int32"), ("wkb_geometry", "large_binary"), + ("boolfield", "bool"), + ("boollistfield", "large_list"), ] ) - if include_bool: - expected_fields.add(("boolfield", "bool")) - expected_fields.add(("boollistfield", "large_list")) assert fields == expected_fields def check_batch(batch): @@ -1248,10 +1217,7 @@ def test_ogr_tiledb_arrow_stream_numpy(nullable, batch_size): if os.path.exists("tmp/test.tiledb"): shutil.rmtree("tmp/test.tiledb") - include_bool = True - _, _, options = create_tiledb_dataset( - nullable, batch_size, include_bool, extra_feature=True - ) + _, _, options = create_tiledb_dataset(nullable, batch_size, extra_feature=True) ds = gdal.OpenEx("tmp/test.tiledb", open_options=options) lyr = ds.GetLayer(0) @@ -1347,10 +1313,9 @@ def check_batch(batch): "timefield", "intfieldextra", "wkb_geometry", + "boolfield", + "boollistfield", } - if include_bool: - expected_fields.add("boolfield") - expected_fields.add("boollistfield") assert batch.keys() == expected_fields check_batch(batch) diff --git a/cmake/helpers/CheckDependentLibraries.cmake b/cmake/helpers/CheckDependentLibraries.cmake index 5d19b4759ffe..6f9ee274bfb8 100644 --- a/cmake/helpers/CheckDependentLibraries.cmake +++ b/cmake/helpers/CheckDependentLibraries.cmake @@ -751,7 +751,7 @@ gdal_check_package(Crnlib "enable gdal_DDS driver" CAN_DISABLE) gdal_check_package(basisu "Enable BASISU driver" CONFIG CAN_DISABLE) gdal_check_package(IDB "enable ogr_IDB driver" CAN_DISABLE) gdal_check_package(rdb "enable RIEGL RDB library" CONFIG CAN_DISABLE) -gdal_check_package(TileDB "enable TileDB driver" CONFIG CAN_DISABLE VERSION "2.7") +gdal_check_package(TileDB "enable TileDB driver" CONFIG CAN_DISABLE VERSION "2.15") gdal_check_package(OpenEXR "OpenEXR >=2.2" CAN_DISABLE) gdal_check_package(MONGOCXX "Enable MongoDBV3 driver" CAN_DISABLE) diff --git a/doc/source/development/building_from_source.rst b/doc/source/development/building_from_source.rst index bed99ec09c82..af4eaa44fef6 100644 --- a/doc/source/development/building_from_source.rst +++ b/doc/source/development/building_from_source.rst @@ -1907,6 +1907,8 @@ TileDB The `TileDB ` library is required for the :ref:`raster.tiledb` driver. Specify install prefix in the ``CMAKE_PREFIX_PATH`` variable. +TileDB >= 2.15 is required since GDAL 3.9 + .. option:: GDAL_USE_TILEDB=ON/OFF Control whether to use TileDB. Defaults to ON when TileDB is found. diff --git a/frmts/tiledb/CMakeLists.txt b/frmts/tiledb/CMakeLists.txt index 2b68b39f7ef7..86fc626591c6 100644 --- a/frmts/tiledb/CMakeLists.txt +++ b/frmts/tiledb/CMakeLists.txt @@ -25,5 +25,4 @@ endif() gdal_standard_includes(gdal_TileDB) target_include_directories(gdal_TileDB PRIVATE ${GDAL_RASTER_FORMAT_SOURCE_DIR}/mem) -target_compile_definitions(gdal_TileDB PRIVATE -DTILEDB_DEPRECATED=) gdal_target_link_libraries(gdal_TileDB PRIVATE TileDB::tiledb_shared) diff --git a/frmts/tiledb/include_tiledb.h b/frmts/tiledb/include_tiledb.h index f721cb3c59cb..53efb201735e 100644 --- a/frmts/tiledb/include_tiledb.h +++ b/frmts/tiledb/include_tiledb.h @@ -35,11 +35,6 @@ #pragma GCC system_header #endif -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable : 4996) /* XXXX was deprecated */ -#endif - #ifdef INCLUDE_ONLY_TILEDB_VERSION #include "tiledb/tiledb_version.h" #else @@ -47,39 +42,6 @@ #include "tiledb/tiledb_experimental" #endif -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -#if TILEDB_VERSION_MAJOR > 2 || \ - (TILEDB_VERSION_MAJOR == 2 && TILEDB_VERSION_MINOR >= 9) -#define HAS_TILEDB_GROUP -#endif - -#if TILEDB_VERSION_MAJOR > 2 || \ - (TILEDB_VERSION_MAJOR == 2 && TILEDB_VERSION_MINOR >= 10) -#define HAS_TILEDB_BOOL -#endif - -#if TILEDB_VERSION_MAJOR > 2 || \ - (TILEDB_VERSION_MAJOR == 2 && TILEDB_VERSION_MINOR >= 11) -#define HAS_TILEDB_WORKING_OR_FILTER -#endif - -#if TILEDB_VERSION_MAJOR > 2 || \ - (TILEDB_VERSION_MAJOR == 2 && TILEDB_VERSION_MINOR >= 14) -#define HAS_TILEDB_WORKING_UTF8_STRING_FILTER -#endif - -#if TILEDB_VERSION_MAJOR > 2 || \ - (TILEDB_VERSION_MAJOR == 2 && TILEDB_VERSION_MINOR >= 15) -#define HAS_TILEDB_DIMENSION_LABEL -#endif - -#ifdef HAS_TILEDB_DIMENSION_LABEL -#define HAS_TILEDB_MULTIDIM -#endif - #if TILEDB_VERSION_MAJOR > 2 || \ (TILEDB_VERSION_MAJOR == 2 && TILEDB_VERSION_MINOR >= 21) #define HAS_TILEDB_GEOM_WKB_WKT diff --git a/frmts/tiledb/tiledbcommon.cpp b/frmts/tiledb/tiledbcommon.cpp index 5679a6f5b9eb..010ab1345f13 100644 --- a/frmts/tiledb/tiledbcommon.cpp +++ b/frmts/tiledb/tiledbcommon.cpp @@ -150,28 +150,23 @@ int TileDBDataset::Identify(GDALOpenInfo *poOpenInfo) CPLString osArrayPath = TileDBDataset::VSI_to_tiledb_uri(poOpenInfo->pszFilename); const auto eType = tiledb::Object::object(ctx, osArrayPath).type(); -#ifdef HAS_TILEDB_GROUP if ((poOpenInfo->nOpenFlags & GDAL_OF_VECTOR) != 0) { if (eType == tiledb::Object::Type::Array || eType == tiledb::Object::Type::Group) return true; } -#endif -#ifdef HAS_TILEDB_MULTIDIM + if ((poOpenInfo->nOpenFlags & GDAL_OF_MULTIDIM_RASTER) != 0) { if (eType == tiledb::Object::Type::Array || eType == tiledb::Object::Type::Group) return true; } -#endif if ((poOpenInfo->nOpenFlags & GDAL_OF_RASTER) != 0) { -#ifdef HAS_TILEDB_MULTIDIM if (eType == tiledb::Object::Type::Group) return GDAL_IDENTIFY_UNKNOWN; -#endif return eType == tiledb::Object::Type::Array; } } @@ -233,12 +228,10 @@ GDALDataset *TileDBDataset::Open(GDALOpenInfo *poOpenInfo) } else { -#ifdef HAS_TILEDB_MULTIDIM if ((poOpenInfo->nOpenFlags & GDAL_OF_MULTIDIM_RASTER) != 0) { return TileDBDataset::OpenMultiDimensional(poOpenInfo); } -#endif const char *pszConfig = CSLFetchNameValue( poOpenInfo->papszOpenOptions, "TILEDB_CONFIG"); @@ -259,13 +252,11 @@ GDALDataset *TileDBDataset::Open(GDALOpenInfo *poOpenInfo) TileDBDataset::VSI_to_tiledb_uri(poOpenInfo->pszFilename); const auto eType = tiledb::Object::object(oCtx, osPath).type(); -#ifdef HAS_TILEDB_GROUP if ((poOpenInfo->nOpenFlags & GDAL_OF_VECTOR) != 0 && eType == tiledb::Object::Type::Group) { return OGRTileDBDataset::Open(poOpenInfo, eType); } -#ifdef HAS_TILEDB_MULTIDIM else if ((poOpenInfo->nOpenFlags & GDAL_OF_RASTER) != 0 && eType == tiledb::Object::Type::Group) { @@ -314,8 +305,6 @@ GDALDataset *TileDBDataset::Open(GDALOpenInfo *poOpenInfo) } return nullptr; } -#endif -#endif tiledb::ArraySchema schema(oCtx, osPath); @@ -368,7 +357,6 @@ GDALDataset *TileDBDataset::CreateCopy(const char *pszFilename, void *pProgressData) { -#ifdef HAS_TILEDB_MULTIDIM if (poSrcDS->GetRootGroup()) { auto poDrv = GDALDriver::FromHandle(GDALGetDriverByName("TileDB")); @@ -379,7 +367,6 @@ GDALDataset *TileDBDataset::CreateCopy(const char *pszFilename, pProgressData); } } -#endif try { @@ -417,9 +404,7 @@ void GDALRegister_TileDB() poDriver->pfnCreate = TileDBDataset::Create; poDriver->pfnCreateCopy = TileDBDataset::CreateCopy; poDriver->pfnDelete = TileDBDataset::Delete; -#ifdef HAS_TILEDB_MULTIDIM poDriver->pfnCreateMultiDimensional = TileDBDataset::CreateMultiDimensional; -#endif GetGDALDriverManager()->RegisterDriver(poDriver); } diff --git a/frmts/tiledb/tiledbdense.cpp b/frmts/tiledb/tiledbdense.cpp index b213e3ca2ab5..40565fb2e812 100644 --- a/frmts/tiledb/tiledbdense.cpp +++ b/frmts/tiledb/tiledbdense.cpp @@ -31,12 +31,6 @@ #include "tiledbheaders.h" -#ifdef _MSC_VER -#pragma warning(push) -// 'tiledb::Array::Array': was declared deprecated -#pragma warning(disable : 4996) /* XXXX was deprecated */ -#endif - constexpr const char *RASTER_DATASET_TYPE = "raster"; /************************************************************************/ @@ -113,8 +107,6 @@ static const char *index_type_name(TILEDB_INTERLEAVE_MODE eMode) /* SetBuffer() */ /************************************************************************/ -#if ((TILEDB_VERSION_MAJOR > 2) || \ - (TILEDB_VERSION_MAJOR == 2 && TILEDB_VERSION_MINOR >= 4)) static CPLErr SetBuffer(tiledb::Query *poQuery, GDALDataType eType, const CPLString &osAttrName, void *pImage, int nSize) { @@ -181,74 +173,6 @@ static CPLErr SetBuffer(tiledb::Query *poQuery, GDALDataType eType, } return CE_None; } -#else -static CPLErr SetBuffer(tiledb::Query *poQuery, GDALDataType eType, - const CPLString &osAttrName, void *pImage, int nSize) -{ - switch (eType) - { - case GDT_Byte: - poQuery->set_buffer( - osAttrName, reinterpret_cast(pImage), nSize); - break; - case GDT_Int8: - poQuery->set_buffer(osAttrName, reinterpret_cast(pImage), - nSize); - break; - case GDT_UInt16: - poQuery->set_buffer( - osAttrName, reinterpret_cast(pImage), nSize); - break; - case GDT_UInt32: - poQuery->set_buffer( - osAttrName, reinterpret_cast(pImage), nSize); - break; - case GDT_UInt64: - poQuery->set_buffer(osAttrName, - reinterpret_cast(pImage), nSize); - break; - case GDT_Int16: - poQuery->set_buffer(osAttrName, reinterpret_cast(pImage), - nSize); - break; - case GDT_Int32: - poQuery->set_buffer(osAttrName, reinterpret_cast(pImage), - nSize); - break; - case GDT_Int64: - poQuery->set_buffer(osAttrName, reinterpret_cast(pImage), - nSize); - break; - case GDT_Float32: - poQuery->set_buffer(osAttrName, reinterpret_cast(pImage), - nSize); - break; - case GDT_Float64: - poQuery->set_buffer(osAttrName, reinterpret_cast(pImage), - nSize); - break; - case GDT_CInt16: - poQuery->set_buffer(osAttrName, reinterpret_cast(pImage), - nSize * 2); - break; - case GDT_CInt32: - poQuery->set_buffer(osAttrName, reinterpret_cast(pImage), - nSize * 2); - break; - case GDT_CFloat32: - poQuery->set_buffer(osAttrName, reinterpret_cast(pImage), - nSize * 2); - break; - case GDT_CFloat64: - poQuery->set_buffer(osAttrName, reinterpret_cast(pImage), - nSize * 2); - break; - default: - return CE_Failure; - } - return CE_None; -} -#endif /************************************************************************/ /* TileDBRasterBand() */ @@ -351,7 +275,6 @@ CPLErr TileDBRasterBand::IRasterIO(GDALRWFlag eRWFlag, int nXOff, int nYOff, nBufferDTSize > 0 && (nPixelSpace % nBufferDTSize) == 0 && (nLineSpace % nBufferDTSize) == 0) { - std::unique_ptr poQuery; const uint64_t nBandIdx = poGDS->nBandStart + nBand - 1; std::vector oaSubarray = { nBandIdx, nBandIdx, @@ -361,26 +284,25 @@ CPLErr TileDBRasterBand::IRasterIO(GDALRWFlag eRWFlag, int nXOff, int nYOff, std::rotate(oaSubarray.begin(), oaSubarray.begin() + 2, oaSubarray.end()); - if ((eRWFlag == GF_Read) && - ((eAccess == GA_Update) && (poGDS->m_roArray))) - { - poQuery.reset( - new tiledb::Query(*poGDS->m_roCtx, *poGDS->m_roArray)); - } - else - { - poQuery.reset(new tiledb::Query(*poGDS->m_ctx, *poGDS->m_array)); - } + const bool bUseReadOnlyObjs = + ((eRWFlag == GF_Read) && (eAccess == GA_Update) && + (poGDS->m_roArray)); + const auto &oCtxt = bUseReadOnlyObjs ? *poGDS->m_roCtx : *poGDS->m_ctx; + const auto &oArray = + bUseReadOnlyObjs ? *poGDS->m_roArray : *poGDS->m_array; + auto poQuery = std::make_unique(oCtxt, oArray); + tiledb::Subarray subarray(oCtxt, oArray); if (poGDS->m_array->schema().domain().ndim() == 3) { - poQuery->set_subarray(oaSubarray); + subarray.set_subarray(oaSubarray); } else { - poQuery->set_subarray(std::vector(oaSubarray.cbegin() + 2, + subarray.set_subarray(std::vector(oaSubarray.cbegin() + 2, oaSubarray.cend())); } + poQuery->set_subarray(subarray); SetBuffer(poQuery.get(), eDataType, osAttrName, pData, nXSize * nYSize); @@ -560,50 +482,44 @@ CPLErr TileDBRasterDataset::IRasterIO( nBufferDTSize > 0 && (nPixelSpace % nBufferDTSize) == 0 && (nLineSpace % nBufferDTSize) == 0) { - std::unique_ptr poQuery; std::vector oaSubarray = { (uint64_t)nYOff, (uint64_t)nYOff + nYSize - 1, (uint64_t)nXOff, (uint64_t)nXOff + nXSize - 1}; - if ((eRWFlag == GF_Read) && (eAccess == GA_Update && m_roArray)) - { - poQuery.reset(new tiledb::Query(*m_roCtx, *m_roArray)); - } - else - { - poQuery.reset(new tiledb::Query(*m_ctx, *m_array)); - } + const bool bUseReadOnlyObjs = + ((eRWFlag == GF_Read) && (eAccess == GA_Update) && (m_roArray)); + const auto &oCtxt = bUseReadOnlyObjs ? *m_roCtx : *m_ctx; + const auto &oArray = bUseReadOnlyObjs ? *m_roArray : *m_array; - if (poQuery != nullptr) - { - poQuery->set_subarray(oaSubarray); - - for (int b = 0; b < nBandCount; b++) - { - TileDBRasterBand *poBand = - (TileDBRasterBand *)GetRasterBand(panBandMap[b]); - int nRegionSize = nBufXSize * nBufYSize * nBufferDTSize; - SetBuffer(poQuery.get(), eDataType, poBand->osAttrName, - ((GByte *)pData) + b * nRegionSize, nRegionSize); - } + auto poQuery = std::make_unique(oCtxt, oArray); + tiledb::Subarray subarray(oCtxt, oArray); + subarray.set_subarray(oaSubarray); + poQuery->set_subarray(subarray); - if (bStats) - tiledb::Stats::enable(); + for (int b = 0; b < nBandCount; b++) + { + TileDBRasterBand *poBand = + (TileDBRasterBand *)GetRasterBand(panBandMap[b]); + int nRegionSize = nBufXSize * nBufYSize * nBufferDTSize; + SetBuffer(poQuery.get(), eDataType, poBand->osAttrName, + ((GByte *)pData) + b * nRegionSize, nRegionSize); + } - auto status = poQuery->submit(); + if (bStats) + tiledb::Stats::enable(); - if (bStats) - { - tiledb::Stats::dump(stdout); - tiledb::Stats::disable(); - } + auto status = poQuery->submit(); - if (status == tiledb::Query::Status::FAILED) - return CE_Failure; - else - return CE_None; + if (bStats) + { + tiledb::Stats::dump(stdout); + tiledb::Stats::disable(); } - return CE_Failure; + + if (status == tiledb::Query::Status::FAILED) + return CE_Failure; + else + return CE_None; } return GDALPamDataset::IRasterIO(eRWFlag, nXOff, nYOff, nXSize, nYSize, @@ -697,11 +613,7 @@ CPLErr TileDBRasterDataset::TrySaveXML() if (psTree == nullptr) { /* If we have unset all metadata, we have to delete the PAM file */ -#if TILEDB_VERSION_MAJOR == 1 && TILEDB_VERSION_MINOR < 7 - vfs.remove_file(psPam->pszPamFilename); -#else m_array->delete_metadata(GDAL_ATTRIBUTE_NAME); -#endif return CE_None; } @@ -771,17 +683,16 @@ CPLErr TileDBRasterDataset::TrySaveXML() /* Try saving the auxiliary metadata. */ /* -------------------------------------------------------------------- */ - bool bSaved = false; CPLErrorHandlerPusher oQuietError(CPLQuietErrorHandler); char *pszTree = CPLSerializeXMLTree(psTree); -#if TILEDB_VERSION_MAJOR > 1 || TILEDB_VERSION_MINOR >= 7 if (eAccess == GA_ReadOnly) { if (nTimestamp) { auto oMeta = std::unique_ptr(new tiledb::Array( - *m_ctx, m_array->uri(), TILEDB_WRITE, nTimestamp)); + *m_ctx, m_array->uri(), TILEDB_WRITE, + tiledb::TemporalPolicy(tiledb::TimeTravel, nTimestamp))); oMeta->put_metadata(GDAL_ATTRIBUTE_NAME, TILEDB_UINT8, static_cast(strlen(pszTree)), pszTree); oMeta->close(); @@ -804,64 +715,8 @@ CPLErr TileDBRasterDataset::TrySaveXML() static_cast(strlen(pszTree)), pszTree); } - bSaved = true; -#endif - - // cppcheck-suppress knownConditionTrueFalse - if (!bSaved) - { - vfs.touch(psPam->pszPamFilename); - tiledb::VFS::filebuf fbuf(vfs); - fbuf.open(psPam->pszPamFilename, std::ios::out); - std::ostream os(&fbuf); - - if (os.good()) - { - os.write(pszTree, strlen(pszTree)); - bSaved = true; - } - - fbuf.close(); - } - CPLFree(pszTree); - /* -------------------------------------------------------------------- - */ - /* If it fails, check if we have a proxy directory for auxiliary */ - /* metadata to be stored in, and try to save there. */ - /* -------------------------------------------------------------------- - */ - CPLErr eErr = CE_None; - - if (bSaved) - eErr = CE_None; - else - { - const char *pszBasename = GetDescription(); - - if (psPam->osPhysicalFilename.length() > 0) - pszBasename = psPam->osPhysicalFilename; - - const char *pszNewPam = nullptr; - if (PamGetProxy(pszBasename) == nullptr && - ((pszNewPam = PamAllocateProxy(pszBasename)) != nullptr)) - { - CPLErrorReset(); - CPLFree(psPam->pszPamFilename); - psPam->pszPamFilename = CPLStrdup(pszNewPam); - eErr = TrySaveXML(); - } - /* No way we can save into a /vsicurl resource */ - else if (!VSISupportsSequentialWrite(psPam->pszPamFilename, false)) - { - CPLError(CE_Warning, CPLE_AppDefined, - "Unable to save auxiliary information in %s.", - psPam->pszPamFilename); - eErr = CE_Warning; - } - } - /* -------------------------------------------------------------------- */ /* Cleanup */ @@ -870,7 +725,7 @@ CPLErr TileDBRasterDataset::TrySaveXML() if (psTree) CPLDestroyXMLNode(psTree); - return eErr; + return CE_None; } catch (const std::exception &e) { @@ -940,7 +795,6 @@ CPLErr TileDBRasterDataset::TryLoadCachedXML(char ** /*papszSiblingFiles*/, { CPLErrorHandlerPusher oQuietError(CPLQuietErrorHandler); -#if TILEDB_VERSION_MAJOR > 1 || TILEDB_VERSION_MINOR >= 7 if (bReload) { tiledb_datatype_t v_type = @@ -970,7 +824,7 @@ CPLErr TileDBRasterDataset::TryLoadCachedXML(char ** /*papszSiblingFiles*/, } psTree = CPLParseXMLString(osMetaDoc); } -#endif + if (bReload && psTree == nullptr && vfs.is_file(psPam->pszPamFilename)) { @@ -1177,12 +1031,14 @@ GDALDataset *TileDBRasterDataset::Open(GDALOpenInfo *poOpenInfo) if (eMode == TILEDB_READ) { poDS->m_array.reset(new tiledb::Array( - *poDS->m_ctx, osArrayPath, TILEDB_READ, poDS->nTimestamp)); + *poDS->m_ctx, osArrayPath, TILEDB_READ, + tiledb::TemporalPolicy(tiledb::TimeTravel, poDS->nTimestamp))); } else { poDS->m_array.reset(new tiledb::Array( - *poDS->m_ctx, osArrayPath, TILEDB_WRITE, poDS->nTimestamp)); + *poDS->m_ctx, osArrayPath, TILEDB_WRITE, + tiledb::TemporalPolicy(tiledb::TimeTravel, poDS->nTimestamp))); } } else @@ -2081,9 +1937,10 @@ CPLErr TileDBRasterDataset::CopySubDatasets(GDALDataset *poSrcDS, if (poDstDS->nTimestamp) { - poDstDS->m_array.reset( - new tiledb::Array(*poDstDS->m_ctx, poDstDS->GetDescription(), - TILEDB_WRITE, poDstDS->nTimestamp)); + poDstDS->m_array.reset(new tiledb::Array( + *poDstDS->m_ctx, poDstDS->GetDescription(), TILEDB_WRITE, + tiledb::TemporalPolicy(tiledb::TimeTravel, + poDstDS->nTimestamp))); } else poDstDS->m_array.reset(new tiledb::Array( @@ -2196,8 +2053,9 @@ GDALDataset *TileDBRasterDataset::Create(const char *pszFilename, int nXSize, tiledb::Array::create(osArrayPath, *poDS->m_schema); if (poDS->nTimestamp) - poDS->m_array.reset(new tiledb::Array(*poDS->m_ctx, osArrayPath, - TILEDB_WRITE, poDS->nTimestamp)); + poDS->m_array.reset(new tiledb::Array( + *poDS->m_ctx, osArrayPath, TILEDB_WRITE, + tiledb::TemporalPolicy(tiledb::TimeTravel, poDS->nTimestamp))); else poDS->m_array.reset( new tiledb::Array(*poDS->m_ctx, osArrayPath, TILEDB_WRITE)); @@ -2415,7 +2273,3 @@ GDALDataset *TileDBRasterDataset::CreateCopy(const char *pszFilename, } return nullptr; } - -#ifdef _MSC_VER -#pragma warning(pop) -#endif diff --git a/frmts/tiledb/tiledbdrivercore.cpp b/frmts/tiledb/tiledbdrivercore.cpp index d9ae98c5da1d..9d85d2ea5ec6 100644 --- a/frmts/tiledb/tiledbdrivercore.cpp +++ b/frmts/tiledb/tiledbdrivercore.cpp @@ -102,12 +102,7 @@ void TileDBDriverSetCommonMetadata(GDALDriver *poDriver) "Integer Integer64 Real String Date Time DateTime " "IntegerList Integer64List RealList Binary"); poDriver->SetMetadataItem(GDAL_DMD_CREATIONFIELDDATASUBTYPES, -#ifdef HAS_TILEDB_BOOL - "Boolean Int16 Float32" -#else - "Int16 Float32" -#endif - ); + "Boolean Int16 Float32"); poDriver->SetMetadataItem( GDAL_DMD_CREATIONOPTIONLIST, "\n" @@ -149,11 +144,9 @@ void TileDBDriverSetCommonMetadata(GDALDriver *poDriver) " \n"); // clang-format off @@ -225,11 +218,7 @@ void TileDBDriverSetCommonMetadata(GDALDriver *poDriver) "array at this timestamp, the timestamp should be > 0'/>" "