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(); } } }
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(); } } }
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(); }