Revision: 4784
          http://sourceforge.net/p/jump-pilot/code/4784
Author:   elnico
Date:     2016-01-13 13:02:12 +0000 (Wed, 13 Jan 2016)
Log Message:
-----------
Escape of single quotes in SQL identifiers names, as most database identifiers 
can contain quotes.

Modified Paths:
--------------
    core/trunk/src/com/vividsolutions/jump/datastore/h2/H2DSMetadata.java
    
core/trunk/src/com/vividsolutions/jump/datastore/mariadb/MariadbDSMetadata.java
    
core/trunk/src/com/vividsolutions/jump/datastore/oracle/OracleDSMetadata.java
    
core/trunk/src/com/vividsolutions/jump/datastore/postgis/PostgisDSMetadata.java
    
core/trunk/src/com/vividsolutions/jump/datastore/spatialdatabases/SpatialDatabasesDSMetadata.java
    
core/trunk/src/com/vividsolutions/jump/datastore/spatialdatabases/SpatialDatabasesSQLBuilder.java
    
core/trunk/src/com/vividsolutions/jump/datastore/spatialite/SpatialiteDSMetadata.java

Modified: core/trunk/src/com/vividsolutions/jump/datastore/h2/H2DSMetadata.java
===================================================================
--- core/trunk/src/com/vividsolutions/jump/datastore/h2/H2DSMetadata.java       
2016-01-13 10:49:14 UTC (rev 4783)
+++ core/trunk/src/com/vividsolutions/jump/datastore/h2/H2DSMetadata.java       
2016-01-13 13:02:12 UTC (rev 4784)
@@ -3,6 +3,7 @@
 import com.vividsolutions.jump.datastore.DataStoreConnection;
 import com.vividsolutions.jump.datastore.GeometryColumn;
 import 
com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSMetadata;
+import 
com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesSQLBuilder;
 
 import java.util.List;
 
@@ -18,7 +19,7 @@
         defaultSchemaName = "PUBLIC";
         spatialDbName = "H2";
         //spatialExtentQuery1 = "SELECT ST_AsBinary(ST_Estimated_Extent( '%s', 
'%s', '%s' ))";
-        spatialExtentQuery1 = "SELECT ST_AsBinary(ST_Envelope(ST_Extent(%s))) 
FROM %s.%s";
+        spatialExtentQuery1 = "SELECT ST_AsBinary(ST_Envelope(ST_Extent(%s))) 
FROM \"%s\".\"%s\"";
         geoColumnsQuery = "SELECT f_geometry_column, srid, type FROM 
geometry_columns where f_table_schema = '%s' and f_table_name = '%s'";
         sridQuery = "SELECT srid FROM geometry_columns where f_table_schema = 
'%s' and f_table_name = '%s' and f_geometry_column = '%s'";
     }
@@ -35,13 +36,18 @@
 
     @Override
     public String getGeoColumnsQuery(String datasetName) {
-        return String.format(this.geoColumnsQuery, getSchemaName(datasetName), 
getTableName(datasetName));
+        // escape single quotes
+        return String.format(this.geoColumnsQuery, 
+            
SpatialDatabasesSQLBuilder.escapeSingleQuote(getSchemaName(datasetName)), 
+            
SpatialDatabasesSQLBuilder.escapeSingleQuote(getTableName(datasetName)));
     }
 
     @Override
     public String getSridQuery(String schemaName, String tableName, String 
colName) {
-        // TODO
-        return String.format(this.sridQuery, schemaName, tableName, colName);
+        // escape single quotes
+        return String.format(this.sridQuery, 
+            SpatialDatabasesSQLBuilder.escapeSingleQuote(schemaName), 
+            SpatialDatabasesSQLBuilder.escapeSingleQuote(tableName), colName);
     }
 
     @Override

Modified: 
core/trunk/src/com/vividsolutions/jump/datastore/mariadb/MariadbDSMetadata.java
===================================================================
--- 
core/trunk/src/com/vividsolutions/jump/datastore/mariadb/MariadbDSMetadata.java 
    2016-01-13 10:49:14 UTC (rev 4783)
+++ 
core/trunk/src/com/vividsolutions/jump/datastore/mariadb/MariadbDSMetadata.java 
    2016-01-13 13:02:12 UTC (rev 4784)
@@ -3,12 +3,8 @@
 import com.vividsolutions.jump.datastore.DataStoreConnection;
 import com.vividsolutions.jump.datastore.spatialdatabases.*;
 import com.vividsolutions.jump.datastore.GeometryColumn;
-import com.vividsolutions.jump.datastore.jdbc.JDBCUtil;
-import com.vividsolutions.jump.datastore.jdbc.ResultSetBlock;
 import java.sql.DatabaseMetaData;
 import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.ArrayList;
 import java.util.List;
 
 public class MariadbDSMetadata extends SpatialDatabasesDSMetadata {
@@ -73,6 +69,7 @@
     
     // query according to detected layout:
     geoColumnsQuery = "SELECT f_geometry_column, srid, type FROM 
geometry_columns where f_table_name = '%s'";
+    // TODO: not the same number of param to replace...
     if (geometryColumnsLayout == GeometryColumnsLayout.NO_LAYOUT) {
       geoColumnsQuery = "select c.COLUMN_NAME, 0, 'geometry' \n"
         + "from information_schema.TABLES t join information_schema.COLUMNS C 
\n"
@@ -86,8 +83,9 @@
     // query according to detected layout:
     sridQuery = "SELECT srid FROM geometry_columns where f_table_name = '%s' 
and f_geometry_column = '%s'";
     if (geometryColumnsLayout == GeometryColumnsLayout.NO_LAYOUT) {
-      sridQuery = "select case when min(st_srid(%s)) <> max(st_srid(%s)) then 
0 else min(st_srid(%s)) end as srid\n"
-        + "from %s.%s";
+      // quote identifiers
+      sridQuery2 = "select case when min(st_srid(%s)) <> max(st_srid(%s)) then 
0 else min(st_srid(%s)) end as srid\n"
+        + "from `%s`.`%s`";
     }
     
   }
@@ -104,7 +102,9 @@
 
   @Override
   public String getGeoColumnsQuery(String datasetName) {
-    return String.format(this.geoColumnsQuery, getTableName(datasetName));
+    // escape single quotes in identifier
+    return String.format(this.geoColumnsQuery, 
+        
SpatialDatabasesSQLBuilder.escapeSingleQuote(getTableName(datasetName)));
   }
 
   public String getGeoColumnsQuery2(String datasetName) {
@@ -113,11 +113,16 @@
 
   @Override
   public String getSridQuery(String schemaName, String tableName, String 
colName) {
-    return String.format(this.sridQuery, tableName, colName);
+    // escape single quotes in identifier
+    // TODO: geom ?
+    return String.format(this.sridQuery, 
+        SpatialDatabasesSQLBuilder.escapeSingleQuote(tableName), colName);
   }
 
   public String getSridQuery2(String schemaName, String tableName, String 
colName) {
-    return String.format(this.sridQuery2, colName, colName, colName, 
schemaName, tableName);
+    return String.format(this.sridQuery2, colName, colName, colName, 
+        SpatialDatabasesSQLBuilder.escapeSingleQuote(schemaName), 
+        SpatialDatabasesSQLBuilder.escapeSingleQuote(tableName));
   }
 
   @Override

Modified: 
core/trunk/src/com/vividsolutions/jump/datastore/oracle/OracleDSMetadata.java
===================================================================
--- 
core/trunk/src/com/vividsolutions/jump/datastore/oracle/OracleDSMetadata.java   
    2016-01-13 10:49:14 UTC (rev 4783)
+++ 
core/trunk/src/com/vividsolutions/jump/datastore/oracle/OracleDSMetadata.java   
    2016-01-13 13:02:12 UTC (rev 4784)
@@ -45,9 +45,9 @@
             "                       (select sdo_lb from tmp where sdo_dimname 
= 'Y'))\n" +
             "  )) as geom \n" +
             "from dual";
+        // double quotes identifiers
+        spatialExtentQuery2 = "select 
sdo_util.to_wktgeometry(sdo_aggr_mbr(%s)) as geom from \"%s\".\"%s\"";
         
-        spatialExtentQuery2 = "select 
sdo_util.to_wktgeometry(sdo_aggr_mbr(%s)) as geom from %s.%s";
-        
         geoColumnsQuery = "select t.column_name, t.srid, 'SDO_GEOMETRY' as 
type from ALL_SDO_GEOM_METADATA t "
             + "where t.owner = '%s' and t.table_name = '%s'";
         sridQuery = "select t.srid from ALL_SDO_GEOM_METADATA t "
@@ -56,7 +56,10 @@
 
     @Override
     public String getSpatialExtentQuery1(String schema, String table, String 
attributeName) {
-        return String.format(this.spatialExtentQuery1, schema, table, 
attributeName);
+        // escape single quote for table name:
+        // TODO: do it for schema/user name ?
+        return String.format(this.spatialExtentQuery1, schema, 
+            SpatialDatabasesSQLBuilder.escapeSingleQuote(table), 
attributeName);
     }
 
     @Override
@@ -66,13 +69,18 @@
 
     @Override
     public String getGeoColumnsQuery(String datasetName) {
-        return String.format(this.geoColumnsQuery, getSchemaName(datasetName), 
getTableName(datasetName));
+        // escape single quote for table name:
+        // TODO: do it for schema/user name ?
+        return String.format(this.geoColumnsQuery, getSchemaName(datasetName), 
+            
SpatialDatabasesSQLBuilder.escapeSingleQuote(getTableName(datasetName)));
     }
 
     @Override
     public String getSridQuery(String schemaName, String tableName, String 
colName) {
-        // TODO
-        return String.format(this.sridQuery, schemaName, tableName, colName);
+        // escape single quote for table name:
+        // TODO: do it for schema/user name ?
+        return String.format(this.sridQuery, schemaName, 
+            SpatialDatabasesSQLBuilder.escapeSingleQuote(tableName), colName);
     }
     
     @Override

Modified: 
core/trunk/src/com/vividsolutions/jump/datastore/postgis/PostgisDSMetadata.java
===================================================================
--- 
core/trunk/src/com/vividsolutions/jump/datastore/postgis/PostgisDSMetadata.java 
    2016-01-13 10:49:14 UTC (rev 4783)
+++ 
core/trunk/src/com/vividsolutions/jump/datastore/postgis/PostgisDSMetadata.java 
    2016-01-13 13:02:12 UTC (rev 4784)
@@ -14,14 +14,19 @@
         defaultSchemaName = "public";
         spatialDbName = "PostGIS";
         spatialExtentQuery1 = "SELECT ST_AsBinary(ST_Estimated_Extent( '%s', 
'%s', '%s' ))";
-        spatialExtentQuery2 = "SELECT 
ST_AsBinary(ST_Envelope(ST_Extent(\"%s\"))) FROM %s.%s";
+        // Nicolas Ribot: add double quotes for identifiers
+        spatialExtentQuery2 = "SELECT 
ST_AsBinary(ST_Envelope(ST_Extent(\"%s\"))) FROM \"%s\".\"%s\"";
         geoColumnsQuery = "SELECT f_geometry_column, srid, type FROM 
geometry_columns where f_table_schema='%s' and f_table_name = '%s'";
         sridQuery = "SELECT srid FROM geometry_columns where f_table_schema = 
'%s' and f_table_name = '%s' and f_geometry_column = '%s'";
     }
 
     @Override
     public String getSpatialExtentQuery1(String schema, String table, String 
attributeName) {
-        return String.format(this.spatialExtentQuery1, schema, table, 
attributeName);
+        //must escape single quote in idenfifiers before formatting query
+        return String.format(this.spatialExtentQuery1, 
+            SpatialDatabasesSQLBuilder.escapeSingleQuote(schema), 
+            SpatialDatabasesSQLBuilder.escapeSingleQuote(table), 
+            SpatialDatabasesSQLBuilder.escapeSingleQuote(attributeName));
     }
 
     @Override
@@ -31,13 +36,19 @@
 
     @Override
     public String getGeoColumnsQuery(String datasetName) {
-        return String.format(this.geoColumnsQuery, getSchemaName(datasetName), 
getTableName(datasetName));
+        //must escape single quote in idenfifiers before formatting query
+        return String.format(this.geoColumnsQuery, 
+            
SpatialDatabasesSQLBuilder.escapeSingleQuote(getSchemaName(datasetName)), 
+            
SpatialDatabasesSQLBuilder.escapeSingleQuote(getTableName(datasetName)));
     }
 
     @Override
     public String getSridQuery(String schemaName, String tableName, String 
colName) {
-        // TODO
-        return String.format(this.sridQuery, schemaName, tableName, colName);
+        //must escape single quote in idenfifiers before formatting query
+        return String.format(this.sridQuery, 
+            SpatialDatabasesSQLBuilder.escapeSingleQuote(schemaName), 
+            SpatialDatabasesSQLBuilder.escapeSingleQuote(tableName), 
+            SpatialDatabasesSQLBuilder.escapeSingleQuote(colName));
     }
     
     @Override

Modified: 
core/trunk/src/com/vividsolutions/jump/datastore/spatialdatabases/SpatialDatabasesDSMetadata.java
===================================================================
--- 
core/trunk/src/com/vividsolutions/jump/datastore/spatialdatabases/SpatialDatabasesDSMetadata.java
   2016-01-13 10:49:14 UTC (rev 4783)
+++ 
core/trunk/src/com/vividsolutions/jump/datastore/spatialdatabases/SpatialDatabasesDSMetadata.java
   2016-01-13 13:02:12 UTC (rev 4784)
@@ -93,9 +93,6 @@
   }
 
   public SpatialDatabasesDSMetadata(DataStoreConnection conn) {
-    JUMPWorkbench.getInstance().getFrame().log("creating a 
SpatialDatabasesDSMetadata (class:" + this.getClass() 
-        + " ) (con: " + conn.toString() + ") id"
-        + this.hashCode(), this.getClass());
     this.conn = conn;
     // TODO: use bind parameters to avoid SQL injection
     this.datasetNameQuery = "";
@@ -289,6 +286,7 @@
         new ResultSetBlock() {
           public void yield(ResultSet resultSet) throws SQLException {
             while (resultSet.next()) {
+              // TODO: escape single quotes in geo column name ?
               geometryAttributes.add(new GeometryColumn(
                       resultSet.getString(1),
                       resultSet.getInt(2),
@@ -353,6 +351,7 @@
       DatabaseMetaData dbMd = this.conn.getJdbcConnection().getMetaData();
       rs = dbMd.getColumns(null, getSchemaName(datasetName), 
getTableName(datasetName), null);
       while (rs.next()) {
+        // TODO: escape quotes in column names ?
         cols.add(rs.getString(4));
       }
     } catch (SQLException sqle) {

Modified: 
core/trunk/src/com/vividsolutions/jump/datastore/spatialdatabases/SpatialDatabasesSQLBuilder.java
===================================================================
--- 
core/trunk/src/com/vividsolutions/jump/datastore/spatialdatabases/SpatialDatabasesSQLBuilder.java
   2016-01-13 10:49:14 UTC (rev 4783)
+++ 
core/trunk/src/com/vividsolutions/jump/datastore/spatialdatabases/SpatialDatabasesSQLBuilder.java
   2016-01-13 13:02:12 UTC (rev 4784)
@@ -69,4 +69,14 @@
     else
       return srid.getString();
   }
+  
+  /**
+   * Utility method to escape single quotes in given identifier.
+   * Replace all single quotes ("'") by double single quotes ("''") 
+   * @param identifier
+   * @return the identifier with single quotes escaped, or identifier if no 
string found
+   */
+  public static String escapeSingleQuote(String identifier) {
+    return identifier == null ? null : identifier.replaceAll("'", "''");
+  }
 }

Modified: 
core/trunk/src/com/vividsolutions/jump/datastore/spatialite/SpatialiteDSMetadata.java
===================================================================
--- 
core/trunk/src/com/vividsolutions/jump/datastore/spatialite/SpatialiteDSMetadata.java
       2016-01-13 10:49:14 UTC (rev 4783)
+++ 
core/trunk/src/com/vividsolutions/jump/datastore/spatialite/SpatialiteDSMetadata.java
       2016-01-13 13:02:12 UTC (rev 4784)
@@ -84,7 +84,7 @@
     
     defaultSchemaName = "";
     spatialDbName = isSpatialiteLoaded() ? "Spatialite" : "SQLite";
-    spatialExtentQuery1 = "SELECT %s from %s";
+    spatialExtentQuery1 = "SELECT %s from \"%s\"";
     // no second query for spatialite
     spatialExtentQuery2 = null;
     if (this.geometryColumnsLayout == 
GeometryColumnsLayout.OGC_GEOPACKAGE_LAYOUT) {
@@ -129,11 +129,12 @@
     // TODO: switch case
     if (this.isSpatialiteLoaded()) {
       if (gcType == GeometricColumnType.WKB) {
-        ret = String.format("select st_asBinary(extent(st_geomFromWkb(%s))) 
from %s", attributeName, table);
+        // quotes identifier.
+        ret = String.format("select st_asBinary(extent(st_geomFromWkb(%s))) 
from \"%s\"", attributeName, table);
       } else if (gcType == GeometricColumnType.WKT) {
-        ret = String.format("select st_asBinary(extent(st_geomFromText(%s))) 
from %s", attributeName, table);
+        ret = String.format("select st_asBinary(extent(st_geomFromText(%s))) 
from \"%s\"", attributeName, table);
       } else if (gcType == GeometricColumnType.SPATIALITE) {
-        ret = String.format("select st_asBinary(extent(CastAutomagic(%s))) 
from %s", attributeName, table);
+        ret = String.format("select st_asBinary(extent(CastAutomagic(%s))) 
from \"%s\"", attributeName, table);
       } else {
         // unknown geom type
         // TODO: log


------------------------------------------------------------------------------
Site24x7 APM Insight: Get Deep Visibility into Application Performance
APM + Mobile APM + RUM: Monitor 3 App instances at just $35/Month
Monitor end-to-end web transactions and take corrective actions now
Troubleshoot faster and improve end-user experience. Signup Now!
http://pubads.g.doubleclick.net/gampad/clk?id=267308311&iu=/4140
_______________________________________________
Jump-pilot-devel mailing list
Jump-pilot-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel

Reply via email to