На этом с форматом разобрались и отложили всё на праздничные выходные
This commit is contained in:
AidarKC 2026-01-10 01:47:00 +03:00
parent 9d0da4b39f
commit 973a632b85
4 changed files with 169 additions and 30 deletions

View File

@ -0,0 +1,54 @@
0. ПЕРЕДЕЛАТЬ ВСЁ НА НОВЫЙ ФОРМАТ!!
ВЫНЕСТИ ЭТИ ТРИ ВЕЩИ В ОБЩИЙ ПАРСЕР
* [2] type - тип соощения
* [2] Sиbtype - субтип сообщения
* [2] version - версия формата соощения
А ОСТАЛЬНОЕ В РЕАЛИЗАЦИЮ
ПЕРЕДЕЛАЕМ БД
1. СДЕЛАЕМ ЛИНИЮ ТОЛЬКО ДЛЯ ТЕХ ТИПОВ КОМУ НАДО (ЛАЙКАМ И ОТВЕТАМ НЕ НАДО)
(НОМЕР СООБЩЕНИЯ В ЛИНИИ ХРАНИТЬ В БЛОКАХ ВРОДЕ И НЕ НАДО ТЕМ БОЛЕЕ ЕГО ПОТОМ ПЕРЕПРОВЕРЯТЬ ВСЁ РАВНО)
А МОЖЕТ И НАДО ТК КАК ПО ОДНОМУ БЛОКУ ( ИЛИ ЧАСТИ БЛОКОВ ПОНЯТЬ КАКАЯ ЭТО ЧАСТЬ ПЕРЕПИСКИ - ВЕДЬ ГЛОБАЛ НОМЕР ВООБЩЕ НЕ ПОКАЗАТЕЛЬ)
В БД ПОМЕЧАТЬ ЧТО БЛОК ИЗ ЭТОЙ ЛИНИИ (ДЛЯ БЫСТРОГО ПОИСКА)
А УНИКАЛЬНЫЙ НОМЕР ЛИНИИ ЭТО ПО СУТИ НОМЕР СООБЩЕНИЯ СОЗДАВШЕГО ЛИНИЮ КАНАЛ (НУ И ФОРМАТ СООБЩЕНИЯ НАЧАЛА ЛИНИИ - КАНАЛА)
2. МОЖЕТ СДЕЛАТЬ АВТОГЕНЕРАЦИЮ ПРОСТЫНЕЙ ДЛЯ ПАРСЕРОВ (И МОЖЕТ И ХЭНДЛЕРОВ(И ТАМ ЖЕ РЕКВЕСТ ПОДГРУЗИТЬСЯ))
3. СООТВЕТСТВЕННО удалить НАПИСАТЬ/ПЕРОВЕРИТЬ НОРМАЛЬНЫЙ SubscriptionsDAO - ТК СТАРЫЙ РАБОТАЛ НО НА ДРУГОМ ФОРМАТЕ И ТИПО КРИВО
и дальше:
ЗДЕЛАТЬ ТРИ ЗАПРОСА:
СПИСОК КАНАЛОВ НА КОГО ПОДПИСАН И ПО СКОЛЬКО СООБЩЕНИЙ И ПОСЛДНИЙ ТЕКСТ
ДОДЕЛАТЬ И СВЯЗ ПОДПИСАН УЖЕ НЕ ТОЛЬКО НА ЧЕЛА НО И НА КАНАЛ. (И ПОЛУЧАЕТСЯ ЕСТЬ ОБЩИЙ КАНАЛЛ ПОСТОВ (НО НЕКОТОРЫЕ ПОСТЫ В НИКУДА-
А НЕКОТОРЫЕ ПОСТЫ ОБЪЯВЛЕНИЕ КАНАЛА
СПИСОК СООБЩЕНИЙ В КАНАЛЕ
ОПСИСАНИЕ ОДНОГО СОООБЩЕНИЯ (С ИСТОРИЕЙ ДО НАЧАЛА ВЕТКИ И СО ВСЕМИ ОТВЕТАМИ НА НЕГО)
(НУ И В БУДУЩЕМ четвёртый ИСТОРИЮ сообщения ПО ЕДИТУ)
И ПОМЯТКА
ВСЕГДА СЧИТАЕМ ПО ПОСЛЕДНЕМУ БЛОКЧЕЙНУ ДОСТУПНОМУ ПОЛЬЗОВАТЕЛЮ
ХОТЯ ССЫЛКА ПО НОМЕРУ БЛОКЧЕЙНА КУДА ДОБАВИЛИ
ЛАЙКИ И ОТВЕТЫ ПИШЕМ НА НОМЕР СООБЩЕНИЯ ЕДИТА
(СЧИТАЕМ ТРИГЕРОМ И НА ОРИГИНАЛЬНЫЙ СУМАРНОЕ И ОТДЕЛЬНО НА НЕГО, И НА КАЖДЫЙ ЕДИТ ОТДЕЛЬНО)
ОТВЕТЫ ПОКАЗЫВАЕМ ВСЕ ВРАЗ

View File

@ -10,13 +10,13 @@ import java.util.Arrays;
import java.util.Objects; import java.util.Objects;
/** /**
* BchBlockEntry_new универсальный блок нового формата. * старый формат
* *
* RAW (BigEndian): * RAW (BigEndian):
* [4] recordSize (int) = размер RAW (включая этот заголовок), БЕЗ signature+hash * [4] recordSize (int) = размер RAW (включая этот заголовок), БЕЗ signature+hash
* [4] recordNumber (int) глобальный номер блока * [4] recordNumber (int) глобальный номер блока
* [8] timestamp (long) unix seconds * [8] timestamp (long) unix seconds
* [2] lineIndex (short) [2] lineIndex (short)
* [4] lineNumber (int) * [4] lineNumber (int)
* [N] bodyBytes (body, начинается с [type][version]) * [N] bodyBytes (body, начинается с [type][version])
* *
@ -24,6 +24,56 @@ import java.util.Objects;
* [64] signature64 (Ed25519) * [64] signature64 (Ed25519)
* [32] hash32 (SHA-256) * [32] hash32 (SHA-256)
*/ */
СМОТРИ файл : "!!! TODO что бы не забыть"
/**
* BchBlockEntry универсальный блок нового формата.
*
* RAW (BigEndian):
* Неизменное заглавие
* [32] prevHash32 (SHA-256) ХЭЩ ПРИВЕДУЩЕГО
* [4] blockSize (int) = размер RAW (включая этот заголовок), БЕЗ signature
* [4] blockNumber (int) номер блока
* [8] timestamp (long) unix seconds
* Само сообщение
* [2] type - тип соощения
* [2] Sиbtype - субтип сообщения
* [2] version - версия формата соощения
* [4] prevLineNumber НОМЕР ПРИВЕДУЩЕГО СООБЩЕНИЯ В ЛИНИИ - может быть а может и небыть в зависимости от типа сообщения
* [32] prevLineHash ХЭШ ПРИВЕДУЩЕГО СООБЩЕНИЯ В ЛИНИИ - может быть а может и небыть в зависимости от типа сообщения
* [N] bodyBytes (ОСТАЛЬНЫЕ БАЙТЫ])
* TAIL (НЕ входит в recordSize):
* [64] signature64 (Ed25519)
* И хэш в конце блока мы не храним, тк он будет в начале следующего блока. А для проверки блока оно не нужно тк мы каждый раз провеяем подпись . А она основана на хэше
*
* [32] hash32 (SHA-256)
*/
public final class BchBlockEntry { public final class BchBlockEntry {
public static final int SIGNATURE_LEN = 64; public static final int SIGNATURE_LEN = 64;

View File

@ -1,7 +1,7 @@
package blockchain; package shine.db;
/** /**
* shine.db.MsgSubType единое место для ВСЕХ subType сообщений (msg_sub_type). * MsgSubType единое место для ВСЕХ subType сообщений (msg_sub_type).
* *
* Правило: * Правило:
* - НИКАКИХ "магических чисел" subType по проекту. * - НИКАКИХ "магических чисел" subType по проекту.
@ -14,18 +14,23 @@ public final class MsgSubType {
private MsgSubType() {} private MsgSubType() {}
/* ===================== HEADER (msg_type=0) ===================== */
/** HeaderBody: subType всегда 0 (compat). */
public static final short HEADER_COMPAT = 0;
/* ===================== TEXT (msg_type=1) ===================== */ /* ===================== TEXT (msg_type=1) ===================== */
/** Новое сообщение (начало ветки). */ /** Новая публикация. */
public static final short TEXT_NEW = 1; public static final short TEXT_NEW = 1;
/** Ответ на сообщение (reply). */ /** Ответ (reply). */
public static final short TEXT_REPLY = 2; public static final short TEXT_REPLY = 2;
/** Репост (repost). */ /** Репост (repost). */
public static final short TEXT_REPOST = 3; public static final short TEXT_REPOST = 3;
/** Редактирование (edit). ВАЖНО: серверное значение = 10. */ /** Редактирование (edit). */
public static final short TEXT_EDIT = 10; public static final short TEXT_EDIT = 10;
/* ===================== REACTION (msg_type=2) ===================== */ /* ===================== REACTION (msg_type=2) ===================== */
@ -34,6 +39,11 @@ public final class MsgSubType {
public static final short REACTION_LIKE = 1; public static final short REACTION_LIKE = 1;
/* ===================== CONNECTION (msg_type=3) ===================== */ /* ===================== CONNECTION (msg_type=3) ===================== */
/**
* Совпадает с ConnectionBody:
* SET: FRIEND=10, CONTACT=20, FOLLOW=30
* UNSET: UNFRIEND=11, UNCONTACT=21, UNFOLLOW=31
*/
/** Добавить в друзья. */ /** Добавить в друзья. */
public static final short CONNECTION_FRIEND = 10; public static final short CONNECTION_FRIEND = 10;
@ -41,15 +51,22 @@ public final class MsgSubType {
/** Удалить из друзей. */ /** Удалить из друзей. */
public static final short CONNECTION_UNFRIEND = 11; public static final short CONNECTION_UNFRIEND = 11;
/** Добавить в контакты. */
public static final short CONNECTION_CONTACT = 20;
/** Удалить из контактов. */
public static final short CONNECTION_UNCONTACT = 21;
/** Подписаться (follow). */ /** Подписаться (follow). */
public static final short CONNECTION_FOLLOW = 20; public static final short CONNECTION_FOLLOW = 30;
/** Отписаться (unfollow). */ /** Отписаться (unfollow). */
public static final short CONNECTION_UNFOLLOW = 21; public static final short CONNECTION_UNFOLLOW = 31;
/** Заблокировать. */ /* ===================== USER_PARAM (msg_type=4) ===================== */
public static final short CONNECTION_BLOCK = 30;
/** Разблокировать. */ /** Параметр профиля key/value (обе строки). */
public static final short CONNECTION_UNBLOCK = 31; public static final short USER_PARAM_TEXT_TEXT = 1;
}
}

View File

@ -1,31 +1,33 @@
package shine.db; package shine.db;
/** /**
* shine.db.MsgSubType единое место для ВСЕХ subType сообщений (msg_sub_type). * MsgSubType единое место для ВСЕХ subType сообщений (msg_sub_type).
* *
* Правило: * ВАЖНО:
* - НИКАКИХ "магических чисел" subType по проекту. * - Значения должны совпадать с body-классами (TextBody/ReactionBody/ConnectionBody/UserParamBody/HeaderBody).
* - В тестах, в body-классах и в SQL-триггерах используем только эти константы. * - После релиза менять числа нельзя (иначе ломается совместимость данных).
*
* Важно:
* - Значения менять после релиза нельзя (иначе сломается совместимость).
*/ */
public final class MsgSubType { public final class MsgSubType {
private MsgSubType() {} private MsgSubType() {}
/* ===================== HEADER (msg_type=0) ===================== */
/** HeaderBody: subType всегда 0 (compat). */
public static final short HEADER_COMPAT = 0;
/* ===================== TEXT (msg_type=1) ===================== */ /* ===================== TEXT (msg_type=1) ===================== */
/** Новое сообщение (начало ветки). */ /** Новая публикация. */
public static final short TEXT_NEW = 1; public static final short TEXT_NEW = 1;
/** Ответ на сообщение (reply). */ /** Ответ (reply). */
public static final short TEXT_REPLY = 2; public static final short TEXT_REPLY = 2;
/** Репост (repost). */ /** Репост (repost). */
public static final short TEXT_REPOST = 3; public static final short TEXT_REPOST = 3;
/** Редактирование (edit). ВАЖНО: серверное значение = 10. */ /** Редактирование (edit). */
public static final short TEXT_EDIT = 10; public static final short TEXT_EDIT = 10;
/* ===================== REACTION (msg_type=2) ===================== */ /* ===================== REACTION (msg_type=2) ===================== */
@ -34,6 +36,11 @@ public final class MsgSubType {
public static final short REACTION_LIKE = 1; public static final short REACTION_LIKE = 1;
/* ===================== CONNECTION (msg_type=3) ===================== */ /* ===================== CONNECTION (msg_type=3) ===================== */
/**
* Совпадает с ConnectionBody:
* SET: FRIEND=10, CONTACT=20, FOLLOW=30
* UNSET: UNFRIEND=11, UNCONTACT=21, UNFOLLOW=31
*/
/** Добавить в друзья. */ /** Добавить в друзья. */
public static final short CONNECTION_FRIEND = 10; public static final short CONNECTION_FRIEND = 10;
@ -41,15 +48,26 @@ public final class MsgSubType {
/** Удалить из друзей. */ /** Удалить из друзей. */
public static final short CONNECTION_UNFRIEND = 11; public static final short CONNECTION_UNFRIEND = 11;
/** Добавить в контакты. */
public static final short CONNECTION_CONTACT = 20;
/** Удалить из контактов. */
public static final short CONNECTION_UNCONTACT = 21;
/** Подписаться (follow). */ /** Подписаться (follow). */
public static final short CONNECTION_FOLLOW = 30; public static final short CONNECTION_FOLLOW = 30;
/** Отписаться (unfollow). */ /** Отписаться (unfollow). */
public static final short CONNECTION_UNFOLLOW = 31; public static final short CONNECTION_UNFOLLOW = 31;
//
// /** Заблокировать. */ /* ===================== USER_PARAM (msg_type=4) ===================== */
// public static final short CONNECTION_BLOCK = 30;
// /** Параметр профиля key/value (обе строки). */
// /** Разблокировать. */ public static final short USER_PARAM_TEXT_TEXT = 1;
// public static final short CONNECTION_UNBLOCK = 31;
/* ===================== РЕЗЕРВ НА БУДУЩЕЕ ===================== */
// Если позже захочешь BLOCK/UNBLOCK лучше добавить НОВЫЕ значения,
// не трогая 10/20/30 и 11/21/31 (например, 40/41).
// public static final short CONNECTION_BLOCK = 40;
// public static final short CONNECTION_UNBLOCK = 41;
} }