This is an automated email from the ASF dual-hosted git repository.

desruisseaux pushed a commit to branch geoapi-4.0
in repository https://gitbox.apache.org/repos/asf/sis.git


The following commit(s) were added to refs/heads/geoapi-4.0 by this push:
     new 3b047f32e1 Add tests for the Geopackage module (work by Johann Sorel).
3b047f32e1 is described below

commit 3b047f32e1fffc97a2086e8019f71f57a62f2792
Author: Martin Desruisseaux <martin.desruisse...@geomatys.com>
AuthorDate: Mon Aug 12 17:53:13 2024 +0200

    Add tests for the Geopackage module (work by Johann Sorel).
---
 incubator/build.gradle.kts                         |   3 +
 .../apache/sis/storage/geopackage/StoreTest.java   | 256 +++++++++++++++++++++
 .../apache/sis/storage/geopackage/featureset.sql   | 164 +++++++++++++
 netbeans-project/nbproject/project.properties      |   1 +
 4 files changed, 424 insertions(+)

diff --git a/incubator/build.gradle.kts b/incubator/build.gradle.kts
index ef669f0f97..e3f96b3083 100644
--- a/incubator/build.gradle.kts
+++ b/incubator/build.gradle.kts
@@ -128,6 +128,9 @@ fun addExportForTests(args : MutableList<String>) {
     addExport(args, "org.apache.sis.feature",           
"org.apache.sis.geometry.wrapper.jts",
                     "org.apache.sis.portrayal.map")
 
+    addExport(args, "org.apache.sis.feature",           
"org.apache.sis.geometry.wrapper",
+                    "org.apache.sis.storage.geopackage")
+
     addExport(args, "org.apache.sis.storage",           
"org.apache.sis.storage.base",
                     "org.apache.sis.portrayal.map")
 }
diff --git 
a/incubator/src/org.apache.sis.storage.geopackage/test/org/apache/sis/storage/geopackage/StoreTest.java
 
b/incubator/src/org.apache.sis.storage.geopackage/test/org/apache/sis/storage/geopackage/StoreTest.java
index c84452c26a..b09143b438 100644
--- 
a/incubator/src/org.apache.sis.storage.geopackage/test/org/apache/sis/storage/geopackage/StoreTest.java
+++ 
b/incubator/src/org.apache.sis.storage.geopackage/test/org/apache/sis/storage/geopackage/StoreTest.java
@@ -16,5 +16,261 @@
  */
 package org.apache.sis.storage.geopackage;
 
+import java.net.URL;
+import java.net.URISyntaxException;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.List;
+import java.util.stream.Stream;
+import org.opengis.feature.AttributeType;
+import org.opengis.feature.Feature;
+import org.opengis.feature.PropertyType;
+import org.apache.sis.geometry.wrapper.Geometries;
+import org.apache.sis.geometry.wrapper.GeometryWrapper;
+import org.apache.sis.referencing.IdentifiedObjects;
+import org.apache.sis.storage.DataStore;
+import org.apache.sis.storage.DataStoreException;
+import org.apache.sis.storage.DataStores;
+import org.apache.sis.storage.FeatureSet;
+
+import org.junit.jupiter.api.Test;
+import static org.junit.jupiter.api.Assertions.*;
+
+
+/**
+ * Tests the Geopackage store.
+ *
+ * @author Johann Sorel (Geomatys)
+ */
 public final class StoreTest {
+    /**
+     * Creates a new test case.
+     */
+    public StoreTest() {
+    }
+
+    /**
+     * Returns the URL to the {@code featureset.gpkg}.
+     * If that file does not exists, it is created from the SQL script.
+     *
+     * @return URL or path to the test Geopackage file.
+     * @throws DataStoreException if a the Geopackage test file cannot be 
created.
+     */
+    private static Object getTestFile() throws DataStoreException {
+        URL file = StoreTest.class.getResource("featureset.gpkg");
+        if (file == null) try {
+            final Path source = 
Path.of(StoreTest.class.getResource("featureset.sql").toURI());
+            final Path target = 
source.resolveSibling("featureset.gpkg").toAbsolutePath();
+            try (Connection c = DriverManager.getConnection("jdbc:sqlite:" + 
target)) {
+                try (Statement s = c.createStatement()) {
+                    s.executeUpdate(Files.readString(source));
+                }
+            }
+            return target;
+        } catch (URISyntaxException | IOException | SQLException e) {
+            throw new DataStoreException("Cannot create the Geopackage test 
file.", e);
+        }
+        return file;
+    }
+
+    /**
+     * Tests reading a feature set from a Geopackage file.
+     *
+     * @throws DataStoreException if a the Geopackage test file cannot be 
created or read.
+     */
+    @Test
+    public void testFeatureSet() throws DataStoreException {
+        try (DataStore store = DataStores.open(getTestFile())) {
+            final var gpkg = assertInstanceOf(GpkgStore.class, store);
+            assertEquals(7, gpkg.components().size());
+            /*
+             * Reads and verifies two features from the Geopackage test file.
+             */
+            FeatureSet fs = getResource(gpkg, "nogeom");
+            assertPropertiesEqual(fs, null, "sis:identifier", "fid", "id");
+            {   // For keeping `the features` scope locale.
+                final Feature[] features = 
getFeatures(fs).toArray(Feature[]::new);
+                assertEquals(2, features.length);
+                assertEquals(1, features[0].getPropertyValue("fid"));
+                assertEquals(1, features[0].getPropertyValue("id"));
+                assertEquals(2, features[1].getPropertyValue("fid"));
+                assertEquals(2, features[1].getPropertyValue("id"));
+            }
+            /*
+             * Reads and verifies a feature containing a point.
+             */
+            fs = getResource(gpkg, "point");
+            assertPropertiesEqual(fs, "Point",
+                    "sis:identifier",
+                    "sis:envelope",
+                    "sis:geometry",
+                    "fid",
+                    "geometry",
+                    "text",
+                    "int32",
+                    "int64",
+                    "float",
+                    "date",
+                    "datetime",
+                    "bool");
+
+            assertGeometryEquals(fs, "OGC:CRS84", "POINT (3.8691634241245 
43.64618798638135)");
+            {   // For keeping the `feature` scope local.
+                final Feature feature = getFeatures(fs).get(0);
+                assertEquals("some text",               
feature.getPropertyValue("text"));
+                assertEquals(123,                       
feature.getPropertyValue("int32"));
+                assertEquals(123456,                    
feature.getPropertyValue("int64"));
+                assertEquals(123.456,                   
feature.getPropertyValue("float"));
+                assertEquals("2024-08-07",              
feature.getPropertyValue("date"));
+                assertEquals("2024-08-07T12:34:56.000", 
feature.getPropertyValue("datetime"));
+                assertEquals(1,                         
feature.getPropertyValue("bool"));
+            }
+            /*
+             * Reads and verifies a feature containing a multi-point geometry.
+             */
+            fs = getResource(gpkg, "multipoint");
+            assertPropertiesEqual(fs, "MultiPoint",
+                    "sis:identifier",
+                    "sis:envelope",
+                    "sis:geometry",
+                    "fid",
+                    "geom");
+
+            assertGeometryEquals(fs, "EPSG:2154",
+                    "MULTIPOINT ((770147.9089501069 6283260.318250759), 
(770224.707537184 6283233.947140678))");
+            /*
+             * Reads and verifies a feature containing a line string.
+             */
+            fs = getResource(gpkg, "line");
+            assertPropertiesEqual(fs, "LineString",
+                    "sis:identifier",
+                    "sis:envelope",
+                    "sis:geometry",
+                    "fid",
+                    "geom");
+
+            assertGeometryEquals(fs, "EPSG:3857",
+                    "LINESTRING (430669.3103960207 5411208.981453437, 
430655.7744657199 5410643.121416978)");
+            /*
+             * Reads and verifies a feature containing a multi-lines geometry.
+             */
+            fs = getResource(gpkg, "multiline");
+            assertPropertiesEqual(fs, "MultiLineString",
+                    "sis:identifier",
+                    "sis:envelope",
+                    "sis:geometry",
+                    "fid",
+                    "geom");
+
+            assertGeometryEquals(fs, "EPSG:3395",
+                    "MULTILINESTRING ((430750.52597782505 5381116.187674649, 
430967.10086263693 5380950.761655851), "
+                            + "(430753.08021745336 5381153.51545164, 
430917.9595504581 5381182.577731505))");
+            /*
+             * Reads and verifies a feature containing a polygon.
+             */
+            fs = getResource(gpkg, "polygon");
+            assertPropertiesEqual(fs, "Polygon",
+                    "sis:identifier",
+                    "sis:envelope",
+                    "sis:geometry",
+                    "fid",
+                    "geom");
+
+            assertGeometryEquals(fs, "EPSG:3857",
+                    "POLYGON ((430696.4716464551 5410782.480781593, 
430696.03196823364 5410729.011400482, "
+                            + "430716.6968446369 5410730.2266102545, 
430718.01587930095 5410780.050348468, "
+                            + "430696.4716464551 5410782.480781593))");
+            /*
+             * Reads and verifies a feature containing a multi-polygons.
+             */
+            fs = getResource(gpkg, "multipolygon");
+            assertPropertiesEqual(fs, "MultiPolygon",
+                    "sis:identifier",
+                    "sis:envelope",
+                    "sis:geometry",
+                    "fid",
+                    "geom");
+
+            assertGeometryEquals(fs, "EPSG:3395",
+                    "MULTIPOLYGON (((430795.5091658133 5381110.830395544, "
+                            + "430796.60836136667 5381129.2969556395, 
430832.2222972956 5381126.118282802, "
+                            + "430831.0131821869 5381108.711284476, 
430795.5091658133 5381110.830395544)), "
+                            + "((430849.25982837286 5381155.483207256, 
430849.1499088174 5381151.396330676, "
+                            + "430855.0855648057 5381151.547696444, 
430855.4153234717 5381154.877743942, "
+                            + "430849.25982837286 5381155.483207256)))");
+        }
+    }
+
+    /**
+     * Returns the resource of the given name.
+     *
+     * @param  store  the store from which to get the feature set.
+     * @param  name   name of the desired feature set.
+     * @return the requested feature set.
+     * @throws DataStoreException if no feature set of the given name was 
found.
+     */
+    private static FeatureSet getResource(final GpkgStore store, final String 
name) throws DataStoreException {
+        return assertInstanceOf(FeatureSet.class, store.findResource(name));
+    }
+
+    /**
+     * Asserts that the properties of the given feature set have the specified 
names.
+     * The geometry is expected to be always in the property at index 4 for 
all features
+     * (this is the case for the {@code featureset.gpkg} test file).
+     *
+     * @param  fs             the feature set from which to get the properties.
+     * @param  geometryIndex  index of the geometry property.
+     * @param  propertyNames  the expected names of all properties.
+     */
+    private static void assertPropertiesEqual(final FeatureSet fs, final 
String geometryType,
+            final String... propertyNames) throws DataStoreException
+    {
+        final PropertyType[] properties = 
fs.getType().getProperties(true).toArray(PropertyType[]::new);
+        assertEquals(propertyNames.length, properties.length, 
"properties.size()");
+        for (int i=0; i<propertyNames.length; i++) {
+            assertEquals(propertyNames[i], properties[i].getName().toString());
+        }
+        if (geometryType != null) {
+            var attribute = assertInstanceOf(AttributeType.class, 
properties[4]);
+            assertEquals(geometryType, 
attribute.getValueClass().getSimpleName());
+        }
+    }
+
+    /**
+     * Returns all feature instances as a list.
+     *
+     * @param  fs  the feature set from which to get the feature instances.
+     * @return all feature instances.
+     */
+    private static List<Feature> getFeatures(final FeatureSet fs) throws 
DataStoreException {
+        try (Stream<Feature> stream = fs.features(false)) {
+            return stream.toList();
+        }
+    }
+
+    /**
+     * Asserts that the geometry of the given feature set is equal to the 
expected WKT.
+     * This method opportunistically verifies that the value of the {@code 
"fid"} property is 1.
+     *
+     * @param resource     the feature set from which to get a single feature 
instance.
+     * @param expectedCRS  identifier of the expected CRS.
+     * @param expectedWKT  expected geometry in WKT format.
+     */
+    private static void assertGeometryEquals(final FeatureSet resource, final 
String expectedCRS, final String expectedWKT)
+            throws DataStoreException
+    {
+        final List<Feature> features = getFeatures(resource);
+        assertEquals(1, features.size());
+        final Feature feature = features.get(0);
+
+        GeometryWrapper geometry = 
Geometries.wrap(feature.getPropertyValue("sis:geometry")).get();
+        assertEquals(expectedCRS, 
IdentifiedObjects.getIdentifierOrName(geometry.getCoordinateReferenceSystem()));
+        assertEquals(expectedWKT, geometry.formatWKT(1));
+        assertEquals(1, feature.getPropertyValue("fid"));
+    }
 }
diff --git 
a/incubator/src/org.apache.sis.storage.geopackage/test/org/apache/sis/storage/geopackage/featureset.sql
 
b/incubator/src/org.apache.sis.storage.geopackage/test/org/apache/sis/storage/geopackage/featureset.sql
new file mode 100644
index 0000000000..d695c03cda
--- /dev/null
+++ 
b/incubator/src/org.apache.sis.storage.geopackage/test/org/apache/sis/storage/geopackage/featureset.sql
@@ -0,0 +1,164 @@
+PRAGMA foreign_keys=OFF;
+BEGIN TRANSACTION;
+CREATE TABLE gpkg_spatial_ref_sys (srs_name TEXT NOT NULL,srs_id INTEGER NOT 
NULL PRIMARY KEY,organization TEXT NOT NULL,organization_coordsys_id INTEGER 
NOT NULL,definition  TEXT NOT NULL,description TEXT);
+INSERT INTO gpkg_spatial_ref_sys VALUES('Undefined Cartesian 
SRS',-1,'NONE',-1,'undefined','undefined Cartesian coordinate reference 
system');
+INSERT INTO gpkg_spatial_ref_sys VALUES('Undefined geographic 
SRS',0,'NONE',0,'undefined','undefined geographic coordinate reference system');
+INSERT INTO gpkg_spatial_ref_sys VALUES('RGF93 v1 / 
Lambert-93',2154,'EPSG',2154,'PROJCS["RGF93 v1 / Lambert-93",GEOGCS["RGF93 
v1",DATUM["Reseau_Geodesique_Francais_1993_v1",SPHEROID["GRS 
1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],AUTHORITY["EPSG","6171"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4171"]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["latitude_of_origin",46.5],PARAMETER["ce
 [...]
+INSERT INTO gpkg_spatial_ref_sys VALUES('WGS 84 / World 
Mercator',3395,'EPSG',3395,'PROJCS["WGS 84 / World Mercator",GEOGCS["WGS 
84",DATUM["WGS_1984",SPHEROID["WGS 
84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Mercator_1SP"],PARAMETER["central_meridian",0],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PA
 [...]
+INSERT INTO gpkg_spatial_ref_sys VALUES('WGS 84 / 
Pseudo-Mercator',3857,'EPSG',3857,'PROJCS["WGS 84 / 
Pseudo-Mercator",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 
84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Mercator_1SP"],PARAMETER["central_meridian",0],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],
 [...]
+INSERT INTO gpkg_spatial_ref_sys VALUES('WGS 84 
geodetic',4326,'EPSG',4326,'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 
84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]','longitude/latitude
 coordinates in decimal degrees on the WGS 84 spheroid');
+INSERT INTO gpkg_spatial_ref_sys VALUES('WGS 84 
(CRS84)',100000,'NONE',100000,'GEOGCS["WGS 84 
(CRS84)",DATUM["WGS_1984",SPHEROID["WGS 
84",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Longitude",EAST],AXIS["Latitude",NORTH],AUTHORITY["OGC","CRS84"]]',NULL);
+CREATE TABLE gpkg_contents (table_name TEXT NOT NULL PRIMARY KEY,data_type 
TEXT NOT NULL,identifier TEXT UNIQUE,description TEXT DEFAULT '',last_change 
DATETIME NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),min_x DOUBLE, 
min_y DOUBLE,max_x DOUBLE, max_y DOUBLE,srs_id INTEGER,CONSTRAINT 
fk_gc_r_srs_id FOREIGN KEY (srs_id) REFERENCES gpkg_spatial_ref_sys(srs_id));
+INSERT INTO gpkg_contents 
VALUES('point','features','point','','2024-08-07T08:37:21.588Z',3.8691630363464351,43.6461868286132812,3.86916351318359286,43.6461944580078125,100000);
+INSERT INTO gpkg_contents 
VALUES('nogeom','attributes','nogeom','','2024-08-07T09:00:12.373Z',NULL,NULL,NULL,NULL,0);
+INSERT INTO gpkg_contents 
VALUES('multipoint','features','multipoint','','2024-08-07T08:45:50.870Z',770147.8125,6283233.0,770224.8125,6283260.5,2154);
+INSERT INTO gpkg_contents 
VALUES('line','features','line','','2024-08-07T08:38:06.527Z',430655.71875,5410643.0,430669.3125,5411209.0,3857);
+INSERT INTO gpkg_contents 
VALUES('multiline','features','multiline','','2024-08-07T08:44:38.990Z',430750.46875,5380950.0,430967.15625,5381183.0,3395);
+INSERT INTO gpkg_contents 
VALUES('polygon','features','polygon','','2024-08-07T08:59:29.010Z',430696.03125,5410729.0,430718.03125,5410782.5,3857);
+INSERT INTO gpkg_contents 
VALUES('multipolygon','features','multipolygon','','2024-08-07T08:58:52.118Z',430795.5,5381108.5,430855.46875,5381155.5,3395);
+CREATE TABLE gpkg_ogr_contents(table_name TEXT NOT NULL PRIMARY 
KEY,feature_count INTEGER DEFAULT NULL);
+INSERT INTO gpkg_ogr_contents VALUES('point',NULL);
+INSERT INTO gpkg_ogr_contents VALUES('nogeom',2);
+INSERT INTO gpkg_ogr_contents VALUES('multipoint',NULL);
+INSERT INTO gpkg_ogr_contents VALUES('line',NULL);
+INSERT INTO gpkg_ogr_contents VALUES('multiline',1);
+INSERT INTO gpkg_ogr_contents VALUES('polygon',NULL);
+INSERT INTO gpkg_ogr_contents VALUES('multipolygon',NULL);
+CREATE TABLE gpkg_geometry_columns (table_name TEXT NOT NULL,column_name TEXT 
NOT NULL,geometry_type_name TEXT NOT NULL,srs_id INTEGER NOT NULL,z TINYINT NOT 
NULL,m TINYINT NOT NULL,CONSTRAINT pk_geom_cols PRIMARY KEY (table_name, 
column_name),CONSTRAINT uk_gc_table_name UNIQUE (table_name),CONSTRAINT 
fk_gc_tn FOREIGN KEY (table_name) REFERENCES 
gpkg_contents(table_name),CONSTRAINT fk_gc_srs FOREIGN KEY (srs_id) REFERENCES 
gpkg_spatial_ref_sys (srs_id));
+INSERT INTO gpkg_geometry_columns 
VALUES('point','geometry','POINT',100000,0,0);
+INSERT INTO gpkg_geometry_columns 
VALUES('multipoint','geom','MULTIPOINT',2154,0,0);
+INSERT INTO gpkg_geometry_columns VALUES('line','geom','LINESTRING',3857,0,0);
+INSERT INTO gpkg_geometry_columns 
VALUES('multiline','geom','MULTILINESTRING',3395,0,0);
+INSERT INTO gpkg_geometry_columns VALUES('polygon','geom','POLYGON',3857,0,0);
+INSERT INTO gpkg_geometry_columns 
VALUES('multipolygon','geom','MULTIPOLYGON',3395,0,0);
+CREATE TABLE gpkg_tile_matrix_set (table_name TEXT NOT NULL PRIMARY KEY,srs_id 
INTEGER NOT NULL,min_x DOUBLE NOT NULL,min_y DOUBLE NOT NULL,max_x DOUBLE NOT 
NULL,max_y DOUBLE NOT NULL,CONSTRAINT fk_gtms_table_name FOREIGN KEY 
(table_name) REFERENCES gpkg_contents(table_name),CONSTRAINT fk_gtms_srs 
FOREIGN KEY (srs_id) REFERENCES gpkg_spatial_ref_sys (srs_id));
+CREATE TABLE gpkg_tile_matrix (table_name TEXT NOT NULL,zoom_level INTEGER NOT 
NULL,matrix_width INTEGER NOT NULL,matrix_height INTEGER NOT NULL,tile_width 
INTEGER NOT NULL,tile_height INTEGER NOT NULL,pixel_x_size DOUBLE NOT 
NULL,pixel_y_size DOUBLE NOT NULL,CONSTRAINT pk_ttm PRIMARY KEY (table_name, 
zoom_level),CONSTRAINT fk_tmm_table_name FOREIGN KEY (table_name) REFERENCES 
gpkg_contents(table_name));
+CREATE TABLE IF NOT EXISTS "point" ( "fid" INTEGER PRIMARY KEY AUTOINCREMENT 
NOT NULL, "geometry" POINT, "text" TEXT, "int32" MEDIUMINT, "int64" INTEGER, 
"float" REAL, "date" DATE, "datetime" DATETIME, "bool" BOOLEAN);
+INSERT INTO point 
VALUES(1,X'47500001a08601000101000000edf30bf40bf40e40ba49b649b6d24540','some 
text',123,123456,123.456000000000003,'2024-08-07','2024-08-07T12:34:56.000',1);
+CREATE TABLE gpkg_extensions (table_name TEXT,column_name TEXT,extension_name 
TEXT NOT NULL,definition TEXT NOT NULL,scope TEXT NOT NULL,CONSTRAINT ge_tce 
UNIQUE (table_name, column_name, extension_name));
+INSERT INTO gpkg_extensions 
VALUES('point','geometry','gpkg_rtree_index','http://www.geopackage.org/spec120/#extension_rtree','write-only');
+INSERT INTO gpkg_extensions 
VALUES('multipoint','geom','gpkg_rtree_index','http://www.geopackage.org/spec120/#extension_rtree','write-only');
+INSERT INTO gpkg_extensions 
VALUES('line','geom','gpkg_rtree_index','http://www.geopackage.org/spec120/#extension_rtree','write-only');
+INSERT INTO gpkg_extensions 
VALUES('multiline','geom','gpkg_rtree_index','http://www.geopackage.org/spec120/#extension_rtree','write-only');
+INSERT INTO gpkg_extensions 
VALUES('polygon','geom','gpkg_rtree_index','http://www.geopackage.org/spec120/#extension_rtree','write-only');
+INSERT INTO gpkg_extensions 
VALUES('multipolygon','geom','gpkg_rtree_index','http://www.geopackage.org/spec120/#extension_rtree','write-only');
+CREATE TABLE IF NOT EXISTS "rtree_point_geometry_rowid"(rowid INTEGER PRIMARY 
KEY,nodeno);
+INSERT INTO rtree_point_geometry_rowid VALUES(1,1);
+CREATE TABLE IF NOT EXISTS "rtree_point_geometry_node"(nodeno INTEGER PRIMARY 
KEY,data);
+INSERT INTO rtree_point_geometry_node 
VALUES(1,X'0000000100000000000000014077a05e4077a060422e95b2422e95b4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
 [...]
+CREATE TABLE IF NOT EXISTS "rtree_point_geometry_parent"(nodeno INTEGER 
PRIMARY KEY,parentnode);
+CREATE TABLE IF NOT EXISTS "nogeom" ( "fid" INTEGER PRIMARY KEY AUTOINCREMENT 
NOT NULL, "id" MEDIUMINT);
+INSERT INTO nogeom VALUES(1,1);
+INSERT INTO nogeom VALUES(2,2);
+CREATE TABLE IF NOT EXISTS "multipoint" ( "fid" INTEGER PRIMARY KEY 
AUTOINCREMENT NOT NULL, "geom" MULTIPOINT);
+INSERT INTO multipoint 
VALUES(1,X'475000036a0800008ee861d1c78027415450426a61812741eff39d7cf8f757416e385e14fff7574101040000000200000001010000008ee861d1c78027416e385e14fff7574101010000005450426a61812741eff39d7cf8f75741');
+CREATE TABLE IF NOT EXISTS "rtree_multipoint_geom_rowid"(rowid INTEGER PRIMARY 
KEY,nodeno);
+INSERT INTO rtree_multipoint_geom_rowid VALUES(1,1);
+CREATE TABLE IF NOT EXISTS "rtree_multipoint_geom_node"(nodeno INTEGER PRIMARY 
KEY,data);
+INSERT INTO rtree_multipoint_geom_node 
VALUES(1,X'000000010000000000000001493c063d493c0b0d4abfbfc24abfbff900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
 [...]
+CREATE TABLE IF NOT EXISTS "rtree_multipoint_geom_parent"(nodeno INTEGER 
PRIMARY KEY,parentnode);
+CREATE TABLE IF NOT EXISTS "line" ( "fid" INTEGER PRIMARY KEY AUTOINCREMENT 
NOT NULL, "geom" LINESTRING);
+INSERT INTO line 
VALUES(1,X'47500003110f0000ab8a0d19ff481a415774d83d35491a41b74bc5c7d4a354411422d03e62a454410102000000020000005774d83d35491a411422d03e62a45441ab8a0d19ff481a41b74bc5c7d4a35441');
+CREATE TABLE IF NOT EXISTS "rtree_line_geom_rowid"(rowid INTEGER PRIMARY 
KEY,nodeno);
+INSERT INTO rtree_line_geom_rowid VALUES(1,1);
+CREATE TABLE IF NOT EXISTS "rtree_line_geom_node"(nodeno INTEGER PRIMARY 
KEY,data);
+INSERT INTO rtree_line_geom_node 
VALUES(1,X'00000001000000000000000148d247f748d249aa4aa51ea64aa5231200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
 [...]
+CREATE TABLE IF NOT EXISTS "rtree_line_geom_parent"(nodeno INTEGER PRIMARY 
KEY,parentnode);
+CREATE TABLE IF NOT EXISTS "multiline" ( "fid" INTEGER PRIMARY KEY 
AUTOINCREMENT NOT NULL, "geom" MULTILINESTRING);
+INSERT INTO multiline 
VALUES(1,X'47500003430d000054ee991a7a4a1a41fc884867dc4d1a412ff8beb0d5865441908df9a40f87544101050000000200000001020000000200000054ee991a7a4a1a4188dc020cff865441fc884867dc4d1a412ff8beb0d58654410102000000020000002b862452844a1a41e028fd6008875441326594d6174d1a41908df9a40f875441');
+CREATE TABLE IF NOT EXISTS "rtree_multiline_geom_rowid"(rowid INTEGER PRIMARY 
KEY,nodeno);
+INSERT INTO rtree_multiline_geom_rowid VALUES(1,1);
+CREATE TABLE IF NOT EXISTS "rtree_multiline_geom_node"(nodeno INTEGER PRIMARY 
KEY,data);
+INSERT INTO rtree_multiline_geom_node 
VALUES(1,X'00000001000000000000000148d253cf48d26ee54aa436ac4aa4387e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
 [...]
+CREATE TABLE IF NOT EXISTS "rtree_multiline_geom_parent"(nodeno INTEGER 
PRIMARY KEY,parentnode);
+CREATE TABLE IF NOT EXISTS "polygon" ( "fid" INTEGER PRIMARY KEY AUTOINCREMENT 
NOT NULL, "geom" POLYGON);
+INSERT INTO polygon 
VALUES(1,X'47500003110f0000d847bc20a0491a41d9a94210f8491a4116c9ba40eaa354412920c59ef7a3544101030000000100000005000000d049f7e2a1491a412920c59ef7a35441d847bc20a0491a4116c9ba40eaa35441f8a391c9f2491a414cc8808eeaa35441d9a94210f8491a41c8e83803f7a35441d049f7e2a1491a412920c59ef7a35441');
+CREATE TABLE IF NOT EXISTS "rtree_polygon_geom_rowid"(rowid INTEGER PRIMARY 
KEY,nodeno);
+INSERT INTO rtree_polygon_geom_rowid VALUES(1,1);
+CREATE TABLE IF NOT EXISTS "rtree_polygon_geom_node"(nodeno INTEGER PRIMARY 
KEY,data);
+INSERT INTO rtree_polygon_geom_node 
VALUES(1,X'00000001000000000000000148d24d0148d24fc14aa51f524aa51fbd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
 [...]
+CREATE TABLE IF NOT EXISTS "rtree_polygon_geom_parent"(nodeno INTEGER PRIMARY 
KEY,parentnode);
+CREATE TABLE IF NOT EXISTS "multipolygon" ( "fid" INTEGER PRIMARY KEY 
AUTOINCREMENT NOT NULL, "geom" MULTIPOLYGON);
+INSERT INTO multipolygon 
VALUES(1,X'47500003430d000051c362092e4b1a41618e4aa91d4c1a4153af852dfd86544120deecde088754410106000000020000000103000000010000000500000051c362092e4b1a415a3325b5fd8654413848f66e324b1a413a52015302875441fae6a1e3c04b1a4108f291870187544197a17f0dbc4b1a4153af852dfd86544151c362092e4b1a415a3325b5fd86544101030000000100000005000000f072100a054c1a4120deecde0887544170b28199044c1a41577b5dd907875441e94c9e571c4c1a4163750de307875441618e4aa91d4c1a41edf42cb808875441f072100a054c1a4120
 [...]
+CREATE TABLE IF NOT EXISTS "rtree_multipolygon_geom_rowid"(rowid INTEGER 
PRIMARY KEY,nodeno);
+INSERT INTO rtree_multipolygon_geom_rowid VALUES(1,1);
+CREATE TABLE IF NOT EXISTS "rtree_multipolygon_geom_node"(nodeno INTEGER 
PRIMARY KEY,data);
+INSERT INTO rtree_multipolygon_geom_node 
VALUES(1,X'00000001000000000000000148d2597048d260ef4aa437e94aa43847000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
 [...]
+CREATE TABLE IF NOT EXISTS "rtree_multipolygon_geom_parent"(nodeno INTEGER 
PRIMARY KEY,parentnode);
+PRAGMA writable_schema=ON;
+INSERT INTO 
sqlite_schema(type,name,tbl_name,rootpage,sql)VALUES('table','rtree_point_geometry','rtree_point_geometry',0,'CREATE
 VIRTUAL TABLE "rtree_point_geometry" USING rtree(id, minx, maxx, miny, maxy)');
+INSERT INTO 
sqlite_schema(type,name,tbl_name,rootpage,sql)VALUES('table','rtree_multipoint_geom','rtree_multipoint_geom',0,'CREATE
 VIRTUAL TABLE "rtree_multipoint_geom" USING rtree(id, minx, maxx, miny, 
maxy)');
+INSERT INTO 
sqlite_schema(type,name,tbl_name,rootpage,sql)VALUES('table','rtree_line_geom','rtree_line_geom',0,'CREATE
 VIRTUAL TABLE "rtree_line_geom" USING rtree(id, minx, maxx, miny, maxy)');
+INSERT INTO 
sqlite_schema(type,name,tbl_name,rootpage,sql)VALUES('table','rtree_multiline_geom','rtree_multiline_geom',0,'CREATE
 VIRTUAL TABLE "rtree_multiline_geom" USING rtree(id, minx, maxx, miny, maxy)');
+INSERT INTO 
sqlite_schema(type,name,tbl_name,rootpage,sql)VALUES('table','rtree_polygon_geom','rtree_polygon_geom',0,'CREATE
 VIRTUAL TABLE "rtree_polygon_geom" USING rtree(id, minx, maxx, miny, maxy)');
+INSERT INTO 
sqlite_schema(type,name,tbl_name,rootpage,sql)VALUES('table','rtree_multipolygon_geom','rtree_multipolygon_geom',0,'CREATE
 VIRTUAL TABLE "rtree_multipolygon_geom" USING rtree(id, minx, maxx, miny, 
maxy)');
+DELETE FROM sqlite_sequence;
+INSERT INTO sqlite_sequence VALUES('point',1);
+INSERT INTO sqlite_sequence VALUES('line',1);
+INSERT INTO sqlite_sequence VALUES('multiline',1);
+INSERT INTO sqlite_sequence VALUES('multipoint',1);
+INSERT INTO sqlite_sequence VALUES('multipolygon',1);
+INSERT INTO sqlite_sequence VALUES('polygon',1);
+INSERT INTO sqlite_sequence VALUES('nogeom',2);
+CREATE TRIGGER 'gpkg_tile_matrix_zoom_level_insert' BEFORE INSERT ON 
'gpkg_tile_matrix' FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'insert on table 
''gpkg_tile_matrix'' violates constraint: zoom_level cannot be less than 0') 
WHERE (NEW.zoom_level < 0); END;
+CREATE TRIGGER 'gpkg_tile_matrix_zoom_level_update' BEFORE UPDATE of 
zoom_level ON 'gpkg_tile_matrix' FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'update 
on table ''gpkg_tile_matrix'' violates constraint: zoom_level cannot be less 
than 0') WHERE (NEW.zoom_level < 0); END;
+CREATE TRIGGER 'gpkg_tile_matrix_matrix_width_insert' BEFORE INSERT ON 
'gpkg_tile_matrix' FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'insert on table 
''gpkg_tile_matrix'' violates constraint: matrix_width cannot be less than 1') 
WHERE (NEW.matrix_width < 1); END;
+CREATE TRIGGER 'gpkg_tile_matrix_matrix_width_update' BEFORE UPDATE OF 
matrix_width ON 'gpkg_tile_matrix' FOR EACH ROW BEGIN SELECT RAISE(ABORT, 
'update on table ''gpkg_tile_matrix'' violates constraint: matrix_width cannot 
be less than 1') WHERE (NEW.matrix_width < 1); END;
+CREATE TRIGGER 'gpkg_tile_matrix_matrix_height_insert' BEFORE INSERT ON 
'gpkg_tile_matrix' FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'insert on table 
''gpkg_tile_matrix'' violates constraint: matrix_height cannot be less than 1') 
WHERE (NEW.matrix_height < 1); END;
+CREATE TRIGGER 'gpkg_tile_matrix_matrix_height_update' BEFORE UPDATE OF 
matrix_height ON 'gpkg_tile_matrix' FOR EACH ROW BEGIN SELECT RAISE(ABORT, 
'update on table ''gpkg_tile_matrix'' violates constraint: matrix_height cannot 
be less than 1') WHERE (NEW.matrix_height < 1); END;
+CREATE TRIGGER 'gpkg_tile_matrix_pixel_x_size_insert' BEFORE INSERT ON 
'gpkg_tile_matrix' FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'insert on table 
''gpkg_tile_matrix'' violates constraint: pixel_x_size must be greater than 0') 
WHERE NOT (NEW.pixel_x_size > 0); END;
+CREATE TRIGGER 'gpkg_tile_matrix_pixel_x_size_update' BEFORE UPDATE OF 
pixel_x_size ON 'gpkg_tile_matrix' FOR EACH ROW BEGIN SELECT RAISE(ABORT, 
'update on table ''gpkg_tile_matrix'' violates constraint: pixel_x_size must be 
greater than 0') WHERE NOT (NEW.pixel_x_size > 0); END;
+CREATE TRIGGER 'gpkg_tile_matrix_pixel_y_size_insert' BEFORE INSERT ON 
'gpkg_tile_matrix' FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'insert on table 
''gpkg_tile_matrix'' violates constraint: pixel_y_size must be greater than 0') 
WHERE NOT (NEW.pixel_y_size > 0); END;
+CREATE TRIGGER 'gpkg_tile_matrix_pixel_y_size_update' BEFORE UPDATE OF 
pixel_y_size ON 'gpkg_tile_matrix' FOR EACH ROW BEGIN SELECT RAISE(ABORT, 
'update on table ''gpkg_tile_matrix'' violates constraint: pixel_y_size must be 
greater than 0') WHERE NOT (NEW.pixel_y_size > 0); END;
+CREATE TRIGGER "rtree_point_geometry_insert" AFTER INSERT ON "point" WHEN 
(new."geometry" NOT NULL AND NOT ST_IsEmpty(NEW."geometry")) BEGIN INSERT OR 
REPLACE INTO "rtree_point_geometry" VALUES (NEW."fid",ST_MinX(NEW."geometry"), 
ST_MaxX(NEW."geometry"),ST_MinY(NEW."geometry"), ST_MaxY(NEW."geometry")); END;
+CREATE TRIGGER "rtree_point_geometry_update1" AFTER UPDATE OF "geometry" ON 
"point" WHEN OLD."fid" = NEW."fid" AND (NEW."geometry" NOTNULL AND NOT 
ST_IsEmpty(NEW."geometry")) BEGIN INSERT OR REPLACE INTO "rtree_point_geometry" 
VALUES (NEW."fid",ST_MinX(NEW."geometry"), 
ST_MaxX(NEW."geometry"),ST_MinY(NEW."geometry"), ST_MaxY(NEW."geometry")); END;
+CREATE TRIGGER "rtree_point_geometry_update2" AFTER UPDATE OF "geometry" ON 
"point" WHEN OLD."fid" = NEW."fid" AND (NEW."geometry" ISNULL OR 
ST_IsEmpty(NEW."geometry")) BEGIN DELETE FROM "rtree_point_geometry" WHERE id = 
OLD."fid"; END;
+CREATE TRIGGER "rtree_point_geometry_update3" AFTER UPDATE ON "point" WHEN 
OLD."fid" != NEW."fid" AND (NEW."geometry" NOTNULL AND NOT 
ST_IsEmpty(NEW."geometry")) BEGIN DELETE FROM "rtree_point_geometry" WHERE id = 
OLD."fid"; INSERT OR REPLACE INTO "rtree_point_geometry" VALUES 
(NEW."fid",ST_MinX(NEW."geometry"), 
ST_MaxX(NEW."geometry"),ST_MinY(NEW."geometry"), ST_MaxY(NEW."geometry")); END;
+CREATE TRIGGER "rtree_point_geometry_update4" AFTER UPDATE ON "point" WHEN 
OLD."fid" != NEW."fid" AND (NEW."geometry" ISNULL OR 
ST_IsEmpty(NEW."geometry")) BEGIN DELETE FROM "rtree_point_geometry" WHERE id 
IN (OLD."fid", NEW."fid"); END;
+CREATE TRIGGER "rtree_point_geometry_delete" AFTER DELETE ON "point" WHEN 
old."geometry" NOT NULL BEGIN DELETE FROM "rtree_point_geometry" WHERE id = 
OLD."fid"; END;
+CREATE TRIGGER "rtree_multipoint_geom_insert" AFTER INSERT ON "multipoint" 
WHEN (new."geom" NOT NULL AND NOT ST_IsEmpty(NEW."geom")) BEGIN INSERT OR 
REPLACE INTO "rtree_multipoint_geom" VALUES (NEW."fid",ST_MinX(NEW."geom"), 
ST_MaxX(NEW."geom"),ST_MinY(NEW."geom"), ST_MaxY(NEW."geom")); END;
+CREATE TRIGGER "rtree_multipoint_geom_update1" AFTER UPDATE OF "geom" ON 
"multipoint" WHEN OLD."fid" = NEW."fid" AND (NEW."geom" NOTNULL AND NOT 
ST_IsEmpty(NEW."geom")) BEGIN INSERT OR REPLACE INTO "rtree_multipoint_geom" 
VALUES (NEW."fid",ST_MinX(NEW."geom"), ST_MaxX(NEW."geom"),ST_MinY(NEW."geom"), 
ST_MaxY(NEW."geom")); END;
+CREATE TRIGGER "rtree_multipoint_geom_update2" AFTER UPDATE OF "geom" ON 
"multipoint" WHEN OLD."fid" = NEW."fid" AND (NEW."geom" ISNULL OR 
ST_IsEmpty(NEW."geom")) BEGIN DELETE FROM "rtree_multipoint_geom" WHERE id = 
OLD."fid"; END;
+CREATE TRIGGER "rtree_multipoint_geom_update3" AFTER UPDATE ON "multipoint" 
WHEN OLD."fid" != NEW."fid" AND (NEW."geom" NOTNULL AND NOT 
ST_IsEmpty(NEW."geom")) BEGIN DELETE FROM "rtree_multipoint_geom" WHERE id = 
OLD."fid"; INSERT OR REPLACE INTO "rtree_multipoint_geom" VALUES 
(NEW."fid",ST_MinX(NEW."geom"), ST_MaxX(NEW."geom"),ST_MinY(NEW."geom"), 
ST_MaxY(NEW."geom")); END;
+CREATE TRIGGER "rtree_multipoint_geom_update4" AFTER UPDATE ON "multipoint" 
WHEN OLD."fid" != NEW."fid" AND (NEW."geom" ISNULL OR ST_IsEmpty(NEW."geom")) 
BEGIN DELETE FROM "rtree_multipoint_geom" WHERE id IN (OLD."fid", NEW."fid"); 
END;
+CREATE TRIGGER "rtree_multipoint_geom_delete" AFTER DELETE ON "multipoint" 
WHEN old."geom" NOT NULL BEGIN DELETE FROM "rtree_multipoint_geom" WHERE id = 
OLD."fid"; END;
+CREATE TRIGGER "rtree_line_geom_insert" AFTER INSERT ON "line" WHEN 
(new."geom" NOT NULL AND NOT ST_IsEmpty(NEW."geom")) BEGIN INSERT OR REPLACE 
INTO "rtree_line_geom" VALUES (NEW."fid",ST_MinX(NEW."geom"), 
ST_MaxX(NEW."geom"),ST_MinY(NEW."geom"), ST_MaxY(NEW."geom")); END;
+CREATE TRIGGER "rtree_line_geom_update1" AFTER UPDATE OF "geom" ON "line" WHEN 
OLD."fid" = NEW."fid" AND (NEW."geom" NOTNULL AND NOT ST_IsEmpty(NEW."geom")) 
BEGIN INSERT OR REPLACE INTO "rtree_line_geom" VALUES 
(NEW."fid",ST_MinX(NEW."geom"), ST_MaxX(NEW."geom"),ST_MinY(NEW."geom"), 
ST_MaxY(NEW."geom")); END;
+CREATE TRIGGER "rtree_line_geom_update2" AFTER UPDATE OF "geom" ON "line" WHEN 
OLD."fid" = NEW."fid" AND (NEW."geom" ISNULL OR ST_IsEmpty(NEW."geom")) BEGIN 
DELETE FROM "rtree_line_geom" WHERE id = OLD."fid"; END;
+CREATE TRIGGER "rtree_line_geom_update3" AFTER UPDATE ON "line" WHEN OLD."fid" 
!= NEW."fid" AND (NEW."geom" NOTNULL AND NOT ST_IsEmpty(NEW."geom")) BEGIN 
DELETE FROM "rtree_line_geom" WHERE id = OLD."fid"; INSERT OR REPLACE INTO 
"rtree_line_geom" VALUES (NEW."fid",ST_MinX(NEW."geom"), 
ST_MaxX(NEW."geom"),ST_MinY(NEW."geom"), ST_MaxY(NEW."geom")); END;
+CREATE TRIGGER "rtree_line_geom_update4" AFTER UPDATE ON "line" WHEN OLD."fid" 
!= NEW."fid" AND (NEW."geom" ISNULL OR ST_IsEmpty(NEW."geom")) BEGIN DELETE 
FROM "rtree_line_geom" WHERE id IN (OLD."fid", NEW."fid"); END;
+CREATE TRIGGER "rtree_line_geom_delete" AFTER DELETE ON "line" WHEN old."geom" 
NOT NULL BEGIN DELETE FROM "rtree_line_geom" WHERE id = OLD."fid"; END;
+CREATE TRIGGER "rtree_multiline_geom_insert" AFTER INSERT ON "multiline" WHEN 
(new."geom" NOT NULL AND NOT ST_IsEmpty(NEW."geom")) BEGIN INSERT OR REPLACE 
INTO "rtree_multiline_geom" VALUES (NEW."fid",ST_MinX(NEW."geom"), 
ST_MaxX(NEW."geom"),ST_MinY(NEW."geom"), ST_MaxY(NEW."geom")); END;
+CREATE TRIGGER "rtree_multiline_geom_update1" AFTER UPDATE OF "geom" ON 
"multiline" WHEN OLD."fid" = NEW."fid" AND (NEW."geom" NOTNULL AND NOT 
ST_IsEmpty(NEW."geom")) BEGIN INSERT OR REPLACE INTO "rtree_multiline_geom" 
VALUES (NEW."fid",ST_MinX(NEW."geom"), ST_MaxX(NEW."geom"),ST_MinY(NEW."geom"), 
ST_MaxY(NEW."geom")); END;
+CREATE TRIGGER "rtree_multiline_geom_update2" AFTER UPDATE OF "geom" ON 
"multiline" WHEN OLD."fid" = NEW."fid" AND (NEW."geom" ISNULL OR 
ST_IsEmpty(NEW."geom")) BEGIN DELETE FROM "rtree_multiline_geom" WHERE id = 
OLD."fid"; END;
+CREATE TRIGGER "rtree_multiline_geom_update3" AFTER UPDATE ON "multiline" WHEN 
OLD."fid" != NEW."fid" AND (NEW."geom" NOTNULL AND NOT ST_IsEmpty(NEW."geom")) 
BEGIN DELETE FROM "rtree_multiline_geom" WHERE id = OLD."fid"; INSERT OR 
REPLACE INTO "rtree_multiline_geom" VALUES (NEW."fid",ST_MinX(NEW."geom"), 
ST_MaxX(NEW."geom"),ST_MinY(NEW."geom"), ST_MaxY(NEW."geom")); END;
+CREATE TRIGGER "rtree_multiline_geom_update4" AFTER UPDATE ON "multiline" WHEN 
OLD."fid" != NEW."fid" AND (NEW."geom" ISNULL OR ST_IsEmpty(NEW."geom")) BEGIN 
DELETE FROM "rtree_multiline_geom" WHERE id IN (OLD."fid", NEW."fid"); END;
+CREATE TRIGGER "rtree_multiline_geom_delete" AFTER DELETE ON "multiline" WHEN 
old."geom" NOT NULL BEGIN DELETE FROM "rtree_multiline_geom" WHERE id = 
OLD."fid"; END;
+CREATE TRIGGER "rtree_polygon_geom_insert" AFTER INSERT ON "polygon" WHEN 
(new."geom" NOT NULL AND NOT ST_IsEmpty(NEW."geom")) BEGIN INSERT OR REPLACE 
INTO "rtree_polygon_geom" VALUES (NEW."fid",ST_MinX(NEW."geom"), 
ST_MaxX(NEW."geom"),ST_MinY(NEW."geom"), ST_MaxY(NEW."geom")); END;
+CREATE TRIGGER "rtree_polygon_geom_update1" AFTER UPDATE OF "geom" ON 
"polygon" WHEN OLD."fid" = NEW."fid" AND (NEW."geom" NOTNULL AND NOT 
ST_IsEmpty(NEW."geom")) BEGIN INSERT OR REPLACE INTO "rtree_polygon_geom" 
VALUES (NEW."fid",ST_MinX(NEW."geom"), ST_MaxX(NEW."geom"),ST_MinY(NEW."geom"), 
ST_MaxY(NEW."geom")); END;
+CREATE TRIGGER "rtree_polygon_geom_update2" AFTER UPDATE OF "geom" ON 
"polygon" WHEN OLD."fid" = NEW."fid" AND (NEW."geom" ISNULL OR 
ST_IsEmpty(NEW."geom")) BEGIN DELETE FROM "rtree_polygon_geom" WHERE id = 
OLD."fid"; END;
+CREATE TRIGGER "rtree_polygon_geom_update3" AFTER UPDATE ON "polygon" WHEN 
OLD."fid" != NEW."fid" AND (NEW."geom" NOTNULL AND NOT ST_IsEmpty(NEW."geom")) 
BEGIN DELETE FROM "rtree_polygon_geom" WHERE id = OLD."fid"; INSERT OR REPLACE 
INTO "rtree_polygon_geom" VALUES (NEW."fid",ST_MinX(NEW."geom"), 
ST_MaxX(NEW."geom"),ST_MinY(NEW."geom"), ST_MaxY(NEW."geom")); END;
+CREATE TRIGGER "rtree_polygon_geom_update4" AFTER UPDATE ON "polygon" WHEN 
OLD."fid" != NEW."fid" AND (NEW."geom" ISNULL OR ST_IsEmpty(NEW."geom")) BEGIN 
DELETE FROM "rtree_polygon_geom" WHERE id IN (OLD."fid", NEW."fid"); END;
+CREATE TRIGGER "rtree_polygon_geom_delete" AFTER DELETE ON "polygon" WHEN 
old."geom" NOT NULL BEGIN DELETE FROM "rtree_polygon_geom" WHERE id = 
OLD."fid"; END;
+CREATE TRIGGER "rtree_multipolygon_geom_insert" AFTER INSERT ON "multipolygon" 
WHEN (new."geom" NOT NULL AND NOT ST_IsEmpty(NEW."geom")) BEGIN INSERT OR 
REPLACE INTO "rtree_multipolygon_geom" VALUES (NEW."fid",ST_MinX(NEW."geom"), 
ST_MaxX(NEW."geom"),ST_MinY(NEW."geom"), ST_MaxY(NEW."geom")); END;
+CREATE TRIGGER "rtree_multipolygon_geom_update1" AFTER UPDATE OF "geom" ON 
"multipolygon" WHEN OLD."fid" = NEW."fid" AND (NEW."geom" NOTNULL AND NOT 
ST_IsEmpty(NEW."geom")) BEGIN INSERT OR REPLACE INTO "rtree_multipolygon_geom" 
VALUES (NEW."fid",ST_MinX(NEW."geom"), ST_MaxX(NEW."geom"),ST_MinY(NEW."geom"), 
ST_MaxY(NEW."geom")); END;
+CREATE TRIGGER "rtree_multipolygon_geom_update2" AFTER UPDATE OF "geom" ON 
"multipolygon" WHEN OLD."fid" = NEW."fid" AND (NEW."geom" ISNULL OR 
ST_IsEmpty(NEW."geom")) BEGIN DELETE FROM "rtree_multipolygon_geom" WHERE id = 
OLD."fid"; END;
+CREATE TRIGGER "rtree_multipolygon_geom_update3" AFTER UPDATE ON 
"multipolygon" WHEN OLD."fid" != NEW."fid" AND (NEW."geom" NOTNULL AND NOT 
ST_IsEmpty(NEW."geom")) BEGIN DELETE FROM "rtree_multipolygon_geom" WHERE id = 
OLD."fid"; INSERT OR REPLACE INTO "rtree_multipolygon_geom" VALUES 
(NEW."fid",ST_MinX(NEW."geom"), ST_MaxX(NEW."geom"),ST_MinY(NEW."geom"), 
ST_MaxY(NEW."geom")); END;
+CREATE TRIGGER "rtree_multipolygon_geom_update4" AFTER UPDATE ON 
"multipolygon" WHEN OLD."fid" != NEW."fid" AND (NEW."geom" ISNULL OR 
ST_IsEmpty(NEW."geom")) BEGIN DELETE FROM "rtree_multipolygon_geom" WHERE id IN 
(OLD."fid", NEW."fid"); END;
+CREATE TRIGGER "rtree_multipolygon_geom_delete" AFTER DELETE ON "multipolygon" 
WHEN old."geom" NOT NULL BEGIN DELETE FROM "rtree_multipolygon_geom" WHERE id = 
OLD."fid"; END;
+CREATE TRIGGER "trigger_insert_feature_count_point" AFTER INSERT ON "point" 
BEGIN UPDATE gpkg_ogr_contents SET feature_count = feature_count + 1 WHERE 
lower(table_name) = lower('point'); END;
+CREATE TRIGGER "trigger_delete_feature_count_point" AFTER DELETE ON "point" 
BEGIN UPDATE gpkg_ogr_contents SET feature_count = feature_count - 1 WHERE 
lower(table_name) = lower('point'); END;
+CREATE TRIGGER "trigger_insert_feature_count_line" AFTER INSERT ON "line" 
BEGIN UPDATE gpkg_ogr_contents SET feature_count = feature_count + 1 WHERE 
lower(table_name) = lower('line'); END;
+CREATE TRIGGER "trigger_delete_feature_count_line" AFTER DELETE ON "line" 
BEGIN UPDATE gpkg_ogr_contents SET feature_count = feature_count - 1 WHERE 
lower(table_name) = lower('line'); END;
+CREATE TRIGGER "trigger_insert_feature_count_multiline" AFTER INSERT ON 
"multiline" BEGIN UPDATE gpkg_ogr_contents SET feature_count = feature_count + 
1 WHERE lower(table_name) = lower('multiline'); END;
+CREATE TRIGGER "trigger_delete_feature_count_multiline" AFTER DELETE ON 
"multiline" BEGIN UPDATE gpkg_ogr_contents SET feature_count = feature_count - 
1 WHERE lower(table_name) = lower('multiline'); END;
+CREATE TRIGGER "trigger_insert_feature_count_multipoint" AFTER INSERT ON 
"multipoint" BEGIN UPDATE gpkg_ogr_contents SET feature_count = feature_count + 
1 WHERE lower(table_name) = lower('multipoint'); END;
+CREATE TRIGGER "trigger_delete_feature_count_multipoint" AFTER DELETE ON 
"multipoint" BEGIN UPDATE gpkg_ogr_contents SET feature_count = feature_count - 
1 WHERE lower(table_name) = lower('multipoint'); END;
+CREATE TRIGGER "trigger_insert_feature_count_multipolygon" AFTER INSERT ON 
"multipolygon" BEGIN UPDATE gpkg_ogr_contents SET feature_count = feature_count 
+ 1 WHERE lower(table_name) = lower('multipolygon'); END;
+CREATE TRIGGER "trigger_delete_feature_count_multipolygon" AFTER DELETE ON 
"multipolygon" BEGIN UPDATE gpkg_ogr_contents SET feature_count = feature_count 
- 1 WHERE lower(table_name) = lower('multipolygon'); END;
+CREATE TRIGGER "trigger_insert_feature_count_polygon" AFTER INSERT ON 
"polygon" BEGIN UPDATE gpkg_ogr_contents SET feature_count = feature_count + 1 
WHERE lower(table_name) = lower('polygon'); END;
+CREATE TRIGGER "trigger_delete_feature_count_polygon" AFTER DELETE ON 
"polygon" BEGIN UPDATE gpkg_ogr_contents SET feature_count = feature_count - 1 
WHERE lower(table_name) = lower('polygon'); END;
+CREATE TRIGGER "trigger_insert_feature_count_nogeom" AFTER INSERT ON "nogeom" 
BEGIN UPDATE gpkg_ogr_contents SET feature_count = feature_count + 1 WHERE 
lower(table_name) = lower('nogeom'); END;
+CREATE TRIGGER "trigger_delete_feature_count_nogeom" AFTER DELETE ON "nogeom" 
BEGIN UPDATE gpkg_ogr_contents SET feature_count = feature_count - 1 WHERE 
lower(table_name) = lower('nogeom'); END;
+PRAGMA writable_schema=OFF;
+COMMIT;
diff --git a/netbeans-project/nbproject/project.properties 
b/netbeans-project/nbproject/project.properties
index 887508ad74..b157430750 100644
--- a/netbeans-project/nbproject/project.properties
+++ b/netbeans-project/nbproject/project.properties
@@ -121,6 +121,7 @@ test.options = --add-modules jama,GeographicLib.Java,\
                --add-exports 
org.apache.sis.referencing/org.apache.sis.referencing.internal=org.apache.sis.openoffice
 \
                --add-exports 
org.apache.sis.feature/org.apache.sis.feature.privy=org.apache.sis.storage.sql \
                --add-exports 
org.apache.sis.feature/org.apache.sis.geometry.wrapper.jts=org.apache.sis.storage.sql,org.apache.sis.portrayal.map
 \
+               --add-exports 
org.apache.sis.feature/org.apache.sis.geometry.wrapper=org.apache.sis.storage.geopackage
 \
                --add-exports 
org.apache.sis.storage/org.apache.sis.storage.base=org.apache.sis.portrayal.map 
\
                --add-exports 
org.apache.sis.storage/org.apache.sis.storage.test=${modules.list}
 


Reply via email to