Browse Source

SONAR-15845 Upgrade H2 database dependency to 2.X

tags/9.4.0.54424
Jacek 2 years ago
parent
commit
bf5f5f91ed
17 changed files with 573 additions and 566 deletions
  1. 1
    2
      build.gradle
  2. 2
    2
      server/sonar-db-core/src/main/java/org/sonar/db/DefaultDatabase.java
  3. 3
    3
      server/sonar-db-core/src/test/java/org/sonar/db/DefaultDatabaseTest.java
  4. 2
    1
      server/sonar-db-core/src/testFixtures/java/org/sonar/db/CoreH2Database.java
  5. 1
    0
      server/sonar-db-core/src/testFixtures/java/org/sonar/db/CoreTestDb.java
  6. 540
    540
      server/sonar-db-dao/src/schema/schema-sq.ddl
  7. 2
    1
      server/sonar-db-dao/src/testFixtures/java/org/sonar/db/SQDatabase.java
  8. 3
    3
      server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/sql/CreateTableAsBuilder.java
  9. 1
    1
      server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/sql/DbPrimaryKeyConstraintFinder.java
  10. 1
    1
      server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/sql/DbPrimaryKeyConstraintFinderTest.java
  11. 6
    2
      server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v00/CreateInitialSchemaTest.java
  12. 2
    2
      server/sonar-main/src/main/java/org/sonar/application/config/JdbcSettings.java
  13. 1
    1
      server/sonar-main/src/test/java/org/sonar/application/config/JdbcSettingsTest.java
  14. 4
    4
      server/sonar-server-common/src/test/java/org/sonar/server/platform/monitoring/DbSectionTest.java
  15. 2
    1
      server/sonar-webserver-core/src/main/java/org/sonar/server/platform/db/EmbeddedDatabase.java
  16. 1
    1
      server/sonar-webserver-core/src/test/java/org/sonar/server/platform/db/EmbeddedDatabaseTest.java
  17. 1
    1
      server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/WebIssueStorageTest.java

+ 1
- 2
build.gradle View File

@@ -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'
}

+ 2
- 2
server/sonar-db-core/src/main/java/org/sonar/db/DefaultDatabase.java View File

@@ -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";

+ 3
- 3
server/sonar-db-core/src/test/java/org/sonar/db/DefaultDatabaseTest.java View File

@@ -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");

+ 2
- 1
server/sonar-db-core/src/testFixtures/java/org/sonar/db/CoreH2Database.java View File

@@ -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

+ 1
- 0
server/sonar-db-core/src/testFixtures/java/org/sonar/db/CoreTestDb.java View File

@@ -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 -> {

+ 540
- 540
server/sonar-db-dao/src/schema/schema-sq.ddl
File diff suppressed because it is too large
View File


+ 2
- 1
server/sonar-db-dao/src/testFixtures/java/org/sonar/db/SQDatabase.java View File

@@ -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);

+ 3
- 3
server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/sql/CreateTableAsBuilder.java View File

@@ -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;

+ 1
- 1
server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/sql/DbPrimaryKeyConstraintFinder.java View File

@@ -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));
}


+ 1
- 1
server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/sql/DbPrimaryKeyConstraintFinderTest.java View File

@@ -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'");
}
}

+ 6
- 2
server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v00/CreateInitialSchemaTest.java View File

@@ -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",

+ 2
- 2
server/sonar-main/src/main/java/org/sonar/application/config/JdbcSettings.java View File

@@ -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) {

+ 1
- 1
server/sonar-main/src/test/java/org/sonar/application/config/JdbcSettingsTest.java View File

@@ -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

+ 4
- 4
server/sonar-server-common/src/test/java/org/sonar/server/platform/monitoring/DbSectionTest.java View File

@@ -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.");
}
}

+ 2
- 1
server/sonar-webserver-core/src/main/java/org/sonar/server/platform/db/EmbeddedDatabase.java View File

@@ -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();

+ 1
- 1
server/sonar-webserver-core/src/test/java/org/sonar/server/platform/db/EmbeddedDatabaseTest.java View File

@@ -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) {

+ 1
- 1
server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/WebIssueStorageTest.java View File

@@ -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())

Loading…
Cancel
Save