Revision 47579 trunk/org.gvsig.desktop/org.gvsig.desktop.plugin/org.gvsig.sqlite/org.gvsig.sqlite.provider/src/main/java/org/gvsig/sqlite/dal/SQLiteExplorer.java
SQLiteExplorer.java | ||
---|---|---|
1 | 1 |
package org.gvsig.sqlite.dal; |
2 | 2 |
|
3 | 3 |
import java.io.File; |
4 |
import java.sql.Connection; |
|
5 |
import java.sql.SQLException; |
|
6 |
import java.sql.Statement; |
|
7 |
import java.util.ArrayList; |
|
8 |
import java.util.List; |
|
9 |
import java.util.logging.Level; |
|
10 |
import java.util.logging.Logger; |
|
4 | 11 |
import org.apache.commons.lang3.StringUtils; |
12 |
import org.cresques.cts.IProjection; |
|
13 |
import org.gvsig.fmap.dal.DALLocator; |
|
14 |
import org.gvsig.fmap.dal.DataManager; |
|
5 | 15 |
import org.gvsig.fmap.dal.DataStore; |
16 |
import org.gvsig.fmap.dal.DataStoreParameters; |
|
6 | 17 |
import org.gvsig.fmap.dal.NewDataStoreParameters; |
7 | 18 |
import org.gvsig.fmap.dal.exception.DataException; |
8 | 19 |
import org.gvsig.fmap.dal.exception.InitializeException; |
20 |
import org.gvsig.fmap.dal.exception.RemoveException; |
|
21 |
import org.gvsig.fmap.dal.feature.EditableFeatureType; |
|
22 |
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor; |
|
23 |
import org.gvsig.fmap.dal.resource.exception.AccessResourceException; |
|
9 | 24 |
import org.gvsig.fmap.dal.spi.DataServerExplorerProviderServices; |
25 |
import org.gvsig.fmap.dal.store.jdbc.JDBCNewStoreParameters; |
|
10 | 26 |
import org.gvsig.fmap.dal.store.jdbc.JDBCServerExplorerParameters; |
27 |
import org.gvsig.fmap.dal.store.jdbc.JDBCStoreParameters; |
|
28 |
import org.gvsig.fmap.dal.store.jdbc.exception.JDBCSQLException; |
|
29 |
import org.gvsig.fmap.dal.store.jdbc2.JDBCConnection; |
|
11 | 30 |
import org.gvsig.fmap.dal.store.jdbc2.JDBCHelper; |
31 |
import org.gvsig.fmap.dal.store.jdbc2.JDBCUtils; |
|
32 |
import org.gvsig.fmap.dal.store.jdbc2.OperationsFactory; |
|
12 | 33 |
import org.gvsig.fmap.dal.store.jdbc2.spi.JDBCServerExplorerBase; |
34 |
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.FetchFeatureTypeOperation; |
|
35 |
import org.gvsig.fmap.geom.DataTypes; |
|
36 |
import org.gvsig.sqlite.dal.geopackage.GeopackageGeometryColumns; |
|
37 |
import org.gvsig.sqlite.dal.geopackage.GeopackageSpatialRefSys; |
|
38 |
import org.gvsig.sqlite.dal.geopackage.GeopackageUtils; |
|
39 |
import org.gvsig.sqlite.dal.geopackage.index.GeopackageIndexRTree; |
|
40 |
import org.gvsig.sqlite.dal.operations.SQLiteOperationsFactory; |
|
13 | 41 |
import org.gvsig.tools.resourcesstorage.ResourcesStorage; |
14 | 42 |
|
15 | 43 |
/** |
... | ... | |
51 | 79 |
|
52 | 80 |
@Override |
53 | 81 |
public boolean add(String providerName, NewDataStoreParameters theParams, boolean overwrite) throws DataException { |
54 |
// FIXME: probablemente aqui se deberia crear la tabla gpkg_spatial_ref_sys |
|
55 |
// si no existe y llenarla con lo que toque antes de intentar |
|
56 |
// crear la tabla que se quiere a?adir a la BBDD (de llamar a super.add). |
|
57 |
// |
|
58 |
// En geopackage la tabla gpkg_spatial_ref_sys solo tiene las entradas |
|
59 |
// correspondientes a los CRS que se usan, y no todos como en pg o h2, |
|
60 |
// asi que antes de a?adir una tabla deberiamos cerciorarnos si esta dado |
|
61 |
// de alta su CRS y si no a?adirlo. |
|
62 |
// |
|
63 |
// Para crear la tabla usar algo como: |
|
64 |
// CREATE TABLE "gpkg_spatial_ref_sys" ( |
|
65 |
// "srs_name" TEXT NOT NULL, |
|
66 |
// "srs_id" INTEGER NOT NULL, |
|
67 |
// "organization" TEXT NOT NULL, |
|
68 |
// "organization_coordsys_id" INTEGER NOT NULL, |
|
69 |
// "definition" TEXT NOT NULL, |
|
70 |
// "description" TEXT, |
|
71 |
// PRIMARY KEY("srs_id") |
|
72 |
// ); |
|
73 |
// |
|
74 |
// Si la tabla no existe, probablemente seria interesante crear a capon |
|
75 |
// una entrada en ella con: |
|
76 |
// INSERT INTO "main"."gpkg_spatial_ref_sys" ("srs_name", "srs_id", "organization", "organization_coordsys_id", "definition", "description") 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"]],AUTHORITY["EPSG","4326"]]', 'longitude/latitude coordinates in decimal degrees on the WGS 84 spheroid'); |
|
77 |
// |
|
78 |
// Para asegurarse que los test funcionen ya que la libreria de proyecciones |
|
79 |
// usada en los test no tiene la capacidad de obtener el WKT de la proyeccion. |
|
80 |
// Es probable que tambien debamos a?adir la entrada para EPSG:25830 ya |
|
81 |
// que los tests de ARENA2 lo usan, pero no me gusta. |
|
82 |
// Igual deberiamos tener una tabla en CSV con todas las proyecciones en el |
|
83 |
// plugin y buscar en ella para no tener que dar de alta nada a capon. Tal vez |
|
84 |
// Pillarla de la base de datos oficial de EPSG directamente. |
|
85 |
// |
|
82 |
EditableFeatureType feat = ((JDBCNewStoreParameters)theParams).getDefaultFeatureType(); |
|
83 |
if(feat != null){ |
|
84 |
FeatureAttributeDescriptor geomAttr = feat.getDefaultGeometryAttribute(); |
|
85 |
if(geomAttr != null){ |
|
86 |
IProjection proj = geomAttr.getSRS(); |
|
87 |
if(proj != null){ |
|
88 |
GeopackageSpatialRefSys refSys = GeopackageUtils.getSpatialRefSys(proj); |
|
89 |
refSys.save(this.getHelper()); |
|
90 |
} |
|
91 |
} |
|
92 |
} |
|
86 | 93 |
return super.add(providerName, theParams, overwrite); |
87 | 94 |
} |
95 |
|
|
96 |
@Override |
|
97 |
public void remove(DataStoreParameters theParams) throws RemoveException { |
|
98 |
|
|
99 |
DataManager dataManager = DALLocator.getDataManager(); |
|
100 |
EditableFeatureType type = dataManager.createFeatureType(); |
|
101 |
|
|
102 |
OperationsFactory operations = getHelper().getOperations(); |
|
103 |
OperationsFactory.TableReference table = this.getHelper().getOperations().createTableReference(((JDBCStoreParameters) theParams)); |
|
104 |
FetchFeatureTypeOperation operation = operations.createFetchFeatureType(type, table, null, null, null); |
|
105 |
operation.perform(); |
|
106 |
|
|
107 |
List<String> sqls = new ArrayList<>(); |
|
108 |
for (FeatureAttributeDescriptor attr : type) { |
|
109 |
if (attr.getDataType().getType() == DataTypes.GEOMETRY) { |
|
110 |
GeopackageIndexRTree index = new GeopackageIndexRTree(); |
|
111 |
sqls.addAll(index.getRemoveIndexSQL(table.getTable(), attr.getName())); |
|
112 |
} |
|
113 |
} |
|
114 |
JDBCConnection conn = null; |
|
115 |
Statement st = null; |
|
116 |
try { |
|
117 |
conn = this.getHelper().getConnection(); |
|
118 |
st = conn.createStatement(); |
|
119 |
for (String sql : sqls) { |
|
120 |
JDBCUtils.execute(st, sql); |
|
121 |
} |
|
122 |
} catch (Exception ex) { |
|
123 |
throw new RemoveException(table.getTable(), ex); |
|
124 |
} finally { |
|
125 |
JDBCUtils.closeQuietly(st); |
|
126 |
// JDBCUtils.closeQuietly(conn.get()); |
|
127 |
} |
|
128 |
super.remove(theParams); //To change body of generated methods, choose Tools | Templates. |
|
129 |
} |
|
88 | 130 |
|
131 |
|
|
132 |
|
|
133 |
|
|
89 | 134 |
} |
Also available in: Unified diff