Statistics
| Revision:

svn-gvsig-desktop / trunk / extensions / extJDBC / src / com / iver / cit / gvsig / fmap / drivers / jdbc / postgis / PostGISWriter.java @ 4740

History | View | Annotate | Download (5.17 KB)

1
package com.iver.cit.gvsig.fmap.drivers.jdbc.postgis;
2

    
3
import java.io.IOException;
4
import java.sql.Connection;
5
import java.sql.SQLException;
6
import java.sql.Statement;
7
import java.sql.Types;
8

    
9
import com.iver.cit.gvsig.fmap.DriverException;
10
import com.iver.cit.gvsig.fmap.core.FShape;
11
import com.iver.cit.gvsig.fmap.core.IFeature;
12
import com.iver.cit.gvsig.fmap.drivers.DBLayerDefinition;
13
import com.iver.cit.gvsig.fmap.drivers.LayerDefinition;
14
import com.iver.cit.gvsig.fmap.edition.EditionException;
15
import com.iver.cit.gvsig.fmap.edition.IRowEdited;
16
import com.iver.cit.gvsig.fmap.edition.ISpatialWriter;
17
import com.iver.cit.gvsig.fmap.edition.writers.AbstractWriter;
18
import com.iver.cit.gvsig.fmap.layers.FLayer;
19
import com.iver.cit.gvsig.jdbc_spatial.util.PostGIS;
20

    
21
public class PostGISWriter extends AbstractWriter implements ISpatialWriter {
22

    
23
        private int numRows;
24

    
25
        private DBLayerDefinition lyrDef;
26

    
27
        private Connection conex;
28

    
29
        private Statement st;
30

    
31
        private boolean bCreateTable;
32

    
33
        private boolean bWriteAll;
34

    
35
        /**
36
         * Useful to create a layer from scratch Call setFile before using this
37
         * function
38
         * 
39
         * @param lyrDef
40
         * @throws IOException
41
         * @throws DriverException
42
         */
43
        public void initialize(LayerDefinition lyrD) throws EditionException {
44
                this.lyrDef = (DBLayerDefinition) lyrD;
45
                conex = lyrDef.getConnection();
46

    
47
                try {
48
                        st = conex.createStatement();
49

    
50
                        if (bCreateTable) {
51
                                try {
52
                                        st.execute("DROP TABLE " + lyrDef.getTableName() + ";");
53
                                } catch (SQLException e1) {
54
                                        // Si no existe la tabla, no hay que borrarla.
55
                                }
56

    
57
                                String sqlCreate = PostGIS.getSqlCreateSpatialTable(lyrDef,
58
                                                lyrDef.getFieldsDesc());
59
                                System.out.println("sqlCreate =" + sqlCreate);
60
                                st.execute(sqlCreate);
61

    
62
                                String sqlAlter = PostGIS.getSqlAlterTable(lyrDef);
63
                                System.out.println("sqlAlter =" + sqlAlter);
64
                                st.execute(sqlAlter);
65
                                // CREATE TABLE PARKS ( PARK_ID int4, PARK_NAME varchar(128),
66
                                // PARK_DATE date, PARK_TYPE varchar(2) );
67
                                // SELECT AddGeometryColumn('parks_db', 'parks', 'park_geom',
68
                                // 128,
69
                                // 'MULTIPOLYGON', 2 );
70

    
71
                                /*
72
                                 * BEGIN; INSERT INTO ROADS_GEOM (ID,GEOM,NAME ) VALUES
73
                                 * (1,GeometryFromText('LINESTRING(191232 243118,191108
74
                                 * 243242)',-1),'Jeff Rd'); INSERT INTO ROADS_GEOM (ID,GEOM,NAME )
75
                                 * VALUES (2,GeometryFromText('LINESTRING(189141 244158,189265
76
                                 * 244817)',-1),'Geordie Rd'); COMMIT;
77
                                 */
78
                        }
79
                        conex.setAutoCommit(false);
80

    
81
                } catch (SQLException e) {
82
                        e.printStackTrace();
83
                        throw new EditionException(e);
84
                }
85

    
86
        }
87

    
88
        public void preProcess() throws EditionException {
89
                numRows = 0;
90

    
91
        }
92

    
93
        public void process(IRowEdited row) throws EditionException {
94
                IFeature feat = (IFeature) row.getLinkedRow();
95
                String sqlInsert;
96
                try {
97
                        // System.out.println("Escribiendo numReg=" + numReg + " con
98
                        // STATUS=" + row.getStatus());
99
                        switch (row.getStatus()) {
100
                        case IRowEdited.STATUS_ADDED:
101
                                sqlInsert = PostGIS.getSqlInsertFeature(lyrDef, feat);
102
                                st.execute(sqlInsert);
103

    
104
                                break;
105
                        case IRowEdited.STATUS_MODIFIED:
106
                                if (bWriteAll) {
107
                                        sqlInsert = PostGIS.getSqlInsertFeature(lyrDef, feat);
108
                                        st.execute(sqlInsert);
109
                                } else {
110
                                        String sqlModify = PostGIS
111
                                                        .getSqlModifyFeature(lyrDef, feat);
112
                                        st.execute(sqlModify);
113
                                }
114
                                break;
115
                        case IRowEdited.STATUS_ORIGINAL:
116
                                if (bWriteAll) {
117
                                        sqlInsert = PostGIS.getSqlInsertFeature(lyrDef, feat);
118
                                        st.execute(sqlInsert);
119
                                }
120
                                break;
121
                        case IRowEdited.STATUS_DELETED:
122
                                String sqlDelete = PostGIS.getSqlDeleteFeature(lyrDef, feat);
123
                                st.execute(sqlDelete);
124

    
125
                                break;
126
                        }
127

    
128
                        numRows++;
129
                } catch (SQLException e) {
130
                        e.printStackTrace();
131
                        throw new EditionException(e);
132
                }
133

    
134
        }
135

    
136
        public void postProcess() throws EditionException {
137
                try {
138
                        conex.setAutoCommit(true);
139
                } catch (SQLException e) {
140
                        e.printStackTrace();
141
                        throw new EditionException(e);
142
                }
143
        }
144

    
145
        public String getName() {
146
                return "PostGIS Writer";
147
        }
148

    
149
        public boolean canWriteGeometry(int gvSIGgeometryType) {
150
                switch (gvSIGgeometryType) {
151
                case FShape.POINT:
152
                        return true;
153
                case FShape.LINE:
154
                        return true;
155
                case FShape.POLYGON:
156
                        return true;
157
                case FShape.ARC:
158
                        return false;
159
                case FShape.ELLIPSE:
160
                        return false;
161
                case FShape.MULTIPOINT:
162
                        return true;
163
                case FShape.TEXT:
164
                        return false;
165
                }
166
                return false;
167
        }
168

    
169
        public boolean canWriteAttribute(int sqlType) {
170
                switch (sqlType) {
171
                case Types.DOUBLE:
172
                case Types.FLOAT:
173
                case Types.INTEGER:
174
                case Types.BIGINT:
175
                        return true;
176
                case Types.DATE:
177
                        return true;
178
                case Types.BIT:
179
                case Types.BOOLEAN:
180
                        return true;
181
                case Types.VARCHAR:
182
                case Types.CHAR:
183
                case Types.LONGVARCHAR:
184
                        return true; 
185

    
186
                }
187

    
188
                return false;
189
        }
190

    
191
        /**
192
         * @return Returns the bCreateTable.
193
         */
194
        public boolean isCreateTable() {
195
                return bCreateTable;
196
        }
197

    
198
        /**
199
         * @param createTable
200
         *            The bCreateTable to set.
201
         */
202
        public void setCreateTable(boolean createTable) {
203
                bCreateTable = createTable;
204
        }
205

    
206
        /**
207
         * @return Returns the bWriteAll.
208
         */
209
        public boolean isWriteAll() {
210
                return bWriteAll;
211
        }
212

    
213
        /**
214
         * @param writeAll
215
         *            The bWriteAll to set.
216
         */
217
        public void setWriteAll(boolean writeAll) {
218
                bWriteAll = writeAll;
219
        }
220

    
221
        public void initialize(FLayer layer) throws EditionException {
222
                
223
                
224

    
225
        }
226

    
227
}