--- 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))");