1
+ using System ;
2
+ using System . Data ;
3
+ using System . Threading ;
4
+ using Shuttle . Core . Contract ;
5
+
6
+ namespace Shuttle . Core . Data
7
+ {
8
+ public static class DatabaseContextFactoryExtensions
9
+ {
10
+ public static bool IsAvailable ( this IDatabaseContextFactory databaseContextFactory ,
11
+ CancellationToken cancellationToken , int retries = 4 , int secondsBetweenRetries = 15 )
12
+ {
13
+ Guard . AgainstNull ( databaseContextFactory , nameof ( databaseContextFactory ) ) ;
14
+
15
+ return IsAvailable ( ( ) =>
16
+ {
17
+ using ( databaseContextFactory . Create ( ) )
18
+ {
19
+ }
20
+ } , cancellationToken , retries , secondsBetweenRetries ) ;
21
+ }
22
+
23
+ public static bool IsAvailable ( this IDatabaseContextFactory databaseContextFactory , string name ,
24
+ CancellationToken cancellationToken , int retries = 4 , int secondsBetweenRetries = 15 )
25
+ {
26
+ Guard . AgainstNull ( databaseContextFactory , nameof ( databaseContextFactory ) ) ;
27
+
28
+ return IsAvailable ( ( ) =>
29
+ {
30
+ using ( databaseContextFactory . Create ( name ) )
31
+ {
32
+ }
33
+ } , cancellationToken , retries , secondsBetweenRetries ) ;
34
+ }
35
+
36
+ public static bool IsAvailable ( this IDatabaseContextFactory databaseContextFactory , string providerName , IDbConnection dbConnection ,
37
+ CancellationToken cancellationToken , int retries = 4 , int secondsBetweenRetries = 15 )
38
+ {
39
+ Guard . AgainstNull ( databaseContextFactory , nameof ( databaseContextFactory ) ) ;
40
+
41
+ return IsAvailable ( ( ) =>
42
+ {
43
+ using ( databaseContextFactory . Create ( providerName , dbConnection ) )
44
+ {
45
+ }
46
+ } , cancellationToken , retries , secondsBetweenRetries ) ;
47
+ }
48
+
49
+ public static bool IsAvailable ( this IDatabaseContextFactory databaseContextFactory , string providerName , string connectionString ,
50
+ CancellationToken cancellationToken , int retries = 4 , int secondsBetweenRetries = 15 )
51
+ {
52
+ Guard . AgainstNull ( databaseContextFactory , nameof ( databaseContextFactory ) ) ;
53
+
54
+ return IsAvailable ( ( ) =>
55
+ {
56
+ using ( databaseContextFactory . Create ( providerName , connectionString ) )
57
+ {
58
+ }
59
+ } , cancellationToken , retries , secondsBetweenRetries ) ;
60
+ }
61
+
62
+ private static bool IsAvailable ( Action action , CancellationToken cancellationToken , int retries = 4 , int secondsBetweenRetries = 15 )
63
+ {
64
+ var attempt = 0 ;
65
+
66
+ do
67
+ {
68
+ try
69
+ {
70
+ action . Invoke ( ) ;
71
+
72
+ break ;
73
+ }
74
+ catch
75
+ {
76
+ attempt ++ ;
77
+
78
+ if ( attempt < retries )
79
+ {
80
+ var wait = DateTime . Now . AddSeconds ( secondsBetweenRetries ) ;
81
+
82
+ while ( ! cancellationToken . IsCancellationRequested && DateTime . Now < wait )
83
+ {
84
+ Thread . Sleep ( 250 ) ;
85
+ }
86
+ }
87
+ }
88
+ } while ( attempt < retries ) ;
89
+
90
+ return attempt <= retries ;
91
+ }
92
+ }
93
+ }
0 commit comments