Source/Databases/SMODatabase.cs

using MG;
using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Smo;
using SQL.SMO.Framework;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Management.Automation;
 
namespace SQL.SMO.Databases
{
    public class SMODatabase : MGNameResolver, ISMOObject
    {
        private Database _db;
        private string[] _tblNames;
        private CompatTable _compat;
 
        public string Name => _db.Name;
        public bool AutoShrink => _db.AutoShrink;
        public string Collation => _db.Collation;
        public string Compatibility => GetName(_compat);
        public SqlSmoState State => _db.State;
        public DatabaseStatus Status => _db.Status;
        public RecoveryModel RecoveryModel => _db.RecoveryModel;
        public LogReuseWaitStatus LogReuseWaitStatus => _db.LogReuseWaitStatus;
        public Type MSType => typeof(Database);
        public string[] Tables
        {
            get
            {
                if (_tblNames == null)
                {
                    GetTableNames();
                }
                return _tblNames;
            }
        }
 
        internal SMODatabase(Database db)
        {
            _db = db;
            _compat = (CompatTable)MatchEnums(_db.CompatibilityLevel, typeof(CompatTable), typeof(CompatAttribute));
        }
 
        internal SMOTable[] GetTables()
        {
            SMOTable[] smot = new SMOTable[_db.Tables.Count];
            for (int i = 0; i < _db.Tables.Count; i++)
            {
                Table t = _db.Tables[i];
                smot[i] = new SMOTable(t);
            }
            return smot;
        }
 
        internal SMOTable[] GetTables(string[] tableNames)
        {
            SMOTable[] smot = new SMOTable[tableNames.Length];
            IEnumerable<Table> tbls = _db.Tables.OfType<Table>();
            Table t = null;
            for (int i = 0; i < tableNames.Length; i++)
            {
                string s = tableNames[i];
                try
                {
                    t = tbls.Single(x =>
                        String.Equals(x.Name, s, StringComparison.OrdinalIgnoreCase)
                    );
                }
                catch
                {
                    throw new SmoException("Table '" + s + "' was not found!");
                }
                smot[i] = new SMOTable(t);
            }
            return smot;
        }
 
        internal protected void GetTableNames()
        {
            _tblNames = new string[_db.Tables.Count];
            for (int i = 0; i < _db.Tables.Count; i++)
            {
                Table tbl = _db.Tables[i];
                _tblNames[i] = tbl.Name;
            }
        }
 
        public object ShowOriginal() => _db;
    }
}