Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,4 @@ BackupManager.exe
config.enc
config.txt

/TESTINGHER/
/data/
4 changes: 2 additions & 2 deletions src/main/java/backupmanager/Entities/ConfigurationBackup.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,8 @@ public ConfigurationBackup() {
nextBackupDate = null;
timeIntervalBackup = null;
notes = "";
creationDate = null;
lastUpdateDate = null;
creationDate = LocalDateTime.now();
lastUpdateDate = LocalDateTime.now();
count = 0;
maxToKeep = configReader.getConfigValue("MaxCountForSameBackup", 1);
}
Expand Down
4 changes: 3 additions & 1 deletion src/main/java/backupmanager/Entities/Email.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@

import java.time.LocalDateTime;

import backupmanager.Enums.EmailType;

public record Email (
int emailId,
int type,
EmailType type,
LocalDateTime insertDate,
String appVersion,
String payload
Expand Down
15 changes: 7 additions & 8 deletions src/main/java/backupmanager/Enums/BackupStatusEnum.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package backupmanager.Enums;

public enum BackupStatusEnum {
import backupmanager.Enums.utils.CodeEnum;
import backupmanager.Enums.utils.EnumUtil;

public enum BackupStatusEnum implements CodeEnum {
IN_PROGRESS(1),
QUEUE(2),
FINISHED(3),
Expand All @@ -12,16 +15,12 @@ public enum BackupStatusEnum {
this.code = code;
}

@Override
public int getCode() {
return code;
}

public static BackupStatusEnum fromCode(int code) {
for (BackupStatusEnum status : values()) {
if (status.code == code) {
return status;
}
}
throw new IllegalArgumentException("Invalid BackupStatusEnum code: " + code);
return EnumUtil.fromCode(BackupStatusEnum.class, code);
}
}
}
13 changes: 6 additions & 7 deletions src/main/java/backupmanager/Enums/BackupTriggeredEnum.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package backupmanager.Enums;

public enum BackupTriggeredEnum {
import backupmanager.Enums.utils.CodeEnum;
import backupmanager.Enums.utils.EnumUtil;

public enum BackupTriggeredEnum implements CodeEnum {
USER(1),
SCHEDULER(2);

Expand All @@ -10,16 +13,12 @@ public enum BackupTriggeredEnum {
this.code = code;
}

@Override
public int getCode() {
return code;
}

public static BackupTriggeredEnum fromCode(int code) {
for (BackupTriggeredEnum status : values()) {
if (status.code == code) {
return status;
}
}
throw new IllegalArgumentException("Invalid BackupTriggeredEnum code: " + code);
return EnumUtil.fromCode(BackupTriggeredEnum.class, code);
}
}
24 changes: 24 additions & 0 deletions src/main/java/backupmanager/Enums/EmailType.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package backupmanager.Enums;

import backupmanager.Enums.utils.CodeEnum;
import backupmanager.Enums.utils.EnumUtil;

public enum EmailType implements CodeEnum {
WELCOME(1),
CRITICAL_ERROR(2);

private final int code;

EmailType(int code) {
this.code = code;
}

@Override
public int getCode() {
return code;
}

public static EmailType fromCode(int code) {
return EnumUtil.fromCode(EmailType.class, code);
}
}
5 changes: 5 additions & 0 deletions src/main/java/backupmanager/Enums/utils/CodeEnum.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package backupmanager.Enums.utils;

public interface CodeEnum {
public int getCode();
}
12 changes: 12 additions & 0 deletions src/main/java/backupmanager/Enums/utils/EnumUtil.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package backupmanager.Enums.utils;

public class EnumUtil {
public static <Type extends Enum<Type> & CodeEnum> Type fromCode(Class<Type> enumClass, int code) {
for (Type constants : enumClass.getEnumConstants()) {
if (constants.getCode() == code) {
return constants;
}
}
throw new IllegalArgumentException("Invalid code " + code + " for enum " + enumClass.getSimpleName());
}
}
6 changes: 3 additions & 3 deletions src/main/java/backupmanager/MainApp.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@
import backupmanager.GUI.BackupManagerGUI;
import backupmanager.Managers.ExceptionManager;
import backupmanager.database.Database;
import backupmanager.database.DatabaseInitializer;
import backupmanager.database.DatabasePaths;
import backupmanager.database.ProductionDatabaseInitializer;

public class MainApp {
private static final String CONFIG = "src/main/resources/res/config/config.json";
Expand Down Expand Up @@ -42,8 +42,8 @@ else if (!isBackgroundMode) {

private static void databaseInitialization() {
try {
Database.init(DatabasePaths.getDatabasePath());
DatabaseInitializer.init();
Database.init(DatabasePaths.getProductionDatabasePath());
ProductionDatabaseInitializer.init();
} catch (Exception ex) {
logger.error("Unable to init the database");
ExceptionManager.openExceptionMessage(ex.getMessage(), Arrays.toString(ex.getStackTrace()));
Expand Down
55 changes: 18 additions & 37 deletions src/main/java/backupmanager/database/DatabaseInitializer.java
Original file line number Diff line number Diff line change
@@ -1,54 +1,22 @@
package backupmanager.database;

import java.io.InputStream;
import java.nio.file.Files;
import java.nio.charset.StandardCharsets;
import java.nio.file.Path;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class DatabaseInitializer {
private static final Logger logger = LoggerFactory.getLogger(DatabaseInitializer.class);

public static void init() throws Exception {
Path dbPath = DatabasePaths.getDatabasePath();
Files.createDirectories(dbPath.getParent());

boolean isNewDatabase = !Files.exists(dbPath);

try (Connection conn = DriverManager.getConnection("jdbc:sqlite:" + dbPath);
Statement st = conn.createStatement()) {

st.execute("PRAGMA journal_mode=WAL;");
st.execute("PRAGMA synchronous=NORMAL;");
st.execute("PRAGMA temp_store=MEMORY;");
st.execute("PRAGMA foreign_keys=ON;");

if (isNewDatabase) {
logger.info("Creating database: {}", dbPath);

conn.setAutoCommit(false);

runSql(conn, "/db/001_schema.sql");
runSql(conn, "/db/002_seed.sql");
// runSql(conn, "/db/003_enable_demo_version.sql"); Enable it only if you want to create a demo version of the program

conn.commit();
} else {
logger.info("Database already exists: {}", dbPath);
}
}
}
public static void init() throws Exception {}

private static void runSql(Connection conn, String resource) throws Exception {
protected static void runSql(Connection conn, String resource) throws Exception {
try (InputStream is = DatabaseInitializer.class.getResourceAsStream(resource)) {
if (is == null) return;

String sql = new String(is.readAllBytes());
String[] statements = sql.split(";"); // split per ogni comando
String sql = new String(is.readAllBytes(), StandardCharsets.UTF_8);
String[] statements = sql.split(";"); // split for every command

try (Statement st = conn.createStatement()) {
for (String statement : statements) {
Expand All @@ -60,4 +28,17 @@ private static void runSql(Connection conn, String resource) throws Exception {
}
}
}

protected static Connection createConnection(Path dbPath) throws Exception {
Connection conn = DriverManager.getConnection("jdbc:sqlite:" + dbPath);

try (Statement st = conn.createStatement()) {
st.execute("PRAGMA journal_mode=WAL;");
st.execute("PRAGMA synchronous=NORMAL;");
st.execute("PRAGMA temp_store=MEMORY;");
st.execute("PRAGMA foreign_keys=ON;");
}

return conn;
}
}
7 changes: 6 additions & 1 deletion src/main/java/backupmanager/database/DatabasePaths.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,15 @@
import java.nio.file.Paths;

public class DatabasePaths {
public static Path getDatabasePath() {
public static Path getProductionDatabasePath() {
return Paths.get(
System.getProperty("user.home"),
"Documents", "Shard", "data", "BackupManager.db"
);
}

public static Path getTestDatabasePath() {
return Paths.get("data", "BackupManager.db");
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package backupmanager.database;

import java.nio.file.Files;
import java.nio.file.Path;
import java.sql.Connection;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class ProductionDatabaseInitializer extends DatabaseInitializer {
private static final Logger logger = LoggerFactory.getLogger(ProductionDatabaseInitializer.class);

public static void init() throws Exception {
Path dbPath = DatabasePaths.getProductionDatabasePath();
Files.createDirectories(dbPath.getParent());

boolean isNewDatabase = !Files.exists(dbPath);

try (Connection conn = createConnection(dbPath)) {

if (isNewDatabase) {
logger.info("Creating database: {}", dbPath);

conn.setAutoCommit(false);

runSql(conn, "/db/001_schema.sql");
runSql(conn, "/db/002_seed.sql");
// runSql(conn, "/db/003_enable_demo_version.sql"); Enable it only if you want to create a demo version of the program

conn.commit();
} else {
logger.info("Database already exists: {}", dbPath);
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,66 @@ public static List<BackupRequest> getRunningBackups() {
return backups;
}

public static List<BackupRequest> getRequestBackups() {
String sql = """
SELECT
BackupRequestId,
BackupConfigurationId,
StartedDate,
CompletionDate,
Status,
Progress,
TriggeredBy,
DurationMs,
OutputPath,
UnzippedTargetSize,
ZippedTargetSize,
FilesCount,
ErrorMessage
FROM
BackupRequests
ORDER BY 1
""";

List<BackupRequest> backups = new ArrayList<>();

try (
Connection conn = Database.getConnection();
PreparedStatement stmt = conn.prepareStatement(sql)) {

try (ResultSet rs = stmt.executeQuery()) {
while (rs.next()) {
int backupRequestId = rs.getInt("BackupRequestId");
int backupConfigurationId = rs.getInt("BackupConfigurationId");
Long startedDateMills = rs.getLong("StartedDate");
Long completionDateStr = rs.getLong("CompletionDate");
int statusInt = rs.getInt("Status");
int progress = rs.getInt("Progress");
int triggeredByInt = rs.getInt("TriggeredBy");
Long durationMs = rs.getLong("DurationMs");
String outputPath = rs.getString("OutputPath");
long unzippedTargetSize = rs.getLong("UnzippedTargetSize");
long zippedTargetSize = rs.getLong("ZippedTargetSize");
int filesCount = rs.getInt("FilesCount");
String errorMessage = rs.getString("ErrorMessage");

LocalDateTime startedDate = SqlHelper.toLocalDateTime(startedDateMills);
LocalDateTime completionDate = SqlHelper.toLocalDateTime(completionDateStr);
BackupTriggeredEnum triggeredBy = BackupTriggeredEnum.fromCode(triggeredByInt);
BackupStatusEnum status = BackupStatusEnum.fromCode(statusInt);

backups.add(new BackupRequest(backupRequestId, backupConfigurationId, startedDate, completionDate, status, progress, triggeredBy, durationMs, outputPath, unzippedTargetSize, zippedTargetSize, filesCount, errorMessage));
logger.debug("Loaded running backup: backupRequestId={} configurationId={}", backupRequestId, backupConfigurationId);
}
}

} catch (SQLException e) {
logger.error("Error fetching backup requests list: " + e.getMessage(), e);
}

return backups;
}

public static boolean isAnyBackupRunning() {
String sql = """
SELECT 1
Expand Down
Loading