// Path: cango-instance/src/main/java/com/bella/cango/instance/oracle/common/utils/LikeUtil.java
// public class LikeUtil {
// 
//     public static String[] regexSpecialChars = {"<", ">", "^", "$", "\\", "/", ";", "(", ")", "?", ".",
//             "*", "[", "]", "+", "|"};
//     public static String escapse = "\\";
// 
//     private static Map<String, Pattern> patterns = MigrateMap.makeComputingMap(new MapMaker(),
//             new Function<String, Pattern>() {
// 
//                 public Pattern apply(String pattern) {
//                     try {
//                         return Pattern.compile(buildPattern(pattern,
//                                         escapse),
//                                 Pattern.CASE_INSENSITIVE);
//                     } catch (Throwable e) {
//                         throw new YuGongException(e);
//                     }
//                 }
//             });
// 
//     public static boolean isMatch(String pattern, String value) {
//         if (StringUtils.equalsIgnoreCase(pattern, value)) {
//             return true;
//         } else if (StringUtils.isEmpty(value)) {
//             return false;
//         } else if (StringUtils.isEmpty(pattern)) {
//             return false;
//         }
// 
//         Pattern pat = patterns.get(pattern);
//         Matcher m = pat.matcher(value);
//         return m.matches();
//     }
// 
//     private static String buildPattern(String pattern, String escape) {
//         char esc = escape.charAt(0);
//         pattern = StringUtils.trim(pattern);
//         StringBuilder builder = new StringBuilder("^");
//         int index = 0, last = 0;
//         while (true) {
//             // 查找esc
//             index = pattern.indexOf(esc, last);
//             if (index == -1 || index >= pattern.length()) {
//                 if (last < pattern.length()) {
//                     builder.append(convertWildcard(ripRegex(pattern.substring(last))));
//                 }
//                 break;
//             }
//             if (index > 0) {
//                 String toRipRegex = StringUtils.substring(pattern, last, index);
//                 builder.append(convertWildcard(ripRegex(toRipRegex)));
//                 last = index;
//             }
//             if (index + 1 < pattern.length()) {
//                 builder.append(ripRegex(pattern.charAt(index + 1)));
//                 last = index + 2;
//             } else {
//                 builder.append(pattern.charAt(index));
//                 last = index + 1;
//             }
//             if (last >= pattern.length()) {
//                 break;
//             }
//         }
//         builder.append('$');
//         return builder.toString();
//     }
// 
//     private static String ripRegex(char toRip) {
//         char[] chars = new char[1];
//         chars[0] = toRip;
//         return ripRegex(new String(chars));
//     }
// 
//     private static String ripRegex(String toRip) {
//         for (String c : regexSpecialChars) {
//             toRip = StringUtils.replace(toRip, c, "\\" + c);
//         }
// 
//         return toRip;
//     }
// 
//     private static String convertWildcard(String toConvert) {
//         toConvert = StringUtils.replace(toConvert, "_", "(.)");
//         toConvert = StringUtils.replace(toConvert, "%", "(.*)");
//         return toConvert;
//     }
// }
// 
// Path: cango-instance/src/main/java/com/bella/cango/instance/oracle/exception/YuGongException.java
// public class YuGongException extends NestableRuntimeException {
// 
//     private static final long serialVersionUID = -654893533794556357L;
// 
//     public YuGongException(String errorCode) {
//         super(errorCode);
//     }
// 
//     public YuGongException(String errorCode, Throwable cause) {
//         super(errorCode, cause);
//     }
// 
//     public YuGongException(String errorCode, String errorDesc) {
//         super(errorCode + ":" + errorDesc);
//     }
// 
//     public YuGongException(String errorCode, String errorDesc, Throwable cause) {
//         super(errorCode + ":" + errorDesc, cause);
//     }
// 
//     public YuGongException(Throwable cause) {
//         super(cause);
//     }
// 
// 
// }


import com.bella.cango.instance.oracle.common.utils.LikeUtil;
import com.bella.cango.instance.oracle.exception.YuGongException;
import com.google.common.collect.Lists;
import org.apache.commons.lang.StringUtils;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.ConnectionCallback;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementCallback;
import org.springframework.jdbc.support.JdbcUtils;
import javax.sql.DataSource;
import java.sql.*;
import java.util.*;
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
        return (Table) jdbcTemplate.execute(new ConnectionCallback() {

            public Object doInConnection(Connection conn) throws SQLException, DataAccessException {
                DatabaseMetaData metaData = conn.getMetaData();
                String sName = getIdentifierName(schemaName, metaData);
                String tName = getIdentifierName(tableName, metaData);

                ResultSet rs = null;
                Table table;
                try {
                    rs = metaData.getTables(sName, sName, tName, new String[]{"TABLE"});
                    table = null;
                    while (rs.next()) {
                        String catlog = rs.getString(1);
                        String schema = rs.getString(2);
                        String name = rs.getString(3);
                        String type = rs.getString(4);

                        if ((sName == null || LikeUtil.isMatch(sName, catlog) || LikeUtil.isMatch(sName, schema))
                                && LikeUtil.isMatch(tName, name)) {
                            table = new Table(type, StringUtils.isEmpty(catlog) ? schema : catlog, name);
                            break;
                        }
                    }
                } finally {
                    JdbcUtils.closeResultSet(rs);
                }

                if (table == null) {
// Path: cango-instance/src/main/java/com/bella/cango/instance/oracle/common/utils/LikeUtil.java
// public class LikeUtil {
// 
//     public static String[] regexSpecialChars = {"<", ">", "^", "$", "\\", "/", ";", "(", ")", "?", ".",
//             "*", "[", "]", "+", "|"};
//     public static String escapse = "\\";
// 
//     private static Map<String, Pattern> patterns = MigrateMap.makeComputingMap(new MapMaker(),
//             new Function<String, Pattern>() {
// 
//                 public Pattern apply(String pattern) {
//                     try {
//                         return Pattern.compile(buildPattern(pattern,
//                                         escapse),
//                                 Pattern.CASE_INSENSITIVE);
//                     } catch (Throwable e) {
//                         throw new YuGongException(e);
//                     }
//                 }
//             });
// 
//     public static boolean isMatch(String pattern, String value) {
//         if (StringUtils.equalsIgnoreCase(pattern, value)) {
//             return true;
//         } else if (StringUtils.isEmpty(value)) {
//             return false;
//         } else if (StringUtils.isEmpty(pattern)) {
//             return false;
//         }
// 
//         Pattern pat = patterns.get(pattern);
//         Matcher m = pat.matcher(value);
//         return m.matches();
//     }
// 
//     private static String buildPattern(String pattern, String escape) {
//         char esc = escape.charAt(0);
//         pattern = StringUtils.trim(pattern);
//         StringBuilder builder = new StringBuilder("^");
//         int index = 0, last = 0;
//         while (true) {
//             // 查找esc
//             index = pattern.indexOf(esc, last);
//             if (index == -1 || index >= pattern.length()) {
//                 if (last < pattern.length()) {
//                     builder.append(convertWildcard(ripRegex(pattern.substring(last))));
//                 }
//                 break;
//             }
//             if (index > 0) {
//                 String toRipRegex = StringUtils.substring(pattern, last, index);
//                 builder.append(convertWildcard(ripRegex(toRipRegex)));
//                 last = index;
//             }
//             if (index + 1 < pattern.length()) {
//                 builder.append(ripRegex(pattern.charAt(index + 1)));
//                 last = index + 2;
//             } else {
//                 builder.append(pattern.charAt(index));
//                 last = index + 1;
//             }
//             if (last >= pattern.length()) {
//                 break;
//             }
//         }
//         builder.append('$');
//         return builder.toString();
//     }
// 
//     private static String ripRegex(char toRip) {
//         char[] chars = new char[1];
//         chars[0] = toRip;
//         return ripRegex(new String(chars));
//     }
// 
//     private static String ripRegex(String toRip) {
//         for (String c : regexSpecialChars) {
//             toRip = StringUtils.replace(toRip, c, "\\" + c);
//         }
// 
//         return toRip;
//     }
// 
//     private static String convertWildcard(String toConvert) {
//         toConvert = StringUtils.replace(toConvert, "_", "(.)");
//         toConvert = StringUtils.replace(toConvert, "%", "(.*)");
//         return toConvert;
//     }
// }
// 
// Path: cango-instance/src/main/java/com/bella/cango/instance/oracle/exception/YuGongException.java
// public class YuGongException extends NestableRuntimeException {
// 
//     private static final long serialVersionUID = -654893533794556357L;
// 
//     public YuGongException(String errorCode) {
//         super(errorCode);
//     }
// 
//     public YuGongException(String errorCode, Throwable cause) {
//         super(errorCode, cause);
//     }
// 
//     public YuGongException(String errorCode, String errorDesc) {
//         super(errorCode + ":" + errorDesc);
//     }
// 
//     public YuGongException(String errorCode, String errorDesc, Throwable cause) {
//         super(errorCode + ":" + errorDesc, cause);
//     }
// 
//     public YuGongException(Throwable cause) {
//         super(cause);
//     }
// 
// 
// }


// Path: cango-instance/src/main/java/com/bella/cango/instance/oracle/common/db/meta/TableMetaGenerator.java
import com.bella.cango.instance.oracle.common.utils.LikeUtil;
import com.bella.cango.instance.oracle.exception.YuGongException;
import com.google.common.collect.Lists;
import org.apache.commons.lang.StringUtils;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.ConnectionCallback;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementCallback;
import org.springframework.jdbc.support.JdbcUtils;
import javax.sql.DataSource;
import java.sql.*;
import java.util.*;

        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
        return (Table) jdbcTemplate.execute(new ConnectionCallback() {

            public Object doInConnection(Connection conn) throws SQLException, DataAccessException {
                DatabaseMetaData metaData = conn.getMetaData();
                String sName = getIdentifierName(schemaName, metaData);
                String tName = getIdentifierName(tableName, metaData);

                ResultSet rs = null;
                Table table;
                try {
                    rs = metaData.getTables(sName, sName, tName, new String[]{"TABLE"});
                    table = null;
                    while (rs.next()) {
                        String catlog = rs.getString(1);
                        String schema = rs.getString(2);
                        String name = rs.getString(3);
                        String type = rs.getString(4);

                        if ((sName == null || LikeUtil.isMatch(sName, catlog) || LikeUtil.isMatch(sName, schema))
                                && LikeUtil.isMatch(tName, name)) {
                            table = new Table(type, StringUtils.isEmpty(catlog) ? schema : catlog, name);
                            break;
                        }
                    }
                } finally {
                    JdbcUtils.closeResultSet(rs);
                }

                if (table == null) {
                    throw new YuGongException("table[" + schemaName + "." + tableName + "] is not found");