示例#1
0
        private void CompileSetupFunc()
        {
            if (this.surrogate != null)
            {
                return;
            }
            if (this.fieldData.Length == 0)
            {
                return;
            }
            if (!this.investigateOwnership)
            {
                return;
            }

            ParameterExpression sourceParameter = Expression.Parameter(typeof(object), "source");
            ParameterExpression targetParameter = Expression.Parameter(typeof(object), "target");
            ParameterExpression setupParameter  = Expression.Parameter(typeof(ICloneTargetSetup), "setup");

            ParameterExpression sourceCastVar = Expression.Variable(this.type.AsType(), "sourceCast");
            ParameterExpression targetCastVar = Expression.Variable(this.type.AsType(), "targetCast");

            List <Expression> mainBlock = this.CreateSetupFuncContent(setupParameter, sourceCastVar, targetCastVar);

            if (mainBlock == null)
            {
                return;
            }

            mainBlock.Insert(0, Expression.Assign(sourceCastVar, this.type.IsValueType ? Expression.Convert(sourceParameter, this.type.AsType()) : Expression.TypeAs(sourceParameter, this.type.AsType())));
            mainBlock.Insert(1, Expression.Assign(targetCastVar, this.type.IsValueType ? Expression.Convert(targetParameter, this.type.AsType()) : Expression.TypeAs(targetParameter, this.type.AsType())));
            Expression mainBlockExpression = Expression.Block(new[] { sourceCastVar, targetCastVar }, mainBlock);

            this.setupFunc = Expression.Lambda <SetupFunc>(mainBlockExpression, sourceParameter, targetParameter, setupParameter).Compile();
        }
        protected async Task DatabaseConfigurations(SetupFunc setupConfigurationFunc,
                                                    string debug,
                                                    string raftRequestId,
                                                    RefAction beforeSetupConfiguration = null,
                                                    Action <DynamicJsonValue, BlittableJsonReaderObject, long> fillJson = null,
                                                    HttpStatusCode statusCode = HttpStatusCode.OK)
        {
            if (TryGetAllowedDbs(Database.Name, out var _, requireAdmin: true) == false)
            {
                return;
            }

            if (ResourceNameValidator.IsValidResourceName(Database.Name, ServerStore.Configuration.Core.DataDirectory.FullPath, out string errorMessage) == false)
            {
                throw new BadRequestException(errorMessage);
            }

            ServerStore.EnsureNotPassive();
            using (ServerStore.ContextPool.AllocateOperationContext(out TransactionOperationContext context))
            {
                var configurationJson = await context.ReadForMemoryAsync(RequestBodyStream(), debug);

                beforeSetupConfiguration?.Invoke(Database.Name, ref configurationJson, context);

                var(index, _) = await setupConfigurationFunc(context, Database.Name, configurationJson, raftRequestId);

                DatabaseTopology dbTopology;
                using (context.OpenReadTransaction())
                {
                    dbTopology = ServerStore.Cluster.ReadDatabaseTopology(context, Database.Name);
                }

                if (dbTopology.RelevantFor(ServerStore.NodeTag))
                {
                    var db = await ServerStore.DatabasesLandlord.TryGetOrCreateResourceStore(Database.Name);

                    await db.RachisLogIndexNotifications.WaitForIndexNotification(index, ServerStore.Engine.OperationTimeout);
                }
                else
                {
                    await ServerStore.Cluster.WaitForIndexNotification(index);
                }
                HttpContext.Response.StatusCode = (int)statusCode;

                using (var writer = new BlittableJsonTextWriter(context, ResponseBodyStream()))
                {
                    var json = new DynamicJsonValue
                    {
                        ["RaftCommandIndex"] = index,
                    };
                    fillJson?.Invoke(json, configurationJson, index);
                    context.Write(writer, json);
                    writer.Flush();
                }
            }
        }
示例#3
0
        protected async Task DatabaseConfigurations(SetupFunc setupConfigurationFunc,
                                                    string debug,
                                                    string raftRequestId,
                                                    RefAction beforeSetupConfiguration = null,
                                                    Action <DynamicJsonValue, BlittableJsonReaderObject, long> fillJson = null,
                                                    HttpStatusCode statusCode = HttpStatusCode.OK)
        {
            if (TryGetAllowedDbs(Database.Name, out var _, requireAdmin: true) == false)
            {
                return;
            }

            if (ResourceNameValidator.IsValidResourceName(Database.Name, ServerStore.Configuration.Core.DataDirectory.FullPath, out string errorMessage) == false)
            {
                throw new BadRequestException(errorMessage);
            }

            await ServerStore.EnsureNotPassiveAsync();

            using (ServerStore.ContextPool.AllocateOperationContext(out TransactionOperationContext context))
            {
                var configurationJson = await context.ReadForMemoryAsync(RequestBodyStream(), debug);

                beforeSetupConfiguration?.Invoke(Database.Name, ref configurationJson, context);

                var(index, _) = await setupConfigurationFunc(context, Database.Name, configurationJson, raftRequestId);
                await WaitForIndexToBeApplied(context, index);

                HttpContext.Response.StatusCode = (int)statusCode;

                using (var writer = new BlittableJsonTextWriter(context, ResponseBodyStream()))
                {
                    var json = new DynamicJsonValue
                    {
                        ["RaftCommandIndex"] = index,
                    };
                    fillJson?.Invoke(json, configurationJson, index);
                    context.Write(writer, json);
                    writer.Flush();
                }
            }
        }
示例#4
0
        private void CompileSetupFunc()
        {
            if (this.surrogate != null) return;
            if (this.fieldData.Length == 0) return;
            if (!this.investigateOwnership) return;

            ParameterExpression sourceParameter = Expression.Parameter(typeof(object), "source");
            ParameterExpression targetParameter = Expression.Parameter(typeof(object), "target");
            ParameterExpression setupParameter = Expression.Parameter(typeof(ICloneTargetSetup), "setup");

            ParameterExpression sourceCastVar = Expression.Variable(type, "sourceCast");
            ParameterExpression targetCastVar = Expression.Variable(type, "targetCast");

            List<Expression> mainBlock = this.CreateSetupFuncContent(setupParameter, sourceCastVar, targetCastVar);
            if (mainBlock == null) return;

            mainBlock.Insert(0, Expression.Assign(sourceCastVar, type.IsValueType ? Expression.Convert(sourceParameter, this.type) : Expression.TypeAs(sourceParameter, this.type)));
            mainBlock.Insert(1, Expression.Assign(targetCastVar, type.IsValueType ? Expression.Convert(targetParameter, this.type) : Expression.TypeAs(targetParameter, this.type)));
            Expression mainBlockExpression = Expression.Block(new[] { sourceCastVar, targetCastVar }, mainBlock);
            this.setupFunc = Expression.Lambda<SetupFunc>(mainBlockExpression, sourceParameter, targetParameter, setupParameter).Compile();
        }