--- mysql-connector-net-6.9.4-src/Source/MySql.Data/BulkLoader.cs 2014-09-19 01:41:21.000000000 +0200
+++ mysql-connector-net-6.9.4-src_new/Source/MySql.Data/BulkLoader.cs 2014-10-07 09:50:09.396235500 +0200
@@ -258,6 +258,16 @@
/// The number of rows inserted.
public int Load()
{
+ return Load(null);
+ }
+
+ ///
+ /// Execute the load operation
+ ///
+ /// A stream containing the data to be loaded
+ /// The number of rows inserted.
+ public int Load(Stream stream)
+ {
bool openedConnection = false;
if (Connection == null)
@@ -272,13 +282,18 @@
try
{
- string sql = BuildSqlCommand();
+ string sql = BuildSqlCommand(stream != null);
+
+ Connection.driver.BulkLoaderStream = stream;
+
MySqlCommand cmd = new MySqlCommand(sql, Connection);
cmd.CommandTimeout = Timeout;
return cmd.ExecuteNonQuery();
}
finally
{
+ Connection.driver.BulkLoaderStream = null;
+
if (openedConnection)
connection.Close();
}
@@ -295,14 +310,29 @@
return LoadAsync(CancellationToken.None);
}
+ ///
+ /// Async version of Load
+ ///
+ /// A stream containing the data to be loaded
+ /// The number of rows inserted.
+ public Task LoadAsync(Stream stream)
+ {
+ return LoadAsync(stream, CancellationToken.None);
+ }
+
public Task LoadAsync(CancellationToken cancellationToken)
{
+ return LoadAsync(null, cancellationToken);
+ }
+
+ public Task LoadAsync(Stream stream, CancellationToken cancellationToken)
+ {
var result = new TaskCompletionSource();
if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested)
{
try
{
- int loadResult = Load();
+ int loadResult = Load(stream);
result.SetResult(loadResult);
}
catch (Exception ex)
@@ -319,7 +349,7 @@
#endregion
#endif
- private string BuildSqlCommand()
+ private string BuildSqlCommand(bool useStream)
{
StringBuilder sql = new StringBuilder("LOAD DATA ");
if (Priority == MySqlBulkLoaderPriority.Low)
@@ -327,13 +357,20 @@
else if (Priority == MySqlBulkLoaderPriority.Concurrent)
sql.Append("CONCURRENT ");
- if (Local)
- sql.Append("LOCAL ");
- sql.Append("INFILE ");
- if (Platform.DirectorySeparatorChar == '\\')
- sql.AppendFormat("'{0}' ", FileName.Replace(@"\", @"\\"));
+ if (useStream)
+ {
+ sql.Append("LOCAL INFILE 'Dummy'");
+ }
else
- sql.AppendFormat("'{0}' ", FileName);
+ {
+ if (Local)
+ sql.Append("LOCAL ");
+ sql.Append("INFILE ");
+ if (Platform.DirectorySeparatorChar == '\\')
+ sql.AppendFormat("'{0}' ", FileName.Replace(@"\", @"\\"));
+ else
+ sql.AppendFormat("'{0}' ", FileName);
+ }
if (ConflictOption == MySqlBulkLoaderConflictOption.Ignore)
sql.Append("IGNORE ");
--- mysql-connector-net-6.9.4-src/Source/MySql.Data/Driver.cs 2014-09-19 01:41:21.000000000 +0200
+++ mysql-connector-net-6.9.4-src_new/Source/MySql.Data/Driver.cs 2014-10-07 10:26:36.355674300 +0200
@@ -23,6 +23,7 @@
using System;
using System.Collections;
using System.Globalization;
+using System.IO;
using System.Text;
using MySql.Data.Common;
using MySql.Data.Types;
@@ -174,6 +175,8 @@
public bool IsPasswordExpired { get; internal set; }
+ internal Stream BulkLoaderStream { get; set; }
+
#endregion
public string Property(string key)
--- mysql-connector-net-6.9.4-src/Source/MySql.Data/NativeDriver.cs 2014-09-19 01:41:21.000000000 +0200
+++ mysql-connector-net-6.9.4-src_new/Source/MySql.Data/NativeDriver.cs 2014-10-07 09:50:17.537371500 +0200
@@ -633,8 +633,7 @@
long len = 0;
try
{
- using (FileStream fs = new FileStream(filename, FileMode.Open,
- FileAccess.Read))
+ using (Stream fs = owner.BulkLoaderStream ?? new FileStream(filename, FileMode.Open, FileAccess.Read))
{
len = fs.Length;
while (len > 0)
--- mysql-connector-net-6.9.4-src/Tests/MySql.Data.Tests/MySqlBulkLoaderTests.cs 2014-09-19 01:41:21.000000000 +0200
+++ mysql-connector-net-6.9.4-src_new/Tests/MySql.Data.Tests/MySqlBulkLoaderTests.cs 2014-10-07 10:26:19.904749600 +0200
@@ -109,6 +109,33 @@
}
[Fact]
+ public void BulkLoadStream()
+ {
+ st.execSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(250), PRIMARY KEY(id))");
+
+ // first create the stream to be loaded
+ MemoryStream stream = new MemoryStream();
+ StreamWriter sw = new StreamWriter(stream);
+ for (int i = 0; i < 200; i++)
+ sw.WriteLine(i + "\t'Test'");
+ sw.Flush();
+
+ MySqlBulkLoader loader = new MySqlBulkLoader(st.conn);
+ loader.TableName = "Test";
+ loader.Timeout = 0;
+ int count = loader.Load(stream);
+ Assert.Equal(200, count);
+
+ sw.Close();
+
+ MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", st.conn);
+ DataTable dt = new DataTable();
+ da.Fill(dt);
+ Assert.Equal(200, dt.Rows.Count);
+ Assert.Equal("'Test'", dt.Rows[0][1].ToString().Trim());
+ }
+
+ [Fact]
public void BulkLoadSimple2()
{
st.execSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(250), PRIMARY KEY(id))");