Example #1
0
        /// <remarks>
        ///     note: protobuf does not support circular file references, so this possibility isn't considered.
        /// </remarks>
        private async Task <List <SchemaReference> > RegisterOrGetReferences(FileDescriptor fd, SerializationContext context, bool autoRegisterSchema, bool skipKnownTypes)
        {
            var tasks = new List <Task <SchemaReference> >();

            for (int i = 0; i < fd.Dependencies.Count; ++i)
            {
                FileDescriptor fileDescriptor = fd.Dependencies[i];
                if (skipKnownTypes && fileDescriptor.Name.StartsWith("google/protobuf/"))
                {
                    continue;
                }

                Func <FileDescriptor, Task <SchemaReference> > t = async(FileDescriptor dependency) => {
                    var dependencyReferences = await RegisterOrGetReferences(dependency, context, autoRegisterSchema, skipKnownTypes).ConfigureAwait(continueOnCapturedContext: false);

                    var subject  = referenceSubjectNameStrategy(context, dependency.Name);
                    var schema   = new Schema(dependency.SerializedData.ToBase64(), dependencyReferences, SchemaType.Protobuf);
                    var schemaId = autoRegisterSchema
                        ? await schemaRegistryClient.RegisterSchemaAsync(subject, schema).ConfigureAwait(continueOnCapturedContext: false)
                        : await schemaRegistryClient.GetSchemaIdAsync(subject, schema).ConfigureAwait(continueOnCapturedContext: false);

                    var registeredDependentSchema = await schemaRegistryClient.LookupSchemaAsync(subject, schema, true).ConfigureAwait(continueOnCapturedContext: false);

                    return(new SchemaReference(dependency.Name, subject, registeredDependentSchema.Version));
                };
                tasks.Add(t(fileDescriptor));
            }
            await Task.WhenAll(tasks.ToArray()).ConfigureAwait(continueOnCapturedContext: false);

            return(tasks.Select(t => t.Result).ToList());
        }
Example #2
0
        /// <remarks>
        ///     note: protobuf does not support circular file references, so this possibility isn't considered.
        /// </remarks>
        private async Task <List <SchemaReference> > RegisterOrGetReferences(FileDescriptor fd, SerializationContext context, bool autoRegisterSchema)
        {
            var result = new List <SchemaReference>();

            var tasks = new Task[fd.Dependencies.Count];

            for (int i = 0; i < fd.Dependencies.Count; ++i)
            {
                var         dependency = fd.Dependencies[i];
                Func <Task> t          = async() => {
                    var dependencyReferences = await RegisterOrGetReferences(dependency, context, autoRegisterSchema).ConfigureAwait(continueOnCapturedContext: false);

                    var subject  = referenceSubjectNameStrategy(context, dependency.Name);
                    var schema   = new Schema(dependency.SerializedData.ToBase64(), dependencyReferences, SchemaType.Protobuf);
                    var schemaId = autoRegisterSchema
                        ? await schemaRegistryClient.RegisterSchemaAsync(subject, schema).ConfigureAwait(continueOnCapturedContext: false)
                        : await schemaRegistryClient.GetSchemaIdAsync(subject, schema).ConfigureAwait(continueOnCapturedContext: false);

                    var registeredDependentSchema = await schemaRegistryClient.LookupSchemaAsync(subject, schema, true).ConfigureAwait(continueOnCapturedContext: false);

                    result.Add(new SchemaReference(dependency.Name, subject, registeredDependentSchema.Version));
                };
                tasks[i] = t();
            }
            await Task.WhenAll(tasks.ToArray()).ConfigureAwait(continueOnCapturedContext: false);

            return(result);
        }