Treat an unpublished avatar as a successful empty read
This commit is contained in:
1 parent
a701580d54
commit
7d4da3a54d
2 files changed
+5
-3
No files matched your search
@@ -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));
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in new issue
Block a user