コード例 #1
0
        public override void ExplicitVisit(UserDataTypeReference node)
        {
            var name       = node.Name;
            var parameters = node.Parameters;

            if (System.Diagnostics.Debugger.IsAttached)
            {
                System.Diagnostics.Debugger.Break();
            }
            node.Analyse.ResultType = null;
            base.ExplicitVisit(node);
        }
コード例 #2
0
        public static Field GetField(
            this UserDataTypeReference userDataTypeReference,
            string name,
            bool isNullable,
            ILogger logger,
            SchemaFile file
            )
        {
            var identifier  = userDataTypeReference.Name.GetQualifiedIdentfier(file);
            var identifiers = identifier.Split('.');

            if (userDataTypeReference.Name.Identifiers.Count.Equals(1))
            {
                // TODO : trying if it is a system data type.. I basically have 2 options
                // 1) hardcode what I'm interested in here
                // 2) create SQL files and process those first
                // we'll see how big this gets..
                var systemTypeName = userDataTypeReference.Name.Identifiers.First().Value;
                switch (systemTypeName.ToUpper())
                {
                case "SYSNAME":
                    return(new StringField()
                    {
                        Name = name,
                        Type = FieldType.String,     // nvarchar
                        Origin = OriginType.SystemType,
                        Length = 128,
                        IsNullable = false,
                    });

                case "GEOGRAPHY":
                    return(new TableReferenceField()
                    {
                        Name = name,
                        Type = FieldType.Table,
                        Origin = OriginType.SystemType,
                        IsNullable = false,
                        Reference = new Table()
                        {
                            File = file,
                            Database = identifiers[0],
                            Schema = identifiers[1],
                            Identifier = identifiers[2],
                            Columns = new List <Field>()
                            {
                                new DefaultField()
                                {
                                    Name = "Lat",
                                    Type = FieldType.Float,
                                    Origin = OriginType.Table,
                                    IsNullable = false,
                                },
                                new DefaultField()
                                {
                                    Name = "Long",
                                    Type = FieldType.Float,
                                    Origin = OriginType.Table,
                                    IsNullable = false,
                                },
                            }
                        }
                    });
                }
            }

            var reference = file.Schema.ContainsKey(identifier)
                ? file.Schema[identifier]
                : new Unknown()
            {
                File       = file,
                Database   = identifiers[0],
                Schema     = identifiers[1],
                Identifier = identifiers[2],
            };

            if (reference.Type == SchemaObjectType.NotSpecified)
            {
                logger.Log(LogLevel.Warning,
                           LogType.MissingSchemaObject,
                           file.Path,
                           $"\"{identifier}\" user data type reference is missing in the schema.");
            }

            return(new TableReferenceField()
            {
                Name = name,
                Type = FieldType.Table,
                Origin = OriginType.Reference,
                IsNullable = isNullable,
                Reference = reference,
            });
        }
コード例 #3
0
        public CreateProcedureStatement Convert(CStoredProcedure storedProcedure)
        {
            //build body

            string[] parts = { storedProcedure.Schema.SchemaName, storedProcedure.StoredProcedureName };

            var createStoredProcedure = new CreateProcedureStatement();

            ///set schema and table name
            ///
            var schemaObjectName = new SchemaObjectName();

            schemaObjectName.Identifiers.Add(new Identifier {
                Value = storedProcedure.Schema.SchemaName
            });
            schemaObjectName.Identifiers.Add(new Identifier {
                Value = storedProcedure.StoredProcedureName
            });

            createStoredProcedure.ProcedureReference      = new ProcedureReference();
            createStoredProcedure.ProcedureReference.Name = schemaObjectName;

            //add parameters


            foreach (var param in storedProcedure.Parameter)
            {
                if (param.ParameterTypeIsUserDefined)
                {
                    var dataType = new UserDataTypeReference();
                    dataType.Name = new SchemaObjectName();
                    dataType.Name.Identifiers.Add(new Identifier {
                        Value = param.ParameterTypeRaw
                    });
                    if (param.ParameterLength > 0)
                    {
                        dataType.Parameters.Add(new IntegerLiteral {
                            Value = param.ParameterLength.ToString()
                        });
                    }

                    createStoredProcedure.Parameters.Add(new ProcedureParameter
                    {
                        VariableName = new Identifier {
                            Value = $"@{param.ParameterName}"
                        },
                        DataType = dataType,
                        Value    = param.DefaultToNull ? new NullLiteral() : null,
                        Modifier = param.ParameterTypeRaw.ToLower() == "sysname" ? ParameterModifier.None: ParameterModifier.ReadOnly //todo
                    });
                }
                else
                {
                    var dataType      = new SqlDataTypeReference();
                    var parameterName = param.ParameterName;
                    if (param.IsCollection)
                    {
                        parameterName += "_Collection";// temp solution for comma separate collection parameters
                    }
                    if (param.ParameterTypeRaw == "enum")
                    {
                        dataType.SqlDataTypeOption = SqlDataTypeOption.Int; //todo: review this
                    }
                    else
                    {
                        dataType.SqlDataTypeOption = SqlMapper.SqlTypeToSqlDataTypeOption(param.ParameterTypeRaw);
                    }

                    if (param.ParameterLength > 0)
                    {
                        dataType.Parameters.Add(new IntegerLiteral {
                            Value = param.ParameterLength.ToString()
                        });
                    }

                    createStoredProcedure.Parameters.Add(new ProcedureParameter
                    {
                        VariableName = new Identifier {
                            Value = $"@{parameterName}"
                        },
                        DataType = dataType,
                        Value    = param.DefaultToNull ? new NullLiteral() : null
                    });
                }
            }

            var parser = new TSql120Parser(false);

            createStoredProcedure.StatementList = new StatementList();
            if (!string.IsNullOrEmpty(storedProcedure.StoredProcedureBody))
            {
                IList <ParseError> errors;
                var script2 =
                    parser.Parse(new StringReader(storedProcedure.StoredProcedureBody), out errors) as TSqlScript;
                if (errors.Count > 0)
                {
                    RaiseSqlErrorsException(errors, storedProcedure.StoredProcedureBody);
                }
                foreach (var batch2 in script2.Batches)
                {
                    foreach (var statement in batch2.Statements)
                    {
                        createStoredProcedure.StatementList.Statements.Add(statement);
                    }
                }
            }

            return(createStoredProcedure);
        }
コード例 #4
0
ファイル: AllNodesVisitor.cs プロジェクト: yaakoviyun/sqlskim
 public override void Visit(UserDataTypeReference node) { this.action(node); }
コード例 #5
0
 public override void ExplicitVisit(UserDataTypeReference fragment)
 {
     _fragments.Add(fragment);
 }
コード例 #6
0
 public override void ExplicitVisit(UserDataTypeReference node)
 {
     (new TypeVisitor(this.currentScopeRef.Current)).ExplicitVisit(node);
 }