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)); } }
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(); } } } } }