@@ -321,8 +321,7 @@ subprojects { | |||
exclude 'org.codehaus.mojo:animal-sniffer-annotations' | |||
} | |||
dependency "com.google.protobuf:protobuf-java:${protobufVersion}" | |||
// Do not upgrade H2 to 1.4.200 because of instability: https://github.com/h2database/h2database/issues/2205 | |||
dependency 'com.h2database:h2:1.4.199' | |||
dependency 'com.h2database:h2:2.1.210' | |||
dependencySet(group: 'com.hazelcast', version: '4.2.2') { | |||
entry 'hazelcast' | |||
} |
@@ -49,10 +49,10 @@ import static org.sonar.process.ProcessProperties.Property.JDBC_URL; | |||
* @since 2.12 | |||
*/ | |||
public class DefaultDatabase implements Database { | |||
private static final String IGNORED_KEYWORDS_OPTION = ";NON_KEYWORDS=VALUE"; | |||
private static final Logger LOG = Loggers.get(Database.class); | |||
private static final String DEFAULT_URL = "jdbc:h2:tcp://localhost/sonar"; | |||
private static final String DEFAULT_URL = "jdbc:h2:tcp://localhost/sonar" + IGNORED_KEYWORDS_OPTION; | |||
private static final String SONAR_JDBC = "sonar.jdbc."; | |||
private static final String SONAR_JDBC_DIALECT = "sonar.jdbc.dialect"; | |||
private static final String SONAR_JDBC_DRIVER = "sonar.jdbc.driverClassName"; |
@@ -48,9 +48,9 @@ public class DefaultDatabaseTest { | |||
db.initSettings(); | |||
Properties props = db.getProperties(); | |||
assertThat(props.getProperty("sonar.jdbc.url")).isEqualTo("jdbc:h2:tcp://localhost/sonar"); | |||
assertThat(props.getProperty("sonar.jdbc.url")).isEqualTo("jdbc:h2:tcp://localhost/sonar;NON_KEYWORDS=VALUE"); | |||
assertThat(props.getProperty("sonar.jdbc.driverClassName")).isEqualTo("org.h2.Driver"); | |||
assertThat(db).hasToString("Database[jdbc:h2:tcp://localhost/sonar]"); | |||
assertThat(db).hasToString("Database[jdbc:h2:tcp://localhost/sonar;NON_KEYWORDS=VALUE]"); | |||
} | |||
@Test | |||
@@ -113,7 +113,7 @@ public class DefaultDatabaseTest { | |||
@Test | |||
public void shouldStart() { | |||
MapSettings settings = new MapSettings(); | |||
settings.setProperty("sonar.jdbc.url", "jdbc:h2:mem:sonar"); | |||
settings.setProperty("sonar.jdbc.url", "jdbc:h2:mem:sonar;NON_KEYWORDS=VALUE"); | |||
settings.setProperty("sonar.jdbc.driverClassName", "org.h2.Driver"); | |||
settings.setProperty("sonar.jdbc.username", "sonar"); | |||
settings.setProperty("sonar.jdbc.password", "sonar"); |
@@ -36,6 +36,7 @@ import static java.lang.String.format; | |||
* H2 in-memory database, used for unit tests only against an empty DB or a provided H2 SQL script. | |||
*/ | |||
public class CoreH2Database implements Database { | |||
private static final String IGNORED_KEYWORDS_OPTION = ";NON_KEYWORDS=VALUE"; | |||
private final String name; | |||
private BasicDataSource datasource; | |||
@@ -43,7 +44,7 @@ public class CoreH2Database implements Database { | |||
* IMPORTANT: change DB name in order to not conflict with {@link DefaultDatabaseTest} | |||
*/ | |||
public CoreH2Database(String name) { | |||
this.name = name; | |||
this.name = name + IGNORED_KEYWORDS_OPTION; | |||
} | |||
@Override |
@@ -91,6 +91,7 @@ class CoreTestDb implements TestDb { | |||
if (!databaseToUpper) { | |||
name = name + ";DATABASE_TO_UPPER=FALSE"; | |||
} | |||
name = name + ";NON_KEYWORDS=VALUE"; | |||
return new CoreH2Database(name); | |||
}; | |||
Consumer<Database> databaseInitializer = database -> { |
@@ -56,6 +56,7 @@ import org.sonar.server.platform.db.migration.version.DbVersion; | |||
import static com.google.common.base.Preconditions.checkState; | |||
public class SQDatabase extends DefaultDatabase { | |||
private static final String IGNORED_KEYWORDS_OPTION = ";NON_KEYWORDS=VALUE"; | |||
private final boolean createSchema; | |||
private SQDatabase(Settings settings, boolean createSchema) { | |||
@@ -71,7 +72,7 @@ public class SQDatabase extends DefaultDatabase { | |||
MapSettings settings = new MapSettings() | |||
.setProperty("sonar.jdbc.dialect", "h2") | |||
.setProperty("sonar.jdbc.driverClassName", "org.h2.Driver") | |||
.setProperty("sonar.jdbc.url", "jdbc:h2:mem:" + name) | |||
.setProperty("sonar.jdbc.url", "jdbc:h2:mem:" + name + IGNORED_KEYWORDS_OPTION) | |||
.setProperty("sonar.jdbc.username", "sonar") | |||
.setProperty("sonar.jdbc.password", "sonar"); | |||
return new SQDatabase(settings, createSchema); |
@@ -43,7 +43,7 @@ public class CreateTableAsBuilder { | |||
private final Dialect dialect; | |||
private final String tableName; | |||
private final String fromTableName; | |||
private List<Column> columns = new ArrayList<>(); | |||
private final List<Column> columns = new ArrayList<>(); | |||
public CreateTableAsBuilder(Dialect dialect, String tableName, String fromTableName) { | |||
this.dialect = requireNonNull(dialect, "dialect can't be null"); | |||
@@ -99,8 +99,8 @@ public class CreateTableAsBuilder { | |||
} | |||
private static class Column { | |||
private ColumnDef columnDef; | |||
private String castFrom; | |||
private final ColumnDef columnDef; | |||
private final String castFrom; | |||
public Column(ColumnDef columnDef, @Nullable String castFrom) { | |||
this.columnDef = columnDef; |
@@ -109,7 +109,7 @@ public class DbPrimaryKeyConstraintFinder { | |||
private static String getH2ConstraintQuery(String tableName) { | |||
return format("SELECT constraint_name " | |||
+ "FROM information_schema.constraints " | |||
+ "FROM information_schema.table_constraints " | |||
+ "WHERE table_name = '%s' and constraint_type = 'PRIMARY KEY'", tableName.toUpperCase(Locale.ENGLISH)); | |||
} | |||
@@ -97,6 +97,6 @@ public class DbPrimaryKeyConstraintFinderTest { | |||
when(dbMock.getDialect()).thenReturn(H2); | |||
assertThat(underTest.getDbVendorSpecificQuery("my_table")) | |||
.isEqualTo("SELECT constraint_name FROM information_schema.constraints WHERE table_name = 'MY_TABLE' and constraint_type = 'PRIMARY KEY'"); | |||
.isEqualTo("SELECT constraint_name FROM information_schema.table_constraints WHERE table_name = 'MY_TABLE' and constraint_type = 'PRIMARY KEY'"); | |||
} | |||
} |
@@ -35,7 +35,7 @@ public class CreateInitialSchemaTest { | |||
@Rule | |||
public final CoreDbTester dbTester = CoreDbTester.createForSchema(CreateInitialSchemaTest.class, "empty.sql"); | |||
private CreateInitialSchema underTest = new CreateInitialSchema(dbTester.database()); | |||
private final CreateInitialSchema underTest = new CreateInitialSchema(dbTester.database()); | |||
@Test | |||
public void creates_tables_on_empty_db() throws Exception { | |||
@@ -46,9 +46,13 @@ public class CreateInitialSchemaTest { | |||
ResultSet rs = connection.getMetaData().getTables(null, null, null, new String[] {"TABLE"})) { | |||
while (rs.next()) { | |||
tables.add(rs.getString("TABLE_NAME").toLowerCase(Locale.ENGLISH)); | |||
String schema = rs.getString("TABLE_SCHEM"); | |||
if (!"INFORMATION_SCHEMA".equalsIgnoreCase(schema)) { | |||
tables.add(rs.getString("TABLE_NAME").toLowerCase(Locale.ENGLISH)); | |||
} | |||
} | |||
} | |||
assertThat(tables).containsOnly( | |||
"active_rules", | |||
"active_rule_parameters", |
@@ -43,7 +43,7 @@ import static org.sonar.process.ProcessProperties.Property.JDBC_URL; | |||
import static org.sonar.process.ProcessProperties.Property.PATH_HOME; | |||
public class JdbcSettings implements Consumer<Props> { | |||
private static final String IGNORED_KEYWORDS_OPTION = ";NON_KEYWORDS=VALUE"; | |||
private static final int JDBC_EMBEDDED_PORT_DEFAULT_VALUE = 9092; | |||
enum Provider { | |||
@@ -119,7 +119,7 @@ public class JdbcSettings implements Consumer<Props> { | |||
} else { | |||
host = ip.getHostAddress(); | |||
} | |||
return format("jdbc:h2:tcp://%s:%d/sonar", host, embeddedDatabasePort); | |||
return format("jdbc:h2:tcp://%s:%d/sonar%s", host, embeddedDatabasePort, IGNORED_KEYWORDS_OPTION); | |||
} | |||
private static void warnIfUrlIsSet(int port, String existing, String expectedUrl) { |
@@ -56,7 +56,7 @@ public class JdbcSettingsTest { | |||
assertThat(underTest.resolveProviderAndEnforceNonnullJdbcUrl(props)) | |||
.isEqualTo(Provider.H2); | |||
assertThat(props.nonNullValue(JDBC_URL.getKey())).isEqualTo(String.format("jdbc:h2:tcp://%s:9092/sonar", InetAddress.getLoopbackAddress().getHostAddress())); | |||
assertThat(props.nonNullValue(JDBC_URL.getKey())).isEqualTo(String.format("jdbc:h2:tcp://%s:9092/sonar;NON_KEYWORDS=VALUE", InetAddress.getLoopbackAddress().getHostAddress())); | |||
} | |||
@Test |
@@ -31,16 +31,16 @@ import static org.sonar.process.systeminfo.SystemInfoUtils.attribute; | |||
public class DbSectionTest { | |||
@Rule | |||
public DbTester dbTester = DbTester.create(System2.INSTANCE); | |||
public final DbTester dbTester = DbTester.create(System2.INSTANCE); | |||
private DbSection underTest = new DbSection(dbTester.getDbClient()); | |||
private final DbSection underTest = new DbSection(dbTester.getDbClient()); | |||
@Test | |||
public void db_info() { | |||
ProtobufSystemInfo.Section section = underTest.toProtobuf(); | |||
SystemInfoTesting.assertThatAttributeIs(section, "Database", "H2"); | |||
assertThat(attribute(section, "Database Version").getStringValue()).startsWith("1."); | |||
assertThat(attribute(section, "Database Version").getStringValue()).startsWith("2."); | |||
SystemInfoTesting.assertThatAttributeIs(section, "Username", "SONAR"); | |||
assertThat(attribute(section, "Driver Version").getStringValue()).startsWith("1."); | |||
assertThat(attribute(section, "Driver Version").getStringValue()).startsWith("2."); | |||
} | |||
} |
@@ -41,6 +41,7 @@ import static org.sonar.process.ProcessProperties.Property.JDBC_USERNAME; | |||
import static org.sonar.process.ProcessProperties.Property.PATH_DATA; | |||
public class EmbeddedDatabase implements Startable { | |||
private static final String IGNORED_KEYWORDS_OPTION = ";NON_KEYWORDS=VALUE"; | |||
private static final Logger LOG = Loggers.get(EmbeddedDatabase.class); | |||
private final Configuration config; | |||
@@ -108,7 +109,7 @@ public class EmbeddedDatabase implements Startable { | |||
} | |||
private static void createDatabase(File dbHome, String user, String password) throws SQLException { | |||
String url = format("jdbc:h2:%s/sonar;USER=%s;PASSWORD=%s", dbHome.getAbsolutePath(), user, password); | |||
String url = format("jdbc:h2:%s/sonar;USER=%s;PASSWORD=%s%s", dbHome.getAbsolutePath(), user, password, IGNORED_KEYWORDS_OPTION); | |||
DriverManager.registerDriver(new Driver()); | |||
DriverManager.getConnection(url).close(); |
@@ -151,7 +151,7 @@ public class EmbeddedDatabaseTest { | |||
private void checkDbIsUp(int port, String user, String password) { | |||
try { | |||
String driverUrl = String.format("jdbc:h2:tcp://%s:%d/sonar;USER=%s;PASSWORD=%s", LOOPBACK_ADDRESS, port, user, password); | |||
String driverUrl = String.format("jdbc:h2:tcp://%s:%d/sonar;USER=%s;PASSWORD=%s;NON_KEYWORDS=VALUE", LOOPBACK_ADDRESS, port, user, password); | |||
DriverManager.registerDriver(new Driver()); | |||
DriverManager.getConnection(driverUrl).close(); | |||
} catch (Exception ex) { |
@@ -199,7 +199,7 @@ public class WebIssueStorageTest { | |||
.containsEntry("COMPONENT_UUID", issue.componentUuid()) | |||
.containsEntry("EFFORT", updated.effortInMinutes()) | |||
.containsEntry("ISSUE_ATTRIBUTES", "fox=bax") | |||
.containsEntry("ISSUE_TYPE", 3) | |||
.containsEntry("ISSUE_TYPE", 3L) | |||
.containsEntry("KEE", issue.key()) | |||
.containsEntry("LINE", (long) updated.line()) | |||
.containsEntry("PROJECT_UUID", updated.projectUuid()) |