Skip to content

Commit 128156f

Browse files
authored
FbBlobStream (#127)
1 parent f00a9a9 commit 128156f

File tree

10 files changed

+796
-55
lines changed

10 files changed

+796
-55
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
using System.IO;
2+
using System.Security.Cryptography;
3+
using System.Threading.Tasks;
4+
using FirebirdSql.Data.TestsBase;
5+
using NUnit.Framework;
6+
7+
namespace FirebirdSql.Data.FirebirdClient.Tests;
8+
9+
[TestFixtureSource(typeof(FbServerTypeTestFixtureSource), nameof(FbServerTypeTestFixtureSource.Default))]
10+
[TestFixtureSource(typeof(FbServerTypeTestFixtureSource), nameof(FbServerTypeTestFixtureSource.Embedded))]
11+
public class BlobStreamTests : FbTestsBase
12+
{
13+
public BlobStreamTests(FbServerType serverType, bool compression, FbWireCrypt wireCrypt)
14+
: base(serverType, compression, wireCrypt)
15+
{ }
16+
17+
[Test]
18+
public async Task FbBlobStreamReadTest()
19+
{
20+
var id_value = RandomNumberGenerator.GetInt32(int.MinValue, int.MaxValue);
21+
var insert_values = RandomNumberGenerator.GetBytes(100000 * 4);
22+
23+
await using (var transaction = await Connection.BeginTransactionAsync())
24+
{
25+
await using (var insert = new FbCommand("INSERT INTO TEST (int_field, blob_field) values(@int_field, @blob_field)", Connection, transaction))
26+
{
27+
insert.Parameters.Add("@int_field", FbDbType.Integer).Value = id_value;
28+
insert.Parameters.Add("@blob_field", FbDbType.Binary).Value = insert_values;
29+
await insert.ExecuteNonQueryAsync();
30+
}
31+
await transaction.CommitAsync();
32+
}
33+
34+
await using (var select = new FbCommand($"SELECT blob_field FROM TEST WHERE int_field = {id_value}", Connection))
35+
{
36+
await using var reader = await select.ExecuteReaderAsync();
37+
while (await reader.ReadAsync())
38+
{
39+
await using var output = new MemoryStream();
40+
await using (var stream = reader.GetStream(0))
41+
{
42+
await stream.CopyToAsync(output);
43+
}
44+
45+
var select_values = output.ToArray();
46+
CollectionAssert.AreEqual(insert_values, select_values);
47+
}
48+
}
49+
}
50+
51+
[Test]
52+
public async Task FbBlobStreamWriteTest()
53+
{
54+
var id_value = RandomNumberGenerator.GetInt32(int.MinValue, int.MaxValue);
55+
var insert_values = RandomNumberGenerator.GetBytes(100000 * 4);
56+
57+
await using (var transaction = await Connection.BeginTransactionAsync())
58+
{
59+
await using (var insert = new FbCommand("INSERT INTO TEST (int_field, blob_field) values(@int_field, @blob_field)", Connection, transaction))
60+
{
61+
insert.Parameters.Add("@int_field", FbDbType.Integer).Value = id_value;
62+
insert.Parameters.Add("@blob_field", FbDbType.Binary).Value = insert_values;
63+
await insert.ExecuteNonQueryAsync();
64+
}
65+
66+
await using (var select = new FbCommand($"SELECT blob_field FROM TEST WHERE int_field = {id_value}", Connection, transaction))
67+
{
68+
await using var reader = await select.ExecuteReaderAsync();
69+
while (await reader.ReadAsync())
70+
{
71+
await using var stream = reader.GetStream(0);
72+
await stream.WriteAsync(insert_values);
73+
74+
break;
75+
}
76+
}
77+
await transaction.CommitAsync();
78+
}
79+
80+
await using (var select = new FbCommand($"SELECT blob_field FROM TEST WHERE int_field = {id_value}", Connection))
81+
{
82+
var select_values = (byte[])await select.ExecuteScalarAsync();
83+
CollectionAssert.AreEqual(insert_values, select_values);
84+
}
85+
}
86+
}

src/FirebirdSql.Data.FirebirdClient.Tests/FbBlobTests.cs

+1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ public async Task BinaryBlobTest()
4444
insert.Parameters.Add("@blob_field", FbDbType.Binary).Value = insert_values;
4545
await insert.ExecuteNonQueryAsync();
4646
}
47+
4748
await transaction.CommitAsync();
4849
}
4950

0 commit comments

Comments
 (0)