Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.plugin / org.gvsig.sqlite / org.gvsig.sqlite.provider / src / main / java / org / gvsig / sqlite / dal / geopackage / GeopackageGeometryColumns.java @ 47606

History | View | Annotate | Download (7.53 KB)

1
/*
2
 * To change this license header, choose License Headers in Project Properties.
3
 * To change this template file, choose Tools | Templates
4
 * and open the template in the editor.
5
 */
6
package org.gvsig.sqlite.dal.geopackage;
7

    
8
import java.sql.ResultSet;
9
import java.sql.SQLException;
10
import java.sql.Statement;
11
import java.util.Map;
12
import org.gvsig.expressionevaluator.ExpressionBuilder;
13
import org.gvsig.fmap.dal.store.jdbc2.JDBCConnection;
14
import org.gvsig.fmap.dal.store.jdbc2.JDBCUtils;
15
import org.gvsig.fmap.dal.store.jdbc2.spi.JDBCSQLBuilderBase;
16
import org.gvsig.fmap.geom.Geometry;
17
import org.gvsig.sqlite.dal.operations.SQLiteFetchFeatureTypeOperation;
18
import org.gvsig.sqlite.dal.operations.SQLiteFetchFeatureTypeOperation.SQLiteColumnInfo;
19
import org.sqlite.SQLiteException;
20

    
21
/**
22
 *
23
 * @author jjdelcerro
24
 */
25
public class GeopackageGeometryColumns {
26
    
27
    public static class GeopackageGeometryColumn extends SQLiteFetchFeatureTypeOperation.SQLiteColumnInfo {
28

    
29
        private String geometry_type_name;
30
        private int srs_id;
31
        private int z;
32
        private int m;
33

    
34
        /*friend*/ GeopackageGeometryColumn() {
35
            super();
36
        }
37

    
38
        public void set(
39
                String table_name,
40
                String column_column,
41
                String geometry_type_name,
42
                int srs_id,
43
                int z,
44
                int m
45
        ) {
46
            this.table_name = table_name;
47
            this.column_column = column_column;
48
            this.geometry_type_name = geometry_type_name;
49
            this.srs_id = srs_id;
50
            this.z = z;
51
            this.m = m;
52
        }
53

    
54
        /**
55
         * @return the geometry_type_name
56
         */
57
        public String getGeometry_type_name() {
58
            return geometry_type_name;
59
        }
60

    
61
        /**
62
         * @return the srs_id
63
         */
64
        public int getSrs_id() {
65
            return srs_id;
66
        }
67

    
68
        /**
69
         * @return the z
70
         */
71
        public int getZ() {
72
            return z;
73
        }
74

    
75
        /**
76
         * @return the m
77
         */
78
        public int getM() {
79
            return m;
80
        }
81

    
82
    }
83
    
84
    /*friend*/ static void load_gpkg_geometry_columns(Map<String,SQLiteColumnInfo> columns_info, JDBCConnection conn, String tableName, JDBCSQLBuilderBase sqlbuilder) {
85
        ExpressionBuilder expbuilder = sqlbuilder.expression();
86
        sqlbuilder.select().column().name("table_name");
87
        sqlbuilder.select().column().name("column_name");
88
        sqlbuilder.select().column().name("geometry_type_name");
89
        sqlbuilder.select().column().name("srs_id");
90
        sqlbuilder.select().column().name("z");
91
        sqlbuilder.select().column().name("m");
92
        sqlbuilder.select().where().set(
93
                expbuilder.eq(
94
                        expbuilder.column("table_name"),
95
                        expbuilder.constant(tableName)
96
                )
97
        );                
98
        sqlbuilder.select().from().table().name("gpkg_geometry_columns");
99
        Statement st = null;
100
        ResultSet rs = null;
101
        try {
102
            String sql = sqlbuilder.toString();
103
            st = conn.createStatement(sql);
104
            rs = JDBCUtils.executeQuery(st, sql);
105
            while( rs.next() ) {
106
                String columnname = rs.getString("column_name");
107
                GeopackageGeometryColumn geominfo = new GeopackageGeometryColumn();
108
                geominfo.copyfrom(columns_info.get(columnname));
109
                geominfo.set(
110
                    rs.getString("table_name"),
111
                    columnname,
112
                    rs.getString("geometry_type_name"),
113
                    rs.getInt("srs_id"),
114
                    rs.getInt("z"),
115
                    rs.getInt("m")
116
                );
117
                columns_info.put(columnname, geominfo);
118
            }
119
        } catch(SQLiteException ex) {
120
            if( !ex.getMessage().contains("no such table") ) {
121
                throw new RuntimeException("Can't load information from table gpkg_geometry_columns",ex);
122
            }
123
        } catch (Throwable ex) {
124
            throw new RuntimeException("Can't load information from table gpkg_geometry_columns",ex);
125
        } finally {
126
            JDBCUtils.closeQuietly(rs);
127
            JDBCUtils.closeQuietly(st);
128
        }
129
    }    
130
    
131
    public static String buildCreateTableSQLIfNotExists() {
132
        return "CREATE TABLE IF NOT EXISTS \"gpkg_geometry_columns\" ( "
133
                + "\"table_name\" TEXT NOT NULL, "
134
                + "\"column_name\" TEXT NOT NULL, "
135
                + "\"geometry_type_name\" TEXT NOT NULL, "
136
                + "\"srs_id\" INTEGER NOT NULL, "
137
                + "\"z\" TINYINT NOT NULL, "
138
                + "\"m\" TINYINT NOT NULL, "
139
                + "CONSTRAINT \"pk_geom_cols\" PRIMARY KEY(\"table_name\",\"column_name\"), "
140
                + "CONSTRAINT \"fk_gc_tn\" FOREIGN KEY(\"table_name\") REFERENCES \"gpkg_contents\"(\"table_name\"), "
141
                + "CONSTRAINT \"uk_gc_table_name\" UNIQUE(\"table_name\"), "
142
                + "CONSTRAINT \"fk_gc_srs\" FOREIGN KEY(\"srs_id\") REFERENCES \"gpkg_spatial_ref_sys\"(\"srs_id\") "
143
                + ")";
144
    }
145

    
146
    public static String buildInsertSQL(String tableName, String geomName, int geometryType, int geometrySubtype, Object geometrySRSId) {
147
        String geometryTypeName = "GEOMETRY";
148
        
149
        switch(geometryType){
150
            case Geometry.TYPES.POINT:
151
                geometryTypeName = "POINT";
152
                break;
153
            case Geometry.TYPES.ARC:
154
            case Geometry.TYPES.CIRCUMFERENCE:
155
            case Geometry.TYPES.ELLIPTICARC:
156
            case Geometry.TYPES.LINE:
157
            case Geometry.TYPES.PERIELLIPSE:
158
            case Geometry.TYPES.SPLINE:
159
                geometryTypeName = "LINESTRING";
160
                break;
161
            case Geometry.TYPES.CIRCLE:
162
            case Geometry.TYPES.ELLIPSE:
163
            case Geometry.TYPES.FILLEDSPLINE:
164
            case Geometry.TYPES.POLYGON:
165
                geometryTypeName = "POLYGON";
166
                break;
167

    
168
            case Geometry.TYPES.MULTILINE:
169
                geometryTypeName = "MULTILINESTRING";
170
                break;
171
                
172
            case Geometry.TYPES.MULTIPOINT:
173
                geometryTypeName = "MULTIPOINT";
174
                break;
175
                
176
            case Geometry.TYPES.MULTIPOLYGON:
177
                geometryTypeName = "MULTIPOLYGON";
178
                break;
179
        }
180
        String s = String.format(
181
                "INSERT INTO \"gpkg_geometry_columns\" (\"table_name\", \"column_name\", \"geometry_type_name\", \"srs_id\", \"z\", \"m\") VALUES ('%s', '%s', '%s', '%s', '%s', '%s')",
182
                tableName,
183
                geomName,
184
                geometryTypeName,
185
                geometrySRSId.toString(),
186
                (geometrySubtype==Geometry.SUBTYPES.GEOM3D || geometrySubtype==Geometry.SUBTYPES.GEOM3DM)?1:0,
187
                (geometrySubtype==Geometry.SUBTYPES.GEOM2DM || geometrySubtype==Geometry.SUBTYPES.GEOM3DM)?1:0
188
                );
189
        
190
        return s;
191
    }
192

    
193
    public static String buildDeleteSQL(String tableName, String geomName) {
194
        String s = String.format(
195
                "DELETE FROM \"gpkg_geometry_columns\" WHERE \"table_name\" = '%s' and \"column_name\" = '%s'",
196
                tableName,
197
                geomName
198
                );
199
        
200
        return s;
201
    }
202

    
203
    public static String buildDeleteSQL(String tableName) {
204
        String s = String.format(
205
                "DELETE FROM \"gpkg_geometry_columns\" WHERE \"table_name\" = '%s'",
206
                tableName
207
                );
208
        
209
        return s;
210
    }
211
}