Use one atomic commit API for authored and downloaded files
This commit is contained in:
1 parent
439011ce60
commit
90fab54a4a
2 files changed
+4
-19
No files matched your search
@@ -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,
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in new issue
Block a user