From 0b2bd218c88655f24bc541086dfee18d3364a9e1 Mon Sep 17 00:00:00 2001 From: Simon Brandhof Date: Tue, 13 Feb 2018 20:18:49 +0100 Subject: SONAR-10356 Oracle error on some WS involving more than 1000 projects --- .../src/main/java/org/sonar/db/DatabaseUtils.java | 11 +++++++++++ .../src/test/java/org/sonar/db/DatabaseUtilsTest.java | 16 ++++++++++++++++ 2 files changed, 27 insertions(+) (limited to 'server/sonar-db-core/src') diff --git a/server/sonar-db-core/src/main/java/org/sonar/db/DatabaseUtils.java b/server/sonar-db-core/src/main/java/org/sonar/db/DatabaseUtils.java index 243436a84a3..9b850e40f65 100644 --- a/server/sonar-db-core/src/main/java/org/sonar/db/DatabaseUtils.java +++ b/server/sonar-db-core/src/main/java/org/sonar/db/DatabaseUtils.java @@ -47,6 +47,7 @@ import javax.annotation.Nullable; import org.sonar.api.utils.log.Logger; import org.sonar.api.utils.log.Loggers; +import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.collect.Lists.newArrayList; import static java.lang.String.format; @@ -338,4 +339,14 @@ public class DatabaseUtils { } }; } + + /** + * @throws IllegalArgumentException if the collection is not null and has strictly more + * than {@link #PARTITION_SIZE_FOR_ORACLE} values. + */ + public static void checkThatNotTooManyConditions(@Nullable Collection values, String message) { + if (values != null) { + checkArgument(values.size() <= PARTITION_SIZE_FOR_ORACLE, message); + } + } } diff --git a/server/sonar-db-core/src/test/java/org/sonar/db/DatabaseUtilsTest.java b/server/sonar-db-core/src/test/java/org/sonar/db/DatabaseUtilsTest.java index 98c6d1e4661..b32852e37e6 100644 --- a/server/sonar-db-core/src/test/java/org/sonar/db/DatabaseUtilsTest.java +++ b/server/sonar-db-core/src/test/java/org/sonar/db/DatabaseUtilsTest.java @@ -332,4 +332,20 @@ public class DatabaseUtilsTest { assertThat(DatabaseUtils.tableExists("foo", connection)).isFalse(); } } + + @Test + public void checkThatNotTooManyConditions_does_not_fail_if_less_than_1000_conditions() { + DatabaseUtils.checkThatNotTooManyConditions(null, "unused"); + DatabaseUtils.checkThatNotTooManyConditions(Collections.emptySet(), "unused"); + DatabaseUtils.checkThatNotTooManyConditions(Collections.nCopies(10, "foo"), "unused"); + DatabaseUtils.checkThatNotTooManyConditions(Collections.nCopies(1_000, "foo"), "unused"); + } + + @Test + public void checkThatNotTooManyConditions_throws_IAE_if_strictly_more_than_1000_conditions() { + expectedException.expect(IllegalArgumentException.class); + expectedException.expectMessage("the message"); + + DatabaseUtils.checkThatNotTooManyConditions(Collections.nCopies(1_001, "foo"), "the message"); + } } -- cgit v1.2.3