33
44#if NPGSQL
55
6- using System ;
7- using System . Collections . Generic ;
8- using System . Linq ;
96using System . Runtime . CompilerServices ;
10- using System . Threading . Tasks ;
117using Microsoft . Extensions . Caching . Memory ;
128using Npgsql ;
139
@@ -33,35 +29,27 @@ public RawDb(ConcurrentRandom random, AppSettings appSettings)
3329
3430 public async Task < World > LoadSingleQueryRow ( )
3531 {
36- using ( var db = new NpgsqlConnection ( _connectionString ) )
37- {
38- await db . OpenAsync ( ) ;
32+ using var db = new NpgsqlConnection ( _connectionString ) ;
33+ await db . OpenAsync ( ) ;
3934
40- var ( cmd , _) = CreateReadCommand ( db ) ;
41- using ( cmd )
42- {
43- return await ReadSingleRow ( cmd ) ;
44- }
45- }
35+ var ( cmd , _) = CreateReadCommand ( db ) ;
36+ using var command = cmd ;
37+ return await ReadSingleRow ( cmd ) ;
4638 }
4739
4840 public async Task < World [ ] > LoadMultipleQueriesRows ( int count )
4941 {
5042 var result = new World [ count ] ;
5143
52- using ( var db = new NpgsqlConnection ( _connectionString ) )
53- {
54- await db . OpenAsync ( ) ;
44+ using var db = new NpgsqlConnection ( _connectionString ) ;
45+ await db . OpenAsync ( ) ;
5546
56- var ( cmd , idParameter ) = CreateReadCommand ( db ) ;
57- using ( cmd )
58- {
59- for ( int i = 0 ; i < result . Length ; i ++ )
60- {
61- result [ i ] = await ReadSingleRow ( cmd ) ;
62- idParameter . TypedValue = _random . Next ( 1 , 10001 ) ;
63- }
64- }
47+ var ( cmd , idParameter ) = CreateReadCommand ( db ) ;
48+ using var command = cmd ;
49+ for ( int i = 0 ; i < result . Length ; i ++ )
50+ {
51+ result [ i ] = await ReadSingleRow ( cmd ) ;
52+ idParameter . TypedValue = _random . Next ( 1 , 10001 ) ;
6553 }
6654
6755 return result ;
@@ -91,32 +79,28 @@ public Task<CachedWorld[]> LoadCachedQueries(int count)
9179
9280 static async Task < CachedWorld [ ] > LoadUncachedQueries ( int id , int i , int count , RawDb rawdb , CachedWorld [ ] result )
9381 {
94- using ( var db = new NpgsqlConnection ( rawdb . _connectionString ) )
82+ using var db = new NpgsqlConnection ( rawdb . _connectionString ) ;
83+ await db . OpenAsync ( ) ;
84+
85+ var ( cmd , idParameter ) = rawdb . CreateReadCommand ( db ) ;
86+ using var command = cmd ;
87+ Func < ICacheEntry , Task < CachedWorld > > create = async _ =>
9588 {
96- await db . OpenAsync ( ) ;
97-
98- var ( cmd , idParameter ) = rawdb . CreateReadCommand ( db ) ;
99- using ( cmd )
100- {
101- Func < ICacheEntry , Task < CachedWorld > > create = async _ =>
102- {
103- return await rawdb . ReadSingleRow ( cmd ) ;
104- } ;
105-
106- var cacheKeys = _cacheKeys ;
107- var key = cacheKeys [ id ] ;
108-
109- idParameter . TypedValue = id ;
110-
111- for ( ; i < result . Length ; i ++ )
112- {
113- result [ i ] = await rawdb . _cache . GetOrCreateAsync ( key , create ) ;
114-
115- id = rawdb . _random . Next ( 1 , 10001 ) ;
116- idParameter . TypedValue = id ;
117- key = cacheKeys [ id ] ;
118- }
119- }
89+ return await rawdb . ReadSingleRow ( cmd ) ;
90+ } ;
91+
92+ var cacheKeys = _cacheKeys ;
93+ var key = cacheKeys [ id ] ;
94+
95+ idParameter . TypedValue = id ;
96+
97+ for ( ; i < result . Length ; i ++ )
98+ {
99+ result [ i ] = await rawdb . _cache . GetOrCreateAsync ( key , create ) ;
100+
101+ id = rawdb . _random . Next ( 1 , 10001 ) ;
102+ idParameter . TypedValue = id ;
103+ key = cacheKeys [ id ] ;
120104 }
121105
122106 return result ;
@@ -125,21 +109,17 @@ static async Task<CachedWorld[]> LoadUncachedQueries(int id, int i, int count, R
125109
126110 public async Task PopulateCache ( )
127111 {
128- using ( var db = new NpgsqlConnection ( _connectionString ) )
129- {
130- await db . OpenAsync ( ) ;
112+ using var db = new NpgsqlConnection ( _connectionString ) ;
113+ await db . OpenAsync ( ) ;
131114
132- var ( cmd , idParameter ) = CreateReadCommand ( db ) ;
133- using ( cmd )
134- {
135- var cacheKeys = _cacheKeys ;
136- var cache = _cache ;
137- for ( var i = 1 ; i < 10001 ; i ++ )
138- {
139- idParameter . TypedValue = i ;
140- cache . Set < CachedWorld > ( cacheKeys [ i ] , await ReadSingleRow ( cmd ) ) ;
141- }
142- }
115+ var ( cmd , idParameter ) = CreateReadCommand ( db ) ;
116+ using var command = cmd ;
117+ var cacheKeys = _cacheKeys ;
118+ var cache = _cache ;
119+ for ( var i = 1 ; i < 10001 ; i ++ )
120+ {
121+ idParameter . TypedValue = i ;
122+ cache . Set < CachedWorld > ( cacheKeys [ i ] , await ReadSingleRow ( cmd ) ) ;
143123 }
144124
145125 Console . WriteLine ( "Caching Populated" ) ;
@@ -149,37 +129,35 @@ public async Task<World[]> LoadMultipleUpdatesRows(int count)
149129 {
150130 var results = new World [ count ] ;
151131
152- using ( var db = new NpgsqlConnection ( _connectionString ) )
153- {
154- await db . OpenAsync ( ) ;
132+ using var db = new NpgsqlConnection ( _connectionString ) ;
133+ await db . OpenAsync ( ) ;
155134
156- var ( queryCmd , queryParameter ) = CreateReadCommand ( db ) ;
157- using ( queryCmd )
135+ var ( queryCmd , queryParameter ) = CreateReadCommand ( db ) ;
136+ using ( queryCmd )
137+ {
138+ for ( int i = 0 ; i < results . Length ; i ++ )
158139 {
159- for ( int i = 0 ; i < results . Length ; i ++ )
160- {
161- results [ i ] = await ReadSingleRow ( queryCmd ) ;
162- queryParameter . TypedValue = _random . Next ( 1 , 10001 ) ;
163- }
140+ results [ i ] = await ReadSingleRow ( queryCmd ) ;
141+ queryParameter . TypedValue = _random . Next ( 1 , 10001 ) ;
164142 }
143+ }
165144
166- using ( var updateCmd = new NpgsqlCommand ( BatchUpdateString . Query ( count ) , db ) )
167- {
168- var ids = BatchUpdateString . Ids ;
169- var randoms = BatchUpdateString . Randoms ;
170-
171- for ( int i = 0 ; i < results . Length ; i ++ )
172- {
173- var randomNumber = _random . Next ( 1 , 10001 ) ;
145+ using ( var updateCmd = new NpgsqlCommand ( BatchUpdateString . Query ( count ) , db ) )
146+ {
147+ var ids = BatchUpdateString . Ids ;
148+ var randoms = BatchUpdateString . Randoms ;
174149
175- updateCmd . Parameters . Add ( new NpgsqlParameter < int > ( parameterName : ids [ i ] , value : results [ i ] . Id ) ) ;
176- updateCmd . Parameters . Add ( new NpgsqlParameter < int > ( parameterName : randoms [ i ] , value : randomNumber ) ) ;
150+ for ( int i = 0 ; i < results . Length ; i ++ )
151+ {
152+ var randomNumber = _random . Next ( 1 , 10001 ) ;
177153
178- results [ i ] . RandomNumber = randomNumber ;
179- }
154+ updateCmd . Parameters . Add ( new NpgsqlParameter < int > ( parameterName : ids [ i ] , value : results [ i ] . Id ) ) ;
155+ updateCmd . Parameters . Add ( new NpgsqlParameter < int > ( parameterName : randoms [ i ] , value : randomNumber ) ) ;
180156
181- await updateCmd . ExecuteNonQueryAsync ( ) ;
157+ results [ i ] . RandomNumber = randomNumber ;
182158 }
159+
160+ await updateCmd . ExecuteNonQueryAsync ( ) ;
183161 }
184162
185163 return results ;
@@ -193,17 +171,15 @@ public async Task<List<Fortune>> LoadFortunesRows()
193171 {
194172 await db . OpenAsync ( ) ;
195173
196- using ( var cmd = new NpgsqlCommand ( "SELECT id, message FROM fortune" , db ) )
197- using ( var rdr = await cmd . ExecuteReaderAsync ( ) )
174+ using var cmd = new NpgsqlCommand ( "SELECT id, message FROM fortune" , db ) ;
175+ using var rdr = await cmd . ExecuteReaderAsync ( ) ;
176+ while ( await rdr . ReadAsync ( ) )
198177 {
199- while ( await rdr . ReadAsync ( ) )
200- {
201- result . Add ( new Fortune
202- (
203- id : rdr . GetInt32 ( 0 ) ,
204- message : rdr . GetString ( 1 )
205- ) ) ;
206- }
178+ result . Add ( new Fortune
179+ (
180+ id : rdr . GetInt32 ( 0 ) ,
181+ message : rdr . GetString ( 1 )
182+ ) ) ;
207183 }
208184 }
209185
@@ -226,16 +202,14 @@ public async Task<List<Fortune>> LoadFortunesRows()
226202 [ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
227203 private async Task < World > ReadSingleRow ( NpgsqlCommand cmd )
228204 {
229- using ( var rdr = await cmd . ExecuteReaderAsync ( System . Data . CommandBehavior . SingleRow ) )
230- {
231- await rdr . ReadAsync ( ) ;
205+ using var rdr = await cmd . ExecuteReaderAsync ( System . Data . CommandBehavior . SingleRow ) ;
206+ await rdr . ReadAsync ( ) ;
232207
233- return new World
234- {
235- Id = rdr . GetInt32 ( 0 ) ,
236- RandomNumber = rdr . GetInt32 ( 1 )
237- } ;
238- }
208+ return new World
209+ {
210+ Id = rdr . GetInt32 ( 0 ) ,
211+ RandomNumber = rdr . GetInt32 ( 1 )
212+ } ;
239213 }
240214
241215 private static readonly object [ ] _cacheKeys = Enumerable . Range ( 0 , 10001 ) . Select ( i => new CacheKey ( i ) ) . ToArray ( ) ;
0 commit comments