Use one atomic commit API for authored and downloaded files

This commit is contained in:
evgeny committed 2026-10-22 15:14:22 +02:00
1 parent 439011ce60
commit 90fab54a4a
2 files changed
+4 -19

No files matched your search

+1 -12
View File
@@ -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,
+3 -7
View File
@@ -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.