Statistics
| Revision:

root / branches / v2_0_0_prep / libraries / libFMap_dataDB / src / org / gvsig / fmap / data / datastores / vectorial / db / jdbc / h2 / H2FeaturesWriter.java @ 21911

History | View | Annotate | Download (9.25 KB)

1
package org.gvsig.fmap.data.datastores.vectorial.db.jdbc.h2;
2

    
3
import java.sql.DatabaseMetaData;
4
import java.sql.PreparedStatement;
5
import java.sql.ResultSet;
6
import java.sql.SQLException;
7
import java.sql.Statement;
8
import java.util.Iterator;
9

    
10
import org.gvsig.fmap.data.DataStoreParameters;
11
import org.gvsig.fmap.data.ReadException;
12
import org.gvsig.fmap.data.WriteException;
13
import org.gvsig.fmap.data.datastores.vectorial.db.DBAttributeDescriptor;
14
import org.gvsig.fmap.data.datastores.vectorial.db.DBFeatureType;
15
import org.gvsig.fmap.data.datastores.vectorial.db.jdbc.JDBCFeature;
16
import org.gvsig.fmap.data.datastores.vectorial.db.jdbc.JDBCFeaturesWriter;
17
import org.gvsig.fmap.data.datastores.vectorial.db.jdbc.JDBCTypes;
18
import org.gvsig.fmap.data.vectorial.Feature;
19
import org.gvsig.fmap.data.vectorial.FeatureAttributeDescriptor;
20
import org.gvsig.fmap.data.vectorial.FeatureStore;
21
import org.gvsig.fmap.data.vectorial.FeatureType;
22
import org.gvsig.fmap.data.vectorial.InitializeWriterException;
23
import org.gvsig.fmap.data.vectorial.NewFeatureStoreParameters;
24
import org.gvsig.fmap.geom.Geometry;
25

    
26
class H2FeaturesWriter extends JDBCFeaturesWriter{
27
        DBFeatureType featureType;
28
        boolean bCreateTable=false;
29
        private String toEncode;
30
        H2StoreParameters parameters;
31

    
32
        private PreparedStatement insertSt;
33
        private PreparedStatement updateSt;
34

    
35
//        private static WKBWriter wkbWriter = new WKBWriter();
36
        private static int toWKBOperationIndex;
37

    
38
        H2FeaturesWriter(){
39
        }
40

    
41
        public void init(FeatureStore store) throws InitializeWriterException {
42
                super.init(store);
43
                H2Store h2Store = (H2Store)store;
44
                this.parameters=h2Store.getParametersH2();
45
                this.featureType = (DBFeatureType)this.store.getDefaultFeatureType();
46

    
47
        }
48

    
49
        public void preProcess() throws WriteException, ReadException {
50
                super.preProcess();
51

    
52
                if (bCreateTable) {
53
                        H2Explorer explorer = (H2Explorer)this.store.getExplorer();
54

    
55
                        DataStoreParameters params =this.store.getParameters();
56
                        explorer.remove(params,conex);
57

    
58
                        NewFeatureStoreParameters newParam = (NewFeatureStoreParameters)explorer.createNewDataStoreParameter();
59

    
60

    
61
                        newParam.setFeatureType(this.featureType);
62
                        explorer.add(newParam,conex);
63
                }
64
        }
65

    
66
        public void deleteFeature(Feature feature) throws WriteException {
67
                Statement st;
68
                String sqlDelete = getSqlDeleteFeature(featureType, (JDBCFeature)feature);
69
                System.out.println("sql = " + sqlDelete);
70
                try {
71
                        st = this.conex.createStatement();
72
                        st.execute(sqlDelete);
73
                } catch (SQLException e) {
74
                        throw new WriteException(this.store.getName(),e);
75
                }
76

    
77
        }
78

    
79
        public void insertFeature(Feature feature) throws WriteException {
80

    
81
                DBFeatureType ftype = (DBFeatureType)feature.getType();
82

    
83
                try {
84
                        PreparedStatement ps=this.getInsertFeatureStatement(ftype);
85
                        Iterator it = ftype.iterator();
86

    
87
                        int index= 1;
88
                        while (it.hasNext()){
89
                                DBAttributeDescriptor fad=(DBAttributeDescriptor)it.next();
90
                                if (fad.isReadOnly())
91
                                        continue;
92

    
93

    
94
                                loadValueInPreparedStatement(ps, index, fad, feature);
95
                                index++;
96
                        }
97
//                        ps.setObject(index, feature.get(ftype.getFieldIdIndex()));
98

    
99
                        ps.execute();
100

    
101
                } catch (SQLException e) {
102
                        throw new WriteException(this.store.getName(),e);
103
                }
104
        }
105

    
106
        private PreparedStatement getInsertFeatureStatement(DBFeatureType ftype) throws SQLException {
107
                if (this.insertSt == null){
108
                        StringBuffer fields = new StringBuffer();
109
                        StringBuffer values = new StringBuffer();
110
                        StringBuffer sql = new StringBuffer();
111

    
112
                        Iterator iter = ftype.iterator();
113
                        DBAttributeDescriptor fad;
114
                        while (iter.hasNext()){
115
                                fad=(DBAttributeDescriptor)iter.next();
116
                                String name = fad.getName();
117
                                if (fad.isReadOnly())
118
                                        continue;
119
                                fields.append(name+",");
120
                                values.append("?,");
121

    
122
                        }
123
                        sql.append("INSERT INTO "+ftype.getTableID()+" (");
124
                        sql.append(fields.substring(0, fields.length()-1));
125
                        sql.append(") VALUES (");
126
                        sql.append(values.substring(0, values.length()-1));
127
                        sql.append(")");
128

    
129
                        this.insertSt= this.conex.prepareStatement(sql.toString());
130
                        System.out.println(sql.toString());
131
                } else{
132
                        this.insertSt.clearParameters();
133
                }
134
                return this.insertSt;
135

    
136
        }
137

    
138
        public void updateFeatureType(FeatureType featureType) {
139
                this.featureType=(DBFeatureType)featureType;
140
        }
141

    
142
        /**
143
         * @param createTable
144
         *            The bCreateTable to set.
145
         */
146
        public void setCreateTable(boolean createTable) {
147
                bCreateTable = createTable;
148
        }
149

    
150
        boolean dropTableIfExist() throws SQLException{
151
                if (!this.existTable(parameters.getSchema(), parameters.getTableName())){
152
                        return false;
153
                }
154
                Statement st = conex.createStatement();
155
                st.execute("DROP TABLE " + parameters.tableID() + ";");
156
                st.close();
157
                return false;
158
        }
159
        private boolean existTable(String schema, String tableName) throws SQLException{
160
                boolean exists =false;
161
                DatabaseMetaData metadata = conex.getMetaData();
162

    
163
                ResultSet rs = metadata.getTables(null, schema, tableName, null);
164

    
165
                exists = !rs.isAfterLast();
166
                rs.close();
167

    
168
                return exists;
169
        }
170

    
171
        public void updateFeature(Feature feature) throws WriteException, ReadException {
172

    
173
                DBFeatureType ftype = (DBFeatureType)feature.getType();
174

    
175
                try {
176
                        PreparedStatement ps=this.getUpdateFeatureStatement(ftype);
177
                        Iterator it = ftype.iterator();
178

    
179
                        int index= 1;
180
                        while (it.hasNext()){
181
                                DBAttributeDescriptor fad=(DBAttributeDescriptor)it.next();
182
                                if (fad.isPrimaryKey())
183
                                        continue;
184
                                loadValueInPreparedStatement(ps, index, fad, feature);
185
                                index++;
186
                        }
187

    
188
                        loadPkInPreparedStatement(ps, index, ftype, feature);
189

    
190
                        ps.execute();
191

    
192
                } catch (SQLException e) {
193
                        throw new WriteException(this.store.getName(),e);
194
                }
195
        }
196

    
197
        public void deleteAttribute(FeatureAttributeDescriptor attribute) throws WriteException {
198
                try {
199
                        Statement st = conex.createStatement();
200
                        String sql = "ALTER TABLE " + parameters.tableID() + " DROP COLUMN "
201
                                + attribute.getName() + ";";
202
                        st.execute(sql);
203
                } catch (SQLException e) {
204
                        throw new WriteException(this.store.getName(),e);
205
                }
206
        }
207

    
208
        public void updateAttribute(FeatureAttributeDescriptor oldAttribute, FeatureAttributeDescriptor attribute) throws WriteException, ReadException {
209
                try {
210
                        Statement st = conex.createStatement();
211
                        String sql = "ALTER TABLE " + parameters.tableID() + " RENAME COLUMN "
212
                        + oldAttribute.getName() + " TO " + attribute.getName() + ";";
213
                        st.execute(sql);
214
                } catch (SQLException e) {
215
                        throw new WriteException(this.store.getName(),e);
216
                }
217
        }
218

    
219
        public void insertAttribute(FeatureAttributeDescriptor attribute) throws WriteException {
220
                try {
221
                        Statement st = conex.createStatement();
222

    
223
                        String sql = "ALTER TABLE "
224
                                + parameters.tableID()
225
                                + " ADD COLUMN "
226
                                + attribute.getName()
227
                                + " "
228
                                + JDBCTypes.fieldTypeToString(attribute.getDataType())
229
                                + " "
230
                                + "DEFAULT " + attribute.getDefaultValue()
231
                                + ";";
232
                        st.execute(sql);
233
                } catch (SQLException e) {
234
                        throw new WriteException(this.store.getName(),e);
235
                }
236
        }
237

    
238

    
239
        public boolean canWriteGeometry(int gvSIGgeometryType) {
240
                switch (gvSIGgeometryType) {
241
                case Geometry.TYPES.POINT:
242
                        return true;
243
                case Geometry.TYPES.CURVE:
244
                        return true;
245
                case Geometry.TYPES.SURFACE:
246
                        return true;
247
                case Geometry.TYPES.ARC:
248
                        return false;
249
                case Geometry.TYPES.ELLIPSE:
250
                        return false;
251
                case Geometry.TYPES.MULTIPOINT:
252
                        return true;
253
                case Geometry.TYPES.TEXT:
254
                        return false;
255
                }
256
                return false;
257
        }
258

    
259

    
260
        private PreparedStatement getUpdateFeatureStatement(DBFeatureType dbFeatureType) throws SQLException{
261
                if (this.updateSt == null){
262
                        StringBuffer sqlBuf = new StringBuffer("UPDATE "
263
                                        + this.parameters.tableID() + " SET");
264
                        String sql = null;
265

    
266
                        Iterator iter = dbFeatureType.iterator();
267
                        while (iter.hasNext()){
268
                                FeatureAttributeDescriptor fad=(FeatureAttributeDescriptor)iter.next();
269
                                String name = fad.getName();
270
                                // El campo gid no lo actualizamos.
271
                                if (fad.isPrimaryKey())
272
                                        continue;
273
                                sqlBuf.append(" " + name + " = ? ,");
274

    
275
                        }
276
                        sqlBuf.deleteCharAt(sqlBuf.lastIndexOf(","));
277
                        sqlBuf.append(" WHERE ");
278
                        sqlBuf.append(getFliterForIDForPStatement(dbFeatureType));
279
                        sql = sqlBuf.toString();
280

    
281

    
282
                        this.updateSt= this.conex.prepareStatement(sql);
283
                } else{
284
                        this.updateSt.clearParameters();
285
                }
286
                return this.updateSt;
287

    
288
        }
289

    
290
        public String getSqlDeleteFeature(DBFeatureType dbFeatureType, JDBCFeature feature) {
291
                StringBuffer sqlBuf = new StringBuffer("DELETE FROM "
292
                                + this.parameters.tableID() + " WHERE ");
293
                String sql = null;
294
                sqlBuf.append(((JDBCFeature)feature).getFilterForID());
295
                sql = sqlBuf.toString();
296

    
297
                return sql;
298
        }
299

    
300
        protected void loadPkInPreparedStatement(PreparedStatement ps,int paramIndex,DBFeatureType fType,Feature feature) throws java.sql.SQLException, WriteException{
301
                if (fType.getFieldsId().length != 1)
302
                        throw new UnsupportedOperationException("ID fields > 1");
303
                String id =fType.getFieldsId()[0];
304
                loadValueInPreparedStatement(ps, paramIndex, (DBAttributeDescriptor)fType.get(id), feature);
305
        }
306

    
307
        protected static String getFliterForIDForPStatement(DBFeatureType fType) {
308
                if (fType.getFieldsId().length != 1)
309
                        throw new UnsupportedOperationException("ID fields > 1");
310
                String id =fType.getFieldsId()[0];
311
                return id + " = ?";
312
        }
313
}