Statistics
| Revision:

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

History | View | Annotate | Download (6.25 KB)

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

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

    
9
import com.iver.cit.gvsig.fmap.core.FShape;
10
import com.iver.cit.gvsig.fmap.core.IFeature;
11
import com.iver.cit.gvsig.fmap.drivers.DBLayerDefinition;
12
import com.iver.cit.gvsig.fmap.drivers.ILayerDefinition;
13
import com.iver.cit.gvsig.fmap.edition.EditionException;
14
import com.iver.cit.gvsig.fmap.edition.IRowEdited;
15
import com.iver.cit.gvsig.fmap.edition.ISpatialWriter;
16
import com.iver.cit.gvsig.fmap.edition.writers.AbstractWriter;
17
import com.iver.cit.gvsig.fmap.layers.FLayer;
18

    
19
public class PostGISWriter extends AbstractWriter implements ISpatialWriter {
20

    
21
        private int numRows;
22

    
23
        private DBLayerDefinition lyrDef;
24

    
25
        private Connection conex;
26

    
27
        private Statement st;
28

    
29
        private boolean bCreateTable;
30

    
31
        private boolean bWriteAll;
32
        private double flatness;
33

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

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

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

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

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

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

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

    
85
        }
86

    
87
        public void preProcess() throws EditionException {
88
                numRows = 0;
89
        // ATENTION: We will transform (in PostGIS class; doubleQuote())
90
        // to UTF-8 strings. Then, we tell the PostgreSQL server
91
        // that we will use UTF-8, and it can translate
92
        // to its charset
93
        // Note: we have to translate to UTF-8 because
94
        // the server cannot manage UTF-16
95
        ResultSet rsAux;
96
                try {
97
                        rsAux = st.executeQuery("SHOW server_encoding;");
98
                rsAux.next();
99
                String serverEncoding = rsAux.getString(1);
100
                System.out.println("Server encoding = " + serverEncoding);
101
                // st.execute("SET CLIENT_ENCODING TO 'UNICODE';");
102
                // Intentamos convertir nuestras cadenas a ese encode.
103
                PostGIS.toEncode = serverEncoding;
104
                } catch (SQLException e) {
105
                        // TODO Auto-generated catch block
106
                        e.printStackTrace();
107
                }
108

    
109
        }
110

    
111
        public void process(IRowEdited row) throws EditionException {
112

    
113
                String sqlInsert;
114
                try {
115
                        // System.out.println("Escribiendo numReg=" + numReg + " con
116
                        // STATUS=" + row.getStatus());
117
                        switch (row.getStatus()) {
118
                        case IRowEdited.STATUS_ADDED:
119
                                IFeature feat = (IFeature) row.getLinkedRow();
120
                                sqlInsert = PostGIS.getSqlInsertFeature(lyrDef, feat);
121
                                System.out.println("sql = " + sqlInsert);
122
                                st.execute(sqlInsert);
123

    
124
                                break;
125
                        case IRowEdited.STATUS_MODIFIED:
126
                                IFeature featM = (IFeature) row.getLinkedRow();
127
                                if (bWriteAll) {
128
                                        sqlInsert = PostGIS.getSqlInsertFeature(lyrDef, featM);
129
                                        System.out.println("sql = " + sqlInsert);
130
                                        st.execute(sqlInsert);
131
                                } else {
132
                                        String sqlModify = PostGIS
133
                                                        .getSqlModifyFeature(lyrDef, featM);
134
                                        System.out.println("sql = " + sqlModify);
135
                                        st.execute(sqlModify);
136
                                }
137
                                break;
138
                        case IRowEdited.STATUS_ORIGINAL:
139
                                IFeature featO = (IFeature) row.getLinkedRow();
140
                                if (bWriteAll) {
141
                                        sqlInsert = PostGIS.getSqlInsertFeature(lyrDef, featO);
142
                                        st.execute(sqlInsert);
143
                                }
144
                                break;
145
                        case IRowEdited.STATUS_DELETED:
146
                                String sqlDelete = PostGIS.getSqlDeleteFeature(lyrDef, row);
147
                                System.out.println("sql = " + sqlDelete);
148
                                st.execute(sqlDelete);
149

    
150
                                break;
151
                        }
152

    
153
                        numRows++;
154
                } catch (SQLException e) {
155
                        e.printStackTrace();
156
                        throw new EditionException(e);
157
                }
158

    
159
        }
160

    
161
        public void postProcess() throws EditionException {
162
                try {
163
                        conex.setAutoCommit(true);
164
                } catch (SQLException e) {
165
                        e.printStackTrace();
166
                        throw new EditionException(e);
167
                }
168
        }
169

    
170
        public String getName() {
171
                return "PostGIS Writer";
172
        }
173

    
174
        public boolean canWriteGeometry(int gvSIGgeometryType) {
175
                switch (gvSIGgeometryType) {
176
                case FShape.POINT:
177
                        return true;
178
                case FShape.LINE:
179
                        return true;
180
                case FShape.POLYGON:
181
                        return true;
182
                case FShape.ARC:
183
                        return false;
184
                case FShape.ELLIPSE:
185
                        return false;
186
                case FShape.MULTIPOINT:
187
                        return true;
188
                case FShape.TEXT:
189
                        return false;
190
                }
191
                return false;
192
        }
193

    
194
        public boolean canWriteAttribute(int sqlType) {
195
                switch (sqlType) {
196
                case Types.DOUBLE:
197
                case Types.FLOAT:
198
                case Types.INTEGER:
199
                case Types.BIGINT:
200
                        return true;
201
                case Types.DATE:
202
                        return true;
203
                case Types.BIT:
204
                case Types.BOOLEAN:
205
                        return true;
206
                case Types.VARCHAR:
207
                case Types.CHAR:
208
                case Types.LONGVARCHAR:
209
                        return true; 
210

    
211
                }
212

    
213
                return false;
214
        }
215

    
216
        /**
217
         * @return Returns the bCreateTable.
218
         */
219
        public boolean isCreateTable() {
220
                return bCreateTable;
221
        }
222

    
223
        /**
224
         * @param createTable
225
         *            The bCreateTable to set.
226
         */
227
        public void setCreateTable(boolean createTable) {
228
                bCreateTable = createTable;
229
        }
230

    
231
        /**
232
         * @return Returns the bWriteAll.
233
         */
234
        public boolean isWriteAll() {
235
                return bWriteAll;
236
        }
237

    
238
        /**
239
         * @param writeAll
240
         *            The bWriteAll to set.
241
         */
242
        public void setWriteAll(boolean writeAll) {
243
                bWriteAll = writeAll;
244
        }
245

    
246
        public void initialize(FLayer layer) throws EditionException {
247
                
248
                
249

    
250
        }
251

    
252
        public void setFlatness(double flatness) {
253
                this.flatness = flatness;
254
        }
255

    
256
}