1+ using Internal ;
2+ using Linq2db . Ydb ;
3+ using Linq2db . Ydb . Internal ;
4+ using LinqToDB ;
5+ using LinqToDB . Async ;
6+ using LinqToDB . Data ;
7+ using LinqToDB . Mapping ;
8+
9+ namespace Linq2db ;
10+
11+ public sealed class SloTableContext : SloTableContext < SloTableContext . Linq2dbClient >
12+ {
13+ protected override string Job => "Linq2db" ;
14+
15+ static SloTableContext ( )
16+ {
17+ YdbSdkRetryPolicyRegistration . UseGloballyWithIdempotence ( ) ;
18+ DataConnection . AddProviderDetector ( YdbTools . ProviderDetector ) ;
19+ }
20+
21+ public sealed class Linq2dbClient ( string connectionString )
22+ {
23+ public DataConnection Open ( )
24+ => new ( new DataOptions ( ) . UseConnectionString ( "YDB" , connectionString ) ) ;
25+ }
26+
27+ protected override Linq2dbClient CreateClient ( Config config ) => new ( config . ConnectionString ) ;
28+
29+ protected override async Task Create ( Linq2dbClient client , int operationTimeout )
30+ {
31+ await using var db = client . Open ( ) ;
32+ db . CommandTimeout = operationTimeout ;
33+
34+ await db . ExecuteAsync ( $@ "
35+ CREATE TABLE `{ SloTable . Name } ` (
36+ Guid Uuid,
37+ Id Int32,
38+ PayloadStr Text,
39+ PayloadDouble Double,
40+ PayloadTimestamp Timestamp,
41+ PRIMARY KEY (Guid, Id)
42+ )" ) ;
43+
44+ await db . ExecuteAsync ( SloTable . Options ) ;
45+ }
46+
47+ protected override async Task < int > Save ( Linq2dbClient client , SloTable sloTable , int writeTimeout )
48+ {
49+ await using var db = client . Open ( ) ;
50+ db . CommandTimeout = writeTimeout ;
51+
52+ var sql = $@ "
53+ UPSERT INTO `{ SloTable . Name } ` (Guid, Id, PayloadStr, PayloadDouble, PayloadTimestamp)
54+ VALUES (@Guid, @Id, @PayloadStr, @PayloadDouble, @PayloadTimestamp);" ;
55+
56+ var affected = await db . ExecuteAsync (
57+ sql ,
58+ new DataParameter ( "Guid" , sloTable . Guid , DataType . Guid ) ,
59+ new DataParameter ( "Id" , sloTable . Id , DataType . Int32 ) ,
60+ new DataParameter ( "PayloadStr" , sloTable . PayloadStr , DataType . NVarChar ) ,
61+ new DataParameter ( "PayloadDouble" , sloTable . PayloadDouble , DataType . Double ) ,
62+ new DataParameter ( "PayloadTimestamp" , sloTable . PayloadTimestamp , DataType . DateTime2 )
63+ ) ;
64+
65+ return affected > 0 ? affected : 1 ;
66+ }
67+
68+ protected override async Task < object ? > Select ( Linq2dbClient client , ( Guid Guid , int Id ) select , int readTimeout )
69+ {
70+ await using var db = client . Open ( ) ;
71+ db . CommandTimeout = readTimeout ;
72+
73+ var t = db . GetTable < SloRow > ( ) ;
74+
75+ var row = await t
76+ . Where ( r => r . Guid == select . Guid && r . Id == select . Id )
77+ . Select ( r => new
78+ {
79+ r . Guid ,
80+ r . Id ,
81+ r . PayloadStr ,
82+ r . PayloadDouble ,
83+ r . PayloadTimestamp
84+ } )
85+ . FirstOrDefaultAsync ( ) ;
86+
87+ return row ;
88+ }
89+
90+ protected override async Task < int > SelectCount ( Linq2dbClient client )
91+ {
92+ await using var db = client . Open ( ) ;
93+ return await db . GetTable < SloRow > ( ) . CountAsync ( ) ;
94+ }
95+
96+ [ Table ( SloTable . Name ) ]
97+ private sealed class SloRow ( Guid guid , int id , string ? payloadStr , double payloadDouble , DateTime payloadTimestamp )
98+ {
99+ [ Column ] public Guid Guid { get ; } = guid ;
100+ [ Column ] public int Id { get ; } = id ;
101+ [ Column ] public string ? PayloadStr { get ; } = payloadStr ;
102+ [ Column ] public double PayloadDouble { get ; } = payloadDouble ;
103+ [ Column ] public DateTime PayloadTimestamp { get ; } = payloadTimestamp ;
104+ }
105+ }
0 commit comments