@@ -25,11 +25,12 @@ private async Task<NpgsqlConnection> CreateConnection()
25
25
await conn . OpenAsync ( ) ;
26
26
return conn ;
27
27
}
28
-
28
+
29
+ private string ? _initializeSql ;
29
30
public async Task Initialize ( )
30
31
{
31
32
await using var conn = await CreateConnection ( ) ;
32
- var sql = @$ "
33
+ _initializeSql ?? = @$ "
33
34
CREATE TABLE IF NOT EXISTS { _tablePrefix } _messages (
34
35
function_type_id VARCHAR(255),
35
36
function_instance_id VARCHAR(255),
@@ -40,42 +41,46 @@ idempotency_key VARCHAR(255),
40
41
PRIMARY KEY (function_type_id, function_instance_id, position)
41
42
);" ;
42
43
43
- var command = new NpgsqlCommand ( sql , conn ) ;
44
+ var command = new NpgsqlCommand ( _initializeSql , conn ) ;
44
45
await command . ExecuteNonQueryAsync ( ) ;
45
46
}
46
47
48
+ private string ? _dropUnderlyingTableSql ;
47
49
public async Task DropUnderlyingTable ( )
48
50
{
49
51
await using var conn = await CreateConnection ( ) ;
50
- var sql = $ "DROP TABLE IF EXISTS { _tablePrefix } _messages;";
51
- var command = new NpgsqlCommand ( sql , conn ) ;
52
+ _dropUnderlyingTableSql ?? = $ "DROP TABLE IF EXISTS { _tablePrefix } _messages;";
53
+ var command = new NpgsqlCommand ( _dropUnderlyingTableSql , conn ) ;
52
54
await command . ExecuteNonQueryAsync ( ) ;
53
55
}
54
-
56
+
57
+ private string ? _truncateTableSql ;
55
58
public async Task TruncateTable ( )
56
59
{
57
60
await using var conn = await CreateConnection ( ) ;
58
- var sql = @ $ "TRUNCATE TABLE { _tablePrefix } _messages;";
59
- var command = new NpgsqlCommand ( sql , conn ) ;
61
+ _truncateTableSql ??= $ "TRUNCATE TABLE { _tablePrefix } _messages;";
62
+ var command = new NpgsqlCommand ( _truncateTableSql , conn ) ;
60
63
await command . ExecuteNonQueryAsync ( ) ;
61
64
}
62
65
66
+ private string ? _appendMessageSql ;
67
+ private string ? _getFunctionStatusInAppendMessageSql ;
63
68
public async Task < FunctionStatus > AppendMessage ( FunctionId functionId , StoredMessage storedMessage )
64
69
{
65
70
await using var conn = await CreateConnection ( ) ;
66
71
await using var batch = new NpgsqlBatch ( conn ) ;
67
72
var ( messageJson , messageType , idempotencyKey ) = storedMessage ;
68
73
69
74
{ //append Message to message stream sql
70
- var sql = @$ "
75
+ _appendMessageSql ?? = @$ "
71
76
INSERT INTO { _tablePrefix } _messages
72
77
(function_type_id, function_instance_id, position, message_json, message_type, idempotency_key)
73
78
VALUES (
74
79
$1, $2,
75
80
(SELECT COALESCE(MAX(position), -1) + 1 FROM { _tablePrefix } _messages WHERE function_type_id = $1 AND function_instance_id = $2),
76
81
$3, $4, $5
77
82
) RETURNING position;" ;
78
- var command = new NpgsqlBatchCommand ( sql )
83
+ var command = new NpgsqlBatchCommand ( _appendMessageSql )
79
84
{
80
85
Parameters =
81
86
{
@@ -90,12 +95,12 @@ INSERT INTO {_tablePrefix}_messages
90
95
}
91
96
92
97
{ //get function status
93
- var sql = @$ "
98
+ _getFunctionStatusInAppendMessageSql ?? = @$ "
94
99
SELECT epoch, status
95
100
FROM { _tablePrefix }
96
101
WHERE function_type_id = $1 AND function_instance_id = $2;" ;
97
102
98
- var command = new NpgsqlBatchCommand ( sql )
103
+ var command = new NpgsqlBatchCommand ( _getFunctionStatusInAppendMessageSql )
99
104
{
100
105
Parameters = {
101
106
new ( ) { Value = functionId . TypeId . Value } ,
@@ -134,16 +139,17 @@ INSERT INTO {_tablePrefix}_messages
134
139
throw new ConcurrentModificationException ( functionId ) ; //row must have been deleted concurrently
135
140
}
136
141
142
+ private string ? _replaceMessageSql ;
137
143
public async Task < bool > ReplaceMessage ( FunctionId functionId , int position , StoredMessage storedMessage )
138
144
{
139
145
await using var conn = await CreateConnection ( ) ;
140
- var sql = @$ "
146
+ _replaceMessageSql ?? = @$ "
141
147
UPDATE { _tablePrefix } _messages
142
148
SET message_json = $1, message_type = $2, idempotency_key = $3
143
149
WHERE function_type_id = $4 AND function_instance_id = $5 AND position = $6" ;
144
150
145
151
var ( messageJson , messageType , idempotencyKey ) = storedMessage ;
146
- var command = new NpgsqlCommand ( sql , conn )
152
+ var command = new NpgsqlCommand ( _replaceMessageSql , conn )
147
153
{
148
154
Parameters =
149
155
{
@@ -159,39 +165,35 @@ public async Task<bool> ReplaceMessage(FunctionId functionId, int position, Stor
159
165
var affectedRows = await command . ExecuteNonQueryAsync ( ) ;
160
166
return affectedRows == 1 ;
161
167
}
162
-
168
+
169
+ private string ? _truncateFunctionSql ;
163
170
public async Task Truncate ( FunctionId functionId )
164
171
{
165
172
await using var conn = await CreateConnection ( ) ;
166
- await Truncate ( functionId , conn , transaction : null ) ;
167
- }
168
-
169
- internal async Task < int > Truncate ( FunctionId functionId , NpgsqlConnection connection , NpgsqlTransaction ? transaction )
170
- {
171
- var sql = @$ "
173
+ _truncateFunctionSql ??= @$ "
172
174
DELETE FROM { _tablePrefix } _messages
173
175
WHERE function_type_id = $1 AND function_instance_id = $2;" ;
174
- await using var command = new NpgsqlCommand ( sql , connection , transaction )
176
+ await using var command = new NpgsqlCommand ( _truncateFunctionSql , conn )
175
177
{
176
178
Parameters =
177
179
{
178
180
new ( ) { Value = functionId . TypeId . Value } ,
179
181
new ( ) { Value = functionId . InstanceId . Value }
180
182
}
181
183
} ;
182
- var affectedRows = await command . ExecuteNonQueryAsync ( ) ;
183
- return affectedRows ;
184
+ await command . ExecuteNonQueryAsync ( ) ;
184
185
}
185
-
186
+
187
+ private string ? _getMessagesSql ;
186
188
public async Task < IReadOnlyList < StoredMessage > > GetMessages ( FunctionId functionId , int skip )
187
189
{
188
190
await using var conn = await CreateConnection ( ) ;
189
- var sql = @$ "
191
+ _getMessagesSql ?? = @$ "
190
192
SELECT message_json, message_type, idempotency_key
191
193
FROM { _tablePrefix } _messages
192
194
WHERE function_type_id = $1 AND function_instance_id = $2 AND position >= $3
193
195
ORDER BY position ASC;" ;
194
- await using var command = new NpgsqlCommand ( sql , conn )
196
+ await using var command = new NpgsqlCommand ( _getMessagesSql , conn )
195
197
{
196
198
Parameters =
197
199
{
@@ -214,14 +216,15 @@ public async Task<IReadOnlyList<StoredMessage>> GetMessages(FunctionId functionI
214
216
return storedMessages ;
215
217
}
216
218
219
+ private string ? _hasMoreMessagesSql ;
217
220
public async Task < bool > HasMoreMessages ( FunctionId functionId , int skip )
218
221
{
219
222
await using var conn = await CreateConnection ( ) ;
220
- var sql = @$ "
223
+ _hasMoreMessagesSql ?? = @$ "
221
224
SELECT COALESCE(MAX(position), -1)
222
225
FROM { _tablePrefix } _messages
223
226
WHERE function_type_id = $1 AND function_instance_id = $2" ;
224
- await using var command = new NpgsqlCommand ( sql , conn )
227
+ await using var command = new NpgsqlCommand ( _hasMoreMessagesSql , conn )
225
228
{
226
229
Parameters =
227
230
{
@@ -237,14 +240,15 @@ SELECT COALESCE(MAX(position), -1)
237
240
return maxPosition + 1 > skip ;
238
241
}
239
242
243
+ private string ? _getSuspensionStatusSql ;
240
244
private async Task < FunctionStatus > GetSuspensionStatus ( FunctionId functionId )
241
245
{
242
246
await using var conn = await CreateConnection ( ) ;
243
- var sql = @$ "
247
+ _getSuspensionStatusSql ?? = @$ "
244
248
SELECT epoch, status
245
249
FROM { _tablePrefix }
246
250
WHERE function_type_id = $1 AND function_instance_id = $2;" ;
247
- await using var command = new NpgsqlCommand ( sql , conn )
251
+ await using var command = new NpgsqlCommand ( _getSuspensionStatusSql , conn )
248
252
{
249
253
Parameters = {
250
254
new ( ) { Value = functionId . TypeId . Value } ,
0 commit comments