@@ -10,6 +10,7 @@ use crate::authz::ApiResource;
10
10
use crate :: db;
11
11
use crate :: db:: collection_insert:: AsyncInsertError ;
12
12
use crate :: db:: collection_insert:: DatastoreCollection ;
13
+ use crate :: db:: column_walker:: AllColumnsOf ;
13
14
use crate :: db:: datastore:: InstanceStateComputer ;
14
15
use crate :: db:: datastore:: OpContext ;
15
16
use crate :: db:: error:: ErrorHandler ;
@@ -27,15 +28,15 @@ use crate::db::model::Name;
27
28
use crate :: db:: model:: Project ;
28
29
use crate :: db:: model:: VmmState ;
29
30
use crate :: db:: model:: VmmStateEnum ;
30
- use crate :: db:: pagination:: paginated;
31
- use crate :: db:: raw_query_builder:: QueryBuilder ;
31
+ use crate :: db:: pagination:: RawPaginator ;
32
32
use crate :: transaction_retry:: OptionalError ;
33
33
use async_bb8_diesel:: AsyncRunQueryDsl ;
34
34
use chrono:: Utc ;
35
+ use diesel:: helper_types:: AsSelect ;
36
+ use diesel:: pg:: Pg ;
35
37
use diesel:: prelude:: * ;
36
38
use omicron_common:: api:: external;
37
39
use omicron_common:: api:: external:: CreateResult ;
38
- use omicron_common:: api:: external:: DataPageParams ;
39
40
use omicron_common:: api:: external:: DeleteResult ;
40
41
use omicron_common:: api:: external:: Error ;
41
42
use omicron_common:: api:: external:: ListResultVec ;
@@ -47,7 +48,6 @@ use omicron_uuid_kinds::AffinityGroupUuid;
47
48
use omicron_uuid_kinds:: AntiAffinityGroupUuid ;
48
49
use omicron_uuid_kinds:: GenericUuid ;
49
50
use omicron_uuid_kinds:: InstanceUuid ;
50
- use ref_cast:: RefCast ;
51
51
use uuid:: Uuid ;
52
52
53
53
impl DataStore {
@@ -61,22 +61,21 @@ impl DataStore {
61
61
62
62
opctx. authorize ( authz:: Action :: ListChildren , authz_project) . await ?;
63
63
64
- match pagparams {
65
- PaginatedBy :: Id ( pagparams) => {
66
- paginated ( dsl:: affinity_group, dsl:: id, & pagparams)
67
- }
68
- PaginatedBy :: Name ( pagparams) => paginated (
69
- dsl:: affinity_group,
70
- dsl:: name,
71
- & pagparams. map_name ( |n| Name :: ref_cast ( n) ) ,
72
- ) ,
73
- }
74
- . filter ( dsl:: project_id. eq ( authz_project. id ( ) ) )
75
- . filter ( dsl:: time_deleted. is_null ( ) )
76
- . select ( AffinityGroup :: as_select ( ) )
77
- . get_results_async ( & * self . pool_connection_authorized ( opctx) . await ?)
78
- . await
79
- . map_err ( |e| public_error_from_diesel ( e, ErrorHandler :: Server ) )
64
+ let mut paginator = RawPaginator :: new ( ) ;
65
+ paginator
66
+ . source ( )
67
+ . sql ( "SELECT " )
68
+ . sql ( AllColumnsOf :: < dsl:: affinity_group > :: as_str ( ) )
69
+ . sql ( " FROM affinity_group WHERE project_id = " )
70
+ . param ( )
71
+ . bind :: < diesel:: sql_types:: Uuid , _ > ( authz_project. id ( ) )
72
+ . sql ( " AND time_deleted IS NULL" ) ;
73
+ paginator
74
+ . paginate_by_id_or_name ( pagparams)
75
+ . query :: < AsSelect < AffinityGroup , Pg > > ( )
76
+ . get_results_async ( & * self . pool_connection_authorized ( opctx) . await ?)
77
+ . await
78
+ . map_err ( |e| public_error_from_diesel ( e, ErrorHandler :: Server ) )
80
79
}
81
80
82
81
pub async fn anti_affinity_group_list (
@@ -89,22 +88,21 @@ impl DataStore {
89
88
90
89
opctx. authorize ( authz:: Action :: ListChildren , authz_project) . await ?;
91
90
92
- match pagparams {
93
- PaginatedBy :: Id ( pagparams) => {
94
- paginated ( dsl:: anti_affinity_group, dsl:: id, & pagparams)
95
- }
96
- PaginatedBy :: Name ( pagparams) => paginated (
97
- dsl:: anti_affinity_group,
98
- dsl:: name,
99
- & pagparams. map_name ( |n| Name :: ref_cast ( n) ) ,
100
- ) ,
101
- }
102
- . filter ( dsl:: project_id. eq ( authz_project. id ( ) ) )
103
- . filter ( dsl:: time_deleted. is_null ( ) )
104
- . select ( AntiAffinityGroup :: as_select ( ) )
105
- . get_results_async ( & * self . pool_connection_authorized ( opctx) . await ?)
106
- . await
107
- . map_err ( |e| public_error_from_diesel ( e, ErrorHandler :: Server ) )
91
+ let mut paginator = RawPaginator :: new ( ) ;
92
+ paginator
93
+ . source ( )
94
+ . sql ( "SELECT " )
95
+ . sql ( AllColumnsOf :: < dsl:: anti_affinity_group > :: as_str ( ) )
96
+ . sql ( " FROM anti_affinity_group WHERE project_id = " )
97
+ . param ( )
98
+ . bind :: < diesel:: sql_types:: Uuid , _ > ( authz_project. id ( ) )
99
+ . sql ( " AND time_deleted IS NULL" ) ;
100
+ paginator
101
+ . paginate_by_id_or_name ( pagparams)
102
+ . query :: < AsSelect < AntiAffinityGroup , Pg > > ( )
103
+ . get_results_async ( & * self . pool_connection_authorized ( opctx) . await ?)
104
+ . await
105
+ . map_err ( |e| public_error_from_diesel ( e, ErrorHandler :: Server ) )
108
106
}
109
107
110
108
pub async fn affinity_group_create (
@@ -352,11 +350,13 @@ impl DataStore {
352
350
) -> ListResultVec < external:: AffinityGroupMember > {
353
351
opctx. authorize ( authz:: Action :: Read , authz_affinity_group) . await ?;
354
352
355
- let mut query = QueryBuilder :: new ( )
353
+ let mut paginator = RawPaginator :: new ( ) ;
354
+ paginator
355
+ . source ( )
356
356
. sql (
357
357
"
358
- SELECT * FROM (
359
- SELECT instance.id as id,
358
+ SELECT
359
+ instance.id as id,
360
360
instance.name as name,
361
361
instance.state,
362
362
instance.migration_id,
@@ -372,56 +372,8 @@ impl DataStore {
372
372
group_id = " ,
373
373
)
374
374
. param ( )
375
- . bind :: < diesel:: sql_types:: Uuid , _ > ( authz_affinity_group. id ( ) )
376
- . sql ( ") " ) ;
377
-
378
- let ( direction, limit) = match pagparams {
379
- PaginatedBy :: Id ( p) => ( p. direction , p. limit ) ,
380
- PaginatedBy :: Name ( p) => ( p. direction , p. limit ) ,
381
- } ;
382
- let asc = match direction {
383
- dropshot:: PaginationOrder :: Ascending => true ,
384
- dropshot:: PaginationOrder :: Descending => false ,
385
- } ;
386
-
387
- match pagparams {
388
- PaginatedBy :: Id ( DataPageParams { marker, .. } ) => {
389
- if let Some ( id) = marker {
390
- query = query
391
- . sql ( "WHERE id " )
392
- . sql ( if asc { ">" } else { "<" } )
393
- . sql ( " " )
394
- . param ( )
395
- . bind :: < diesel:: sql_types:: Uuid , _ > ( * * id) ;
396
- } ;
397
- query = query. sql ( " ORDER BY id " ) ;
398
- }
399
- PaginatedBy :: Name ( DataPageParams { marker, .. } ) => {
400
- if let Some ( name) = marker {
401
- query = query
402
- . sql ( "WHERE name " )
403
- . sql ( if asc { ">" } else { "<" } )
404
- . sql ( " " )
405
- . param ( )
406
- . bind :: < diesel:: sql_types:: Text , _ > ( Name (
407
- ( * name) . clone ( ) ,
408
- ) ) ;
409
- } ;
410
- query = query. sql ( " ORDER BY name " ) ;
411
- }
412
- }
413
- if asc {
414
- query = query. sql ( "ASC " ) ;
415
- } else {
416
- query = query. sql ( "DESC " ) ;
417
- }
418
-
419
- query = query
420
- . sql ( " LIMIT " )
421
- . param ( )
422
- . bind :: < diesel:: sql_types:: BigInt , _ > ( i64:: from ( limit. get ( ) ) ) ;
423
-
424
- query
375
+ . bind :: < diesel:: sql_types:: Uuid , _ > ( authz_affinity_group. id ( ) ) ;
376
+ paginator. paginate_by_id_or_name ( pagparams)
425
377
. query :: < (
426
378
diesel:: sql_types:: Uuid ,
427
379
diesel:: sql_types:: Text ,
@@ -457,77 +409,28 @@ impl DataStore {
457
409
) -> ListResultVec < external:: AntiAffinityGroupMember > {
458
410
opctx. authorize ( authz:: Action :: Read , authz_anti_affinity_group) . await ?;
459
411
460
- let ( direction, limit) = match pagparams {
461
- PaginatedBy :: Id ( p) => ( p. direction , p. limit ) ,
462
- PaginatedBy :: Name ( p) => ( p. direction , p. limit ) ,
463
- } ;
464
- let asc = match direction {
465
- dropshot:: PaginationOrder :: Ascending => true ,
466
- dropshot:: PaginationOrder :: Descending => false ,
467
- } ;
468
-
469
- let mut query = QueryBuilder :: new ( )
470
- . sql (
471
- "SELECT id,name,instance_state,migration_id,vmm_state
472
- FROM (
473
- SELECT
474
- instance.id as id,
475
- instance.name as name,
476
- instance.state as instance_state,
477
- instance.migration_id as migration_id,
478
- vmm.state as vmm_state
479
- FROM anti_affinity_group_instance_membership
480
- INNER JOIN instance
481
- ON instance.id = anti_affinity_group_instance_membership.instance_id
482
- LEFT JOIN vmm
483
- ON instance.active_propolis_id = vmm.id
484
- WHERE
485
- instance.time_deleted IS NULL AND
486
- vmm.time_deleted IS NULL AND
487
- group_id = " ,
412
+ let mut paginator = RawPaginator :: new ( ) ;
413
+ paginator. source ( )
414
+ . sql ( "
415
+ SELECT
416
+ instance.id as id,
417
+ instance.name as name,
418
+ instance.state as instance_state,
419
+ instance.migration_id as migration_id,
420
+ vmm.state as vmm_state
421
+ FROM anti_affinity_group_instance_membership
422
+ INNER JOIN instance
423
+ ON instance.id = anti_affinity_group_instance_membership.instance_id
424
+ LEFT JOIN vmm
425
+ ON instance.active_propolis_id = vmm.id
426
+ WHERE
427
+ instance.time_deleted IS NULL AND
428
+ vmm.time_deleted IS NULL AND
429
+ group_id = " ,
488
430
)
489
431
. param ( )
490
- . bind :: < diesel:: sql_types:: Uuid , _ > ( authz_anti_affinity_group. id ( ) )
491
- . sql ( ") " ) ;
492
-
493
- match pagparams {
494
- PaginatedBy :: Id ( DataPageParams { marker, .. } ) => {
495
- if let Some ( id) = marker {
496
- query = query
497
- . sql ( "WHERE id " )
498
- . sql ( if asc { ">" } else { "<" } )
499
- . sql ( " " )
500
- . param ( )
501
- . bind :: < diesel:: sql_types:: Uuid , _ > ( * * id) ;
502
- } ;
503
- query = query. sql ( " ORDER BY id " ) ;
504
- }
505
- PaginatedBy :: Name ( DataPageParams { marker, .. } ) => {
506
- if let Some ( name) = marker {
507
- query = query
508
- . sql ( "WHERE name " )
509
- . sql ( if asc { ">" } else { "<" } )
510
- . sql ( " " )
511
- . param ( )
512
- . bind :: < diesel:: sql_types:: Text , _ > ( Name (
513
- ( * name) . clone ( ) ,
514
- ) ) ;
515
- } ;
516
- query = query. sql ( " ORDER BY name " ) ;
517
- }
518
- }
519
- if asc {
520
- query = query. sql ( "ASC " ) ;
521
- } else {
522
- query = query. sql ( "DESC " ) ;
523
- }
524
-
525
- query = query
526
- . sql ( " LIMIT " )
527
- . param ( )
528
- . bind :: < diesel:: sql_types:: BigInt , _ > ( i64:: from ( limit. get ( ) ) ) ;
529
-
530
- query
432
+ . bind :: < diesel:: sql_types:: Uuid , _ > ( authz_anti_affinity_group. id ( ) ) ;
433
+ paginator. paginate_by_id_or_name ( pagparams)
531
434
. query :: < (
532
435
diesel:: sql_types:: Uuid ,
533
436
diesel:: sql_types:: Text ,
0 commit comments