Example usage for java.sql Connection rollback

List of usage examples for java.sql Connection rollback

Introduction

In this page you can find the example usage for java.sql Connection rollback.

Prototype

void rollback() throws SQLException;

Source Link

Document

Undoes all changes made in the current transaction and releases any database locks currently held by this Connection object.

Usage

From source file:org.apache.hadoop.hive.metastore.MyXid.java

public void renameTableNoDistributeTrans(String dbName, String tblName, String modifyUser, String newName)
        throws InvalidOperationException, MetaException {
    if (!MetaStoreUtils.validateName(newName)) {
        throw new InvalidOperationException(newName + " is not a valid object name");
    }//  w  ww .  j  av a  2  s .  c  om

    if (tblName.equals(newName)) {
        return;
    }

    dbName = dbName.toLowerCase();
    tblName = tblName.toLowerCase();
    modifyUser = modifyUser.toLowerCase();
    newName = newName.toLowerCase();

    Connection con = null;
    PreparedStatement ps = null;
    String newLocation = null;
    String oldLocation = null;
    String serdeLib = null;
    String tblType = null;
    boolean isMoved = false;
    Path newPath = null;
    Path oldPath = null;
    FileSystem oldFs = null;
    FileSystem newFs = null;
    boolean success = false;

    try {
        con = getSegmentConnection(dbName);
    } catch (MetaStoreConnectException e1) {
        LOG.error("rename table error, db=" + dbName + ", tbl=" + tblName + ", newName=" + newName + ", msg="
                + e1.getMessage());
        throw new MetaException(e1.getMessage());
    } catch (SQLException e1) {
        LOG.error("rename table error, db=" + dbName + ", tbl=" + tblName + ", newName=" + newName + ", msg="
                + e1.getMessage());
        throw new MetaException(e1.getMessage());
    }

    try {
        con.setAutoCommit(false);
        con.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);

        ps = con.prepareStatement(
                "select tbl_id, tbl_type, tbl_location, serde_lib from TBLS where db_name=? and tbl_name=?");
        ps.setString(1, dbName);
        ps.setString(2, tblName);

        boolean isTblFind = false;
        long tblID = 0;
        ResultSet tblSet = ps.executeQuery();

        while (tblSet.next()) {
            isTblFind = true;
            tblID = tblSet.getLong(1);
            tblType = tblSet.getString(2);
            oldLocation = tblSet.getString(3);
            serdeLib = tblSet.getString(4);
            break;
        }
        tblSet.close();
        ps.close();

        if (!isTblFind) {
            throw new MetaException("can not find table " + dbName + ":" + tblName);
        }

        if (!tblType.equalsIgnoreCase("MANAGED_TABLE")) {
            throw new MetaException("only manage table can rename ");
        }

        if (serdeLib.equals(ProtobufSerDe.class.getName())) {
            throw new MetaException(
                    "Renaming table is not supported for protobuf table. SerDe may be incompatible");
        }

        Map<String, String> tblParamMap = new HashMap<String, String>();
        ps = con.prepareStatement(
                "select param_key, param_value from table_params where tbl_id=? and param_type='TBL'");
        ps.setLong(1, tblID);
        ResultSet paramSet = ps.executeQuery();
        while (paramSet.next()) {
            tblParamMap.put(paramSet.getString(1), paramSet.getString(2));
        }
        paramSet.close();
        ps.close();
        boolean containTime = false;
        boolean contailUser = false;
        if (tblParamMap.containsKey("last_modified_time"))
            containTime = true;
        if (tblParamMap.containsKey("last_modified_by"))
            contailUser = true;

        if (containTime && contailUser) {
            ps = con.prepareStatement(
                    "update table_params set param_value=? where tbl_id=? and param_type='TBL' and param_key=?");
            ps.setString(1, String.valueOf(System.currentTimeMillis() / 1000));
            ps.setLong(2, tblID);
            ps.setString(3, "last_modified_time");
            ps.addBatch();
            ps.setString(1, modifyUser);
            ps.setLong(2, tblID);
            ps.setString(3, "last_modified_by");
            ps.addBatch();

            ps.executeBatch();
            ps.close();
        } else if (!containTime && !contailUser) {
            ps = con.prepareStatement("insert into table_params(tbl_id, param_type, param_key, param_value) "
                    + " values(?,?,?,?)");
            ps.setLong(1, tblID);
            ps.setString(2, "TBL");
            ps.setString(3, "last_modified_time");
            ps.setString(4, String.valueOf(System.currentTimeMillis() / 1000));
            ps.addBatch();

            ps.setLong(1, tblID);
            ps.setString(2, "TBL");
            ps.setString(3, "last_modified_by");
            ps.setString(4, modifyUser);

            ps.addBatch();

            ps.executeBatch();
            ps.close();
        } else if (containTime && !contailUser) {
            ps = con.prepareStatement(
                    "update table_params set param_value=? where tbl_id=? and param_type='TBL' and param_key=?");
            ps.setString(1, String.valueOf(System.currentTimeMillis() / 1000));
            ps.setLong(2, tblID);
            ps.setString(3, "last_modified_time");
            ps.addBatch();

            ps.executeBatch();
            ps.close();

            ps = con.prepareStatement("insert into table_params(tbl_id, param_type, param_key, param_value) "
                    + " values(?,?,?,?)");

            ps.setLong(1, tblID);
            ps.setString(2, "TBL");
            ps.setString(3, "last_modified_by");
            ps.setString(4, modifyUser);

            ps.addBatch();

            ps.executeBatch();
            ps.close();
        } else {
            ps = con.prepareStatement(
                    "update table_params set param_value=? where tbl_id=? and param_type='TBL' and param_key=?");

            ps.setString(1, modifyUser);
            ps.setLong(2, tblID);
            ps.setString(3, "last_modified_by");
            ps.addBatch();

            ps.executeBatch();
            ps.close();

            ps = con.prepareStatement("insert into table_params(tbl_id, param_type, param_key, param_value) "
                    + " values(?,?,?,?)");
            ps.setLong(1, tblID);
            ps.setString(2, "TBL");
            ps.setString(3, "last_modified_time");
            ps.setString(4, String.valueOf(System.currentTimeMillis() / 1000));
            ps.addBatch();

            ps.executeBatch();
            ps.close();
        }

        Warehouse wh = new Warehouse(hiveConf);
        //      newLocation = wh.getDefaultTablePath(dbName, newName).toString();
        newLocation = oldLocation.substring(0, oldLocation.length() - tblName.length()) + newName;

        ps = con.prepareStatement("update tbls set tbl_name=?, tbl_location=? where tbl_id=?");
        ps.setString(1, newName.toLowerCase());
        ps.setString(2, newLocation);
        ps.setLong(3, tblID);

        ps.executeUpdate();
        ps.close();

        oldPath = new Path(oldLocation);
        oldFs = wh.getFs(oldPath);
        newPath = new Path(newLocation);
        newFs = wh.getFs(newPath);

        if (oldFs != newFs) {
            throw new InvalidOperationException(
                    "table new location " + oldFs + " is on a different file system than the old location "
                            + newFs + ". This operation is not supported");
        }

        try {
            oldFs.exists(oldPath);
            if (newFs.exists(newPath)) {
                throw new InvalidOperationException("New location for this table " + dbName + "." + tblName
                        + " already exists : " + newPath);
            }

        } catch (IOException e) {

            throw new InvalidOperationException(
                    "Unable to access new location " + newPath + " for table " + dbName + "." + tblName);
        }

        try {
            if (oldFs.exists(oldPath)) {
                oldFs.rename(oldPath, newPath);
            }
            isMoved = true;
        } catch (IOException e) {
            throw new InvalidOperationException(
                    "Unable to access old location " + oldPath + " for table " + dbName + "." + tblName);

        }

        if (isMoved) {
            try {
                if (oldFs.exists(oldPath)) {
                    oldFs.rename(newPath, oldPath);
                }

            } catch (IOException e) {
                throw new InvalidOperationException(
                        "Unable to access old location " + oldPath + " for table " + dbName + "." + tblName);

            }
        }

        con.commit();
        success = true;
    } catch (SQLException ex) {
        throw new MetaException(ex.getMessage());
    } finally {
        if (!success) {
            try {
                con.rollback();
            } catch (SQLException e) {
            }

            //if (isMoved) {
            //  try {
            //    if (oldFs.exists(oldPath)) {
            //      oldFs.rename(newPath, oldPath);
            //    }

            //  } catch (IOException e) {
            //    throw new InvalidOperationException(
            //        "Unable to access old location " + oldPath + " for table "
            //            + dbName + "." + tblName);

            //  }
            //}
        }

        closeStatement(ps);
        closeConnection(con);
    }

    success = false;
    Statement stmt = null;
    try {
        con = getGlobalConnection();
    } catch (MetaStoreConnectException e1) {
        LOG.error("rename table error, db=" + dbName + ", tbl=" + tblName + ", msg=" + e1.getMessage());
        throw new MetaException(e1.getMessage());
    } catch (SQLException e1) {
        LOG.error("rename table error, db=" + dbName + ", tbl=" + tblName + ", msg=" + e1.getMessage());
        throw new MetaException(e1.getMessage());
    }

    try {
        con.setAutoCommit(false);
        con.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
        stmt = con.createStatement();

        String sql = "update tblpriv set tbl_name='" + newName + "' where db_name='" + dbName
                + "' and tbl_name='" + tblName + "'";

        stmt.executeUpdate(sql);

        try {
            sql = "update tblsensitivity set tbl_name='" + newName + "' where db_name='" + dbName
                    + "' and tbl_name='" + tblName + "'";

            stmt.executeUpdate(sql);
        } catch (Exception x) {

        }

        con.commit();
        success = true;
    } catch (SQLException x) {
        LOG.error("rename table error, db=" + dbName + ", tbl=" + tblName + ", msg=" + x.getMessage());
        throw new MetaException(x.getMessage());
    } finally {
        if (!success) {
            try {
                con.rollback();
            } catch (SQLException e) {
            }
        }

        closeStatement(stmt);
        closeConnection(con);
    }

    return;
}

From source file:org.apache.hadoop.hive.metastore.MyXid.java

@Override
public void dropDefaultPartition(String dbName, String tblName, int level)
        throws InvalidObjectException, MetaException {
    Connection con = null;
    Statement ps = null;/* w w w.  j a v  a  2  s . c o  m*/
    boolean success = false;

    dbName = dbName.toLowerCase();
    tblName = tblName.toLowerCase();

    ArrayList<Path> pathToDel = null;
    Warehouse wh = new Warehouse(hiveConf);

    try {
        con = getSegmentConnection(dbName);
    } catch (MetaStoreConnectException e1) {
        LOG.error("drop default partition error, db=" + dbName + ", tbl=" + tblName + ", level=" + level
                + ", msg=" + e1.getMessage());
        throw new MetaException(e1.getMessage());
    } catch (SQLException e1) {
        LOG.error("drop default partition error, db=" + dbName + ", tbl=" + tblName + ", level=" + level
                + ", msg=" + e1.getMessage());
        throw new MetaException(e1.getMessage());
    }

    try {
        con.setAutoCommit(false);
        con.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
        ps = con.createStatement();

        String tblType = null;
        boolean hasPriPart = false;
        boolean hasSubPart = false;
        String priPartType = null;
        String subPartType = null;

        long tblID = 0;
        ResultSet tblSet = null;
        boolean isTblFind = false;

        String tblFormat = null;
        String tblLocation = null;

        ResultSet partSet = null;

        String sql = null;

        HiveConf hconf = (HiveConf) hiveConf;
        boolean externalPartition = hconf.getBoolVar(HiveConf.ConfVars.HIVESUPPORTEXTERNALPARTITION);

        if (level == 0) {
            sql = "SELECT tbl_id, tbl_type, pri_part_type, tbl_format, tbl_location"
                    + " from TBLS where db_name='" + dbName + "' and tbl_name='" + tblName + "'";

            tblSet = ps.executeQuery(sql);
            isTblFind = false;

            while (tblSet.next()) {
                isTblFind = true;
                tblID = tblSet.getLong(1);
                tblType = tblSet.getString(2);
                priPartType = tblSet.getString(3);
                tblFormat = tblSet.getString(4);
                tblLocation = tblSet.getString(5);

                if (priPartType != null && !priPartType.isEmpty()) {
                    hasPriPart = true;
                }
                break;
            }

            tblSet.close();

            if (!isTblFind) {
                throw new MetaException("can not find table " + dbName + ":" + tblName);
            }

            if (!tblType.equalsIgnoreCase("MANAGED_TABLE")) {
                if (tblType.equalsIgnoreCase("EXTERNAL_TABLE") && tblFormat != null
                        && tblFormat.equalsIgnoreCase("pgdata")) {
                    LOG.error("drop default partition error, db=" + dbName + ", tbl=" + tblName + ", level="
                            + level + ", msg=" + tblType + ":" + tblFormat
                            + " can not support alter partition");
                    throw new MetaException(tblType + ":" + tblFormat + " can not support alter partition");
                }
                if (externalPartition && tblType.equalsIgnoreCase("EXTERNAL_TABLE")
                        && (tblFormat == null || !tblFormat.equalsIgnoreCase("pgdata"))) {
                } else {
                    throw new MetaException(tblType + " can not support alter partition");
                }
            }

            if (!hasPriPart) {
                throw new MetaException("table " + dbName + ":" + tblName + " is not pri-partitioned");
            }

            sql = "delete from partitions where tbl_id=" + tblID
                    + " and part_name='default' and level=0 returning 'default'";
            ResultSet ret = ps.executeQuery(sql);
            while (ret.next()) {
                pathToDel = new ArrayList<Path>();
                if (!tblType.equalsIgnoreCase("EXTERNAL_TABLE")) {
                    if (tblLocation == null || tblLocation.trim().isEmpty()) {
                        pathToDel.add(wh.getPartitionPath(dbName, tblName, "default"));
                    } else {
                        pathToDel.add(Warehouse.getPartitionPath(new Path(tblLocation), "default"));
                    }
                } else {
                    //pathToDel.add(Warehouse.getPartitionPath(new Path(tblLocation), "default"));
                }
                break;
            }
            ret.close();

            //ps.executeUpdate(sql);
            //pathToDel = new ArrayList<Path>();

            //pathToDel.add(wh.getPartitionPath(dbName, tblName, "default"));
        } else if (level == 1) {
            sql = "SELECT tbl_id, tbl_type, sub_part_type, tbl_format, tbl_location"
                    + " from TBLS where db_name='" + dbName + "' and tbl_name='" + tblName + "'";

            tblSet = ps.executeQuery(sql);
            isTblFind = false;

            while (tblSet.next()) {
                isTblFind = true;
                tblID = tblSet.getLong(1);
                tblType = tblSet.getString(2);
                subPartType = tblSet.getString(3);
                tblFormat = tblSet.getString(4);
                tblLocation = tblSet.getString(5);

                if (subPartType != null && !subPartType.isEmpty()) {
                    hasSubPart = true;
                }
                break;
            }

            tblSet.close();

            if (!isTblFind) {
                throw new MetaException("can not find table " + dbName + ":" + tblName);
            }

            if (!tblType.equalsIgnoreCase("MANAGED_TABLE")) {
                if (tblType.equalsIgnoreCase("EXTERNAL_TABLE") && tblFormat != null
                        && tblFormat.equalsIgnoreCase("pgdata")) {
                    LOG.error("drop default partition error, db=" + dbName + ", tbl=" + tblName + ", level="
                            + level + ", msg=" + tblType + ":" + tblFormat
                            + " can not support alter partition");
                    throw new MetaException(tblType + ":" + tblFormat + " can not support alter partition");
                }
                if (externalPartition && tblType.equalsIgnoreCase("EXTERNAL_TABLE")
                        && (tblFormat == null || !tblFormat.equalsIgnoreCase("pgdata"))) {
                } else {
                    throw new MetaException(tblType + "can not support alter partition");
                }
            }

            if (!hasSubPart) {
                throw new MetaException("table " + dbName + ":" + tblName + " is not sub-partitioned");
            }

            Set<String> priPartNameSet = new TreeSet<String>();

            sql = "SELECT level, part_name from PARTITIONS where" + " tbl_id=" + tblID
                    + " and level=0 order by level asc";

            partSet = ps.executeQuery(sql);
            int partLevel = 0;

            while (partSet.next()) {
                partLevel = partSet.getInt(1);
                if (partLevel == 0) {
                    String partName = partSet.getString(2);
                    priPartNameSet.add(partName);
                }
            }

            partSet.close();

            sql = "delete from partitions where tbl_id=" + tblID
                    + " and part_name='default' and level=1 return 'default'";

            ResultSet ret = ps.executeQuery(sql);
            while (ret.next()) {
                pathToDel = new ArrayList<Path>();
                if (!tblType.equalsIgnoreCase("EXTERNAL_TABLE")) {
                    if (tblLocation == null || tblLocation.trim().isEmpty()) {
                        pathToDel.addAll(wh.getSubPartitionPaths(dbName, tblName, priPartNameSet, "default"));
                    } else {
                        pathToDel.addAll(Warehouse.getSubPartitionPaths(new Path(tblLocation), priPartNameSet,
                                "default"));
                    }
                } else {
                    //pathToDel.addAll(Warehouse.getSubPartitionPaths(new Path(tblLocation),
                    //        priPartNameSet, "default"));
                }
                break;
            }
            ret.close();

            //ps.executeUpdate(sql);

            //pathToDel = new ArrayList<Path>();
            //pathToDel.addAll(wh.getSubPartitionPaths(dbName, tblName,
            //    priPartNameSet, "default"));
        }

        if (pathToDel != null && !pathToDel.isEmpty()) {
            for (Path path : pathToDel) {
                wh.deleteDirThrowExp(path, true);
            }
        }

        con.commit();
        success = true;
    } catch (SQLException ex) {
        ex.printStackTrace();
        LOG.error("drop partition error, db=" + dbName + ", tbl=" + tblName + ", level=" + level + ", msg="
                + ex.getMessage());
        throw new MetaException(ex.getMessage());
    } finally {
        if (!success) {
            try {
                con.rollback();
            } catch (SQLException e) {
            }
        }

        closeStatement(ps);
        closeConnection(con);
    }

    //if (success) {
    //  for (Path path : pathToDel) {
    //    wh.deleteDir(path, true);
    //  }
    //} else {
    //  return;
    //}
}

From source file:org.apache.hadoop.hive.metastore.MyXid.java

public void jdbcCreateView(Table tbl) throws AlreadyExistsException, InvalidObjectException, MetaException {
    LOG.debug("first, check the name is valid or not");
    if (!MetaStoreUtils.validateName(tbl.getTableName())
            || !MetaStoreUtils.validateColNames(tbl.getSd().getCols())
            || (tbl.getPriPartition() != null
                    && !MetaStoreUtils.validateName(tbl.getPriPartition().getParKey().getName()))
            || (tbl.getSubPartition() != null
                    && !MetaStoreUtils.validateName(tbl.getSubPartition().getParKey().getName()))) {
        LOG.error("create view error db=" + tbl.getDbName() + ", view=" + tbl.getTableName());
        throw new InvalidObjectException(tbl.getTableName() + " is not a valid object name");
    }//from  www .  j  av a2  s .com

    boolean success = false;

    Connection con;
    PreparedStatement ps = null;
    tbl.setDbName(tbl.getDbName().toLowerCase());
    tbl.setTableName(tbl.getTableName().toLowerCase());

    long tblID = genTblID(tbl.getDbName(), tbl.getTableName());

    try {
        con = getSegmentConnection(tbl.getDbName());
    } catch (MetaStoreConnectException e1) {
        LOG.error("create view error db=" + tbl.getDbName() + ", view=" + tbl.getTableName() + ",msg="
                + e1.getMessage());
        throw new MetaException(e1.getMessage());
    } catch (SQLException e1) {
        LOG.error("create view error db=" + tbl.getDbName() + ", view=" + tbl.getTableName() + ",msg="
                + e1.getMessage());
        throw new MetaException(e1.getMessage());
    }

    try {
        con.setAutoCommit(false);
        con.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);

        ps = con.prepareStatement("select tbl_id, tbl_type from TBLS where db_name=? and tbl_name=?");
        ps.setString(1, tbl.getDbName());
        ps.setString(2, tbl.getTableName());

        boolean isViewFind = false;
        String tblType = null;

        ResultSet tblSet = ps.executeQuery();

        while (tblSet.next()) {
            isViewFind = true;
            tblID = tblSet.getLong(1);
            tblType = tblSet.getString(2);
            break;
        }

        tblSet.close();
        ps.close();

        if (isViewFind && !tbl.isIsReplaceOnExit()) {
            LOG.error("view " + tbl.getDbName() + ":" + tbl.getTableName() + " has exist");
            throw new AlreadyExistsException(
                    "view " + tbl.getDbName() + ":" + tbl.getTableName() + " has exist");
        }

        if (isViewFind && tbl.isIsReplaceOnExit()) {
            if (tblType != null && !tblType.equalsIgnoreCase("VIRTUAL_VIEW")) {
                LOG.error("name conflict " + tbl.getDbName() + ":" + tbl.getTableName()
                        + " already exist, and it is not a view");
                throw new MetaException("name conflict " + tbl.getDbName() + ":" + tbl.getTableName()
                        + " already exist, and it is not a view");
            }

            ps = con.prepareStatement("update TBLS  set tbl_comment=? where tbl_id=? ");
            ps.setString(1, tbl.getParameters().get("comment"));
            ps.setLong(2, tblID);

            ps.executeUpdate();
            ps.close();

            ps = con.prepareStatement("update tdwview  set view_original_text=?, view_expanded_text=?, "
                    + "vtables=? where tbl_id=? ");

            ps.setString(1, tbl.getViewOriginalText());
            ps.setString(2, tbl.getViewExpandedText());
            ps.setString(3, tbl.getVtables().toLowerCase());
            ps.setLong(4, tblID);
            ps.executeUpdate();
            ps.close();

            ps = con.prepareStatement("delete from COLUMNS where tbl_id=?");
            ps.setLong(1, tblID);
            ps.executeUpdate();
            ps.close();

            ps = con.prepareStatement("insert into COLUMNS(column_index, tbl_id, column_name, "
                    + "type_name, comment) values(?,?,?,?,?)");

            List<FieldSchema> fieldSchemas = tbl.getSd().getCols();
            int size = fieldSchemas.size();

            for (int i = 0; i < size; i++) {
                ps.setLong(1, i);
                ps.setLong(2, tblID);
                ps.setString(3, fieldSchemas.get(i).getName().toLowerCase());
                ps.setString(4, fieldSchemas.get(i).getType());
                ps.setString(5, fieldSchemas.get(i).getComment());
                ps.addBatch();
            }
            ps.executeBatch();
            ps.close();

            Map<String, String> tblPram = new HashMap<String, String>();
            ps = con.prepareStatement(
                    "select param_key, param_value from TABLE_PARAMS where tbl_id=? and param_type='TBL'");
            ps.setLong(1, tblID);

            ResultSet paramSet = ps.executeQuery();
            while (paramSet.next()) {
                tblPram.put(paramSet.getString(1), paramSet.getString(2));
            }
            paramSet.close();
            ps.close();

            ps = con.prepareStatement("delete from TABLE_PARAMS where tbl_id=? and param_type='TBL'");
            ps.setLong(1, tblID);
            ps.executeUpdate();
            ps.close();

            tblPram.putAll(tbl.getParameters());

            ps = con.prepareStatement(
                    "insert into TABLE_PARAMS(tbl_id, param_type, param_key, param_value) values(?,?,?,?)");

            for (Entry<String, String> entry : tblPram.entrySet()) {
                ps.setLong(1, tblID);
                ps.setString(2, "TBL");
                ps.setString(3, entry.getKey());
                ps.setString(4, entry.getValue());
                ps.addBatch();
            }
            ps.executeBatch();
            ps.close();

            con.commit();
            success = true;
        } else {
            ps = con.prepareStatement("INSERT INTO TBLS(tbl_id, retention, tbl_type, db_name, "
                    + "tbl_name, tbl_owner, tbl_comment)" + " values(?,?,?,?,?,?,?)");

            StorageDescriptor sd = tbl.getSd();
            if (sd == null || sd.getSerdeInfo() == null) {
                throw new MetaException("storage descriptor of table " + tbl.getTableName() + " is null");
            }
            ps.setLong(1, tblID);
            ps.setLong(2, tbl.getRetention());
            ps.setString(3, tbl.getTableType());
            ps.setString(4, tbl.getDbName());
            ps.setString(5, tbl.getTableName());
            ps.setString(6, tbl.getOwner().toLowerCase());
            ps.setString(7, tbl.getParameters().get("comment"));

            ps.executeUpdate();
            ps.close();

            ps = con.prepareStatement(
                    "INSERT INTO COLUMNS(column_index, tbl_id, column_name, type_name, comment) "
                            + " values(?,?,?,?,?)");

            List<FieldSchema> fieldList = sd.getCols();
            int fieldSize = fieldList.size();

            for (int i = 0; i < fieldSize; i++) {
                FieldSchema field = fieldList.get(i);
                ps.setInt(1, i);
                ps.setLong(2, tblID);
                ps.setString(3, field.getName());
                ps.setString(4, field.getType());
                ps.setString(5, field.getComment());

                ps.addBatch();
            }

            ps.executeBatch();
            ps.close();

            if (tbl.getParametersSize() > 0 || sd.getParametersSize() > 0
                    || sd.getSerdeInfo().getParametersSize() > 0) {
                ps = con.prepareStatement(
                        "insert into table_params(tbl_id, param_type, param_key, param_value) "
                                + " values(?,?,?,?)");
                if (tbl.getParametersSize() > 0) {
                    for (Map.Entry<String, String> entry : tbl.getParameters().entrySet()) {
                        if (entry.getKey().equalsIgnoreCase("type")
                                || entry.getKey().equalsIgnoreCase("comment"))
                            break;
                        ps.setLong(1, tblID);
                        ps.setString(2, "TBL");
                        ps.setString(3, entry.getKey());
                        ps.setString(4, entry.getValue());

                        ps.addBatch();
                    }
                }

                if (sd.getParametersSize() > 0) {
                    for (Map.Entry<String, String> entry : sd.getParameters().entrySet()) {
                        ps.setLong(1, tblID);
                        ps.setString(2, "SD");
                        ps.setString(3, entry.getKey());
                        ps.setString(4, entry.getValue());

                        ps.addBatch();
                    }
                }

                if (sd.getSerdeInfo().getParametersSize() > 0) {
                    for (Map.Entry<String, String> entry : sd.getSerdeInfo().getParameters().entrySet()) {
                        ps.setLong(1, tblID);
                        ps.setString(2, "SERDE");
                        ps.setString(3, entry.getKey());
                        ps.setString(4, entry.getValue());

                        ps.addBatch();
                    }
                }

                ps.executeBatch();
                ps.close();
            }

            ps = con.prepareStatement(
                    "insert into tdwview(tbl_id, view_original_text, view_expanded_text, vtables) values(?,?,?,?)");
            ps.setLong(1, tblID);
            ps.setString(2, tbl.getViewOriginalText());
            ps.setString(3, tbl.getViewExpandedText());
            ps.setString(4, tbl.getVtables().toLowerCase());
            ps.executeUpdate();
            ps.close();

            con.commit();
            success = true;
        }
    } catch (SQLException sqlex) {
        sqlex.printStackTrace();
        LOG.error("create view error db=" + tbl.getDbName() + ", view=" + tbl.getTableName() + ", msg="
                + sqlex.getMessage());
        throw new MetaException(sqlex.getMessage());
    } finally {
        if (!success) {
            try {
                con.rollback();
            } catch (SQLException e) {
            }
        }

        closeStatement(ps);
        closeConnection(con);
    }

    return;
}

From source file:org.apache.hadoop.hive.metastore.MyXid.java

@Override
public void addCols(String dbName, String tblName, String modifyUser, List<FieldSchema> newCols)
        throws InvalidOperationException, MetaException, InvalidObjectException {
    if (!MetaStoreUtils.validateColNames(newCols)) {
        throw new InvalidObjectException("new add columns name is not valid object");
    }//from   ww w.ja  v a  2 s. c o m

    Connection con = null;
    PreparedStatement ps = null;
    boolean success = false;

    dbName = dbName.toLowerCase();
    tblName = tblName.toLowerCase();

    try {
        con = getSegmentConnection(dbName);
    } catch (MetaStoreConnectException e1) {
        LOG.error("add column error, db=" + dbName + ", tbl=" + tblName + ", msg=" + e1.getMessage());
        throw new MetaException(e1.getMessage());
    } catch (SQLException e1) {
        LOG.error("add column error, db=" + dbName + ", tbl=" + tblName + ", msg=" + e1.getMessage());
        throw new MetaException(e1.getMessage());
    }

    try {
        con.setAutoCommit(false);
        con.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);

        ps = con.prepareStatement("select tbl_id, tbl_type, tbl_format, serde_lib"
                + "  from tbls where tbls.db_name=? and tbls.tbl_name=? ");

        ps.setString(1, dbName);
        ps.setString(2, tblName);

        String tblType = null;
        String serdeLib = null;
        String tblFormat = null;

        boolean isTblFind = false;
        long tblID = 0;

        ResultSet tblSet = ps.executeQuery();
        while (tblSet.next()) {
            isTblFind = true;
            tblID = tblSet.getLong(1);
            tblType = tblSet.getString(2);
            tblFormat = tblSet.getString(3);
            serdeLib = tblSet.getString(4);
        }

        tblSet.close();
        ps.close();

        if (!isTblFind) {
            LOG.error("add column error, db=" + dbName + ", tbl=" + tblName);
            throw new MetaException("can not find table " + dbName + ":" + tblName);
        }

        if (tblFormat == null || tblFormat.isEmpty()) {
            tblFormat = "text";
        }

        if (tblType.equalsIgnoreCase("VITURAL_VIEW")) {
            LOG.error("add column error, db=" + dbName + ", tbl=" + tblName);
            throw new InvalidOperationException("view can not add cloumns");
        }

        if (tblType.equalsIgnoreCase("EXTERNAL_TABLE")
                && !HiveConf.getBoolVar(hiveConf, ConfVars.ALTERSCHEMAACTIVATEEXTTABLE)) {
            LOG.error("add column error, db=" + dbName + ", tbl=" + tblName);
            throw new InvalidOperationException("can not add columns for a extenal table ");
        }

        if (!tblType.equalsIgnoreCase("EXTERNAL_TABLE") && tblFormat.equalsIgnoreCase("text")
                && (!HiveConf.getBoolVar(hiveConf, ConfVars.ALTERSCHEMAACTIVATETXTTABLE))) {
            LOG.error("add column error, db=" + dbName + ", tbl=" + tblName);
            throw new InvalidOperationException("can not add columns for a text format table ");
        }

        if (serdeLib != null && serdeLib.equals(ProtobufSerDe.class.getName())) {
            LOG.error("add column error, db=" + dbName + ", tbl=" + tblName);
            throw new InvalidOperationException("can not add columns for a pb table ");
        }

        if (tblFormat != null
                && (tblFormat.equalsIgnoreCase("column") || tblFormat.equalsIgnoreCase("format"))) {
            for (FieldSchema field : newCols) {
                if (field.getType().equals(Constants.BOOLEAN_TYPE_NAME)) {
                    LOG.error("add column error, db=" + dbName + ", tbl=" + tblName);
                    throw new InvalidOperationException(
                            "format file or column file not support boolean type rightnow");
                }
            }
        }

        Map<String, String> tblParamMap = new HashMap<String, String>();
        ps = con.prepareStatement(
                "select param_key, param_value from table_params where tbl_id=? and param_type='TBL'");
        ps.setLong(1, tblID);
        ResultSet paramSet = ps.executeQuery();
        while (paramSet.next()) {
            tblParamMap.put(paramSet.getString(1), paramSet.getString(2));
        }
        paramSet.close();
        ps.close();
        boolean containTime = false;
        boolean contailUser = false;
        if (tblParamMap.containsKey("last_modified_time"))
            containTime = true;
        if (tblParamMap.containsKey("last_modified_by"))
            contailUser = true;

        if (containTime && contailUser) {
            ps = con.prepareStatement(
                    "update table_params set param_value=? where tbl_id=? and param_type='TBL' and param_key=?");
            ps.setString(1, String.valueOf(System.currentTimeMillis() / 1000));
            ps.setLong(2, tblID);
            ps.setString(3, "last_modified_time");
            ps.addBatch();
            ps.setString(1, modifyUser);
            ps.setLong(2, tblID);
            ps.setString(3, "last_modified_by");
            ps.addBatch();

            ps.executeBatch();
            ps.close();
        } else if (!containTime && !contailUser) {
            ps = con.prepareStatement("insert into table_params(tbl_id, param_type, param_key, param_value) "
                    + " values(?,?,?,?)");
            ps.setLong(1, tblID);
            ps.setString(2, "TBL");
            ps.setString(3, "last_modified_time");
            ps.setString(4, String.valueOf(System.currentTimeMillis() / 1000));
            ps.addBatch();

            ps.setLong(1, tblID);
            ps.setString(2, "TBL");
            ps.setString(3, "last_modified_by");
            ps.setString(4, modifyUser);

            ps.addBatch();

            ps.executeBatch();
            ps.close();
        } else if (containTime && !contailUser) {
            ps = con.prepareStatement(
                    "update table_params set param_value=? where tbl_id=? and param_type='TBL' and param_key=?");
            ps.setString(1, String.valueOf(System.currentTimeMillis() / 1000));
            ps.setLong(2, tblID);
            ps.setString(3, "last_modified_time");
            ps.addBatch();

            ps.executeBatch();
            ps.close();

            ps = con.prepareStatement("insert into table_params(tbl_id, param_type, param_key, param_value) "
                    + " values(?,?,?,?)");

            ps.setLong(1, tblID);
            ps.setString(2, "TBL");
            ps.setString(3, "last_modified_by");
            ps.setString(4, modifyUser);

            ps.addBatch();

            ps.executeBatch();
            ps.close();
        } else {
            ps = con.prepareStatement(
                    "update table_params set param_value=? where tbl_id=? and param_type='TBL' and param_key=?");

            ps.setString(1, modifyUser);
            ps.setLong(2, tblID);
            ps.setString(3, "last_modified_by");
            ps.addBatch();

            ps.executeBatch();
            ps.close();

            ps = con.prepareStatement("insert into table_params(tbl_id, param_type, param_key, param_value) "
                    + " values(?,?,?,?)");
            ps.setLong(1, tblID);
            ps.setString(2, "TBL");
            ps.setString(3, "last_modified_time");
            ps.setString(4, String.valueOf(System.currentTimeMillis() / 1000));
            ps.addBatch();

            ps.executeBatch();
            ps.close();
        }

        if (serdeLib != null && serdeLib.equals("org.apache.hadoop.hive.serde.thrift.columnsetSerDe")) {
            ps = con.prepareStatement("delete from columns where tbl_id=?");
            ps.setLong(1, tblID);
            ps.executeUpdate();

            ps = con.prepareStatement(
                    "insert into columns(column_index, tbl_id, column_name, type_name, comment)"
                            + " values(?,?,?,?,?)");
            long index = 0;

            for (FieldSchema field : newCols) {
                ps.setLong(1, index);
                ps.setLong(2, tblID);
                ps.setString(3, field.getName().toLowerCase());
                ps.setString(4, field.getType());
                ps.setString(5, field.getComment());

                ps.addBatch();
                index++;
            }
            ps.executeBatch();
            ps.close();

            ps = con.prepareStatement("update tbls set serde_lib=? where tbl_id=?");
            ps.setString(1, LazySimpleSerDe.class.getName());
            ps.setLong(2, tblID);
            ps.executeUpdate();
            ps.close();
        } else {
            Map<String, Long> colNameMap = new HashMap<String, Long>();
            long maxColIndex = 0;

            ps = con.prepareStatement("select column_name, column_index from "
                    + "columns where tbl_id=? order by column_index asc");
            ps.setLong(1, tblID);

            ResultSet colSet = ps.executeQuery();
            while (colSet.next()) {
                maxColIndex = colSet.getLong(2);
                colNameMap.put(colSet.getString(1), maxColIndex);
            }

            colSet.close();
            ps.close();

            ps = con.prepareStatement(
                    "insert into columns(column_index, tbl_id, column_name, type_name, comment)"
                            + " values(?,?,?,?,?)");

            for (FieldSchema field : newCols) {
                if (colNameMap.containsKey(field.getName())) {
                    LOG.error("add column error, db=" + dbName + ", tbl=" + tblName);
                    throw new MetaException("column name conflict, conflict column name is " + field.getName());
                }

                ps.setLong(1, maxColIndex + 1);
                ps.setLong(2, tblID);
                ps.setString(3, field.getName().toLowerCase());
                ps.setString(4, field.getType());
                ps.setString(5, field.getComment());

                maxColIndex++;
                ps.addBatch();
            }

            ps.executeBatch();
            ps.close();
        }

        con.commit();
        success = true;
    } catch (SQLException ex) {
        throw new MetaException(ex.getMessage());
    } finally {
        if (!success) {
            try {
                con.rollback();
            } catch (SQLException e) {
            }
        }

        closeStatement(ps);
        closeConnection(con);
    }
    return;
}

From source file:org.apache.hadoop.hive.metastore.MyXid.java

public void dropPartition(String dbName, String tblName, DropPartitionDesc dropPartitionDesc)
        throws InvalidObjectException, MetaException {
    Connection con = null;
    Statement ps = null;/*www  .  j a  v  a 2 s  . com*/
    PreparedStatement pss = null;
    boolean success = false;

    dbName = dbName.toLowerCase();
    tblName = tblName.toLowerCase();

    ArrayList<Path> pathToDel = null;
    Warehouse wh = new Warehouse(hiveConf);
    List<String> existsParts = new ArrayList<String>();

    try {
        con = getSegmentConnection(dbName);
    } catch (MetaStoreConnectException e1) {
        LOG.error("drop partition error, db=" + dbName + ", tbl=" + tblName + ", level="
                + dropPartitionDesc.getLevel() + ", msg=" + e1.getMessage());
        throw new MetaException(e1.getMessage());
    } catch (SQLException e1) {
        LOG.error("drop partition error, db=" + dbName + ", tbl=" + tblName + ", level="
                + dropPartitionDesc.getLevel() + ", msg=" + e1.getMessage());
        throw new MetaException(e1.getMessage());
    }

    try {
        con.setAutoCommit(false);
        con.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
        ps = con.createStatement();

        String tblType = null;
        boolean hasPriPart = false;
        boolean hasSubPart = false;
        String priPartType = null;
        String subPartType = null;

        long tblID = 0;
        ResultSet tblSet = null;
        boolean isTblFind = false;

        String tblFormat = null;
        String tblLocation = null;

        ResultSet partSet = null;
        String sql = null;

        HiveConf hconf = (HiveConf) hiveConf;
        boolean externalPartition = hconf.getBoolVar(HiveConf.ConfVars.HIVESUPPORTEXTERNALPARTITION);

        if (dropPartitionDesc.getLevel() == 0) {
            sql = "SELECT tbl_id, tbl_type, pri_part_type, tbl_format, tbl_location"
                    + " from TBLS where db_name='" + dbName + "' and tbl_name='" + tblName + "'";

            tblSet = ps.executeQuery(sql);
            isTblFind = false;

            while (tblSet.next()) {
                isTblFind = true;
                tblID = tblSet.getLong(1);
                tblType = tblSet.getString(2);
                priPartType = tblSet.getString(3);
                tblFormat = tblSet.getString(4);
                tblLocation = tblSet.getString(5);

                if (priPartType != null && !priPartType.isEmpty()) {
                    hasPriPart = true;
                }
                break;
            }

            tblSet.close();

            if (!isTblFind) {
                throw new MetaException("can not find table " + dbName + ":" + tblName);
            }

            if (!tblType.equalsIgnoreCase("MANAGED_TABLE")) {
                if (tblType.equalsIgnoreCase("EXTERNAL_TABLE") && tblFormat != null
                        && tblFormat.equalsIgnoreCase("pgdata")) {
                    LOG.error("drop partition error, db=" + dbName + ", tbl=" + tblName + ", level="
                            + dropPartitionDesc.getLevel() + ", msg=" + tblType + ":" + tblFormat
                            + " can not support alter partition");
                    throw new MetaException(tblType + ":" + tblFormat + " can not support alter partition");
                }

                if (externalPartition && tblType.equalsIgnoreCase("EXTERNAL_TABLE")
                        && (tblFormat == null || !tblFormat.equalsIgnoreCase("pgdata"))) {
                } else {
                    throw new MetaException(tblType + " can not support alter partition");
                }
            }

            if (!hasPriPart) {
                throw new MetaException("table " + dbName + ":" + tblName + " is not pri-partitioned");
            }

            List<String> delPartName = dropPartitionDesc.getPartNames();
            ResultSet ret = null;

            for (String del : delPartName) {
                sql = "delete from partitions where tbl_id=" + tblID + " and part_name='" + del
                        + "' and level=0 returning part_name";

                ret = ps.executeQuery(sql);
                while (ret.next()) {
                    existsParts.add(del);
                    break;
                }
                ret.close();
            }

            //pss = con
            //    .prepareStatement("delete from partitions where tbl_id=? and part_name=? and level=0 returing part_name");
            //for (String del : delPartName) {
            //  pss.setLong(1, tblID);
            //  pss.setString(2, del);
            //  pss.addBatch();
            //}
            //pss.executeBatch();

            pathToDel = new ArrayList<Path>();

            if (!tblType.equalsIgnoreCase("EXTERNAL_TABLE")) {
                for (String del : existsParts) {
                    if (tblLocation == null || tblLocation.trim().isEmpty()) {
                        pathToDel.add(wh.getPartitionPath(dbName, tblName, del));
                    } else {
                        pathToDel.add(Warehouse.getPartitionPath(new Path(tblLocation), del));
                    }
                }
            } else {
                //for (String del : existsParts) {
                //    pathToDel.add(Warehouse.getPartitionPath(new Path(tblLocation),  del));
                //}          
            }

        } else if (dropPartitionDesc.getLevel() == 1) {
            sql = "SELECT tbl_id, tbl_type, sub_part_type, tbl_format, tbl_location"
                    + " from TBLS where db_name='" + dbName + "' and tbl_name='" + tblName + "'";

            tblSet = ps.executeQuery(sql);
            isTblFind = false;

            while (tblSet.next()) {
                isTblFind = true;
                tblID = tblSet.getLong(1);
                tblType = tblSet.getString(2);
                subPartType = tblSet.getString(3);
                tblFormat = tblSet.getString(4);
                tblLocation = tblSet.getString(5);

                if (subPartType != null && !subPartType.isEmpty()) {
                    hasSubPart = true;
                }
                break;
            }

            tblSet.close();

            if (!isTblFind) {
                throw new MetaException("can not find table " + dbName + ":" + tblName);
            }

            if (!tblType.equalsIgnoreCase("MANAGED_TABLE")) {
                if (tblType.equalsIgnoreCase("EXTERNAL_TABLE") && tblFormat != null
                        && tblFormat.equalsIgnoreCase("pgdata")) {
                    LOG.error("drop partition error, db=" + dbName + ", tbl=" + tblName + ", level="
                            + dropPartitionDesc.getLevel() + ", msg=" + tblType + ":" + tblFormat
                            + " can not support alter partition");
                    throw new MetaException(tblType + ":" + tblFormat + " can not support alter partition");
                }

                if (externalPartition && tblType.equalsIgnoreCase("EXTERNAL_TABLE")
                        && (tblFormat == null || !tblFormat.equalsIgnoreCase("pgdata"))) {
                } else {
                    throw new MetaException(tblType + " can not support alter partition");
                }
            }

            if (!hasSubPart) {
                throw new MetaException("table " + dbName + ":" + tblName + " is not sub-partitioned");
            }

            Set<String> priPartNameSet = new TreeSet<String>();

            List<String> delSubPartName = dropPartitionDesc.getPartNames();

            sql = "SELECT level, part_name from PARTITIONS where" + " tbl_id=" + tblID + " order by level asc";

            partSet = ps.executeQuery(sql);
            int partLevel = 0;

            while (partSet.next()) {
                partLevel = partSet.getInt(1);
                if (partLevel == 0) {
                    String partName = partSet.getString(2);
                    priPartNameSet.add(partName);
                }
            }

            partSet.close();

            //pss = con
            //    .prepareStatement("delete from partitions where tbl_id=? and part_name=? and level=1");
            //for (String del : delSubPartName) {
            //  pss.setLong(1, tblID);
            //  pss.setString(2, del);
            //  pss.addBatch();
            // }
            // pss.executeBatch();

            ResultSet ret = null;

            for (String del : delSubPartName) {
                sql = "delete from partitions where tbl_id=" + tblID + " and part_name='" + del
                        + "' and level=1 returning part_name";

                ret = ps.executeQuery(sql);
                while (ret.next()) {
                    existsParts.add(del);
                    break;
                }
                ret.close();
            }

            pathToDel = new ArrayList<Path>();

            if (!tblType.equalsIgnoreCase("EXTERNAL_TABLE")) {
                for (String str : existsParts) {
                    if (tblLocation == null || tblLocation.trim().isEmpty()) {
                        pathToDel.addAll(wh.getSubPartitionPaths(dbName, tblName, priPartNameSet, str));
                    } else {
                        pathToDel.addAll(
                                Warehouse.getSubPartitionPaths(new Path(tblLocation), priPartNameSet, str));
                    }
                }
            } else {
                //for (String str : existsParts) {
                //    pathToDel.addAll(Warehouse.getSubPartitionPaths(new Path(tblLocation),
                //        priPartNameSet, str));
                //}
            }
        }

        if (pathToDel != null && !pathToDel.isEmpty()) {
            for (Path path : pathToDel) {
                wh.deleteDirThrowExp(path, true);
            }
        }

        con.commit();
        success = true;
    } catch (SQLException ex) {
        ex.printStackTrace();
        LOG.error("drop partition error, db=" + dbName + ", tbl=" + tblName + ", level="
                + dropPartitionDesc.getLevel() + ", msg=" + ex.getMessage());
        throw new MetaException(ex.getMessage());
    } finally {
        if (!success) {
            try {
                con.rollback();
            } catch (SQLException e) {
            }
        }

        closeStatement(ps);
        closeStatement(pss);
        closeConnection(con);
    }

    //if (success) {
    //  for (Path path : pathToDel) {
    //    wh.deleteDir(path, true);
    //  }
    //} else {
    //  return;
    //}
}

From source file:org.apache.hadoop.hive.metastore.MyXid.java

@Override
public boolean grantAuthOnTbl(String forWho, List<String> privileges, String db, String tbl)
        throws NoSuchObjectException, InvalidObjectException, MetaException {
    Connection con = null;
    ;//from   ww  w .j  a v a 2  s  .  com
    Statement ps = null;
    boolean success = false;
    PreparedStatement pss = null;

    success = false;
    forWho = forWho.toLowerCase();
    db = db.toLowerCase();
    tbl = tbl.toLowerCase();

    if (privileges == null) {
        throw new InvalidObjectException("No privileges are given!");
    }

    try {
        con = getSegmentConnection(db);
    } catch (MetaStoreConnectException e1) {
        LOG.error("grant auth on db error, forWho=" + forWho + ", db=" + db + ", tbl=" + tbl + ", msg="
                + e1.getMessage());
        throw new MetaException("can not find db:" + db);
    } catch (SQLException e1) {
        LOG.error("grant auth on db error, forWho=" + forWho + ", db=" + db + ", tbl=" + tbl + ", msg="
                + e1.getMessage());
        throw new MetaException(e1.getMessage());
    }

    Set<String> tblNames = new HashSet<String>();

    try {
        ps = con.createStatement();
        String sql = null;
        StringBuilder sb = new StringBuilder();
        int size = tbl.length();
        for (int i = 0; i < size; i++) {
            if (tbl.charAt(i) != '\'') {
                sb.append(tbl.charAt(i));
            }
        }

        tbl = sb.toString();

        if (tbl == null || tbl.isEmpty() || tbl.equals(".*") || tbl.equals("*")) {
            sql = "select tbl_name from tbls" + " where  tbls.db_name='" + db.toLowerCase() + "'";
        } else {
            tbl = tbl.replace('*', '%');

            sql = "select tbl_name from tbls" + " where  tbls.db_name='" + db + "' and tbls.tbl_name like '"
                    + tbl + "'";
        }

        LOG.debug("SQL is " + sql);

        ResultSet tblSet = ps.executeQuery(sql);
        while (tblSet.next()) {
            String tblName = tblSet.getString(1);
            tblNames.add(tblName);
        }

        tblSet.close();

        con.commit();
        success = true;
    } catch (SQLException ex) {
        ex.printStackTrace();
        LOG.error("grant auth on db error, forWho=" + forWho + ", db=" + db + ", tbl=" + tbl + ", msg="
                + ex.getMessage());
        LOG.error(ex.getMessage());
    } finally {

        closeStatement(ps);
        closeConnection(con);
    }

    if (tblNames.isEmpty()) {
        throw new NoSuchObjectException("Table does not exist: " + tbl + " in db: " + db);
    }

    try {
        con = getGlobalConnection();
    } catch (MetaStoreConnectException e1) {
        LOG.error("grant auth on db error, forWho=" + forWho + ", db=" + db + ", tbl=" + tbl + ", msg="
                + e1.getMessage());
        throw new MetaException(e1.getMessage());
    } catch (SQLException e1) {
        LOG.error("grant auth on db error, forWho=" + forWho + ", db=" + db + ", tbl=" + tbl + ", msg="
                + e1.getMessage());
        throw new MetaException(e1.getMessage());
    }

    try {
        con.setAutoCommit(false);
        con.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
        ps = con.createStatement();
        String sql = null;
        StringBuilder sb = new StringBuilder();
        int size = tbl.length();
        for (int i = 0; i < size; i++) {
            if (tbl.charAt(i) != '\'') {
                sb.append(tbl.charAt(i));
            }
        }

        tbl = sb.toString();

        if (tbl == null || tbl.isEmpty() || tbl.equals(".*") || tbl.equals("*")) {
            sql = "select tbl_name, alter_priv, create_priv, delete_priv "
                    + ",drop_priv, index_priv, insert_priv, select_priv, " + " update_priv from tblpriv"
                    + " where db_name='" + db.toLowerCase() + "' and user_name='" + forWho + "'";
        } else {
            tbl = tbl.replace('*', '%');

            sql = "select tbl_name, alter_priv, create_priv, delete_priv "
                    + ",drop_priv, index_priv, insert_priv, select_priv, " + " update_priv from tblpriv"
                    + " where db_name='" + db + "' and tbl_name like '" + tbl + "'" + " and user_name='"
                    + forWho + "'";
        }

        LOG.debug("SQL is " + sql);

        ResultSet tblSet = ps.executeQuery(sql);

        Map<String, TblPrivDesc> tblPrivMap = new HashMap<String, TblPrivDesc>();

        while (tblSet.next()) {
            String tblName = tblSet.getString(1);

            TblPrivDesc privDesc = new TblPrivDesc();
            privDesc.alterPriv = tblSet.getBoolean(2);
            privDesc.createPriv = tblSet.getBoolean(3);
            privDesc.deletePriv = tblSet.getBoolean(4);
            privDesc.dropPriv = tblSet.getBoolean(5);
            privDesc.indexPriv = tblSet.getBoolean(6);
            privDesc.insertPriv = tblSet.getBoolean(7);
            privDesc.selPriv = tblSet.getBoolean(8);
            privDesc.updatePriv = tblSet.getBoolean(9);

            tblPrivMap.put(tblName, privDesc);
        }

        tblSet.close();

        boolean selPriv = false;
        boolean insertPriv = false;
        boolean createPriv = false;
        boolean dropPriv = false;
        boolean deletePriv = false;
        boolean alterPriv = false;
        boolean updatePriv = false;
        boolean indexPriv = false;

        for (String priv : privileges) {
            if (priv.equals("TOK_SELECT_PRI")) {
                selPriv = true;
            } else if (priv.equals("TOK_INSERT_PRI")) {
                insertPriv = true;
            } else if (priv.equals("TOK_CREATE_PRI")) {
                createPriv = true;
            } else if (priv.equals("TOK_DROP_PRI")) {
                dropPriv = true;
            } else if (priv.equals("TOK_DELETE_PRI")) {
                deletePriv = true;
            } else if (priv.equals("TOK_ALTER_PRI")) {
                alterPriv = true;
            } else if (priv.equals("TOK_UPDATE_PRI")) {
                updatePriv = true;
            } else if (priv.equals("TOK_INDEX_PRI")) {
                indexPriv = true;
            } else if (priv.equals("TOK_ALL_PRI")) {
                selPriv = true;
                insertPriv = true;
                createPriv = true;
                dropPriv = true;
                deletePriv = true;
                alterPriv = true;
                updatePriv = true;
                indexPriv = true;
            } else {
                throw new InvalidObjectException("Privilege does not exist: " + priv);
            }
        }

        if (!tblPrivMap.isEmpty()) {
            Collection<TblPrivDesc> tblPrivColl = tblPrivMap.values();
            if (alterPriv) {
                for (TblPrivDesc entry : tblPrivColl) {
                    entry.alterPriv = true;
                }
            }

            if (createPriv) {
                for (TblPrivDesc entry : tblPrivColl) {
                    entry.createPriv = true;
                }
            }

            if (deletePriv) {
                for (TblPrivDesc entry : tblPrivColl) {
                    entry.deletePriv = true;
                }
            }

            if (dropPriv) {
                for (TblPrivDesc entry : tblPrivColl) {
                    entry.dropPriv = true;
                }
            }

            if (indexPriv) {
                for (TblPrivDesc entry : tblPrivColl) {
                    entry.indexPriv = true;
                }
            }

            if (insertPriv) {
                for (TblPrivDesc entry : tblPrivColl) {
                    entry.insertPriv = true;
                }
            }

            if (selPriv) {
                for (TblPrivDesc entry : tblPrivColl) {
                    entry.selPriv = true;
                }
            }

            if (updatePriv) {
                for (TblPrivDesc entry : tblPrivColl) {
                    entry.updatePriv = true;
                }
            }

            pss = con.prepareStatement("update tblpriv set alter_priv=?, create_priv=?,  "
                    + " delete_priv=?, drop_priv=?, index_priv=?, insert_priv=?, select_priv=?,"
                    + " update_priv=? where user_name=? and db_name=? and tbl_name=? ");

            for (Entry<String, TblPrivDesc> entry : tblPrivMap.entrySet()) {

                pss.setBoolean(1, entry.getValue().alterPriv);
                pss.setBoolean(2, entry.getValue().createPriv);

                pss.setBoolean(3, entry.getValue().deletePriv);
                pss.setBoolean(4, entry.getValue().dropPriv);
                pss.setBoolean(5, entry.getValue().indexPriv);
                pss.setBoolean(6, entry.getValue().insertPriv);
                pss.setBoolean(7, entry.getValue().selPriv);

                pss.setBoolean(8, entry.getValue().updatePriv);

                pss.setString(9, forWho);
                pss.setString(10, db);
                pss.setString(11, entry.getKey());

                pss.addBatch();
            }

            pss.executeBatch();
        }

        pss = con.prepareStatement("insert into tblpriv(alter_priv, create_priv,"
                + "delete_priv, drop_priv, index_priv, insert_priv, select_priv,"
                + " update_priv, user_name, db_name, tbl_name) values(?,?,?,?,?,?,?,?,?,?,?)");
        int needInsertCount = 0;

        for (String tblName : tblNames) {
            if (!tblPrivMap.containsKey(tblName)) {
                pss.setBoolean(1, alterPriv);
                pss.setBoolean(2, createPriv);
                pss.setBoolean(3, deletePriv);
                pss.setBoolean(4, dropPriv);
                pss.setBoolean(5, indexPriv);
                pss.setBoolean(6, insertPriv);
                pss.setBoolean(7, selPriv);

                pss.setBoolean(8, updatePriv);
                pss.setString(9, forWho);
                pss.setString(10, db);
                pss.setString(11, tblName);

                pss.addBatch();

                needInsertCount++;
            }
        }

        if (needInsertCount > 0) {
            pss.executeBatch();
        }

        con.commit();
        success = true;
    } catch (SQLException ex) {
        ex.printStackTrace();
        LOG.error("grant auth on db error, forWho=" + forWho + ", db=" + db + ", tbl=" + tbl + ", msg="
                + ex.getMessage());
        LOG.error(ex.getMessage());
    } finally {
        if (!success) {
            try {
                con.rollback();
            } catch (SQLException e) {
            }
        }
        closeStatement(ps);
        closeStatement(pss);
        closeConnection(con);
    }

    return success;
}

From source file:org.apache.hadoop.hive.metastore.MyXid.java

@Override
public Table getTable(String dbName, String tableName) throws MetaException, NoSuchObjectException {
    boolean success = false;

    Connection con;
    Statement ps = null;/*w  w w  .  j  av  a2  s  .  c o  m*/
    Table tbl = new Table();

    dbName = dbName.toLowerCase();
    tableName = tableName.toLowerCase();

    try {
        con = getSegmentConnectionForRead(dbName);
    } catch (MetaStoreConnectException e1) {
        LOG.error("get table error, db=" + dbName + ", tbl=" + tableName + ", msg=" + e1.getMessage());
        throw new MetaException(e1.getMessage());
    } catch (SQLException e1) {
        LOG.error("get table error, db=" + dbName + ", tbl=" + tableName + ", msg=" + e1.getMessage());
        throw new MetaException(e1.getMessage());
    }

    try {
        con.setAutoCommit(false);
        con.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
        ps = con.createStatement();

        String sql = "SELECT tbl_id, create_time"
                + ", is_compressed, retention, tbl_type, db_name, tbl_name, tbl_owner "
                + ", tbl_format, pri_part_type, sub_part_type, pri_part_key, sub_part_key "
                + ", input_format, output_format, serde_name, serde_lib, tbl_location, tbl_comment "
                + " from TBLS where db_name='" + dbName + "' and tbl_name='" + tableName + "'";

        ResultSet tblSet = ps.executeQuery(sql);
        boolean isTblFind = false;
        StorageDescriptor sd = null;
        SerDeInfo sdInfo = null;
        String priPartKey = null;
        String subPartKey = null;
        Partition priPart = null;
        Partition subPart = null;
        long tblID = 0;

        String comment = null;
        String format = null;
        Timestamp createTime = null;
        String tblType = null;

        boolean hasPriPart = false;
        boolean hasSubPart = false;

        while (tblSet.next()) {
            isTblFind = true;
            tblID = tblSet.getLong(1);

            createTime = tblSet.getTimestamp(2);

            if (createTime != null) {
                tbl.setCreateTime((int) (createTime.getTime() / 1000));
            }

            sd = new StorageDescriptor();
            sdInfo = new SerDeInfo();
            sd.setCompressed(tblSet.getBoolean(3));

            tbl.setRetention((int) tblSet.getLong(4));
            tblType = tblSet.getString(5);
            tbl.setTableType(tblType);
            tbl.setDbName(tblSet.getString(6));
            tbl.setTableName(tblSet.getString(7));
            tbl.setOwner(tblSet.getString(8));

            format = tblSet.getString(9);

            priPartKey = tblSet.getString(12);
            subPartKey = tblSet.getString(13);

            if (priPartKey != null && !priPartKey.isEmpty()) {
                hasPriPart = true;
                priPart = new Partition();
                priPart.setLevel(0);
                priPart.setDbName(tblSet.getString(6));
                priPart.setTableName(tblSet.getString(7));
                priPart.setParType(tblSet.getString(10));
            }

            if (subPartKey != null && !subPartKey.isEmpty()) {
                hasSubPart = true;
                subPart = new Partition();
                subPart.setLevel(1);
                subPart.setDbName(tblSet.getString(6));
                subPart.setTableName(tblSet.getString(7));
                subPart.setParType(tblSet.getString(11));
            }

            sd.setInputFormat(tblSet.getString(14));
            sd.setOutputFormat(tblSet.getString(15));
            sdInfo.setName(tblSet.getString(16));
            sdInfo.setSerializationLib(tblSet.getString(17));
            sd.setLocation(tblSet.getString(18));
            comment = tblSet.getString(19);

            break;
        }

        tblSet.close();

        if (!isTblFind) {
            LOG.error(dbName + "." + tableName + " table not found");
            throw new NoSuchObjectException(dbName + "." + tableName + " table not found");
        }

        List<FieldSchema> fieldList = new ArrayList<FieldSchema>();
        Map<String, FieldSchema> fieldMap = new LinkedHashMap<String, FieldSchema>();

        sql = "SELECT column_name, type_name, comment from columns where tbl_id=" + tblID
                + " order by column_index asc";
        ResultSet colSet = ps.executeQuery(sql);
        while (colSet.next()) {
            FieldSchema field = new FieldSchema();
            field.setName(colSet.getString(1));
            field.setType(colSet.getString(2));
            field.setComment(colSet.getString(3));

            fieldList.add(field);
            fieldMap.put(colSet.getString(1), field);
        }
        colSet.close();

        sd.setCols(fieldList);

        sql = "SELECT param_type, param_key, param_value  from table_params where tbl_id=" + tblID;
        ResultSet paramSet = ps.executeQuery(sql);
        Map<String, String> tblParamMap = new HashMap<String, String>();
        Map<String, String> sdParamMap = new HashMap<String, String>();
        Map<String, String> serdeParam = new HashMap<String, String>();

        while (paramSet.next()) {
            String type = paramSet.getString(1);
            if (type == null)
                continue;

            if (type.equalsIgnoreCase("sd")) {
                sdParamMap.put(paramSet.getString(2), paramSet.getString(3));
            } else if (type.equalsIgnoreCase("serde")) {
                serdeParam.put(paramSet.getString(2), paramSet.getString(3));
            } else if (type.equalsIgnoreCase("tbl")) {
                tblParamMap.put(paramSet.getString(2), paramSet.getString(3));
            } else {
                tblParamMap.put(paramSet.getString(2), paramSet.getString(3));
            }
        }
        paramSet.close();

        if (comment != null && !comment.isEmpty()) {
            tblParamMap.put("comment", comment);
        }

        if (format != null && !format.isEmpty()) {
            tblParamMap.put("type", format);
        }

        tbl.setParameters(tblParamMap);
        sd.setParameters(sdParamMap);
        sdInfo.setParameters(serdeParam);

        List<String> bucketCols = new ArrayList<String>();
        sql = "select bucket_col_name from bucket_cols where tbl_id=" + tblID + " order by col_index asc";
        ResultSet bucketSet = ps.executeQuery(sql);
        while (bucketSet.next()) {
            bucketCols.add(bucketSet.getString(1));
        }

        bucketSet.close();
        if (bucketCols.size() > 0) {
            sd.setBucketCols(bucketCols);
            String numBucketStr = sd.getParameters().get("NUM_BUCKETS");
            if (numBucketStr == null) {
                sd.setNumBuckets(-1);
            } else {
                sd.setNumBuckets(Integer.valueOf(numBucketStr));
            }
        } else {
            sd.setBucketCols(bucketCols);
            sd.setNumBuckets(-1);
        }

        sd.getParameters().remove("NUM_BUCKETS");

        List<Order> sortCols = new ArrayList<Order>();
        sql = "select sort_column_name, sort_order from sort_cols where tbl_id=" + tblID
                + " order by col_index asc";
        ResultSet sortSet = ps.executeQuery(sql);
        while (sortSet.next()) {
            Order o = new Order();
            o.setCol(sortSet.getString(1));
            o.setOrder(sortSet.getInt(2));
            sortCols.add(o);
        }

        sortSet.close();
        sd.setSortCols(sortCols);

        sd.setSerdeInfo(sdInfo);
        tbl.setSd(sd);

        if (hasPriPart) {
            sql = "SELECT level, part_name, part_values from  PARTITIONS where tbl_id=" + tblID;
            ResultSet partSet = ps.executeQuery(sql);
            Map<String, List<String>> priPartSpace = new LinkedHashMap<String, List<String>>();
            Map<String, List<String>> subPartSpace = new LinkedHashMap<String, List<String>>();

            while (partSet.next()) {
                int level = partSet.getInt(1);
                switch (level) {
                case 0:
                    String priName = partSet.getString(2);
                    List<String> priValueList = new ArrayList<String>();
                    Array priSpaceArray = partSet.getArray(3);

                    if (priSpaceArray != null) {
                        ResultSet priValueSet = priSpaceArray.getResultSet();

                        while (priValueSet.next()) {
                            priValueList.add(priValueSet.getString(2));
                        }
                    }

                    priPartSpace.put(priName, priValueList);
                    break;

                case 1:
                    String subName = partSet.getString(2);
                    List<String> subValueList = new ArrayList<String>();
                    Array subSpaceArray = partSet.getArray(3);

                    if (subSpaceArray != null) {
                        ResultSet subValueSet = subSpaceArray.getResultSet();
                        while (subValueSet.next()) {
                            subValueList.add(subValueSet.getString(2));
                        }
                    }

                    subPartSpace.put(subName, subValueList);
                    break;

                default:
                    break;
                }
            }

            partSet.close();

            priPart.setParSpaces(priPartSpace);

            priPart.setParKey(fieldMap.get(priPartKey.toLowerCase()));

            if (hasSubPart) {
                subPart.setParSpaces(subPartSpace);
                subPart.setParKey(fieldMap.get(subPartKey.toLowerCase()));
            }
        }

        tbl.setPriPartition(priPart);
        tbl.setSubPartition(subPart);

        if (tblType.equalsIgnoreCase("VIRTUAL_VIEW")) {
            sql = "select view_original_text, view_expanded_text, vtables from " + " tdwview where tbl_id="
                    + tblID;

            ResultSet viewSet = ps.executeQuery(sql);
            while (viewSet.next()) {
                tbl.setViewOriginalText(viewSet.getString(1));
                tbl.setViewExpandedText(viewSet.getString(2));
                tbl.setVtables(viewSet.getString(3));
                break;
            }
        }

        con.commit();
        success = true;
    } catch (SQLException sqlex) {
        sqlex.printStackTrace();
        LOG.error("get table error, db=" + dbName + ", tbl=" + tableName + ", msg=" + sqlex.getMessage());
        throw new MetaException(sqlex.getMessage());
    } finally {
        if (!success) {
            try {
                con.rollback();
            } catch (SQLException e) {
            }
        }

        closeStatement(ps);
        closeConnection(con);
    }

    if (success)
        return tbl;
    else
        return null;
}

From source file:org.apache.hadoop.hive.metastore.MyXid.java

@Override
public void addDefaultPartition(String dbName, String tblName, int level)
        throws InvalidObjectException, MetaException {
    boolean success = false;

    Connection con = null;
    Statement ps = null;//from ww w . j  a  v  a 2s  .co  m
    PreparedStatement pss = null;

    dbName = dbName.toLowerCase();
    tblName = tblName.toLowerCase();

    boolean isPathMaked = false;
    ArrayList<Path> pathToMake = new ArrayList<Path>();
    Warehouse wh = new Warehouse(hiveConf);
    long tblID = 0;

    try {
        con = getSegmentConnection(dbName);
    } catch (MetaStoreConnectException e1) {
        LOG.error("add default partition error, db=" + dbName + ", tbl=" + tblName + ", level=" + level
                + ", msg=" + e1.getMessage());
        throw new MetaException(e1.getMessage());
    } catch (SQLException e1) {
        LOG.error("add default partition error, db=" + dbName + ", tbl=" + tblName + ", level=" + level
                + ", msg=" + e1.getMessage());
        throw new MetaException(e1.getMessage());
    }

    try {
        con.setAutoCommit(false);
        con.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
        ps = con.createStatement();

        String tblType = null;
        boolean hasPriPart = false;
        boolean hasSubPart = false;
        String priPartKey = null;
        String subPartKey = null;
        String priPartType = null;
        String subPartType = null;

        String tblFormat = null;
        String tblLocation = null;

        String priKeyType = null;
        String subKeyType = null;
        ResultSet tblSet = null;
        boolean isTblFind = false;

        ArrayList<String> partToAdd = new ArrayList<String>();
        String sql = null;

        HiveConf hconf = (HiveConf) hiveConf;
        boolean externalPartition = hconf.getBoolVar(HiveConf.ConfVars.HIVESUPPORTEXTERNALPARTITION);

        if (level == 0) {
            sql = "SELECT tbl_id, tbl_type, pri_part_type, pri_part_key, tbl_format, tbl_location"
                    + " from TBLS where db_name='" + dbName + "' and tbl_name='" + tblName + "'";

            tblSet = ps.executeQuery(sql);
            isTblFind = false;

            while (tblSet.next()) {
                isTblFind = true;
                tblID = tblSet.getLong(1);
                tblType = tblSet.getString(2);
                priPartKey = tblSet.getString(4);
                priPartType = tblSet.getString(3);
                tblFormat = tblSet.getString(5);
                tblLocation = tblSet.getString(6);

                if (priPartType != null && !priPartType.isEmpty()) {
                    hasPriPart = true;
                }
                break;
            }

            tblSet.close();

            if (!isTblFind) {
                LOG.error("add partition error, db=" + dbName + ", tbl=" + tblName + ", level=" + level
                        + ", msg=" + "can not find table " + dbName + ":" + tblName);

                throw new MetaException("can not find table " + dbName + ":" + tblName);
            }

            if (!tblType.equalsIgnoreCase("MANAGED_TABLE")) {
                if (tblType.equalsIgnoreCase("EXTERNAL_TABLE") && tblFormat != null
                        && tblFormat.equalsIgnoreCase("pgdata")) {
                    LOG.error("add default partition error, db=" + dbName + ", tbl=" + tblName + ", level="
                            + level + ", msg=" + tblType + ":" + tblFormat
                            + " can not support alter partition");
                    throw new MetaException(tblType + ":" + tblFormat + " can not support alter partition");
                }

                if (externalPartition && tblType.equalsIgnoreCase("EXTERNAL_TABLE")
                        && (tblFormat == null || !tblFormat.equalsIgnoreCase("pgdata"))) {
                } else {
                    LOG.error("add default partition error, db=" + dbName + ", tbl=" + tblName + ", level="
                            + level + ", msg=" + tblType + " can not support alter partition");

                    throw new MetaException(tblType + " can not support alter partition");
                }
            }

            if (!hasPriPart) {
                LOG.error("add partition error, db=" + dbName + ", tbl=" + tblName + ", level=" + level
                        + ", msg=" + "table " + dbName + ":" + tblName + " is not pri-partitioned");

                throw new MetaException("table " + dbName + ":" + tblName + " is not pri-partitioned");
            }

            List<String> partNames = new ArrayList<String>();
            Set<String> subPartNameSet = new TreeSet<String>();

            sql = "SELECT level, part_name from PARTITIONS where" + " tbl_id=" + tblID + " order by level asc";

            ResultSet partSet = ps.executeQuery(sql);
            int partLevel = 0;

            while (partSet.next()) {
                partLevel = partSet.getInt(1);

                if (partLevel == 0) {
                    String partName = partSet.getString(2);
                    partNames.add(partName);
                } else if (partLevel == 1) {
                    String partName = partSet.getString(2);
                    subPartNameSet.add(partName);
                }
            }
            partSet.close();

            if (partNames.contains("default")) {
                LOG.error("add partition error, db=" + dbName + ", tbl=" + tblName + ", level=" + level
                        + ", msg=" + "table : " + tblName
                        + " have already contain a pri parititon named: default");

                throw new MetaException(
                        "table : " + tblName + " have already contain a pri parititon named: default");
            }

            pss = con.prepareStatement(
                    "INSERT INTO partitions(level, tbl_id, " + " part_name, part_values) values(?,?,?,?)");

            pss.setInt(1, 0);

            pss.setLong(2, tblID);
            pss.setString(3, "default");

            Array spaceArray = con.createArrayOf("varchar", new ArrayList<String>().toArray());
            pss.setArray(4, spaceArray);

            pss.executeUpdate();

            if (!tblType.equalsIgnoreCase("EXTERNAL_TABLE")) {
                if (tblLocation == null || tblLocation.trim().isEmpty()) {
                    pathToMake.addAll(wh.getPriPartitionPaths(dbName, tblName, "default", subPartNameSet));
                } else {
                    pathToMake.addAll(
                            Warehouse.getPriPartitionPaths(new Path(tblLocation), "default", subPartNameSet));
                }
            } else {
                pathToMake.addAll(
                        Warehouse.getPriPartitionPaths(new Path(tblLocation), "default", subPartNameSet));
            }
        } else if (level == 1) {
            sql = "SELECT tbl_id, tbl_type, sub_part_type, sub_part_key, tbl_format, tbl_location"
                    + " from TBLS where db_name='" + dbName.toLowerCase() + "' and tbl_name='"
                    + tblName.toLowerCase() + "'";

            tblSet = ps.executeQuery(sql);
            isTblFind = false;

            while (tblSet.next()) {
                isTblFind = true;
                tblID = tblSet.getLong(1);
                tblType = tblSet.getString(2);
                subPartKey = tblSet.getString(4);
                subPartType = tblSet.getString(3);
                tblFormat = tblSet.getString(5);
                tblLocation = tblSet.getString(6);

                if (subPartType != null && !subPartType.isEmpty()) {
                    hasSubPart = true;
                }

                break;
            }

            tblSet.close();

            if (!isTblFind) {
                LOG.error("add default partition error, db=" + dbName + ", tbl=" + tblName + ", level=" + level
                        + ", msg=" + "can not find table " + dbName + ":" + tblName);

                throw new MetaException("can not find table " + dbName + ":" + tblName);
            }

            if (!tblType.equalsIgnoreCase("MANAGED_TABLE")) {
                if (tblType.equalsIgnoreCase("EXTERNAL_TABLE") && tblFormat != null
                        && tblFormat.equalsIgnoreCase("pgdata")) {
                    LOG.error("add default partition error, db=" + dbName + ", tbl=" + tblName + ", level="
                            + level + ", msg=" + tblType + ":" + tblFormat
                            + " can not support alter partition");
                    throw new MetaException(tblType + ":" + tblFormat + " can not support alter partition");
                }
                if (externalPartition && tblType.equalsIgnoreCase("EXTERNAL_TABLE")
                        && (tblFormat == null || !tblFormat.equalsIgnoreCase("pgdata"))) {
                } else {
                    LOG.error("add default partition error, db=" + dbName + ", tbl=" + tblName + ", level="
                            + level + ", msg=" + tblType + " can not support alter partition");

                    throw new MetaException(tblType + " can not support alter partition");
                }
            }

            if (!hasSubPart) {
                LOG.error("add default partition error, db=" + dbName + ", tbl=" + tblName + ", level=" + level
                        + ", msg=" + "table " + dbName + ":" + tblName + " is not sun-partitioned");

                throw new MetaException("table " + dbName + ":" + tblName + " is not sun-partitioned");
            }

            List<String> partNames = new ArrayList<String>();
            Set<String> partNameSet = new TreeSet<String>();

            sql = "SELECT level,  part_name from PARTITIONS where" + " tbl_id=" + tblID + " order by level asc";
            ResultSet partSet = ps.executeQuery(sql);
            int partLevel = 0;

            while (partSet.next()) {
                partLevel = partSet.getInt(1);

                if (partLevel == 1) {
                    String partName = partSet.getString(2);
                    partNames.add(partName);
                } else if (partLevel == 0) {
                    String partName = partSet.getString(2);
                    partNameSet.add(partName);
                }
            }

            partSet.close();

            if (partNames.contains("default")) {
                LOG.error("add default partition error, db=" + dbName + ", tbl=" + tblName + ", level=" + level
                        + ", msg=" + "table : " + tblName
                        + " have already contain a sub parititon named: default");

                throw new MetaException(
                        "table : " + tblName + " have already contain a sub parititon named: default");
            }

            pss = con.prepareStatement(
                    "INSERT INTO partitions(level, tbl_id, " + " part_name, part_values) values(?,?,?,?)");

            pss.setInt(1, 1);
            pss.setLong(2, tblID);
            pss.setString(3, "default");

            Array spaceArray = con.createArrayOf("varchar", new ArrayList<String>().toArray());
            pss.setArray(4, spaceArray);

            pss.executeUpdate();

            if (!tblType.equalsIgnoreCase("EXTERNAL_TABLE")) {
                if (tblLocation == null || tblLocation.trim().isEmpty()) {
                    pathToMake.addAll(wh.getSubPartitionPaths(dbName, tblName, partNameSet, "default"));
                } else {
                    pathToMake.addAll(
                            Warehouse.getSubPartitionPaths(new Path(tblLocation), partNameSet, "default"));
                }
            } else {
                pathToMake
                        .addAll(Warehouse.getSubPartitionPaths(new Path(tblLocation), partNameSet, "default"));
            }
        }

        con.commit();
        success = true;
    } catch (SQLException ex) {
        LOG.error("add partition error, db=" + dbName + ", tbl=" + tblName + ", level=" + level + ", msg="
                + ex.getMessage());

        throw new MetaException(ex.getMessage());
    } finally {
        if (!success) {
            try {
                con.rollback();
            } catch (SQLException e) {
            }

            if (isPathMaked) {
                for (Path path : pathToMake) {
                    wh.deleteDir(path, false);
                }
            }
        }

        closeStatement(ps);
        closeStatement(pss);
        closeConnection(con);
    }

    if (success) {
        boolean mkDirOK = false;
        List<Path> createdPath = new ArrayList<Path>();
        try {
            for (Path path : pathToMake) {
                mkDirOK = wh.mkdirs(path);
                if (!mkDirOK) {
                    break;
                }

                createdPath.add(path);
            }
        } catch (Exception x) {
            mkDirOK = false;
        }

        if (!mkDirOK) {
            dropPartitionMeta(dbName, tblID, "default", level);
            if (!createdPath.isEmpty()) {
                for (Path path : createdPath) {
                    wh.deleteDir(path, true);
                }
            }
        }

    }

}

From source file:org.apache.hadoop.hive.metastore.MyXid.java

@Override
public void renameCols(String dbName, String tblName, RenameColDesc renameColDesc)
        throws InvalidOperationException, MetaException, InvalidObjectException {
    if (!MetaStoreUtils.validateName(renameColDesc.getNewName())) {
        throw new InvalidObjectException("new column name is not valid object " + renameColDesc.getNewName());
    }//  w w w. j a v  a2  s .c o  m

    Connection con = null;
    PreparedStatement ps = null;
    boolean success = false;

    dbName = dbName.toLowerCase();
    tblName = tblName.toLowerCase();

    try {
        con = getSegmentConnection(dbName);
    } catch (MetaStoreConnectException e1) {
        LOG.error("rename column error, db=" + dbName + ", tbl=" + tblName + ", newname="
                + renameColDesc.getNewName() + ", msg=" + e1.getMessage());
        throw new MetaException(e1.getMessage());
    } catch (SQLException e1) {
        LOG.error("rename column error, db=" + dbName + ", tbl=" + tblName + ", newname="
                + renameColDesc.getNewName() + ", msg=" + e1.getMessage());
        throw new MetaException(e1.getMessage());
    }

    try {
        con.setAutoCommit(false);
        con.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);

        ps = con.prepareStatement("select tbl_id, tbl_type, tbl_format ,pri_part_key "
                + ", sub_part_key, serde_lib from tbls where db_name=? and tbl_name=?");

        ps.setString(1, dbName);
        ps.setString(2, tblName);

        String tblType = null;
        String serdeLib = null;
        String tblFormat = null;
        boolean isPriPart = false;
        boolean isSubPart = false;
        String priPartKey = null;
        String subPartKey = null;

        boolean isTblFind = false;
        long tblID = 0;

        ResultSet tblSet = ps.executeQuery();

        while (tblSet.next()) {
            isTblFind = true;
            tblID = tblSet.getLong(1);
            tblType = tblSet.getString(2);
            tblFormat = tblSet.getString(3);
            priPartKey = tblSet.getString(4);
            subPartKey = tblSet.getString(5);
            serdeLib = tblSet.getString(6);

            isPriPart = priPartKey != null;
            isSubPart = subPartKey != null;
        }

        tblSet.close();
        ps.close();

        if (!isTblFind) {
            LOG.error("rename column error, db=" + dbName + ", tbl=" + tblName + ", newname="
                    + renameColDesc.getNewName());
            throw new MetaException("can not find table " + dbName + ":" + tblName);
        }

        if (tblFormat == null || tblFormat.isEmpty()) {
            tblFormat = "text";
        }

        if (tblType.equalsIgnoreCase("VITURAL_VIEW")) {
            LOG.error("rename column error, db=" + dbName + ", tbl=" + tblName + ", newname="
                    + renameColDesc.getNewName());
            throw new MetaException("view can not rename a column");
        }

        if (tblType.equalsIgnoreCase("EXTERNAL_TABLE")
                && !HiveConf.getBoolVar(hiveConf, ConfVars.ALTERSCHEMAACTIVATEEXTTABLE)) {
            LOG.error("rename column error, db=" + dbName + ", tbl=" + tblName + ", newname="
                    + renameColDesc.getNewName());
            throw new MetaException("can not rename columns for a extenal table ");
        }

        if (!tblType.equalsIgnoreCase("EXTERNAL_TABLE") && tblFormat.equalsIgnoreCase("text")
                && (!HiveConf.getBoolVar(hiveConf, ConfVars.ALTERSCHEMAACTIVATETXTTABLE))) {
            LOG.error("rename column error, db=" + dbName + ", tbl=" + tblName + ", newname="
                    + renameColDesc.getNewName());
            throw new MetaException("can not rename columns for a text format table ");
        } else if (serdeLib.equals(ProtobufSerDe.class.getName())) {
            LOG.error("rename column error, db=" + dbName + ", tbl=" + tblName + ", newname="
                    + renameColDesc.getNewName());
            throw new MetaException("can not rename columns for a pb table ");
        } else if ((isPriPart && renameColDesc.getOldName().equalsIgnoreCase(priPartKey))
                || (isSubPart && renameColDesc.getOldName().equalsIgnoreCase(subPartKey))) {
            LOG.error("rename column error, db=" + dbName + ", tbl=" + tblName + ", newname="
                    + renameColDesc.getNewName());
            throw new MetaException("partition key can not be altered  ");
        }

        String modifyUser = renameColDesc.getUser();
        Map<String, String> tblParamMap = new HashMap<String, String>();
        ps = con.prepareStatement(
                "select param_key, param_value from table_params where tbl_id=? and param_type='TBL'");
        ps.setLong(1, tblID);
        ResultSet paramSet = ps.executeQuery();
        while (paramSet.next()) {
            tblParamMap.put(paramSet.getString(1), paramSet.getString(2));
        }
        paramSet.close();
        ps.close();
        boolean containTime = false;
        boolean contailUser = false;
        if (tblParamMap.containsKey("last_modified_time"))
            containTime = true;
        if (tblParamMap.containsKey("last_modified_by"))
            contailUser = true;

        if (containTime && contailUser) {
            ps = con.prepareStatement(
                    "update table_params set param_value=? where tbl_id=? and param_type='TBL' and param_key=?");
            ps.setString(1, String.valueOf(System.currentTimeMillis() / 1000));
            ps.setLong(2, tblID);
            ps.setString(3, "last_modified_time");
            ps.addBatch();
            ps.setString(1, modifyUser);
            ps.setLong(2, tblID);
            ps.setString(3, "last_modified_by");
            ps.addBatch();

            ps.executeBatch();
            ps.close();
        } else if (!containTime && !contailUser) {
            ps = con.prepareStatement("insert into table_params(tbl_id, param_type, param_key, param_value) "
                    + " values(?,?,?,?)");
            ps.setLong(1, tblID);
            ps.setString(2, "TBL");
            ps.setString(3, "last_modified_time");
            ps.setString(4, String.valueOf(System.currentTimeMillis() / 1000));
            ps.addBatch();

            ps.setLong(1, tblID);
            ps.setString(2, "TBL");
            ps.setString(3, "last_modified_by");
            ps.setString(4, modifyUser);

            ps.addBatch();

            ps.executeBatch();
            ps.close();
        } else if (containTime && !contailUser) {
            ps = con.prepareStatement(
                    "update table_params set param_value=? where tbl_id=? and param_type='TBL' and param_key=?");
            ps.setString(1, String.valueOf(System.currentTimeMillis() / 1000));
            ps.setLong(2, tblID);
            ps.setString(3, "last_modified_time");
            ps.addBatch();

            ps.executeBatch();
            ps.close();

            ps = con.prepareStatement("insert into table_params(tbl_id, param_type, param_key, param_value) "
                    + " values(?,?,?,?)");

            ps.setLong(1, tblID);
            ps.setString(2, "TBL");
            ps.setString(3, "last_modified_by");
            ps.setString(4, modifyUser);

            ps.addBatch();

            ps.executeBatch();
            ps.close();
        } else {
            ps = con.prepareStatement(
                    "update table_params set param_value=? where tbl_id=? and param_type='TBL' and param_key=?");

            ps.setString(1, modifyUser);
            ps.setLong(2, tblID);
            ps.setString(3, "last_modified_by");
            ps.addBatch();

            ps.executeBatch();
            ps.close();

            ps = con.prepareStatement("insert into table_params(tbl_id, param_type, param_key, param_value) "
                    + " values(?,?,?,?)");
            ps.setLong(1, tblID);
            ps.setString(2, "TBL");
            ps.setString(3, "last_modified_time");
            ps.setString(4, String.valueOf(System.currentTimeMillis() / 1000));
            ps.addBatch();

            ps.executeBatch();
            ps.close();
        }

        List<FieldSchema> oldCols = new ArrayList<FieldSchema>();

        String oldName = renameColDesc.getOldName();
        String newName = renameColDesc.getNewName();
        String type = renameColDesc.getType();
        String comment = renameColDesc.getComment();

        boolean colFind = false;

        Map<String, Long> colNameMap = new HashMap<String, Long>();

        long maxColIndex = 0;

        ps = con.prepareStatement("select column_index, column_name, type_name from "
                + "columns where tbl_id=? order by column_index asc");

        ps.setLong(1, tblID);

        ResultSet colSet = ps.executeQuery();

        while (colSet.next()) {
            FieldSchema field = new FieldSchema();
            field.setName(colSet.getString(2));
            field.setType(colSet.getString(3));
            oldCols.add(field);

            maxColIndex = colSet.getLong(1);
            colNameMap.put(colSet.getString(2), maxColIndex);
        }

        colSet.close();
        ps.close();

        Iterator<FieldSchema> iterOldCols = oldCols.iterator();
        while (iterOldCols.hasNext()) {
            FieldSchema col = iterOldCols.next();
            String oldColName = col.getName();

            if (oldColName.equalsIgnoreCase(newName) && !oldColName.equalsIgnoreCase(oldName)) {
                LOG.error("rename column error, db=" + dbName + ", tbl=" + tblName + ", newname="
                        + renameColDesc.getNewName());
                throw new MetaException("column " + newName + " is exists");
            }

            if (oldColName.equalsIgnoreCase(oldName)) {
                if (!checktype(col, type)) {
                    LOG.error("rename column error, db=" + dbName + ", tbl=" + tblName + ", newname="
                            + renameColDesc.getNewName());
                    throw new MetaException("column type " + col.getType() + " can not convert to " + type);
                }

                colFind = true;
            }
        }

        if (!colFind) {
            LOG.error("rename column error, db=" + dbName + ", tbl=" + tblName + ", newname="
                    + renameColDesc.getNewName());
            throw new MetaException("can not find column " + oldName);
        }

        if (type == null) {
            if (comment == null) {
                ps = con.prepareStatement(
                        "update columns set column_name=? " + " where tbl_id=? and column_name=?");
                ps.setString(1, newName.toLowerCase());
                ps.setLong(2, tblID);
                ps.setString(3, oldName);

                ps.executeUpdate();
                ps.close();
            } else {
                ps = con.prepareStatement(
                        "update columns set column_name=?, comment=? " + " where tbl_id=? and column_name=?");
                ps.setString(1, newName.toLowerCase());
                ps.setString(2, comment);
                ps.setLong(3, tblID);
                ps.setString(4, oldName);

                ps.executeUpdate();
                ps.close();
            }
        } else {
            if (comment == null) {
                ps = con.prepareStatement(
                        "update columns set column_name=?, type_name=? " + " where tbl_id=? and column_name=?");
                ps.setString(1, newName);
                ps.setString(2, type);
                ps.setLong(3, tblID);
                ps.setString(4, oldName);

                ps.executeUpdate();
                ps.close();
            } else {
                ps = con.prepareStatement("update columns set column_name=?, type_name=?, comment=? "
                        + " where tbl_id=? and column_name=?");
                ps.setString(1, newName);
                ps.setString(2, type);
                ps.setString(3, comment);
                ps.setLong(4, tblID);
                ps.setString(5, oldName);

                ps.executeUpdate();
                ps.close();
            }
        }

        con.commit();
        success = true;
    } catch (SQLException ex) {
        LOG.error("rename column error, db=" + dbName + ", tbl=" + tblName + ", newname="
                + renameColDesc.getNewName() + ", msg=" + ex.getMessage());
        ex.printStackTrace();
        throw new MetaException(ex.getMessage());
    } finally {
        if (!success) {
            try {
                con.rollback();
            } catch (SQLException e) {
            }
        }

        closeStatement(ps);
        closeConnection(con);
    }
    return;
}

From source file:org.apache.hadoop.hive.metastore.MyXid.java

@Override
public void createTable(Table tbl) throws InvalidObjectException, MetaException, AlreadyExistsException {

    if (tbl == null) {
        throw new InvalidObjectException("unvalid parameters, tbl is null");
    }// w w w .j  ava  2s .c o m

    if (tbl.getTableType() == null) {
        tbl.setTableType("MANAGED_TABLE");
    }

    if (tbl.getTableType().equalsIgnoreCase("VIRTUAL_VIEW")) {
        jdbcCreateView(tbl);
        return;
    }

    tbl.setDbName(tbl.getDbName().toLowerCase());
    tbl.setTableName(tbl.getTableName().toLowerCase());

    LOG.debug("first, check the name is valid or not");
    if (!MetaStoreUtils.validateName(tbl.getTableName())
            || !MetaStoreUtils.validateColNames(tbl.getSd().getCols())
            || (tbl.getPriPartition() != null
                    && !MetaStoreUtils.validateName(tbl.getPriPartition().getParKey().getName()))
            || (tbl.getSubPartition() != null
                    && !MetaStoreUtils.validateName(tbl.getSubPartition().getParKey().getName()))) {
        throw new InvalidObjectException(tbl.getTableName() + " is not a valid object name");
    }

    long tblID = genTblID(tbl.getDbName(), tbl.getTableName());

    boolean success = false;

    Connection con;
    PreparedStatement ps = null;
    Statement stmt = null;
    Path tblPath = null;
    Warehouse wh = new Warehouse(hiveConf);
    boolean madeDir = false;

    LOG.debug("2, generate table path ");

    if (tbl.getSd().getLocation() == null || tbl.getSd().getLocation().isEmpty()) {
        tblPath = wh.getDefaultTablePath(tbl.getDbName(), tbl.getTableName());
    } else {
        if (tbl.getTableType().equalsIgnoreCase("EXTERNAL_TABLE")) {
            LOG.warn("Location: " + tbl.getSd().getLocation() + "specified for non-external table:"
                    + tbl.getTableName());
        }

        tblPath = wh.getDnsPath(new Path(tbl.getSd().getLocation()));
    }
    tbl.getSd().setLocation(tblPath.toString());

    try {
        con = getSegmentConnection(tbl.getDbName());
    } catch (MetaStoreConnectException e1) {
        LOG.error("create table error, db=" + tbl.getDbName() + ", table=" + tbl.getTableName() + ", msg="
                + e1.getMessage());
        throw new MetaException(e1.getMessage());
    } catch (SQLException e1) {
        LOG.error("create table error, db=" + tbl.getDbName() + ", table=" + tbl.getTableName() + ", msg="
                + e1.getMessage());
        throw new MetaException(e1.getMessage());
    }

    try {
        con.setAutoCommit(false);
        con.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);

        stmt = con.createStatement();

        LOG.debug("1 check the table is exist or not");
        String sql = "select tbl_id from tbls where db_name='" + tbl.getDbName().toLowerCase()
                + "' and tbl_name='" + tbl.getTableName().toLowerCase() + "'";

        boolean isTblFind = false;
        ResultSet checkTblSet = stmt.executeQuery(sql);

        while (checkTblSet.next()) {
            isTblFind = true;
            break;
        }
        checkTblSet.close();

        if (isTblFind) {
            throw new AlreadyExistsException(
                    "table " + tbl.getDbName() + ":" + tbl.getTableName() + " has exist");
        }

        LOG.debug("2 insert into tbls");

        ps = con.prepareStatement("INSERT INTO TBLS(tbl_id, is_compressed, retention, tbl_type, db_name, "
                + "tbl_name, tbl_owner, tbl_format"
                + ", pri_part_type, sub_part_type, pri_part_key, sub_part_key, input_format, output_format"
                + ", serde_name, serde_lib, tbl_location, tbl_comment)"
                + " values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");

        StorageDescriptor sd = tbl.getSd();
        if (sd == null || sd.getSerdeInfo() == null) {
            throw new MetaException("storage descriptor of table " + tbl.getTableName() + " is null");
        }

        SerDeInfo sdInfo = sd.getSerdeInfo();

        ps.setLong(1, tblID);
        ps.setBoolean(2, sd.isCompressed());
        ps.setLong(3, tbl.getRetention());
        if (tbl.getParameters() != null && tbl.getParameters().get("EXTERNAL") != null
                && tbl.getParameters().get("EXTERNAL").equalsIgnoreCase("TRUE")) {
            ps.setString(4, "EXTERNAL_TABLE");
        } else {
            ps.setString(4, tbl.getTableType());
        }
        ps.setString(5, tbl.getDbName());
        ps.setString(6, tbl.getTableName());
        ps.setString(7, tbl.getOwner());

        if (tbl.getParameters() == null) {
            ps.setString(8, null);
        } else {
            ps.setString(8, tbl.getParameters().get("type"));
        }

        Partition priPart = tbl.getPriPartition();
        Partition subPart = tbl.getSubPartition();
        if (priPart != null) {
            ps.setString(11, priPart.getParKey().getName());
            ps.setString(9, priPart.getParType());
        } else {
            ps.setString(11, null);
            ps.setString(9, null);
        }

        if (subPart != null) {
            ps.setString(12, subPart.getParKey().getName());
            ps.setString(10, subPart.getParType());
        } else {
            ps.setString(12, null);
            ps.setString(10, null);
        }

        ps.setString(13, sd.getInputFormat());
        ps.setString(14, sd.getOutputFormat());
        ps.setString(15, sdInfo.getName());
        ps.setString(16, sdInfo.getSerializationLib());
        ps.setString(17, sd.getLocation());

        if (tbl.getParameters() == null) {
            ps.setString(18, null);
        } else {
            ps.setString(18, tbl.getParameters().get("comment"));
        }

        ps.executeUpdate();

        ps.close();

        LOG.debug("3 insert into partitions");
        if (priPart != null) {
            ps = con.prepareStatement(
                    "INSERT INTO PARTITIONS(level, tbl_id," + "part_name, part_values) values(?,?,?,?)");

            Map<String, List<String>> partSpaceMap = priPart.getParSpaces();

            for (Map.Entry<String, List<String>> entry : partSpaceMap.entrySet()) {
                ps.setInt(1, 0);
                ps.setLong(2, tblID);
                ps.setString(3, entry.getKey());
                if (entry.getValue() != null) {
                    Array spaceArray = con.createArrayOf("varchar", entry.getValue().toArray());
                    ps.setArray(4, spaceArray);
                } else {
                    ps.setArray(4, null);
                }

                ps.addBatch();
            }
            ps.executeBatch();
            ps.close();
        }

        if (subPart != null) {
            ps = con.prepareStatement(
                    "INSERT INTO PARTITIONS(level, tbl_id," + "part_name, part_values) values(?,?,?,?)");

            Map<String, List<String>> partSpaceMap = subPart.getParSpaces();

            for (Map.Entry<String, List<String>> entry : partSpaceMap.entrySet()) {
                ps.setInt(1, 1);
                ps.setLong(2, tblID);
                ps.setString(3, entry.getKey());

                if (entry.getValue() != null) {
                    Array spaceArray = con.createArrayOf("varchar", entry.getValue().toArray());
                    ps.setArray(4, spaceArray);
                } else {
                    ps.setArray(4, null);
                }

                ps.addBatch();
            }
            ps.executeBatch();
            ps.close();
        }

        LOG.debug("4 insert into columns");
        ps = con.prepareStatement("INSERT INTO COLUMNS(column_index, tbl_id, column_name, type_name, comment) "
                + " values(?,?,?,?,?)");

        List<FieldSchema> fieldList = sd.getCols();
        int fieldSize = fieldList.size();

        for (int i = 0; i < fieldSize; i++) {
            FieldSchema field = fieldList.get(i);
            ps.setInt(1, i);
            ps.setLong(2, tblID);
            ps.setString(3, field.getName().toLowerCase());
            ps.setString(4, field.getType());
            ps.setString(5, field.getComment());

            ps.addBatch();
        }

        ps.executeBatch();
        ps.close();

        LOG.debug("5  insert into parameters");

        boolean createExtDirIfNotExist = true;
        if (tbl.getParametersSize() > 0) {
            String createExtDirIfNotExistStr = tbl.getParameters().get("hive.exttable.createdir.ifnotexist");
            LOG.info("XXcreateExtDirIfNotExistStr=" + createExtDirIfNotExistStr);
            if (createExtDirIfNotExistStr != null && createExtDirIfNotExistStr.equalsIgnoreCase("false")) {
                createExtDirIfNotExist = false;
            }
            tbl.getParameters().remove("hive.exttable.createdir.ifnotexist");
        }

        if (tbl.getParametersSize() > 0 || sd.getParametersSize() > 0
                || sd.getSerdeInfo().getParametersSize() > 0 || sd.getNumBuckets() > -1) {
            ps = con.prepareStatement("insert into table_params(tbl_id, param_type, param_key, param_value) "
                    + " values(?,?,?,?)");
            if (tbl.getParametersSize() > 0) {

                for (Map.Entry<String, String> entry : tbl.getParameters().entrySet()) {
                    if (entry.getKey().equalsIgnoreCase("type") || entry.getKey().equalsIgnoreCase("comment"))
                        continue;
                    ps.setLong(1, tblID);
                    ps.setString(2, "TBL");
                    ps.setString(3, entry.getKey());
                    ps.setString(4, entry.getValue());

                    ps.addBatch();
                }
            }

            if (sd.getParametersSize() > 0) {
                for (Map.Entry<String, String> entry : sd.getParameters().entrySet()) {
                    ps.setLong(1, tblID);
                    ps.setString(2, "SD");
                    ps.setString(3, entry.getKey());
                    ps.setString(4, entry.getValue());

                    ps.addBatch();
                }
            }

            if (sd.getSerdeInfo().getParametersSize() > 0) {
                for (Map.Entry<String, String> entry : sd.getSerdeInfo().getParameters().entrySet()) {
                    ps.setLong(1, tblID);
                    ps.setString(2, "SERDE");
                    ps.setString(3, entry.getKey());
                    ps.setString(4, entry.getValue());

                    ps.addBatch();
                }
            }

            if (sd.getNumBuckets() > -1) {
                ps.setLong(1, tblID);
                ps.setString(2, "SD");
                ps.setString(3, "NUM_BUCKETS");
                ps.setString(4, String.valueOf(sd.getNumBuckets()));
                ps.addBatch();
            }

            ps.executeBatch();
            ps.close();
        }

        if (tbl.getSd().getBucketCols() != null && !tbl.getSd().getBucketCols().isEmpty()) {
            ps = con.prepareStatement(
                    "insert into bucket_cols(tbl_id, bucket_col_name, col_index) values(?,?,?)");
            int index = 0;
            for (String col : tbl.getSd().getBucketCols()) {
                ps.setLong(1, tblID);
                ps.setString(2, col.toLowerCase());
                ps.setInt(3, index);
                index++;
                ps.addBatch();
            }

            ps.executeBatch();
            ps.close();
        }

        if (tbl.getSd().getSortCols() != null && !tbl.getSd().getSortCols().isEmpty()) {
            ps = con.prepareStatement(
                    "insert into sort_cols(tbl_id, sort_column_name, sort_order, col_index) values(?,?,?,?)");
            int index = 0;
            for (Order o : tbl.getSd().getSortCols()) {
                ps.setLong(1, tblID);
                ps.setString(2, o.getCol());
                ps.setInt(3, o.getOrder());
                ps.setInt(4, index);
                index++;
                ps.addBatch();
            }

            ps.executeBatch();
            ps.close();
        }

        LOG.debug("make hdfs directory for table");

        if (createExtDirIfNotExist && tblPath != null) {
            if (!wh.isDir(tblPath)) {
                if (!wh.mkdirs(tblPath)) {
                    throw new MetaException(tblPath + " is not a directory or unable to create one");
                }
                madeDir = true;
            }

            if (tbl.getPriPartition() != null) {
                Set<String> priPartNames = tbl.getPriPartition().getParSpaces().keySet();

                Set<String> subPartNames = null;
                if (tbl.getSubPartition() != null) {
                    subPartNames = tbl.getSubPartition().getParSpaces().keySet();
                }

                List<Path> partPaths = Warehouse.getPartitionPaths(tblPath, priPartNames, subPartNames);

                for (Path partPath : partPaths) {
                    if (!wh.mkdirs(partPath)) {
                        throw new MetaException(
                                "Partition path " + partPath + " is not a directory or unable to create one.");
                    }
                }
            }
        }

        con.commit();

        success = true;
    } catch (SQLException sqlex) {
        LOG.error("create table error db=" + tbl.getDbName() + ", table=" + tbl.getTableName() + ",msg="
                + sqlex.getMessage());
        sqlex.printStackTrace();
        throw new MetaException(sqlex.getMessage());
    } finally {
        if (!success) {
            try {
                con.rollback();
            } catch (SQLException e) {
            }

            if (madeDir) {
                wh.deleteDir(tblPath, true);
            }
        }

        closeStatement(stmt);
        closeStatement(ps);
        closeConnection(con);
    }

    return;
}