SHA256
05 01 25
поменял все названия таблиц и полей в таблицах на стиль только маленькие буквы и разделение через "_" . Все тесты проходят норм
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user