adds support for null suppression
[squelch.git] / src / main / java / net / jaekl / squelch / stmt / PSet.java
diff --git a/src/main/java/net/jaekl/squelch/stmt/PSet.java b/src/main/java/net/jaekl/squelch/stmt/PSet.java
new file mode 100644 (file)
index 0000000..a64edc2
--- /dev/null
@@ -0,0 +1,96 @@
+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;
+       }
+}