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+ }
0 commit comments