поменял все названия таблиц и полей в таблицах на стиль только маленькие буквы и разделение через "_"  . Все тесты проходят норм
This commit is contained in:
AidarKC
2026-01-06 01:49:26 +03:00
parent 93c007b2b9
commit 8fd7f4676b
16 changed files with 467 additions and 532 deletions
@@ -36,19 +36,19 @@ public final class ActiveSessionsDAO {
public void insert(Connection c, ActiveSessionEntry session) throws SQLException {
String sql = """
INSERT INTO active_sessions (
sessionId,
session_id,
login,
sessionPwd,
storagePwd,
sessionCreatedAtMs,
lastAuthirificatedAtMs,
pushEndpoint,
pushP256dhKey,
pushAuthKey,
clientIp,
clientInfoFromClient,
clientInfoFromRequest,
userLanguage
session_pwd,
storage_pwd,
session_created_at_ms,
last_authirificated_at_ms,
push_endpoint,
push_p256dh_key,
push_auth_key,
client_ip,
client_info_from_client,
client_info_from_request,
user_language
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
""";
@@ -83,21 +83,21 @@ public final class ActiveSessionsDAO {
public ActiveSessionEntry getBySessionId(Connection c, String sessionId) throws SQLException {
String sql = """
SELECT
sessionId,
session_id,
login,
sessionPwd,
storagePwd,
sessionCreatedAtMs,
lastAuthirificatedAtMs,
pushEndpoint,
pushP256dhKey,
pushAuthKey,
clientIp,
clientInfoFromClient,
clientInfoFromRequest,
userLanguage
session_pwd,
storage_pwd,
session_created_at_ms,
last_authirificated_at_ms,
push_endpoint,
push_p256dh_key,
push_auth_key,
client_ip,
client_info_from_client,
client_info_from_request,
user_language
FROM active_sessions
WHERE sessionId = ?
WHERE session_id = ?
""";
try (PreparedStatement ps = c.prepareStatement(sql)) {
@@ -120,19 +120,19 @@ public final class ActiveSessionsDAO {
public List<ActiveSessionEntry> getByLogin(Connection c, String login) throws SQLException {
String sql = """
SELECT
sessionId,
session_id,
login,
sessionPwd,
storagePwd,
sessionCreatedAtMs,
lastAuthirificatedAtMs,
pushEndpoint,
pushP256dhKey,
pushAuthKey,
clientIp,
clientInfoFromClient,
clientInfoFromRequest,
userLanguage
session_pwd,
storage_pwd,
session_created_at_ms,
last_authirificated_at_ms,
push_endpoint,
push_p256dh_key,
push_auth_key,
client_ip,
client_info_from_client,
client_info_from_request,
user_language
FROM active_sessions
WHERE login = ?
""";
@@ -162,8 +162,8 @@ public final class ActiveSessionsDAO {
public void updateLastAuthirificatedAtMs(Connection c, String sessionId, long lastAuthMs) throws SQLException {
String sql = """
UPDATE active_sessions
SET lastAuthirificatedAtMs = ?
WHERE sessionId = ?
SET last_authirificated_at_ms = ?
WHERE session_id = ?
""";
try (PreparedStatement ps = c.prepareStatement(sql)) {
@@ -194,12 +194,12 @@ public final class ActiveSessionsDAO {
String sql = """
UPDATE active_sessions
SET
lastAuthirificatedAtMs = ?,
clientIp = ?,
clientInfoFromClient = ?,
clientInfoFromRequest = ?,
userLanguage = ?
WHERE sessionId = ?
last_authirificated_at_ms = ?,
client_ip = ?,
client_info_from_client = ?,
client_info_from_request = ?,
user_language = ?
WHERE session_id = ?
""";
try (PreparedStatement ps = c.prepareStatement(sql)) {
@@ -231,7 +231,7 @@ public final class ActiveSessionsDAO {
/** Удалить по sessionId с внешним соединением. Соединение НЕ закрывает. */
public void deleteBySessionId(Connection c, String sessionId) throws SQLException {
String sql = "DELETE FROM active_sessions WHERE sessionId = ?";
String sql = "DELETE FROM active_sessions WHERE session_id = ?";
try (PreparedStatement ps = c.prepareStatement(sql)) {
ps.setString(1, sessionId);
@@ -249,19 +249,19 @@ public final class ActiveSessionsDAO {
// -------------------- MAPPER --------------------
private ActiveSessionEntry mapRow(ResultSet rs) throws SQLException {
String sessionId = rs.getString("sessionId");
String sessionId = rs.getString("session_id");
String login = rs.getString("login");
String sessionPwd = rs.getString("sessionPwd");
String storagePwd = rs.getString("storagePwd");
long sessionCreatedAtMs = rs.getLong("sessionCreatedAtMs");
long lastAuthirificatedAtMs = rs.getLong("lastAuthirificatedAtMs");
String pushEndpoint = rs.getString("pushEndpoint");
String pushP256dhKey = rs.getString("pushP256dhKey");
String pushAuthKey = rs.getString("pushAuthKey");
String clientIp = rs.getString("clientIp");
String clientInfoFromClient = rs.getString("clientInfoFromClient");
String clientInfoFromRequest = rs.getString("clientInfoFromRequest");
String userLanguage = rs.getString("userLanguage");
String sessionPwd = rs.getString("session_pwd");
String storagePwd = rs.getString("storage_pwd");
long sessionCreatedAtMs = rs.getLong("session_created_at_ms");
long lastAuthirificatedAtMs = rs.getLong("last_authirificated_at_ms");
String pushEndpoint = rs.getString("push_endpoint");
String pushP256dhKey = rs.getString("push_p256dh_key");
String pushAuthKey = rs.getString("push_auth_key");
String clientIp = rs.getString("client_ip");
String clientInfoFromClient = rs.getString("client_info_from_client");
String clientInfoFromRequest = rs.getString("client_info_from_request");
String userLanguage = rs.getString("user_language");
return new ActiveSessionEntry(
sessionId,
@@ -32,9 +32,9 @@ public final class BlockchainStateDAO {
public BlockchainStateEntry getByBlockchainName(Connection c, String blockchainName) throws SQLException {
String sql = """
SELECT
blockchainName,
blockchain_name,
login,
blockchainKey,
blockchain_key,
size_limit,
file_size_bytes,
last_global_number,
@@ -49,7 +49,7 @@ public final class BlockchainStateDAO {
line6_last_number, line6_last_hash,
line7_last_number, line7_last_hash
FROM blockchain_state
WHERE blockchainName = ?
WHERE blockchain_name = ?
""";
try (PreparedStatement ps = c.prepareStatement(sql)) {
@@ -79,9 +79,9 @@ public final class BlockchainStateDAO {
String sql = """
INSERT INTO blockchain_state (
blockchainName,
blockchain_name,
login,
blockchainKey,
blockchain_key,
size_limit,
file_size_bytes,
last_global_number,
@@ -106,10 +106,10 @@ public final class BlockchainStateDAO {
?,?,
?,?
)
ON CONFLICT(blockchainName)
ON CONFLICT(blockchain_name)
DO UPDATE SET
login = excluded.login,
blockchainKey = excluded.blockchainKey,
blockchain_key = excluded.blockchain_key,
size_limit = excluded.size_limit,
file_size_bytes = excluded.file_size_bytes,
last_global_number = excluded.last_global_number,
@@ -158,12 +158,6 @@ public final class BlockchainStateDAO {
/**
* Атомарно увеличить file_size_bytes на deltaBytes, но только если НЕ превысим size_limit.
*
* Возвращает:
* - true если обновили (лимит не превышен)
* - false если лимит превышается или blockchainName не найден
*
* ВАЖНО: это именно тот механизм, который надо дергать при добавлении блока.
*/
public boolean tryIncreaseFileSizeWithinLimit(Connection c, String blockchainName, long deltaBytes, long nowMs) throws SQLException {
String sql = """
@@ -172,7 +166,7 @@ public final class BlockchainStateDAO {
file_size_bytes = file_size_bytes + ?,
updated_at_ms = ?
WHERE
blockchainName = ?
blockchain_name = ?
AND (file_size_bytes + ?) <= size_limit
""";
@@ -202,11 +196,10 @@ public final class BlockchainStateDAO {
private BlockchainStateEntry mapRow(ResultSet rs) throws SQLException {
BlockchainStateEntry e = new BlockchainStateEntry();
e.setBlockchainName(rs.getString("blockchainName"));
e.setBlockchainName(rs.getString("blockchain_name"));
e.setLogin(rs.getString("login"));
e.setBlockchainKey(rs.getString("blockchainKey"));
e.setBlockchainKey(rs.getString("blockchain_key"));
// size_limit теперь long
e.setSizeLimit(rs.getLong("size_limit"));
e.setFileSizeBytes(rs.getLong("file_size_bytes"));
@@ -38,19 +38,19 @@ public final class BlocksDAO {
String sql = """
INSERT INTO blocks (
login,
bchName,
blockGlobalNumber,
blockGlobalPreHashe,
blockLineIndex,
blockLineNumber,
blockLinePreHashe,
msgType,
msgSubType,
blockByte,
bch_name,
block_global_number,
block_global_pre_hashe,
block_line_index,
block_line_number,
block_line_pre_hashe,
msg_type,
msg_sub_type,
block_byte,
to_login,
toBchName,
toBlockGlobalNumber,
toBlockHashe
to_bch_name,
to_block_global_number,
to_block_hashe
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
""";
@@ -69,16 +69,11 @@ public final class BlocksDAO {
// -------------------- UPSERT (UPDATE -> INSERT) --------------------
/**
* Сохранить (условный upsert) с внешним соединением. Соединение НЕ закрывает.
* Без PK/UNIQUE делаем: UPDATE по "ключевым" полям -> если 0 строк, то INSERT.
*/
public void upsert(Connection c, BlockEntry e) throws SQLException {
int updated = update(c, e);
if (updated == 0) insert(c, e);
}
/** Сохранить (upsert) без внешнего соединения. Сам открывает/закрывает. */
public void upsert(BlockEntry e) throws SQLException {
try (Connection c = db.getConnection()) {
upsert(c, e);
@@ -87,7 +82,6 @@ public final class BlocksDAO {
// -------------------- SELECT --------------------
/** Получить блок по "PK-подобному" набору полей с внешним соединением. Соединение НЕ закрывает. */
public BlockEntry getByPk(Connection c,
String login,
String bchName,
@@ -98,26 +92,26 @@ public final class BlocksDAO {
String sql = """
SELECT
login,
bchName,
blockGlobalNumber,
blockGlobalPreHashe,
blockLineIndex,
blockLineNumber,
blockLinePreHashe,
msgType,
msgSubType,
blockByte,
bch_name,
block_global_number,
block_global_pre_hashe,
block_line_index,
block_line_number,
block_line_pre_hashe,
msg_type,
msg_sub_type,
block_byte,
to_login,
toBchName,
toBlockGlobalNumber,
toBlockHashe
to_bch_name,
to_block_global_number,
to_block_hashe
FROM blocks
WHERE
login = ?
AND bchName = ?
AND blockGlobalNumber = ?
AND blockLineIndex = ?
AND blockLineNumber = ?
AND bch_name = ?
AND block_global_number = ?
AND block_line_index = ?
AND block_line_number = ?
LIMIT 1
""";
@@ -135,7 +129,6 @@ public final class BlocksDAO {
}
}
/** Получить блок по "PK-подобному" набору полей без внешнего соединения. Сам открывает/закрывает. */
public BlockEntry getByPk(String login,
String bchName,
int blockGlobalNumber,
@@ -148,29 +141,25 @@ public final class BlocksDAO {
// -------------------- UPDATE --------------------
/**
* Обновить (строго UPDATE) по "PK-подобному" набору полей с внешним соединением. Соединение НЕ закрывает.
* Может обновить >1 строк, если в таблице появились дубликаты.
*/
public int update(Connection c, BlockEntry e) throws SQLException {
String sql = """
UPDATE blocks
SET
blockGlobalPreHashe = ?,
blockLinePreHashe = ?,
msgType = ?,
msgSubType = ?,
blockByte = ?,
to_login = ?,
toBchName = ?,
toBlockGlobalNumber = ?,
toBlockHashe = ?
block_global_pre_hashe = ?,
block_line_pre_hashe = ?,
msg_type = ?,
msg_sub_type = ?,
block_byte = ?,
to_login = ?,
to_bch_name = ?,
to_block_global_number = ?,
to_block_hashe = ?
WHERE
login = ?
AND bchName = ?
AND blockGlobalNumber = ?
AND blockLineIndex = ?
AND blockLineNumber = ?
AND bch_name = ?
AND block_global_number = ?
AND block_line_index = ?
AND block_line_number = ?
""";
try (PreparedStatement ps = c.prepareStatement(sql)) {
@@ -207,7 +196,6 @@ public final class BlocksDAO {
}
}
/** Обновить без внешнего соединения. Сам открывает/закрывает. */
public int update(BlockEntry e) throws SQLException {
try (Connection c = db.getConnection()) {
return update(c, e);
@@ -216,10 +204,6 @@ public final class BlocksDAO {
// -------------------- DELETE --------------------
/**
* Удалить по "PK-подобному" набору полей с внешним соединением. Соединение НЕ закрывает.
* Может удалить >1 строк, если есть дубликаты.
*/
public int deleteByPk(Connection c,
String login,
String bchName,
@@ -231,10 +215,10 @@ public final class BlocksDAO {
DELETE FROM blocks
WHERE
login = ?
AND bchName = ?
AND blockGlobalNumber = ?
AND blockLineIndex = ?
AND blockLineNumber = ?
AND bch_name = ?
AND block_global_number = ?
AND block_line_index = ?
AND block_line_number = ?
""";
try (PreparedStatement ps = c.prepareStatement(sql)) {
@@ -247,7 +231,6 @@ public final class BlocksDAO {
}
}
/** Удалить по "PK-подобному" набору полей без внешнего соединения. Сам открывает/закрывает. */
public int deleteByPk(String login,
String bchName,
int blockGlobalNumber,
@@ -260,7 +243,6 @@ public final class BlocksDAO {
// -------------------- INTERNAL --------------------
/** Единая привязка параметров под INSERT — чтобы не разъезжалось. */
private static void bindAll(PreparedStatement ps, BlockEntry e) throws SQLException {
int i = 1;
@@ -297,29 +279,29 @@ public final class BlocksDAO {
BlockEntry e = new BlockEntry();
e.setLogin(rs.getString("login"));
e.setBchName(rs.getString("bchName"));
e.setBlockGlobalNumber(rs.getInt("blockGlobalNumber"));
e.setBlockGlobalPreHashe(rs.getString("blockGlobalPreHashe"));
e.setBchName(rs.getString("bch_name"));
e.setBlockGlobalNumber(rs.getInt("block_global_number"));
e.setBlockGlobalPreHashe(rs.getString("block_global_pre_hashe"));
e.setBlockLineIndex(rs.getInt("blockLineIndex"));
e.setBlockLineNumber(rs.getInt("blockLineNumber"));
e.setBlockLinePreHashe(rs.getString("blockLinePreHashe"));
e.setBlockLineIndex(rs.getInt("block_line_index"));
e.setBlockLineNumber(rs.getInt("block_line_number"));
e.setBlockLinePreHashe(rs.getString("block_line_pre_hashe"));
e.setMsgType(rs.getInt("msgType"));
e.setMsgSubType(rs.getInt("msgSubType"));
e.setMsgType(rs.getInt("msg_type"));
e.setMsgSubType(rs.getInt("msg_sub_type"));
e.setBlockByte(rs.getBytes("blockByte"));
e.setBlockByte(rs.getBytes("block_byte"));
e.setToLogin(rs.getString("to_login"));
String toBchName = rs.getString("toBchName");
String toBchName = rs.getString("to_bch_name");
if (rs.wasNull()) toBchName = null;
e.setToBchName(toBchName);
Integer toBlockGlobalNumber = (Integer) rs.getObject("toBlockGlobalNumber");
Integer toBlockGlobalNumber = (Integer) rs.getObject("to_block_global_number");
e.setToBlockGlobalNumber(toBlockGlobalNumber);
String toBlockHashe = rs.getString("toBlockHashe");
String toBlockHashe = rs.getString("to_block_hashe");
if (rs.wasNull()) toBlockHashe = null;
e.setToBlockHashe(toBlockHashe);
@@ -8,10 +8,10 @@ import java.sql.*;
/**
* DAO для таблицы ip_geo_cache.
*
* * Таблица:
* * - ip TEXT PRIMARY KEY
* * - geo TEXT
* * - updated_at_ms INTEGER NOT NULL
* Таблица:
* - ip TEXT PRIMARY KEY
* - geo TEXT
* - updated_at_ms INTEGER NOT NULL
*
* Правило:
* - методы с Connection НЕ закрывают соединение
@@ -14,18 +14,8 @@ import java.util.List;
*
* Колонки:
* - login TEXT PRIMARY KEY
* Уникальный логин пользователя (case-insensitive используется на уровне запросов).
*
* - deviceKey TEXT NOT NULL
* Публичный ключ устройства пользователя.
* Хранится в Base64(32 bytes) или HEX(64 chars).
*
* - solanaKey TEXT NULLABLE
* Публичный ключ Solana-аккаунта пользователя (если есть).
*
* Назначение таблицы:
* - локальное сопоставление login → deviceKey / solanaKey
* - используется для аутентификации, валидации подписей и связки с блокчейном
* - device_key TEXT NOT NULL
* - solana_key TEXT NULLABLE
*
* Правило работы с соединениями:
* - методы с Connection НЕ закрывают соединение
@@ -52,7 +42,7 @@ public final class SolanaUsersDAO {
/** Вставка с внешним соединением. Соединение НЕ закрывает. */
public void insert(Connection c, SolanaUserEntry user) throws SQLException {
String sql = """
INSERT INTO solana_users (login, deviceKey, solanaKey)
INSERT INTO solana_users (login, device_key, solana_key)
VALUES (?, ?, ?)
""";
@@ -102,7 +92,7 @@ public final class SolanaUsersDAO {
/** Получить по login (case-insensitive) с внешним соединением. Соединение НЕ закрывает. */
public SolanaUserEntry getByLogin(Connection c, String login) throws SQLException {
String sql = """
SELECT login, deviceKey, solanaKey
SELECT login, device_key, solana_key
FROM solana_users
WHERE LOWER(login) = LOWER(?)
""";
@@ -126,7 +116,7 @@ public final class SolanaUsersDAO {
/** Поиск по префиксу с внешним соединением. Соединение НЕ закрывает. */
public List<SolanaUserEntry> searchByLoginPrefix(Connection c, String prefix) throws SQLException {
String sql = """
SELECT login, deviceKey, solanaKey
SELECT login, device_key, solana_key
FROM solana_users
WHERE LOWER(login) LIKE ?
ORDER BY login
@@ -157,10 +147,10 @@ public final class SolanaUsersDAO {
private SolanaUserEntry mapRow(ResultSet rs) throws SQLException {
SolanaUserEntry e = new SolanaUserEntry(
rs.getString("login"),
rs.getString("deviceKey")
rs.getString("device_key")
);
String solanaKey = rs.getString("solanaKey");
String solanaKey = rs.getString("solana_key");
if (rs.wasNull()) solanaKey = null;
e.setSolanaKey(solanaKey);
@@ -8,8 +8,8 @@ import java.sql.*;
/**
* UserCreateDAO — атомарное добавление пользователя:
* - solana_users (login, deviceKey)
* - blockchain_state (blockchainName, login, blockchainKey, size_limit, ... last_global_number=-1 ...)
* - solana_users (login, device_key)
* - blockchain_state (blockchain_name, login, blockchain_key, size_limit, ... last_global_number=-1 ...)
*
* ВАЖНО:
* - только INSERT
@@ -86,8 +86,6 @@ public final class UserCreateDAO {
} catch (SQLException e) {
c.rollback();
// SQLITE_CONSTRAINT -> "уже существует"
// Мы не делаем UPDATE, только insert.
String msg = e.getMessage() == null ? "" : e.getMessage().toLowerCase();
if (msg.contains("constraint")) {
return false;
@@ -17,11 +17,6 @@ import java.util.List;
* ЛОГИКА time_ms:
* - БД принимает запись только если она "новее" (time_ms строго больше текущего).
* - Реализовано атомарно одним SQL: UPSERT + WHERE users_params.time_ms < excluded.time_ms
*
* Возврат результата:
* - upsertIfNewer(...) возвращает количество изменённых строк:
* 1 = вставили/обновили
* 0 = проигнорировали (запись уже новее или равная)
*/
public final class UserParamsDAO {
@@ -41,11 +36,6 @@ public final class UserParamsDAO {
// -------------------- UPSERT (IF NEWER) --------------------
/**
* Атомарный UPSERT "только если новее".
*
* @return 1 если вставили/обновили; 0 если запись не тронули (existing.time_ms >= incoming.time_ms).
*/
public int upsertIfNewer(Connection c, UserParamEntry e) throws SQLException {
String sql = """
INSERT INTO users_params (
@@ -77,11 +67,10 @@ public final class UserParamsDAO {
if (e.getSignature() != null) ps.setString(6, e.getSignature());
else ps.setNull(6, Types.VARCHAR);
return ps.executeUpdate(); // 1 или 0
return ps.executeUpdate();
}
}
/** То же самое, но сам открывает/закрывает соединение. */
public int upsertIfNewer(UserParamEntry e) throws SQLException {
try (Connection c = db.getConnection()) {
return upsertIfNewer(c, e);
@@ -90,7 +79,6 @@ public final class UserParamsDAO {
// -------------------- SELECT --------------------
/** Получить параметр по (login,param) с внешним соединением. Соединение НЕ закрывает. */
public UserParamEntry getByLoginAndParam(Connection c, String login, String param) throws SQLException {
String sql = """
SELECT
@@ -116,14 +104,12 @@ public final class UserParamsDAO {
}
}
/** Получить параметр по (login,param) без внешнего соединения. Сам открывает/закрывает. */
public UserParamEntry getByLoginAndParam(String login, String param) throws SQLException {
try (Connection c = db.getConnection()) {
return getByLoginAndParam(c, login, param);
}
}
/** Получить все параметры пользователя с внешним соединением. */
public List<UserParamEntry> getByLogin(Connection c, String login) throws SQLException {
String sql = """
SELECT
@@ -148,7 +134,6 @@ public final class UserParamsDAO {
return list;
}
/** Получить все параметры пользователя без внешнего соединения. */
public List<UserParamEntry> getByLogin(String login) throws SQLException {
try (Connection c = db.getConnection()) {
return getByLogin(c, login);