TransferResultSet parseFileForData()

in HSQL/src/org/hsqldb1/util/TransferSQLText.java [698:864]


    TransferResultSet parseFileForData(String tableName)
    throws DataAccessPointException {

        TransferResultSet trsData = new TransferResultSet();
        StringTokenizer   Tokenizer;

        if (WTextRead == null) {
            try {
                WTextRead = new BufferedReader(new FileReader(sFileName));
            } catch (IOException e) {
                throw new DataAccessPointException(e.getMessage());
            }
        }

        String currentLine = "";
        String Token;

        try {
            while ((currentLine = WTextRead.readLine()) != null) {
                currentLine = currentLine.trim() + ";";
                Tokenizer   = new StringTokenizer(currentLine);

                try {
                    Token = Tokenizer.nextToken();
                } catch (NoSuchElementException NSE) {
                    continue;
                }

                if (Token == null) {
                    continue;
                }

                if (!Token.toUpperCase().equals("INSERT")) {
                    continue;
                }

                try {
                    if (!Tokenizer.nextToken().toUpperCase().equals("INTO")) {
                        throw new DataAccessPointException(
                            "Error in INSERT statement: no INTO found");
                    }

                    Token = Tokenizer.nextToken();

                    if (!Token.equals(tableName)) {
                        continue;
                    }

                    int    iParsedRows   = 0;
                    Vector vColumnNames  = new Vector();
                    Vector vColumnValues = new Vector();
                    Vector vColumnTypes  = new Vector();

                    while ((currentLine = WTextRead.readLine()) != null) {
                        currentLine = currentLine.trim();

                        boolean newLine = (currentLine.length() == 0);

                        if (newLine) {
                            int iColumnNb = 0;

                            iParsedRows++;

                            iColumnNb = vColumnNames.size();

                            String[] Names  = new String[iColumnNb + 1];
                            int[]    Types  = new int[iColumnNb + 1];
                            Object[] Values = new Object[iColumnNb + 1];

                            for (int Idx = 0; Idx < iColumnNb; Idx++) {
                                Names[Idx + 1] =
                                    (String) vColumnNames.elementAt(Idx);
                                Types[Idx + 1] =
                                    ((Integer) vColumnTypes.elementAt(
                                        Idx)).intValue();
                                Values[Idx + 1] =
                                    vColumnValues.elementAt(Idx);
                            }

                            try {
                                trsData.addRow(Names, Types, Values,
                                               iColumnNb);
                            } catch (Exception e) {
                                throw new DataAccessPointException(
                                    e.getMessage());
                            }

                            iColumnNb = 0;

                            vColumnNames.removeAllElements();
                            vColumnValues.removeAllElements();
                            vColumnTypes.removeAllElements();

                            continue;
                        }

                        Tokenizer = new StringTokenizer(currentLine);
                        Token     = Tokenizer.nextToken("=");

                        if (Token.equals("Number of Rows")) {
                            int iNbRows =
                                Integer.parseInt(Tokenizer.nextToken());

                            if (iNbRows != iParsedRows) {
                                throw new DataAccessPointException(
                                    "Number of parsed rows (" + iParsedRows
                                    + ") is different from the expected ("
                                    + iNbRows + ")");
                            }

                            return trsData;
                        }

                        if (Token.equals("column")) {
                            Token = Tokenizer.nextToken(" =");

                            vColumnNames.addElement(Token);
                        }

                        Token = Tokenizer.nextToken(" =");

                        if (Token.equals("datatype")) {
                            int iType;

                            Token = Tokenizer.nextToken(" =");

                            try {
                                iType = JDBCT.toInt(Token.toUpperCase());
                            } catch (Exception e) {
                                throw new DataAccessPointException(
                                    "Unknown type: " + Token);
                            }

                            vColumnTypes.addElement(new Integer(iType));
                        }

                        Token = Tokenizer.nextToken(" =");

                        if (Token.equals("value")) {
                            int iStart = currentLine.indexOf("value=") + 6;
                            String sValue =
                                currentLine.substring(iStart).trim();

                            if (sValue.indexOf("<null>") >= 0) {
                                vColumnValues.addElement(null);
                            } else {
                                int    i       = sValue.indexOf('\'') + 1;
                                String sbToken = sValue.substring(i);

                                i       = sbToken.lastIndexOf('\'');
                                sbToken = sbToken.substring(0, i);
                                Token   = sbToken;

                                vColumnValues.addElement(Token);
                            }
                        }
                    }
                } catch (IndexOutOfBoundsException IOBe) {
                    continue;
                }
            }
        } catch (IOException IOe) {
            throw new DataAccessPointException(IOe.getMessage());
        }

        return trsData;
    }