diff --git a/symmetric-client/src/main/java/org/jumpmind/symmetric/db/mssql/MsSqlTriggerTemplate.java b/symmetric-client/src/main/java/org/jumpmind/symmetric/db/mssql/MsSqlTriggerTemplate.java index 2872ff8dc5..155d44f4bb 100644 --- a/symmetric-client/src/main/java/org/jumpmind/symmetric/db/mssql/MsSqlTriggerTemplate.java +++ b/symmetric-client/src/main/java/org/jumpmind/symmetric/db/mssql/MsSqlTriggerTemplate.java @@ -48,6 +48,7 @@ public MsSqlTriggerTemplate(ISymmetricDialect symmetricDialect) { (castToNVARCHAR ? "n" : "") +"varchar($(columnSize)),$(tableAlias).\"$(columnName)\") $(masterCollation),'\\','\\\\'),'\"','\\\"') + '\"' end" ; geometryColumnTemplate = "case when $(tableAlias).\"$(columnName)\" is null then '' else '\"' + replace(replace(convert("+(castToNVARCHAR ? "n" : "")+"varchar(max),$(tableAlias).\"$(columnName)\".STAsText()) $(masterCollation),'\\','\\\\'),'\"','\\\"') + '\"' end" ; + geographyColumnTemplate = "case when $(tableAlias).\"$(columnName)\" is null then '' else '\"' + replace(replace(convert("+(castToNVARCHAR ? "n" : "")+"varchar(max),$(tableAlias).\"$(columnName)\".STAsText()) $(masterCollation),'\\','\\\\'),'\"','\\\"') + '\"' end" ; numberColumnTemplate = "case when $(tableAlias).\"$(columnName)\" is null then '' else ('\"' + convert(varchar(40), $(tableAlias).\"$(columnName)\",2) + '\"') end" ; datetimeColumnTemplate = "case when $(tableAlias).\"$(columnName)\" is null then '' else ('\"' + convert(varchar,$(tableAlias).\"$(columnName)\",121) + '\"') end" ; clobColumnTemplate = "case when $(origTableAlias).\"$(columnName)\" is null then '' else '\"' + replace(replace(cast($(origTableAlias).\"$(columnName)\" as "+(castToNVARCHAR ? "n" : "")+"varchar(max)),'\\','\\\\'),'\"','\\\"') + '\"' end" ; diff --git a/symmetric-client/src/main/java/org/jumpmind/symmetric/db/mssql2000/MsSql2000TriggerTemplate.java b/symmetric-client/src/main/java/org/jumpmind/symmetric/db/mssql2000/MsSql2000TriggerTemplate.java index cce5173a25..a17b54df45 100644 --- a/symmetric-client/src/main/java/org/jumpmind/symmetric/db/mssql2000/MsSql2000TriggerTemplate.java +++ b/symmetric-client/src/main/java/org/jumpmind/symmetric/db/mssql2000/MsSql2000TriggerTemplate.java @@ -35,6 +35,7 @@ public MsSql2000TriggerTemplate(ISymmetricDialect symmetricDialect) { emptyColumnTemplate = "''" ; stringColumnTemplate = "case when $(tableAlias).\"$(columnName)\" is null then '' else '\"' + replace(replace(convert(varchar(8000),$(tableAlias).\"$(columnName)\") $(masterCollation),'\\','\\\\'),'\"','\\\"') + '\"' end" ; geometryColumnTemplate = "case when $(tableAlias).\"$(columnName)\" is null then '' else '\"' + replace(replace(convert(varchar(8000),$(tableAlias).\"$(columnName)\".STAsText()) $(masterCollation),'\\','\\\\'),'\"','\\\"') + '\"' end" ; + geographyColumnTemplate = "case when $(tableAlias).\"$(columnName)\" is null then '' else '\"' + replace(replace(convert(varchar(8000),$(tableAlias).\"$(columnName)\".STAsText()) $(masterCollation),'\\','\\\\'),'\"','\\\"') + '\"' end" ; numberColumnTemplate = "case when $(tableAlias).\"$(columnName)\" is null then '' else ('\"' + convert(varchar(40), $(tableAlias).\"$(columnName)\",2) + '\"') end" ; datetimeColumnTemplate = "case when $(tableAlias).\"$(columnName)\" is null then '' else ('\"' + convert(varchar,$(tableAlias).\"$(columnName)\",121) + '\"') end" ; clobColumnTemplate = "case when $(origTableAlias).\"$(columnName)\" is null then '' else '\"' + replace(replace(cast($(origTableAlias).\"$(columnName)\" as varchar(8000)),'\\','\\\\'),'\"','\\\"') + '\"' end" ; diff --git a/symmetric-client/src/main/java/org/jumpmind/symmetric/db/postgresql/PostgreSqlTriggerTemplate.java b/symmetric-client/src/main/java/org/jumpmind/symmetric/db/postgresql/PostgreSqlTriggerTemplate.java index eb2d5e88e6..2a1a11dc0d 100644 --- a/symmetric-client/src/main/java/org/jumpmind/symmetric/db/postgresql/PostgreSqlTriggerTemplate.java +++ b/symmetric-client/src/main/java/org/jumpmind/symmetric/db/postgresql/PostgreSqlTriggerTemplate.java @@ -31,6 +31,7 @@ public PostgreSqlTriggerTemplate(ISymmetricDialect symmetricDialect) { super(symmetricDialect); //@formatter:off geometryColumnTemplate = "case when $(tableAlias).\"$(columnName)\" is null then '' else '\"' || replace(replace(cast(ST_AsEWKT($(tableAlias).\"$(columnName)\") as varchar),$$\\$$,$$\\\\$$),'\"',$$\\\"$$) || '\"' end" ; + geographyColumnTemplate = "case when $(tableAlias).\"$(columnName)\" is null then '' else '\"' || replace(replace(cast(ST_AsEWKT($(tableAlias).\"$(columnName)\") as varchar),$$\\$$,$$\\\\$$),'\"',$$\\\"$$) || '\"' end" ; emptyColumnTemplate = "''" ; stringColumnTemplate = "case when $(tableAlias).\"$(columnName)\" is null then '' else '\"' || replace(replace(cast($(tableAlias).\"$(columnName)\" as varchar),$$\\$$,$$\\\\$$),'\"',$$\\\"$$) || '\"' end" ; xmlColumnTemplate = "case when $(tableAlias).\"$(columnName)\" is null then '' else '\"' || replace(replace(cast($(tableAlias).\"$(columnName)\" as varchar),$$\\$$,$$\\\\$$),'\"',$$\\\"$$) || '\"' end" ; diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/db/AbstractTriggerTemplate.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/db/AbstractTriggerTemplate.java index c3362fd4ef..126e19be64 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/db/AbstractTriggerTemplate.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/db/AbstractTriggerTemplate.java @@ -88,6 +88,8 @@ abstract public class AbstractTriggerTemplate { protected String dateTimeWithLocalTimeZoneColumnTemplate; protected String geometryColumnTemplate; + + protected String geographyColumnTemplate; protected String clobColumnTemplate; @@ -716,7 +718,13 @@ protected ColumnString fillOutColumnTemplate(String origTableAlias, String table && (column.getJdbcTypeName().toUpperCase().contains(TypeMap.GEOMETRY)) && StringUtils.isNotBlank(geometryColumnTemplate)) { templateToUse = geometryColumnTemplate; - } else { + } + else if (column.getJdbcTypeName() != null + && (column.getJdbcTypeName().toUpperCase().contains(TypeMap.GEOGRAPHY)) + && StringUtils.isNotBlank(geographyColumnTemplate)) { + templateToUse = geographyColumnTemplate; + } + else { switch (column.getMappedTypeCode()) { case Types.TINYINT: case Types.SMALLINT: diff --git a/symmetric-db/src/main/java/org/jumpmind/db/model/TypeMap.java b/symmetric-db/src/main/java/org/jumpmind/db/model/TypeMap.java index 9bb03324ec..69dc87b6d3 100644 --- a/symmetric-db/src/main/java/org/jumpmind/db/model/TypeMap.java +++ b/symmetric-db/src/main/java/org/jumpmind/db/model/TypeMap.java @@ -103,6 +103,7 @@ public abstract class TypeMap public static final String SQLXML = "SQLXML"; public static final String GEOMETRY = "GEOMETRY"; + public static final String GEOGRAPHY = "GEOGRAPHY"; public static final String POINT = "POINT"; public static final String LINESTRING = "LINESTRING"; public static final String POLYGON = "POLYGON"; diff --git a/symmetric-db/src/main/java/org/jumpmind/db/platform/AbstractDatabasePlatform.java b/symmetric-db/src/main/java/org/jumpmind/db/platform/AbstractDatabasePlatform.java index c015caa3c8..48bbdb75cb 100644 --- a/symmetric-db/src/main/java/org/jumpmind/db/platform/AbstractDatabasePlatform.java +++ b/symmetric-db/src/main/java/org/jumpmind/db/platform/AbstractDatabasePlatform.java @@ -398,6 +398,8 @@ protected Object getObjectValue(String value, Column column, BinaryEncoding enco objectValue = value.equals("1") ? Boolean.TRUE : Boolean.FALSE; } else if (!(column.getJdbcTypeName() != null && column.getJdbcTypeName().toUpperCase() .contains(TypeMap.GEOMETRY)) + && !(column.getJdbcTypeName() != null && column.getJdbcTypeName().toUpperCase() + .contains(TypeMap.GEOGRAPHY)) && (type == Types.BLOB || type == Types.LONGVARBINARY || type == Types.BINARY || type == Types.VARBINARY || // SQLServer ntext type diff --git a/symmetric-db/src/main/java/org/jumpmind/db/platform/mysql/MySqlDmlStatement.java b/symmetric-db/src/main/java/org/jumpmind/db/platform/mysql/MySqlDmlStatement.java index ea4b4a539b..99bf9a1d45 100644 --- a/symmetric-db/src/main/java/org/jumpmind/db/platform/mysql/MySqlDmlStatement.java +++ b/symmetric-db/src/main/java/org/jumpmind/db/platform/mysql/MySqlDmlStatement.java @@ -36,7 +36,9 @@ public MySqlDmlStatement(DmlType type, String catalogName, String schemaName, St @Override protected void appendColumnQuestion(StringBuilder sql, Column column) { - if (column.getJdbcTypeName() != null && column.getJdbcTypeName().toUpperCase().contains(TypeMap.GEOMETRY)) { + if (column.getJdbcTypeName() != null && + (column.getJdbcTypeName().toUpperCase().contains(TypeMap.GEOMETRY) + || column.getJdbcTypeName().toUpperCase().contains(TypeMap.GEOGRAPHY))) { sql.append("geomfromtext(?)").append(","); } else { super.appendColumnQuestion(sql, column); @@ -45,7 +47,8 @@ protected void appendColumnQuestion(StringBuilder sql, Column column) { @Override protected void appendColumnEquals(StringBuilder sql, Column column) { - if (column.getJdbcTypeName().toUpperCase().contains(TypeMap.GEOMETRY)) { + if (column.getJdbcTypeName().toUpperCase().contains(TypeMap.GEOMETRY) + || column.getJdbcTypeName().toUpperCase().contains(TypeMap.GEOGRAPHY)) { sql.append(quote).append(column.getName()).append(quote).append(" = ") .append("geomfromtext(?)"); } else { diff --git a/symmetric-db/src/main/java/org/jumpmind/db/platform/oracle/OracleDmlStatement.java b/symmetric-db/src/main/java/org/jumpmind/db/platform/oracle/OracleDmlStatement.java index 9e5b6f657f..20959412b4 100644 --- a/symmetric-db/src/main/java/org/jumpmind/db/platform/oracle/OracleDmlStatement.java +++ b/symmetric-db/src/main/java/org/jumpmind/db/platform/oracle/OracleDmlStatement.java @@ -42,7 +42,9 @@ protected void appendColumnQuestion(StringBuilder sql, Column column) { if (column.isTimestampWithTimezone()) { sql.append("TO_TIMESTAMP_TZ(?, 'YYYY-MM-DD HH24:MI:SS.FF TZH:TZM')") .append(","); - } else if (name != null && name.toUpperCase().contains(TypeMap.GEOMETRY)) { + } else if (name != null && ( + name.toUpperCase().contains(TypeMap.GEOMETRY) || + name.toUpperCase().contains(TypeMap.GEOGRAPHY))) { sql.append("SYM_WKT2GEOM(?)").append(","); } else { super.appendColumnQuestion(sql, column); @@ -54,7 +56,8 @@ protected void appendColumnEquals(StringBuilder sql, Column column) { if (column.isTimestampWithTimezone()) { sql.append(quote).append(column.getName()).append(quote) .append(" = TO_TIMESTAMP_TZ(?, 'YYYY-MM-DD HH24:MI:SS.FF TZH:TZM')"); - } else if (column.getJdbcTypeName().toUpperCase().contains(TypeMap.GEOMETRY)) { + } else if (column.getJdbcTypeName().toUpperCase().contains(TypeMap.GEOMETRY) || + column.getJdbcTypeName().toUpperCase().contains(TypeMap.GEOGRAPHY)) { sql.append(quote).append(column.getName()).append(quote).append(" = ") .append("SYM_WKT2GEOM(?)"); } else { diff --git a/symmetric-db/src/main/java/org/jumpmind/db/platform/postgresql/PostgreSqlDmlStatement.java b/symmetric-db/src/main/java/org/jumpmind/db/platform/postgresql/PostgreSqlDmlStatement.java index 6f681d79dd..a76eb64821 100644 --- a/symmetric-db/src/main/java/org/jumpmind/db/platform/postgresql/PostgreSqlDmlStatement.java +++ b/symmetric-db/src/main/java/org/jumpmind/db/platform/postgresql/PostgreSqlDmlStatement.java @@ -121,7 +121,9 @@ protected void appendColumnQuestion(StringBuilder sql, Column column) { sql.append("cast(? as bit varying)").append(","); } else if (column.getJdbcTypeName() != null && column.getJdbcTypeName().toUpperCase().contains(TypeMap.INTERVAL)) { sql.append("cast(? as interval)").append(","); - } else if (column.getJdbcTypeName() != null && column.getJdbcTypeName().toUpperCase().contains(TypeMap.GEOMETRY)) { + } else if (column.getJdbcTypeName() != null && ( + column.getJdbcTypeName().toUpperCase().contains(TypeMap.GEOMETRY) || + column.getJdbcTypeName().toUpperCase().contains(TypeMap.GEOGRAPHY))) { sql.append("ST_GEOMFROMTEXT(?)").append(","); } else { super.appendColumnQuestion(sql, column); @@ -142,7 +144,8 @@ protected void appendColumnEquals(StringBuilder sql, Column column) { } else if (column.getJdbcTypeName().toUpperCase().contains(TypeMap.INTERVAL)) { sql.append(quote).append(column.getName()).append(quote) .append(" = cast(? as interval)"); - } else if (column.getJdbcTypeName().toUpperCase().contains(TypeMap.GEOMETRY)) { + } else if (column.getJdbcTypeName().toUpperCase().contains(TypeMap.GEOMETRY) || + column.getJdbcTypeName().toUpperCase().contains(TypeMap.GEOGRAPHY)) { sql.append(quote).append(column.getName()).append(quote) .append(" = ST_GEOMFROMTEXT(?)"); } else {