Remove usage of AccountAccess#all() from schema migrations

The schema migrations should continue to work when AccountAccess is
removed (because accounts are migrated to NoteDb), hence use SQL to
query accounts.

Change-Id: I5009d6de7e67553d0ff5ccf23dc18bf950fc0bcf
Signed-off-by: Edwin Kempin <ekempin@google.com>
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/AccountsOnInit.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/AccountsOnInit.java
index ee939d6..9465a54 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/AccountsOnInit.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/AccountsOnInit.java
@@ -56,7 +56,8 @@
       try (Repository repo = new FileRepository(path);
           ObjectInserter oi = repo.newObjectInserter()) {
         PersonIdent serverIdent = new GerritPersonIdentProvider(flags.cfg).get();
-        AccountsUpdate.createUserBranch(repo, oi, serverIdent, serverIdent, account);
+        AccountsUpdate.createUserBranch(
+            repo, oi, serverIdent, serverIdent, account.getId(), account.getRegisteredOn());
       }
     }
   }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountsUpdate.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountsUpdate.java
index 54e06de..f6ed598 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountsUpdate.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountsUpdate.java
@@ -247,7 +247,8 @@
                 "User branch %s for newly created account %s already exists.",
                 refName, account.getId().get()));
       }
-      createUserBranch(repo, oi, committerIdent, authorIdent, account);
+      createUserBranch(
+          repo, oi, committerIdent, authorIdent, account.getId(), account.getRegisteredOn());
     }
   }
 
@@ -255,7 +256,8 @@
     try (Repository repo = repoManager.openRepository(allUsersName);
         ObjectInserter oi = repo.newObjectInserter()) {
       if (repo.exactRef(RefNames.refsUsers(account.getId())) == null) {
-        createUserBranch(repo, oi, committerIdent, authorIdent, account);
+        createUserBranch(
+            repo, oi, committerIdent, authorIdent, account.getId(), account.getRegisteredOn());
       }
     }
   }
@@ -265,12 +267,12 @@
       ObjectInserter oi,
       PersonIdent committerIdent,
       PersonIdent authorIdent,
-      Account account)
+      Account.Id accountId,
+      Timestamp registeredOn)
       throws IOException {
-    ObjectId id =
-        createInitialEmptyCommit(oi, committerIdent, authorIdent, account.getRegisteredOn());
+    ObjectId id = createInitialEmptyCommit(oi, committerIdent, authorIdent, registeredOn);
 
-    String refName = RefNames.refsUsers(account.getId());
+    String refName = RefNames.refsUsers(accountId);
     RefUpdate ru = repo.updateRef(refName);
     ru.setExpectedOldObjectId(ObjectId.zeroId());
     ru.setNewObjectId(id);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_146.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_146.java
index dd11396..4896f3a 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_146.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_146.java
@@ -25,8 +25,12 @@
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import java.io.IOException;
+import java.sql.ResultSet;
 import java.sql.SQLException;
+import java.sql.Statement;
 import java.sql.Timestamp;
+import java.util.HashMap;
+import java.util.Map;
 import org.eclipse.jgit.lib.CommitBuilder;
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.ObjectId;
@@ -77,13 +81,14 @@
         ObjectInserter oi = repo.newObjectInserter()) {
       ObjectId emptyTree = emptyTree(oi);
 
-      for (Account account : db.accounts().all()) {
-        String refName = RefNames.refsUsers(account.getId());
+      for (Map.Entry<Account.Id, Timestamp> e : scanAccounts(db).entrySet()) {
+        String refName = RefNames.refsUsers(e.getKey());
         Ref ref = repo.exactRef(refName);
         if (ref != null) {
-          rewriteUserBranch(repo, rw, oi, emptyTree, ref, account);
+          rewriteUserBranch(repo, rw, oi, emptyTree, ref, e.getValue());
         } else {
-          AccountsUpdate.createUserBranch(repo, oi, serverIdent, serverIdent, account);
+          AccountsUpdate.createUserBranch(
+              repo, oi, serverIdent, serverIdent, e.getKey(), e.getValue());
         }
       }
     } catch (IOException e) {
@@ -92,9 +97,14 @@
   }
 
   private void rewriteUserBranch(
-      Repository repo, RevWalk rw, ObjectInserter oi, ObjectId emptyTree, Ref ref, Account account)
+      Repository repo,
+      RevWalk rw,
+      ObjectInserter oi,
+      ObjectId emptyTree,
+      Ref ref,
+      Timestamp registeredOn)
       throws IOException {
-    ObjectId current = createInitialEmptyCommit(oi, emptyTree, account.getRegisteredOn());
+    ObjectId current = createInitialEmptyCommit(oi, emptyTree, registeredOn);
 
     rw.reset();
     rw.sort(RevSort.TOPO);
@@ -153,4 +163,15 @@
   private static ObjectId emptyTree(ObjectInserter oi) throws IOException {
     return oi.insert(Constants.OBJ_TREE, new byte[] {});
   }
+
+  private Map<Account.Id, Timestamp> scanAccounts(ReviewDb db) throws SQLException {
+    try (Statement stmt = newStatement(db);
+        ResultSet rs = stmt.executeQuery("SELECT account_id, registered_on FROM accounts")) {
+      HashMap<Account.Id, Timestamp> m = new HashMap<>();
+      while (rs.next()) {
+        m.put(new Account.Id(rs.getInt(1)), rs.getTimestamp(2));
+      }
+      return m;
+    }
+  }
 }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_147.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_147.java
index 8585988..48d1e7e 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_147.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_147.java
@@ -27,7 +27,10 @@
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import java.io.IOException;
+import java.sql.ResultSet;
 import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.HashSet;
 import java.util.Objects;
 import java.util.Set;
 import org.eclipse.jgit.lib.PersonIdent;
@@ -54,8 +57,7 @@
   @Override
   protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, SQLException {
     try (Repository repo = repoManager.openRepository(allUsersName)) {
-      Set<Account.Id> accountIdsFromReviewDb =
-          db.accounts().all().toList().stream().map(a -> a.getId()).collect(toSet());
+      Set<Account.Id> accountIdsFromReviewDb = scanAccounts(db);
       Set<Account.Id> accountIdsFromUserBranches =
           repo.getRefDatabase()
               .getRefs(RefNames.REFS_USERS)
@@ -72,4 +74,15 @@
       throw new OrmException("Failed to delete user branches for non-existing accounts.", e);
     }
   }
+
+  private Set<Account.Id> scanAccounts(ReviewDb db) throws SQLException {
+    try (Statement stmt = newStatement(db);
+        ResultSet rs = stmt.executeQuery("SELECT account_id FROM accounts")) {
+      Set<Account.Id> ids = new HashSet<>();
+      while (rs.next()) {
+        ids.add(new Account.Id(rs.getInt(1)));
+      }
+      return ids;
+    }
+  }
 }