/*
* Copyright 2013 Sylvain LAURENT
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package ch.sla.jdbcperflogger.console.ui;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.concurrent.TimeUnit;
import org.eclipse.jdt.annotation.Nullable;
import ch.sla.jdbcperflogger.StatementType;
import ch.sla.jdbcperflogger.console.db.DetailedViewStatementLog;
import ch.sla.jdbcperflogger.console.db.LogRepositoryConstants;
import ch.sla.jdbcperflogger.console.db.LogRepositoryRead;
import ch.sla.jdbcperflogger.console.db.ResultSetAnalyzer;
public class LogExporter {
private final LogRepositoryRead logRepository;
LogExporter(final LogRepositoryRead logRepository) {
this.logRepository = logRepository;
}
SqlLogExporter getSqlLogExporter(final File exportFile) {
return new SqlLogExporter(exportFile);
}
CsvLogExporter getCsvLogExporter(final File exportFile) {
return new CsvLogExporter(exportFile);
}
String getBatchedExecutions(final DetailedViewStatementLog statementLog) {
final StringBuilder strBuilder = new StringBuilder();
logRepository.getBatchStatementExecutions(statementLog.getLogId(), new ResultSetAnalyzer() {
@Override
public void analyze(final ResultSet resultSet) throws SQLException {
while (resultSet.next()) {
strBuilder.append("/* #");
strBuilder.append(resultSet.getInt(1));
strBuilder.append(" */ ");
final String sql = resultSet.getString(2) + ";";
strBuilder.append(sql);
strBuilder.append("\n");
}
}
});
return strBuilder.toString();
}
private class SqlLogExporter implements ResultSetAnalyzer {
private final File exportFile;
SqlLogExporter(final File exportFile) {
this.exportFile = exportFile;
}
@Override
public void analyze(final ResultSet resultSet) throws SQLException {
try (PrintWriter writer = new PrintWriter(exportFile)) {
final SimpleDateFormat tstampFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
while (resultSet.next()) {
final Timestamp timestamp = resultSet.getTimestamp(LogRepositoryConstants.TSTAMP_COLUMN);
writer.print("/*");
writer.print(tstampFormat.format(timestamp));
writer.print(" exec=");
writer.print(
TimeUnit.NANOSECONDS.toMillis(resultSet.getLong(LogRepositoryConstants.EXEC_TIME_COLUMN)));
writer.print("ms ");
final int nbRows = resultSet.getInt(LogRepositoryConstants.NB_ROWS_COLUMN);
if (!resultSet.wasNull()) {
writer.print(nbRows);
writer.print(", row(s) fetched in ");
writer.print(TimeUnit.NANOSECONDS
.toMillis(resultSet.getLong(LogRepositoryConstants.FETCH_TIME_COLUMN)));
writer.print("ms ");
}
final StatementType stmtType = StatementType
.fromId(resultSet.getByte(LogRepositoryConstants.STMT_TYPE_COLUMN));
switch (stmtType) {
case NON_PREPARED_BATCH_EXECUTION:
case PREPARED_BATCH_EXECUTION:
writer.print(stmtType.name());
writer.println("*/");
final DetailedViewStatementLog statementLog = logRepository
.getStatementLog(resultSet.getLong("ID"));
if (statementLog != null) {
writer.println(getBatchedExecutions(statementLog));
}
break;
default:
writer.print("*/ ");
final String filledSql = resultSet.getString(LogRepositoryConstants.FILLED_SQL_COLUMN);
writer.print(filledSql);
if (!filledSql.endsWith(";")) {
writer.print(";");
}
}
writer.println();
}
} catch (final FileNotFoundException e) {
throw new RuntimeException(e);
}
}
}
private class CsvLogExporter implements ResultSetAnalyzer {
private final File exportFile;
CsvLogExporter(final File exportFile) {
this.exportFile = exportFile;
}
@Override
public void analyze(final ResultSet resultSet) throws SQLException {
final PrintWriter writer;
try {
writer = new PrintWriter(exportFile);
} catch (final FileNotFoundException e) {
throw new RuntimeException(e);
}
final SimpleDateFormat tstampFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
try {
writer.println(
"TIMESTAMP\tEXEC_TIME_S\tFETCH_TIME_S\tEXEC_PLUS_RSET_USAGE_TIME_S\tFETCHED_ROWS\tSTMT_TYPE\tRAW_STATEMENT\tFILLED_STATEMENT\tTHREAD_NAME\tCONNECTION_ID\tTIMEOUT\tERROR");
while (resultSet.next()) {
final Timestamp timestamp = resultSet.getTimestamp(LogRepositoryConstants.TSTAMP_COLUMN);
writer.print(tstampFormat.format(timestamp));
writer.print('\t');
writer.print(resultSet.getLong(LogRepositoryConstants.EXEC_TIME_COLUMN));
writer.print("e-9");
final int nbRows = resultSet.getInt(LogRepositoryConstants.NB_ROWS_COLUMN);
if (!resultSet.wasNull()) {
writer.print('\t');
writer.print(resultSet.getLong(LogRepositoryConstants.FETCH_TIME_COLUMN));
writer.print("e-9");
writer.print('\t');
writer.print(resultSet.getLong(LogRepositoryConstants.EXEC_PLUS_RSET_USAGE_TIME));
writer.print("e-9");
writer.print('\t');
writer.print(nbRows);
} else {
writer.print("\t\t");
// fetch==0
writer.print(resultSet.getLong(LogRepositoryConstants.EXEC_TIME_COLUMN));
writer.print("e-9");
writer.print('\t');
}
final StatementType stmtType = StatementType
.fromId(resultSet.getByte(LogRepositoryConstants.STMT_TYPE_COLUMN));
writer.print('\t');
writer.print(stmtType.name());
writer.print('\t');
writer.print(escapeStrings(resultSet.getString(LogRepositoryConstants.RAW_SQL_COLUMN)));
writer.print('\t');
switch (stmtType) {
case NON_PREPARED_BATCH_EXECUTION:
case PREPARED_BATCH_EXECUTION:
break;
default:
writer.print(escapeStrings(resultSet.getString(LogRepositoryConstants.FILLED_SQL_COLUMN)));
}
writer.print('\t');
writer.print(resultSet.getString(LogRepositoryConstants.THREAD_NAME_COLUMN));
writer.print('\t');
writer.print(resultSet.getString(LogRepositoryConstants.CONNECTION_NUMBER_COLUMN));
writer.print('\t');
writer.print(resultSet.getString(LogRepositoryConstants.TIMEOUT_COLUMN));
writer.print('\t');
writer.print(resultSet.getString(LogRepositoryConstants.ERROR_COLUMN));
writer.println();
}
} finally {
writer.close();
}
}
private String escapeStrings(@Nullable final String orig) {
if (orig == null) {
return "";
}
return orig;
}
}
}