Передел библиотеку работы с БД под только login и bchName
This commit is contained in:
AidarKC
2025-12-19 14:08:05 +03:00
parent 0c49cae055
commit 627321d4ae
9 changed files with 233 additions and 448 deletions
@@ -37,7 +37,7 @@ public final class ActiveSessionsDAO {
String sql = """
INSERT INTO active_sessions (
sessionId,
loginId,
login,
sessionPwd,
storagePwd,
sessionCreatedAtMs,
@@ -54,7 +54,7 @@ public final class ActiveSessionsDAO {
try (PreparedStatement ps = c.prepareStatement(sql)) {
ps.setString(1, session.getSessionId());
ps.setLong(2, session.getLoginId());
ps.setString(2, session.getLogin());
ps.setString(3, session.getSessionPwd());
ps.setString(4, session.getStoragePwd());
ps.setLong(5, session.getSessionCreatedAtMs());
@@ -84,7 +84,7 @@ public final class ActiveSessionsDAO {
String sql = """
SELECT
sessionId,
loginId,
login,
sessionPwd,
storagePwd,
sessionCreatedAtMs,
@@ -116,12 +116,12 @@ public final class ActiveSessionsDAO {
}
}
/** Получить список по loginId с внешним соединением. Соединение НЕ закрывает. */
public List<ActiveSessionEntry> getByLoginId(Connection c, long loginId) throws SQLException {
/** Получить список по login с внешним соединением. Соединение НЕ закрывает. */
public List<ActiveSessionEntry> getByLogin(Connection c, String login) throws SQLException {
String sql = """
SELECT
sessionId,
loginId,
login,
sessionPwd,
storagePwd,
sessionCreatedAtMs,
@@ -134,13 +134,13 @@ public final class ActiveSessionsDAO {
clientInfoFromRequest,
userLanguage
FROM active_sessions
WHERE loginId = ?
WHERE login = ?
""";
List<ActiveSessionEntry> result = new ArrayList<>();
try (PreparedStatement ps = c.prepareStatement(sql)) {
ps.setLong(1, loginId);
ps.setString(1, login);
try (ResultSet rs = ps.executeQuery()) {
while (rs.next()) result.add(mapRow(rs));
}
@@ -149,10 +149,10 @@ public final class ActiveSessionsDAO {
return result;
}
/** Получить список по loginId без внешнего соединения. Сам открывает/закрывает. */
public List<ActiveSessionEntry> getByLoginId(long loginId) throws SQLException {
/** Получить список по login без внешнего соединения. Сам открывает/закрывает. */
public List<ActiveSessionEntry> getByLogin(String login) throws SQLException {
try (Connection c = db.getConnection()) {
return getByLoginId(c, loginId);
return getByLogin(c, login);
}
}
@@ -250,7 +250,7 @@ public final class ActiveSessionsDAO {
private ActiveSessionEntry mapRow(ResultSet rs) throws SQLException {
String sessionId = rs.getString("sessionId");
long loginId = rs.getLong("loginId");
String login = rs.getString("login");
String sessionPwd = rs.getString("sessionPwd");
String storagePwd = rs.getString("storagePwd");
long sessionCreatedAtMs = rs.getLong("sessionCreatedAtMs");
@@ -265,7 +265,7 @@ public final class ActiveSessionsDAO {
return new ActiveSessionEntry(
sessionId,
loginId,
login,
sessionPwd,
storagePwd,
sessionCreatedAtMs,
@@ -13,7 +13,7 @@ import java.sql.*;
* - методы без Connection сами открывают и закрывают соединение
*
* Важно:
* - PRIMARY KEY: (loginId, blockchainId, blockGlobalNumber, blockLineIndex, blockLineNumber)
* - PRIMARY KEY удалён (временно), поэтому "upsert" сделан через UPDATE->INSERT.
*/
public final class BlocksDAO {
@@ -37,8 +37,8 @@ public final class BlocksDAO {
public void insert(Connection c, BlockEntry e) throws SQLException {
String sql = """
INSERT INTO blocks (
loginId,
blockchainId,
login,
bchName,
blockGlobalNumber,
blockGlobalPreHashe,
blockLineIndex,
@@ -46,8 +46,8 @@ public final class BlocksDAO {
blockLinePreHashe,
msgType,
blockByte,
toLoginId,
toBlockchainId,
to_login,
toBchName,
toBlockGlobalNumber,
toBlockHashe
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
@@ -66,45 +66,15 @@ public final class BlocksDAO {
}
}
// -------------------- UPSERT --------------------
// -------------------- UPSERT (UPDATE -> INSERT) --------------------
/**
* Сохранить (upsert) с внешним соединением. Соединение НЕ закрывает.
* Если запись с таким PK уже есть — обновляем поля.
* Сохранить (условный upsert) с внешним соединением. Соединение НЕ закрывает.
* Без PK/UNIQUE делаем: UPDATE по "ключевым" полям -> если 0 строк, то INSERT.
*/
public void upsert(Connection c, BlockEntry e) throws SQLException {
String sql = """
INSERT INTO blocks (
loginId,
blockchainId,
blockGlobalNumber,
blockGlobalPreHashe,
blockLineIndex,
blockLineNumber,
blockLinePreHashe,
msgType,
blockByte,
toLoginId,
toBlockchainId,
toBlockGlobalNumber,
toBlockHashe
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
ON CONFLICT(loginId, blockchainId, blockGlobalNumber, blockLineIndex, blockLineNumber)
DO UPDATE SET
blockGlobalPreHashe = excluded.blockGlobalPreHashe,
blockLinePreHashe = excluded.blockLinePreHashe,
msgType = excluded.msgType,
blockByte = excluded.blockByte,
toLoginId = excluded.toLoginId,
toBlockchainId = excluded.toBlockchainId,
toBlockGlobalNumber = excluded.toBlockGlobalNumber,
toBlockHashe = excluded.toBlockHashe
""";
try (PreparedStatement ps = c.prepareStatement(sql)) {
bindAll(ps, e);
ps.executeUpdate();
}
int updated = update(c, e);
if (updated == 0) insert(c, e);
}
/** Сохранить (upsert) без внешнего соединения. Сам открывает/закрывает. */
@@ -116,18 +86,18 @@ public final class BlocksDAO {
// -------------------- SELECT --------------------
/** Получить блок по PK с внешним соединением. Соединение НЕ закрывает. */
/** Получить блок по "PK-подобному" набору полей с внешним соединением. Соединение НЕ закрывает. */
public BlockEntry getByPk(Connection c,
long loginId,
long blockchainId,
String login,
String bchName,
int blockGlobalNumber,
int blockLineIndex,
int blockLineNumber) throws SQLException {
String sql = """
SELECT
loginId,
blockchainId,
login,
bchName,
blockGlobalNumber,
blockGlobalPreHashe,
blockLineIndex,
@@ -135,22 +105,23 @@ public final class BlocksDAO {
blockLinePreHashe,
msgType,
blockByte,
toLoginId,
toBlockchainId,
to_login,
toBchName,
toBlockGlobalNumber,
toBlockHashe
FROM blocks
WHERE
loginId = ?
AND blockchainId = ?
login = ?
AND bchName = ?
AND blockGlobalNumber = ?
AND blockLineIndex = ?
AND blockLineNumber = ?
LIMIT 1
""";
try (PreparedStatement ps = c.prepareStatement(sql)) {
ps.setLong(1, loginId);
ps.setLong(2, blockchainId);
ps.setString(1, login);
ps.setString(2, bchName);
ps.setInt(3, blockGlobalNumber);
ps.setInt(4, blockLineIndex);
ps.setInt(5, blockLineNumber);
@@ -162,22 +133,22 @@ public final class BlocksDAO {
}
}
/** Получить блок по PK без внешнего соединения. Сам открывает/закрывает. */
public BlockEntry getByPk(long loginId,
long blockchainId,
/** Получить блок по "PK-подобному" набору полей без внешнего соединения. Сам открывает/закрывает. */
public BlockEntry getByPk(String login,
String bchName,
int blockGlobalNumber,
int blockLineIndex,
int blockLineNumber) throws SQLException {
try (Connection c = db.getConnection()) {
return getByPk(c, loginId, blockchainId, blockGlobalNumber, blockLineIndex, blockLineNumber);
return getByPk(c, login, bchName, blockGlobalNumber, blockLineIndex, blockLineNumber);
}
}
// -------------------- UPDATE --------------------
/**
* Обновить (строго UPDATE) по PK с внешним соединением. Соединение НЕ закрывает.
* Если строки нет — updateCount будет 0.
* Обновить (строго UPDATE) по "PK-подобному" набору полей с внешним соединением. Соединение НЕ закрывает.
* Может обновить >1 строк, если в таблице появились дубликаты.
*/
public int update(Connection c, BlockEntry e) throws SQLException {
String sql = """
@@ -187,13 +158,13 @@ public final class BlocksDAO {
blockLinePreHashe = ?,
msgType = ?,
blockByte = ?,
toLoginId = ?,
toBlockchainId = ?,
to_login = ?,
toBchName = ?,
toBlockGlobalNumber = ?,
toBlockHashe = ?
WHERE
loginId = ?
AND blockchainId = ?
login = ?
AND bchName = ?
AND blockGlobalNumber = ?
AND blockLineIndex = ?
AND blockLineNumber = ?
@@ -210,13 +181,15 @@ public final class BlocksDAO {
if (bytes != null) ps.setBytes(i++, bytes);
else ps.setNull(i++, Types.BLOB);
ps.setLong(i++, e.getToLoginId());
ps.setInt(i++, e.getToBlockchainId());
if (e.getToLogin() != null) ps.setString(i++, e.getToLogin());
else ps.setNull(i++, Types.VARCHAR);
ps.setString(i++, nn(e.getToBchName()));
ps.setInt(i++, e.getToBlockGlobalNumber());
ps.setString(i++, nn(e.getToBlockHashe()));
ps.setLong(i++, e.getLoginId());
ps.setLong(i++, e.getBlockchainId());
ps.setString(i++, e.getLogin());
ps.setString(i++, e.getBchName());
ps.setInt(i++, e.getBlockGlobalNumber());
ps.setInt(i++, e.getBlockLineIndex());
ps.setInt(i++, e.getBlockLineNumber());
@@ -234,10 +207,13 @@ public final class BlocksDAO {
// -------------------- DELETE --------------------
/** Удалить по PK с внешним соединением. Соединение НЕ закрывает. */
/**
* Удалить по "PK-подобному" набору полей с внешним соединением. Соединение НЕ закрывает.
* Может удалить >1 строк, если есть дубликаты.
*/
public int deleteByPk(Connection c,
long loginId,
long blockchainId,
String login,
String bchName,
int blockGlobalNumber,
int blockLineIndex,
int blockLineNumber) throws SQLException {
@@ -245,16 +221,16 @@ public final class BlocksDAO {
String sql = """
DELETE FROM blocks
WHERE
loginId = ?
AND blockchainId = ?
login = ?
AND bchName = ?
AND blockGlobalNumber = ?
AND blockLineIndex = ?
AND blockLineNumber = ?
""";
try (PreparedStatement ps = c.prepareStatement(sql)) {
ps.setLong(1, loginId);
ps.setLong(2, blockchainId);
ps.setString(1, login);
ps.setString(2, bchName);
ps.setInt(3, blockGlobalNumber);
ps.setInt(4, blockLineIndex);
ps.setInt(5, blockLineNumber);
@@ -262,25 +238,25 @@ public final class BlocksDAO {
}
}
/** Удалить по PK без внешнего соединения. Сам открывает/закрывает. */
public int deleteByPk(long loginId,
long blockchainId,
/** Удалить по "PK-подобному" набору полей без внешнего соединения. Сам открывает/закрывает. */
public int deleteByPk(String login,
String bchName,
int blockGlobalNumber,
int blockLineIndex,
int blockLineNumber) throws SQLException {
try (Connection c = db.getConnection()) {
return deleteByPk(c, loginId, blockchainId, blockGlobalNumber, blockLineIndex, blockLineNumber);
return deleteByPk(c, login, bchName, blockGlobalNumber, blockLineIndex, blockLineNumber);
}
}
// -------------------- INTERNAL --------------------
/** Единая привязка параметров под INSERT/UPSERT — чтобы не разъезжалось. */
/** Единая привязка параметров под INSERT — чтобы не разъезжалось. */
private static void bindAll(PreparedStatement ps, BlockEntry e) throws SQLException {
int i = 1;
ps.setLong(i++, e.getLoginId());
ps.setLong(i++, e.getBlockchainId());
ps.setString(i++, e.getLogin());
ps.setString(i++, e.getBchName());
ps.setInt(i++, e.getBlockGlobalNumber());
ps.setString(i++, nn(e.getBlockGlobalPreHashe()));
@@ -294,8 +270,10 @@ public final class BlocksDAO {
if (bytes != null) ps.setBytes(i++, bytes);
else ps.setNull(i++, Types.BLOB);
ps.setLong(i++, e.getToLoginId());
ps.setInt(i++, e.getToBlockchainId());
if (e.getToLogin() != null) ps.setString(i++, e.getToLogin());
else ps.setNull(i++, Types.VARCHAR);
ps.setString(i++, nn(e.getToBchName()));
ps.setInt(i++, e.getToBlockGlobalNumber());
ps.setString(i++, nn(e.getToBlockHashe()));
}
@@ -303,8 +281,8 @@ public final class BlocksDAO {
private BlockEntry mapRow(ResultSet rs) throws SQLException {
BlockEntry e = new BlockEntry();
e.setLoginId(rs.getLong("loginId"));
e.setBlockchainId(rs.getLong("blockchainId"));
e.setLogin(rs.getString("login"));
e.setBchName(rs.getString("bchName"));
e.setBlockGlobalNumber(rs.getInt("blockGlobalNumber"));
e.setBlockGlobalPreHashe(rs.getString("blockGlobalPreHashe"));
@@ -316,8 +294,8 @@ public final class BlocksDAO {
e.setBlockByte(rs.getBytes("blockByte"));
e.setToLoginId(rs.getLong("toLoginId"));
e.setToBlockchainId(rs.getInt("toBlockchainId"));
e.setToLogin(rs.getString("to_login"));
e.setToBchName(rs.getString("toBchName"));
e.setToBlockGlobalNumber(rs.getInt("toBlockGlobalNumber"));
e.setToBlockHashe(rs.getString("toBlockHashe"));
@@ -11,16 +11,15 @@ import java.util.List;
* SolanaUsersDAO — локальная таблица пользователей из Solana.
*
* Колонки:
* - login TEXT
* - loginId INTEGER (PK)
* - bchId INTEGER
* - login TEXT (PK)
* - bchName TEXT
* - loginKey TEXT
* - deviceKey TEXT
* - bchLimit INTEGER (может быть NULL)
*
* * Правило:
* * - методы с Connection НЕ закрывают соединение
* * - методы без Connection сами открывают и закрывают соединение
* Правило:
* - методы с Connection НЕ закрывают соединение
* - методы без Connection сами открывают и закрывают соединение
*/
public final class SolanaUsersDAO {
@@ -43,22 +42,18 @@ public final class SolanaUsersDAO {
/** Вставка с внешним соединением. Соединение НЕ закрывает. */
public void insert(Connection c, SolanaUserEntry user) throws SQLException {
String sql = """
INSERT INTO solana_users (login, loginId, bchId, loginKey, deviceKey, bchLimit)
VALUES (?, ?, ?, ?, ?, ?)
INSERT INTO solana_users (login, bchName, loginKey, deviceKey, bchLimit)
VALUES (?, ?, ?, ?, ?)
""";
try (PreparedStatement ps = c.prepareStatement(sql)) {
ps.setString(1, user.getLogin());
ps.setLong(2, user.getLoginId());
ps.setLong(3, user.getBchId());
ps.setString(4, user.getLoginKey());
ps.setString(5, user.getDeviceKey());
ps.setString(2, user.getBchName());
ps.setString(3, user.getLoginKey());
ps.setString(4, user.getDeviceKey());
if (user.getBchLimit() != null) {
ps.setInt(6, user.getBchLimit());
} else {
ps.setNull(6, Types.INTEGER);
}
if (user.getBchLimit() != null) ps.setInt(5, user.getBchLimit());
else ps.setNull(5, Types.INTEGER);
ps.executeUpdate();
}
@@ -73,34 +68,10 @@ public final class SolanaUsersDAO {
// -------------------- SELECT --------------------
/** Получить по loginId с внешним соединением. Соединение НЕ закрывает. */
public SolanaUserEntry getByLoginId(Connection c, long loginId) throws SQLException {
String sql = """
SELECT login, loginId, bchId, loginKey, deviceKey, bchLimit
FROM solana_users
WHERE loginId = ?
""";
try (PreparedStatement ps = c.prepareStatement(sql)) {
ps.setLong(1, loginId);
try (ResultSet rs = ps.executeQuery()) {
if (!rs.next()) return null;
return mapRow(rs);
}
}
}
/** Получить по loginId без внешнего соединения. Сам открывает/закрывает. */
public SolanaUserEntry getByLoginId(long loginId) throws SQLException {
try (Connection c = db.getConnection()) {
return getByLoginId(c, loginId);
}
}
/** Получить по login (case-insensitive) с внешним соединением. Соединение НЕ закрывает. */
public SolanaUserEntry getByLogin(Connection c, String login) throws SQLException {
String sql = """
SELECT login, loginId, bchId, loginKey, deviceKey, bchLimit
SELECT login, bchName, loginKey, deviceKey, bchLimit
FROM solana_users
WHERE LOWER(login) = LOWER(?)
""";
@@ -124,7 +95,7 @@ public final class SolanaUsersDAO {
/** Поиск по префиксу с внешним соединением. Соединение НЕ закрывает. */
public List<SolanaUserEntry> searchByLoginPrefix(Connection c, String prefix) throws SQLException {
String sql = """
SELECT login, loginId, bchId, loginKey, deviceKey, bchLimit
SELECT login, bchName, loginKey, deviceKey, bchLimit
FROM solana_users
WHERE LOWER(login) LIKE ?
ORDER BY login
@@ -154,9 +125,8 @@ public final class SolanaUsersDAO {
private SolanaUserEntry mapRow(ResultSet rs) throws SQLException {
return new SolanaUserEntry(
rs.getLong("loginId"),
rs.getString("login"),
rs.getLong("bchId"),
rs.getString("bchName"),
rs.getString("loginKey"),
rs.getString("deviceKey"),
rs.getObject("bchLimit") != null ? rs.getInt("bchLimit") : null
@@ -30,7 +30,7 @@ public final class UserParamsDAO {
public void upsert(Connection c, UserParamEntry param) throws SQLException {
String sql = """
INSERT INTO users_params (
loginId,
login,
param,
bch_channel_id,
value,
@@ -38,7 +38,7 @@ public final class UserParamsDAO {
pubkey_num,
signature
) VALUES (?, ?, ?, ?, ?, ?, ?)
ON CONFLICT(loginId, param)
ON CONFLICT(login, param)
DO UPDATE SET
bch_channel_id = excluded.bch_channel_id,
value = excluded.value,
@@ -48,7 +48,7 @@ public final class UserParamsDAO {
""";
try (PreparedStatement ps = c.prepareStatement(sql)) {
ps.setLong(1, param.getLoginId());
ps.setString(1, param.getLogin());
ps.setString(2, param.getParam());
ps.setLong(3, param.getBchChannelId());
ps.setString(4, param.getValue());
@@ -69,10 +69,10 @@ public final class UserParamsDAO {
// -------------------- SELECT --------------------
/** Получить параметр с внешним соединением. Соединение НЕ закрывает. */
public UserParamEntry getByUserIdAndParam(Connection c, long loginId, String paramName) throws SQLException {
public UserParamEntry getByUserLoginAndParam(Connection c, String login, String paramName) throws SQLException {
String sql = """
SELECT
loginId,
login,
param,
bch_channel_id,
value,
@@ -80,11 +80,11 @@ public final class UserParamsDAO {
pubkey_num,
signature
FROM users_params
WHERE loginId = ? AND param = ?
WHERE login = ? AND param = ?
""";
try (PreparedStatement ps = c.prepareStatement(sql)) {
ps.setLong(1, loginId);
ps.setString(1, login);
ps.setString(2, paramName);
try (ResultSet rs = ps.executeQuery()) {
if (!rs.next()) return null;
@@ -94,17 +94,17 @@ public final class UserParamsDAO {
}
/** Получить параметр без внешнего соединения. Сам открывает/закрывает. */
public UserParamEntry getByUserIdAndParam(long loginId, String paramName) throws SQLException {
public UserParamEntry getByUserLoginAndParam(String login, String paramName) throws SQLException {
try (Connection c = db.getConnection()) {
return getByUserIdAndParam(c, loginId, paramName);
return getByUserLoginAndParam(c, login, paramName);
}
}
/** Получить все параметры пользователя с внешним соединением. Соединение НЕ закрывает. */
public List<UserParamEntry> getByUserId(Connection c, long loginId) throws SQLException {
public List<UserParamEntry> getByUserLogin(Connection c, String login) throws SQLException {
String sql = """
SELECT
loginId,
login,
param,
bch_channel_id,
value,
@@ -112,14 +112,14 @@ public final class UserParamsDAO {
pubkey_num,
signature
FROM users_params
WHERE loginId = ?
WHERE login = ?
ORDER BY time_ms DESC
""";
List<UserParamEntry> result = new ArrayList<>();
try (PreparedStatement ps = c.prepareStatement(sql)) {
ps.setLong(1, loginId);
ps.setString(1, login);
try (ResultSet rs = ps.executeQuery()) {
while (rs.next()) result.add(mapRow(rs));
}
@@ -129,9 +129,9 @@ public final class UserParamsDAO {
}
/** Получить все параметры пользователя без внешнего соединения. Сам открывает/закрывает. */
public List<UserParamEntry> getByUserId(long loginId) throws SQLException {
public List<UserParamEntry> getByUserLogin(String login) throws SQLException {
try (Connection c = db.getConnection()) {
return getByUserId(c, loginId);
return getByUserLogin(c, login);
}
}
@@ -139,7 +139,7 @@ public final class UserParamsDAO {
private UserParamEntry mapRow(ResultSet rs) throws SQLException {
return new UserParamEntry(
rs.getLong("loginId"),
rs.getString("login"),
rs.getString("param"),
rs.getLong("bch_channel_id"),
rs.getString("value"),