30 namespace foreign_storage {
43 const std::list<Catalog_Namespace::UserMetadata>& all_users,
44 std::map<std::string, import_export::TypedImportBuffer*>& import_buffers) {
45 for (
const auto& user : all_users) {
46 if (import_buffers.find(
"user_id") != import_buffers.end()) {
47 import_buffers[
"user_id"]->addInt(user.userId);
49 if (import_buffers.find(
"user_name") != import_buffers.end()) {
50 import_buffers[
"user_name"]->addDictStringWithTruncation(user.userName);
52 if (import_buffers.find(
"is_super_user") != import_buffers.end()) {
53 import_buffers[
"is_super_user"]->addBoolean(user.isSuper);
55 if (import_buffers.find(
"default_db_id") != import_buffers.end()) {
56 import_buffers[
"default_db_id"]->addInt(user.defaultDbId);
58 if (import_buffers.find(
"default_db_name") != import_buffers.end()) {
59 if (user.defaultDbId > 0) {
60 import_buffers[
"default_db_name"]->addDictStringWithTruncation(
63 set_null(import_buffers[
"default_db_name"]);
66 if (import_buffers.find(
"can_login") != import_buffers.end()) {
67 import_buffers[
"can_login"]->addBoolean(user.can_login);
75 if (sys_catalog.getMetadataForUserById(user_id, user_metadata)) {
84 std::string table_type{
"DEFAULT"};
88 table_type =
"TEMPORARY";
90 table_type =
"FOREIGN";
98 auto ddl = catalog->dumpCreateTable(td.
tableId);
99 if (!ddl.has_value()) {
108 const std::map<int32_t, std::vector<TableDescriptor>>& tables_by_database,
109 std::map<std::string, import_export::TypedImportBuffer*>& import_buffers) {
110 for (
const auto& [db_id,
tables] : tables_by_database) {
111 for (
const auto& table :
tables) {
112 if (import_buffers.find(
"database_id") != import_buffers.end()) {
113 import_buffers[
"database_id"]->addInt(db_id);
115 if (import_buffers.find(
"database_name") != import_buffers.end()) {
116 import_buffers[
"database_name"]->addDictStringWithTruncation(
get_db_name(db_id));
118 if (import_buffers.find(
"table_id") != import_buffers.end()) {
119 import_buffers[
"table_id"]->addInt(table.tableId);
121 if (import_buffers.find(
"table_name") != import_buffers.end()) {
122 import_buffers[
"table_name"]->addDictStringWithTruncation(table.tableName);
124 if (import_buffers.find(
"owner_id") != import_buffers.end()) {
125 import_buffers[
"owner_id"]->addInt(table.userId);
127 if (import_buffers.find(
"owner_user_name") != import_buffers.end()) {
128 import_buffers[
"owner_user_name"]->addDictStringWithTruncation(
131 if (import_buffers.find(
"column_count") != import_buffers.end()) {
132 import_buffers[
"column_count"]->addInt(table.nColumns);
134 if (import_buffers.find(
"table_type") != import_buffers.end()) {
135 import_buffers[
"table_type"]->addDictStringWithTruncation(
get_table_type(table));
137 if (import_buffers.find(
"view_sql") != import_buffers.end()) {
138 import_buffers[
"view_sql"]->addDictStringWithTruncation(table.viewSQL);
140 if (import_buffers.find(
"max_fragment_size") != import_buffers.end()) {
141 import_buffers[
"max_fragment_size"]->addInt(table.maxFragRows);
143 if (import_buffers.find(
"max_chunk_size") != import_buffers.end()) {
144 import_buffers[
"max_chunk_size"]->addBigint(table.maxChunkSize);
146 if (import_buffers.find(
"fragment_page_size") != import_buffers.end()) {
147 import_buffers[
"fragment_page_size"]->addInt(table.fragPageSize);
149 if (import_buffers.find(
"max_rows") != import_buffers.end()) {
150 import_buffers[
"max_rows"]->addBigint(table.maxRows);
152 if (import_buffers.find(
"max_rollback_epochs") != import_buffers.end()) {
153 import_buffers[
"max_rollback_epochs"]->addInt(table.maxRollbackEpochs);
155 if (import_buffers.find(
"shard_count") != import_buffers.end()) {
156 import_buffers[
"shard_count"]->addInt(table.nShards);
158 if (import_buffers.find(
"ddl_statement") != import_buffers.end()) {
159 import_buffers[
"ddl_statement"]->addDictStringWithTruncation(
167 rapidjson::Document document;
168 document.Parse(dashboard_metadata);
169 if (!document.IsObject()) {
172 auto data_sources_str =
174 std::vector<std::string> data_sources;
175 if (data_sources_str.has_value()) {
176 data_sources =
split(data_sources_str.value(),
",");
177 for (
auto it = data_sources.begin(); it != data_sources.end();) {
179 static std::regex parameter_regex{
"\\$\\{.+\\}"};
180 if (std::regex_match(*it, parameter_regex)) {
182 it = data_sources.erase(it);
192 const std::map<int32_t, std::vector<DashboardDescriptor>>& dashboards_by_database,
193 std::map<std::string, import_export::TypedImportBuffer*>& import_buffers) {
194 for (
const auto& [db_id, dashboards] : dashboards_by_database) {
195 for (
const auto& dashboard : dashboards) {
196 if (import_buffers.find(
"database_id") != import_buffers.end()) {
197 import_buffers[
"database_id"]->addInt(db_id);
199 if (import_buffers.find(
"database_name") != import_buffers.end()) {
200 import_buffers[
"database_name"]->addDictStringWithTruncation(
get_db_name(db_id));
202 if (import_buffers.find(
"dashboard_id") != import_buffers.end()) {
203 import_buffers[
"dashboard_id"]->addInt(dashboard.dashboardId);
205 if (import_buffers.find(
"dashboard_name") != import_buffers.end()) {
206 import_buffers[
"dashboard_name"]->addDictStringWithTruncation(
207 dashboard.dashboardName);
209 if (import_buffers.find(
"owner_id") != import_buffers.end()) {
210 import_buffers[
"owner_id"]->addInt(dashboard.userId);
212 if (import_buffers.find(
"owner_user_name") != import_buffers.end()) {
213 import_buffers[
"owner_user_name"]->addDictStringWithTruncation(
216 if (import_buffers.find(
"last_updated_at") != import_buffers.end()) {
217 auto& buffer = import_buffers[
"last_updated_at"];
218 import_buffers[
"last_updated_at"]->add_value(
219 buffer->getColumnDesc(), dashboard.updateTime,
false, {});
221 if (import_buffers.find(
"data_sources") != import_buffers.end()) {
222 import_buffers[
"data_sources"]->addStringArray(
232 std::vector<std::string> permissions;
236 permissions.emplace_back(
"all");
239 permissions.emplace_back(
"view_sql_editor");
242 permissions.emplace_back(
"access");
247 permissions.emplace_back(
"all");
250 if (object_id == -1) {
254 permissions.emplace_back(
"select" + suffix);
257 permissions.emplace_back(
"insert" + suffix);
260 permissions.emplace_back(
"update" + suffix);
263 permissions.emplace_back(
"delete" + suffix);
266 permissions.emplace_back(
"truncate" + suffix);
269 permissions.emplace_back(
"alter" + suffix);
272 permissions.emplace_back(
"drop" + suffix);
275 permissions.emplace_back(
"create table");
280 permissions.emplace_back(
"all");
283 if (object_id == -1) {
284 suffix =
" dashboard";
287 permissions.emplace_back(
"view" + suffix);
290 permissions.emplace_back(
"edit" + suffix);
293 permissions.emplace_back(
"delete" + suffix);
296 permissions.emplace_back(
"create dashboard");
301 permissions.emplace_back(
"all");
304 if (object_id == -1) {
308 permissions.emplace_back(
"select" + suffix);
311 permissions.emplace_back(
"drop" + suffix);
314 permissions.emplace_back(
"create view");
319 permissions.emplace_back(
"all");
322 if (object_id == -1) {
326 permissions.emplace_back(
"alter" + suffix);
329 permissions.emplace_back(
"usage" + suffix);
332 permissions.emplace_back(
"drop" + suffix);
335 permissions.emplace_back(
"create server");
339 UNREACHABLE() <<
"Unexpected object type: " << object_type;
345 std::string object_type_str;
348 object_type_str =
"database";
350 object_type_str =
"table";
352 object_type_str =
"dashboard";
354 object_type_str =
"view";
356 object_type_str =
"server";
358 UNREACHABLE() <<
"Unexpected object type: " << object_type;
360 return object_type_str;
364 const std::vector<ObjectRoleDescriptor>& object_permissions,
365 std::map<std::string, import_export::TypedImportBuffer*>& import_buffers) {
366 for (
const auto& permission : object_permissions) {
367 if (import_buffers.find(
"role_name") != import_buffers.end()) {
368 import_buffers[
"role_name"]->addDictStringWithTruncation(permission.roleName);
370 if (import_buffers.find(
"is_user_role") != import_buffers.end()) {
371 import_buffers[
"is_user_role"]->addBoolean(permission.roleType);
373 if (import_buffers.find(
"database_id") != import_buffers.end()) {
374 import_buffers[
"database_id"]->addInt(permission.dbId);
376 if (import_buffers.find(
"database_name") != import_buffers.end()) {
377 import_buffers[
"database_name"]->addDictStringWithTruncation(
380 if (import_buffers.find(
"object_name") != import_buffers.end()) {
381 import_buffers[
"object_name"]->addDictStringWithTruncation(permission.objectName);
383 if (import_buffers.find(
"object_id") != import_buffers.end()) {
384 import_buffers[
"object_id"]->addInt(permission.objectId);
386 if (import_buffers.find(
"object_owner_id") != import_buffers.end()) {
387 import_buffers[
"object_owner_id"]->addInt(permission.objectOwnerId);
389 if (import_buffers.find(
"object_owner_user_name") != import_buffers.end()) {
390 import_buffers[
"object_owner_user_name"]->addDictStringWithTruncation(
393 if (import_buffers.find(
"object_permission_type") != import_buffers.end()) {
394 import_buffers[
"object_permission_type"]->addDictStringWithTruncation(
397 if (import_buffers.find(
"object_permissions") != import_buffers.end()) {
399 get_permissions(permission.privs, permission.objectType, permission.objectId);
400 import_buffers[
"object_permissions"]->addStringArray(permissions);
406 const std::list<Catalog_Namespace::DBMetadata>& databases,
407 std::map<std::string, import_export::TypedImportBuffer*>& import_buffers) {
408 for (
const auto& db : databases) {
409 if (import_buffers.find(
"database_id") != import_buffers.end()) {
410 import_buffers[
"database_id"]->addInt(db.dbId);
412 if (import_buffers.find(
"database_name") != import_buffers.end()) {
413 import_buffers[
"database_name"]->addDictStringWithTruncation(db.dbName);
415 if (import_buffers.find(
"owner_id") != import_buffers.end()) {
416 import_buffers[
"owner_id"]->addInt(db.dbOwner);
418 if (import_buffers.find(
"owner_user_name") != import_buffers.end()) {
419 import_buffers[
"owner_user_name"]->addDictStringWithTruncation(
426 const std::set<std::string>& roles,
427 std::map<std::string, import_export::TypedImportBuffer*>& import_buffers) {
428 for (
const auto& role : roles) {
429 CHECK(import_buffers.find(
"role_name") != import_buffers.end());
430 import_buffers[
"role_name"]->addDictStringWithTruncation(role);
435 const std::map<std::string, std::vector<std::string>>& user_names_by_role_,
436 std::map<std::string, import_export::TypedImportBuffer*>& import_buffers) {
437 for (
const auto& [role, user_names] : user_names_by_role_) {
438 for (
const auto& user_name : user_names) {
439 if (import_buffers.find(
"role_name") != import_buffers.end()) {
440 import_buffers[
"role_name"]->addDictStringWithTruncation(role);
442 if (import_buffers.find(
"user_name") != import_buffers.end()) {
443 import_buffers[
"user_name"]->addDictStringWithTruncation(user_name);
450 std::map<int32_t, std::vector<TableDescriptor>> tables_by_database;
452 for (
const auto& catalog : sys_catalog.getCatalogsForAllDbs()) {
454 for (
const auto& td : catalog->getAllTableMetadataCopy()) {
455 tables_by_database[catalog->getDatabaseId()].emplace_back(td);
459 return tables_by_database;
463 std::map<int32_t, std::vector<DashboardDescriptor>> dashboards_by_database;
465 for (
const auto& catalog : sys_catalog.getCatalogsForAllDbs()) {
467 for (
const auto& dashboard : catalog->getAllDashboardsMetadataForSysTable()) {
468 dashboards_by_database[catalog->getDatabaseId()].emplace_back(dashboard);
472 return dashboards_by_database;
477 const auto& users = sys_catalog.getAllUserMetadata();
478 std::map<std::string, std::vector<std::string>> user_names_by_role;
479 for (
const auto& user : users) {
480 for (
const auto& role :
481 sys_catalog.getRoles(
false, user.isSuper, user.userName,
true)) {
482 user_names_by_role[role].emplace_back(user.userName);
485 return user_names_by_role;
490 const std::string& table_name) {
516 users_ = sys_catalog.getAllUserMetadata();
534 roles_ = sys_catalog.getCreatedRoles();
549 const std::string& table_name,
550 std::map<std::string, import_export::TypedImportBuffer*>& import_buffers) {
static const AccessPrivileges VIEW_SQL_EDITOR
static const AccessPrivileges VIEW_DASHBOARD
static const AccessPrivileges DROP_SERVER
std::vector< std::string > get_data_sources(const std::string &dashboard_metadata)
static const AccessPrivileges ALL_DATABASE
static const AccessPrivileges ALTER_TABLE
std::set< std::string > roles_
std::string get_table_ddl(int32_t db_id, const TableDescriptor &td)
InternalCatalogDataWrapper()
std::vector< std::string > get_permissions(const AccessPrivileges privileges, int32_t object_type, int32_t object_id)
static const AccessPrivileges TRUNCATE_TABLE
static constexpr const char * DASHBOARDS_SYS_TABLE_NAME
constexpr const char * kDeletedValueIndicator
std::map< int32_t, std::vector< DashboardDescriptor > > get_all_dashboards()
void populate_import_buffers_for_catalog_dashboards(const std::map< int32_t, std::vector< DashboardDescriptor >> &dashboards_by_database, std::map< std::string, import_export::TypedImportBuffer * > &import_buffers)
static const AccessPrivileges INSERT_INTO_TABLE
static const AccessPrivileges CREATE_DASHBOARD
static const AccessPrivileges SERVER_USAGE
void populateChunkBuffersForTable(const std::string &table_name, std::map< std::string, import_export::TypedImportBuffer * > &import_buffers) override
const std::string kInfoSchemaDbName
bool isForeignTable() const
static const AccessPrivileges SELECT_FROM_TABLE
std::string suffix(SQLTypes type)
static const AccessPrivileges ALL_VIEW
std::vector< ObjectRoleDescriptor > object_permissions_
static const AccessPrivileges ALTER_SERVER
This file contains the class specification and related data structures for Catalog.
static constexpr const char * ROLES_SYS_TABLE_NAME
static SysCatalog & instance()
This file contains the class specification and related data structures for SysCatalog.
static const AccessPrivileges DROP_TABLE
void populate_import_buffers_for_catalog_permissions(const std::vector< ObjectRoleDescriptor > &object_permissions, std::map< std::string, import_export::TypedImportBuffer * > &import_buffers)
void populate_import_buffers_for_catalog_tables(const std::map< int32_t, std::vector< TableDescriptor >> &tables_by_database, std::map< std::string, import_export::TypedImportBuffer * > &import_buffers)
CONSTEXPR DEVICE void set_null(T &value)
std::optional< std::string > get_optional_string_value_from_object(const rapidjson::Value &object, const std::string &key)
std::list< Catalog_Namespace::UserMetadata > users_
void populate_import_buffers_for_catalog_role_assignments(const std::map< std::string, std::vector< std::string >> &user_names_by_role_, std::map< std::string, import_export::TypedImportBuffer * > &import_buffers)
static const AccessPrivileges ALL_SERVER
static const AccessPrivileges CREATE_SERVER
std::map< int32_t, std::vector< TableDescriptor > > get_all_tables()
static const AccessPrivileges DELETE_FROM_TABLE
static constexpr const char * ROLE_ASSIGNMENTS_SYS_TABLE_NAME
static const AccessPrivileges CREATE_TABLE
static constexpr const char * USERS_SYS_TABLE_NAME
static constexpr const char * DATABASES_SYS_TABLE_NAME
std::list< Catalog_Namespace::DBMetadata > databases_
std::shared_ptr< Catalog > getCatalog(const std::string &dbName)
static constexpr const char * TABLES_SYS_TABLE_NAME
const ForeignTable * foreign_table_
void populate_import_buffers_for_catalog_databases(const std::list< Catalog_Namespace::DBMetadata > &databases, std::map< std::string, import_export::TypedImportBuffer * > &import_buffers)
bool isTemporaryTable() const
static const AccessPrivileges SELECT_FROM_VIEW
static constexpr const char * PERMISSIONS_SYS_TABLE_NAME
std::map< std::string, std::vector< std::string > > get_all_role_assignments()
static const AccessPrivileges ALL_DASHBOARD
static const AccessPrivileges ACCESS
static const AccessPrivileges ALL_TABLE
void populate_import_buffers_for_catalog_users(const std::list< Catalog_Namespace::UserMetadata > &all_users, std::map< std::string, import_export::TypedImportBuffer * > &import_buffers)
std::string get_table_type(const TableDescriptor &td)
static const AccessPrivileges DROP_VIEW
static const AccessPrivileges CREATE_VIEW
std::string get_db_name(int32_t db_id)
std::string get_user_name(int32_t user_id)
const ColumnDescriptor * getColumnDesc() const
std::map< std::string, std::vector< std::string > > user_names_by_role_
static const AccessPrivileges DELETE_DASHBOARD
std::map< int32_t, std::vector< TableDescriptor > > tables_by_database_
void populate_import_buffers_for_catalog_roles(const std::set< std::string > &roles, std::map< std::string, import_export::TypedImportBuffer * > &import_buffers)
static const AccessPrivileges EDIT_DASHBOARD
static const AccessPrivileges UPDATE_IN_TABLE
bool hasPermission(int permission) const
std::map< int32_t, std::vector< DashboardDescriptor > > dashboards_by_database_
void add_value(const ColumnDescriptor *cd, const std::string_view val, const bool is_null, const CopyParams ©_params, const bool check_not_null=true)
void initializeObjectsForTable(const std::string &table_name) override
std::string get_object_type_str(int32_t object_type)