示例#1
0
        public string EmitStatementAsString(bool removeLineBreaks)
        {
            string statement = new D4TextEmitter().Emit(EmitStatement(EmitMode.ForCopy));

            if (removeLineBreaks)
            {
                bool          inWhiteSpace = false;
                StringBuilder builder      = new StringBuilder();
                for (int index = 0; index < statement.Length; index++)
                {
                    if (Char.IsWhiteSpace(statement, index))
                    {
                        if (!inWhiteSpace)
                        {
                            inWhiteSpace = true;
                            builder.Append(" ");
                        }
                    }
                    else
                    {
                        inWhiteSpace = false;
                        builder.Append(statement[index]);
                    }
                }
                return(builder.ToString());
            }
            return(statement);
        }
示例#2
0
        private string SaveDeviceSettings(ServerProcess process)
        {
            D4TextEmitter emitter = new D4TextEmitter();
            Block         block   = new Block();

            IServerProcess localProcess = (IServerProcess)process;
            IServerCursor  cursor       = localProcess.OpenCursor("select Devices { ID }", null);

            try
            {
                using (IRow row = cursor.Plan.RequestRow())
                {
                    while (cursor.Next())
                    {
                        cursor.Select(row);
                        Schema.Device device = process.CatalogDeviceSession.ResolveCatalogObject((int)row[0 /*"ID"*/]) as Schema.Device;
                        if ((device != null) && (device.ClassDefinition.Attributes.Count > 0))
                        {
                            block.Statements.Add(SaveSystemDeviceSettings(device));
                        }
                    }
                }
            }
            finally
            {
                localProcess.CloseCursor(cursor);
            }

            return(new D4TextEmitter().Emit(block) + "\r\n");
        }
示例#3
0
        public string GetCatalog(RemoteParam[] paramsValue, out string catalogObjectName, out long cacheTimeStamp, out long clientCacheTimeStamp, out bool cacheChanged)
        {
            ServerExpressionPlan.CheckCompiled();

            if (ServerExpressionPlan.ActualDataType is Schema.ICursorType)
            {
                _cacheObjectName  = Schema.Object.NameFromGuid(ID);
                catalogObjectName = _cacheObjectName;
            }
            else
            {
                catalogObjectName = ServerExpressionPlan.DataType.Name;
            }

                        #if LOGCACHEEVENTS
            ServerProcess.ServerSession.Server.LogMessage(String.Format("Getting catalog for expression '{0}'.", Header.Statement));
                        #endif

            cacheChanged   = true;
            cacheTimeStamp = ServerExpressionPlan.ServerProcess.ServerSession.Server.CacheTimeStamp;
            string[] requiredObjects = _process.Session.Server.CatalogCaches.GetRequiredObjects(_process.Session, ServerExpressionPlan.Plan.PlanCatalog, cacheTimeStamp, out clientCacheTimeStamp);
            if (requiredObjects.Length > 0)
            {
                if (ServerExpressionPlan.ActualDataType is Schema.ICursorType)
                {
                    string[] allButCatalogObject = new string[requiredObjects.Length - 1];
                    int      targetIndex         = 0;
                    for (int index = 0; index < requiredObjects.Length; index++)
                    {
                        if (requiredObjects[index] != catalogObjectName)
                        {
                            allButCatalogObject[targetIndex] = requiredObjects[index];
                            targetIndex++;
                        }
                    }

                    Block statement = allButCatalogObject.Length > 0 ? (Block)ServerExpressionPlan.Plan.PlanCatalog.EmitStatement(ServerExpressionPlan.ServerProcess.CatalogDeviceSession, EmitMode.ForRemote, allButCatalogObject) : new Block();

                    // Add variable declaration statements for any process context that may be being referenced by the plan
                    for (int index = ServerExpressionPlan.ServerProcess.ProcessLocals.Count - 1; index >= 0; index--)
                    {
                        if (!ContainsParam(paramsValue, ServerExpressionPlan.ServerProcess.ProcessLocals[index].Name))
                        {
                            statement.Statements.Add(new VariableStatement(ServerExpressionPlan.ServerProcess.ProcessLocals[index].Name, ServerExpressionPlan.ServerProcess.ProcessLocals[index].DataType.EmitSpecifier(EmitMode.ForRemote)));
                        }
                    }

                    Block catalogObjectStatement = (Block)ServerExpressionPlan.Plan.PlanCatalog.EmitStatement(ServerExpressionPlan.ServerProcess.CatalogDeviceSession, EmitMode.ForRemote, new string[] { catalogObjectName });
                    statement.Statements.AddRange(catalogObjectStatement.Statements);
                    string catalogString = new D4TextEmitter(EmitMode.ForRemote).Emit(statement);
                    return(catalogString);
                }
                else
                {
                    string catalogString = new D4TextEmitter(EmitMode.ForRemote).Emit(ServerExpressionPlan.Plan.PlanCatalog.EmitStatement(ServerExpressionPlan.ServerProcess.CatalogDeviceSession, EmitMode.ForRemote, requiredObjects));
                    return(catalogString);
                }
            }
            return(String.Empty);
        }
示例#4
0
        public override object InternalExecute(Program program, object[] arguments)
        {
            var tableVar           = APIUtilities.ResolveTableVarName(program, (string)arguments[0]);
            var identifyingKey     = APIUtilities.FindIdentifyingKey(program, tableVar);
            var keyValues          = APIUtilities.GetKeyValues(program, identifyingKey, (string)arguments[1]);
            var keyEqualExpression = Compiler.BuildKeyEqualExpression(program.Plan, String.Empty, "AKey", new Schema.RowType(identifyingKey.Columns).Columns, keyValues.DataType.Columns);

            var updateStatement = new UpdateStatement();

            updateStatement.Target = new IdentifierExpression(tableVar.Name);

            var row = (IRow)arguments[2];

            for (int i = 0; i < row.DataType.Columns.Count; i++)
            {
                updateStatement.Columns.Add(new UpdateColumnExpression(new IdentifierExpression(row.DataType.Columns[i].Name), new IdentifierExpression(Schema.Object.Qualify(row.DataType.Columns[i].Name, "ARow"))));
            }

            updateStatement.Condition = keyEqualExpression;

            var statement  = new D4TextEmitter().Emit(updateStatement);
            var dataParams = new DataParams();

            dataParams.Add(new DataParam("AKey", keyValues.DataType, Modifier.In, keyValues));
            dataParams.Add(new DataParam("ARow", row.DataType, Modifier.In, row));

            APIUtilities.Execute(program, statement, dataParams);

            return(null);
        }
示例#5
0
        public override object InternalExecute(Program program, object[] arguments)
        {
            var tableVar = APIUtilities.ResolveTableVarName(program, (string)arguments[0]);

            var insertStatement = new InsertStatement(new IdentifierExpression("ARow"), new IdentifierExpression(tableVar.Name));
            var statement       = new D4TextEmitter().Emit(insertStatement);
            var dataParams      = new DataParams();
            var row             = (IRow)arguments[1];

            dataParams.Add(new DataParam("ARow", row.DataType, Modifier.In, row));

            APIUtilities.Execute(program, statement, dataParams);

            return(null);
        }
示例#6
0
        public override object InternalExecute(Program program, object[] arguments)
        {
            var tableVar           = APIUtilities.ResolveTableVarName(program, (string)arguments[0]);
            var identifyingKey     = APIUtilities.FindIdentifyingKey(program, tableVar);
            var keyValues          = APIUtilities.GetKeyValues(program, identifyingKey, (string)arguments[1]);
            var keyEqualExpression = Compiler.BuildKeyEqualExpression(program.Plan, String.Empty, "AKey", new Schema.RowType(identifyingKey.Columns).Columns, keyValues.DataType.Columns);
            var tableVarExpression = new IdentifierExpression(tableVar.Name);
            var restrictExpression = new RestrictExpression(tableVarExpression, keyEqualExpression);
            var expression         = new D4TextEmitter().Emit(restrictExpression);
            var dataParams         = new DataParams();

            dataParams.Add(new DataParam("AKey", keyValues.DataType, Modifier.In, keyValues));

            return(APIUtilities.EvaluateSingleton(program, expression, dataParams));
        }
示例#7
0
        private string SaveSystemDeviceSettings()
        {
            D4TextEmitter emitter = new D4TextEmitter();
            Block         block   = new Block();

            if (_tempDevice.ClassDefinition.Attributes.Count > 0)
            {
                block.Statements.Add(SaveSystemDeviceSettings(_tempDevice));
            }
            if (_aTDevice.ClassDefinition.Attributes.Count > 0)
            {
                block.Statements.Add(SaveSystemDeviceSettings(_aTDevice));
            }
            if (_catalogDevice.ClassDefinition.Attributes.Count > 0)
            {
                block.Statements.Add(SaveSystemDeviceSettings(_catalogDevice));
            }
            return(new D4TextEmitter().Emit(block) + "\r\n");
        }
        public string GetCatalog(string name, out long cacheTimeStamp, out long clientCacheTimeStamp, out bool cacheChanged)
        {
            cacheTimeStamp = _serverProcess.ServerSession.Server.CacheTimeStamp;

            Schema.Catalog catalog = new Schema.Catalog();
            catalog.IncludeDependencies(_serverProcess.CatalogDeviceSession, _serverProcess.Catalog, _serverProcess.Catalog[name], EmitMode.ForRemote);

                        #if LOGCACHEEVENTS
            FServerProcess.ServerSession.Server.LogMessage(String.Format("Getting catalog for data type '{0}'.", AName));
                        #endif

            cacheChanged = true;
            string[] requiredObjects = _session.Server.CatalogCaches.GetRequiredObjects(_session, catalog, cacheTimeStamp, out clientCacheTimeStamp);
            if (requiredObjects.Length > 0)
            {
                string catalogString = new D4TextEmitter(EmitMode.ForRemote).Emit(catalog.EmitStatement(_serverProcess.CatalogDeviceSession, EmitMode.ForRemote, requiredObjects));
                return(catalogString);
            }
            return(String.Empty);
        }