Exemple #1
0
        public ILightDataTable ObjectColumns(Type type)
        {
            var key = type.FullName + _repository.DataBaseTypes.ToString();

            try
            {
                if (CachedObjectColumn.ContainsKey(key))
                {
                    return(CachedObjectColumn[key]);
                }
                var table = type.TableName();
                var cmd   = _repository.GetSqlCommand(_repository.DataBaseTypes == DataBaseTypes.Mssql || _repository.DataBaseTypes == DataBaseTypes.PostgreSql
                    ? $"SELECT COLUMN_NAME as column_name, data_type FROM INFORMATION_SCHEMA.COLUMNS WHERE LOWER(TABLE_NAME) = LOWER(String[{table}])"
                    : $"SELECT name as column_name, type as data_type  FROM pragma_table_info(String[{table}]);");
                var data = _repository.GetLightDataTable(cmd, "column_name");
                if (data.Rows.Any())
                {
                    return(CachedObjectColumn.GetOrAdd(key, data));
                }
                else
                {
                    return(data);
                }
            }
            catch (NpgsqlException)
            {
                _repository.Renew();
                return(ObjectColumns(type));
            }
        }
Exemple #2
0
        public void RemoveTable(Type tableType, List <Type> tableRemoved = null, bool remove = true)
        {
            if (tableRemoved == null)
            {
                tableRemoved = new List <Type>();
            }
            if (tableRemoved.Any(x => x == tableType))
            {
                return;
            }
            GlobalConfiguration.Log?.Info("Removig", tableType);
            tableRemoved.Insert(0, tableType);
            var props = DeepCloner.GetFastDeepClonerProperties(tableType);

            foreach (var prop in props.Where(x => (!x.IsInternalType || x.ContainAttribute <ForeignKey>()) && !x.ContainAttribute <ExcludeFromAbstract>() && !x.ContainAttribute <JsonDocument>() && !x.ContainAttribute <XmlDocument>()))
            {
                var key = prop.GetCustomAttribute <ForeignKey>();
                if (key != null && tableRemoved.Any(x => x == key.Type))
                {
                    continue;
                }
                if (key != null)
                {
                    RemoveTable(key.Type, tableRemoved, false);
                }
                else
                {
                    RemoveTable(prop.PropertyType.GetActualType(), tableRemoved, false);
                }
            }

            if (!remove)
            {
                return;
            }

            var tableData = _repository.GetColumnSchema(tableType);

            if (!tableData.Values.Any())
            {
                return;
            }
            var c = tableRemoved.Count;

            _repository.CreateTransaction();
            while (c > 0)
            {
                for (var i = tableRemoved.Count - 1; i >= 0; i--)
                {
                    try
                    {
                        var tType = tableRemoved[i];
                        if (_repository.GetColumnSchema(tType).Values.Any())
                        {
                            Database.CachedColumnSchema.Remove(tType.FullName + _repository.DataBaseTypes.ToString());
                            var tableName = tType.TableName();
                            _repository.ExecuteNonQuery(_repository.GetSqlCommand("DELETE FROM " + tableName.GetName(_repository.DataBaseTypes) + ";"));
                            var cmd = _repository.GetSqlCommand("DROP TABLE " + tableName.GetName(_repository.DataBaseTypes) + ";");
                            _repository.ExecuteNonQuery(cmd);
                            Database.CachedColumnSchema.Remove(tType.FullName + _repository.DataBaseTypes.ToString());
                        }


                        c--;
                    }
                    catch (Exception e)
                    {
                        if (_repository.DataBaseTypes == DataBaseTypes.PostgreSql)
                        {
                            _repository.Renew();
                        }
                    }
                }
            }
        }