15 #ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_SPANNER_MUTATIONS_H 16 #define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_SPANNER_MUTATIONS_H 20 #include <google/spanner/v1/mutation.pb.h> 29 template <
typename Op>
30 class WriteMutationBuilder;
68 google::spanner::v1::Mutation
as_proto() && {
return std::move(m_); }
69 google::spanner::v1::Mutation
as_proto() const& {
return m_; }
81 google::spanner::v1::Mutation& proto() & {
return m_; }
83 template <
typename Op>
84 friend class internal::WriteMutationBuilder;
86 explicit Mutation(google::spanner::v1::Mutation m) : m_(std::move(m)) {}
88 google::spanner::v1::Mutation m_;
101 template <
typename Op>
102 class WriteMutationBuilder {
104 WriteMutationBuilder(std::string table_name,
105 std::vector<std::string> column_names) {
106 auto& field = Op::mutable_field(m_.proto());
107 field.set_table(std::move(table_name));
108 field.mutable_columns()->Reserve(static_cast<int>(column_names.size()));
109 for (
auto& name : column_names) {
110 field.add_columns(std::move(name));
114 Mutation Build()
const& {
return m_; }
115 Mutation&& Build() && {
return std::move(m_); }
117 WriteMutationBuilder& AddRow(std::vector<Value> values) & {
118 auto& lv = *Op::mutable_field(m_.proto()).add_values();
119 for (
auto& v : values) {
120 std::tie(std::ignore, *lv.add_values()) = internal::ToProto(std::move(v));
125 WriteMutationBuilder&& AddRow(std::vector<Value> values) && {
126 return std::move(AddRow(std::move(values)));
129 template <
typename... Ts>
130 WriteMutationBuilder& EmplaceRow(Ts&&... values) & {
131 return AddRow({
Value(std::forward<Ts>(values))...});
134 template <
typename... Ts>
135 WriteMutationBuilder&& EmplaceRow(Ts&&... values) && {
136 return std::move(EmplaceRow(std::forward<Ts>(values)...));
144 static google::spanner::v1::Mutation::Write& mutable_field(
145 google::spanner::v1::Mutation& m) {
146 return *m.mutable_insert();
151 static google::spanner::v1::Mutation::Write& mutable_field(
152 google::spanner::v1::Mutation& m) {
153 return *m.mutable_update();
157 struct InsertOrUpdateOp {
158 static google::spanner::v1::Mutation::Write& mutable_field(
159 google::spanner::v1::Mutation& m) {
160 return *m.mutable_insert_or_update();
165 static google::spanner::v1::Mutation::Write& mutable_field(
166 google::spanner::v1::Mutation& m) {
167 return *m.mutable_replace();
174 auto& field = *m_.proto().mutable_delete_();
175 field.set_table(std::move(table_name));
176 *field.mutable_key_set() = internal::ToProto(std::move(keys));
179 Mutation Build()
const& {
return m_; }
180 Mutation&& Build() && {
return std::move(m_); }
201 internal::WriteMutationBuilder<internal::InsertOp>;
215 template <
typename... Ts>
217 std::vector<std::string> columns, Ts&&... values) {
219 .EmplaceRow(std::forward<Ts>(values)...)
236 internal::WriteMutationBuilder<internal::UpdateOp>;
250 template <
typename... Ts>
252 std::vector<std::string> columns, Ts&&... values) {
254 .EmplaceRow(std::forward<Ts>(values)...)
271 internal::WriteMutationBuilder<internal::InsertOrUpdateOp>;
285 template <
typename... Ts>
287 std::vector<std::string> columns,
291 .EmplaceRow(std::forward<Ts>(values)...)
308 internal::WriteMutationBuilder<internal::ReplaceOp>;
322 template <
typename... Ts>
324 std::vector<std::string> columns, Ts&&... values) {
326 .EmplaceRow(std::forward<Ts>(values)...)
365 #endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_SPANNER_MUTATIONS_H Mutation MakeReplaceMutation(std::string table_name, std::vector< std::string > columns, Ts &&... values)
Creates a simple "replace" mutation for the values in values.
google::spanner::v1::Mutation as_proto() const &
Mutation MakeInsertMutation(std::string table_name, std::vector< std::string > columns, Ts &&... values)
Creates a simple insert mutation for the values in values.
The Value class represents a type-safe, nullable Spanner value.
void PrintTo(Mutation const &m, std::ostream *os)
internal::WriteMutationBuilder< internal::UpdateOp > UpdateMutationBuilder
A helper class to construct "update" mutations.
std::vector< Mutation > Mutations
An ordered sequence of mutations to pass to Client::Commit() or return from the Client::Commit() muta...
bool operator==(Backup const &a, Backup const &b)
Mutation MakeInsertOrUpdateMutation(std::string table_name, std::vector< std::string > columns, Ts &&... values)
Creates a simple "insert or update" mutation for the values in values.
Mutation MakeUpdateMutation(std::string table_name, std::vector< std::string > columns, Ts &&... values)
Creates a simple update mutation for the values in values.
The KeySet class is a regular type that represents a collection of Keys.
Contains all the Cloud Spanner C++ client types and functions.
google::spanner::v1::Mutation as_proto() &&
Convert the mutation to the underlying proto.
internal::WriteMutationBuilder< internal::InsertOrUpdateOp > InsertOrUpdateMutationBuilder
A helper class to construct "insert_or_update" mutations.
internal::DeleteMutationBuilder DeleteMutationBuilder
A helper class to construct "delete" mutations.
friend bool operator!=(Mutation const &lhs, Mutation const &rhs)
Mutation MakeDeleteMutation(std::string table_name, KeySet keys)
Creates a simple "delete" mutation for the values in keys.
#define SPANNER_CLIENT_NS
internal::WriteMutationBuilder< internal::InsertOp > InsertMutationBuilder
A helper class to construct "insert" mutations.
A wrapper for Cloud Spanner mutations.
internal::WriteMutationBuilder< internal::ReplaceOp > ReplaceMutationBuilder
A helper class to construct "replace" mutations.