public static async Task Run(string metadataFileName, string connectionString)
            {
                if (!File.Exists(metadataFileName))
                {
                    throw new ArgumentException($"File {metadataFileName} doesn't exist");
                }

                try
                {
                    Initialize(metadataFileName, connectionString);

                    var startTime = _cursor.GetCursorTime();

                    Log.LogMessage($"Start time: {startTime.ToString("u")}");

                    var packagesRepository = new EntityRepository <Package>(_context);
                    var packages           = packagesRepository.GetAll().Include(p => p.PackageRegistration);

                    int counter = 0;

                    var result = await TryReadNextMetadata();

                    RepositoryMetadataLog metadata = null;

                    while (result.success)
                    {
                        metadata = result.metadata;

                        // Skip packages with create date that we already processed in a previous run.
                        if (metadata.CreationDate >= startTime)
                        {
                            var package = packages.FirstOrDefault(p => p.PackageRegistration.Id == metadata.PackageId && p.NormalizedVersion == metadata.PackageVersion);

                            if (package != null)
                            {
                                package.RepositoryUrl = metadata.RepositoryMetadata.Url;

                                if (metadata.RepositoryMetadata.Type.Length >= 100)
                                {
                                    await _log.LogError(metadata.PackageId, metadata.PackageVersion, $"Repository type too long: {metadata.RepositoryMetadata.Type}");
                                }
                                else
                                {
                                    package.RepositoryType = metadata.RepositoryMetadata.Type;
                                }

                                counter++;
                                Console.Write(".");
                            }
                            else
                            {
                                await _log.LogError(metadata.PackageId, metadata.PackageVersion, "Couldn't find in DB");
                            }
                        }

                        if (counter >= BatchSize)
                        {
                            await CommitBatch(metadata.CreationDate);

                            counter = 0;
                        }

                        result = await TryReadNextMetadata();
                    }

                    if (counter > 0)
                    {
                        await CommitBatch(metadata.CreationDate);
                    }
                }
                finally
                {
                    Dispose();
                }

                Console.Read();
            }
            public static async Task Run(string connectionString, Uri serviceDiscoveryUri, DateTime lastCreateTime)
            {
                try
                {
                    await Initialize(connectionString, serviceDiscoveryUri);

                    // Get start time from cursor.
                    var startTime = _cursor.GetCursorTime();

                    Log.LogMessage($"Start time: {startTime.ToString("u")}");

                    var packagesRepository = new EntityRepository <Package>(_context);

                    var allPackages = packagesRepository.GetAll().Where(
                        p => p.Created <lastCreateTime &&
                                        p.Created> startTime &&
                        (p.PackageStatusKey == PackageStatus.Available || p.PackageStatusKey == PackageStatus.Validating));
                    allPackages = allPackages.Include(p => p.PackageRegistration).OrderBy(p => p.Key);

                    int counter = 0;

                    foreach (var package in allPackages)
                    {
                        var packageId = package.PackageRegistration.Id;
                        var version   = package.NormalizedVersion;

                        try
                        {
                            var repositoryMetadata = await GetRepositoryMetadata(packageId, version);

                            if (!string.IsNullOrEmpty(repositoryMetadata.Branch) ||
                                !string.IsNullOrEmpty(repositoryMetadata.Commit) ||
                                !string.IsNullOrEmpty(repositoryMetadata.Type) ||
                                !string.IsNullOrEmpty(repositoryMetadata.Url))
                            {
                                Log.LogMessage($"Found repo information for package {packageId} {version}");
                                await WriteMetadata(new RepositoryMetadataLog(repositoryMetadata, package.Created, packageId, version));
                            }
                            else
                            {
                                Console.Write(".");
                            }
                        }
                        catch (Exception e)
                        {
                            await _log.LogError(package.PackageRegistration.Id, package.NormalizedVersion, e);
                        }

                        counter++;

                        if (counter >= SaveCounterAfter)
                        {
                            await _cursor.WriteCursor(package.Created);

                            counter = 0;
                        }
                    }
                }
                finally
                {
                    Dispose();
                }

                Console.Read();
            }