From 081a40aff1d88db1c4b3f27f3f066eb3cb6edf57 Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Sat, 28 Sep 2019 12:08:36 +0300 Subject: [PATCH] Prevent possible data-loss with old versions --- .../transactions/patches/DeleteIPsPatch.java | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/Plan/common/src/main/java/com/djrapitops/plan/storage/database/transactions/patches/DeleteIPsPatch.java b/Plan/common/src/main/java/com/djrapitops/plan/storage/database/transactions/patches/DeleteIPsPatch.java index 6d50fd499..f0741d068 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/storage/database/transactions/patches/DeleteIPsPatch.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/storage/database/transactions/patches/DeleteIPsPatch.java @@ -16,10 +16,13 @@ */ package com.djrapitops.plan.storage.database.transactions.patches; +import com.djrapitops.plan.storage.database.queries.QueryAllStatement; import com.djrapitops.plan.storage.database.sql.tables.GeoInfoTable; -import static com.djrapitops.plan.storage.database.sql.parsing.Sql.DISTINCT; -import static com.djrapitops.plan.storage.database.sql.parsing.Sql.FROM; +import java.sql.ResultSet; +import java.sql.SQLException; + +import static com.djrapitops.plan.storage.database.sql.parsing.Sql.*; /** * Patch that replaces plan_ips with plan_geolocations table. @@ -41,6 +44,10 @@ public class DeleteIPsPatch extends Patch { @Override protected void applyPatch() { + if (hasTable(GeoInfoTable.TABLE_NAME) && hasLessDataInPlanIPs()) { + dropTable("plan_ips"); + return; + } tempOldTable(); dropTable(GeoInfoTable.TABLE_NAME); @@ -60,6 +67,22 @@ public class DeleteIPsPatch extends Patch { dropTable(tempTableName); } + private boolean hasLessDataInPlanIPs() { + Integer inIPs = query(new QueryAllStatement(SELECT + "COUNT(1) as c" + FROM + "plan_ips") { + @Override + public Integer processResults(ResultSet set) throws SQLException { + return set.next() ? set.getInt("c") : 0; + } + }); + Integer inGeoInfo = query(new QueryAllStatement(SELECT + "COUNT(1) as c" + FROM + GeoInfoTable.TABLE_NAME) { + @Override + public Integer processResults(ResultSet set) throws SQLException { + return set.next() ? set.getInt("c") : 0; + } + }); + return inIPs <= inGeoInfo; + } + private void tempOldTable() { if (!hasTable(tempTableName)) { renameTable("plan_ips", tempTableName);