summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Pursehouse <dpursehouse@collab.net>2020-02-12 15:31:28 +0900
committerLuca Milanesio <luca.milanesio@gmail.com>2020-03-18 13:16:08 +0000
commita009567e10f9a29e797ec6c66c07cb0397523d88 (patch)
treecacff9e851d088c2a7ef5d3a3867418459df3f16
parent5f73fd6555f59c1ae046ca3195c63e0a73521261 (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.java26
-rw-r--r--javatests/com/google/gerrit/server/schema/Schema_150_to_151_Test.java12
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(