// db_sync.h — Distributed content-addressed table with SQLite + peer sync via etcp_api (direct P2P) // // Назначение: децентрализованная реплицируемая таблица JSON-записей между всеми узлами сети. // Модуль поддерживает несколько независимых инстансов (таблиц), каждый идентифицируется парой (name, id). // // Использование: // 1. Включить в конфиге: db_sync_enabled = 1 // Опционально: db_sync_ttl = 86400 (по умолчанию) // 2. db_sync_init() — вызывается автоматически при старте utun_instance // 3. struct DB_SYNC_INSTANCE* si = db_sync_instance_add(inst, "chats", 1); // Создаёт/регистрирует инстанс. При поднятии соединений автоматически запускает sync. // 4. db_sync_insert(si, json_data) — вставить запись. Автоматически PUSH всем synced-пирам. // 5. db_sync_count(si) — количество записей в локальной БД для этого инстанса // 6. db_sync_instance_remove(si) — удалить инстанс (таблица БД не удаляется) // 7. db_sync_destroy() — вызывается автоматически при завершении // // Синхронизация: // - При поднятии ETCP-соединения с пиром для каждого инстанса запускается полная синхронизация // - Каждое сообщение содержит instance_hash (первые 64 бита SHA256(name||id_be)), // что позволяет маршрутизировать сообщения к нужному инстансу на приёмной стороне // - Если пир не имеет инстанса с таким хешем — возвращает DB_MSG_ERROR(0x01) // - Если пир добавляет инстанс позже — сам инициирует sync в нашу сторону // - Протокол: сравнение chain_hash для поиска расхождений (7 типов сообщений) // - Новые записи немедленно рассылаются подключённым пирам через PUSH // // Нюансы: // - Записи не редактируются и не удаляются явно — только TTL-очистка (per-instance) // - Дубликаты определяются по (instance_hash, timestamp, datahash) // - БД хранится в SQLite, путь: /sync // - Синхронизация идёт через etcp_api (service ID 0x20), только прямые P2P соединения #ifndef DB_SYNC_H #define DB_SYNC_H #ifdef __cplusplus extern "C" { #endif #include #include struct UTUN_INSTANCE; struct DB_SYNC_INSTANCE; // etcp_router service ID #define ETCP_RT_ID_DB_SYNC 0x20 // Message types #define DB_MSG_INIT_SYNC 0x01 #define DB_MSG_INIT_RESP 0x02 #define DB_MSG_REFINE 0x03 #define DB_MSG_SEND_DATA 0x04 #define DB_MSG_PUSH 0x05 #define DB_MSG_ACK_PUSH 0x06 #define DB_MSG_SYNC_DONE 0x07 #define DB_MSG_ERROR 0x08 // Error codes for DB_MSG_ERROR #define DB_ERR_NOT_FOUND 0x01 // instance not found #define DB_ERR_DISABLED 0x02 // instance exists but disabled // Defaults #define DB_SYNC_DEFAULT_TTL 86400 #define DB_SYNC_DEFAULT_MAPSIZE (100UL * 1024 * 1024) #define DB_SYNC_PEER_CHECK_INTERVAL 5 #define DB_SYNC_TTL_INTERVAL 3600 // Record flags #define DB_REC_FLAG_WAS_SENT 0x01 // Sync protocol constants #define DB_REFINE_HASHES 16 #define DB_SEND_DATA_MAX 32 // Global lifecycle int db_sync_init(struct UTUN_INSTANCE* inst); void db_sync_destroy(struct UTUN_INSTANCE* inst); // Instance management struct DB_SYNC_INSTANCE* db_sync_instance_add(struct UTUN_INSTANCE* inst, const char* name, uint64_t id); void db_sync_instance_remove(struct DB_SYNC_INSTANCE* si); // Data operations (per-instance) int db_sync_insert_len(struct DB_SYNC_INSTANCE* si, const char* json_data, size_t len); int db_sync_insert(struct DB_SYNC_INSTANCE* si, const char* json_data); int db_sync_insert_signed(struct DB_SYNC_INSTANCE* si, const char* json_data, size_t len, const uint8_t* sig, size_t sig_len); uint32_t db_sync_count(struct DB_SYNC_INSTANCE* si); uint64_t db_sync_get_last_timestamp(struct DB_SYNC_INSTANCE* si); // Select: iterate records ordered by (timestamp, datahash), starting at offset, max limit (0=unlimited). // Returns number of records passed to callback. typedef void (*db_sync_select_cb)(void* arg, uint64_t id, uint64_t timestamp, const char* data, size_t data_len, uint64_t author, const uint8_t* author_sig, size_t sig_len, int delivered_peers, const char* delivery_chain); int db_sync_select(struct DB_SYNC_INSTANCE* si, uint32_t offset, uint32_t limit, db_sync_select_cb cb, void* arg); // Insert callback: fired after local or peer insert succeeds. // author_node_id = self for local inserts, peer node_id for remote. typedef void (*db_sync_insert_cb)(struct DB_SYNC_INSTANCE* si, const char* json_data, size_t len, uint64_t author_node_id, void* arg); void db_sync_set_insert_cb(struct DB_SYNC_INSTANCE* si, db_sync_insert_cb cb, void* arg); #ifdef __cplusplus } #endif #endif // DB_SYNC_H