From 7d4da3a54d8233bd1a932d00848eb28326c03570 Mon Sep 17 00:00:00 2001 From: evgeny Date: Tue, 27 Oct 2026 11:38:21 +0100 Subject: [PATCH] Treat an unpublished avatar as a successful empty read --- tools/chatgui/db/db_manager.cpp | 5 +++-- tools/chatgui/db/db_manager.h | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/tools/chatgui/db/db_manager.cpp b/tools/chatgui/db/db_manager.cpp index ecae3b1f..87ebd3fb 100644 --- a/tools/chatgui/db/db_manager.cpp +++ b/tools/chatgui/db/db_manager.cpp @@ -125,7 +125,7 @@ QByteArray DbManager::getChannelAvatar(const QString& channelId, bool* ok) const if (!m_db) { GUI_WARN("group avatar: database unavailable channel=%s", qPrintable(channelId)); return {}; } sqlite3_stmt* st = nullptr; const char* stage = "prepare"; - int rc = sqlite3_prepare_v2(m_db, "SELECT avatar_data FROM channels WHERE channel_id=?", -1, &st, nullptr); + int rc = sqlite3_prepare_v2(m_db, "SELECT avatar_data,avatar_version FROM channels WHERE channel_id=?", -1, &st, nullptr); const QByteArray id = channelId.toLatin1(); if (rc == SQLITE_OK) { stage = "bind"; rc = sqlite3_bind_text(st, 1, id.constData(), id.size(), SQLITE_TRANSIENT); } if (rc == SQLITE_OK) { stage = "step"; rc = sqlite3_step(st); } @@ -133,7 +133,8 @@ QByteArray DbManager::getChannelAvatar(const QString& channelId, bool* ok) const int type = -1, length = 0; if (rc == SQLITE_ROW) { stage = "blob"; type = sqlite3_column_type(st, 0); length = sqlite3_column_bytes(st, 0); - if (type != SQLITE_BLOB) rc = SQLITE_CORRUPT; + if (type == SQLITE_NULL && sqlite3_column_int64(st, 1) == 0) bytes.clear(); // Аватар ещё не публиковался + else if (type != SQLITE_BLOB) rc = SQLITE_CORRUPT; else if (length > GROUP_AVATAR_MAX) rc = SQLITE_TOOBIG; else { const char* blob = static_cast(sqlite3_column_blob(st, 0)); diff --git a/tools/chatgui/db/db_manager.h b/tools/chatgui/db/db_manager.h index df878e48..cac53f08 100644 --- a/tools/chatgui/db/db_manager.h +++ b/tools/chatgui/db/db_manager.h @@ -102,7 +102,8 @@ public: /* ── Каналы ── */ QList getChannels(ChannelSortMode sort = ChannelSortMode::Alphabetical) const; /* Читает BLOB аватара канала <=16 KiB. Возвращает самостоятельные байты; при ошибке/нет строки — пустой массив. - * Необязательный ok отличает успешный пустой BLOB (удаление) от отказа; bind/step/finalize проверяются. + * Необязательный ok отличает пустой BLOB (удаление) или NULL при version=0 (ещё не публиковался) от отказа. + * bind/step/finalize проверяются, отказ не выдаёт успешные/частичные байты. * Хеш/версию и формат JPEG проверяет GroupAvatarManager, запись не меняется. */ QByteArray getChannelAvatar(const QString& channelId, bool* ok = nullptr) const; QString getChannelLastMessage(const QString& channelId) const;