QGrpc{Channel,Call}Options: Support incremental updates via addMetadata

Currently we only provide `setMetadata(~)` as a way for users to
supply their metadata. However, certain code paths would benefit from
having an `add` functionality as well, without requiring the user to
create a temporary object.

[ChangeLog][GRPC][QGrpc*Options] Added support for incrementally adding
metadata via `addMetadata()`.

Change-Id: Ibc5d721850745df5f171b9126b595ca9c6b0c319
Reviewed-by: Alexey Edelev <alexey.edelev@qt.io>
This commit is contained in:
Dennis Oberst 2025-04-30 14:17:43 +02:00
parent 778371b8ea
commit 66984e6a3c
7 changed files with 63 additions and 0 deletions

View File

@ -256,6 +256,22 @@ QGrpcCallOptions::setMetadata(std::initializer_list<std::pair<QByteArray, QByteA
return setMetadata(QMultiHash<QByteArray, QByteArray>(list));
}
/*!
\include qgrpccommonoptions.cpp add-metadata
\include qgrpccalloptions.cpp merge-md-note
\l{QGrpcChannelOptions::addMetadata()}
*/
QGrpcCallOptions &QGrpcCallOptions::addMetadata(QByteArray key, QByteArray value)
{
if (d_ptr->metadata(QtGrpc::MultiValue).contains(key, value))
return *this;
d_ptr.detach();
Q_D(QGrpcCallOptions);
d->addMetadata(std::move(key), std::move(value));
return *this;
}
#ifndef QT_NO_DEBUG_STREAM
/*!
\since 6.8

View File

@ -62,6 +62,7 @@ public:
Q_GRPC_EXPORT QGrpcCallOptions &setMetadata(QMultiHash<QByteArray, QByteArray> &&metadata);
Q_GRPC_EXPORT QGrpcCallOptions &
setMetadata(std::initializer_list<std::pair<QByteArray, QByteArray>> list);
Q_GRPC_EXPORT QGrpcCallOptions &addMetadata(QByteArray key, QByteArray value);
private:
QExplicitlySharedDataPointer<QGrpcCallOptionsPrivate> d_ptr;

View File

@ -265,6 +265,22 @@ QGrpcChannelOptions::setMetadata(std::initializer_list<std::pair<QByteArray, QBy
return setMetadata(QMultiHash<QByteArray, QByteArray>(list));
}
/*!
\include qgrpccommonoptions.cpp add-metadata
\include qgrpcchanneloptions.cpp merge-md-note
\l{QGrpcCallOptions::addMetadata()}
*/
QGrpcChannelOptions &QGrpcChannelOptions::addMetadata(QByteArray key, QByteArray value)
{
if (d_ptr->metadata(QtGrpc::MultiValue).contains(key, value))
return *this;
d_ptr.detach();
Q_D(QGrpcChannelOptions);
d->addMetadata(std::move(key), std::move(value));
return *this;
}
/*!
\since 6.8

View File

@ -68,6 +68,7 @@ public:
Q_GRPC_EXPORT QGrpcChannelOptions &setMetadata(QMultiHash<QByteArray, QByteArray> &&metadata);
Q_GRPC_EXPORT QGrpcChannelOptions &
setMetadata(std::initializer_list<std::pair<QByteArray, QByteArray>> list);
Q_GRPC_EXPORT QGrpcChannelOptions &addMetadata(QByteArray key, QByteArray value);
[[nodiscard]] Q_GRPC_EXPORT QGrpcSerializationFormat serializationFormat() const;
Q_GRPC_EXPORT QGrpcChannelOptions &

View File

@ -137,4 +137,24 @@ void QGrpcCommonOptions::setMetadata(QMultiHash<QByteArray, QByteArray> &&md)
#endif
}
/*!
//! [add-metadata]
\since 6.10
Adds \a key and \a value to the \l metadata if the exact pair is not already contained.
The same key may appear multiple times with different values.
\sa {metadata(QtGrpc::MultiValueTag)}{metadata()} {setMetadata(const
QMultiHash<QByteArray, QByteArray>&)}{setMetadata()}
//! [add-metadata]
*/
void QGrpcCommonOptions::addMetadata(QByteArray &&key, QByteArray &&value)
{
#if QT_DEPRECATED_SINCE(6, 13)
if (m_deprecatedQHashRefUsed)
m_metadata.insertOrAssign(key, value);
#endif
m_metadataMulti.emplace(std::move(key), std::move(value));
}
QT_END_NAMESPACE

View File

@ -46,6 +46,7 @@ public:
QMultiHash<QByteArray, QByteArray> metadata(QtGrpc::MultiValueTag /*tag*/) &&;
void setMetadata(const QMultiHash<QByteArray, QByteArray> &md);
void setMetadata(QMultiHash<QByteArray, QByteArray> &&md);
void addMetadata(QByteArray &&key, QByteArray &&value);
private:
std::optional<std::chrono::milliseconds> m_timeout;

View File

@ -210,6 +210,14 @@ QT_WARNING_POP
T o4;
o4.setMetadata(list);
QCOMPARE_EQ(o4.metadata(QtGrpc::MultiValue), data);
// addMetadata
T o5 = T{}.addMetadata("keyA", "valA1").addMetadata("keyA", "valA2");
auto o5Detach = o5;
QByteArray k = "keyB", v = "valB";
o5.addMetadata(k, v);
QCOMPARE_EQ(o5.metadata(QtGrpc::MultiValue), data);
QCOMPARE_NE(o5.metadata(QtGrpc::MultiValue), o5Detach.metadata(QtGrpc::MultiValue));
}
void propertyDeadline() const
{