Move the per-command ReviewDb handle up to AbstractCommand base class
This way administrative commands can also use this feature to manage
their own database connection, without having to copy the code over.
Signed-off-by: Shawn O. Pearce <sop@google.com>
diff --git a/src/main/java/com/google/gerrit/server/ssh/AbstractCommand.java b/src/main/java/com/google/gerrit/server/ssh/AbstractCommand.java
index 18b1196..e71cd49 100644
--- a/src/main/java/com/google/gerrit/server/ssh/AbstractCommand.java
+++ b/src/main/java/com/google/gerrit/server/ssh/AbstractCommand.java
@@ -61,6 +61,8 @@
protected OutputStream err;
protected ExitCallback exit;
protected ServerSession session;
+ protected ReviewDb db;
+
private String name;
private String unsplitArguments;
private Set<AccountGroup.Id> userGroups;
@@ -113,11 +115,14 @@
}
protected ReviewDb openReviewDb() throws Failure {
- try {
- return Common.getSchemaFactory().open();
- } catch (OrmException e) {
- throw new Failure(1, "fatal: Gerrit database is offline", e);
+ if (db == null) {
+ try {
+ db = Common.getSchemaFactory().open();
+ } catch (OrmException e) {
+ throw new Failure(1, "fatal: Gerrit database is offline", e);
+ }
}
+ return db;
}
protected Account.Id getAccountId() {
@@ -330,6 +335,14 @@
protected abstract void run() throws IOException, Failure;
protected void postRun() {
+ closeDb();
+ }
+
+ protected void closeDb() {
+ if (db != null) {
+ db.close();
+ db = null;
+ }
}
public static class Failure extends Exception {
diff --git a/src/main/java/com/google/gerrit/server/ssh/AbstractGitCommand.java b/src/main/java/com/google/gerrit/server/ssh/AbstractGitCommand.java
index 404bc2f..1dc3859 100644
--- a/src/main/java/com/google/gerrit/server/ssh/AbstractGitCommand.java
+++ b/src/main/java/com/google/gerrit/server/ssh/AbstractGitCommand.java
@@ -19,7 +19,6 @@
import com.google.gerrit.client.reviewdb.ApprovalCategory;
import com.google.gerrit.client.reviewdb.Project;
import com.google.gerrit.client.reviewdb.ProjectRight;
-import com.google.gerrit.client.reviewdb.ReviewDb;
import com.google.gerrit.client.rpc.Common;
import com.google.gerrit.git.InvalidRepositoryException;
@@ -36,7 +35,6 @@
protected ProjectCache.Entry cachedProj;
protected Project proj;
protected Account userAccount;
- protected ReviewDb db;
protected boolean isGerrit() {
return getName().startsWith("gerrit-");
@@ -45,13 +43,7 @@
@Override
protected void preRun() throws Failure {
super.preRun();
- db = openReviewDb();
- }
-
- @Override
- protected void postRun() {
- closeDb();
- super.postRun();
+ openReviewDb();
}
@Override
@@ -102,13 +94,6 @@
runImpl();
}
- protected void closeDb() {
- if (db != null) {
- db.close();
- db = null;
- }
- }
-
protected boolean canPerform(final ApprovalCategory.Id actionId,
final short val) {
return canPerform(cachedProj, actionId, val);