Передел библиотеку работы с БД под только 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

View File

@ -14,14 +14,13 @@ import java.sql.Statement;
/** /**
* DatabaseInitializer создание новой SQLite-БД по схеме SHiNE. * DatabaseInitializer создание новой SQLite-БД по схеме SHiNE.
* *
* Читает путь к файлу БД из application.properties (db.path), * Таблицы:
* при необходимости удаляет старый файл и создаёт таблицы: * - solana_users (login TEXT PK, bchName TEXT)
* - solana_users * - active_sessions (login TEXT FK)
* - active_sessions * - users_params (login TEXT FK, UNIQUE(login,param))
* - users_params
* - ip_geo_cache * - ip_geo_cache
* - blockchain_state (MVP) * - blockchain_state (MVP)
* - blocks * - blocks (login TEXT, bchName TEXT, PK убран)
*/ */
public class DatabaseInitializer { public class DatabaseInitializer {
@ -81,9 +80,8 @@ public class DatabaseInitializer {
// 1. solana_users // 1. solana_users
st.executeUpdate(""" st.executeUpdate("""
CREATE TABLE IF NOT EXISTS solana_users ( CREATE TABLE IF NOT EXISTS solana_users (
login TEXT NOT NULL, login TEXT NOT NULL PRIMARY KEY,
loginId INTEGER NOT NULL PRIMARY KEY, bchName TEXT NOT NULL,
bchId INTEGER NOT NULL,
loginKey TEXT, loginKey TEXT,
deviceKey TEXT, deviceKey TEXT,
bchLimit INTEGER bchLimit INTEGER
@ -99,7 +97,7 @@ public class DatabaseInitializer {
st.executeUpdate(""" st.executeUpdate("""
CREATE TABLE IF NOT EXISTS active_sessions ( CREATE TABLE IF NOT EXISTS active_sessions (
sessionId TEXT NOT NULL PRIMARY KEY, sessionId TEXT NOT NULL PRIMARY KEY,
loginId INTEGER NOT NULL, login TEXT NOT NULL,
sessionPwd TEXT NOT NULL, sessionPwd TEXT NOT NULL,
storagePwd TEXT NOT NULL, storagePwd TEXT NOT NULL,
sessionCreatedAtMs INTEGER NOT NULL, sessionCreatedAtMs INTEGER NOT NULL,
@ -111,33 +109,33 @@ public class DatabaseInitializer {
clientInfoFromClient TEXT, clientInfoFromClient TEXT,
clientInfoFromRequest TEXT, clientInfoFromRequest TEXT,
userLanguage TEXT, userLanguage TEXT,
FOREIGN KEY (loginId) REFERENCES solana_users(loginId) FOREIGN KEY (login) REFERENCES solana_users(login)
); );
"""); """);
st.executeUpdate(""" st.executeUpdate("""
CREATE INDEX IF NOT EXISTS idx_active_sessions_loginId CREATE INDEX IF NOT EXISTS idx_active_sessions_login
ON active_sessions (loginId); ON active_sessions (login);
"""); """);
// 3. users_params // 3. users_params
st.executeUpdate(""" st.executeUpdate("""
CREATE TABLE IF NOT EXISTS users_params ( CREATE TABLE IF NOT EXISTS users_params (
loginId INTEGER NOT NULL, login TEXT NOT NULL,
param TEXT NOT NULL, param TEXT NOT NULL,
bch_channel_id INTEGER NOT NULL DEFAULT 0, bch_channel_id INTEGER NOT NULL DEFAULT 0,
value TEXT, value TEXT,
time_ms INTEGER NOT NULL, time_ms INTEGER NOT NULL,
pubkey_num INTEGER NOT NULL, pubkey_num INTEGER NOT NULL,
signature TEXT, signature TEXT,
FOREIGN KEY (loginId) REFERENCES solana_users(loginId), FOREIGN KEY (login) REFERENCES solana_users(login),
UNIQUE (loginId, param) UNIQUE (login, param)
); );
"""); """);
st.executeUpdate(""" st.executeUpdate("""
CREATE INDEX IF NOT EXISTS idx_users_params_loginId CREATE INDEX IF NOT EXISTS idx_users_params_login
ON users_params (loginId); ON users_params (login);
"""); """);
// 4. ip_geo_cache // 4. ip_geo_cache
@ -154,8 +152,7 @@ public class DatabaseInitializer {
ON ip_geo_cache (updated_at_ms); ON ip_geo_cache (updated_at_ms);
"""); """);
// 5. blockchain_state (MVP) // 5. blockchain_state (MVP) оставляю как было (там уже user_login TEXT)
// TODO: позже можно вынести линии в отдельную таблицу blockchain_line_state и убрать "широкую" схему.
st.executeUpdate(""" st.executeUpdate("""
CREATE TABLE IF NOT EXISTS blockchain_state ( CREATE TABLE IF NOT EXISTS blockchain_state (
blockchain_id INTEGER NOT NULL PRIMARY KEY, blockchain_id INTEGER NOT NULL PRIMARY KEY,
@ -201,11 +198,11 @@ public class DatabaseInitializer {
ON blockchain_state (updated_at_ms); ON blockchain_state (updated_at_ms);
"""); """);
// 6. blocks // 6. blocks PK удалён полностью
st.executeUpdate(""" st.executeUpdate("""
CREATE TABLE IF NOT EXISTS blocks ( CREATE TABLE IF NOT EXISTS blocks (
loginId INTEGER NOT NULL, login TEXT NOT NULL,
blockchainId INTEGER NOT NULL, bchName TEXT NOT NULL,
blockGlobalNumber INTEGER NOT NULL, blockGlobalNumber INTEGER NOT NULL,
blockGlobalPreHashe TEXT NOT NULL, blockGlobalPreHashe TEXT NOT NULL,
@ -217,28 +214,23 @@ public class DatabaseInitializer {
blockByte BLOB, blockByte BLOB,
toLoginId INTEGER NOT NULL, to_login TEXT,
toBlockchainId INTEGER NOT NULL, toBchName TEXT NOT NULL,
toBlockGlobalNumber INTEGER NOT NULL, toBlockGlobalNumber INTEGER NOT NULL,
toBlockHashe TEXT NOT NULL, toBlockHashe TEXT NOT NULL,
-- Выбранный PK (см. BlocksDAO) FOREIGN KEY (login) REFERENCES solana_users(login)
PRIMARY KEY (loginId, blockchainId, blockGlobalNumber, blockLineIndex, blockLineNumber),
-- Связи (по желанию можно ослабить/убрать, если будут "частичные" данные)
FOREIGN KEY (loginId) REFERENCES solana_users(loginId)
); );
"""); """);
// Индексы под типовые запросы: по цепочке/глобальному номеру и по "to*"
st.executeUpdate(""" st.executeUpdate("""
CREATE INDEX IF NOT EXISTS idx_blocks_chain_global CREATE INDEX IF NOT EXISTS idx_blocks_chain_global
ON blocks (loginId, blockchainId, blockGlobalNumber); ON blocks (login, bchName, blockGlobalNumber);
"""); """);
st.executeUpdate(""" st.executeUpdate("""
CREATE INDEX IF NOT EXISTS idx_blocks_to_target CREATE INDEX IF NOT EXISTS idx_blocks_to_target
ON blocks (toLoginId, toBlockchainId, toBlockGlobalNumber); ON blocks (to_login, toBchName, toBlockGlobalNumber);
"""); """);
} }
} }

View File

@ -37,7 +37,7 @@ public final class ActiveSessionsDAO {
String sql = """ String sql = """
INSERT INTO active_sessions ( INSERT INTO active_sessions (
sessionId, sessionId,
loginId, login,
sessionPwd, sessionPwd,
storagePwd, storagePwd,
sessionCreatedAtMs, sessionCreatedAtMs,
@ -54,7 +54,7 @@ public final class ActiveSessionsDAO {
try (PreparedStatement ps = c.prepareStatement(sql)) { try (PreparedStatement ps = c.prepareStatement(sql)) {
ps.setString(1, session.getSessionId()); ps.setString(1, session.getSessionId());
ps.setLong(2, session.getLoginId()); ps.setString(2, session.getLogin());
ps.setString(3, session.getSessionPwd()); ps.setString(3, session.getSessionPwd());
ps.setString(4, session.getStoragePwd()); ps.setString(4, session.getStoragePwd());
ps.setLong(5, session.getSessionCreatedAtMs()); ps.setLong(5, session.getSessionCreatedAtMs());
@ -84,7 +84,7 @@ public final class ActiveSessionsDAO {
String sql = """ String sql = """
SELECT SELECT
sessionId, sessionId,
loginId, login,
sessionPwd, sessionPwd,
storagePwd, storagePwd,
sessionCreatedAtMs, sessionCreatedAtMs,
@ -116,12 +116,12 @@ public final class ActiveSessionsDAO {
} }
} }
/** Получить список по loginId с внешним соединением. Соединение НЕ закрывает. */ /** Получить список по login с внешним соединением. Соединение НЕ закрывает. */
public List<ActiveSessionEntry> getByLoginId(Connection c, long loginId) throws SQLException { public List<ActiveSessionEntry> getByLogin(Connection c, String login) throws SQLException {
String sql = """ String sql = """
SELECT SELECT
sessionId, sessionId,
loginId, login,
sessionPwd, sessionPwd,
storagePwd, storagePwd,
sessionCreatedAtMs, sessionCreatedAtMs,
@ -134,13 +134,13 @@ public final class ActiveSessionsDAO {
clientInfoFromRequest, clientInfoFromRequest,
userLanguage userLanguage
FROM active_sessions FROM active_sessions
WHERE loginId = ? WHERE login = ?
"""; """;
List<ActiveSessionEntry> result = new ArrayList<>(); List<ActiveSessionEntry> result = new ArrayList<>();
try (PreparedStatement ps = c.prepareStatement(sql)) { try (PreparedStatement ps = c.prepareStatement(sql)) {
ps.setLong(1, loginId); ps.setString(1, login);
try (ResultSet rs = ps.executeQuery()) { try (ResultSet rs = ps.executeQuery()) {
while (rs.next()) result.add(mapRow(rs)); while (rs.next()) result.add(mapRow(rs));
} }
@ -149,10 +149,10 @@ public final class ActiveSessionsDAO {
return result; return result;
} }
/** Получить список по loginId без внешнего соединения. Сам открывает/закрывает. */ /** Получить список по login без внешнего соединения. Сам открывает/закрывает. */
public List<ActiveSessionEntry> getByLoginId(long loginId) throws SQLException { public List<ActiveSessionEntry> getByLogin(String login) throws SQLException {
try (Connection c = db.getConnection()) { 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 { private ActiveSessionEntry mapRow(ResultSet rs) throws SQLException {
String sessionId = rs.getString("sessionId"); String sessionId = rs.getString("sessionId");
long loginId = rs.getLong("loginId"); String login = rs.getString("login");
String sessionPwd = rs.getString("sessionPwd"); String sessionPwd = rs.getString("sessionPwd");
String storagePwd = rs.getString("storagePwd"); String storagePwd = rs.getString("storagePwd");
long sessionCreatedAtMs = rs.getLong("sessionCreatedAtMs"); long sessionCreatedAtMs = rs.getLong("sessionCreatedAtMs");
@ -265,7 +265,7 @@ public final class ActiveSessionsDAO {
return new ActiveSessionEntry( return new ActiveSessionEntry(
sessionId, sessionId,
loginId, login,
sessionPwd, sessionPwd,
storagePwd, storagePwd,
sessionCreatedAtMs, sessionCreatedAtMs,

View File

@ -13,7 +13,7 @@ import java.sql.*;
* - методы без Connection сами открывают и закрывают соединение * - методы без Connection сами открывают и закрывают соединение
* *
* Важно: * Важно:
* - PRIMARY KEY: (loginId, blockchainId, blockGlobalNumber, blockLineIndex, blockLineNumber) * - PRIMARY KEY удалён (временно), поэтому "upsert" сделан через UPDATE->INSERT.
*/ */
public final class BlocksDAO { public final class BlocksDAO {
@ -37,8 +37,8 @@ public final class BlocksDAO {
public void insert(Connection c, BlockEntry e) throws SQLException { public void insert(Connection c, BlockEntry e) throws SQLException {
String sql = """ String sql = """
INSERT INTO blocks ( INSERT INTO blocks (
loginId, login,
blockchainId, bchName,
blockGlobalNumber, blockGlobalNumber,
blockGlobalPreHashe, blockGlobalPreHashe,
blockLineIndex, blockLineIndex,
@ -46,8 +46,8 @@ public final class BlocksDAO {
blockLinePreHashe, blockLinePreHashe,
msgType, msgType,
blockByte, blockByte,
toLoginId, to_login,
toBlockchainId, toBchName,
toBlockGlobalNumber, toBlockGlobalNumber,
toBlockHashe toBlockHashe
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
@ -66,45 +66,15 @@ public final class BlocksDAO {
} }
} }
// -------------------- UPSERT -------------------- // -------------------- UPSERT (UPDATE -> INSERT) --------------------
/** /**
* Сохранить (upsert) с внешним соединением. Соединение НЕ закрывает. * Сохранить (условный upsert) с внешним соединением. Соединение НЕ закрывает.
* Если запись с таким PK уже есть обновляем поля. * Без PK/UNIQUE делаем: UPDATE по "ключевым" полям -> если 0 строк, то INSERT.
*/ */
public void upsert(Connection c, BlockEntry e) throws SQLException { public void upsert(Connection c, BlockEntry e) throws SQLException {
String sql = """ int updated = update(c, e);
INSERT INTO blocks ( if (updated == 0) insert(c, e);
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();
}
} }
/** Сохранить (upsert) без внешнего соединения. Сам открывает/закрывает. */ /** Сохранить (upsert) без внешнего соединения. Сам открывает/закрывает. */
@ -116,18 +86,18 @@ public final class BlocksDAO {
// -------------------- SELECT -------------------- // -------------------- SELECT --------------------
/** Получить блок по PK с внешним соединением. Соединение НЕ закрывает. */ /** Получить блок по "PK-подобному" набору полей с внешним соединением. Соединение НЕ закрывает. */
public BlockEntry getByPk(Connection c, public BlockEntry getByPk(Connection c,
long loginId, String login,
long blockchainId, String bchName,
int blockGlobalNumber, int blockGlobalNumber,
int blockLineIndex, int blockLineIndex,
int blockLineNumber) throws SQLException { int blockLineNumber) throws SQLException {
String sql = """ String sql = """
SELECT SELECT
loginId, login,
blockchainId, bchName,
blockGlobalNumber, blockGlobalNumber,
blockGlobalPreHashe, blockGlobalPreHashe,
blockLineIndex, blockLineIndex,
@ -135,22 +105,23 @@ public final class BlocksDAO {
blockLinePreHashe, blockLinePreHashe,
msgType, msgType,
blockByte, blockByte,
toLoginId, to_login,
toBlockchainId, toBchName,
toBlockGlobalNumber, toBlockGlobalNumber,
toBlockHashe toBlockHashe
FROM blocks FROM blocks
WHERE WHERE
loginId = ? login = ?
AND blockchainId = ? AND bchName = ?
AND blockGlobalNumber = ? AND blockGlobalNumber = ?
AND blockLineIndex = ? AND blockLineIndex = ?
AND blockLineNumber = ? AND blockLineNumber = ?
LIMIT 1
"""; """;
try (PreparedStatement ps = c.prepareStatement(sql)) { try (PreparedStatement ps = c.prepareStatement(sql)) {
ps.setLong(1, loginId); ps.setString(1, login);
ps.setLong(2, blockchainId); ps.setString(2, bchName);
ps.setInt(3, blockGlobalNumber); ps.setInt(3, blockGlobalNumber);
ps.setInt(4, blockLineIndex); ps.setInt(4, blockLineIndex);
ps.setInt(5, blockLineNumber); ps.setInt(5, blockLineNumber);
@ -162,22 +133,22 @@ public final class BlocksDAO {
} }
} }
/** Получить блок по PK без внешнего соединения. Сам открывает/закрывает. */ /** Получить блок по "PK-подобному" набору полей без внешнего соединения. Сам открывает/закрывает. */
public BlockEntry getByPk(long loginId, public BlockEntry getByPk(String login,
long blockchainId, String bchName,
int blockGlobalNumber, int blockGlobalNumber,
int blockLineIndex, int blockLineIndex,
int blockLineNumber) throws SQLException { int blockLineNumber) throws SQLException {
try (Connection c = db.getConnection()) { try (Connection c = db.getConnection()) {
return getByPk(c, loginId, blockchainId, blockGlobalNumber, blockLineIndex, blockLineNumber); return getByPk(c, login, bchName, blockGlobalNumber, blockLineIndex, blockLineNumber);
} }
} }
// -------------------- UPDATE -------------------- // -------------------- UPDATE --------------------
/** /**
* Обновить (строго UPDATE) по PK с внешним соединением. Соединение НЕ закрывает. * Обновить (строго UPDATE) по "PK-подобному" набору полей с внешним соединением. Соединение НЕ закрывает.
* Если строки нет updateCount будет 0. * Может обновить >1 строк, если в таблице появились дубликаты.
*/ */
public int update(Connection c, BlockEntry e) throws SQLException { public int update(Connection c, BlockEntry e) throws SQLException {
String sql = """ String sql = """
@ -187,13 +158,13 @@ public final class BlocksDAO {
blockLinePreHashe = ?, blockLinePreHashe = ?,
msgType = ?, msgType = ?,
blockByte = ?, blockByte = ?,
toLoginId = ?, to_login = ?,
toBlockchainId = ?, toBchName = ?,
toBlockGlobalNumber = ?, toBlockGlobalNumber = ?,
toBlockHashe = ? toBlockHashe = ?
WHERE WHERE
loginId = ? login = ?
AND blockchainId = ? AND bchName = ?
AND blockGlobalNumber = ? AND blockGlobalNumber = ?
AND blockLineIndex = ? AND blockLineIndex = ?
AND blockLineNumber = ? AND blockLineNumber = ?
@ -210,13 +181,15 @@ public final class BlocksDAO {
if (bytes != null) ps.setBytes(i++, bytes); if (bytes != null) ps.setBytes(i++, bytes);
else ps.setNull(i++, Types.BLOB); else ps.setNull(i++, Types.BLOB);
ps.setLong(i++, e.getToLoginId()); if (e.getToLogin() != null) ps.setString(i++, e.getToLogin());
ps.setInt(i++, e.getToBlockchainId()); else ps.setNull(i++, Types.VARCHAR);
ps.setString(i++, nn(e.getToBchName()));
ps.setInt(i++, e.getToBlockGlobalNumber()); ps.setInt(i++, e.getToBlockGlobalNumber());
ps.setString(i++, nn(e.getToBlockHashe())); ps.setString(i++, nn(e.getToBlockHashe()));
ps.setLong(i++, e.getLoginId()); ps.setString(i++, e.getLogin());
ps.setLong(i++, e.getBlockchainId()); ps.setString(i++, e.getBchName());
ps.setInt(i++, e.getBlockGlobalNumber()); ps.setInt(i++, e.getBlockGlobalNumber());
ps.setInt(i++, e.getBlockLineIndex()); ps.setInt(i++, e.getBlockLineIndex());
ps.setInt(i++, e.getBlockLineNumber()); ps.setInt(i++, e.getBlockLineNumber());
@ -234,10 +207,13 @@ public final class BlocksDAO {
// -------------------- DELETE -------------------- // -------------------- DELETE --------------------
/** Удалить по PK с внешним соединением. Соединение НЕ закрывает. */ /**
* Удалить по "PK-подобному" набору полей с внешним соединением. Соединение НЕ закрывает.
* Может удалить >1 строк, если есть дубликаты.
*/
public int deleteByPk(Connection c, public int deleteByPk(Connection c,
long loginId, String login,
long blockchainId, String bchName,
int blockGlobalNumber, int blockGlobalNumber,
int blockLineIndex, int blockLineIndex,
int blockLineNumber) throws SQLException { int blockLineNumber) throws SQLException {
@ -245,16 +221,16 @@ public final class BlocksDAO {
String sql = """ String sql = """
DELETE FROM blocks DELETE FROM blocks
WHERE WHERE
loginId = ? login = ?
AND blockchainId = ? AND bchName = ?
AND blockGlobalNumber = ? AND blockGlobalNumber = ?
AND blockLineIndex = ? AND blockLineIndex = ?
AND blockLineNumber = ? AND blockLineNumber = ?
"""; """;
try (PreparedStatement ps = c.prepareStatement(sql)) { try (PreparedStatement ps = c.prepareStatement(sql)) {
ps.setLong(1, loginId); ps.setString(1, login);
ps.setLong(2, blockchainId); ps.setString(2, bchName);
ps.setInt(3, blockGlobalNumber); ps.setInt(3, blockGlobalNumber);
ps.setInt(4, blockLineIndex); ps.setInt(4, blockLineIndex);
ps.setInt(5, blockLineNumber); ps.setInt(5, blockLineNumber);
@ -262,25 +238,25 @@ public final class BlocksDAO {
} }
} }
/** Удалить по PK без внешнего соединения. Сам открывает/закрывает. */ /** Удалить по "PK-подобному" набору полей без внешнего соединения. Сам открывает/закрывает. */
public int deleteByPk(long loginId, public int deleteByPk(String login,
long blockchainId, String bchName,
int blockGlobalNumber, int blockGlobalNumber,
int blockLineIndex, int blockLineIndex,
int blockLineNumber) throws SQLException { int blockLineNumber) throws SQLException {
try (Connection c = db.getConnection()) { try (Connection c = db.getConnection()) {
return deleteByPk(c, loginId, blockchainId, blockGlobalNumber, blockLineIndex, blockLineNumber); return deleteByPk(c, login, bchName, blockGlobalNumber, blockLineIndex, blockLineNumber);
} }
} }
// -------------------- INTERNAL -------------------- // -------------------- INTERNAL --------------------
/** Единая привязка параметров под INSERT/UPSERT — чтобы не разъезжалось. */ /** Единая привязка параметров под INSERT — чтобы не разъезжалось. */
private static void bindAll(PreparedStatement ps, BlockEntry e) throws SQLException { private static void bindAll(PreparedStatement ps, BlockEntry e) throws SQLException {
int i = 1; int i = 1;
ps.setLong(i++, e.getLoginId()); ps.setString(i++, e.getLogin());
ps.setLong(i++, e.getBlockchainId()); ps.setString(i++, e.getBchName());
ps.setInt(i++, e.getBlockGlobalNumber()); ps.setInt(i++, e.getBlockGlobalNumber());
ps.setString(i++, nn(e.getBlockGlobalPreHashe())); ps.setString(i++, nn(e.getBlockGlobalPreHashe()));
@ -294,8 +270,10 @@ public final class BlocksDAO {
if (bytes != null) ps.setBytes(i++, bytes); if (bytes != null) ps.setBytes(i++, bytes);
else ps.setNull(i++, Types.BLOB); else ps.setNull(i++, Types.BLOB);
ps.setLong(i++, e.getToLoginId()); if (e.getToLogin() != null) ps.setString(i++, e.getToLogin());
ps.setInt(i++, e.getToBlockchainId()); else ps.setNull(i++, Types.VARCHAR);
ps.setString(i++, nn(e.getToBchName()));
ps.setInt(i++, e.getToBlockGlobalNumber()); ps.setInt(i++, e.getToBlockGlobalNumber());
ps.setString(i++, nn(e.getToBlockHashe())); ps.setString(i++, nn(e.getToBlockHashe()));
} }
@ -303,8 +281,8 @@ public final class BlocksDAO {
private BlockEntry mapRow(ResultSet rs) throws SQLException { private BlockEntry mapRow(ResultSet rs) throws SQLException {
BlockEntry e = new BlockEntry(); BlockEntry e = new BlockEntry();
e.setLoginId(rs.getLong("loginId")); e.setLogin(rs.getString("login"));
e.setBlockchainId(rs.getLong("blockchainId")); e.setBchName(rs.getString("bchName"));
e.setBlockGlobalNumber(rs.getInt("blockGlobalNumber")); e.setBlockGlobalNumber(rs.getInt("blockGlobalNumber"));
e.setBlockGlobalPreHashe(rs.getString("blockGlobalPreHashe")); e.setBlockGlobalPreHashe(rs.getString("blockGlobalPreHashe"));
@ -316,8 +294,8 @@ public final class BlocksDAO {
e.setBlockByte(rs.getBytes("blockByte")); e.setBlockByte(rs.getBytes("blockByte"));
e.setToLoginId(rs.getLong("toLoginId")); e.setToLogin(rs.getString("to_login"));
e.setToBlockchainId(rs.getInt("toBlockchainId")); e.setToBchName(rs.getString("toBchName"));
e.setToBlockGlobalNumber(rs.getInt("toBlockGlobalNumber")); e.setToBlockGlobalNumber(rs.getInt("toBlockGlobalNumber"));
e.setToBlockHashe(rs.getString("toBlockHashe")); e.setToBlockHashe(rs.getString("toBlockHashe"));

View File

@ -11,16 +11,15 @@ import java.util.List;
* SolanaUsersDAO локальная таблица пользователей из Solana. * SolanaUsersDAO локальная таблица пользователей из Solana.
* *
* Колонки: * Колонки:
* - login TEXT * - login TEXT (PK)
* - loginId INTEGER (PK) * - bchName TEXT
* - bchId INTEGER
* - loginKey TEXT * - loginKey TEXT
* - deviceKey TEXT * - deviceKey TEXT
* - bchLimit INTEGER (может быть NULL) * - bchLimit INTEGER (может быть NULL)
* *
* * Правило: * Правило:
* * - методы с Connection НЕ закрывают соединение * - методы с Connection НЕ закрывают соединение
* * - методы без Connection сами открывают и закрывают соединение * - методы без Connection сами открывают и закрывают соединение
*/ */
public final class SolanaUsersDAO { public final class SolanaUsersDAO {
@ -43,22 +42,18 @@ public final class SolanaUsersDAO {
/** Вставка с внешним соединением. Соединение НЕ закрывает. */ /** Вставка с внешним соединением. Соединение НЕ закрывает. */
public void insert(Connection c, SolanaUserEntry user) throws SQLException { public void insert(Connection c, SolanaUserEntry user) throws SQLException {
String sql = """ String sql = """
INSERT INTO solana_users (login, loginId, bchId, loginKey, deviceKey, bchLimit) INSERT INTO solana_users (login, bchName, loginKey, deviceKey, bchLimit)
VALUES (?, ?, ?, ?, ?, ?) VALUES (?, ?, ?, ?, ?)
"""; """;
try (PreparedStatement ps = c.prepareStatement(sql)) { try (PreparedStatement ps = c.prepareStatement(sql)) {
ps.setString(1, user.getLogin()); ps.setString(1, user.getLogin());
ps.setLong(2, user.getLoginId()); ps.setString(2, user.getBchName());
ps.setLong(3, user.getBchId()); ps.setString(3, user.getLoginKey());
ps.setString(4, user.getLoginKey()); ps.setString(4, user.getDeviceKey());
ps.setString(5, user.getDeviceKey());
if (user.getBchLimit() != null) { if (user.getBchLimit() != null) ps.setInt(5, user.getBchLimit());
ps.setInt(6, user.getBchLimit()); else ps.setNull(5, Types.INTEGER);
} else {
ps.setNull(6, Types.INTEGER);
}
ps.executeUpdate(); ps.executeUpdate();
} }
@ -73,34 +68,10 @@ public final class SolanaUsersDAO {
// -------------------- SELECT -------------------- // -------------------- 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) с внешним соединением. Соединение НЕ закрывает. */ /** Получить по login (case-insensitive) с внешним соединением. Соединение НЕ закрывает. */
public SolanaUserEntry getByLogin(Connection c, String login) throws SQLException { public SolanaUserEntry getByLogin(Connection c, String login) throws SQLException {
String sql = """ String sql = """
SELECT login, loginId, bchId, loginKey, deviceKey, bchLimit SELECT login, bchName, loginKey, deviceKey, bchLimit
FROM solana_users FROM solana_users
WHERE LOWER(login) = LOWER(?) WHERE LOWER(login) = LOWER(?)
"""; """;
@ -124,7 +95,7 @@ public final class SolanaUsersDAO {
/** Поиск по префиксу с внешним соединением. Соединение НЕ закрывает. */ /** Поиск по префиксу с внешним соединением. Соединение НЕ закрывает. */
public List<SolanaUserEntry> searchByLoginPrefix(Connection c, String prefix) throws SQLException { public List<SolanaUserEntry> searchByLoginPrefix(Connection c, String prefix) throws SQLException {
String sql = """ String sql = """
SELECT login, loginId, bchId, loginKey, deviceKey, bchLimit SELECT login, bchName, loginKey, deviceKey, bchLimit
FROM solana_users FROM solana_users
WHERE LOWER(login) LIKE ? WHERE LOWER(login) LIKE ?
ORDER BY login ORDER BY login
@ -154,9 +125,8 @@ public final class SolanaUsersDAO {
private SolanaUserEntry mapRow(ResultSet rs) throws SQLException { private SolanaUserEntry mapRow(ResultSet rs) throws SQLException {
return new SolanaUserEntry( return new SolanaUserEntry(
rs.getLong("loginId"),
rs.getString("login"), rs.getString("login"),
rs.getLong("bchId"), rs.getString("bchName"),
rs.getString("loginKey"), rs.getString("loginKey"),
rs.getString("deviceKey"), rs.getString("deviceKey"),
rs.getObject("bchLimit") != null ? rs.getInt("bchLimit") : null rs.getObject("bchLimit") != null ? rs.getInt("bchLimit") : null

View File

@ -30,7 +30,7 @@ public final class UserParamsDAO {
public void upsert(Connection c, UserParamEntry param) throws SQLException { public void upsert(Connection c, UserParamEntry param) throws SQLException {
String sql = """ String sql = """
INSERT INTO users_params ( INSERT INTO users_params (
loginId, login,
param, param,
bch_channel_id, bch_channel_id,
value, value,
@ -38,7 +38,7 @@ public final class UserParamsDAO {
pubkey_num, pubkey_num,
signature signature
) VALUES (?, ?, ?, ?, ?, ?, ?) ) VALUES (?, ?, ?, ?, ?, ?, ?)
ON CONFLICT(loginId, param) ON CONFLICT(login, param)
DO UPDATE SET DO UPDATE SET
bch_channel_id = excluded.bch_channel_id, bch_channel_id = excluded.bch_channel_id,
value = excluded.value, value = excluded.value,
@ -48,7 +48,7 @@ public final class UserParamsDAO {
"""; """;
try (PreparedStatement ps = c.prepareStatement(sql)) { try (PreparedStatement ps = c.prepareStatement(sql)) {
ps.setLong(1, param.getLoginId()); ps.setString(1, param.getLogin());
ps.setString(2, param.getParam()); ps.setString(2, param.getParam());
ps.setLong(3, param.getBchChannelId()); ps.setLong(3, param.getBchChannelId());
ps.setString(4, param.getValue()); ps.setString(4, param.getValue());
@ -69,10 +69,10 @@ public final class UserParamsDAO {
// -------------------- SELECT -------------------- // -------------------- 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 = """ String sql = """
SELECT SELECT
loginId, login,
param, param,
bch_channel_id, bch_channel_id,
value, value,
@ -80,11 +80,11 @@ public final class UserParamsDAO {
pubkey_num, pubkey_num,
signature signature
FROM users_params FROM users_params
WHERE loginId = ? AND param = ? WHERE login = ? AND param = ?
"""; """;
try (PreparedStatement ps = c.prepareStatement(sql)) { try (PreparedStatement ps = c.prepareStatement(sql)) {
ps.setLong(1, loginId); ps.setString(1, login);
ps.setString(2, paramName); ps.setString(2, paramName);
try (ResultSet rs = ps.executeQuery()) { try (ResultSet rs = ps.executeQuery()) {
if (!rs.next()) return null; 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()) { 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 = """ String sql = """
SELECT SELECT
loginId, login,
param, param,
bch_channel_id, bch_channel_id,
value, value,
@ -112,14 +112,14 @@ public final class UserParamsDAO {
pubkey_num, pubkey_num,
signature signature
FROM users_params FROM users_params
WHERE loginId = ? WHERE login = ?
ORDER BY time_ms DESC ORDER BY time_ms DESC
"""; """;
List<UserParamEntry> result = new ArrayList<>(); List<UserParamEntry> result = new ArrayList<>();
try (PreparedStatement ps = c.prepareStatement(sql)) { try (PreparedStatement ps = c.prepareStatement(sql)) {
ps.setLong(1, loginId); ps.setString(1, login);
try (ResultSet rs = ps.executeQuery()) { try (ResultSet rs = ps.executeQuery()) {
while (rs.next()) result.add(mapRow(rs)); 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()) { 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 { private UserParamEntry mapRow(ResultSet rs) throws SQLException {
return new UserParamEntry( return new UserParamEntry(
rs.getLong("loginId"), rs.getString("login"),
rs.getString("param"), rs.getString("param"),
rs.getLong("bch_channel_id"), rs.getLong("bch_channel_id"),
rs.getString("value"), rs.getString("value"),

View File

@ -3,27 +3,13 @@ package shine.db.entities;
/** /**
* Модель активной сессии (таблица active_sessions). * Модель активной сессии (таблица active_sessions).
* *
* CREATE TABLE active_sessions ( * Теперь вместо loginId:
* sessionId TEXT NOT NULL PRIMARY KEY, * - login TEXT NOT NULL (FK -> solana_users(login))
* loginId INTEGER NOT NULL,
* sessionPwd TEXT NOT NULL,
* storagePwd TEXT NOT NULL,
* sessionCreatedAtMs INTEGER NOT NULL,
* lastAuthirificatedAtMs INTEGER NOT NULL,
* pushEndpoint TEXT,
* pushP256dhKey TEXT,
* pushAuthKey TEXT,
* clientIp TEXT,
* clientInfoFromClient TEXT,
* clientInfoFromRequest TEXT,
* userLanguage TEXT,
* FOREIGN KEY (loginId) REFERENCES solana_users(loginId)
* );
*/ */
public class ActiveSessionEntry { public class ActiveSessionEntry {
private String sessionId; // TEXT base64(32 bytes) private String sessionId; // TEXT base64(32 bytes)
private long loginId; // INTEGER private String login; // TEXT NOT NULL
private String sessionPwd; // TEXT private String sessionPwd; // TEXT
private String storagePwd; // TEXT private String storagePwd; // TEXT
private long sessionCreatedAtMs; // INTEGER private long sessionCreatedAtMs; // INTEGER
@ -42,7 +28,7 @@ public class ActiveSessionEntry {
} }
public ActiveSessionEntry(String sessionId, public ActiveSessionEntry(String sessionId,
long loginId, String login,
String sessionPwd, String sessionPwd,
String storagePwd, String storagePwd,
long sessionCreatedAtMs, long sessionCreatedAtMs,
@ -55,7 +41,7 @@ public class ActiveSessionEntry {
String clientInfoFromRequest, String clientInfoFromRequest,
String userLanguage) { String userLanguage) {
this.sessionId = sessionId; this.sessionId = sessionId;
this.loginId = loginId; this.login = login;
this.sessionPwd = sessionPwd; this.sessionPwd = sessionPwd;
this.storagePwd = storagePwd; this.storagePwd = storagePwd;
this.sessionCreatedAtMs = sessionCreatedAtMs; this.sessionCreatedAtMs = sessionCreatedAtMs;
@ -69,109 +55,42 @@ public class ActiveSessionEntry {
this.userLanguage = userLanguage; this.userLanguage = userLanguage;
} }
// --- getters / setters --- public String getSessionId() { return sessionId; }
public void setSessionId(String sessionId) { this.sessionId = sessionId; }
public String getSessionId() { public String getLogin() { return login; }
return sessionId; public void setLogin(String login) { this.login = login; }
}
public void setSessionId(String sessionId) { public String getSessionPwd() { return sessionPwd; }
this.sessionId = sessionId; public void setSessionPwd(String sessionPwd) { this.sessionPwd = sessionPwd; }
}
public long getLoginId() { public String getStoragePwd() { return storagePwd; }
return loginId; public void setStoragePwd(String storagePwd) { this.storagePwd = storagePwd; }
}
public void setLoginId(long loginId) { public long getSessionCreatedAtMs() { return sessionCreatedAtMs; }
this.loginId = loginId; public void setSessionCreatedAtMs(long sessionCreatedAtMs) { this.sessionCreatedAtMs = sessionCreatedAtMs; }
}
public String getSessionPwd() { public long getLastAuthirificatedAtMs() { return lastAuthirificatedAtMs; }
return sessionPwd; public void setLastAuthirificatedAtMs(long lastAuthirificatedAtMs) { this.lastAuthirificatedAtMs = lastAuthirificatedAtMs; }
}
public void setSessionPwd(String sessionPwd) { public String getPushEndpoint() { return pushEndpoint; }
this.sessionPwd = sessionPwd; public void setPushEndpoint(String pushEndpoint) { this.pushEndpoint = pushEndpoint; }
}
public String getStoragePwd() { public String getPushP256dhKey() { return pushP256dhKey; }
return storagePwd; public void setPushP256dhKey(String pushP256dhKey) { this.pushP256dhKey = pushP256dhKey; }
}
public void setStoragePwd(String storagePwd) { public String getPushAuthKey() { return pushAuthKey; }
this.storagePwd = storagePwd; public void setPushAuthKey(String pushAuthKey) { this.pushAuthKey = pushAuthKey; }
}
public long getSessionCreatedAtMs() { public String getClientIp() { return clientIp; }
return sessionCreatedAtMs; public void setClientIp(String clientIp) { this.clientIp = clientIp; }
}
public void setSessionCreatedAtMs(long sessionCreatedAtMs) { public String getClientInfoFromClient() { return clientInfoFromClient; }
this.sessionCreatedAtMs = sessionCreatedAtMs; public void setClientInfoFromClient(String clientInfoFromClient) { this.clientInfoFromClient = clientInfoFromClient; }
}
public long getLastAuthirificatedAtMs() { public String getClientInfoFromRequest() { return clientInfoFromRequest; }
return lastAuthirificatedAtMs; public void setClientInfoFromRequest(String clientInfoFromRequest) { this.clientInfoFromRequest = clientInfoFromRequest; }
}
public void setLastAuthirificatedAtMs(long lastAuthirificatedAtMs) { public String getUserLanguage() { return userLanguage; }
this.lastAuthirificatedAtMs = lastAuthirificatedAtMs; public void setUserLanguage(String userLanguage) { this.userLanguage = userLanguage; }
}
public String getPushEndpoint() {
return pushEndpoint;
}
public void setPushEndpoint(String pushEndpoint) {
this.pushEndpoint = pushEndpoint;
}
public String getPushP256dhKey() {
return pushP256dhKey;
}
public void setPushP256dhKey(String pushP256dhKey) {
this.pushP256dhKey = pushP256dhKey;
}
public String getPushAuthKey() {
return pushAuthKey;
}
public void setPushAuthKey(String pushAuthKey) {
this.pushAuthKey = pushAuthKey;
}
public String getClientIp() {
return clientIp;
}
public void setClientIp(String clientIp) {
this.clientIp = clientIp;
}
public String getClientInfoFromClient() {
return clientInfoFromClient;
}
public void setClientInfoFromClient(String clientInfoFromClient) {
this.clientInfoFromClient = clientInfoFromClient;
}
public String getClientInfoFromRequest() {
return clientInfoFromRequest;
}
public void setClientInfoFromRequest(String clientInfoFromRequest) {
this.clientInfoFromRequest = clientInfoFromRequest;
}
public String getUserLanguage() {
return userLanguage;
}
public void setUserLanguage(String userLanguage) {
this.userLanguage = userLanguage;
}
} }

View File

@ -3,22 +3,19 @@ package shine.db.entities;
/** /**
* Запись блока (таблица blocks). * Запись блока (таблица blocks).
* *
* Идея: * Теперь:
* - Храним и "глобальную" позицию (blockGlobalNumber + blockGlobalPreHashe), * - login TEXT NOT NULL
* и "линейную" позицию (blockLineIndex + blockLineNumber + blockLinePreHashe), * - bchName TEXT NOT NULL (идёт сразу после login)
* плюс полезные поля маршрутизации (to*). * - to_login TEXT nullable
* - toBchName TEXT NOT NULL (идёт сразу после to_login)
* *
* В БД: * PRIMARY KEY пока убран вообще.
* - int64 -> INTEGER (Java long)
* - int32 -> INTEGER (Java int)
* - int16 -> INTEGER (Java int/short)
* - bytes -> BLOB (Java byte[])
* - hashes -> TEXT
*/ */
public class BlockEntry { public class BlockEntry {
private long loginId; // int64 private String login; // TEXT
private long blockchainId; // int64 private String bchName; // TEXT
private int blockGlobalNumber; // int32 private int blockGlobalNumber; // int32
private String blockGlobalPreHashe; // TEXT private String blockGlobalPreHashe; // TEXT
@ -30,15 +27,15 @@ public class BlockEntry {
private byte[] blockByte; // BLOB private byte[] blockByte; // BLOB
private long toLoginId; // int64 private String toLogin; // TEXT nullable
private int toBlockchainId; // int32 private String toBchName; // TEXT
private int toBlockGlobalNumber; // int32 private int toBlockGlobalNumber; // int32
private String toBlockHashe; // TEXT private String toBlockHashe; // TEXT
public BlockEntry() {} public BlockEntry() {}
public BlockEntry(long loginId, public BlockEntry(String login,
long blockchainId, String bchName,
int blockGlobalNumber, int blockGlobalNumber,
String blockGlobalPreHashe, String blockGlobalPreHashe,
int blockLineIndex, int blockLineIndex,
@ -46,12 +43,12 @@ public class BlockEntry {
String blockLinePreHashe, String blockLinePreHashe,
int msgType, int msgType,
byte[] blockByte, byte[] blockByte,
long toLoginId, String toLogin,
int toBlockchainId, String toBchName,
int toBlockGlobalNumber, int toBlockGlobalNumber,
String toBlockHashe) { String toBlockHashe) {
this.loginId = loginId; this.login = login;
this.blockchainId = blockchainId; this.bchName = bchName;
this.blockGlobalNumber = blockGlobalNumber; this.blockGlobalNumber = blockGlobalNumber;
this.blockGlobalPreHashe = blockGlobalPreHashe; this.blockGlobalPreHashe = blockGlobalPreHashe;
this.blockLineIndex = blockLineIndex; this.blockLineIndex = blockLineIndex;
@ -59,17 +56,17 @@ public class BlockEntry {
this.blockLinePreHashe = blockLinePreHashe; this.blockLinePreHashe = blockLinePreHashe;
this.msgType = msgType; this.msgType = msgType;
this.blockByte = blockByte; this.blockByte = blockByte;
this.toLoginId = toLoginId; this.toLogin = toLogin;
this.toBlockchainId = toBlockchainId; this.toBchName = toBchName;
this.toBlockGlobalNumber = toBlockGlobalNumber; this.toBlockGlobalNumber = toBlockGlobalNumber;
this.toBlockHashe = toBlockHashe; this.toBlockHashe = toBlockHashe;
} }
public long getLoginId() { return loginId; } public String getLogin() { return login; }
public void setLoginId(long loginId) { this.loginId = loginId; } public void setLogin(String login) { this.login = login; }
public long getBlockchainId() { return blockchainId; } public String getBchName() { return bchName; }
public void setBlockchainId(long blockchainId) { this.blockchainId = blockchainId; } public void setBchName(String bchName) { this.bchName = bchName; }
public int getBlockGlobalNumber() { return blockGlobalNumber; } public int getBlockGlobalNumber() { return blockGlobalNumber; }
public void setBlockGlobalNumber(int blockGlobalNumber) { this.blockGlobalNumber = blockGlobalNumber; } public void setBlockGlobalNumber(int blockGlobalNumber) { this.blockGlobalNumber = blockGlobalNumber; }
@ -92,11 +89,11 @@ public class BlockEntry {
public byte[] getBlockByte() { return blockByte; } public byte[] getBlockByte() { return blockByte; }
public void setBlockByte(byte[] blockByte) { this.blockByte = blockByte; } public void setBlockByte(byte[] blockByte) { this.blockByte = blockByte; }
public long getToLoginId() { return toLoginId; } public String getToLogin() { return toLogin; }
public void setToLoginId(long toLoginId) { this.toLoginId = toLoginId; } public void setToLogin(String toLogin) { this.toLogin = toLogin; }
public int getToBlockchainId() { return toBlockchainId; } public String getToBchName() { return toBchName; }
public void setToBlockchainId(int toBlockchainId) { this.toBlockchainId = toBlockchainId; } public void setToBchName(String toBchName) { this.toBchName = toBchName; }
public int getToBlockGlobalNumber() { return toBlockGlobalNumber; } public int getToBlockGlobalNumber() { return toBlockGlobalNumber; }
public void setToBlockGlobalNumber(int toBlockGlobalNumber) { this.toBlockGlobalNumber = toBlockGlobalNumber; } public void setToBlockGlobalNumber(int toBlockGlobalNumber) { this.toBlockGlobalNumber = toBlockGlobalNumber; }

View File

@ -3,86 +3,50 @@ package shine.db.entities;
/** /**
* Локальная копия пользователя из Solana. * Локальная копия пользователя из Solana.
* *
* Храним: * Теперь:
* - login / loginId; * - login PRIMARY KEY (TEXT)
* - bchId id персонального блокчейна; * - bchName имя/идентификатор персонального блокчейна (TEXT)
* - loginKey публичный ключ для логина / авторизации; * - loginKey публичный ключ логина
* - deviceKey публичный ключ устройства (второй ключ); * - deviceKey публичный ключ устройства
* - bchLimit лимит по количеству блоков / размеру цепочки (может быть null). * - bchLimit лимит (может быть null)
*/ */
public class SolanaUserEntry { public class SolanaUserEntry {
private long loginId; private String login; // TEXT PK
private String login; private String bchName; // TEXT NOT NULL
private long bchId; private String loginKey; // TEXT
private String loginKey; // раньше pubkey0 private String deviceKey; // TEXT
private String deviceKey; // раньше pubkey1 private Integer bchLimit; // INTEGER nullable
private Integer bchLimit; // может быть null
public SolanaUserEntry() { public SolanaUserEntry() {
} }
public SolanaUserEntry(long loginId, public SolanaUserEntry(String login,
String login, String bchName,
long bchId,
String loginKey, String loginKey,
String deviceKey, String deviceKey,
Integer bchLimit) { Integer bchLimit) {
this.loginId = loginId;
this.login = login; this.login = login;
this.bchId = bchId; this.bchName = bchName;
this.loginKey = loginKey; this.loginKey = loginKey;
this.deviceKey = deviceKey; this.deviceKey = deviceKey;
this.bchLimit = bchLimit; this.bchLimit = bchLimit;
} }
public long getLoginId() { public String getLogin() { return login; }
return loginId; public void setLogin(String login) { this.login = login; }
}
public void setLoginId(long loginId) { public String getBchName() { return bchName; }
this.loginId = loginId; public void setBchName(String bchName) { this.bchName = bchName; }
}
public String getLogin() {
return login;
}
public void setLogin(String login) {
this.login = login;
}
public long getBchId() {
return bchId;
}
public void setBchId(long bchId) {
this.bchId = bchId;
}
/** Публичный ключ логина (основной ключ пользователя). */ /** Публичный ключ логина (основной ключ пользователя). */
public String getLoginKey() { public String getLoginKey() { return loginKey; }
return loginKey; public void setLoginKey(String loginKey) { this.loginKey = loginKey; }
}
public void setLoginKey(String loginKey) {
this.loginKey = loginKey;
}
/** Публичный ключ устройства (device key). */ /** Публичный ключ устройства (device key). */
public String getDeviceKey() { public String getDeviceKey() { return deviceKey; }
return deviceKey; public void setDeviceKey(String deviceKey) { this.deviceKey = deviceKey; }
}
public void setDeviceKey(String deviceKey) { public Integer getBchLimit() { return bchLimit; }
this.deviceKey = deviceKey; public void setBchLimit(Integer bchLimit) { this.bchLimit = bchLimit; }
}
public Integer getBchLimit() {
return bchLimit;
}
public void setBchLimit(Integer bchLimit) {
this.bchLimit = bchLimit;
}
} }

View File

@ -2,7 +2,7 @@ package shine.db.entities;
public class UserParamEntry { public class UserParamEntry {
private long loginId; private String login; // TEXT NOT NULL
private String param; private String param;
private long bchChannelId; // новый канал, 8 байт, может быть 0 private long bchChannelId; // новый канал, 8 байт, может быть 0
private String value; private String value;
@ -13,14 +13,14 @@ public class UserParamEntry {
public UserParamEntry() { public UserParamEntry() {
} }
public UserParamEntry(long loginId, public UserParamEntry(String login,
String param, String param,
long bchChannelId, long bchChannelId,
String value, String value,
long timeMs, long timeMs,
short pubkeyNum, short pubkeyNum,
String signature) { String signature) {
this.loginId = loginId; this.login = login;
this.param = param; this.param = param;
this.bchChannelId = bchChannelId; this.bchChannelId = bchChannelId;
this.value = value; this.value = value;
@ -29,59 +29,24 @@ public class UserParamEntry {
this.signature = signature; this.signature = signature;
} }
public long getLoginId() { public String getLogin() { return login; }
return loginId; public void setLogin(String login) { this.login = login; }
}
public void setLoginId(long loginId) { public String getParam() { return param; }
this.loginId = loginId; public void setParam(String param) { this.param = param; }
}
public String getParam() { public long getBchChannelId() { return bchChannelId; }
return param; public void setBchChannelId(long bchChannelId) { this.bchChannelId = bchChannelId; }
}
public void setParam(String param) { public String getValue() { return value; }
this.param = param; public void setValue(String value) { this.value = value; }
}
public long getBchChannelId() { public long getTimeMs() { return timeMs; }
return bchChannelId; public void setTimeMs(long timeMs) { this.timeMs = timeMs; }
}
public void setBchChannelId(long bchChannelId) { public short getPubkeyNum() { return pubkeyNum; }
this.bchChannelId = bchChannelId; public void setPubkeyNum(short pubkeyNum) { this.pubkeyNum = pubkeyNum; }
}
public String getValue() { public String getSignature() { return signature; }
return value; public void setSignature(String signature) { this.signature = signature; }
}
public void setValue(String value) {
this.value = value;
}
public long getTimeMs() {
return timeMs;
}
public void setTimeMs(long timeMs) {
this.timeMs = timeMs;
}
public short getPubkeyNum() {
return pubkeyNum;
}
public void setPubkeyNum(short pubkeyNum) {
this.pubkeyNum = pubkeyNum;
}
public String getSignature() {
return signature;
}
public void setSignature(String signature) {
this.signature = signature;
}
} }