Skip to content

Commit cbb7d2e

Browse files
committed
Database connection. Only PostgreSQL and SQLite.
1 parent 386b374 commit cbb7d2e

5 files changed

Lines changed: 135 additions & 0 deletions

File tree

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package com.unfamoussoul.sapi.api.database;
2+
3+
import org.jetbrains.annotations.Contract;
4+
import org.jetbrains.annotations.NotNull;
5+
6+
/**
7+
* Класс конфигурации для работы с базами данных.
8+
* @param url JDBC строка подключения.
9+
* @param username в случае с базой данных, которым нужен пользователь для подключения (PostgreSQL).
10+
* @param password в случае с базой данных, которым нужен пароль для подключения (PostgreSQL).
11+
* @param maxPoolSize
12+
* @param minIdle
13+
* @param connectionTimeoutMs
14+
* @param idleTimeoutMs
15+
* @param maxLifetimeMs
16+
* @param type тип базы данных {@link DatabaseType}
17+
*/
18+
@SuppressWarnings("unused")
19+
public record DatabaseConfig(
20+
String url,
21+
String username,
22+
String password,
23+
int maxPoolSize,
24+
int minIdle,
25+
long connectionTimeoutMs,
26+
long idleTimeoutMs,
27+
long maxLifetimeMs,
28+
DatabaseType type
29+
) {
30+
31+
/**
32+
* Создание стандартной конфигурации для SQLite на JDBC строке.
33+
* @param url JDBC строка подключения.
34+
* @return конфиг для создания экземпляра класса {@link DatabaseHandler}.
35+
*/
36+
@Contract("_ -> new")
37+
public static @NotNull DatabaseConfig forSqlite(String url) {
38+
return new DatabaseConfig(url, null, null, 5, 2, 30_000, 600_000, 1_800_000, DatabaseType.SQLITE);
39+
}
40+
41+
/**
42+
* Создание стандартной конфигурации для PostgreSQL на JDBC строке, пользователе и пароле.
43+
* @param url JDBC строка подключения.
44+
* @param user пользователь.
45+
* @param password пароль.
46+
* @return конфиг для создания экземпляра класса {@link DatabaseHandler}.
47+
*/
48+
@Contract("_, _, _ -> new")
49+
public static @NotNull DatabaseConfig forPostgresql(String url, String user, String password) {
50+
return new DatabaseConfig(url, user, password, 10, 4, 30_000, 600_000, 1_800_000, DatabaseType.POSTGRESQL);
51+
}
52+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.unfamoussoul.sapi.api.database;
2+
3+
import java.sql.Connection;
4+
import java.sql.SQLException;
5+
import java.util.List;
6+
7+
/**
8+
* Абстрактный класс для создания обработчика базы данных
9+
*/
10+
@SuppressWarnings("unused")
11+
public abstract class DatabaseHandler implements AutoCloseable {
12+
13+
/**
14+
* Создание обработчика базы данных.
15+
* @param config конфиг базы данных {@link DatabaseConfig}
16+
* @param migrations список миграций базы данных {@link Migration}
17+
*/
18+
protected DatabaseHandler(DatabaseConfig config, List<Migration> migrations) {
19+
//
20+
}
21+
22+
/**
23+
* Получить подключение к базе данных.
24+
* @return класс подключения к базе данных {@link Connection}
25+
* @throws SQLException если вы допустили ошибку в SQL записи.
26+
*/
27+
public native Connection connection() throws SQLException;
28+
29+
/**
30+
* Метод закрытия обработчика
31+
*/
32+
@Override
33+
public native void close();
34+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.unfamoussoul.sapi.api.database;
2+
3+
/**
4+
* Да, мы работаем только с SQLite и PostgreSQL, мне лень.
5+
*/
6+
public enum DatabaseType {
7+
SQLITE,
8+
POSTGRESQL
9+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.unfamoussoul.sapi.api.database;
2+
3+
/**
4+
* Класс, который нужен для хранения версии и действий.
5+
* Просто храните миграции таким образом и база данных автоматически при запуске {@link DatabaseHandler} мигрировать на самую новую версию.
6+
* <p>
7+
* Пример:
8+
* <pre><code>
9+
* public class TestDatabaseHandler extends DatabaseHandler {
10+
*
11+
* protected TestDatabaseHandler(DatabaseConfig config) {
12+
* super(
13+
* config,
14+
* List.of(
15+
* // Создаём базу данных players в первой версии.
16+
* new Migration(1, c -> c.createStatement()
17+
* .execute("CREATE TABLE players (id INTEGER PRIMARY KEY, name TEXT)")),
18+
* // При обновлении кода потребовалось добавить колонку score в базу данных. При запуске модуля база данных сама обновится до второй версии.
19+
* new Migration(2, c -> c.createStatement()
20+
* .execute("ALTER TABLE players ADD COLUMN score INTEGER DEFAULT 0"))
21+
* ));
22+
* }
23+
* }
24+
* </code></pre>
25+
* @param version версия миграции
26+
* @param action действие миграции {@link MigrationAction}
27+
*/
28+
public record Migration(int version, MigrationAction action) {}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.unfamoussoul.sapi.api.database;
2+
3+
import java.sql.Connection;
4+
import java.sql.SQLException;
5+
6+
/**
7+
* Действие миграции. В одной версии может быть множество таких действий.
8+
*/
9+
@FunctionalInterface
10+
public interface MigrationAction {
11+
void apply(Connection connection) throws SQLException;
12+
}

0 commit comments

Comments
 (0)