svn-gvsig-desktop / trunk / extensions / extJDBC / src / com / iver / cit / gvsig / fmap / drivers / jdbc / postgis / PostGisDriver.java @ 5595
History | View | Annotate | Download (21.7 KB)
1 | 2269 | fjp | /*
|
---|---|---|---|
2 | * Created on 04-mar-2005
|
||
3 | *
|
||
4 | * gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
|
||
5 | 5522 | caballero | *
|
6 | 2269 | fjp | * Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
|
7 | 5522 | caballero | *
|
8 | 2269 | fjp | * This program is free software; you can redistribute it and/or
|
9 | * modify it under the terms of the GNU General Public License
|
||
10 | * as published by the Free Software Foundation; either version 2
|
||
11 | * of the License, or (at your option) any later version.
|
||
12 | 5522 | caballero | *
|
13 | 2269 | fjp | * This program is distributed in the hope that it will be useful,
|
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
16 | * GNU General Public License for more details.
|
||
17 | 5522 | caballero | *
|
18 | 2269 | fjp | * You should have received a copy of the GNU General Public License
|
19 | * along with this program; if not, write to the Free Software
|
||
20 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||
21 | 5522 | caballero | *
|
22 | 2269 | fjp | * For more information, contact:
|
23 | *
|
||
24 | * Generalitat Valenciana
|
||
25 | * Conselleria d'Infraestructures i Transport
|
||
26 | * Av. Blasco Ib??ez, 50
|
||
27 | * 46010 VALENCIA
|
||
28 | * SPAIN
|
||
29 | *
|
||
30 | * +34 963862235
|
||
31 | * gvsig@gva.es
|
||
32 | * www.gvsig.gva.es
|
||
33 | 5522 | caballero | *
|
34 | 2269 | fjp | * or
|
35 | 5522 | caballero | *
|
36 | 2269 | fjp | * IVER T.I. S.A
|
37 | * Salamanca 50
|
||
38 | * 46005 Valencia
|
||
39 | * Spain
|
||
40 | 5522 | caballero | *
|
41 | 2269 | fjp | * +34 963163400
|
42 | * dac@iver.es
|
||
43 | */
|
||
44 | package com.iver.cit.gvsig.fmap.drivers.jdbc.postgis; |
||
45 | |||
46 | import java.awt.geom.Rectangle2D; |
||
47 | 3303 | fjp | import java.math.BigDecimal; |
48 | 2269 | fjp | import java.nio.ByteBuffer; |
49 | import java.sql.Connection; |
||
50 | import java.sql.ResultSet; |
||
51 | import java.sql.SQLException; |
||
52 | import java.sql.Statement; |
||
53 | import java.sql.Types; |
||
54 | 3109 | fjp | import java.util.Hashtable; |
55 | 4740 | fjp | import java.util.Properties; |
56 | 2269 | fjp | |
57 | import org.apache.log4j.Logger; |
||
58 | import org.postgis.PGbox2d; |
||
59 | import org.postgis.PGbox3d; |
||
60 | |||
61 | import com.hardcode.gdbms.engine.data.edition.DataWare; |
||
62 | import com.hardcode.gdbms.engine.values.Value; |
||
63 | import com.hardcode.gdbms.engine.values.ValueFactory; |
||
64 | 3095 | fjp | import com.iver.andami.messages.NotificationManager; |
65 | 2269 | fjp | import com.iver.cit.gvsig.fmap.DriverException; |
66 | 3095 | fjp | import com.iver.cit.gvsig.fmap.core.ICanReproject; |
67 | 2269 | fjp | import com.iver.cit.gvsig.fmap.core.IGeometry; |
68 | 3251 | fjp | import com.iver.cit.gvsig.fmap.drivers.DBLayerDefinition; |
69 | 2269 | fjp | import com.iver.cit.gvsig.fmap.drivers.DefaultDBDriver; |
70 | import com.iver.cit.gvsig.fmap.drivers.DriverAttributes; |
||
71 | import com.iver.cit.gvsig.fmap.drivers.IFeatureIterator; |
||
72 | 5558 | fjp | import com.iver.cit.gvsig.fmap.drivers.ITableDefinition; |
73 | 5007 | fjp | import com.iver.cit.gvsig.fmap.drivers.jdbc.WKBParser2; |
74 | 4740 | fjp | import com.iver.cit.gvsig.fmap.edition.EditionException; |
75 | import com.iver.cit.gvsig.fmap.edition.IRowEdited; |
||
76 | import com.iver.cit.gvsig.fmap.edition.ISpatialWriter; |
||
77 | 5595 | fjp | import com.iver.cit.gvsig.fmap.edition.IWriteable; |
78 | import com.iver.cit.gvsig.fmap.edition.IWriter; |
||
79 | 4740 | fjp | import com.iver.cit.gvsig.fmap.layers.FLayer; |
80 | 2269 | fjp | |
81 | /**
|
||
82 | * @author FJP
|
||
83 | 5522 | caballero | *
|
84 | 4171 | fjp | * TODO To change the template for this generated type comment go to Window -
|
85 | * Preferences - Java - Code Generation - Code and Comments
|
||
86 | 2269 | fjp | */
|
87 | 5595 | fjp | public class PostGisDriver extends DefaultDBDriver implements ICanReproject, IWriteable { |
88 | 4171 | fjp | private static Logger logger = Logger.getLogger(PostGisDriver.class |
89 | .getName()); |
||
90 | 5522 | caballero | |
91 | 4171 | fjp | private static int FETCH_SIZE = 5000; |
92 | 5522 | caballero | |
93 | 4748 | fjp | private PostGISWriter writer = new PostGISWriter(); |
94 | 4171 | fjp | |
95 | 5007 | fjp | private WKBParser2 parser = new WKBParser2(); |
96 | 4171 | fjp | |
97 | private int fetch_min = -1; |
||
98 | |||
99 | private int fetch_max = -1; |
||
100 | |||
101 | private String sqlOrig; |
||
102 | |||
103 | /**
|
||
104 | * Used by setAbsolutePosition
|
||
105 | */
|
||
106 | private String sqlTotal; |
||
107 | |||
108 | private String strEPSG = null; |
||
109 | |||
110 | private String originalEPSG = null; |
||
111 | |||
112 | private Rectangle2D fullExtent = null; |
||
113 | |||
114 | private String strAux; |
||
115 | |||
116 | private String completeWhere; |
||
117 | |||
118 | private String provCursorName = null; |
||
119 | 5522 | caballero | |
120 | 4171 | fjp | int numProvCursors = 0; |
121 | |||
122 | static {
|
||
123 | try {
|
||
124 | 2269 | fjp | Class.forName("org.postgresql.Driver"); |
125 | } catch (ClassNotFoundException e) { |
||
126 | throw new RuntimeException(e); |
||
127 | } |
||
128 | 4171 | fjp | } |
129 | 2269 | fjp | |
130 | /**
|
||
131 | 5522 | caballero | *
|
132 | 4171 | fjp | */
|
133 | public PostGisDriver() {
|
||
134 | 5522 | caballero | |
135 | 4171 | fjp | } |
136 | |||
137 | /*
|
||
138 | * (non-Javadoc)
|
||
139 | 5522 | caballero | *
|
140 | 4171 | fjp | * @see com.iver.cit.gvsig.fmap.drivers.VectorialDriver#getDriverAttributes()
|
141 | */
|
||
142 | public DriverAttributes getDriverAttributes() {
|
||
143 | return null; |
||
144 | } |
||
145 | |||
146 | /*
|
||
147 | * (non-Javadoc)
|
||
148 | 5522 | caballero | *
|
149 | 4171 | fjp | * @see com.hardcode.driverManager.Driver#getName()
|
150 | */
|
||
151 | public String getName() { |
||
152 | return "PostGIS JDBC Driver"; |
||
153 | } |
||
154 | |||
155 | /**
|
||
156 | 2269 | fjp | * @see com.iver.cit.gvsig.fmap.layers.ReadableVectorial#getShape(int)
|
157 | */
|
||
158 | public IGeometry getShape(int index) { |
||
159 | 4171 | fjp | IGeometry geom = null;
|
160 | boolean resul;
|
||
161 | try {
|
||
162 | setAbsolutePosition(index); |
||
163 | // strAux = rs.getString(1);
|
||
164 | // geom = parser.read(strAux);
|
||
165 | if (rs != null) { |
||
166 | byte[] data = rs.getBytes(1); |
||
167 | geom = parser.parse(data); |
||
168 | } |
||
169 | } catch (SQLException e) { |
||
170 | e.printStackTrace(); |
||
171 | } |
||
172 | |||
173 | return geom;
|
||
174 | 2269 | fjp | } |
175 | 4171 | fjp | |
176 | 2269 | fjp | /**
|
177 | 4171 | fjp | * First, the geometry field. After, the rest of fields
|
178 | 5522 | caballero | *
|
179 | 4171 | fjp | * @return
|
180 | */
|
||
181 | /*
|
||
182 | * public String getTotalFields() { String strAux = "AsBinary(" +
|
||
183 | * getLyrDef().getFieldGeometry() + ")"; String[] fieldNames =
|
||
184 | * getLyrDef().getFieldNames(); for (int i=0; i< fieldNames.length; i++) {
|
||
185 | * strAux = strAux + ", " + fieldNames[i]; } return strAux; }
|
||
186 | */
|
||
187 | |||
188 | /**
|
||
189 | * Antes de llamar a esta funci?n hay que haber fijado el workingArea si se
|
||
190 | * quiere usar.
|
||
191 | 5522 | caballero | *
|
192 | 2269 | fjp | * @param conn
|
193 | */
|
||
194 | 4171 | fjp | public void setData(Connection conn, DBLayerDefinition lyrDef) { |
195 | this.conn = conn;
|
||
196 | 4740 | fjp | // TODO: Deber?amos poder quitar Conneciton de la llamada y meterlo
|
197 | // en lyrDef desde el principio.
|
||
198 | 5522 | caballero | |
199 | 4740 | fjp | lyrDef.setConnection(conn); |
200 | 4171 | fjp | setLyrDef(lyrDef); |
201 | 3251 | fjp | |
202 | 4171 | fjp | getTableEPSG(); |
203 | |||
204 | try {
|
||
205 | 4748 | fjp | conn.setAutoCommit(false);
|
206 | 4171 | fjp | sqlOrig = "SELECT " + getTotalFields() + " FROM " |
207 | + getLyrDef().getTableName() + " "
|
||
208 | + getLyrDef().getWhereClause(); |
||
209 | if (canReproject(strEPSG)) {
|
||
210 | completeWhere = getCompoundWhere(sqlOrig, workingArea, strEPSG); |
||
211 | } else {
|
||
212 | completeWhere = getCompoundWhere(sqlOrig, workingArea, |
||
213 | originalEPSG); |
||
214 | } |
||
215 | String sqlAux = sqlOrig + completeWhere + " ORDER BY " |
||
216 | + getLyrDef().getFieldID(); |
||
217 | completeWhere = getLyrDef().getWhereClause() + completeWhere; |
||
218 | |||
219 | sqlTotal = sqlAux; |
||
220 | logger.info("Cadena SQL:" + sqlAux);
|
||
221 | st = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
|
||
222 | ResultSet.CONCUR_READ_ONLY);
|
||
223 | // st.setFetchSize(FETCH_SIZE);
|
||
224 | st.execute("declare wkb_cursor binary cursor for " + sqlAux);
|
||
225 | rs = st.executeQuery("fetch forward " + FETCH_SIZE
|
||
226 | + " in wkb_cursor");
|
||
227 | // st.execute("begin");
|
||
228 | // bCursorActivo = true;
|
||
229 | // rs = st.executeQuery(sqlOrig);
|
||
230 | fetch_min = 0;
|
||
231 | fetch_max = FETCH_SIZE - 1;
|
||
232 | metaData = rs.getMetaData(); |
||
233 | doRelateID_FID(); |
||
234 | 5595 | fjp | |
235 | writer.setCreateTable(false);
|
||
236 | writer.setWriteAll(false);
|
||
237 | writer.initialize(lyrDef); |
||
238 | 4171 | fjp | |
239 | 5595 | fjp | |
240 | 4171 | fjp | } catch (SQLException e) { |
241 | NotificationManager.addError( |
||
242 | "Error al conectar a la base de datos.", e);
|
||
243 | 5595 | fjp | } catch (EditionException e) {
|
244 | e.printStackTrace(); |
||
245 | NotificationManager.addError( |
||
246 | "Error inicializando PosGIS Writer.", e);
|
||
247 | |||
248 | 4171 | fjp | } |
249 | 2269 | fjp | } |
250 | 4171 | fjp | |
251 | 2269 | fjp | /**
|
252 | * @see com.iver.cit.gvsig.fmap.layers.ReadableVectorial#getFullExtent()
|
||
253 | */
|
||
254 | 4171 | fjp | public Rectangle2D getFullExtent() { |
255 | if (fullExtent == null) { |
||
256 | try {
|
||
257 | Statement s = conn.createStatement();
|
||
258 | ResultSet r = s.executeQuery("SELECT extent(" |
||
259 | + getLyrDef().getFieldGeometry() |
||
260 | + ") AS FullExtent FROM " + getLyrDef().getTableName()
|
||
261 | + " " + getCompleteWhere());
|
||
262 | r.next(); |
||
263 | String strAux = r.getString(1); |
||
264 | System.out.println("fullExtent = " + strAux); |
||
265 | if (strAux.startsWith("BOX3D")) { |
||
266 | 2269 | fjp | PGbox3d regeom = new PGbox3d(strAux);
|
267 | 4171 | fjp | double x = regeom.getLLB().x;
|
268 | double y = regeom.getLLB().y;
|
||
269 | double w = regeom.getURT().x - x;
|
||
270 | double h = regeom.getURT().y - y;
|
||
271 | fullExtent = new Rectangle2D.Double(x, y, w, h); |
||
272 | } else {
|
||
273 | 2269 | fjp | PGbox2d regeom = new PGbox2d(strAux);
|
274 | 4171 | fjp | double x = regeom.getLLB().x;
|
275 | double y = regeom.getLLB().y;
|
||
276 | double w = regeom.getURT().x - x;
|
||
277 | double h = regeom.getURT().y - y;
|
||
278 | fullExtent = new Rectangle2D.Double(x, y, w, h); |
||
279 | 2269 | fjp | } |
280 | 4171 | fjp | } catch (SQLException e) { |
281 | System.err.println(e.getMessage());
|
||
282 | } |
||
283 | |||
284 | } |
||
285 | return fullExtent;
|
||
286 | 2269 | fjp | } |
287 | 3095 | fjp | |
288 | 4171 | fjp | /*
|
289 | * (non-Javadoc)
|
||
290 | 5522 | caballero | *
|
291 | 4171 | fjp | * @see com.iver.cit.gvsig.fmap.drivers.VectorialDatabaseDriver#getGeometryIterator(java.lang.String)
|
292 | */
|
||
293 | public IFeatureIterator getFeatureIterator(String sql) |
||
294 | throws com.iver.cit.gvsig.fmap.DriverException {
|
||
295 | PostGisFeatureIterator geomIterator = null;
|
||
296 | try {
|
||
297 | // st = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
|
||
298 | // ResultSet.CONCUR_READ_ONLY);
|
||
299 | |||
300 | 5522 | caballero | |
301 | 4171 | fjp | if (provCursorName != null) { |
302 | /* st.execute("BEGIN");
|
||
303 | st.execute("CLOSE " + provCursorName);
|
||
304 | bCursorActivo = false;
|
||
305 | st.execute("COMMIT"); */
|
||
306 | numProvCursors++; |
||
307 | } |
||
308 | // st.execute("BEGIN");
|
||
309 | provCursorName = "wkb_cursor_prov_" + System.currentTimeMillis() + "" + numProvCursors; |
||
310 | |||
311 | // st.execute("BEGIN");
|
||
312 | bCursorActivo = true;
|
||
313 | // ResultSet rs = st.executeQuery(sql);
|
||
314 | geomIterator = new PostGisFeatureIterator(conn, provCursorName, sql);
|
||
315 | geomIterator.setLyrDef(getLyrDef()); |
||
316 | } catch (SQLException e) { |
||
317 | e.printStackTrace(); |
||
318 | |||
319 | throw new DriverException(e); |
||
320 | // return null;
|
||
321 | } |
||
322 | |||
323 | return geomIterator;
|
||
324 | } |
||
325 | |||
326 | public IFeatureIterator getFeatureIterator(Rectangle2D r, String strEPSG) |
||
327 | throws DriverException {
|
||
328 | if (workingArea != null) |
||
329 | r = r.createIntersection(workingArea); |
||
330 | |||
331 | String sqlAux;
|
||
332 | if (canReproject(strEPSG)) {
|
||
333 | sqlAux = sqlOrig + getCompoundWhere(sqlOrig, r, strEPSG); |
||
334 | } else {
|
||
335 | sqlAux = sqlOrig + getCompoundWhere(sqlOrig, r, originalEPSG); |
||
336 | } |
||
337 | |||
338 | System.out.println("SqlAux getFeatureIterator = " + sqlAux); |
||
339 | |||
340 | return getFeatureIterator(sqlAux);
|
||
341 | } |
||
342 | |||
343 | 2269 | fjp | /**
|
344 | 4171 | fjp | * Le pasas el rect?ngulo que quieres pedir. La primera vez es el
|
345 | * workingArea, y las siguientes una interseccion de este rectangulo con el
|
||
346 | * workingArea
|
||
347 | 5522 | caballero | *
|
348 | 4171 | fjp | * @param r
|
349 | * @param strEPSG
|
||
350 | * @return
|
||
351 | */
|
||
352 | private String getCompoundWhere(String sql, Rectangle2D r, String strEPSG) { |
||
353 | if (r == null) |
||
354 | return ""; |
||
355 | |||
356 | double xMin = r.getMinX();
|
||
357 | double yMin = r.getMinY();
|
||
358 | double xMax = r.getMaxX();
|
||
359 | double yMax = r.getMaxY();
|
||
360 | String wktBox = "GeometryFromText('LINESTRING(" + xMin + " " + yMin |
||
361 | + ", " + xMax + " " + yMin + ", " + xMax + " " + yMax + ", " |
||
362 | + xMin + " " + yMax + ")', " + strEPSG + ")"; |
||
363 | String sqlAux;
|
||
364 | if (getWhereClause().indexOf("WHERE") != -1) |
||
365 | sqlAux = getLyrDef().getFieldGeometry() + " && " + wktBox;
|
||
366 | else
|
||
367 | sqlAux = "WHERE " + getLyrDef().getFieldGeometry() + " && " |
||
368 | + wktBox; |
||
369 | return sqlAux;
|
||
370 | } |
||
371 | |||
372 | /**
|
||
373 | 2269 | fjp | * @see com.iver.cit.gvsig.fmap.drivers.VectorialDatabaseDriver#getConnectionStringBeginning()
|
374 | */
|
||
375 | public String getConnectionStringBeginning() { |
||
376 | return "jdbc:postgresql:"; |
||
377 | } |
||
378 | 3303 | fjp | |
379 | 4171 | fjp | /*
|
380 | * (non-Javadoc)
|
||
381 | 5522 | caballero | *
|
382 | 4171 | fjp | * @see com.iver.cit.gvsig.fmap.drivers.DefaultDBDriver#getFieldValue(long,
|
383 | * int)
|
||
384 | */
|
||
385 | public Value getFieldValue(long rowIndex, int idField) |
||
386 | throws com.hardcode.gdbms.engine.data.driver.DriverException {
|
||
387 | boolean resul;
|
||
388 | // EL ABSOLUTE NO HACE QUE SE VUELVAN A LEER LAS
|
||
389 | // FILAS, ASI QUE MONTAMOS ESTA HISTORIA PARA QUE
|
||
390 | // LO HAGA
|
||
391 | // System.out.println("getShape " + index);
|
||
392 | int index = (int) (rowIndex); |
||
393 | try {
|
||
394 | setAbsolutePosition(index); |
||
395 | int fieldId = idField + 2; |
||
396 | byte[] byteBuf = rs.getBytes(fieldId); |
||
397 | if (byteBuf == null) |
||
398 | return ValueFactory.createNullValue();
|
||
399 | else {
|
||
400 | ByteBuffer buf = ByteBuffer.wrap(byteBuf); |
||
401 | if (metaData.getColumnType(fieldId) == Types.VARCHAR) |
||
402 | return ValueFactory.createValue(rs.getString(fieldId));
|
||
403 | if (metaData.getColumnType(fieldId) == Types.FLOAT) |
||
404 | return ValueFactory.createValue(buf.getFloat());
|
||
405 | if (metaData.getColumnType(fieldId) == Types.DOUBLE) |
||
406 | return ValueFactory.createValue(buf.getDouble());
|
||
407 | if (metaData.getColumnType(fieldId) == Types.INTEGER) |
||
408 | return ValueFactory.createValue(buf.getInt());
|
||
409 | if (metaData.getColumnType(fieldId) == Types.BIGINT) |
||
410 | return ValueFactory.createValue(buf.getLong());
|
||
411 | if (metaData.getColumnType(fieldId) == Types.BIT) |
||
412 | // TODO
|
||
413 | return ValueFactory.createValue(rs.getBoolean(fieldId));
|
||
414 | if (metaData.getColumnType(fieldId) == Types.DATE) |
||
415 | // TODO
|
||
416 | return ValueFactory.createValue(rs.getDate(fieldId));
|
||
417 | if (metaData.getColumnType(fieldId) == Types.NUMERIC) { |
||
418 | // System.out.println(metaData.getColumnName(fieldId) + " "
|
||
419 | // + metaData.getColumnClassName(fieldId));
|
||
420 | short ndigits = buf.getShort();
|
||
421 | short weight = buf.getShort();
|
||
422 | short sign = buf.getShort();
|
||
423 | short dscale = buf.getShort();
|
||
424 | String strAux;
|
||
425 | if (sign == 0) |
||
426 | strAux = "+";
|
||
427 | else
|
||
428 | strAux = "-";
|
||
429 | |||
430 | for (int iDigit = 0; iDigit < ndigits; iDigit++) { |
||
431 | short digit = buf.getShort();
|
||
432 | strAux = strAux + digit; |
||
433 | if (iDigit == weight)
|
||
434 | strAux = strAux + ".";
|
||
435 | |||
436 | } |
||
437 | strAux = strAux + "0";
|
||
438 | String str2;
|
||
439 | BigDecimal dec;
|
||
440 | dec = new BigDecimal(strAux); |
||
441 | // System.out.println(ndigits + "_" + weight + "_" + dscale
|
||
442 | // + "_" + strAux);
|
||
443 | // System.out.println(strAux + " Big= " + dec);
|
||
444 | return ValueFactory.createValue(dec.doubleValue());
|
||
445 | } |
||
446 | |||
447 | } |
||
448 | } catch (SQLException e) { |
||
449 | throw new com.hardcode.gdbms.engine.data.driver.DriverException(e |
||
450 | .getMessage()); |
||
451 | } |
||
452 | return ValueFactory.createNullValue();
|
||
453 | |||
454 | } |
||
455 | |||
456 | public void open() throws com.iver.cit.gvsig.fmap.DriverException { |
||
457 | /*
|
||
458 | * try { st = conn.createStatement(); st.setFetchSize(2000); if
|
||
459 | * (bCursorActivo) close(); st.execute("declare wkb_cursor binary cursor
|
||
460 | * for " + sqlOrig); rs = st.executeQuery("fetch forward all in
|
||
461 | * wkb_cursor"); // st.execute("BEGIN"); bCursorActivo = true; } catch
|
||
462 | * (SQLException e) { e.printStackTrace(); throw new
|
||
463 | * com.iver.cit.gvsig.fmap.DriverException(e); }
|
||
464 | */
|
||
465 | |||
466 | } |
||
467 | |||
468 | private void setAbsolutePosition(int index) throws SQLException { |
||
469 | // TODO: USAR LIMIT Y ORDER BY, Y HACERLO TAMBI?N PARA
|
||
470 | // MYSQL
|
||
471 | |||
472 | // EL ABSOLUTE NO HACE QUE SE VUELVAN A LEER LAS
|
||
473 | // FILAS, ASI QUE MONTAMOS ESTA HISTORIA PARA QUE
|
||
474 | // LO HAGA
|
||
475 | // System.out.println("getShape " + index + " fetchMin=" + fetch_min + "
|
||
476 | // fetchMax=" + fetch_max);
|
||
477 | if (index < fetch_min) {
|
||
478 | // rs.close();
|
||
479 | st.execute("CLOSE wkb_cursor");
|
||
480 | st.execute("declare wkb_cursor binary cursor for " + sqlTotal);
|
||
481 | rs = st.executeQuery("fetch forward " + FETCH_SIZE
|
||
482 | + " in wkb_cursor");
|
||
483 | |||
484 | // rs.beforeFirst();
|
||
485 | |||
486 | // rs = st.executeQuery(sqlOrig);
|
||
487 | fetch_min = 0;
|
||
488 | fetch_max = FETCH_SIZE - 1;
|
||
489 | } |
||
490 | while (index > fetch_max && index != 0) { |
||
491 | rs = st.executeQuery("fetch forward " + FETCH_SIZE
|
||
492 | + " in wkb_cursor");
|
||
493 | // rs.next();
|
||
494 | /*
|
||
495 | * rs.afterLast(); // forzamos una carga rs.next();
|
||
496 | */
|
||
497 | fetch_min = fetch_max + 1;
|
||
498 | fetch_max = fetch_min + FETCH_SIZE - 1;
|
||
499 | // System.out.println("fetchSize = " + rs.getFetchSize() + " " +
|
||
500 | // fetch_min + "-" + fetch_max);
|
||
501 | } |
||
502 | if (rs != null) |
||
503 | rs.absolute(index - fetch_min + 1);
|
||
504 | |||
505 | // rs.absolute(index+1);
|
||
506 | |||
507 | } |
||
508 | |||
509 | 2269 | fjp | /**
|
510 | * @see com.iver.cit.gvsig.fmap.drivers.VectorialDatabaseDriver#getGeometryField(java.lang.String)
|
||
511 | */
|
||
512 | public String getGeometryField(String fieldName) { |
||
513 | return "ASBINARY(" + fieldName + ", 'XDR')"; |
||
514 | } |
||
515 | 3095 | fjp | |
516 | 4171 | fjp | /**
|
517 | * @see com.hardcode.gdbms.engine.data.driver.ObjectDriver#getPrimaryKeys()
|
||
518 | */
|
||
519 | public int[] getPrimaryKeys() |
||
520 | throws com.hardcode.gdbms.engine.data.driver.DriverException {
|
||
521 | // TODO Auto-generated method stub
|
||
522 | return null; |
||
523 | } |
||
524 | 3268 | fjp | |
525 | 4171 | fjp | /**
|
526 | * @see com.iver.cit.gvsig.fmap.drivers.VectorialJDBCDriver#getDefaultPort()
|
||
527 | */
|
||
528 | public int getDefaultPort() { |
||
529 | return 5432; |
||
530 | } |
||
531 | 3268 | fjp | |
532 | 4171 | fjp | /**
|
533 | * @see com.hardcode.gdbms.engine.data.driver.ObjectDriver#write(com.hardcode.gdbms.engine.data.edition.DataWare)
|
||
534 | */
|
||
535 | public void write(DataWare arg0) |
||
536 | throws com.hardcode.gdbms.engine.data.driver.DriverException {
|
||
537 | // TODO Auto-generated method stub
|
||
538 | |||
539 | } |
||
540 | |||
541 | /*
|
||
542 | * (non-Javadoc)
|
||
543 | 5522 | caballero | *
|
544 | 4171 | fjp | * @see com.iver.cit.gvsig.fmap.core.ICanReproject#getSourceProjection()
|
545 | */
|
||
546 | public String getSourceProjection() { |
||
547 | if (originalEPSG == null) |
||
548 | getTableEPSG(); |
||
549 | return originalEPSG;
|
||
550 | } |
||
551 | |||
552 | 4335 | fjp | /**
|
553 | 5522 | caballero | * Las tablas con geometr?as est?n en la tabla GEOMETRY_COLUMNS y de
|
554 | 4335 | fjp | * ah? sacamos en qu? proyecci?n est?n.
|
555 | * El problema es que si el usuario hace una vista de esa
|
||
556 | * tabla, no estar? dada de alta aqu? y entonces gvSIG
|
||
557 | * no se entera en qu? proyecci?n est? trabajando (y le
|
||
558 | * ponemos un -1 como mal menor). El -1 implica que luego
|
||
559 | * no podremos reproyectar al vuelo desde la base de datos.
|
||
560 | */
|
||
561 | 5522 | caballero | private void getTableEPSG() { |
562 | 4171 | fjp | try {
|
563 | Statement stAux = conn.createStatement();
|
||
564 | |||
565 | String sql = "SELECT * FROM GEOMETRY_COLUMNS WHERE F_TABLE_NAME = '" |
||
566 | + getTableName() + "';";
|
||
567 | ResultSet rs = stAux.executeQuery(sql);
|
||
568 | rs.next(); |
||
569 | originalEPSG = "" + rs.getInt("SRID"); |
||
570 | rs.close(); |
||
571 | } catch (SQLException e) { |
||
572 | // TODO Auto-generated catch block
|
||
573 | 4335 | fjp | originalEPSG = "-1";
|
574 | logger.error(e); |
||
575 | 4171 | fjp | e.printStackTrace(); |
576 | } |
||
577 | |||
578 | } |
||
579 | |||
580 | /*
|
||
581 | * (non-Javadoc)
|
||
582 | 5522 | caballero | *
|
583 | 4171 | fjp | * @see com.iver.cit.gvsig.fmap.core.ICanReproject#getDestProjection()
|
584 | */
|
||
585 | public String getDestProjection() { |
||
586 | return strEPSG;
|
||
587 | } |
||
588 | |||
589 | /*
|
||
590 | * (non-Javadoc)
|
||
591 | 5522 | caballero | *
|
592 | 4171 | fjp | * @see com.iver.cit.gvsig.fmap.core.ICanReproject#setDestProjection(java.lang.String)
|
593 | */
|
||
594 | public void setDestProjection(String toEPSG) { |
||
595 | this.strEPSG = toEPSG;
|
||
596 | } |
||
597 | |||
598 | /*
|
||
599 | * (non-Javadoc)
|
||
600 | 5522 | caballero | *
|
601 | 4171 | fjp | * @see com.iver.cit.gvsig.fmap.core.ICanReproject#canReproject(java.lang.String)
|
602 | */
|
||
603 | public boolean canReproject(String toEPSGdestinyProjection) { |
||
604 | // TODO POR AHORA, REPROYECTA SIEMPRE gvSIG.
|
||
605 | return false; |
||
606 | } |
||
607 | |||
608 | /*
|
||
609 | * (non-Javadoc)
|
||
610 | 5522 | caballero | *
|
611 | 4171 | fjp | * @see com.iver.cit.gvsig.fmap.drivers.DefaultDBDriver#doRelateID_FID()
|
612 | */
|
||
613 | protected void doRelateID_FID() { |
||
614 | hashRelate = new Hashtable(); |
||
615 | try {
|
||
616 | String strSQL = "SELECT " + getLyrDef().getFieldID() + " FROM " |
||
617 | + getLyrDef().getTableName() + " "
|
||
618 | + getLyrDef().getWhereClause(); |
||
619 | if (canReproject(strEPSG)) {
|
||
620 | strSQL = strSQL |
||
621 | + getCompoundWhere(strSQL, workingArea, strEPSG); |
||
622 | } else {
|
||
623 | strSQL = strSQL |
||
624 | + getCompoundWhere(strSQL, workingArea, originalEPSG); |
||
625 | } |
||
626 | 5570 | fjp | strSQL = strSQL + " ORDER BY " + getLyrDef().getFieldID();
|
627 | 4171 | fjp | Statement s = getConnection().createStatement(
|
628 | ResultSet.TYPE_SCROLL_INSENSITIVE,
|
||
629 | ResultSet.CONCUR_READ_ONLY);
|
||
630 | int fetchSize = 5000; |
||
631 | ResultSet r = s.executeQuery(strSQL);
|
||
632 | int id = 0; |
||
633 | String gid;
|
||
634 | while (r.next()) {
|
||
635 | gid = r.getString(1);
|
||
636 | Value aux = ValueFactory.createValue(gid); |
||
637 | hashRelate.put(aux, new Integer(id)); |
||
638 | 5570 | fjp | // System.out.println("ASOCIANDO CLAVE " + aux + " CON VALOR " + id);
|
639 | 4171 | fjp | id++; |
640 | // System.out.println("Row " + id + ":" + strAux);
|
||
641 | } |
||
642 | s.close(); |
||
643 | numReg = id; |
||
644 | |||
645 | /*
|
||
646 | * for (int index = 0; index < getShapeCount(); index++) { Value aux =
|
||
647 | * getFieldValue(index, idFID_FieldName-2); hashRelate.put(aux, new
|
||
648 | * Integer(index)); // System.out.println("Row " + index + " clave=" +
|
||
649 | * aux); }
|
||
650 | */
|
||
651 | /*
|
||
652 | * int index = 0;
|
||
653 | 5522 | caballero | *
|
654 | 4171 | fjp | * while (rs.next()) { Value aux = getFieldValue(index,
|
655 | * idFID_FieldName-2); hashRelate.put(aux, new Integer(index));
|
||
656 | * index++; System.out.println("Row " + index + " clave=" + aux); }
|
||
657 | * numReg = index;
|
||
658 | */
|
||
659 | // rs.beforeFirst();
|
||
660 | /*
|
||
661 | * } catch (com.hardcode.gdbms.engine.data.driver.DriverException e) { //
|
||
662 | * TODO Auto-generated catch block e.printStackTrace();
|
||
663 | */
|
||
664 | } catch (SQLException e) { |
||
665 | // TODO Auto-generated catch block
|
||
666 | e.printStackTrace(); |
||
667 | } |
||
668 | } |
||
669 | |||
670 | public String getSqlTotal() { |
||
671 | return sqlTotal;
|
||
672 | } |
||
673 | |||
674 | /**
|
||
675 | * @return Returns the completeWhere.
|
||
676 | */
|
||
677 | public String getCompleteWhere() { |
||
678 | return completeWhere;
|
||
679 | } |
||
680 | |||
681 | /*
|
||
682 | * (non-Javadoc)
|
||
683 | 5522 | caballero | *
|
684 | 4171 | fjp | * @see com.iver.cit.gvsig.fmap.drivers.DefaultDBDriver#close()
|
685 | */
|
||
686 | public void close() { |
||
687 | super.close();
|
||
688 | /*
|
||
689 | * if (bCursorActivo) { try { // st =
|
||
690 | * conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
|
||
691 | * ResultSet.CONCUR_READ_ONLY); st.execute("CLOSE wkb_cursor_prov"); //
|
||
692 | * st.close(); } catch (SQLException e) { // TODO Auto-generated catch
|
||
693 | * block e.printStackTrace(); } bCursorActivo = false; }
|
||
694 | */
|
||
695 | |||
696 | } |
||
697 | |||
698 | /*
|
||
699 | * (non-Javadoc)
|
||
700 | 5522 | caballero | *
|
701 | 4171 | fjp | * @see com.iver.cit.gvsig.fmap.drivers.VectorialDatabaseDriver#getFeatureIterator(java.awt.geom.Rectangle2D,
|
702 | * java.lang.String, java.lang.String[])
|
||
703 | */
|
||
704 | public IFeatureIterator getFeatureIterator(Rectangle2D r, String strEPSG, |
||
705 | String[] alphaNumericFieldsNeeded) throws DriverException { |
||
706 | try {
|
||
707 | if (workingArea != null) |
||
708 | r = r.createIntersection(workingArea); |
||
709 | // if (getLyrDef()==null){
|
||
710 | // load();
|
||
711 | // throw new DriverException("Fallo de la conexi?n");
|
||
712 | // }
|
||
713 | String strAux = getGeometryField(getLyrDef().getFieldGeometry());
|
||
714 | |||
715 | boolean found = false; |
||
716 | if (alphaNumericFieldsNeeded != null) { |
||
717 | for (int i = 0; i < alphaNumericFieldsNeeded.length; i++) { |
||
718 | strAux = strAux + ", " + alphaNumericFieldsNeeded[i];
|
||
719 | if (alphaNumericFieldsNeeded[i].equals(getLyrDef()
|
||
720 | .getFieldID())) |
||
721 | found = true;
|
||
722 | } |
||
723 | } |
||
724 | // Nos aseguramos de pedir siempre el campo ID
|
||
725 | if (found == false) |
||
726 | strAux = strAux + ", " + getLyrDef().getFieldID();
|
||
727 | |||
728 | String sqlProv = "SELECT " + strAux + " FROM " |
||
729 | + getLyrDef().getTableName() + " "
|
||
730 | + getLyrDef().getWhereClause(); |
||
731 | |||
732 | String sqlAux;
|
||
733 | if (canReproject(strEPSG)) {
|
||
734 | sqlAux = sqlProv + getCompoundWhere(sqlProv, r, strEPSG); |
||
735 | } else {
|
||
736 | sqlAux = sqlProv + getCompoundWhere(sqlProv, r, originalEPSG); |
||
737 | } |
||
738 | |||
739 | System.out.println("SqlAux getFeatureIterator = " + sqlAux); |
||
740 | |||
741 | return getFeatureIterator(sqlAux);
|
||
742 | } catch (Exception e) { |
||
743 | 3462 | caballero | throw new DriverException(e); |
744 | } |
||
745 | 4171 | fjp | } |
746 | |||
747 | 5595 | fjp | /* public void preProcess() throws EditionException {
|
748 | 4740 | fjp | writer.preProcess();
|
749 | }
|
||
750 | |||
751 | public void process(IRowEdited row) throws EditionException {
|
||
752 | writer.process(row);
|
||
753 | }
|
||
754 | |||
755 | public void postProcess() throws EditionException {
|
||
756 | writer.postProcess();
|
||
757 | }
|
||
758 | |||
759 | public String getCapability(String capability) {
|
||
760 | return writer.getCapability(capability);
|
||
761 | }
|
||
762 | |||
763 | public void setCapabilities(Properties capabilities) {
|
||
764 | writer.setCapabilities(capabilities);
|
||
765 | }
|
||
766 | |||
767 | public boolean canWriteAttribute(int sqlType) {
|
||
768 | return writer.canWriteAttribute(sqlType);
|
||
769 | }
|
||
770 | |||
771 | public boolean canWriteGeometry(int gvSIGgeometryType) {
|
||
772 | return writer.canWriteGeometry(gvSIGgeometryType);
|
||
773 | }
|
||
774 | |||
775 | 5558 | fjp | public void initialize(ITableDefinition layerDef) throws EditionException {
|
776 | 4740 | fjp | writer.setCreateTable(false);
|
777 | writer.setWriteAll(false);
|
||
778 | // Obtenemos el DBLayerDefinition a partir del driver
|
||
779 | 5522 | caballero | |
780 | DBLayerDefinition dbLyrDef = getLyrDef();
|
||
781 | |||
782 | |||
783 | 4740 | fjp | writer.initialize(dbLyrDef);
|
784 | }
|
||
785 | 5595 | fjp | */
|
786 | 5522 | caballero | public boolean isWritable() { |
787 | return true; |
||
788 | 5595 | fjp | } |
789 | |||
790 | public IWriter getWriter() {
|
||
791 | return writer;
|
||
792 | 5522 | caballero | } |
793 | 5402 | fjp | |
794 | 5522 | caballero | |
795 | 2269 | fjp | } |