Пример #1
0
        private SqlMetadata(SqlConnection conn)
        {
            _conn = conn;

            _objectPromise = new Promise <IEnumerable <SqlObject> >();
            new SqlCommand(@"SELECT SCHEMA_NAME(SCHEMA_ID) sch
                        , name
                        , case when type in ('D') then 'Constraint'
                            when type in ('F', 'PK', 'UQ') then 'Key'
                            when type in ('S', 'IT', 'U') then 'Table'
                            when type in ('IF', 'FN', 'TF') then 'Function'
                            when type in ('P') then 'Procedure'
                            when type in ('V') then 'View'
                            else type end type
                        , case when type in ('IF', 'TF') then 1 
                              when type = 'PK' then 2 else 0 end sub_type
                        , object_id
                        , parent_object_id
                      FROM sys.objects AS SO
                      UNION ALL
                      SELECT 
                          SCHEMA_NAME(o.schema_id) + '.[' + o.name + ']' sch
                        , ind.name
                        , 'Index'
                        , 0 table_valued
                        , ind.index_id object_id
                        , ind.object_id parent_object_id
                      FROM sys.indexes ind
                      inner join sys.[objects] o
                      on o.object_id = ind.object_id
                      WHERE 
                       ind.is_primary_key = 0 
                       AND ind.is_unique = 0 
                       AND ind.is_unique_constraint = 0 
                       AND o.is_ms_shipped = 0", conn)
            .GetListAsync <SqlObject>(async(r) => SqlObject.Create(
                                          await r.GetFieldStringAsync(0),
                                          await r.GetFieldStringAsync(1),
                                          await r.GetFieldStringAsync(2),
                                          await r.GetFieldIntAsync(4),
                                          await r.GetFieldIntAsync(5),
                                          (SqlSubType)await r.GetFieldIntAsync(3)
                                          )).ContinueWith(l =>
            {
                if (l.IsFaulted)
                {
                    _objectPromise.Reject(l.Exception);
                }
                else if (l.IsCanceled)
                {
                    _objectPromise.Cancel();
                }
                else
                {
                    var items = l.Result.Concat(_systemViews);
                    _objects  = items.ToDictionary(o => o.Schema + "." + o.Name, StringComparer.OrdinalIgnoreCase);
                    _schemas  = items.Where(o => !string.IsNullOrEmpty(o.Schema)).Select(o => o.Schema).Distinct().ToArray();
                    _objectPromise.Resolve(_objects.Values);
                }
            });
        }