| 107 | } |
| 108 | |
| 109 | fn schema(&self, name: &str) -> Option<Arc<dyn SchemaProvider>> { |
| 110 | let catalog = Arc::clone(&self.catalog); |
| 111 | let dynamic_options = Arc::clone(&self.dynamic_options); |
| 112 | let name = name.to_string(); |
| 113 | |
| 114 | let temp_provider = { |
| 115 | let databases = self.temp_tables.read().unwrap_or_else(|e| e.into_inner()); |
| 116 | databases.get(&name).cloned() |
| 117 | }; |
| 118 | |
| 119 | block_on_with_runtime( |
| 120 | async move { |
| 121 | match catalog.get_database(&name).await { |
| 122 | Ok(_) => Some(Arc::new(PaimonSchemaProvider::new( |
| 123 | Arc::clone(&catalog), |
| 124 | name, |
| 125 | dynamic_options, |
| 126 | temp_provider, |
| 127 | )) as Arc<dyn SchemaProvider>), |
| 128 | Err(paimon::Error::DatabaseNotExist { .. }) => { |
| 129 | if temp_provider.is_some() { |
| 130 | Some(Arc::new(PaimonSchemaProvider::new( |
| 131 | Arc::clone(&catalog), |
| 132 | name, |
| 133 | dynamic_options, |
| 134 | temp_provider, |
| 135 | )) as Arc<dyn SchemaProvider>) |
| 136 | } else { |
| 137 | None |
| 138 | } |
| 139 | } |
| 140 | Err(e) => { |
| 141 | log::error!("failed to get database '{}': {e}", name); |
| 142 | None |
| 143 | } |
| 144 | } |
| 145 | }, |
| 146 | "paimon catalog access thread panicked", |
| 147 | ) |
| 148 | } |
| 149 | |
| 150 | fn register_schema( |
| 151 | &self, |