/*
* Copyright 2004-2011 H2 Group. Multiple-Licensed under the H2 License,
* Version 1.0, and under the Eclipse Public License, Version 1.0
* (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.test.synth.sql;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collections;
import org.h2.test.TestBase;
import org.h2.util.New;
/**
* Represents an in-memory result.
*/
class Result implements Comparable<Result> {
static final int SUCCESS = 0, BOOLEAN = 1, INT = 2, EXCEPTION = 3, RESULT_SET = 4;
String sql;
private int type;
private boolean bool;
private int intValue;
private SQLException exception;
private ArrayList<Row> rows;
private ArrayList<Column> header;
Result(String sql) {
this.sql = sql;
type = SUCCESS;
}
Result(String sql, SQLException e) {
this.sql = sql;
type = EXCEPTION;
exception = e;
}
Result(String sql, boolean b) {
this.sql = sql;
type = BOOLEAN;
this.bool = b;
}
Result(String sql, int i) {
this.sql = sql;
type = INT;
this.intValue = i;
}
Result(TestSynth config, String sql, ResultSet rs) {
this.sql = sql;
type = RESULT_SET;
try {
rows = New.arrayList();
header = New.arrayList();
ResultSetMetaData meta = rs.getMetaData();
int len = meta.getColumnCount();
Column[] cols = new Column[len];
for (int i = 0; i < len; i++) {
cols[i] = new Column(meta, i + 1);
}
while (rs.next()) {
Row row = new Row(config, rs, len);
rows.add(row);
}
Collections.sort(rows);
} catch (SQLException e) {
// type = EXCEPTION;
// exception = e;
TestBase.logError("error reading result set", e);
}
}
public String toString() {
switch (type) {
case SUCCESS:
return "success";
case BOOLEAN:
return "boolean: " + this.bool;
case INT:
return "int: " + this.intValue;
case EXCEPTION: {
StringWriter w = new StringWriter();
exception.printStackTrace(new PrintWriter(w));
return "exception: " + exception.getSQLState() + ": " + exception.getMessage() + "\r\n" + w.toString();
}
case RESULT_SET:
String result = "ResultSet { // size=" + rows.size() + "\r\n ";
for (Column column : header) {
result += column.toString() + "; ";
}
result += "} = {\r\n";
for (Row row : rows) {
result += " { " + row.toString() + "};\r\n";
}
return result + "}";
default:
throw new AssertionError("type=" + type);
}
}
public int compareTo(Result r) {
switch (type) {
case EXCEPTION:
if (r.type != EXCEPTION) {
return 1;
}
return 0;
// return
// exception.getSQLState().compareTo(r.exception.getSQLState());
case BOOLEAN:
case INT:
case SUCCESS:
case RESULT_SET:
return toString().compareTo(r.toString());
default:
throw new AssertionError("type=" + type);
}
}
// public void log() {
// switch (type) {
// case SUCCESS:
// System.out.println("> ok");
// break;
// case EXCEPTION:
// System.out.println("> exception");
// break;
// case INT:
// if (intValue == 0) {
// System.out.println("> ok");
// } else {
// System.out.println("> update count: " + intValue);
// }
// break;
// case RESULT_SET:
// System.out.println("> rs " + rows.size());
// break;
// default:
// }
// System.out.println();
// }
}