--- /dev/null
+package net.jaekl.squelch.stmt;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.Locale;
+
+import net.jaekl.squelch.db.DbDriver;
+
+public class PSet extends Stmt {
+ private static final String SUPPRESS_NULLS = "suppress_nulls";
+
+ @Override
+ public boolean handles(String line) {
+ if (null == line) {
+ return false;
+ }
+
+ return line.toLowerCase(Locale.CANADA).startsWith("\\pset ");
+ }
+
+ @Override
+ public int exec(DbDriver driver, Connection conn, PrintWriter pw, String line)
+ throws IOException, SQLException
+ {
+ String trimmed = line.substring(6).trim();
+
+ int equPos = trimmed.indexOf('=');
+
+ if (equPos > 0) {
+ return setValue(driver, pw, trimmed, equPos);
+ }
+ else if (trimmed.length() > 0) {
+ return displayValue(driver, pw, trimmed);
+ }
+ else {
+ // TODO: StringTable
+ pw.println("???");
+ return 0;
+ }
+ }
+
+ private int displayValue(DbDriver driver, PrintWriter pw, String trimmed)
+ {
+ String lcName = trimmed.toLowerCase(Locale.CANADA);
+
+ if (SUPPRESS_NULLS.equals(lcName)) {
+ // TODO: StringTable
+ pw.println(SUPPRESS_NULLS + ": " + (driver.isSuppressNulls() ? "on" : "off"));
+ }
+ else {
+ // TODO: StringTable
+ pw.println("??? Unrecognized setting: \"" + trimmed + "\". Ignored.");
+ }
+
+ return 0;
+ }
+
+ private boolean parseBoolean(String value)
+ {
+ if (null == value) {
+ return false;
+ }
+
+ String setting = value.trim().toLowerCase(Locale.CANADA);
+
+ if (setting.equals("yes") || setting.equals("true") || setting.equals("on") || setting.equals("1")) {
+ return true;
+ }
+ if (setting.equals("no") || setting.equals("false") || setting.equals("off") || setting.equals("0")) {
+ return false;
+ }
+
+ throw new IllegalArgumentException("UnrecognizedBooleanValue: \"" + value + "\"");
+ }
+
+ private int setValue(DbDriver driver, PrintWriter pw, String trimmed, int equPos)
+ {
+ String name = trimmed.substring(0, equPos).trim();
+ String value = trimmed.substring(equPos + 1).trim();
+
+ String lcName = name.toLowerCase(Locale.CANADA);
+
+ if (lcName.equals("suppress_nulls")) {
+ driver.setSuppressNulls(parseBoolean(value));
+ }
+ else {
+ // TODO: Stringtable
+ pw.println("??? Unrecognized setting name \"" + name + "\" ignored.");
+ return 0;
+ }
+
+ return 1;
+ }
+}