You can plug-in your own formatter and get output in any desired format.
The whole SQL-DK is designed for streaming – it should hold in memory as few data as possible. Thus it iterates over the result set which comes from the database and passes immediately the cells and rows to the formatter which can flush them formatted to the output without longer hesitation.
The formatter receives events from SQL-DK core, not whole result set at once. There is list of events with hinted logical hierarchy and cardinality:
void writeStartBatch(); // 1
void writeStartDatabase(DatabaseDefinition databaseDefinition); // 1-n
void writeStartStatement(); // 1-n
void writeQuery(String sql); // 0-1
void writeParameters(List<? extends Parameter> parameters); // 0-1
void writeStartResultSet(ColumnsHeader header); // 0-n
void writeStartRow(); // 0-n
void writeColumnValue(Object value); // 1-n
void writeEndRow();
void writeEndResultSet();
void writeUpdatesResult(int updatedRowsCount); // 0-n
void writeEndStatement();
void writeEndDatabase();
void writeEndBatch();
Formatters must implement the info.globalcode.sql.dk.formatting.Formatter
interface.
Extending abstract class info.globalcode.sql.dk.formatting.AbstractFormatter
is recommended – it saves your keyboard because you will only override the methods for which you need some output.
The AbstractFormatter
also checks the integrity (that methods are called in correct order and context).
If you override some method from AbstractFormatter
, you must call the super method:
@Override
public void writeStartResultSet() {
super.writeStartResultSet(); // don't forget to call super methods
printResultSeparator();
}
The formatter class must have constructor with one parameter of type FormatterContext
like this:
public TabularFormatter(FormatterContext formatterContext) {
super(formatterContext); // don't forget to call super constructor
out = formatterContext.getOutputStream();
}
The formatted output should go to the out
(formatterContext.getOutputStream()
),
never use System.out
or System.err
directly.
Of course you can wrap this stream by some other one like this:
out = new ColorfulPrintWriter(formatterContext.getOutputStream());
In order to install your formatter just add compiled class or JAR to the class path and add this piece of XML to your config file:
<formatter>
<name>my-formatter</name>
<class>com.example.MyWonderfulFormatter</class>
</formatter>
During runtime you will choose it by --formatter my-formatter
option or by setting it as default in the configuration.
Best way to tune your class path is adding an array variable into your ~/.sql-dk/environment.sh
:
PLUGINS=(
"/path/to/first/formatter.jar"
"/path/to/second/formatter.jar"
);
SQL-DK, free software © 2013-2020 GlobalCode