@@ -7,12 +7,17 @@ open Oxpecker
7
7
[<AutoOpen>]
8
8
module Common =
9
9
10
+ [<Struct>]
10
11
[<CLIMutable>]
11
- type Fortune =
12
- {
13
- id : int
14
- message : string
15
- }
12
+ type JsonMessage = {
13
+ message : string
14
+ }
15
+
16
+ [<CLIMutable>]
17
+ type Fortune = {
18
+ id: int
19
+ message: string
20
+ }
16
21
17
22
[<Literal>]
18
23
let ConnectionString = " Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;SSL Mode=Disable;Maximum Pool Size=1024;NoResetOnClose=true;Enlist=false;Max Auto Prepare=4;Multiplexing=true;Write Coalescing Buffer Threshold Bytes=1000"
@@ -43,13 +48,13 @@ module HtmlViews =
43
48
th() { raw " message" }
44
49
}
45
50
46
- let fortunes ( fortunes : Fortune []) =
51
+ let fortunes fortunesData =
47
52
table() {
48
53
fortunesTableHeader
49
- for f in fortunes do
54
+ for fortune in fortunesData do
50
55
tr() {
51
- td() { raw <| string f .id }
52
- td() { f .message }
56
+ td() { raw <| string fortune .id }
57
+ td() { fortune .message }
53
58
}
54
59
} |> layout
55
60
@@ -67,13 +72,11 @@ module HttpHandlers =
67
72
message = " Additional fortune added at request time."
68
73
}
69
74
70
- let private renderFortunes ( ctx : HttpContext ) dbFortunes =
71
- let augmentedData = [|
72
- yield ! dbFortunes
73
- extra
74
- |]
75
- Array.Sort( augmentedData, FortuneComparer)
76
- augmentedData |> HtmlViews.fortunes |> ctx.WriteHtmlView
75
+ let rec private renderFortunes ( ctx : HttpContext ) ( dbFortunes : Fortune seq ) =
76
+ let data = dbFortunes.AsList()
77
+ data.Add extra
78
+ data.Sort FortuneComparer
79
+ data |> HtmlViews.fortunes |> ctx.WriteHtmlView
77
80
78
81
let private fortunes : EndpointHandler =
79
82
fun ctx ->
@@ -85,11 +88,10 @@ module HttpHandlers =
85
88
86
89
[<Struct>]
87
90
[<CLIMutable>]
88
- type World =
89
- {
90
- id: int
91
- randomnumber: int
92
- }
91
+ type World = {
92
+ id: int
93
+ randomnumber: int
94
+ }
93
95
94
96
let private readSingleRow ( conn : NpgsqlConnection ) =
95
97
conn.QueryFirstOrDefaultAsync< World>(
@@ -127,7 +129,7 @@ module HttpHandlers =
127
129
}
128
130
129
131
let private maxBatch = 500
130
- let mutable private queries = Array.zeroCreate ( maxBatch + 1 )
132
+ let private queries = Array.zeroCreate ( maxBatch + 1 )
131
133
132
134
let private batchUpdateString batchSize =
133
135
match queries[ batchSize] with
@@ -141,7 +143,17 @@ module HttpHandlers =
141
143
let result = sb.ToString()
142
144
queries[ batchSize] <- result
143
145
result
144
- | q -> q
146
+ | q ->
147
+ q
148
+
149
+ let private generateParameters ( results : World []) =
150
+ let parameters = Dictionary< string, obj>()
151
+ for i in 0 .. results.Length-1 do
152
+ let randomNumber = Random.Shared.Next( 1 , 10001 )
153
+ parameters[ $" @Rn_{i}" ] <- randomNumber
154
+ parameters[ $" @Id_{i}" ] <- results[ i]. id
155
+ results[ i] <- { results[ i] with randomnumber = randomNumber }
156
+ parameters
145
157
146
158
let private multipleUpdates : EndpointHandler =
147
159
fun ctx ->
@@ -153,12 +165,7 @@ module HttpHandlers =
153
165
for i in 0 .. results.Length-1 do
154
166
let! result = readSingleRow conn
155
167
results[ i] <- result
156
- let parameters = Dictionary< string, obj>()
157
- for i in 0 .. results.Length-1 do
158
- let randomNumber = Random.Shared.Next( 1 , 10001 )
159
- parameters[ $" @Rn_{i}" ] <- randomNumber
160
- parameters[ $" @Id_{i}" ] <- results[ i]. id
161
- results[ i] <- { results[ i] with randomnumber = randomNumber }
168
+ let parameters = generateParameters results
162
169
let! _ = conn.ExecuteAsync( batchUpdateString count, parameters)
163
170
return ! ctx.WriteJsonChunked results
164
171
}
@@ -177,7 +184,7 @@ module HttpHandlers =
177
184
let endpoints =
178
185
[|
179
186
route " /plaintext" <| utf8Const " Hello, World!"
180
- route " /json" <| jsonSimple {| message = " Hello, World!" | }
187
+ route " /json" <| jsonSimple { message = " Hello, World!" }
181
188
route " /fortunes" fortunes
182
189
route " /db" singleQuery
183
190
route " /queries/{count?}" multipleQueries
@@ -195,11 +202,12 @@ module Main =
195
202
let builder = WebApplication.CreateBuilder( args)
196
203
builder.Services
197
204
.AddRouting()
198
- .AddOxpecker()
199
- |> ignore
200
- builder.Logging .ClearProviders() |> ignore
205
+ .AddOxpecker() |> ignore
206
+ builder.Logging
207
+ .ClearProviders() |> ignore
201
208
let app = builder.Build()
202
- app.UseRouting()
203
- .UseOxpecker HttpHandlers.endpoints |> ignore
209
+ app
210
+ .UseRouting()
211
+ .UseOxpecker( HttpHandlers.endpoints) |> ignore
204
212
app.Run()
205
213
0
0 commit comments