diff --git a/symmetric-client/src/main/java/org/jumpmind/symmetric/db/mssql/MsSqlSymmetricDialect.java b/symmetric-client/src/main/java/org/jumpmind/symmetric/db/mssql/MsSqlSymmetricDialect.java index 3097057e2e..f4599c6642 100644 --- a/symmetric-client/src/main/java/org/jumpmind/symmetric/db/mssql/MsSqlSymmetricDialect.java +++ b/symmetric-client/src/main/java/org/jumpmind/symmetric/db/mssql/MsSqlSymmetricDialect.java @@ -29,11 +29,13 @@ import org.jumpmind.db.platform.IDatabasePlatform; import org.jumpmind.db.sql.IConnectionCallback; +import org.jumpmind.db.sql.ISqlTemplate; import org.jumpmind.db.sql.ISqlTransaction; import org.jumpmind.db.sql.JdbcSqlTemplate; import org.jumpmind.db.sql.JdbcSqlTransaction; import org.jumpmind.db.sql.SqlException; import org.jumpmind.db.util.BinaryEncoding; +import org.jumpmind.symmetric.SymmetricException; import org.jumpmind.symmetric.common.ParameterConstants; import org.jumpmind.symmetric.db.AbstractSymmetricDialect; import org.jumpmind.symmetric.db.ISymmetricDialect; @@ -64,6 +66,15 @@ public MsSqlSymmetricDialect(IParameterService parameterService, IDatabasePlatfo this.triggerTemplate = new MsSqlTriggerTemplate(this); } + @Override + public void verifyDatabaseIsCompatible() { + super.verifyDatabaseIsCompatible(); + ISqlTemplate template = getPlatform().getSqlTemplate(); + if (template.queryForInt("select case when (512 & @@options) = 512 then 1 else 0 end") == 1) { + throw new SymmetricException("NOCOUNT is currently turned ON. SymmetricDS will not function with NOCOUNT turned ON."); + } + } + @Override protected void createRequiredDatabaseObjects() { String encode = this.parameterService.getTablePrefix() + "_" + "base64_encode"; diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/AbstractSymmetricEngine.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/AbstractSymmetricEngine.java index 89b1d1f507..7820d13bec 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/AbstractSymmetricEngine.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/AbstractSymmetricEngine.java @@ -496,6 +496,7 @@ public synchronized boolean start(boolean startJobs) { if (!starting && !started) { try { starting = true; + symmetricDialect.verifyDatabaseIsCompatible(); setup(); if (isConfigured()) { Node node = nodeService.findIdentity(); diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/db/AbstractSymmetricDialect.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/db/AbstractSymmetricDialect.java index a6a97c5543..d3044efb27 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/db/AbstractSymmetricDialect.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/db/AbstractSymmetricDialect.java @@ -141,6 +141,9 @@ public int getMaxTriggerNameLength() { return max < MAX_SYMMETRIC_SUPPORTED_TRIGGER_SIZE && max > 0 ? max : MAX_SYMMETRIC_SUPPORTED_TRIGGER_SIZE; } + + public void verifyDatabaseIsCompatible() { + } public void initTablesAndDatabaseObjects() { createOrAlterTablesIfNecessary(); diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/db/ISymmetricDialect.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/db/ISymmetricDialect.java index 600a628cb9..40390b3fec 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/db/ISymmetricDialect.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/db/ISymmetricDialect.java @@ -54,7 +54,9 @@ public void createTrigger(StringBuilder sqlBuffer, DataEventType dml, public void removeTrigger(StringBuilder sqlBuffer, String catalogName, String schemaName, String triggerName, String tableName, TriggerHistory oldHistory); - public boolean doesTriggerExist(String catalogName, String schema, String tableName, String triggerName); + public boolean doesTriggerExist(String catalogName, String schema, String tableName, String triggerName); + + public void verifyDatabaseIsCompatible(); public void initTablesAndDatabaseObjects(); diff --git a/symmetric-core/src/main/resources/symmetric-default.properties b/symmetric-core/src/main/resources/symmetric-default.properties index a5ccacc584..11fdd0d65f 100644 --- a/symmetric-core/src/main/resources/symmetric-default.properties +++ b/symmetric-core/src/main/resources/symmetric-default.properties @@ -92,6 +92,11 @@ db.validation.query= # Tags: database db.connection.properties= +# Specify a SQL statement that will be run when a database connection is created +# +# Tags: database +db.init.sql= + # When symmetric tables are created and accessed, this is the prefix to use for the tables. # # Tags: database diff --git a/symmetric-jdbc/src/main/java/org/jumpmind/db/util/BasicDataSourceFactory.java b/symmetric-jdbc/src/main/java/org/jumpmind/db/util/BasicDataSourceFactory.java index a557cb0623..1495909ec0 100644 --- a/symmetric-jdbc/src/main/java/org/jumpmind/db/util/BasicDataSourceFactory.java +++ b/symmetric-jdbc/src/main/java/org/jumpmind/db/util/BasicDataSourceFactory.java @@ -20,6 +20,9 @@ */ package org.jumpmind.db.util; +import java.util.ArrayList; +import java.util.List; + import org.apache.commons.dbcp.BasicDataSource; import org.apache.commons.lang.StringUtils; import org.jumpmind.properties.TypedProperties; @@ -85,6 +88,13 @@ public static BasicDataSource create(TypedProperties properties, } } } + + String initSql = properties.get(BasicDataSourcePropertyConstants.DB_POOL_INIT_SQL, null); + if (StringUtils.isNotBlank(initSql)) { + List initSqlList = new ArrayList(1); + initSqlList.add(initSql); + dataSource.setConnectionInitSqls(initSqlList); + } return dataSource; } diff --git a/symmetric-jdbc/src/main/java/org/jumpmind/db/util/BasicDataSourcePropertyConstants.java b/symmetric-jdbc/src/main/java/org/jumpmind/db/util/BasicDataSourcePropertyConstants.java index 08857be48a..a596465e9d 100644 --- a/symmetric-jdbc/src/main/java/org/jumpmind/db/util/BasicDataSourcePropertyConstants.java +++ b/symmetric-jdbc/src/main/java/org/jumpmind/db/util/BasicDataSourcePropertyConstants.java @@ -43,6 +43,7 @@ private BasicDataSourcePropertyConstants() { public final static String DB_POOL_TEST_ON_BORROW = "db.test.on.borrow"; public final static String DB_POOL_TEST_ON_RETURN = "db.test.on.return"; public final static String DB_POOL_TEST_WHILE_IDLE = "db.test.while.idle"; + public final static String DB_POOL_INIT_SQL = "db.init.sql"; public final static String DB_POOL_CONNECTION_PROPERTIES = "db.connection.properties"; } \ No newline at end of file