Example #1
0
        protected override async Task DoSomethingAsync(NpgsqlConnection connection, CancellationToken token)
        {
            NpgsqlTransaction transaction = null;

            try
            {
                var nameFormat = new Regex(@"^\d{4}-\d{2}-\d{2}-\d{2}.sql$");
                var contents   = _fileProvider
                                 .GetDirectoryContents("sql")
                                 .Where(f => nameFormat.IsMatch(f.Name))
                                 .OrderBy(f => f.Name)
                                 .ToArray();

                if (!contents.Any())
                {
                    return;
                }

                var versions = await connection.GetVersionNamesAsync(token);

                transaction = connection.BeginTransaction();

                foreach (var content in contents)
                {
                    if (versions.Contains(content.Name))
                    {
                        continue;
                    }

                    string sql;
                    using (var sr = new StreamReader(content.CreateReadStream()))
                    {
                        sql = sr.ReadToEnd();
                    }
                    await connection.UpdateDb(sql, token);

                    await connection.AddVersion(content.Name, token);
                }

                transaction.CommitAndDispose();
            }
            catch (OperationCanceledException)
            {
                transaction.RollbackAndDispose();
            }
            catch (Exception)
            {
                transaction.RollbackAndDispose();
                throw;
            }
        }