001package gudusoft.gsqlparser.util;
002
003import gudusoft.gsqlparser.EDbVendor;
004import gudusoft.gsqlparser.dlineage.dataflow.model.ModelBindingManager;
005import gudusoft.gsqlparser.dlineage.dataflow.model.SubType;
006import gudusoft.gsqlparser.dlineage.dataflow.model.xml.table;
007import gudusoft.gsqlparser.sqlenv.ESQLDataObjectType;
008import gudusoft.gsqlparser.sqlenv.TSQLEnv;
009
010import java.io.*;
011import java.nio.charset.Charset;
012import java.security.MessageDigest;
013import java.util.ArrayList;
014import java.util.Arrays;
015import java.util.Collections;
016import java.util.List;
017
018public class SQLUtil {
019    private static final Logger logger = LoggerFactory.getLogger(SQLUtil.class);
020
021    public static boolean isEmpty(String value) {
022        return value == null || value.trim().length() == 0;
023    }
024
025    public static String getFileContent(File file) {
026        String charset = null;
027        String sqlfilename = file.getAbsolutePath();
028        int read = 0;
029        try {
030            FileInputStream fr = new FileInputStream(sqlfilename);
031            byte[] bom = new byte[4];
032            fr.read(bom, 0, bom.length);
033
034            if ((bom[0] == (byte) 0x00) && (bom[1] == (byte) 0x00) && (bom[2] == (byte) 0xFE)
035                    && (bom[3] == (byte) 0xFF)) {
036                charset = "UTF-32BE";
037                read = 4;
038            } else if ((bom[0] == (byte) 0xFF) && (bom[1] == (byte) 0xFE) && (bom[2] == (byte) 0x00)
039                    && (bom[3] == (byte) 0x00)) {
040                charset = "UTF-32LE";
041                read = 4;
042            } else if ((bom[0] == (byte) 0xEF) && (bom[1] == (byte) 0xBB) && (bom[2] == (byte) 0xBF)) {
043                charset = "UTF-8";
044                read = 3;
045            } else if ((bom[0] == (byte) 0xFE) && (bom[1] == (byte) 0xFF)) {
046                charset = "UTF-16BE";
047                read = 2;
048            } else if ((bom[0] == (byte) 0xFF) && (bom[1] == (byte) 0xFE)) {
049                charset = "UTF-16LE";
050                read = 2;
051            } else {
052                charset = "UTF-8";
053                read = 0;
054            }
055
056            fr.close();
057        } catch (IOException e) {
058            logger.error("Check file encoding failed.", e);
059        }
060
061        Long filelength = file.length();
062        byte[] filecontent = new byte[filelength.intValue()];
063        try {
064            InputStream in = new BufferedInputStream(new FileInputStream(sqlfilename));
065            in.read(filecontent);
066            in.close();
067        } catch (IOException e) {
068            logger.error("read file content failed.", e);
069        }
070
071        byte[] content = new byte[filelength.intValue() - read];
072        System.arraycopy(filecontent, read, content, 0, content.length);
073
074        try {
075            String fileContent = new String(content, charset == null ? Charset.defaultCharset().name() : charset);
076            return fileContent.replace((char) 160, (char) 32);
077        } catch (UnsupportedEncodingException e) {
078            logger.error("The OS does not support " + charset == null ? Charset.defaultCharset().name() : charset, e);
079            return null;
080        }
081    }
082
083    public static String getInputStreamContent(InputStream is, boolean close) {
084        try {
085            ByteArrayOutputStream out = new ByteArrayOutputStream(4096);
086            byte[] tmp = new byte[4096];
087            while (true) {
088                int r = is.read(tmp);
089                if (r == -1)
090                    break;
091                out.write(tmp, 0, r);
092            }
093            byte[] bytes = out.toByteArray();
094            if (close) {
095                is.close();
096            }
097            out.close();
098            String content = new String(bytes);
099            return content;
100        } catch (IOException e) {
101            logger.error("read inputStream failed.", e);
102        }
103        return null;
104    }
105
106    public static String getFileContent(String filePath) {
107        if (filePath == null)
108            return "";
109        File file = new File(filePath);
110        if (!file.exists() || file.isDirectory())
111            return "";
112        return getFileContent(file);
113    }
114
115    public static String trimColumnStringQuote(String string) {
116        try {
117            if (string == null)
118                return string;
119
120            if (string.indexOf('.') != -1) {
121                List<String> splits = parseNames(string);
122                if (splits.size() > 1) {
123                    StringBuilder buffer = new StringBuilder();
124                    for (int i = 0; i < splits.size(); i++) {
125                        String segment = splits.get(i);
126                        if (parseNames(trimColumnStringQuote(segment)).size() > 1) {
127                            buffer.append(segment);
128                        } else {
129                            buffer.append(trimColumnStringQuote(segment));
130                        }
131                        if (i < splits.size() - 1) {
132                            buffer.append(".");
133                        }
134                    }
135                    string = buffer.toString();
136                    return string;
137                }
138            }
139            if (string.length() < 2) {
140                return string;
141            }
142            if (string.startsWith("'") && string.endsWith("'"))
143                return string.substring(1, string.length() - 1);
144            else if (string.startsWith("\"") && string.endsWith("\""))
145                return string.substring(1, string.length() - 1);
146            else if (string.startsWith("`") && string.endsWith("`"))
147                return string.substring(1, string.length() - 1);
148            else if (string.startsWith("[") && string.endsWith("]"))
149                return string.substring(1, string.length() - 1);
150            return string;
151        }catch (Exception e){
152            return string;
153        }
154    }
155
156//    public static List<String> parseNames(String nameString, EDbVendor vendor) {
157//        List<String> names = new ArrayList<String>();
158//        if (nameString.startsWith("`") && nameString.endsWith("`")){
159//            nameString = nameString.substring(1,nameString.length()-1);
160//        }
161//        String[] splits = nameString.trim().split("\\.");
162//
163//        for (int i = 0; i < splits.length; i++) {
164//            String split = splits[i].trim();
165//            if (TSQLEnv.isDelimitedIdentifier(vendor, split) && !TSQLEnv.endsWithDelimitedIdentifier(vendor, split)) {
166//                StringBuilder buffer = new StringBuilder();
167//                buffer.append(splits[i]);
168//                while (i < splits.length - 1
169//                        && !TSQLEnv.endsWithDelimitedIdentifier(vendor, split = splits[++i].trim())) {
170//                    buffer.append(".");
171//                    buffer.append(splits[i]);
172//                }
173//
174//                buffer.append(".");
175//                buffer.append(splits[i]);
176//
177//                names.add(buffer.toString());
178//                continue;
179//            }
180//            names.add(splits[i]);
181//        }
182//        return names;
183//    }
184
185    public static List<String> parseNames(String nameString) {
186        return parseNames(nameString, null);
187    }
188
189    // Pre-compiled patterns for better performance
190    private static final java.util.regex.Pattern DOT_PATTERN = java.util.regex.Pattern.compile("\\s*\\.\\s*");
191
192    public static List<String> parseNames(String nameString, EDbVendor vendor) {
193        if(nameString == null){
194            return Collections.EMPTY_LIST;
195        }
196        String name = nameString.trim();
197        List<String> names = new ArrayList<String>();
198        if (vendor == EDbVendor.dbvbigquery) {
199            if (name.contains("`")) {
200                // Use pre-compiled pattern and avoid unnecessary array creation
201                String[] parts = DOT_PATTERN.split(name.replace("`", ""));
202                for (String part : parts) {
203                    names.add(part);
204                }
205                return names;
206            }
207        }
208        try {
209            // Use pre-compiled pattern instead of creating a new one each time
210            String[] splits = DOT_PATTERN.split(nameString);
211            if (name.contains("'")) {
212                for (int i = 0; i < splits.length; i++) {
213                    String split = splits[i].trim();
214                    if (split.startsWith("'") && !split.endsWith("'")) {
215                        StringBuilder buffer = new StringBuilder(split.length() * 2);
216                        buffer.append(splits[i]);
217                        while (!(split = splits[++i].trim()).endsWith("'")) {
218                            buffer.append(".");
219                            buffer.append(splits[i]);
220                            if (i == splits.length - 1) {
221                                break;
222                            }
223                        }
224
225                        buffer.append(".");
226                        buffer.append(splits[i]);
227
228                        names.add(buffer.toString());
229                        continue;
230                    }
231                    names.add(splits[i]);
232                }
233            } else if (name.contains("(")) {
234                for (int i = 0; i < splits.length; i++) {
235                    String split = splits[i].trim();
236                    if (split.indexOf("(") != -1 && split.indexOf(")") == -1) {
237                        StringBuilder buffer = new StringBuilder(split.length() * 2);
238                        buffer.append(splits[i]);
239                        while ((split = splits[++i].trim()).indexOf(")")==-1) {
240                            buffer.append(".");
241                            buffer.append(splits[i]);
242                            if (i == splits.length - 1) {
243                                break;
244                            }
245                        }
246
247                        buffer.append(".");
248                        buffer.append(splits[i]);
249
250                        names.add(buffer.toString());
251                        continue;
252                    }
253                    names.add(splits[i]);
254                }
255            } else if (name.contains("`")) {
256                for (int i = 0; i < splits.length; i++) {
257                    String split = splits[i].trim();
258                    if (split.startsWith("`") && !split.endsWith("`")) {
259                        StringBuilder buffer = new StringBuilder(split.length() * 2);
260                        buffer.append(splits[i]);
261                        while (!(split = splits[++i].trim()).endsWith("`")) {
262                            buffer.append(".");
263                            buffer.append(splits[i]);
264                            if (i == splits.length - 1) {
265                                break;
266                            }
267                        }
268
269                        buffer.append(".");
270                        buffer.append(splits[i]);
271
272                        names.add(buffer.toString());
273                        continue;
274                    }
275                    names.add(splits[i]);
276                }
277            } else if (name.contains("\"")) {
278                for (int i = 0; i < splits.length; i++) {
279                    String split = splits[i].trim();
280                    if (split.startsWith("\"") && !split.endsWith("\"")) {
281                        StringBuilder buffer = new StringBuilder(split.length() * 2);
282                        buffer.append(splits[i]);
283                        while (!(split = splits[++i].trim()).endsWith("\"")) {
284                            buffer.append(".");
285                            buffer.append(splits[i]);
286                            if (i == splits.length - 1) {
287                                break;
288                            }
289                        }
290
291                        buffer.append(".");
292                        buffer.append(splits[i]);
293
294                        names.add(buffer.toString());
295                        continue;
296                    }
297                    names.add(splits[i]);
298                }
299            } else if ((name.contains("[") && name.contains("]"))) {
300                for (int i = 0; i < splits.length; i++) {
301                    String split = splits[i].trim();
302                    if (split.startsWith("[") && !split.endsWith("]")) {
303                        StringBuilder buffer = new StringBuilder(split.length() * 2);
304                        buffer.append(splits[i]);
305                        if (i < splits.length - 1) {
306                            while (!(split = splits[++i].trim()).endsWith("]")) {
307                                buffer.append(".");
308                                buffer.append(splits[i]);
309                                if (i == splits.length - 1) {
310                                    break;
311                                }
312                            }
313                        }
314
315                        buffer.append(".");
316                        buffer.append(splits[i]);
317
318                        names.add(buffer.toString());
319                        continue;
320                    }
321                    names.add(splits[i]);
322                }
323            } else {
324                // Avoid unnecessary object creation from Arrays.asList
325                for (String split : splits) {
326                    names.add(split);
327                }
328            }
329        } catch (Throwable e) {
330            names.clear();
331            names.add(nameString);
332        }
333        return names;
334    }
335        
336        public static void main(String[] args) {
337                SQLUtil.parseNames("OPENJSON(aptd.test.ActiviteTypeIDs)");
338        }
339
340    public static void writeToFile(File file, InputStream source, boolean close) {
341        BufferedInputStream bis = null;
342        BufferedOutputStream fouts = null;
343        try {
344            bis = new BufferedInputStream(source);
345            if (!file.exists()) {
346                if (!file.getParentFile().exists()) {
347                    file.getParentFile().mkdirs();
348                }
349                file.createNewFile();
350            }
351            fouts = new BufferedOutputStream(new FileOutputStream(file));
352            byte b[] = new byte[1024];
353            int i = 0;
354            while ((i = bis.read(b)) != -1) {
355                fouts.write(b, 0, i);
356            }
357            fouts.flush();
358            fouts.close();
359            if (close)
360                bis.close();
361        } catch (IOException e) {
362            logger.error("Write file failed.", e);
363            try {
364                if (fouts != null)
365                    fouts.close();
366            } catch (IOException f) {
367                logger.error("Close output stream failed.", f);
368            }
369            if (close) {
370                try {
371                    if (bis != null)
372                        bis.close();
373                } catch (IOException f) {
374                    logger.error("Close input stream failed.", f);
375                }
376            }
377        }
378    }
379
380    public static void writeToFile(File file, String string) throws IOException {
381
382        if (!file.exists()) {
383            if (!file.getParentFile().exists()) {
384                file.getParentFile().mkdirs();
385            }
386            file.createNewFile();
387        }
388        PrintWriter out = new PrintWriter(new OutputStreamWriter(new FileOutputStream(file)));
389        if (string != null)
390            out.print(string);
391        out.close();
392    }
393
394    public static void appendToFile(File file, String string) throws IOException {
395
396        if (!file.exists()) {
397            if (!file.getParentFile().exists()) {
398                file.getParentFile().mkdirs();
399            }
400            file.createNewFile();
401        }
402        PrintWriter out = new PrintWriter(new OutputStreamWriter(new FileOutputStream(file, true)));
403        if (string != null)
404            out.println(string);
405        out.close();
406    }
407
408    public static void deltree(File root) {
409        if (root == null || !root.exists()) {
410            return;
411        }
412
413        if (root.isFile()) {
414            root.delete();
415            return;
416        }
417
418        File[] children = root.listFiles();
419        if (children != null) {
420            for (int i = 0; i < children.length; i++) {
421                deltree(children[i]);
422            }
423        }
424
425        root.delete();
426    }
427
428    /**
429     * @param file the filePath
430     * @return the UTFFileHandler.UnicodeInputStream
431     */
432    public static InputStream getInputStreamWithoutBom(String file) throws IOException {
433        UnicodeInputStream stream = null;
434        FileInputStream fis = new FileInputStream(file);
435        stream = new UnicodeInputStream(fis, null);
436        return stream;
437    }
438
439    /**
440     * This inputstream will recognize unicode BOM marks and will skip bytes if
441     * getEncoding() method is called before any of the read(...) methods.
442     * <p>
443     * Usage pattern: String enc = "ISO-8859-1"; // or NULL to use systemdefault
444     * FileInputStream fis = new FileInputStream(file); UnicodeInputStream uin =
445     * new UnicodeInputStream(fis, enc); enc = uin.getEncoding(); // check and
446     * skip possible BOM bytes InputStreamReader in; if (enc == null) in = new
447     * InputStreamReader(uin); else in = new InputStreamReader(uin, enc);
448     */
449    public static class UnicodeInputStream extends InputStream {
450        PushbackInputStream internalIn;
451        boolean isInited = false;
452        String defaultEnc;
453        String encoding;
454
455        private static final int BOM_SIZE = 4;
456
457        public UnicodeInputStream(InputStream in, String defaultEnc) {
458            internalIn = new PushbackInputStream(in, BOM_SIZE);
459            this.defaultEnc = defaultEnc;
460        }
461
462        public String getDefaultEncoding() {
463            return defaultEnc;
464        }
465
466        public String getEncoding() {
467            if (!isInited) {
468                try {
469                    init();
470                } catch (IOException ex) {
471                    IllegalStateException ise = new IllegalStateException("Init method failed.");
472                    ise.initCause(ise);
473                    throw ise;
474                }
475            }
476            return encoding;
477        }
478
479        /**
480         * Read-ahead four bytes and check for BOM marks. Extra bytes are unread
481         * back to the stream, only BOM bytes are skipped.
482         */
483        protected void init() throws IOException {
484            if (isInited)
485                return;
486
487            byte bom[] = new byte[BOM_SIZE];
488            int n, unread;
489            n = internalIn.read(bom, 0, bom.length);
490
491            if ((bom[0] == (byte) 0x00) && (bom[1] == (byte) 0x00) && (bom[2] == (byte) 0xFE)
492                    && (bom[3] == (byte) 0xFF)) {
493                encoding = "UTF-32BE";
494                unread = n - 4;
495            } else if ((bom[0] == (byte) 0xFF) && (bom[1] == (byte) 0xFE) && (bom[2] == (byte) 0x00)
496                    && (bom[3] == (byte) 0x00)) {
497                encoding = "UTF-32LE";
498                unread = n - 4;
499            } else if ((bom[0] == (byte) 0xEF) && (bom[1] == (byte) 0xBB) && (bom[2] == (byte) 0xBF)) {
500                encoding = "UTF-8";
501                unread = n - 3;
502            } else if ((bom[0] == (byte) 0xFE) && (bom[1] == (byte) 0xFF)) {
503                encoding = "UTF-16BE";
504                unread = n - 2;
505            } else if ((bom[0] == (byte) 0xFF) && (bom[1] == (byte) 0xFE)) {
506                encoding = "UTF-16LE";
507                unread = n - 2;
508            } else {
509                encoding = defaultEnc;
510                unread = n;
511            }
512
513            if (unread > 0)
514                internalIn.unread(bom, (n - unread), unread);
515
516            isInited = true;
517        }
518
519        public void close() throws IOException {
520            internalIn.close();
521        }
522
523        public int read() throws IOException {
524            return internalIn.read();
525        }
526    }
527
528    public static boolean compareIdentifier(EDbVendor dbVendor, ESQLDataObjectType sqlDataObjectType,
529                                            String identifier1, String identifier2) {
530        List<String> segments1 = parseNames(identifier1);
531        List<String> segments2 = parseNames(identifier2);
532
533        if (segments1.size() != segments2.size())
534            return false;
535
536        boolean supportCatalog = TSQLEnv.supportCatalog(dbVendor);
537        boolean supportSchema = TSQLEnv.supportSchema(dbVendor);
538
539        if(supportCatalog && supportSchema) {
540            if (sqlDataObjectType == ESQLDataObjectType.dotColumn) {
541                if (segments1.size() > 4) {
542                    return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotCatalog, segments1.get(0),
543                            segments2.get(0))
544                            && TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotSchema, segments1.get(1),
545                            segments2.get(1))
546                            && TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotTable, segments1.get(2),
547                            segments2.get(2))
548                            && TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotColumn, mergeSegments(segments1, 3),
549                            mergeSegments(segments2, 3));
550                } else if (segments1.size() == 4) {
551                    return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotCatalog, segments1.get(0),
552                            segments2.get(0))
553                            && TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotSchema, segments1.get(1),
554                            segments2.get(1))
555                            && TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotTable, segments1.get(2),
556                            segments2.get(2))
557                            && TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotColumn, segments1.get(3),
558                            segments2.get(3));
559                } else if (segments1.size() == 3) {
560                    return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotSchema, segments1.get(0),
561                            segments2.get(0))
562                            && TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotTable, segments1.get(1),
563                            segments2.get(1))
564                            && TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotColumn, segments1.get(2),
565                            segments2.get(2));
566                } else if (segments1.size() == 2) {
567                    return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotTable, segments1.get(0),
568                            segments2.get(0))
569                            && TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotColumn, segments1.get(1),
570                            segments2.get(1));
571                } else if (segments1.size() == 1) {
572                    return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotColumn, segments1.get(0),
573                            segments2.get(0));
574                }
575            } else if (sqlDataObjectType == ESQLDataObjectType.dotTable
576                    || sqlDataObjectType == ESQLDataObjectType.dotOraclePackage
577                    || sqlDataObjectType == ESQLDataObjectType.dotFunction
578                    || sqlDataObjectType == ESQLDataObjectType.dotProcedure
579                    || sqlDataObjectType == ESQLDataObjectType.dotTrigger) {
580                if (segments1.size() > 3) {
581                    return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotCatalog, segments1.get(0),
582                            segments2.get(0))
583                            && TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotSchema, segments1.get(1),
584                            segments2.get(1))
585                            && TSQLEnv.compareIdentifier(dbVendor, sqlDataObjectType, mergeSegments(segments1, 2), mergeSegments(segments2, 2));
586                } else if (segments1.size() == 3) {
587                    return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotCatalog, segments1.get(0),
588                            segments2.get(0))
589                            && TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotSchema, segments1.get(1),
590                            segments2.get(1))
591                            && TSQLEnv.compareIdentifier(dbVendor, sqlDataObjectType, segments1.get(2), segments2.get(2));
592                } else if (segments1.size() == 2) {
593                    return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotSchema, segments1.get(0),
594                            segments2.get(0))
595                            && TSQLEnv.compareIdentifier(dbVendor, sqlDataObjectType, segments1.get(1), segments2.get(1));
596                } else if (segments1.size() == 1) {
597                    return TSQLEnv.compareIdentifier(dbVendor, sqlDataObjectType, segments1.get(0), segments2.get(0));
598                }
599            } else if (sqlDataObjectType == ESQLDataObjectType.dotSchema) {
600                if (segments1.size() > 2) {
601                    return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotCatalog, segments1.get(0),
602                            segments2.get(0))
603                            && TSQLEnv.compareIdentifier(dbVendor, sqlDataObjectType, mergeSegments(segments1, 1), mergeSegments(segments2, 1));
604                } else if (segments1.size() == 2) {
605                    return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotCatalog, segments1.get(0),
606                            segments2.get(0))
607                            && TSQLEnv.compareIdentifier(dbVendor, sqlDataObjectType, segments1.get(1), segments2.get(1));
608                } else if (segments1.size() == 1) {
609                    return TSQLEnv.compareIdentifier(dbVendor, sqlDataObjectType, segments1.get(0), segments2.get(0));
610                }
611            } else if (sqlDataObjectType == ESQLDataObjectType.dotCatalog) {
612                if (segments1.size() > 1) {
613                    return TSQLEnv.compareIdentifier(dbVendor, sqlDataObjectType, mergeSegments(segments1, 0), mergeSegments(segments2, 0));
614                } else if (segments1.size() == 1) {
615                    return TSQLEnv.compareIdentifier(dbVendor, sqlDataObjectType, segments1.get(0), segments2.get(0));
616                }
617            }
618        }
619        else if(supportCatalog){
620            if (sqlDataObjectType == ESQLDataObjectType.dotColumn) {
621                if (segments1.size() > 3) {
622                    return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotCatalog, segments1.get(0),
623                            segments2.get(0))
624                            && TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotTable, segments1.get(1),
625                            segments2.get(1))
626                            && TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotColumn, mergeSegments(segments1, 2),
627                            mergeSegments(segments2, 2));
628                } else if (segments1.size() == 3) {
629                    return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotCatalog, segments1.get(0),
630                            segments2.get(0))
631                            && TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotTable, segments1.get(1),
632                            segments2.get(1))
633                            && TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotColumn, segments1.get(2),
634                            segments2.get(2));
635                } else if (segments1.size() == 2) {
636                    return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotTable, segments1.get(0),
637                            segments2.get(0))
638                            && TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotColumn, segments1.get(1),
639                            segments2.get(1));
640                } else if (segments1.size() == 1) {
641                    return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotColumn, segments1.get(0),
642                            segments2.get(0));
643                }
644            } else if (sqlDataObjectType == ESQLDataObjectType.dotTable
645                    || sqlDataObjectType == ESQLDataObjectType.dotOraclePackage
646                    || sqlDataObjectType == ESQLDataObjectType.dotFunction
647                    || sqlDataObjectType == ESQLDataObjectType.dotProcedure
648                    || sqlDataObjectType == ESQLDataObjectType.dotTrigger) {
649                if (segments1.size() > 2) {
650                    return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotCatalog, segments1.get(0),
651                            segments2.get(0))
652                            && TSQLEnv.compareIdentifier(dbVendor, sqlDataObjectType, mergeSegments(segments1, 1), mergeSegments(segments2, 1));
653                } else if (segments1.size() == 2) {
654                    return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotCatalog, segments1.get(0),
655                            segments2.get(0))
656                            && TSQLEnv.compareIdentifier(dbVendor, sqlDataObjectType, segments1.get(1), segments2.get(1));
657                } else if (segments1.size() == 1) {
658                    return TSQLEnv.compareIdentifier(dbVendor, sqlDataObjectType, segments1.get(0), segments2.get(0));
659                }
660            } else if (sqlDataObjectType == ESQLDataObjectType.dotCatalog || sqlDataObjectType == ESQLDataObjectType.dotSchema) {
661                if (segments1.size() > 1) {
662                    return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotCatalog, mergeSegments(segments1, 0), mergeSegments(segments2, 0));
663                } else if (segments1.size() == 1) {
664                    return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotCatalog, segments1.get(0), segments2.get(0));
665                }
666            }
667        }
668        else if(supportSchema){
669            if (sqlDataObjectType == ESQLDataObjectType.dotColumn) {
670                if (segments1.size() > 3) {
671                    return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotSchema, segments1.get(0),
672                            segments2.get(0))
673                            && TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotTable, segments1.get(1),
674                            segments2.get(1))
675                            && TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotColumn, mergeSegments(segments1, 2),
676                            mergeSegments(segments2, 2));
677                } else if (segments1.size() == 3) {
678                    return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotSchema, segments1.get(0),
679                            segments2.get(0))
680                            && TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotTable, segments1.get(1),
681                            segments2.get(1))
682                            && TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotColumn, segments1.get(2),
683                            segments2.get(2));
684                } else if (segments1.size() == 2) {
685                    return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotTable, segments1.get(0),
686                            segments2.get(0))
687                            && TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotColumn, segments1.get(1),
688                            segments2.get(1));
689                } else if (segments1.size() == 1) {
690                    return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotColumn, segments1.get(0),
691                            segments2.get(0));
692                }
693            } else if (sqlDataObjectType == ESQLDataObjectType.dotTable
694                    || sqlDataObjectType == ESQLDataObjectType.dotOraclePackage
695                    || sqlDataObjectType == ESQLDataObjectType.dotFunction
696                    || sqlDataObjectType == ESQLDataObjectType.dotProcedure
697                    || sqlDataObjectType == ESQLDataObjectType.dotTrigger) {
698                if (segments1.size() > 2) {
699                    return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotSchema, segments1.get(0),
700                            segments2.get(0))
701                            && TSQLEnv.compareIdentifier(dbVendor, sqlDataObjectType, mergeSegments(segments1, 1), mergeSegments(segments2, 1));
702                } else if (segments1.size() == 2) {
703                    return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotSchema, segments1.get(0),
704                            segments2.get(0))
705                            && TSQLEnv.compareIdentifier(dbVendor, sqlDataObjectType, segments1.get(1), segments2.get(1));
706                } else if (segments1.size() == 1) {
707                    return TSQLEnv.compareIdentifier(dbVendor, sqlDataObjectType, segments1.get(0), segments2.get(0));
708                }
709            } else if (sqlDataObjectType == ESQLDataObjectType.dotCatalog || sqlDataObjectType == ESQLDataObjectType.dotSchema) {
710                if (segments1.size() > 1) {
711                    return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotSchema, mergeSegments(segments1, 0), mergeSegments(segments2, 0));
712                } else if (segments1.size() == 1) {
713                    return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotSchema, segments1.get(0), segments2.get(0));
714                }
715            }
716        }
717        return false;
718    }
719
720    public static String normalizeIdentifier(EDbVendor dbVendor, ESQLDataObjectType objectType, String identifier) {
721        if (identifier == null)
722            return null;
723        String originIdentifier = identifier;
724        identifier = TSQLEnv.normalizeIdentifier(dbVendor, objectType, identifier);
725        boolean collationSensitive = false;
726        switch (objectType) {
727            case dotCatalog:
728            case dotSchema:
729                collationSensitive = TSQLEnv.catalogCollationCaseSensitive[dbVendor.ordinal()];
730                break;
731            case dotFunction:
732            case dotProcedure:
733            case dotTrigger:
734            case dotTable:
735            case dotOraclePackage:
736                collationSensitive = TSQLEnv.tableCollationCaseSensitive[dbVendor.ordinal()];
737                break;
738            case dotColumn:
739                collationSensitive = TSQLEnv.columnCollationCaseSensitive[dbVendor.ordinal()];
740                break;
741            default:
742                collationSensitive = TSQLEnv.defaultCollationCaseSensitive[dbVendor.ordinal()];
743                break;
744        }
745        if(parseNames(identifier).size()>1) {
746            return collationSensitive ? originIdentifier : originIdentifier.toUpperCase();
747        }
748        else {
749            return collationSensitive ? identifier : identifier.toUpperCase();
750        }
751    }
752
753    public static String getIdentifierNormalColumnName(EDbVendor dbVendor, String name) {
754        return getIdentifierNormalName(dbVendor, name, ESQLDataObjectType.dotColumn);
755    }
756
757    public static String getIdentifierNormalTableName(String name) {
758        return getIdentifierNormalName(ModelBindingManager.getGlobalVendor(), name, ESQLDataObjectType.dotTable);
759    }
760    
761    public static String getIdentifierNormalTableName(EDbVendor dbVendor, String name) {
762        return getIdentifierNormalName(dbVendor, name, ESQLDataObjectType.dotTable);
763    }
764
765    public static String getIdentifierNormalName(EDbVendor dbVendor, String name,
766                                                 ESQLDataObjectType sqlDataObjectType) {
767        if (name == null) {
768            return null;
769        }
770        if (dbVendor == EDbVendor.dbvmssql || dbVendor == EDbVendor.dbvazuresql) {
771            if (name.indexOf("..") != -1) {
772                if (ModelBindingManager.getGlobalSchema() != null) {
773                    name = name.replace("..", "." + ModelBindingManager.getGlobalSchema() + ".");
774                } else {
775                    name = name.replace("..", ".dbo.");
776                }
777            }
778        }
779        List<String> segments = parseNames(name);
780        StringBuilder builder = new StringBuilder();
781        boolean supportCatalog = TSQLEnv.supportCatalog(dbVendor);
782        boolean supportSchema = TSQLEnv.supportSchema(dbVendor);
783
784        if(supportCatalog && supportSchema) {
785            if (sqlDataObjectType == ESQLDataObjectType.dotColumn) {
786                if (segments.size() > 4) {
787                    builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotCatalog, segments.get(0)))
788                            .append(".")
789                            .append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotSchema, segments.get(1)))
790                            .append(".")
791                            .append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotTable, segments.get(2)))
792                            .append(".")
793                            .append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotColumn, mergeSegments(segments, 3)));
794                } else if (segments.size() == 4) {
795                    builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotCatalog, segments.get(0)))
796                            .append(".")
797                            .append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotSchema, segments.get(1)))
798                            .append(".")
799                            .append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotTable, segments.get(2)))
800                            .append(".")
801                            .append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotColumn, segments.get(3)));
802                } else if (segments.size() == 3) {
803                    builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotSchema, segments.get(0)))
804                            .append(".")
805                            .append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotTable, segments.get(1)))
806                            .append(".")
807                            .append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotColumn, segments.get(2)));
808                } else if (segments.size() == 2) {
809                    builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotTable, segments.get(0)))
810                            .append(".")
811                            .append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotColumn, segments.get(1)));
812                } else if (segments.size() == 1) {
813                    builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotColumn, segments.get(0)));
814                }
815            } else if (sqlDataObjectType == ESQLDataObjectType.dotTable
816                    || sqlDataObjectType == ESQLDataObjectType.dotOraclePackage
817                    || sqlDataObjectType == ESQLDataObjectType.dotFunction
818                    || sqlDataObjectType == ESQLDataObjectType.dotProcedure
819                    || sqlDataObjectType == ESQLDataObjectType.dotTrigger) {
820                if (segments.size() > 3) {
821                    builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotCatalog, segments.get(0)))
822                            .append(".")
823                            .append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotSchema, segments.get(1)))
824                            .append(".").append(normalizeIdentifier(dbVendor, sqlDataObjectType, mergeSegments(segments, 2)));
825                } else if (segments.size() == 3) {
826                    builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotCatalog, segments.get(0)))
827                            .append(".")
828                            .append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotSchema, segments.get(1)))
829                            .append(".").append(normalizeIdentifier(dbVendor, sqlDataObjectType, segments.get(2)));
830                } else if (segments.size() == 2) {
831                    builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotSchema, segments.get(0)))
832                            .append(".").append(normalizeIdentifier(dbVendor, sqlDataObjectType, segments.get(1)));
833                } else if (segments.size() == 1) {
834                    builder.append(normalizeIdentifier(dbVendor, sqlDataObjectType, segments.get(0)));
835                }
836            } else if (sqlDataObjectType == ESQLDataObjectType.dotSchema) {
837                if (segments.size() > 2) {
838                    builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotCatalog, segments.get(0)))
839                            .append(".").append(normalizeIdentifier(dbVendor, sqlDataObjectType, mergeSegments(segments, 1)));
840                } else if (segments.size() == 2) {
841                    builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotCatalog, segments.get(0)))
842                            .append(".").append(normalizeIdentifier(dbVendor, sqlDataObjectType, segments.get(1)));
843                } else if (segments.size() == 1) {
844                    builder.append(normalizeIdentifier(dbVendor, sqlDataObjectType, segments.get(0)));
845                }
846            } else if (sqlDataObjectType == ESQLDataObjectType.dotCatalog) {
847                if (segments.size() > 1) {
848                    builder.append(normalizeIdentifier(dbVendor, sqlDataObjectType, mergeSegments(segments, 0)));
849                } else if (segments.size() == 1) {
850                    builder.append(normalizeIdentifier(dbVendor, sqlDataObjectType, segments.get(0)));
851                }
852            }
853        }
854        else if(supportCatalog){
855            if (sqlDataObjectType == ESQLDataObjectType.dotColumn) {
856                if (segments.size() > 3) {
857                    builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotCatalog, segments.get(0)))
858                            .append(".")
859                            .append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotTable, segments.get(1)))
860                            .append(".")
861                            .append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotColumn, mergeSegments(segments, 2)));
862                } else if (segments.size() == 3) {
863                    builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotCatalog, segments.get(0)))
864                            .append(".")
865                            .append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotTable, segments.get(1)))
866                            .append(".")
867                            .append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotColumn, segments.get(2)));
868                } else if (segments.size() == 2) {
869                    builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotTable, segments.get(0)))
870                            .append(".")
871                            .append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotColumn, segments.get(1)));
872                } else if (segments.size() == 1) {
873                    builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotColumn, segments.get(0)));
874                }
875            } else if (sqlDataObjectType == ESQLDataObjectType.dotTable
876                    || sqlDataObjectType == ESQLDataObjectType.dotOraclePackage
877                    || sqlDataObjectType == ESQLDataObjectType.dotFunction
878                    || sqlDataObjectType == ESQLDataObjectType.dotProcedure
879                    || sqlDataObjectType == ESQLDataObjectType.dotTrigger) {
880                if (segments.size() > 2) {
881                    builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotCatalog, segments.get(0)))
882                            .append(".").append(normalizeIdentifier(dbVendor, sqlDataObjectType, mergeSegments(segments, 1)));
883                } else if (segments.size() == 2) {
884                    builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotCatalog, segments.get(0)))
885                            .append(".").append(normalizeIdentifier(dbVendor, sqlDataObjectType, segments.get(1)));
886                } else if (segments.size() == 1) {
887                    builder.append(normalizeIdentifier(dbVendor, sqlDataObjectType, segments.get(0)));
888                }
889            } else if (sqlDataObjectType == ESQLDataObjectType.dotSchema || sqlDataObjectType == ESQLDataObjectType.dotCatalog) {
890                if (segments.size() > 1) {
891                    builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotCatalog, mergeSegments(segments, 0)));
892                } else if (segments.size() == 1) {
893                    builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotCatalog, segments.get(0)));
894                }
895            }
896        }
897        else if(supportSchema){
898            if (sqlDataObjectType == ESQLDataObjectType.dotColumn) {
899                if (segments.size() > 3) {
900                    builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotSchema, segments.get(0)))
901                            .append(".")
902                            .append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotTable, segments.get(1)))
903                            .append(".")
904                            .append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotColumn, mergeSegments(segments, 2)));
905                } else if (segments.size() == 3) {
906                    builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotSchema, segments.get(0)))
907                            .append(".")
908                            .append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotTable, segments.get(1)))
909                            .append(".")
910                            .append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotColumn, segments.get(2)));
911                } else if (segments.size() == 2) {
912                    builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotTable, segments.get(0)))
913                            .append(".")
914                            .append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotColumn, segments.get(1)));
915                } else if (segments.size() == 1) {
916                    builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotColumn, segments.get(0)));
917                }
918            } else if (sqlDataObjectType == ESQLDataObjectType.dotTable
919                    || sqlDataObjectType == ESQLDataObjectType.dotOraclePackage
920                    || sqlDataObjectType == ESQLDataObjectType.dotFunction
921                    || sqlDataObjectType == ESQLDataObjectType.dotProcedure
922                    || sqlDataObjectType == ESQLDataObjectType.dotTrigger) {
923                if (segments.size() > 2) {
924                    builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotSchema, segments.get(0)))
925                            .append(".").append(normalizeIdentifier(dbVendor, sqlDataObjectType, mergeSegments(segments, 1)));
926                } else if (segments.size() == 2) {
927                    builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotSchema, segments.get(0)))
928                            .append(".").append(normalizeIdentifier(dbVendor, sqlDataObjectType, segments.get(1)));
929                } else if (segments.size() == 1) {
930                    builder.append(normalizeIdentifier(dbVendor, sqlDataObjectType, segments.get(0)));
931                }
932            } else if (sqlDataObjectType == ESQLDataObjectType.dotSchema || sqlDataObjectType == ESQLDataObjectType.dotCatalog) {
933                if (segments.size() > 1) {
934                    builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotSchema, mergeSegments(segments, 0)));
935                } else if (segments.size() == 1) {
936                    builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotSchema, segments.get(0)));
937                }
938            }
939        }
940        return builder.toString();
941    }
942
943    public static String mergeSegments(List<String> segments, int index) {
944        StringBuilder buffer = new StringBuilder();
945                for (int i = index; i < segments.size(); i++) {
946                        buffer.append(segments.get(i));
947                        if(i<segments.size()-1) {
948                                buffer.append(".");
949                        }
950                }
951                return buffer.toString();
952        }
953
954//      public static String getIdentifierNormalName(EDbVendor vendor, String name) {
955//              if (isEmpty(name)) {
956//                      return null;
957//              }
958//              name = name.replaceAll("(?i)null\\.", "");
959//              switch (vendor) {
960//              case dbvbigquery:
961//                      return replaceIdentifierNormalName(name, "`.*?`", "`", true).replaceAll("\\.\\s+", ".");
962//              case dbvcouchbase:
963//              case dbvhive:
964//              case dbvimpala:
965//              case dbvmysql:
966//                      return replaceIdentifierNormalName(name, "`.*?`", "`", true).replaceAll("\\.\\s+", ".");
967//              case dbvdax:
968//                      return replaceIdentifierNormalName(name, "'.*?'", "'", true).replaceAll("\\.\\s+", ".");
969//              case dbvdb2:
970//              case dbvhana:
971//              case dbvinformix:
972//              case dbvnetezza:
973//              case dbvoracle:
974//              case dbvsnowflake:
975//              case dbvsybase:
976//              case dbvteradata:
977//              case dbvvertica:
978//                      return replaceIdentifierNormalName(name, "\".*?\"", "\"", true).replaceAll("\\.\\s+", ".");
979//              case dbvpostgresql:
980//              case dbvgreenplum:
981//              case dbvredshift:
982//                      return replaceIdentifierNormalName(name, "\".*?\"", "\"", false).replaceAll("\\.\\s+", ".");
983//              case dbvmssql:
984//                      return replaceIdentifierNormalName(name, "([\"\\[']).*?([\"\\]'])", "[\"\\[\\]']", true)
985//                                      .replaceAll("\\.\\s+", ".");
986//              default:
987//                      return replaceIdentifierNormalName(name, "\".*?\"", "\"", true).replaceAll("\\.\\s+", ".");
988//              }
989//      }
990//
991//      private static String replaceIdentifierNormalName(String content, String match, String replace, boolean toUpper) {
992//              Pattern pattern = Pattern.compile(match, Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
993//              Matcher matcher = pattern.matcher(content);
994//              StringBuilder buffer = new StringBuilder();
995//              int start = 0;
996//              while (matcher.find()) {
997//                      int matchStart = matcher.start();
998//                      int macthEnd = matcher.end();
999//                      if (start < matchStart) {
1000//                              if (toUpper) {
1001//                                      buffer.append(content.substring(start, matchStart).toUpperCase());
1002//                              } else {
1003//                                      buffer.append(content.substring(start, matchStart).toLowerCase());
1004//                              }
1005//                      }
1006//                      buffer.append(matcher.group().replaceAll(replace, ""));
1007//                      start = macthEnd;
1008//              }
1009//              if (start < content.length()) {
1010//                      if (toUpper) {
1011//                              buffer.append(content.substring(start).toUpperCase());
1012//                      } else {
1013//                              buffer.append(content.substring(start).toLowerCase());
1014//                      }
1015//              }
1016//              return buffer.toString();
1017//      }
1018
1019    public static boolean isTempTable(table table) {
1020        if(SubType.temp_table.name().equals(table.getSubType())) {
1021                return true;
1022        }
1023        String tableName = table.getName();
1024        List<String> segments = parseNames(tableName);
1025        if (tableName.startsWith("@") || segments.get(segments.size() - 1).startsWith("@")) {
1026            return true;
1027        }
1028        if (tableName.startsWith("#") || segments.get(segments.size() - 1).startsWith("#")) {
1029            return true;
1030        }
1031        return false;
1032    }
1033    
1034//    public static boolean isTempTable(String tableName) {
1035//        List<String> segments = parseNames(tableName);
1036//        if (tableName.startsWith("@") || segments.get(segments.size() - 1).startsWith("@")) {
1037//            return true;
1038//        }
1039//        if (tableName.startsWith("#") || segments.get(segments.size() - 1).startsWith("#")) {
1040//            return true;
1041//        }
1042//        return false;
1043//    }
1044
1045//    public static boolean isTempTable(TTable table, EDbVendor vendor) {
1046//        switch (vendor) {
1047//            case dbvmssql:
1048//                return table.getName().startsWith("#");
1049//            default:
1050//                return false;
1051//        }
1052//    }
1053
1054    public static File[] listFiles(File sqlFiles) {
1055        List<File> children = new ArrayList<File>();
1056        if (sqlFiles != null)
1057            listFiles(sqlFiles, children);
1058        Collections.sort(children);
1059        return children.toArray(new File[0]);
1060    }
1061
1062    public static File[] listFiles(File sqlFiles, FileFilter filter) {
1063        List<File> children = new ArrayList<File>();
1064        if (sqlFiles != null)
1065            listFiles(sqlFiles, children, filter);
1066        Collections.sort(children);
1067        return children.toArray(new File[0]);
1068    }
1069
1070    public static void listFiles(File rootFile, List<File> children) {
1071        if (rootFile.isFile())
1072            children.add(rootFile);
1073        else {
1074            File[] files = rootFile.listFiles();
1075            if (files != null) {
1076                for (int i = 0; i < files.length; i++) {
1077                    listFiles(files[i], children);
1078                }
1079            }
1080        }
1081    }
1082
1083    public static void listFiles(File rootFile, List<File> children, FileFilter filter) {
1084        if (rootFile.isFile() && filter.accept(rootFile))
1085            children.add(rootFile);
1086        else {
1087            File[] files = rootFile.listFiles(filter);
1088            if (files != null) {
1089                for (int i = 0; i < files.length; i++) {
1090                    listFiles(files[i], children, filter);
1091                }
1092            }
1093        }
1094    }
1095
1096    public static String readFile(File file) {
1097        StringBuilder stringBuilder = new StringBuilder();
1098        BufferedReader reader = null;
1099        try {
1100            reader = new BufferedReader(new FileReader(file));
1101
1102            String line = null;
1103            String ls = System.getProperty("line.separator");
1104            while ((line = reader.readLine()) != null) {
1105                stringBuilder.append(line);
1106                stringBuilder.append(ls);
1107            }
1108            stringBuilder.deleteCharAt(stringBuilder.length() - 1);
1109        } catch (IOException e) {
1110            logger.error("read file failed.", e);
1111        } finally {
1112            if (reader != null) {
1113                try {
1114                    reader.close();
1115                } catch (IOException e) {
1116                    logger.error("close reader failed.", e);
1117                }
1118            }
1119        }
1120        return stringBuilder.toString();
1121    }
1122
1123        public static String stringToMD5(String plainText) {
1124                byte[] secretBytes = null;
1125                try {
1126                        secretBytes = MessageDigest.getInstance("md5").digest(plainText.getBytes("UTF-8"));
1127                        StringBuffer sb = new StringBuffer();
1128                        for (int i = 0; i < secretBytes.length; ++i) {
1129                                sb.append(Integer.toHexString((secretBytes[i] & 0xFF) | 0x100).substring(1, 3));
1130                        }
1131                        return sb.toString();
1132                } catch (Exception e) {
1133                        logger.error("get text md5 value failed.", e);
1134                }
1135                return null;
1136        }
1137
1138        public static String trimSingleQuote(String columnAlias) {
1139                if(columnAlias.startsWith("'") && columnAlias.endsWith("'")) {
1140                        return columnAlias.substring(1, columnAlias.length() - 1);
1141                }
1142                return columnAlias;
1143        }
1144        
1145    public static String endTrim(String input) {
1146        if (input == null) {
1147            return null;
1148        }
1149
1150        int end = input.length();
1151        while (end > 0 && Character.isWhitespace(input.charAt(end - 1))) {
1152            end--;
1153        }
1154
1155        return input.substring(0, end);
1156    }
1157        
1158    public static void endTrim(StringBuilder buffer) {
1159        int length = buffer.length();
1160        while (length > 0 && Character.isWhitespace(buffer.charAt(length - 1))) {
1161            length--; // 逐步减少长度
1162        }
1163        buffer.setLength(length); // 直接截断尾部空白字符
1164    }
1165}