84 lines
2.7 KiB
Java
84 lines
2.7 KiB
Java
package shine.db;
|
||
|
||
import shine.db.dao.ActiveSessionsDAO;
|
||
import shine.db.entities.ActiveSession;
|
||
import utils.config.AppConfig;
|
||
|
||
import java.nio.file.Files;
|
||
import java.nio.file.Path;
|
||
import java.nio.file.Paths;
|
||
import java.sql.Connection;
|
||
import java.sql.DriverManager;
|
||
import java.sql.SQLException;
|
||
import java.sql.Statement;
|
||
|
||
public final class SqliteDbController {
|
||
|
||
private static volatile SqliteDbController instance;
|
||
private final Connection connection;
|
||
|
||
private SqliteDbController() {
|
||
try {
|
||
// Подгружаем драйвер SQLite
|
||
Class.forName("org.sqlite.JDBC");
|
||
} catch (ClassNotFoundException e) {
|
||
throw new RuntimeException("SQLite JDBC driver not found", e);
|
||
}
|
||
|
||
String dbPath = AppConfig.getInstance().getParam("db.path");
|
||
|
||
if (dbPath == null || dbPath.isBlank()) {
|
||
throw new RuntimeException("Config param 'db.path' is not set in application.properties");
|
||
}
|
||
|
||
Path dbFile = Paths.get(dbPath);
|
||
|
||
// 👉 Если файла БД нет — создаём новую БД через DatabaseInitializer
|
||
if (!Files.exists(dbFile)) {
|
||
System.out.println("[DB] Файл БД не найден: " + dbFile.toAbsolutePath());
|
||
System.out.println("[DB] Создаём новую БД с помощью DatabaseInitializer...");
|
||
|
||
// можно передать пустой массив аргументов
|
||
DatabaseInitializer.createNewDB(new String[0]);
|
||
}
|
||
|
||
String url = "jdbc:sqlite:" + dbPath;
|
||
|
||
try {
|
||
this.connection = DriverManager.getConnection(url);
|
||
this.connection.setAutoCommit(true);
|
||
|
||
// ВАЖНО: включаем поддержку внешних ключей для этого соединения
|
||
try (Statement st = this.connection.createStatement()) {
|
||
st.execute("PRAGMA foreign_keys = ON");
|
||
}
|
||
|
||
} catch (SQLException e) {
|
||
throw new RuntimeException("Failed to connect to SQLite database: " + url, e);
|
||
}
|
||
}
|
||
|
||
public static SqliteDbController getInstance() {
|
||
if (instance == null) {
|
||
synchronized (SqliteDbController.class) {
|
||
if (instance == null) {
|
||
instance = new SqliteDbController();
|
||
}
|
||
}
|
||
}
|
||
return instance;
|
||
}
|
||
|
||
public Connection getConnection() {
|
||
return connection;
|
||
}
|
||
|
||
public void close() {
|
||
try {
|
||
connection.close();
|
||
} catch (SQLException e) {
|
||
// логировать по необходимости
|
||
}
|
||
}
|
||
}
|