package shine.db; import shine.db.connection.DbProvider; import shine.db.dao.DmDialogStateDAO; import java.sql.Connection; import java.sql.SQLException; /** * Нейтральная точка входа в runtime БД сервера. * * Runtime-сервер теперь поддерживает только PostgreSQL. */ public final class DbController implements DbProvider { private static volatile DbController instance; private final PostgresDbController delegate; private volatile boolean dmDialogStateBootstrapped; private DbController() { this.delegate = PostgresDbController.getInstance(); } public static DbController getInstance() { if (instance == null) { synchronized (DbController.class) { if (instance == null) { DbController created = new DbController(); instance = created; created.bootstrapDmDialogStateIfNeeded(); } } } return instance; } @Override public Connection getConnection() throws SQLException { return delegate.getConnection(); } @Override public void close() { delegate.close(); } private void bootstrapDmDialogStateIfNeeded() { if (dmDialogStateBootstrapped) return; synchronized (this) { if (dmDialogStateBootstrapped) return; try (Connection connection = delegate.getConnection()) { DmDialogStateDAO.getInstance().bootstrapIfEmpty(connection); dmDialogStateBootstrapped = true; } catch (SQLException e) { instance = null; throw new RuntimeException("DM dialog state bootstrap failed", e); } } } }