@@ -51,6 +51,7 @@ use databend_common_meta_app::schema::CreateVirtualColumnReq;
51
51
use databend_common_meta_app:: schema:: DatabaseIdent ;
52
52
use databend_common_meta_app:: schema:: DatabaseInfo ;
53
53
use databend_common_meta_app:: schema:: DatabaseMeta ;
54
+ use databend_common_meta_app:: schema:: DatabaseType ;
54
55
use databend_common_meta_app:: schema:: DeleteLockRevReq ;
55
56
use databend_common_meta_app:: schema:: DropDatabaseReply ;
56
57
use databend_common_meta_app:: schema:: DropDatabaseReq ;
@@ -165,6 +166,8 @@ pub struct ShareCatalog {
165
166
info : Arc < CatalogInfo > ,
166
167
167
168
option : ShareCatalogOption ,
169
+
170
+ client : ShareEndpointClient ,
168
171
}
169
172
170
173
impl Debug for ShareCatalog {
@@ -190,8 +193,14 @@ impl ShareCatalog {
190
193
} ,
191
194
disable_table_info_refresh : false ,
192
195
} ;
196
+ let client = ShareEndpointClient :: new ( ) ;
193
197
194
- Ok ( Self { info, option, ctx } )
198
+ Ok ( Self {
199
+ info,
200
+ option,
201
+ ctx,
202
+ client,
203
+ } )
195
204
}
196
205
197
206
async fn get_share_spec ( & self ) -> Result < ShareSpec > {
@@ -219,8 +228,8 @@ impl ShareCatalog {
219
228
220
229
// 2. check if ShareSpec exists using share endpoint
221
230
let share_endpoint_meta = & reply. share_endpoint_meta_vec [ 0 ] . 1 ;
222
- let client = ShareEndpointClient :: new ( ) ;
223
- let share_spec = client
231
+ let share_spec = self
232
+ . client
224
233
. get_share_spec_by_name ( share_endpoint_meta, tenant, provider, share_name)
225
234
. await ?;
226
235
@@ -390,72 +399,112 @@ impl Catalog for ShareCatalog {
390
399
db_name : & str ,
391
400
table_name : & str ,
392
401
) -> Result < Arc < dyn Table > > {
393
- let share_spec = self . get_share_spec ( ) . await ?;
394
- if let Some ( use_database) = & share_spec. use_database {
395
- if use_database. name == db_name {
396
- let db_info = self . generate_share_database_info ( use_database) ;
397
- let db = ShareDatabase :: try_create ( self . ctx . clone ( ) , db_info) ?;
398
- db. get_table ( table_name) . await
399
- } else {
400
- Err ( ErrorCode :: UnknownDatabase ( format ! (
401
- "cannot find database {} from share {}" ,
402
- db_name, self . option. share_name,
403
- ) ) )
404
- }
402
+ let share_option = & self . option ;
403
+ let share_name = & share_option. share_name ;
404
+ let share_endpoint = & share_option. share_endpoint ;
405
+ let provider = & share_option. provider ;
406
+ let tenant = & self . info . name_ident . tenant ;
407
+
408
+ // 1. get share endpoint
409
+ let meta_api = UserApiProvider :: instance ( ) . get_meta_store_client ( ) ;
410
+ let req = GetShareEndpointReq {
411
+ tenant : Tenant {
412
+ tenant : tenant. to_owned ( ) ,
413
+ } ,
414
+ endpoint : Some ( share_endpoint. clone ( ) ) ,
415
+ } ;
416
+ let reply = meta_api. get_share_endpoint ( req) . await ?;
417
+ if reply. share_endpoint_meta_vec . is_empty ( ) {
418
+ return Err ( ErrorCode :: UnknownShareEndpoint ( format ! (
419
+ "UnknownShareEndpoint {:?}" ,
420
+ share_endpoint
421
+ ) ) ) ;
422
+ }
423
+
424
+ // 2. check if ShareSpec exists using share endpoint
425
+ let share_endpoint_meta = reply. share_endpoint_meta_vec [ 0 ] . 1 . clone ( ) ;
426
+ let mut table_info = self
427
+ . client
428
+ . get_share_table (
429
+ & share_endpoint_meta,
430
+ tenant,
431
+ provider,
432
+ share_name,
433
+ db_name,
434
+ table_name,
435
+ )
436
+ . await ?;
437
+
438
+ let db_type = table_info. db_type . clone ( ) ;
439
+ if let DatabaseType :: ShareDB ( params) = db_type {
440
+ let mut params = params;
441
+ params. share_endpoint_url = share_endpoint_meta. url . clone ( ) ;
442
+ params. share_endpoint_credential = share_endpoint_meta. credential . clone ( ) . unwrap ( ) ;
443
+ table_info. db_type = DatabaseType :: ShareDB ( params) ;
444
+
445
+ self . ctx . storage_factory . get_table ( & table_info)
405
446
} else {
406
- Err ( ErrorCode :: ShareHasNoGrantedDatabase ( format ! (
407
- "share {}.{} has no granted database" ,
408
- self . option. provider, self . option. share_name,
409
- ) ) )
447
+ unreachable ! ( )
410
448
}
411
449
}
412
450
413
451
#[ async_backtrace:: framed]
414
452
async fn list_tables ( & self , _tenant : & Tenant , db_name : & str ) -> Result < Vec < Arc < dyn Table > > > {
415
- let share_spec = self . get_share_spec ( ) . await ?;
416
- if let Some ( use_database) = & share_spec. use_database {
417
- if use_database. name == db_name {
418
- let db_info = self . generate_share_database_info ( use_database) ;
419
- let db = ShareDatabase :: try_create ( self . ctx . clone ( ) , db_info) ?;
420
- db. list_tables ( ) . await
453
+ let share_option = & self . option ;
454
+ let share_name = & share_option. share_name ;
455
+ let share_endpoint = & share_option. share_endpoint ;
456
+ let provider = & share_option. provider ;
457
+ let tenant = & self . info . name_ident . tenant ;
458
+
459
+ // 1. get share endpoint
460
+ let meta_api = UserApiProvider :: instance ( ) . get_meta_store_client ( ) ;
461
+ let req = GetShareEndpointReq {
462
+ tenant : Tenant {
463
+ tenant : tenant. to_owned ( ) ,
464
+ } ,
465
+ endpoint : Some ( share_endpoint. clone ( ) ) ,
466
+ } ;
467
+ let reply = meta_api. get_share_endpoint ( req) . await ?;
468
+ if reply. share_endpoint_meta_vec . is_empty ( ) {
469
+ return Err ( ErrorCode :: UnknownShareEndpoint ( format ! (
470
+ "UnknownShareEndpoint {:?}" ,
471
+ share_endpoint
472
+ ) ) ) ;
473
+ }
474
+
475
+ // 2. check if ShareSpec exists using share endpoint
476
+ let share_endpoint_meta = reply. share_endpoint_meta_vec [ 0 ] . 1 . clone ( ) ;
477
+ let table_info_map = self
478
+ . client
479
+ . get_share_tables ( & share_endpoint_meta, tenant, provider, share_name, db_name)
480
+ . await ?;
481
+
482
+ let mut table_info_vec = vec ! [ ] ;
483
+ for info in table_info_map. values ( ) {
484
+ let mut table_info = info. clone ( ) ;
485
+ if let DatabaseType :: ShareDB ( params) = & table_info. db_type {
486
+ let mut params = params. clone ( ) ;
487
+ params. share_endpoint_url = share_endpoint_meta. url . clone ( ) ;
488
+ params. share_endpoint_credential = share_endpoint_meta. credential . clone ( ) . unwrap ( ) ;
489
+ table_info. db_type = DatabaseType :: ShareDB ( params) ;
490
+
491
+ table_info_vec. push ( self . ctx . storage_factory . get_table ( & table_info) ?) ;
421
492
} else {
422
- Err ( ErrorCode :: UnknownDatabase ( format ! (
423
- "cannot find database {} from share {}" ,
424
- db_name, self . option. share_name,
425
- ) ) )
493
+ unreachable ! ( )
426
494
}
427
- } else {
428
- Err ( ErrorCode :: ShareHasNoGrantedDatabase ( format ! (
429
- "share {}.{} has no granted database" ,
430
- self . option. provider, self . option. share_name,
431
- ) ) )
432
495
}
496
+ Ok ( table_info_vec)
433
497
}
434
498
435
499
#[ async_backtrace:: framed]
436
500
async fn list_tables_history (
437
501
& self ,
438
502
_tenant : & Tenant ,
439
- db_name : & str ,
503
+ _db_name : & str ,
440
504
) -> Result < Vec < Arc < dyn Table > > > {
441
- let share_spec = self . get_share_spec ( ) . await ?;
442
- if let Some ( use_database) = & share_spec. use_database {
443
- if use_database. name == db_name {
444
- let db_info = self . generate_share_database_info ( use_database) ;
445
- let db = ShareDatabase :: try_create ( self . ctx . clone ( ) , db_info) ?;
446
- db. list_tables_history ( ) . await
447
- } else {
448
- Err ( ErrorCode :: UnknownDatabase ( format ! (
449
- "cannot find database {} from share {}" ,
450
- db_name, self . option. share_name,
451
- ) ) )
452
- }
453
- } else {
454
- Err ( ErrorCode :: ShareHasNoGrantedDatabase ( format ! (
455
- "share {}.{} has no granted database" ,
456
- self . option. provider, self . option. share_name,
457
- ) ) )
458
- }
505
+ Err ( ErrorCode :: PermissionDenied (
506
+ "Permission denied, cannot list table history from a shared database" . to_string ( ) ,
507
+ ) )
459
508
}
460
509
461
510
#[ async_backtrace:: framed]
0 commit comments