Treat an unpublished avatar as a successful empty read

This commit is contained in:
evgeny committed 2026-10-27 11:57:30 +01:00
1 parent a701580d54
commit 7d4da3a54d
2 files changed
+5 -3

No files matched your search

+3 -2
View File
@@ -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<const char*>(sqlite3_column_blob(st, 0));
+2 -1
View File
@@ -102,7 +102,8 @@ public:
/* ── Каналы ── */
QList<ChannelRow> 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;