diff options
author | David Pursehouse <dpursehouse@collab.net> | 2020-02-12 15:31:28 +0900 |
---|---|---|
committer | Luca Milanesio <luca.milanesio@gmail.com> | 2020-03-18 13:16:08 +0000 |
commit | a009567e10f9a29e797ec6c66c07cb0397523d88 (patch) | |
tree | cacff9e851d088c2a7ef5d3a3867418459df3f16 | |
parent | 5f73fd6555f59c1ae046ca3195c63e0a73521261 (diff) |
Schema_151: Attempt to add created_on column if it doesn't exist
If the created_on column does not exist, attempt to create it.
This allows the direct migration from 2.14 to 2.16 to succeed
without requiring an intermediate migration to 2.15.
Bug: Issue 10248
Change-Id: I626f1e26d43b60c3fd62ef3ef9ce3d7047c1a383
-rw-r--r-- | java/com/google/gerrit/server/schema/Schema_151.java | 26 | ||||
-rw-r--r-- | javatests/com/google/gerrit/server/schema/Schema_150_to_151_Test.java | 12 |
2 files changed, 38 insertions, 0 deletions
diff --git a/java/com/google/gerrit/server/schema/Schema_151.java b/java/com/google/gerrit/server/schema/Schema_151.java index 41d8a32cea..bab9f414a4 100644 --- a/java/com/google/gerrit/server/schema/Schema_151.java +++ b/java/com/google/gerrit/server/schema/Schema_151.java @@ -14,11 +14,15 @@ package com.google.gerrit.server.schema; +import com.google.common.annotations.VisibleForTesting; import com.google.gerrit.reviewdb.client.AccountGroup; import com.google.gerrit.reviewdb.server.ReviewDb; +import com.google.gwtorm.jdbc.JdbcSchema; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; +import java.sql.Connection; +import java.sql.DatabaseMetaData; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; @@ -26,6 +30,7 @@ import java.sql.Statement; import java.sql.Timestamp; import java.util.ArrayList; import java.util.List; +import java.util.Locale; import java.util.Optional; /** A schema which adds the 'created on' field to groups. */ @@ -37,6 +42,13 @@ public class Schema_151 extends SchemaVersion { @Override protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, SQLException { + Connection connection = ((JdbcSchema) db).getConnection(); + if (!createdOnColumnExists(connection)) { + try (Statement stmt = connection.createStatement()) { + stmt.execute("ALTER TABLE account_groups ADD COLUMN created_on TIMESTAMP NULL"); + } + } + try (PreparedStatement groupUpdate = prepareStatement(db, "UPDATE account_groups SET created_on = ? WHERE group_id = ?"); PreparedStatement addedOnRetrieval = @@ -56,6 +68,20 @@ public class Schema_151 extends SchemaVersion { } } + @VisibleForTesting + public static boolean createdOnColumnExists(Connection connection) throws SQLException { + DatabaseMetaData metaData = connection.getMetaData(); + boolean toUpper = metaData.storesUpperCaseIdentifiers(); + return metaData + .getColumns( + null, null, convertCase(toUpper, "account_groups"), convertCase(toUpper, "created_on")) + .next(); + } + + private static String convertCase(boolean toUpper, String input) { + return toUpper ? input.toUpperCase(Locale.US) : input; + } + private static Optional<Timestamp> getFirstTimeMentioned( PreparedStatement addedOnRetrieval, AccountGroup.Id groupId) throws SQLException { addedOnRetrieval.setInt(1, groupId.get()); diff --git a/javatests/com/google/gerrit/server/schema/Schema_150_to_151_Test.java b/javatests/com/google/gerrit/server/schema/Schema_150_to_151_Test.java index 4d5db6da3b..2e268ee620 100644 --- a/javatests/com/google/gerrit/server/schema/Schema_150_to_151_Test.java +++ b/javatests/com/google/gerrit/server/schema/Schema_150_to_151_Test.java @@ -16,6 +16,7 @@ package com.google.gerrit.server.schema; import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.TruthJUnit.assume; +import static com.google.gerrit.server.schema.Schema_151.createdOnColumnExists; import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.reviewdb.client.AccountGroup; @@ -151,6 +152,17 @@ public class Schema_150_to_151_Test { assertThat(createdOn).isEqualTo(AccountGroup.auditCreationInstantTs()); } + @Test + public void createdOnIsAddedWhenItIsMissing() throws Exception { + assertThat(createdOnColumnExists(connection)).isTrue(); + try (Statement deleteColumn = connection.createStatement()) { + deleteColumn.execute("ALTER TABLE account_groups DROP COLUMN created_on"); + } + assertThat(createdOnColumnExists(connection)).isFalse(); + schema151.migrateData(db, new TestUpdateUI()); + assertThat(createdOnColumnExists(connection)).isTrue(); + } + private AccountGroup.Id createGroupInReviewDb(String name) throws Exception { AccountGroup group = new AccountGroup( |