Skip to content

Commit

Permalink
Merge pull request DbUp#81 from dia0369/master
Browse files Browse the repository at this point in the history
Support for selection of sql file encoding
  • Loading branch information
JakeGinnivan committed Apr 6, 2015
2 parents ce1c1dc + 7328317 commit 8f8dc1f
Show file tree
Hide file tree
Showing 4 changed files with 203 additions and 98 deletions.
88 changes: 74 additions & 14 deletions src/DbUp/Builder/StandardExtensions.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Reflection;
using System.Text;
using DbUp;
using DbUp.Builder;
using DbUp.Engine;
using DbUp.Engine.Output;
Expand Down Expand Up @@ -175,6 +177,35 @@ public static UpgradeEngineBuilder WithScriptsFromFileSystem(this UpgradeEngineB
public static UpgradeEngineBuilder WithScriptsFromFileSystem(this UpgradeEngineBuilder builder, string path, Func<string, bool> filter)
{
return WithScripts(builder, new FileSystemScriptProvider(path, filter));
}

/// <summary>
/// Adds all scripts from a folder on the file system, with custom encoding.
/// </summary>
/// <param name="builder">The builder.</param>
/// <param name="path">The directory path.</param>
/// <param name="encoding">The encoding.</param>
/// <returns>
/// The same builder
/// </returns>
public static UpgradeEngineBuilder WithScriptsFromFileSystem(this UpgradeEngineBuilder builder, string path, Encoding encoding)
{
return WithScripts(builder, new FileSystemScriptProvider(path, encoding));
}

/// <summary>
/// Adds all scripts from a folder on the file system, with a custom filter and custom encoding.
/// </summary>
/// <param name="builder">The builder.</param>
/// <param name="path">The directory path.</param>
/// <param name="filter">The filter. Use the static <see cref="Filters"/> class to get some pre-defined filters.</param>
/// <param name="encoding">The encoding.</param>
/// <returns>
/// The same builder
/// </returns>
public static UpgradeEngineBuilder WithScriptsFromFileSystem(this UpgradeEngineBuilder builder, string path, Func<string, bool> filter, Encoding encoding)
{
return WithScripts(builder, new FileSystemScriptProvider(path, filter, encoding));
}

/// <summary>
Expand All @@ -188,20 +219,49 @@ public static UpgradeEngineBuilder WithScriptsFromFileSystem(this UpgradeEngineB
public static UpgradeEngineBuilder WithScriptsEmbeddedInAssembly(this UpgradeEngineBuilder builder, Assembly assembly)
{
return WithScripts(builder, new EmbeddedScriptProvider(assembly, s => s.EndsWith(".sql", StringComparison.InvariantCultureIgnoreCase)));
}

/// <summary>
/// Adds all scripts found as embedded resources in the given assembly, with a custom filter (you'll need to exclude non- .SQL files yourself).
/// </summary>
/// <param name="builder">The builder.</param>
/// <param name="assembly">The assembly.</param>
/// <param name="filter">The filter. Don't forget to ignore any non- .SQL files.</param>
/// <returns>
/// The same builder
/// </returns>
public static UpgradeEngineBuilder WithScriptsEmbeddedInAssembly(this UpgradeEngineBuilder builder, Assembly assembly, Func<string, bool> filter)
}

/// <summary>
/// Adds all scripts found as embedded resources in the given assembly, with custom encoding.
/// </summary>
/// <param name="builder">The builder.</param>
/// <param name="assembly">The assembly.</param>
/// <param name="encoding">The encoding.</param>
/// <returns>
/// The same builder
/// </returns>
public static UpgradeEngineBuilder WithScriptsEmbeddedInAssembly(this UpgradeEngineBuilder builder, Assembly assembly, Encoding encoding)
{
return WithScripts(builder, new EmbeddedScriptProvider(assembly, s => s.EndsWith(".sql", StringComparison.InvariantCultureIgnoreCase), encoding));
}

/// <summary>
/// Adds all scripts found as embedded resources in the given assembly, with custom encoding and with a custom filter (you'll need to exclude non- .SQL files yourself).
/// </summary>
/// <param name="builder">The builder.</param>
/// <param name="assembly">The assembly.</param>
/// <param name="filter">The filter. Don't forget to ignore any non- .SQL files.</param>
/// <param name="encoding">The encoding.</param>
/// <returns>
/// The same builder
/// </returns>
public static UpgradeEngineBuilder WithScriptsEmbeddedInAssembly(this UpgradeEngineBuilder builder, Assembly assembly, Func<string, bool> filter, Encoding encoding)
{
return WithScripts(builder, new EmbeddedScriptProvider(assembly, filter));
return WithScripts(builder, new EmbeddedScriptProvider(assembly, filter, encoding));
}

/// <summary>
/// Adds all scripts found as embedded resources in the given assembly, with a custom filter (you'll need to exclude non- .SQL files yourself).
/// </summary>
/// <param name="builder">The builder.</param>
/// <param name="assembly">The assembly.</param>
/// <param name="filter">The filter. Don't forget to ignore any non- .SQL files.</param>
/// <returns>
/// The same builder
/// </returns>
public static UpgradeEngineBuilder WithScriptsEmbeddedInAssembly(this UpgradeEngineBuilder builder, Assembly assembly, Func<string, bool> filter)
{
return WithScripts(builder, new EmbeddedScriptProvider(assembly, filter));
}

/// <summary>
Expand Down
146 changes: 74 additions & 72 deletions src/DbUp/Engine/SqlScript.cs
Original file line number Diff line number Diff line change
@@ -1,73 +1,75 @@

using System.IO;
using System.Text;

namespace DbUp.Engine
{
/// <summary>
/// Represents a SQL Server script that comes from an embedded resource in an assembly.
/// </summary>
public class SqlScript
{
private readonly string contents;
private readonly string name;

/// <summary>
/// Initializes a new instance of the <see cref="SqlScript"/> class.
/// </summary>
/// <param name="name">The name.</param>
/// <param name="contents">The contents.</param>
public SqlScript(string name, string contents)
{
this.name = name;
this.contents = contents;
}

/// <summary>
/// Gets the contents of the script.
/// </summary>
/// <value></value>
public virtual string Contents
{
get { return contents; }
}

/// <summary>
/// Gets the name of the script.
/// </summary>
/// <value></value>
public string Name
{
get { return name; }
}

/// <summary>
///
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
public static SqlScript FromFile(string path)
{
using (FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read))
{
var fileName = new FileInfo(path).Name;
return FromStream(fileName, fileStream);
}
}

/// <summary>
///
/// </summary>
/// <param name="scriptName"></param>
/// <param name="stream"></param>
/// <returns></returns>
public static SqlScript FromStream(string scriptName, Stream stream)
{
using (var resourceStreamReader = new StreamReader(stream, Encoding.Default, true))
{
string c = resourceStreamReader.ReadToEnd();
return new SqlScript(scriptName, c);
}
}
}

using System.IO;
using System.Text;

namespace DbUp.Engine
{
/// <summary>
/// Represents a SQL Server script that comes from an embedded resource in an assembly.
/// </summary>
public class SqlScript
{
private readonly string contents;
private readonly string name;

/// <summary>
/// Initializes a new instance of the <see cref="SqlScript"/> class.
/// </summary>
/// <param name="name">The name.</param>
/// <param name="contents">The contents.</param>
public SqlScript(string name, string contents)
{
this.name = name;
this.contents = contents;
}

/// <summary>
/// Gets the contents of the script.
/// </summary>
/// <value></value>
public virtual string Contents
{
get { return contents; }
}

/// <summary>
/// Gets the name of the script.
/// </summary>
/// <value></value>
public string Name
{
get { return name; }
}

/// <summary>
///
/// </summary>
/// <param name="path"></param>
/// <param name="encoding"></param>
/// <returns></returns>
public static SqlScript FromFile(string path, Encoding encoding)
{
using (FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read))
{
var fileName = new FileInfo(path).Name;
return FromStream(fileName, fileStream, encoding);
}
}

/// <summary>
///
/// </summary>
/// <param name="scriptName"></param>
/// <param name="stream"></param>
/// <param name="encoding"></param>
/// <returns></returns>
public static SqlScript FromStream(string scriptName, Stream stream, Encoding encoding)
{
using (var resourceStreamReader = new StreamReader(stream, encoding, true))
{
string c = resourceStreamReader.ReadToEnd();
return new SqlScript(scriptName, c);
}
}
}
}
26 changes: 21 additions & 5 deletions src/DbUp/ScriptProviders/EmbeddedScriptProvider.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Reflection;
using System.Text;
using DbUp.Engine;
using DbUp.Engine.Transactions;

Expand All @@ -13,8 +14,9 @@ namespace DbUp.ScriptProviders
public class EmbeddedScriptProvider : IScriptProvider
{
private readonly Assembly assembly;
private readonly Func<string, bool> filter;

private readonly Func<string, bool> filter;
private Encoding encoding;

/// <summary>
/// Initializes a new instance of the <see cref="EmbeddedScriptProvider"/> class.
/// </summary>
Expand All @@ -23,7 +25,21 @@ public class EmbeddedScriptProvider : IScriptProvider
public EmbeddedScriptProvider(Assembly assembly, Func<string, bool> filter)
{
this.assembly = assembly;
this.filter = filter;
this.filter = filter;
this.encoding = Encoding.Default;
}

/// <summary>
/// Initializes a new instance of the <see cref="EmbeddedScriptProvider"/> class.
/// </summary>
/// <param name="assembly">The assembly.</param>
/// <param name="filter">The filter.</param>
/// <param name="encoding">The encoding.</param>
public EmbeddedScriptProvider(Assembly assembly, Func<string, bool> filter, Encoding encoding)
{
this.assembly = assembly;
this.filter = filter;
this.encoding = encoding;
}

/// <summary>
Expand All @@ -36,7 +52,7 @@ public IEnumerable<SqlScript> GetScripts(IConnectionManager connectionManager)
.GetManifestResourceNames()
.Where(filter)
.OrderBy(x => x)
.Select(s => SqlScript.FromStream(s, assembly.GetManifestResourceStream(s)))
.Select(s => SqlScript.FromStream(s, assembly.GetManifestResourceStream(s), encoding))
.ToList();
}

Expand Down
41 changes: 34 additions & 7 deletions src/DbUp/ScriptProviders/FileSystemScriptProvider.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Linq;
using System.Text;
using DbUp.Engine;
using DbUp.Engine.Transactions;

Expand All @@ -13,15 +14,17 @@ namespace DbUp.ScriptProviders
public class FileSystemScriptProvider : IScriptProvider
{
private readonly string directoryPath;
private readonly Func<string, bool> filter;
private readonly Func<string, bool> filter;
private readonly Encoding encoding;

///<summary>
///</summary>
///<param name="directoryPath">Path to SQL upgrade scripts</param>
public FileSystemScriptProvider(string directoryPath)
{
this.directoryPath = directoryPath;
this.filter = null;
this.filter = null;
this.encoding = Encoding.Default;
}

///<summary>
Expand All @@ -31,20 +34,44 @@ public FileSystemScriptProvider(string directoryPath)
public FileSystemScriptProvider(string directoryPath, Func<string, bool> filter)
{
this.directoryPath = directoryPath;
this.filter = filter;
this.filter = filter;
this.encoding = Encoding.Default;
}

///<summary>
///</summary>
///<param name="directoryPath">Path to SQL upgrade scripts</param>
///<param name="encoding">The encoding.</param>
public FileSystemScriptProvider(string directoryPath, Encoding encoding)
{
this.directoryPath = directoryPath;
this.filter = null;
this.encoding = encoding;
}

///<summary>
///</summary>
///<param name="directoryPath">Path to SQL upgrade scripts</param>
///<param name="filter">The filter.</param>
///<param name="encoding">The encoding.</param>
public FileSystemScriptProvider(string directoryPath, Func<string, bool> filter, Encoding encoding)
{
this.directoryPath = directoryPath;
this.filter = filter;
this.encoding = encoding;
}

/// <summary>
/// Gets all scripts that should be executed.
/// </summary>
public IEnumerable<SqlScript> GetScripts(IConnectionManager connectionManager)
{
public IEnumerable<SqlScript> GetScripts(IConnectionManager connectionManager)
{
var files = Directory.GetFiles(directoryPath, "*.sql").AsEnumerable();
if (this.filter != null)
{
files = files.Where(filter);
}
return files.Select(SqlScript.FromFile).ToList();
return files.Select(x => SqlScript.FromFile(x, encoding)).ToList();
}


Expand Down

0 comments on commit 8f8dc1f

Please sign in to comment.