Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
import java.io.IOException;
import java.math.BigDecimal;
import java.net.SocketTimeoutException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
Expand Down Expand Up @@ -814,13 +815,10 @@ public void setPreparedStatementValue(

// Oracle Spatial/Locator
} else if (databaseMeta.getIDatabase().isOracleVariant()) {

Geometry geometry = getGeometry(data);

if (geometry != null) {

String wkt = null;

// TODO : gerer la 3D sans passer par du WKT
/*
* Type Code 2D Code 3D POINT 2001 3001 LINE 2002 3002
Expand All @@ -833,21 +831,54 @@ public void setPreparedStatementValue(
toStringMeta()
+ " : Unable to set Geometry 3D on prepared statement on index "
+ index);
} else {
wkt = new WKTWriter(2).write(geometry);
}

JGeometry ociGeometry = ociWktReaderWriter.toJGeometry(wkt.getBytes());
if (geometry.getSRID() > 0) {
ociGeometry.setSRID(geometry.getSRID());
}
// Convertir en WKT
String wkt = new WKTWriter(2).write(geometry);
int srid = geometry.getSRID() > 0 ? geometry.getSRID() : 0;

preparedStatement.setObject(
index, JGeometry.store(ociGeometry, preparedStatement.getConnection()), Types.STRUCT);
Connection conn = preparedStatement.getConnection();

} else {
// Si le WKT est long, utiliser un CLOB
if (wkt.length() > 4000) {
// Créer SDO_GEOMETRY via CLOB pour les grandes géométries
String sql = "SELECT MDSYS.SDO_GEOMETRY(?, ?) FROM DUAL";

preparedStatement.setObject(index, null, Types.STRUCT);
try (PreparedStatement geomPs = conn.prepareStatement(sql)) {
// Créer un CLOB pour le WKT
java.sql.Clob clob = conn.createClob();
clob.setString(1, wkt);

geomPs.setClob(1, clob);
geomPs.setInt(2, srid);

try (java.sql.ResultSet rs = geomPs.executeQuery()) {
if (rs.next()) {
Object sdoGeometry = rs.getObject(1);
preparedStatement.setObject(index, sdoGeometry, Types.STRUCT);
}
}

clob.free();
}
} else {
// Pour les petites géométries, utiliser String directement
String sql = "SELECT MDSYS.SDO_GEOMETRY(?, ?) FROM DUAL";

try (PreparedStatement geomPs = conn.prepareStatement(sql)) {
geomPs.setString(1, wkt);
geomPs.setInt(2, srid);

try (java.sql.ResultSet rs = geomPs.executeQuery()) {
if (rs.next()) {
Object sdoGeometry = rs.getObject(1);
preparedStatement.setObject(index, sdoGeometry, Types.STRUCT);
}
}
}
}
} else {
preparedStatement.setNull(index, Types.STRUCT);
}

// Mysql
Expand Down
Loading