1
1
use std:: sync:: Arc ;
2
2
3
+ use serde:: { Deserialize , Serialize } ;
3
4
use sqlite:: { Connection , Value } ;
4
5
5
6
use async_trait:: async_trait;
6
7
7
8
use mithril_common:: {
8
- entities:: { Beacon , SignedEntityType , Snapshot } ,
9
+ entities:: { SignedEntity , SignedEntityType , SignedEntityTypeDiscriminants , Snapshot } ,
10
+ signable_builder:: Artifact ,
9
11
sqlite:: {
10
12
EntityCursor , HydrationError , Projection , Provider , SourceAlias , SqLiteEntity ,
11
13
WhereCondition ,
12
14
} ,
13
- store:: adapter:: { AdapterError , StoreAdapter } ,
15
+ store:: adapter:: AdapterError ,
14
16
StdResult ,
15
17
} ;
16
18
@@ -42,6 +44,7 @@ pub struct SignedEntityRecord {
42
44
impl From < Snapshot > for SignedEntityRecord {
43
45
fn from ( other : Snapshot ) -> Self {
44
46
let entity = serde_json:: to_string ( & other) . unwrap ( ) ;
47
+
45
48
SignedEntityRecord {
46
49
signed_entity_id : other. digest ,
47
50
signed_entity_type : SignedEntityType :: CardanoImmutableFilesFull ( other. beacon ) ,
@@ -58,6 +61,25 @@ impl From<SignedEntityRecord> for Snapshot {
58
61
}
59
62
}
60
63
64
+ impl < T > TryFrom < SignedEntityRecord > for SignedEntity < T >
65
+ where
66
+ for < ' a > T : Artifact + Serialize + Deserialize < ' a > ,
67
+ {
68
+ type Error = serde_json:: error:: Error ;
69
+
70
+ fn try_from ( other : SignedEntityRecord ) -> Result < SignedEntity < T > , Self :: Error > {
71
+ let signed_entity = SignedEntity {
72
+ signed_entity_id : other. signed_entity_id ,
73
+ signed_entity_type : other. signed_entity_type ,
74
+ created_at : other. created_at ,
75
+ certificate_id : other. certificate_id ,
76
+ artifact : serde_json:: from_str :: < T > ( & other. artifact ) ?,
77
+ } ;
78
+
79
+ Ok ( signed_entity)
80
+ }
81
+ }
82
+
61
83
impl SqLiteEntity for SignedEntityRecord {
62
84
fn hydrate ( row : sqlite:: Row ) -> Result < Self , HydrationError >
63
85
where
@@ -127,17 +149,17 @@ impl<'client> SignedEntityRecordProvider<'client> {
127
149
128
150
fn condition_by_signed_entity_id (
129
151
& self ,
130
- signed_entity_id : String ,
152
+ signed_entity_id : & str ,
131
153
) -> Result < WhereCondition , StdError > {
132
154
Ok ( WhereCondition :: new (
133
155
"signed_entity_id = ?*" ,
134
- vec ! [ Value :: String ( signed_entity_id) ] ,
156
+ vec ! [ Value :: String ( signed_entity_id. to_owned ( ) ) ] ,
135
157
) )
136
158
}
137
159
138
160
fn condition_by_signed_entity_type (
139
161
& self ,
140
- signed_entity_type : SignedEntityType ,
162
+ signed_entity_type : & SignedEntityTypeDiscriminants ,
141
163
) -> Result < WhereCondition , StdError > {
142
164
let signed_entity_type_id: i64 = signed_entity_type. index ( ) as i64 ;
143
165
@@ -150,7 +172,7 @@ impl<'client> SignedEntityRecordProvider<'client> {
150
172
/// Get SignedEntityRecords for a given signed_entity id.
151
173
pub fn get_by_signed_entity_id (
152
174
& self ,
153
- signed_entity_id : String ,
175
+ signed_entity_id : & str ,
154
176
) -> Result < EntityCursor < SignedEntityRecord > , StdError > {
155
177
let filters = self . condition_by_signed_entity_id ( signed_entity_id) ?;
156
178
let signed_entity_record = self . find ( filters) ?;
@@ -161,7 +183,7 @@ impl<'client> SignedEntityRecordProvider<'client> {
161
183
/// Get SignedEntityRecords for a given signed entity type.
162
184
pub fn get_by_signed_entity_type (
163
185
& self ,
164
- signed_entity_type : SignedEntityType ,
186
+ signed_entity_type : & SignedEntityTypeDiscriminants ,
165
187
) -> Result < EntityCursor < SignedEntityRecord > , StdError > {
166
188
let filters = self . condition_by_signed_entity_type ( signed_entity_type) ?;
167
189
let signed_entity_record = self . find ( filters) ?;
@@ -262,13 +284,13 @@ pub trait SignedEntityStorer: Sync + Send {
262
284
/// Get signed entity type
263
285
async fn get_signed_entity (
264
286
& self ,
265
- signed_entity_id : String ,
287
+ signed_entity_id : & str ,
266
288
) -> StdResult < Option < SignedEntityRecord > > ;
267
289
268
290
/// Get last signed entities by signed entity type
269
291
async fn get_last_signed_entities_by_type (
270
292
& self ,
271
- signed_entity_type : & SignedEntityType ,
293
+ signed_entity_type_id : & SignedEntityTypeDiscriminants ,
272
294
total : usize ,
273
295
) -> StdResult < Vec < SignedEntityRecord > > ;
274
296
}
@@ -297,7 +319,7 @@ impl SignedEntityStorer for SignedEntityStoreAdapter {
297
319
298
320
async fn get_signed_entity (
299
321
& self ,
300
- signed_entity_id : String ,
322
+ signed_entity_id : & str ,
301
323
) -> StdResult < Option < SignedEntityRecord > > {
302
324
let connection = & * self . connection . lock ( ) . await ;
303
325
let provider = SignedEntityRecordProvider :: new ( connection) ;
@@ -311,92 +333,20 @@ impl SignedEntityStorer for SignedEntityStoreAdapter {
311
333
312
334
async fn get_last_signed_entities_by_type (
313
335
& self ,
314
- signed_entity_type : & SignedEntityType ,
336
+ signed_entity_type_id : & SignedEntityTypeDiscriminants ,
315
337
total : usize ,
316
338
) -> StdResult < Vec < SignedEntityRecord > > {
317
339
let connection = & * self . connection . lock ( ) . await ;
318
340
let provider = SignedEntityRecordProvider :: new ( connection) ;
319
341
let cursor = provider
320
- . get_by_signed_entity_type ( signed_entity_type . to_owned ( ) )
342
+ . get_by_signed_entity_type ( signed_entity_type_id )
321
343
. map_err ( |e| AdapterError :: GeneralError ( format ! ( "{e}" ) ) ) ?;
322
344
let signed_entities: Vec < SignedEntityRecord > = cursor. take ( total) . collect ( ) ;
323
345
324
346
Ok ( signed_entities)
325
347
}
326
348
}
327
349
328
- // TODO: this StoreAdapter implementation is temporary and concerns only the snapshots for the CardanoImmutableFilesFull signed entity type
329
- #[ async_trait]
330
- impl StoreAdapter for SignedEntityStoreAdapter {
331
- type Key = String ;
332
- type Record = Snapshot ;
333
-
334
- async fn store_record (
335
- & mut self ,
336
- _key : & Self :: Key ,
337
- record : & Self :: Record ,
338
- ) -> Result < ( ) , AdapterError > {
339
- let connection = & * self . connection . lock ( ) . await ;
340
- let provider = InsertSignedEntityRecordProvider :: new ( connection) ;
341
- let _signed_entity_record = provider
342
- . persist ( record. to_owned ( ) . into ( ) )
343
- . map_err ( |e| AdapterError :: GeneralError ( format ! ( "{e}" ) ) ) ?;
344
-
345
- Ok ( ( ) )
346
- }
347
-
348
- async fn get_record ( & self , key : & Self :: Key ) -> Result < Option < Self :: Record > , AdapterError > {
349
- let connection = & * self . connection . lock ( ) . await ;
350
- let provider = SignedEntityRecordProvider :: new ( connection) ;
351
- let mut cursor = provider
352
- . get_by_signed_entity_id ( key. to_string ( ) )
353
- . map_err ( |e| AdapterError :: GeneralError ( format ! ( "{e}" ) ) ) ?;
354
- let signed_entity = cursor
355
- . next ( )
356
- . filter ( |record| {
357
- matches ! (
358
- record. signed_entity_type,
359
- SignedEntityType :: CardanoImmutableFilesFull ( _)
360
- )
361
- } )
362
- . map ( |record| record. into ( ) ) ;
363
-
364
- Ok ( signed_entity)
365
- }
366
-
367
- async fn record_exists ( & self , key : & Self :: Key ) -> Result < bool , AdapterError > {
368
- Ok ( self . get_record ( key) . await ?. is_some ( ) )
369
- }
370
-
371
- async fn get_last_n_records (
372
- & self ,
373
- how_many : usize ,
374
- ) -> Result < Vec < ( Self :: Key , Self :: Record ) > , AdapterError > {
375
- Ok ( self
376
- . get_iter ( )
377
- . await ?
378
- . take ( how_many)
379
- . map ( |se| ( se. digest . to_owned ( ) , se) )
380
- . collect ( ) )
381
- }
382
-
383
- async fn remove ( & mut self , _key : & Self :: Key ) -> Result < Option < Self :: Record > , AdapterError > {
384
- unimplemented ! ( )
385
- }
386
-
387
- async fn get_iter ( & self ) -> Result < Box < dyn Iterator < Item = Self :: Record > + ' _ > , AdapterError > {
388
- let connection = & * self . connection . lock ( ) . await ;
389
- let provider = SignedEntityRecordProvider :: new ( connection) ;
390
- let cursor = provider
391
- . get_by_signed_entity_type ( SignedEntityType :: CardanoImmutableFilesFull (
392
- Beacon :: default ( ) ,
393
- ) )
394
- . map_err ( |e| AdapterError :: GeneralError ( format ! ( "{e}" ) ) ) ?;
395
- let signed_entities: Vec < Snapshot > = cursor. map ( |se| se. into ( ) ) . collect ( ) ;
396
- Ok ( Box :: new ( signed_entities. into_iter ( ) ) )
397
- }
398
- }
399
-
400
350
#[ cfg( test) ]
401
351
mod tests {
402
352
use mithril_common:: { entities:: Beacon , test_utils:: fake_data} ;
@@ -509,23 +459,22 @@ mod tests {
509
459
let connection = Connection :: open ( ":memory:" ) . unwrap ( ) ;
510
460
let provider = SignedEntityRecordProvider :: new ( & connection) ;
511
461
let condition = provider
512
- . condition_by_signed_entity_type ( SignedEntityType :: dummy ( ) )
462
+ . condition_by_signed_entity_type (
463
+ & SignedEntityTypeDiscriminants :: CardanoImmutableFilesFull ,
464
+ )
513
465
. unwrap ( ) ;
514
466
let ( filter, values) = condition. expand ( ) ;
515
467
516
468
assert_eq ! ( "signed_entity_type_id = ?1" . to_string( ) , filter) ;
517
- assert_eq ! (
518
- vec![ Value :: Integer ( SignedEntityType :: dummy( ) . index( ) as i64 ) ] ,
519
- values
520
- ) ;
469
+ assert_eq ! ( vec![ Value :: Integer ( 2 ) ] , values) ;
521
470
}
522
471
523
472
#[ test]
524
473
fn get_signed_entity_record_by_signed_entity_id ( ) {
525
474
let connection = Connection :: open ( ":memory:" ) . unwrap ( ) ;
526
475
let provider = SignedEntityRecordProvider :: new ( & connection) ;
527
476
let condition = provider
528
- . condition_by_signed_entity_id ( "signed-ent-123" . to_string ( ) )
477
+ . condition_by_signed_entity_id ( "signed-ent-123" )
529
478
. unwrap ( ) ;
530
479
let ( filter, values) = condition. expand ( ) ;
531
480
@@ -576,15 +525,13 @@ mod tests {
576
525
577
526
let first_signed_entity_type = signed_entity_records. first ( ) . unwrap ( ) . to_owned ( ) ;
578
527
let signed_entity_records: Vec < SignedEntityRecord > = provider
579
- . get_by_signed_entity_id ( first_signed_entity_type. clone ( ) . signed_entity_id )
528
+ . get_by_signed_entity_id ( & first_signed_entity_type. signed_entity_id )
580
529
. unwrap ( )
581
530
. collect ( ) ;
582
531
assert_eq ! ( vec![ first_signed_entity_type] , signed_entity_records) ;
583
532
584
533
let signed_entity_records: Vec < SignedEntityRecord > = provider
585
- . get_by_signed_entity_type ( SignedEntityType :: CardanoImmutableFilesFull (
586
- Beacon :: default ( ) ,
587
- ) )
534
+ . get_by_signed_entity_type ( & SignedEntityTypeDiscriminants :: CardanoImmutableFilesFull )
588
535
. unwrap ( )
589
536
. collect ( ) ;
590
537
let expected_signed_entity_records: Vec < SignedEntityRecord > = signed_entity_records
@@ -618,51 +565,4 @@ mod tests {
618
565
assert_eq ! ( signed_entity_record, signed_entity_record_saved) ;
619
566
}
620
567
}
621
-
622
- #[ tokio:: test]
623
- async fn test_store_adapter ( ) {
624
- let signed_entity_records = fake_signed_entity_records ( 5 ) ;
625
-
626
- let connection = Connection :: open ( ":memory:" ) . unwrap ( ) ;
627
- setup_signed_entity_db ( & connection, Vec :: new ( ) ) . unwrap ( ) ;
628
-
629
- let mut signed_entity_store_adapter =
630
- SignedEntityStoreAdapter :: new ( Arc :: new ( Mutex :: new ( connection) ) ) ;
631
-
632
- for signed_entity_record in & signed_entity_records {
633
- assert ! ( signed_entity_store_adapter
634
- . store_record(
635
- & signed_entity_record. signed_entity_id,
636
- & signed_entity_record. to_owned( ) . into( )
637
- )
638
- . await
639
- . is_ok( ) ) ;
640
- }
641
-
642
- for signed_entity_record in & signed_entity_records {
643
- assert ! ( signed_entity_store_adapter
644
- . record_exists( & signed_entity_record. signed_entity_id)
645
- . await
646
- . unwrap( ) ) ;
647
- assert_eq ! (
648
- Some ( signed_entity_record. to_owned( ) . into( ) ) ,
649
- signed_entity_store_adapter
650
- . get_record( & signed_entity_record. signed_entity_id)
651
- . await
652
- . unwrap( )
653
- ) ;
654
- }
655
-
656
- assert_eq ! (
657
- signed_entity_records,
658
- signed_entity_store_adapter
659
- . get_last_n_records( signed_entity_records. len( ) )
660
- . await
661
- . unwrap( )
662
- . into_iter( )
663
- . map( |( _k, v) | v. into( ) )
664
- . rev( )
665
- . collect:: <Vec <SignedEntityRecord >>( )
666
- )
667
- }
668
568
}
0 commit comments