summaryrefslogtreecommitdiffstats
path: root/gerrit-server/src/main/java/com/google/gerrit/server/schema/JdbcAccountPatchReviewStore.java
diff options
context:
space:
mode:
Diffstat (limited to 'gerrit-server/src/main/java/com/google/gerrit/server/schema/JdbcAccountPatchReviewStore.java')
-rw-r--r--gerrit-server/src/main/java/com/google/gerrit/server/schema/JdbcAccountPatchReviewStore.java355
1 files changed, 0 insertions, 355 deletions
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/JdbcAccountPatchReviewStore.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/JdbcAccountPatchReviewStore.java
deleted file mode 100644
index 43f39b29d7..0000000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/JdbcAccountPatchReviewStore.java
+++ /dev/null
@@ -1,355 +0,0 @@
-// Copyright (C) 2017 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.gerrit.server.schema;
-
-import static java.util.concurrent.TimeUnit.MILLISECONDS;
-import static java.util.concurrent.TimeUnit.SECONDS;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.common.primitives.Ints;
-import com.google.gerrit.extensions.events.LifecycleListener;
-import com.google.gerrit.extensions.registration.DynamicItem;
-import com.google.gerrit.lifecycle.LifecycleModule;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.server.change.AccountPatchReviewStore;
-import com.google.gerrit.server.config.ConfigUtil;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.config.ThreadSettingsConfig;
-import com.google.gwtorm.server.OrmDuplicateKeyException;
-import com.google.gwtorm.server.OrmException;
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.util.Collection;
-import java.util.Optional;
-import javax.sql.DataSource;
-import org.apache.commons.dbcp.BasicDataSource;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public abstract class JdbcAccountPatchReviewStore
- implements AccountPatchReviewStore, LifecycleListener {
- private static final String ACCOUNT_PATCH_REVIEW_DB = "accountPatchReviewDb";
- private static final String H2_DB = "h2";
- private static final String MARIADB = "mariadb";
- private static final String MYSQL = "mysql";
- private static final String POSTGRESQL = "postgresql";
- private static final String URL = "url";
- private static final Logger log = LoggerFactory.getLogger(JdbcAccountPatchReviewStore.class);
-
- public static class Module extends LifecycleModule {
- private final Config cfg;
-
- public Module(Config cfg) {
- this.cfg = cfg;
- }
-
- @Override
- protected void configure() {
- Class<? extends JdbcAccountPatchReviewStore> impl;
- String url = cfg.getString(ACCOUNT_PATCH_REVIEW_DB, null, URL);
- if (url == null || url.contains(H2_DB)) {
- impl = H2AccountPatchReviewStore.class;
- } else if (url.contains(POSTGRESQL)) {
- impl = PostgresqlAccountPatchReviewStore.class;
- } else if (url.contains(MYSQL)) {
- impl = MysqlAccountPatchReviewStore.class;
- } else if (url.contains(MARIADB)) {
- impl = MariaDBAccountPatchReviewStore.class;
- } else {
- throw new IllegalArgumentException(
- "unsupported driver type for account patch reviews db: " + url);
- }
- DynamicItem.bind(binder(), AccountPatchReviewStore.class).to(impl);
- listener().to(impl);
- }
- }
-
- private DataSource ds;
-
- public static JdbcAccountPatchReviewStore createAccountPatchReviewStore(
- Config cfg, SitePaths sitePaths, ThreadSettingsConfig threadSettingsConfig) {
- String url = cfg.getString(ACCOUNT_PATCH_REVIEW_DB, null, URL);
- if (url == null || url.contains(H2_DB)) {
- return new H2AccountPatchReviewStore(cfg, sitePaths, threadSettingsConfig);
- }
- if (url.contains(POSTGRESQL)) {
- return new PostgresqlAccountPatchReviewStore(cfg, sitePaths, threadSettingsConfig);
- }
- if (url.contains(MYSQL)) {
- return new MysqlAccountPatchReviewStore(cfg, sitePaths, threadSettingsConfig);
- }
- if (url.contains(MARIADB)) {
- return new MariaDBAccountPatchReviewStore(cfg, sitePaths, threadSettingsConfig);
- }
- throw new IllegalArgumentException(
- "unsupported driver type for account patch reviews db: " + url);
- }
-
- protected JdbcAccountPatchReviewStore(
- Config cfg, SitePaths sitePaths, ThreadSettingsConfig threadSettingsConfig) {
- this.ds = createDataSource(cfg, sitePaths, threadSettingsConfig);
- }
-
- protected JdbcAccountPatchReviewStore(DataSource ds) {
- this.ds = ds;
- }
-
- private static String getUrl(@GerritServerConfig Config cfg, SitePaths sitePaths) {
- String url = cfg.getString(ACCOUNT_PATCH_REVIEW_DB, null, URL);
- if (url == null) {
- return H2.createUrl(sitePaths.db_dir.resolve("account_patch_reviews"));
- }
- return url;
- }
-
- private static DataSource createDataSource(
- Config cfg, SitePaths sitePaths, ThreadSettingsConfig threadSettingsConfig) {
- BasicDataSource datasource = new BasicDataSource();
- String url = getUrl(cfg, sitePaths);
- int poolLimit = threadSettingsConfig.getDatabasePoolLimit();
- datasource.setUrl(url);
- datasource.setDriverClassName(getDriverFromUrl(url));
- datasource.setMaxActive(cfg.getInt(ACCOUNT_PATCH_REVIEW_DB, "poolLimit", poolLimit));
- datasource.setMinIdle(cfg.getInt(ACCOUNT_PATCH_REVIEW_DB, "poolminidle", 4));
- datasource.setMaxIdle(
- cfg.getInt(ACCOUNT_PATCH_REVIEW_DB, "poolmaxidle", Math.min(poolLimit, 16)));
- datasource.setInitialSize(datasource.getMinIdle());
- datasource.setMaxWait(
- ConfigUtil.getTimeUnit(
- cfg,
- ACCOUNT_PATCH_REVIEW_DB,
- null,
- "poolmaxwait",
- MILLISECONDS.convert(30, SECONDS),
- MILLISECONDS));
- long evictIdleTimeMs = 1000L * 60;
- datasource.setMinEvictableIdleTimeMillis(evictIdleTimeMs);
- datasource.setTimeBetweenEvictionRunsMillis(evictIdleTimeMs / 2);
- return datasource;
- }
-
- private static String getDriverFromUrl(String url) {
- if (url.contains(POSTGRESQL)) {
- return "org.postgresql.Driver";
- }
- if (url.contains(MYSQL)) {
- return "com.mysql.jdbc.Driver";
- }
- if (url.contains(MARIADB)) {
- return "org.mariadb.jdbc.Driver";
- }
- return "org.h2.Driver";
- }
-
- @Override
- public void start() {
- try {
- createTableIfNotExists();
- } catch (OrmException e) {
- log.error("Failed to create table to store account patch reviews", e);
- }
- }
-
- public Connection getConnection() throws SQLException {
- return ds.getConnection();
- }
-
- public void createTableIfNotExists() throws OrmException {
- try (Connection con = ds.getConnection();
- Statement stmt = con.createStatement()) {
- doCreateTable(stmt);
- } catch (SQLException e) {
- throw convertError("create", e);
- }
- }
-
- protected void doCreateTable(Statement stmt) throws SQLException {
- stmt.executeUpdate(
- "CREATE TABLE IF NOT EXISTS account_patch_reviews ("
- + "account_id INTEGER DEFAULT 0 NOT NULL, "
- + "change_id INTEGER DEFAULT 0 NOT NULL, "
- + "patch_set_id INTEGER DEFAULT 0 NOT NULL, "
- + "file_name VARCHAR(4096) DEFAULT '' NOT NULL, "
- + "CONSTRAINT primary_key_account_patch_reviews "
- + "PRIMARY KEY (change_id, patch_set_id, account_id, file_name)"
- + ")");
- }
-
- public void dropTableIfExists() throws OrmException {
- try (Connection con = ds.getConnection();
- Statement stmt = con.createStatement()) {
- stmt.executeUpdate("DROP TABLE IF EXISTS account_patch_reviews");
- } catch (SQLException e) {
- throw convertError("create", e);
- }
- }
-
- @Override
- public void stop() {}
-
- @Override
- public boolean markReviewed(PatchSet.Id psId, Account.Id accountId, String path)
- throws OrmException {
- try (Connection con = ds.getConnection();
- PreparedStatement stmt =
- con.prepareStatement(
- "INSERT INTO account_patch_reviews "
- + "(account_id, change_id, patch_set_id, file_name) VALUES "
- + "(?, ?, ?, ?)")) {
- stmt.setInt(1, accountId.get());
- stmt.setInt(2, psId.getParentKey().get());
- stmt.setInt(3, psId.get());
- stmt.setString(4, path);
- stmt.executeUpdate();
- return true;
- } catch (SQLException e) {
- OrmException ormException = convertError("insert", e);
- if (ormException instanceof OrmDuplicateKeyException) {
- return false;
- }
- throw ormException;
- }
- }
-
- @Override
- public void markReviewed(PatchSet.Id psId, Account.Id accountId, Collection<String> paths)
- throws OrmException {
- if (paths == null || paths.isEmpty()) {
- return;
- }
-
- try (Connection con = ds.getConnection();
- PreparedStatement stmt =
- con.prepareStatement(
- "INSERT INTO account_patch_reviews "
- + "(account_id, change_id, patch_set_id, file_name) VALUES "
- + "(?, ?, ?, ?)")) {
- for (String path : paths) {
- stmt.setInt(1, accountId.get());
- stmt.setInt(2, psId.getParentKey().get());
- stmt.setInt(3, psId.get());
- stmt.setString(4, path);
- stmt.addBatch();
- }
- stmt.executeBatch();
- } catch (SQLException e) {
- OrmException ormException = convertError("insert", e);
- if (ormException instanceof OrmDuplicateKeyException) {
- return;
- }
- throw ormException;
- }
- }
-
- @Override
- public void clearReviewed(PatchSet.Id psId, Account.Id accountId, String path)
- throws OrmException {
- try (Connection con = ds.getConnection();
- PreparedStatement stmt =
- con.prepareStatement(
- "DELETE FROM account_patch_reviews "
- + "WHERE account_id = ? AND change_id = ? AND "
- + "patch_set_id = ? AND file_name = ?")) {
- stmt.setInt(1, accountId.get());
- stmt.setInt(2, psId.getParentKey().get());
- stmt.setInt(3, psId.get());
- stmt.setString(4, path);
- stmt.executeUpdate();
- } catch (SQLException e) {
- throw convertError("delete", e);
- }
- }
-
- @Override
- public void clearReviewed(PatchSet.Id psId) throws OrmException {
- try (Connection con = ds.getConnection();
- PreparedStatement stmt =
- con.prepareStatement(
- "DELETE FROM account_patch_reviews "
- + "WHERE change_id = ? AND patch_set_id = ?")) {
- stmt.setInt(1, psId.getParentKey().get());
- stmt.setInt(2, psId.get());
- stmt.executeUpdate();
- } catch (SQLException e) {
- throw convertError("delete", e);
- }
- }
-
- @Override
- public Optional<PatchSetWithReviewedFiles> findReviewed(PatchSet.Id psId, Account.Id accountId)
- throws OrmException {
- try (Connection con = ds.getConnection();
- PreparedStatement stmt =
- con.prepareStatement(
- "SELECT patch_set_id, file_name FROM account_patch_reviews APR1 "
- + "WHERE account_id = ? AND change_id = ? AND patch_set_id = "
- + "(SELECT MAX(patch_set_id) FROM account_patch_reviews APR2 WHERE "
- + "APR1.account_id = APR2.account_id "
- + "AND APR1.change_id = APR2.change_id "
- + "AND patch_set_id <= ?)")) {
- stmt.setInt(1, accountId.get());
- stmt.setInt(2, psId.getParentKey().get());
- stmt.setInt(3, psId.get());
- try (ResultSet rs = stmt.executeQuery()) {
- if (rs.next()) {
- PatchSet.Id id = new PatchSet.Id(psId.getParentKey(), rs.getInt("patch_set_id"));
- ImmutableSet.Builder<String> builder = ImmutableSet.builder();
- do {
- builder.add(rs.getString("file_name"));
- } while (rs.next());
-
- return Optional.of(
- AccountPatchReviewStore.PatchSetWithReviewedFiles.create(id, builder.build()));
- }
-
- return Optional.empty();
- }
- } catch (SQLException e) {
- throw convertError("select", e);
- }
- }
-
- public OrmException convertError(String op, SQLException err) {
- if (err.getCause() == null && err.getNextException() != null) {
- err.initCause(err.getNextException());
- }
- return new OrmException(op + " failure on account_patch_reviews", err);
- }
-
- private static String getSQLState(SQLException err) {
- String ec;
- SQLException next = err;
- do {
- ec = next.getSQLState();
- next = next.getNextException();
- } while (ec == null && next != null);
- return ec;
- }
-
- protected static int getSQLStateInt(SQLException err) {
- String s = getSQLState(err);
- if (s != null) {
- Integer i = Ints.tryParse(s);
- return i != null ? i : -1;
- }
- return 0;
- }
-}