Ejemplo n.º 1
0
        public async Task FSWrite()
        {
            try
            {
                FirestoreTestUtils.ColoredConsoleWrite(ConsoleColor.Green, "\n:: Streaming Writes to a Document ::\n");
                FirestoreTestUtils.ColoredConsoleWrite(ConsoleColor.White, "\nEnter Document Id: ");
                String docId = Console.ReadLine();
                FirestoreTestUtils.ColoredConsoleWrite(ConsoleColor.Green, "\nStreaming writes to ");
                FirestoreTestUtils.ColoredConsoleWrite(ConsoleColor.White, docId);
                FirestoreTestUtils.ColoredConsoleWrite(ConsoleColor.Green, "...\n");

                Document updatedDoc = GetDocument(docId);
                MapField <string, Value> fields;
                if (updatedDoc == null)
                {
                    updatedDoc      = new Document();
                    updatedDoc.Name = Parent + "/documents/GrpcTestData/" + docId;
                    fields          = new MapField <string, Value>();
                }
                else
                {
                    FirestoreTestUtils.ColoredConsoleWrite(ConsoleColor.White, "\nAvailable fields in this document to update:\n");
                    Utils.ProcessFields(updatedDoc);
                    fields = updatedDoc.Fields;
                }

                String streamId = "";
                Google.Protobuf.ByteString streamToken = null;

                using (var writeCall = FsClient.Write())
                {
                    var writeRequest = new WriteRequest();
                    writeRequest.Database = Parent;
                    await writeCall.RequestStream.WriteAsync(writeRequest);

                    await writeCall.ResponseStream.MoveNext();

                    var responseStr = writeCall.ResponseStream.Current;
                    streamId    = responseStr.StreamId;
                    streamToken = responseStr.StreamToken;

                    var responseReaderTask = Task.Run(async() =>
                    {
                        while (await writeCall.ResponseStream.MoveNext())
                        {
                            var response     = writeCall.ResponseStream.Current;
                            var writeResults = response.WriteResults;
                            foreach (var writeResult in writeResults)
                            {
                                FirestoreTestUtils.ColoredConsoleWrite(ConsoleColor.White, "\nWrite result:" + writeResult.ToString());
                            }
                        }
                    });

                    var currentWrite = new Write();
                    var docMask      = new DocumentMask();
                    // update/create fields
                    while (true)
                    {
                        FirestoreTestUtils.ColoredConsoleWrite(ConsoleColor.White, "\nEnter Field Name (blank when finished): ");
                        string fieldName = Console.ReadLine();
                        if (fieldName == "")
                        {
                            break;
                        }
                        else
                        {
                            FirestoreTestUtils.ColoredConsoleWrite(ConsoleColor.White, "\nEnter Field Value: ");
                            var fieldInValue = Console.ReadLine();
                            Utils.AddField(fields, fieldName, fieldInValue);
                            docMask.FieldPaths.Add(fieldName);
                        }
                    }
                    writeRequest.Database    = Parent;
                    currentWrite.Update      = updatedDoc;
                    currentWrite.UpdateMask  = docMask;
                    writeRequest.StreamId    = streamId;
                    writeRequest.StreamToken = streamToken;
                    writeRequest.Writes.Add(currentWrite);
                    await writeCall.RequestStream.WriteAsync(writeRequest);

                    await writeCall.RequestStream.CompleteAsync();

                    await responseReaderTask;
                }
            }
            catch (Grpc.Core.RpcException e)
            {
                Console.WriteLine("RPC failed", e);
                throw;
            }
            FirestoreTestUtils.ColoredConsoleWrite(ConsoleColor.Green, "\nSuccessfully streamed updates to the document!\n");
        }