/** * Creates new Statement for use in executing SQL statements. * * @param connection database connection to create statement for. * @param resultSetType either ResultSet.TYPE_SCROLL_INSENSITIVE or * ResultSet.TYPE_SCROLL_SENSITIVE. */ protected CsvStatement(CsvConnection connection, int resultSetType) { CsvDriver.writeLog("CsvStatement() - connection=" + connection); CsvDriver.writeLog( "CsvStatement() - Asked for " + (resultSetType == ResultSet.TYPE_SCROLL_SENSITIVE ? "Scrollable" : "Not Scrollable")); this.connection = connection; this.resultSetType = resultSetType; }
@Override public boolean execute(String sql) throws SQLException { CsvDriver.writeLog("CsvStatement:execute() - sql= " + sql); /* * Close any previous ResultSet, as required by JDBC. */ try { if (lastResultSet != null) lastResultSet.close(); } finally { lastResultSet = null; multipleParsers = null; } /* * Execute one or more SQL statements. * The method getMoreResults() will be used to step through the results. */ MultipleSqlParser parser = new MultipleSqlParser(); try { List<SqlParser> parsers = parser.parse(sql); lastResultSet = executeParsedQuery(parsers.remove(0)); multipleParsers = parsers; } catch (Exception e) { throw new SQLException(CsvResources.getString("syntaxError") + ": " + e.getMessage()); } return true; }
@Override public ResultSet executeQuery(String sql) throws SQLException { checkOpen(); CsvDriver.writeLog("CsvStatement:executeQuery() - sql= " + sql); /* * Close any previous ResultSet, as required by JDBC. */ try { if (lastResultSet != null) lastResultSet.close(); } finally { lastResultSet = null; multipleParsers = null; } SqlParser parser = new SqlParser(); try { parser.parse(sql); } catch (Exception e) { throw new SQLException(CsvResources.getString("syntaxError") + ": " + e.getMessage()); } return executeParsedQuery(parser); }
protected ResultSet executeParsedQuery( SqlParser parser, Map<String, Object> parentobjectEnvironment) throws SQLException { if (parser.getTableNames().size() > 1) throw new SQLException(CsvResources.getString("joinNotSupported")); String tableName = null; if (parser.getTableNames().size() > 0) tableName = parser.getTableNames().get(0); String tableAlias = null; if (parser.getTableAliases().size() > 0) tableAlias = parser.getTableAliases().get(0); String path = connection.getPath(); TableReader tableReader = connection.getTableReader(); if (path != null) CsvDriver.writeLog("Connection Path: " + path); else CsvDriver.writeLog("Connection TableReader: " + tableReader.getClass().getName()); CsvDriver.writeLog("Parser Table Name: " + tableName); CsvDriver.writeLog("Connection Extension: " + connection.getExtension()); DataReader reader = null; String fileName = null; if (tableName == null) { /* * Create an empty dataset with one row. */ String[] columnNames = new String[0]; String[] columnTypes = new String[0]; ArrayList<Object[]> rows = new ArrayList<Object[]>(); rows.add(new Object[0]); reader = new ListDataReader(columnNames, columnTypes, rows); } else { if (path != null && (!connection.isIndexedFiles())) { fileName = path + tableName + connection.getExtension(); CsvDriver.writeLog("CSV file name: " + fileName); File checkFile = new File(fileName); if (!checkFile.exists()) { throw new SQLException(CsvResources.getString("fileNotFound") + ": " + fileName); } if (!checkFile.canRead()) { throw new SQLException(CsvResources.getString("fileNotReadable") + ": " + fileName); } } try { if (connection.getExtension().equalsIgnoreCase(".dbf")) { reader = new DbfReader(fileName, tableName, tableAlias, connection.getCharset()); } else { LineNumberReader input; if (tableReader == null) { InputStream in; CryptoFilter filter = connection.getDecryptingCodec(); if (connection.isIndexedFiles()) { String fileNamePattern = tableName + connection.getFileNamePattern() + connection.getExtension(); String[] nameParts = connection.getNameParts(); String dirName = connection.getPath(); in = new FileSetInputStream( dirName, fileNamePattern, nameParts, connection.getSeparator(), connection.isFileTailPrepend(), connection.isSuppressHeaders(), filter, connection.getSkipLeadingDataLines() + connection.getTransposedLines()); } else if (filter == null) { in = new FileInputStream(fileName); } else { filter.reset(); in = new EncryptedFileInputStream(fileName, filter); } if (connection.getCharset() != null) { input = new LineNumberReader(new InputStreamReader(in, connection.getCharset())); } else { input = new LineNumberReader(new InputStreamReader(in)); } } else { /* * Reader for table comes from user-provided class. */ input = new LineNumberReader(tableReader.getReader(this, tableName)); } String headerline = connection.getHeaderline(tableName); CsvRawReader rawReader = new CsvRawReader( input, tableName, tableAlias, connection.getSeparator(), connection.isSuppressHeaders(), connection.isHeaderFixedWidth(), connection.getQuotechar(), connection.getCommentChar(), headerline, connection.getTrimHeaders(), connection.getTrimValues(), connection.getSkipLeadingLines(), connection.isIgnoreUnparseableLines(), connection.getMissingValue(), connection.isDefectiveHeaders(), connection.getSkipLeadingDataLines(), connection.getQuoteStyle(), connection.getFixedWidthColumns()); reader = new CsvReader( rawReader, connection.getTransposedLines(), connection.getTransposedFieldsToSkip(), headerline); } } catch (IOException e) { throw new SQLException(CsvResources.getString("fileReadError") + ": " + e); } catch (SQLException e) { throw e; } catch (Exception e) { e.printStackTrace(); throw new SQLException(CsvResources.getString("dataReaderError") + ": " + e); } } CsvResultSet resultSet = null; try { resultSet = new CsvResultSet( this, reader, tableName, parser.getColumns(), parser.isDistinct(), this.resultSetType, parser.getWhereClause(), parser.getGroupByColumns(), parser.getHavingClause(), parser.getOrderByColumns(), parser.getLimit(), parser.getOffset(), connection.getColumnTypes(tableName), connection.getSkipLeadingLines(), parentobjectEnvironment); lastResultSet = resultSet; } catch (ClassNotFoundException e) { CsvDriver.writeLog("" + e); } return resultSet; }