1package dev.keii.goldenage.migration;
2
3import java.sql.ResultSet;
4import java.sql.SQLException;
5import java.sql.Statement;
6import java.util.ArrayList;
7import java.util.Collections;
8import java.util.List;
9
10import dev.keii.goldenage.GoldenAge;
11import dev.keii.goldenage.migration.migrations.V0001_CreateUsers;
12import dev.keii.goldenage.migration.migrations.V0002_CreateLogins;
13import dev.keii.goldenage.migration.migrations.V0003_CreateUserNames;
14import dev.keii.goldenage.migration.migrations.V0004_CreateWorlds;
15import dev.keii.goldenage.migration.migrations.V0005_CreateTransactions;
16import dev.keii.goldenage.utils.DatabaseUtility;
17
18public class Migrator {
19 public DatabaseUtility db;
20 private final List<Migration> migrations;
21 private GoldenAge plugin;
22
23 public Migrator(GoldenAge plugin) {
24 this.plugin = plugin;
25 this.db = plugin.getDatabaseUtility();
26 migrations = new ArrayList<>();
27 migrations.add(new V0001_CreateUsers(this));
28 migrations.add(new V0002_CreateLogins(this));
29 migrations.add(new V0003_CreateUserNames(this));
30 migrations.add(new V0004_CreateWorlds(this));
31 migrations.add(new V0005_CreateTransactions(this));
32 }
33
34 public void setupMigrationsTable() throws SQLException {
35 Statement stmt = db.getConnection().createStatement();
36 stmt.execute("CREATE TABLE IF NOT EXISTS migrations( id INTEGER PRIMARY KEY AUTOINCREMENT, migration TEXT NOT NULL, batch INTEGER NOT NULL )");
37 db.getConnection().commit();
38 stmt.close();
39 }
40
41 public int getLatestBatch() throws SQLException {
42 Statement stmt = db.getConnection().createStatement();
43 ResultSet rs = stmt.executeQuery("SELECT batch FROM migrations ORDER BY id DESC LIMIT 1");
44
45 if (rs.next()) {
46 int latestBatch = rs.getInt(1);
47 rs.close();
48 stmt.close();
49 return latestBatch;
50 }
51 rs.close();
52 stmt.close();
53 return 0;
54 }
55
56 public void migrate() throws SQLException {
57 int newBatch = getLatestBatch() + 1;
58
59 for (Migration migration : migrations) {
60 migration.migrate(newBatch);
61 }
62 }
63
64 public void rollback() throws SQLException {
65 int latestBatch = getLatestBatch();
66
67 Collections.reverse(migrations);
68 for (Migration migration : migrations) {
69 migration.rollback(latestBatch);
70 }
71 Collections.reverse(migrations);
72 }
73}