firestore/api/TransactionsAndBatchedWrites/Program.cs (114 lines of code) (raw):

// Copyright(c) 2018 Google Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. using CommandLine; using Google.Cloud.Firestore; using System; using System.Collections; using System.Collections.Generic; using System.Threading.Tasks; namespace GoogleCloudSamples { public class TransactionsAndBatchedWrites { public static string Usage = @"Usage: C:\> dotnet run command YOUR_PROJECT_ID Where command is one of run-simple-transaction return-info-transaction batch-write "; private static async Task RunSimpleTransaction(string project) { FirestoreDb db = FirestoreDb.Create(project); // [START firestore_transaction_document_update] DocumentReference cityRef = db.Collection("cities").Document("SF"); await db.RunTransactionAsync(async transaction => { DocumentSnapshot snapshot = await transaction.GetSnapshotAsync(cityRef); long newPopulation = snapshot.GetValue<long>("Population") + 1; Dictionary<string, object> updates = new Dictionary<string, object> { { "Population", newPopulation} }; transaction.Update(cityRef, updates); }); // [END firestore_transaction_document_update] Console.WriteLine("Ran a simple transaction to update the population field in the SF document in the cities collection."); } private static async Task ReturnInfoTransaction(string project) { FirestoreDb db = FirestoreDb.Create(project); // [START firestore_transaction_document_update_conditional] DocumentReference cityRef = db.Collection("cities").Document("SF"); bool transactionResult = await db.RunTransactionAsync(async transaction => { DocumentSnapshot snapshot = await transaction.GetSnapshotAsync(cityRef); long newPopulation = snapshot.GetValue<long>("Population") + 1; if (newPopulation <= 1000000) { Dictionary<string, object> updates = new Dictionary<string, object> { { "Population", newPopulation} }; transaction.Update(cityRef, updates); return true; } else { return false; } }); if (transactionResult) { Console.WriteLine("Population updated successfully."); } else { Console.WriteLine("Sorry! Population is too big."); } // [END firestore_transaction_document_update_conditional] } private static async Task BatchWrite(string project) { FirestoreDb db = FirestoreDb.Create(project); // [START firestore_data_batch_writes] WriteBatch batch = db.StartBatch(); // Set the data for NYC DocumentReference nycRef = db.Collection("cities").Document("NYC"); Dictionary<string, object> nycData = new Dictionary<string, object> { { "name", "New York City" } }; batch.Set(nycRef, nycData); // Update the population for SF DocumentReference sfRef = db.Collection("cities").Document("SF"); Dictionary<string, object> updates = new Dictionary<string, object> { { "Population", 1000000} }; batch.Update(sfRef, updates); // Delete LA DocumentReference laRef = db.Collection("cities").Document("LA"); batch.Delete(laRef); // Commit the batch await batch.CommitAsync(); // [END firestore_data_batch_writes] Console.WriteLine("Batch write successfully completed."); } public static void Main(string[] args) { if (args.Length < 2) { Console.Write(Usage); return; } string command = args[0].ToLower(); string project = string.Join(" ", new ArraySegment<string>(args, 1, args.Length - 1)); switch (command) { case "run-simple-transaction": RunSimpleTransaction(project).Wait(); break; case "return-info-transaction": ReturnInfoTransaction(project).Wait(); break; case "batch-write": BatchWrite(project).Wait(); break; default: Console.Write(Usage); return; } } } }