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