protected override void ReadExtractionResults() { if (!string.IsNullOrEmpty(_databaseExtractFilePath) && File.Exists(_databaseExtractFilePath)) { _lastSchemaUpdates = new Dictionary <string, DateTime>(StringComparer.CurrentCultureIgnoreCase); using (var reader = new UoeExportReader(_databaseExtractFilePath, Env.IoEncoding)) { string currentDatabaseName = null; while (reader.ReadRecord(out List <string> fields, out int _, true)) { if (fields.Count < 2) { continue; } switch (fields[0]) { case "D": currentDatabaseName = fields[1]; break; case "M": if (string.IsNullOrEmpty(currentDatabaseName)) { continue; } if (!_lastSchemaUpdates.ContainsKey(currentDatabaseName)) { // Wed Aug 16 17:56:59 2017 if (DateTime.TryParseExact(fields[1], "ddd MMM d HH:mm:ss yyyy", CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal | DateTimeStyles.AllowWhiteSpaces, out DateTime updateDate)) { _lastSchemaUpdates.Add(currentDatabaseName, updateDate); } } break; } } } } }
protected override void ReadExtractionResults() { if (!string.IsNullOrEmpty(_databaseExtractFilePath) && File.Exists(_databaseExtractFilePath)) { _tablesCrc = new Dictionary <string, string>(StringComparer.CurrentCultureIgnoreCase); _sequences = new HashSet <string>(StringComparer.CurrentCultureIgnoreCase); using (var reader = new UoeExportReader(_databaseExtractFilePath, Env.IoEncoding)) { string currentDatabaseName = null; while (reader.ReadRecord(out List <string> fields, out int _, true)) { if (fields.Count < 2) { continue; } switch (fields[0]) { case "D": currentDatabaseName = fields[1]; break; case "S": if (string.IsNullOrEmpty(currentDatabaseName)) { continue; } var dbNames = new List <string> { currentDatabaseName }; if (Env.DatabaseAliases != null) { dbNames.AddRange(Env.DatabaseAliases.Where(a => a.DatabaseLogicalName.EqualsCi(currentDatabaseName)).Select(a => a.AliasLogicalName)); } foreach (var db in dbNames) { var key = $"{db}.{fields[1]}"; if (!_sequences.Contains(key)) { _sequences.Add(key); } } break; case "T": if (string.IsNullOrEmpty(currentDatabaseName) || fields.Count < 3) { continue; } var dbNames2 = new List <string> { currentDatabaseName }; if (Env.DatabaseAliases != null) { dbNames2.AddRange(Env.DatabaseAliases.Where(a => a.DatabaseLogicalName.EqualsCi(currentDatabaseName)).Select(a => a.AliasLogicalName)); } foreach (var db in dbNames2) { var key = $"{db}.{fields[1]}"; if (!_tablesCrc.ContainsKey(key)) { _tablesCrc.Add(key, fields[2]); } } break; } } } } }
public List <IUoeDatabase> ReadDatabasesFromDumpFile(string filePath) { var output = new List <IUoeDatabase>(); IUoeDatabase currentDatabase = null; IUoeDatabaseTable currentTable = null; using (var reader = new UoeExportReader(filePath, Env.IoEncoding)) { reader.QuestionMarkReturnsNull = true; while (reader.ReadRecord(out List <string> fields, out int _, true)) { if (fields.Count < 2) { continue; } switch (fields[0]) { case "D": currentDatabase = GetNew <IUoeDatabase>(); currentDatabase.ExtractionTime = DateTime.ParseExact(fields[1], "yyyyMMdd-HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal); currentDatabase.LogicalName = fields[2]; currentDatabase.PhysicalName = Path.GetFileName(fields[3]); currentDatabase.Version = UoeUtilities.GetDatabaseVersionFromInternalVersion(int.Parse(fields[4]), int.Parse(fields[5]), out DatabaseBlockSize bs); currentDatabase.BlockSize = bs; currentDatabase.Charset = fields[6]; currentDatabase.Collation = fields[7]; output.Add(currentDatabase); break; case "S": if (currentDatabase == null) { throw new UoeExecutionException($"Found sequence without a database ({fields[1]})."); } var sequence = GetNew <IUoeDatabaseSequence>(); sequence.Name = fields[1]; sequence.CycleOnLimit = fields[2][0] == '1'; sequence.Increment = int.Parse(fields[3]); sequence.Initial = int.Parse(fields[4]); if (int.TryParse(fields[5], out int min)) { sequence.Min = min; } if (int.TryParse(fields[6], out int max)) { sequence.Max = max; } (currentDatabase.Sequences ?? (currentDatabase.Sequences = new List <IUoeDatabaseSequence>())).Add(sequence); break; case "T": if (currentDatabase == null) { throw new UoeExecutionException($"Found table without a database ({fields[1]})."); } currentTable = GetNew <IUoeDatabaseTable>(); currentTable.Name = fields[1]; currentTable.DumpName = fields[2]; currentTable.Crc = ushort.Parse(fields[3]); currentTable.Label = fields[4]; currentTable.LabelAttribute = fields[5]; currentTable.Description = fields[6]; currentTable.Hidden = fields[7][0] == '1'; currentTable.Frozen = fields[8][0] == '1'; currentTable.Area = fields[9]; if (Enum.TryParse(fields[10], true, out UoeDatabaseTableType type)) { currentTable.Type = type; } currentTable.ValidationExpression = fields[11]; currentTable.ValidationMessage = fields[12]; currentTable.ValidationMessageAttribute = fields[13]; currentTable.Replication = fields[14]; currentTable.Foreign = fields[15]; (currentDatabase.Tables ?? (currentDatabase.Tables = new List <IUoeDatabaseTable>())).Add(currentTable); break; case "F": if (currentTable == null) { throw new UoeExecutionException($"Found field without a table ({fields[1]})."); } var field = GetNew <IUoeDatabaseField>(); field.Name = fields[1]; if (Enum.TryParse(fields[2].Replace("-", ""), true, out UoeDatabaseDataType dataType)) { field.DataType = dataType; } field.Format = fields[3]; field.FormatAttribute = fields[4]; field.Order = int.Parse(fields[5]); field.Position = int.Parse(fields[6]); field.Mandatory = fields[7][0] == '1'; field.CaseSensitive = fields[8][0] == '1'; field.Extent = int.Parse(fields[9]); field.InitialValue = fields[10]; field.InitialValueAttribute = fields[11]; field.Width = int.Parse(fields[12]); field.Label = fields[13]; field.LabelAttribute = fields[14]; field.ColumnLabel = fields[15]; field.ColumnLabelAttribute = fields[16]; field.Description = fields[17]; field.Help = fields[18]; field.HelpAttribute = fields[19]; if (int.TryParse(fields[20], out int decimals)) { field.Decimals = decimals; } if (field.DataType == UoeDatabaseDataType.Clob) { field.ClobCharset = fields[21]; field.ClobCollation = fields[22]; field.ClobType = int.Parse(fields[23]); } if (field.DataType == UoeDatabaseDataType.Blob || field.DataType == UoeDatabaseDataType.Clob) { field.LobSize = fields[24]; if (int.TryParse(fields[25], out int lobBytes)) { field.LobBytes = lobBytes; } field.LobArea = fields[26]; } (currentTable.Fields ?? (currentTable.Fields = new List <IUoeDatabaseField>())).Add(field); break; case "X": if (currentTable == null) { throw new UoeExecutionException($"Found trigger without a table ({fields[1]})."); } var trigger = GetNew <IUoeDatabaseTrigger>(); if (Enum.TryParse(fields[1].Replace("-", ""), true, out UoeDatabaseTriggerEvent triggerEvent)) { trigger.Event = triggerEvent; } trigger.Procedure = fields[3]; trigger.Overridable = fields[4][0] == '1'; if (ushort.TryParse(fields[5], out ushort crc)) { trigger.Crc = crc; } if (!string.IsNullOrEmpty(fields[2])) { var triggerField = currentTable.Fields?.FirstOrDefault(f => f.Name.Equals(fields[2], StringComparison.CurrentCultureIgnoreCase)); if (triggerField == null) { throw new UoeExecutionException($"Found field trigger without a corresponding field ({fields[2]})."); } (triggerField.Triggers ?? (triggerField.Triggers = new List <IUoeDatabaseTrigger>())).Add(trigger); } else { (currentTable.Triggers ?? (currentTable.Triggers = new List <IUoeDatabaseTrigger>())).Add(trigger); } break; case "I": if (currentTable == null) { throw new UoeExecutionException($"Found index without a table ({fields[1]})."); } var index = GetNew <IUoeDatabaseIndex>(); index.Name = fields[1]; index.Active = fields[2][0] == '1'; index.Primary = fields[3][0] == '1'; index.Unique = fields[4][0] == '1'; index.Word = fields[5][0] == '1'; index.Crc = ushort.Parse(fields[6]); index.Area = fields[7]; var indexFieldStrings = fields[8].Split(','); index.Description = fields[9]; foreach (var indexFieldString in indexFieldStrings) { var indexFieldFound = currentTable.Fields?.FirstOrDefault(f => f.Name.Equals(indexFieldString.Substring(2), StringComparison.CurrentCultureIgnoreCase)); if (indexFieldFound == null) { throw new UoeExecutionException($"Found index without a corresponding field ({indexFieldString.Substring(2)})."); } var indexField = GetNew <IUoeDatabaseIndexField>(); indexField.Ascending = indexFieldString[0] == '+'; indexField.Abbreviate = indexFieldString[1] == '1'; indexField.Field = indexFieldFound; (index.Fields ?? (index.Fields = new List <IUoeDatabaseIndexField>())).Add(indexField); } (currentTable.Indexes ?? (currentTable.Indexes = new List <IUoeDatabaseIndex>())).Add(index); break; } } } return(output); }