From 90fab54a4a8123294fc61343bd6fa2a979bce3f6 Mon Sep 17 00:00:00 2001 From: evgeny Date: Thu, 22 Oct 2026 15:14:22 +0200 Subject: [PATCH] Use one atomic commit API for authored and downloaded files --- src/media_delivery/media_index.c | 13 +------------ src/media_delivery/media_index.h | 10 +++------- 2 files changed, 4 insertions(+), 19 deletions(-) diff --git a/src/media_delivery/media_index.c b/src/media_delivery/media_index.c index 1d2fe406..f026ef5e 100644 --- a/src/media_delivery/media_index.c +++ b/src/media_delivery/media_index.c @@ -359,7 +359,7 @@ static int mi_result_valid(const struct media_index_result* result) { } /* Общий атомарный путь для автора и держателя скачанного файла. */ -static int mi_register_file(sqlite3* db, const struct media_index_result* result, +int media_index_commit(sqlite3* db, const struct media_index_result* result, uint64_t node_id, const uint8_t* key, const char* chat_id, const char* dest_path, const char* media_base) { char location[MEDIA_PATH_MAX]; if (!db || !chat_id || !*chat_id || strlen(chat_id) >= 64 || mi_result_valid(result) @@ -408,17 +408,6 @@ static int mi_register_file(sqlite3* db, const struct media_index_result* result return 0; } -int media_index_commit(sqlite3* db, const struct media_index_result* result, - uint64_t node_id, const uint8_t* key, const char* chat_id, const char* dest_path, const char* media_base) { - if (!key) { DEBUG_ERROR(DEBUG_CATEGORY_MEDIA, "media_index commit without signing key"); return -1; } - return mi_register_file(db, result, node_id, key, chat_id, dest_path, media_base); -} - -int media_index_register_downloaded_file(sqlite3* db, const struct media_index_result* result, - uint64_t node_id, const char* chat_id, const char* dest_path, const char* media_base) { - return mi_register_file(db, result, node_id, NULL, chat_id, dest_path, media_base); -} - int media_index_register_downloaded(sqlite3* db, const uint8_t* media_id, const uint8_t* block_id, const uint8_t* content_hash, const char* chat_id, const char* location, uint64_t node_id, diff --git a/src/media_delivery/media_index.h b/src/media_delivery/media_index.h index 46a035b6..ec7f1ff3 100644 --- a/src/media_delivery/media_index.h +++ b/src/media_delivery/media_index.h @@ -54,7 +54,8 @@ int media_index_init(sqlite3* db); // ── Регистрация файлов и блоков ── -/* Записать подготовленные блоки и подписанные сведения о держателе; 0/-1, result остаётся у вызывающего. +/* Атомарно записать все блоки файла; 0/-1, result остаётся у вызывающего, block_sigs здесь не используются. + * ed25519_privkey — 32 байта для авторской node_sign; NULL — скачанный файл, node_sign новой записи нулевая. * chat_id — десятичный ID канала; dest_path — готовый файл, media_base — база для относительного location. * Все блоки записываются через SAVEPOINT: ошибка откатывает регистрацию; внешнюю транзакцию завершает вызывающий. * SQLite может сама откатить всю транзакцию при тяжёлой ошибке. Уже выполненные файловые операции не откатываются. @@ -68,16 +69,11 @@ int media_index_commit( /* Зарегистрировать один скачанный блок: location — канонический путь относительно общей базы; 0/-1. * file_size/chunk_size >0, chunk/offset >=0, блок целиком помещается в файл. * node_sign новой записи — нули (при отдаче не проверяется); существующая подпись при совпадающем повторе сохраняется. - * Для целого файла использовать register_downloaded_file; одиночные вызовы не образуют общую транзакцию. */ + * Для целого файла использовать commit с ключом NULL; одиночные вызовы не образуют общую транзакцию. */ int media_index_register_downloaded(sqlite3* db, const uint8_t* media_id, const uint8_t* block_id, const uint8_t* content_hash, const char* chat_id, const char* location, uint64_t node_id, int64_t file_size, int64_t chunk_size, int chunk, int64_t offset); -/* Атомарно зарегистрировать все блоки скачанного файла; block_sigs не используются, node_sign нулевые. - * result описывает непустой файл, dest_path принадлежит media_base; остальные гарантии как у commit. */ -int media_index_register_downloaded_file(sqlite3* db, const struct media_index_result* result, - uint64_t node_id, const char* chat_id, const char* dest_path, const char* media_base); - /* Подготовить и зарегистрировать файл; пути/ключ/chat_id копируются до возврата, cb_arg заимствован до callback. * При copy_file!=0 копирует src_path в dest_path; при 0 dest_path уже должен содержать готовый файл. * src/dest < MEDIA_PATH_MAX, media_base < MEDIA_BASE_MAX, chat_id <64 байт; dest проверяется до запуска worker.