Statistics
| Revision:

root / trunk / libraries / libFMap_dataDB / src / org / gvsig / data / datastores / vectorial / db / jdbc / h2 / H2FeaturesWriter.java @ 20920

History | View | Annotate | Download (9.75 KB)

1
package org.gvsig.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.data.IDataStoreParameters;
11
import org.gvsig.data.datastores.vectorial.db.DBAttributeDescriptor;
12
import org.gvsig.data.datastores.vectorial.db.DBFeatureType;
13
import org.gvsig.data.datastores.vectorial.db.jdbc.JDBCFeature;
14
import org.gvsig.data.datastores.vectorial.db.jdbc.JDBCFeaturesWriter;
15
import org.gvsig.data.datastores.vectorial.db.jdbc.JDBCTypes;
16
import org.gvsig.data.exception.InitializeWriterException;
17
import org.gvsig.data.exception.ReadException;
18
import org.gvsig.data.exception.WriteException;
19
import org.gvsig.data.vectorial.IFeature;
20
import org.gvsig.data.vectorial.IFeatureAttributeDescriptor;
21
import org.gvsig.data.vectorial.IFeatureStore;
22
import org.gvsig.data.vectorial.IFeatureType;
23
import org.gvsig.data.vectorial.INewFeatureStoreParameters;
24
import org.gvsig.fmap.geom.Geometry;
25

    
26
import com.vividsolutions.jts.io.WKBWriter;
27

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

    
34
        private PreparedStatement insertSt;
35
        private PreparedStatement updateSt;
36

    
37
        private static WKBWriter wkbWriter = new WKBWriter();
38

    
39
        H2FeaturesWriter(){
40

    
41
        }
42

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

    
49
        }
50

    
51
        public void preProcess() throws WriteException, ReadException {
52
                super.preProcess();
53

    
54
                if (bCreateTable) {
55
                        H2Explorer explorer = (H2Explorer)this.store.getExplorer();
56

    
57
                        IDataStoreParameters params =this.store.getParameters();
58
                        explorer.remove(params,conex);
59

    
60
                        INewFeatureStoreParameters newParam = (INewFeatureStoreParameters)explorer.createNewDataStoreParameter();
61

    
62

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

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

    
79
        }
80

    
81
        public void insertFeature(IFeature feature) throws WriteException {
82

    
83
                DBFeatureType ftype = (DBFeatureType)feature.getType();
84

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

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

    
95

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

    
101
                        ps.execute();
102

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

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

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

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

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

    
138
        }
139

    
140
        public void updateFeatureType(IFeatureType featureType) {
141
                this.featureType=(DBFeatureType)featureType;
142
        }
143

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

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

    
165
                ResultSet rs = metadata.getTables(null, schema, tableName, null);
166

    
167
                exists = !rs.isAfterLast();
168
                rs.close();
169

    
170
                return exists;
171
        }
172

    
173
        public void updateFeature(IFeature feature) throws WriteException, ReadException {
174

    
175
                DBFeatureType ftype = (DBFeatureType)feature.getType();
176

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

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

    
190
                        loadPkInPreparedStatement(ps, index, ftype, feature);
191

    
192
                        ps.execute();
193

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

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

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

    
221
        public void insertAttribute(IFeatureAttributeDescriptor attribute) throws WriteException {
222
                try {
223
                        Statement st = conex.createStatement();
224

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

    
240

    
241
//        public boolean canWriteGeometry(int gvSIGgeometryType) {
242
//                switch (gvSIGgeometryType) {
243
//                case FShape.POINT:
244
//                        return true;
245
//                case FShape.LINE:
246
//                        return true;
247
//                case FShape.POLYGON:
248
//                        return true;
249
//                case FShape.ARC:
250
//                        return false;
251
//                case FShape.ELLIPSE:
252
//                        return false;
253
//                case FShape.MULTIPOINT:
254
//                        return true;
255
//                case FShape.TEXT:
256
//                        return false;
257
//                }
258
//                return false;
259
//        }
260

    
261

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

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

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

    
283

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

    
290
        }
291

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

    
299
                return sql;
300
        }
301

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

    
309
        protected void loadValueInPreparedStatement(PreparedStatement ps,int paramIndex,DBAttributeDescriptor attr,IFeature feature) throws java.sql.SQLException{
310
                Object value = feature.get(attr.ordinal());
311
                if (value == null){
312
                        ps.setNull(paramIndex, attr.getSqlType());
313
                        return;
314
                }
315

    
316
                if (attr.getDataType() == IFeatureAttributeDescriptor.TYPE_GEOMETRY){
317
                        Geometry geom =(Geometry)feature.get(attr.ordinal());
318
                        ps.setBytes(
319
                                paramIndex,        wkbWriter.write(geom.toJTSGeometry())
320
                        );
321
                        return;
322
                }
323
                ps.setObject(paramIndex, feature.get(attr.ordinal()));
324
        }
325

    
326
        protected static String getFliterForIDForPStatement(DBFeatureType fType) {
327
                if (fType.getFieldsId().length != 1)
328
                        throw new UnsupportedOperationException("ID fields > 1");
329
                String id =fType.getFieldsId()[0];
330
                return id + " = ?";
331
        }
332
}