/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.facebook.presto.hive.metastore;
import org.apache.hadoop.hive.metastore.api.Database;
import org.apache.hadoop.hive.metastore.api.Partition;
import org.apache.hadoop.hive.metastore.api.PrivilegeGrantInfo;
import org.apache.hadoop.hive.metastore.api.Table;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import static com.facebook.presto.hive.metastore.Database.DEFAULT_DATABASE_NAME;
import static org.apache.hadoop.hive.metastore.api.PrincipalType.ROLE;
import static org.apache.hadoop.hive.metastore.api.PrincipalType.USER;
public interface HiveMetastore
{
void createDatabase(Database database);
void dropDatabase(String databaseName);
void alterDatabase(String databaseName, Database database);
void createTable(Table table);
void dropTable(String databaseName, String tableName, boolean deleteData);
void alterTable(String databaseName, String tableName, Table table);
List<String> getAllDatabases();
Optional<List<String>> getAllTables(String databaseName);
Optional<List<String>> getAllViews(String databaseName);
Optional<Database> getDatabase(String databaseName);
/**
* Adds partitions to the table in a single atomic task. The implementation
* must either add all partitions and return normally, or add no partitions and
* throw an exception.
*/
void addPartitions(String databaseName, String tableName, List<Partition> partitions);
void dropPartition(String databaseName, String tableName, List<String> parts, boolean deleteData);
void alterPartition(String databaseName, String tableName, Partition partition);
Optional<List<String>> getPartitionNames(String databaseName, String tableName);
Optional<List<String>> getPartitionNamesByParts(String databaseName, String tableName, List<String> parts);
Optional<Partition> getPartition(String databaseName, String tableName, List<String> partitionValues);
List<Partition> getPartitionsByNames(String databaseName, String tableName, List<String> partitionNames);
Optional<Table> getTable(String databaseName, String tableName);
Set<String> getRoles(String user);
Set<HivePrivilegeInfo> getDatabasePrivileges(String user, String databaseName);
Set<HivePrivilegeInfo> getTablePrivileges(String user, String databaseName, String tableName);
void grantTablePrivileges(String databaseName, String tableName, String grantee, Set<PrivilegeGrantInfo> privilegeGrantInfoSet);
void revokeTablePrivileges(String databaseName, String tableName, String grantee, Set<PrivilegeGrantInfo> privilegeGrantInfoSet);
default boolean isDatabaseOwner(String user, String databaseName)
{
// all users are "owners" of the default database
if (DEFAULT_DATABASE_NAME.equalsIgnoreCase(databaseName)) {
return true;
}
Optional<Database> databaseMetadata = getDatabase(databaseName);
if (!databaseMetadata.isPresent()) {
return false;
}
Database database = databaseMetadata.get();
// a database can be owned by a user or role
if (database.getOwnerType() == USER && user.equals(database.getOwnerName())) {
return true;
}
if (database.getOwnerType() == ROLE && getRoles(user).contains(database.getOwnerName())) {
return true;
}
return false;
}
default boolean isTableOwner(String user, String databaseName, String tableName)
{
// a table can only be owned by a user
Optional<Table> table = getTable(databaseName, tableName);
return table.isPresent() && user.equals(table.get().getOwner());
}
}