/// <summary>
        /// Backup a repository in according to the source and destination.
        /// </summary>
        public void Backup()
        {
            DisplayHeader();

            SourceSettings srcSettings = new SourceSettings()
            {
                Repository    = ConsoleHelpers.GetCommandArgValue(_arguments, Arguments.Source).ConvertToSourceRepository(),
                Path          = ConsoleHelpers.GetCommandArgValue(_arguments, Arguments.SourcePath),
                CheckLevel    = ConsoleHelpers.GetCommandArgValue(_arguments, Arguments.Check).ConvertToCheckLevel(),
                NoCleaning    = ConsoleHelpers.CommandArgExists(_arguments, Arguments.NoCleaning),
                WideDisplay   = ConsoleHelpers.CommandArgExists(_arguments, Arguments.Wide),
                ApiKey        = ConsoleHelpers.GetCommandArgValue(_arguments, Arguments.SourceApiKey),
                NoLocalDelete = ConsoleHelpers.CommandArgExists(_arguments, Arguments.NoLocalDelete)
            };

            DestinationSettings dstSettings = new DestinationSettings()
            {
                Repository = ConsoleHelpers.GetCommandArgValue(_arguments, Arguments.Dest).ConvertToDestinationRepository(),
                Path       = ConsoleHelpers.GetCommandArgValue(_arguments, Arguments.DestPath),
                ApiKey     = ConsoleHelpers.GetCommandArgValue(_arguments, Arguments.DestApiKey)
            };

            TransformSettings trfSettings = new TransformSettings()
            {
                Kind = ConsoleHelpers.GetCommandArgValue(_arguments, Arguments.Transform).ConvertToTransformKind(),
                TripleDesFilename = ConsoleHelpers.GetCommandArgValue(_arguments, Arguments.CryptoKey)
            };

            IRepositorySource source = new RepositorySourceFactory(_logger, this).Create(srcSettings, dstSettings, trfSettings);

            WriteComponentLabels(source);
            source.Process();

            DisplayFooter();
        }
Esempio n. 2
0
        private void btnStart_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(inputDirTextBox.Text))
            {
                MessageBox.Show("Input directory cannot be none!");
                return;
            }
            if (string.IsNullOrEmpty(outputDirTextBox.Text))
            {
                MessageBox.Show("Output directory cannot be none!");
                return;
            }
            if (string.IsNullOrEmpty(formatComboBox.Text))
            {
                MessageBox.Show("You must choose a format");
                return;
            }
            int        searchDepth = TransformSettings.getSearchDepth();
            FileFilter fileFilter  = getFileFilter();

            if (TransformSettings.isKeepOriginDirs())
            {
                transformFilesKeepDirs(inputDirTextBox.Text, outputDirTextBox.Text, fileFilter, 0, searchDepth);
            }
            else
            {
                transformFilesNotKeepDirs(inputDirTextBox.Text, outputDirTextBox.Text, fileFilter, 0, searchDepth);
            }
            MessageBox.Show("Transform Complete!");
        }
        public DatajobRun(TransformSettings transformSettings, ILogger logger, DexihDatajob datajob, DexihHub hub, TransformWriterOptions transformWriterOptions, IAlertQueue alertQueue, string[] alertEmails)
        {
            _transformSettings = transformSettings;
            _logger            = logger;
            _alertQueue        = alertQueue;
            _alertEmails       = alertEmails;

            _transformWriterOptions = transformWriterOptions;

            if (datajob.AuditConnectionKey > 0)
            {
                var dbAuditConnection =
                    hub.DexihConnections.SingleOrDefault(c => c.IsValid && c.Key == datajob.AuditConnectionKey);

                if (dbAuditConnection == null)
                {
                    throw new DatalinkRunException(
                              $"Audit connection with key {datajob.AuditConnectionKey} was not found.");
                }

                _auditConnection = dbAuditConnection.GetConnection(_transformSettings);
            }
            else
            {
                _auditConnection = new ConnectionMemory();
            }


            Datajob = datajob;
            _hub    = hub;
        }
 public DownloadData(TransformSettings transformSettings, CacheManager cache, DownloadObject[] downloadObjects, EDownloadFormat downloadFormat, bool zipFiles)
 {
     TransformSettings = transformSettings;
     Cache             = cache;
     DownloadObjects   = downloadObjects;
     DownloadFormat    = downloadFormat;
     ZipFiles          = zipFiles;
 }
Esempio n. 5
0
        public DatalinkTestRun(
            TransformSettings transformSettings,
            ILogger logger,
            DexihDatalinkTest datalinkTest,
            DexihHub hub,
            TransformWriterOptions transformWriterOptions,
            IAlertQueue alertQueue,
            string[] alertEmails
            )
        {
            _transformSettings      = transformSettings;
            _transformWriterOptions = transformWriterOptions;
            _logger = logger;

            // create a copy of the hub as the test run will update objects.
            _hub = hub.Serialize().Deserialize <DexihHub>();
            // _hub = hub.CloneProperties();

            _datalinkTest = datalinkTest;
            _alertQueue   = alertQueue;
            _alertEmails  = alertEmails;

            Connection auditConnection;

            if (datalinkTest.AuditConnectionKey > 0)
            {
                var dbAuditConnection =
                    _hub.DexihConnections.SingleOrDefault(c => c.IsValid && c.Key == datalinkTest.AuditConnectionKey);

                if (dbAuditConnection == null)
                {
                    throw new DatalinkRunException(
                              $"Audit connection with key {datalinkTest.AuditConnectionKey} was not found.");
                }

                auditConnection = dbAuditConnection.GetConnection(_transformSettings);
            }
            else
            {
                auditConnection = new ConnectionMemory();
            }

            TestResults = new List <TestResult>();

            WriterResult = new TransformWriterResult()
            {
                AuditConnection        = auditConnection,
                AuditConnectionKey     = datalinkTest.AuditConnectionKey ?? 0,
                AuditType              = Constants.DatalinkTest,
                HubKey                 = _hub.HubKey,
                ReferenceKey           = datalinkTest.Key,
                ParentAuditKey         = 0,
                ReferenceName          = datalinkTest.Name,
                SourceTableKey         = 0,
                SourceTableName        = "",
                TransformWriterOptions = _transformWriterOptions
            };
        }
Esempio n. 6
0
        public (string securityKey, DexihApi api) ActivateApi(AutoStart autoStart)
        {
            var dbApi = autoStart.Hub.DexihApis.SingleOrDefault(c => c.IsValid && c.Key == autoStart.Key);

            if (dbApi == null)
            {
                throw new Exception($"Api with key {autoStart.Key} was not found");
            }

            _logger.LogInformation("Starting API - {api}.", dbApi.Name);

            var settings = new TransformSettings()
            {
                HubVariables   = autoStart.HubVariables,
                RemoteSettings = _sharedSettings.RemoteSettings,
                ClientFactory  = _clientFactory
            };

            var hub = autoStart.Hub;

            string    key;
            Transform transform;

            if (dbApi.SourceType == ESourceType.Table)
            {
                var dbTable      = hub.GetTableFromKey(dbApi.SourceTableKey.Value);
                var dbConnection = hub.DexihConnections.Single(c => c.IsValid && c.Key == dbTable.ConnectionKey);

                var connection = dbConnection.GetConnection(settings);
                var table      = dbTable.GetTable(hub, connection, settings);

                transform = connection.GetTransformReader(table);
            }
            else
            {
                var dbDatalink =
                    hub.DexihDatalinks.Single(c => c.IsValid && c.Key == dbApi.SourceDatalinkKey.Value);
                var transformOperations = new TransformsManager(settings);
                var runPlan             = transformOperations.CreateRunPlan(hub, dbDatalink, null, null, null, null);
                transform = runPlan.sourceTransform;
            }


            transform.SetCacheMethod(dbApi.CacheQueries ? ECacheMethod.LookupCache : ECacheMethod.NoCache);
            key = Add(hub.HubKey, autoStart.Key, transform, dbApi.CacheResetInterval, autoStart.SecurityKey, dbApi.SelectQuery);

            return(key, dbApi);
        }
        private async Task <(Transform transform, string name)> GetDatalinkTransform(long key, long?datalinkTransformKey, InputColumn[] inputColumns, InputParameters inputParameters, SelectQuery selectQuery, CancellationToken cancellationToken)
        {
            var dbDatalink =
                Cache.Hub.DexihDatalinks.SingleOrDefault(c => c.Key == key);

            if (dbDatalink == null)
            {
                throw new DownloadDataException(
                          $"The datalink with key {key} could not be found in the cache.");
            }

            dbDatalink.UpdateParameters(inputParameters);

            var transformWriterOptions = new TransformWriterOptions()
            {
                PreviewMode = true,
            };

            var transformSettings = new TransformSettings()
            {
                HubVariables    = TransformSettings.HubVariables,
                InputParameters = dbDatalink.Parameters.ToArray(),
                RemoteSettings  = TransformSettings.RemoteSettings,
                ClientFactory   = TransformSettings.ClientFactory
            };

            var transformManager = new TransformsManager(transformSettings);

            //Get the last Transform that will load the target table.
            var runPlan = transformManager.CreateRunPlan(Cache.Hub, dbDatalink,
                                                         inputColumns, datalinkTransformKey, null,
                                                         transformWriterOptions);
            var transform  = runPlan.sourceTransform;
            var openReturn = await transform.Open(0, selectQuery, cancellationToken);

            if (!openReturn)
            {
                throw new DownloadDataException(
                          $"The datalink {dbDatalink.Name} failed to open for reading.");
            }

            // transform.SetCacheMethod(ECacheMethod.DemandCache);
            transform.SetEncryptionMethod(EEncryptionMethod.MaskSecureFields, "");

            return(transform, dbDatalink.Name);
        }
Esempio n. 8
0
        private void transformFilesKeepDirs(string inputPath, string outputPath, FileFilter fileFilter, int curDepth, int maxDepth)
        {
            // if current search depth > max search depth, then quit.
            if (curDepth >= maxDepth)
            {
                return;
            }
            // first, check the directory in the output path is exists, if not exists, then create one.
            if (!Directory.Exists(outputPath))
            {
                Directory.CreateDirectory(outputPath);
            }
            // second, get all the sub-directories and traserse it.
            DirectoryInfo directoryInfo = new DirectoryInfo(inputPath);

            DirectoryInfo[] childDirectoryInfos = directoryInfo.GetDirectories();
            foreach (DirectoryInfo childDirectoryInfo in childDirectoryInfos)
            {
                string path   = childDirectoryInfo.FullName;
                string curDir = FileUtil.getCurDir(path);
                transformFilesKeepDirs(path, outputPath + "\\" + curDir, fileFilter, curDepth + 1, maxDepth);
            }
            // third, get all the sub-files and use file filter to get image files.
            FileInfo[] fileInfos = FileUtil.getSubFileInfos(inputPath, fileFilter).ToArray <FileInfo>();
            // forth, accroding to the settings to transform all the files.
            int length = fileInfos.Length;

            mainProgressBar.Maximum = length;
            mainProgressBar.Value   = 0;
            for (int i = 0; i < length; ++i)
            {
                string name;
                if (TransformSettings.isKeepOriginName())
                {
                    name = FileUtil.getName(fileInfos[i].FullName);
                }
                else
                {
                    name = i.ToString();
                }
                ImageUtil.transform(fileInfos[i], string.Format("{0}\\{1}.{2}", outputPath, name, formatComboBox.Text));
                mainProgressBar.PerformStep();
            }
        }
Esempio n. 9
0
        private void transformFilesNotKeepDirs(string inputPath, string outputPath, FileFilter fileFilter, int curDepth, int maxDepth)
        {
            IList <FileInfo>      fileInfoList = new List <FileInfo>();
            Queue <DirectoryInfo> dirInfoQueue = new Queue <DirectoryInfo>();

            dirInfoQueue.Enqueue(new DirectoryInfo(inputPath));
            while (dirInfoQueue.Count > 0)
            {
                DirectoryInfo   directoryInfo       = dirInfoQueue.Dequeue();
                DirectoryInfo[] childDirectoryInfos = directoryInfo.GetDirectories();
                foreach (DirectoryInfo childDirectoryInfo in childDirectoryInfos)
                {
                    dirInfoQueue.Enqueue(childDirectoryInfo);
                }
                fileInfoList = fileInfoList.Concat <FileInfo>(FileUtil.getSubFileInfos(directoryInfo.FullName, fileFilter)).ToList <FileInfo>();
            }
            FileInfo[] fileInfos = fileInfoList.ToArray <FileInfo>();
            int        length    = fileInfos.Length;

            mainProgressBar.Maximum = length;
            mainProgressBar.Value   = 0;
            for (int i = 0; i < length; ++i)
            {
                string name;
                if (TransformSettings.isKeepOriginName())
                {
                    name = FileUtil.getName(fileInfos[i].FullName);
                }
                else
                {
                    name = i.ToString();
                }
                ImageUtil.transform(fileInfos[i], string.Format("{0}\\{1}.{2}", outputPath, name, formatComboBox.Text));
                mainProgressBar.PerformStep();
            }
        }
        /// <summary>
        /// Create a <see cref="IRepositorySource"/> instance in according to the command arguments
        /// </summary>
        public IRepositorySource Create(SourceSettings srcSettings, DestinationSettings dstSettings, TransformSettings trfSettings)
        {
            srcSettings = srcSettings ?? throw new ArgumentNullException("srcSettings");
            dstSettings = dstSettings ?? throw new ArgumentNullException("dstSettings");
            trfSettings = trfSettings ?? throw new ArgumentNullException("trfSettings");

            IRepositorySource source;

            switch (srcSettings.Repository)
            {
            case SourceRepository.Local:
            {
                Helpers.MandatoryValue("source path", srcSettings.Path);

                source = new LocalDirectorySource(srcSettings.Path, _progress, srcSettings.WideDisplay,
                                                  srcSettings.CheckLevel, srcSettings.NoCleaning);
                break;
            }

            case SourceRepository.GCS:
            {
                Helpers.MandatoryValue("source path", srcSettings.Path);
                Helpers.MandatoryValue("source api key filename", srcSettings.ApiKey);

                source = new GcsBucketSource(srcSettings.Path, srcSettings.ApiKey, _progress, srcSettings.WideDisplay);
                break;
            }

            case SourceRepository.S3:
            {
                Helpers.MandatoryValue("source path", srcSettings.Path);
                Helpers.MandatoryValue("source api key filename", srcSettings.ApiKey);

                source = new S3BucketSource(srcSettings.Path, srcSettings.ApiKey, _progress, srcSettings.WideDisplay);
                break;
            }

            default:
                throw new SmkException($"Unsupported repository source '{srcSettings.Repository}");
            }

            source.Transform   = new TransformFactory(_logger).Create(trfSettings);
            source.Destination = new RepositoryDestinationFactory(_logger, source.Transform).Create(dstSettings);
            source.Logger      = _logger;

            return(source);
        }
        public async Task <bool> Run(CancellationToken cancellationToken)
        {
            try
            {
                cancellationToken.ThrowIfCancellationRequested();

                WriterResult.StartTime      = DateTime.Now;
                WriterResult.LastUpdateTime = DateTime.Now;

                var runStatus = WriterResult.SetRunStatus(ERunStatus.Started, null, null);
                if (!runStatus)
                {
                    throw new DatajobRunException($"Failed to set status");
                }

                if (_transformWriterOptions.TargetAction == TransformWriterOptions.ETargetAction.Truncate)
                {
                    runStatus = WriterResult.SetRunStatus(ERunStatus.Started, "Truncating tables...", null);

                    var targetTables = new HashSet <DexihTable>();

                    foreach (var step in Datajob.DexihDatalinkSteps.Where(c => c.IsValid))
                    {
                        var datalink = _hub.DexihDatalinks.SingleOrDefault(c => c.IsValid && c.Key == step.DatalinkKey);

                        if (datalink == null)
                        {
                            throw new DatajobRunException($"The datalink in the step {step.Name} with the datalink key {step.DatalinkKey} cound not be found.");
                        }

                        foreach (var target in datalink.DexihDatalinkTargets)
                        {
                            if (target.TableKey > 0)
                            {
                                var table = _hub.GetTableFromKey(target.TableKey);
                                if (table != null)
                                {
                                    targetTables.Add(table);
                                }
                            }
                        }
                    }

                    // this loops through attempting to truncate tables one by one.
                    // is repeats when there are failures to accomodate for some table having foriegn keys

                    var atLeastOneSuccess = true;
                    var atLeastOneFail    = true;

                    while (atLeastOneSuccess && atLeastOneFail)
                    {
                        atLeastOneSuccess = false;
                        atLeastOneFail    = false;

                        var newTagetTables = new HashSet <DexihTable>();

                        foreach (var dbTable in targetTables)
                        {
                            var dbConnection = _hub.DexihConnections.SingleOrDefault(c => c.Key == dbTable.ConnectionKey);

                            if (dbConnection == null)
                            {
                                throw new DatajobRunException($"The connection for the table {dbTable.Name} with the connection key {dbTable.ConnectionKey} could not be found.");
                            }
                            var connection = dbConnection.GetConnection(_transformSettings);
                            var table      = dbTable.GetTable(_hub, connection, _transformSettings);
                            try
                            {
                                await connection.TruncateTable(table, cancellationToken);

                                atLeastOneSuccess = true;
                            }
                            catch
                            {
                                atLeastOneFail = true;
                                newTagetTables.Add(dbTable);
                            }
                        }

                        targetTables = newTagetTables;
                    }

                    if (targetTables.Count > 0)
                    {
                        var message = $"The job failed as the following tables could not be truncated: {string.Join(", ", targetTables.Select(c => c.Name))}";
                        WriterResult.SetRunStatus(ERunStatus.Abended, message, null);
                        return(false);
                    }
                }

                var inputParameters = new InputParameters();
                foreach (var parameter in Datajob.Parameters)
                {
                    inputParameters.Add(new InputParameter()
                    {
                        Name = parameter.Name, Value = parameter.Value, Rank = parameter.Rank
                    });
                }

                //start all jobs async
                foreach (var step in Datajob.DexihDatalinkSteps.Where(c => c.IsValid))
                {
                    var datalink = _hub.DexihDatalinks.SingleOrDefault(c => c.IsValid && c.Key == step.DatalinkKey);

                    if (datalink == null)
                    {
                        throw new DatajobRunException($"The step {step.Name} contains a datalink with the key {step.DatalinkKey} which can not be found.");
                    }

                    foreach (var parameter in step.Parameters)
                    {
                        parameter.Value = inputParameters.SetParameters(parameter.Value, parameter.Rank);
                    }

                    var transformSettings = new TransformSettings
                    {
                        HubVariables    = _transformSettings.HubVariables,
                        RemoteSettings  = _transformSettings.RemoteSettings,
                        InputParameters = step.Parameters.ToArray <InputParameterBase>(),
                        ClientFactory   = _transformSettings.ClientFactory
                    };

                    var inputColumns = step.DexihDatalinkStepColumns.Select(c => c.ToInputColumn()).ToArray();

                    var datalinkRun = new DatalinkRun(transformSettings, _logger, WriterResult.AuditKey, datalink, _hub, inputColumns, _transformWriterOptions, _alertQueue, _alertEmails)
                    {
                        DatalinkStepKey = step.Key
                    };

                    DatalinkSteps.Add(datalinkRun);

                    //start datalinks that have no dependencies.
                    if (step.DexihDatalinkDependencies == null || step.DexihDatalinkDependencies.Count == 0)
                    {
                        StartDatalink(datalinkRun);
                    }
                }

                WriterResult.SetRunStatus(ERunStatus.Running, null, null);

                await WaitUntilFinished();

                return(true);
            }
            catch (OperationCanceledException)
            {
                Cancel();
                await WaitUntilFinished();

                WriterResult.SetRunStatus(ERunStatus.Cancelled, "Datajob was cancelled", null);
                throw new DatajobRunException($"The datajob {Datajob.Name} was cancelled.");
            }
            catch (Exception ex)
            {
                Cancel();
                await WaitUntilFinished();

                var message = $"The job {Datajob.Name} failed.  {ex.Message}";
                WriterResult?.SetRunStatus(ERunStatus.Abended, message, ex);
                throw new DatajobRunException(message, ex);
            }
            finally
            {
                await WriterResult.CompleteDatabaseWrites();

                OnFinish?.Invoke(this);
            }
        }
 public ColumnValidationRun(TransformSettings transformSettings, DexihColumnValidation columnValidation, DexihHub hub)
 {
     ColumnValidation = columnValidation;
     Hub = hub;
     _transformSettings = transformSettings;
 }
 public TransformsManager(TransformSettings transformSettings, ILogger logger)
 {
     _transformSettings = transformSettings;
     _logger            = logger;
 }
 public TransformsManager(TransformSettings transformSettings)
 {
     _transformSettings = transformSettings;
 }