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;
                        }
                    }
                }
            }
        }
Exemple #2
0
        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;
                        }
                    }
                }
            }
        }
Exemple #3
0
        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);
        }