public String[] authenticate(String paramString1, String paramString2) throws DenyException {
   if (!this.initialized)
     throw new IllegalStateException(
         "You must invoke the 'init' method to initialize the "
             + HsqldbSlaveAuthBean.class.getName()
             + " instance.");
   Connection localConnection = null;
   try {
     localConnection = DriverManager.getConnection(this.masterJdbcUrl, paramString1, paramString2);
     if (this.delegateRolesSchema) {
       localSet = AuthUtils.getEnabledRoles(localConnection);
       String str = AuthUtils.getInitialSchema(localConnection);
       if (str != null) localSet.add(str);
       logger.finer("Slave delegating schema+roles: " + localSet);
       String[] arrayOfString = (String[]) localSet.toArray(new String[0]);
       return arrayOfString;
     }
     Set localSet = null;
     return localSet;
   } catch (SQLException localSQLException1) {
     throw new DenyException();
   } finally {
     if (localConnection != null)
       try {
         localConnection.close();
         localConnection = null;
       } catch (SQLException localSQLException4) {
         logger.severe("Failed to close master/slave Connection", localSQLException4);
       }
   }
 }
 public void init() throws SQLException {
   if (this.masterJdbcUrl == null)
     throw new IllegalStateException("Required property 'masterJdbcUrl' not set");
   if ((this.validationUser != null) || (this.validationPassword != null)) {
     if ((this.validationUser == null) || (this.validationPassword == null))
       throw new IllegalStateException(
           "If you set one property of 'validationUser' or 'validationPassword', then you must set both.");
     Connection localConnection = null;
     Object localObject1 = null;
     try {
       localConnection =
           DriverManager.getConnection(
               this.masterJdbcUrl, this.validationUser, this.validationPassword);
     } catch (SQLException localSQLException2) {
       logger.error("Master/slave Connection validation failure", localSQLException2);
       localObject1 = localSQLException2;
     } finally {
       if (localConnection != null)
         try {
           localConnection.close();
           localConnection = null;
         } catch (SQLException localSQLException4) {
           logger.error("Failed to close test master/slave Connection", localSQLException4);
           if (localObject1 == null) throw localSQLException4;
         }
     }
   }
   this.initialized = true;
 }
Exemple #3
0
/**
 * This class is a scanner generated by <a href="http://www.jflex.de/">JFlex</a> 1.4.1 on 12/18/09
 * 5:41 PM from the specification file
 * <tt>/home/blaine/hsqldb/src/org/hsqldb/cmdline/sqltool.flex</tt>
 */
public class SqlFileScanner implements TokenSource {

  /** This character denotes the end of file */
  public static final int YYEOF = -1;

  /** initial size of the lookahead buffer */
  private static final int ZZ_BUFFERSIZE = 16384;

  /** lexical states */
  public static final int SPECIAL = 12;

  public static final int SQL_DOUBLE_QUOTED = 8;
  public static final int SQL_SINGLE_QUOTED = 6;
  public static final int GOBBLE = 10;
  public static final int RAW = 4;
  public static final int SQL = 2;
  public static final int YYINITIAL = 0;
  public static final int EDIT = 16;
  public static final int PL = 14;
  public static final int PROMPT_CHANGE_STATE = 20;
  public static final int MACRO = 18;

  /**
   * ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l ZZ_LEXSTATE[l+1] is the state in
   * the DFA for the lexical state l at the beginning of a line l is of the form l = 2*k, k a non
   * negative integer
   */
  private static final int ZZ_LEXSTATE[] = {
    0, 0, 1, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11
  };

  /** Translates characters to character classes */
  private static final String ZZ_CMAP_PACKED =
      "\11\0\1\6\1\2\1\0\1\6\1\1\22\0\1\6\1\0\1\3"
          + "\4\0\1\33\2\0\1\5\2\0\1\7\1\32\1\4\12\0\1\31"
          + "\1\10\5\0\1\20\1\11\1\16\1\26\1\12\1\22\1\13\1\0"
          + "\1\14\2\0\1\27\1\0\1\15\1\24\1\25\1\0\1\17\1\0"
          + "\1\21\1\23\6\0\1\30\4\0\1\20\1\11\1\16\1\26\1\12"
          + "\1\22\1\13\1\0\1\14\2\0\1\27\1\0\1\15\1\24\1\25"
          + "\1\0\1\17\1\0\1\21\1\23\uff8a\0";

  /** Translates characters to character classes */
  private static final char[] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);

  /** Translates DFA states to action switch labels. */
  private static final int[] ZZ_ACTION = zzUnpackAction();

  private static final String ZZ_ACTION_PACKED_0 =
      "\14\0\1\1\2\2\1\3\1\4\1\5\1\6\1\7"
          + "\1\10\3\1\1\11\1\12\1\13\2\14\1\15\2\13"
          + "\1\16\1\17\2\20\1\13\1\0\2\21\1\0\1\22"
          + "\1\23\1\22\1\24\2\25\1\22\2\26\2\22\2\27"
          + "\2\30\2\31\2\32\7\0\2\33\10\0\2\34\2\35"
          + "\1\0\2\36\1\37\3\0\1\40\1\41\3\0\2\42"
          + "\23\0";

  private static int[] zzUnpackAction() {
    int[] result = new int[114];
    int offset = 0;
    offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
    return result;
  }

  private static int zzUnpackAction(String packed, int offset, int[] result) {
    int i = 0; /* index in packed string  */
    int j = offset; /* index in unpacked array */
    int l = packed.length();
    while (i < l) {
      int count = packed.charAt(i++);
      int value = packed.charAt(i++);
      do result[j++] = value;
      while (--count > 0);
    }
    return j;
  }

  /** Translates a state to a row index in the transition table */
  private static final int[] ZZ_ROWMAP = zzUnpackRowMap();

  private static final String ZZ_ROWMAP_PACKED_0 =
      "\0\0\0\34\0\70\0\124\0\160\0\214\0\250\0\304"
          + "\0\340\0\374\0\u0118\0\u0134\0\u0150\0\u016c\0\u0150\0\u0150"
          + "\0\u0188\0\u0150\0\u01a4\0\u01c0\0\u0150\0\u01dc\0\u01f8\0\u0214"
          + "\0\u0150\0\u0150\0\u0150\0\u0230\0\u0150\0\u0150\0\u024c\0\u0268"
          + "\0\u0150\0\u0150\0\u0284\0\u0150\0\u02a0\0\u02bc\0\u02d8\0\u0150"
          + "\0\u02f4\0\u0310\0\u032c\0\u0348\0\u0150\0\u0364\0\u0150\0\u0150"
          + "\0\u0380\0\u0150\0\u039c\0\u03b8\0\u03d4\0\u0150\0\u03f0\0\u0150"
          + "\0\u040c\0\u0150\0\u0428\0\u0150\0\u0444\0\u0460\0\u047c\0\u0498"
          + "\0\u04b4\0\u04d0\0\u02a0\0\u04ec\0\u0150\0\u0508\0\u0524\0\u0540"
          + "\0\u055c\0\u0578\0\u0594\0\u05b0\0\u05cc\0\u05e8\0\u0150\0\u0604"
          + "\0\u0150\0\u0620\0\u063c\0\u0150\0\u0150\0\u0658\0\u0674\0\u0690"
          + "\0\u0150\0\u0150\0\u06ac\0\u06c8\0\u06e4\0\u0700\0\u0150\0\u071c"
          + "\0\u0738\0\u0754\0\u0770\0\u078c\0\u07a8\0\u07c4\0\u07e0\0\u07fc"
          + "\0\u0818\0\u0834\0\u0850\0\u086c\0\u0888\0\u08a4\0\u08c0\0\u08dc"
          + "\0\u08f8\0\u0914";

  private static int[] zzUnpackRowMap() {
    int[] result = new int[114];
    int offset = 0;
    offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
    return result;
  }

  private static int zzUnpackRowMap(String packed, int offset, int[] result) {
    int i = 0; /* index in packed string  */
    int j = offset; /* index in unpacked array */
    int l = packed.length();
    while (i < l) {
      int high = packed.charAt(i++) << 16;
      result[j++] = high | packed.charAt(i++);
    }
    return j;
  }

  /** The transition table of the DFA */
  private static final int[] ZZ_TRANS = zzUnpackTrans();

  private static final String ZZ_TRANS_PACKED_0 =
      "\1\15\1\16\1\17\1\20\1\21\1\22\1\23\1\24"
          + "\1\25\1\26\4\15\1\27\7\15\1\30\1\15\1\31"
          + "\1\32\1\15\1\20\1\33\1\34\1\35\1\36\1\37"
          + "\2\33\1\40\1\41\22\33\1\42\1\33\1\43\1\44"
          + "\1\36\1\37\1\33\1\45\1\40\1\41\22\33\1\42"
          + "\1\46\1\47\1\50\3\46\1\4\23\46\1\51\1\46"
          + "\33\52\1\53\3\54\1\55\30\54\1\7\1\56\1\57"
          + "\31\7\1\60\1\61\1\62\1\60\1\63\2\60\1\64"
          + "\25\60\1\65\1\66\1\60\1\63\2\60\1\64\25\60"
          + "\1\67\1\70\32\60\1\71\1\72\1\60\1\63\2\60"
          + "\1\64\24\60\1\0\1\73\1\74\67\0\1\17\36\0"
          + "\1\75\34\0\1\23\25\0\1\24\2\0\31\24\12\0"
          + "\1\76\40\0\1\77\26\0\1\100\23\0\1\35\36\0"
          + "\1\101\35\0\1\102\26\0\1\44\32\0\1\43\1\44"
          + "\3\0\1\103\25\0\1\46\1\47\1\50\31\46\2\0"
          + "\1\50\31\0\1\46\1\104\1\105\3\46\1\51\1\46"
          + "\1\106\23\46\33\52\34\0\1\60\3\54\1\0\30\54"
          + "\2\0\1\57\33\0\1\62\36\0\1\107\35\0\1\110"
          + "\26\0\1\66\33\0\1\70\33\0\1\72\33\0\1\74"
          + "\31\0\5\75\1\111\26\75\13\0\1\112\32\0\1\113"
          + "\37\0\1\114\15\0\5\101\1\115\26\101\1\102\1\116"
          + "\1\117\31\102\2\0\1\105\31\0\1\46\1\120\1\121"
          + "\3\46\1\106\25\46\5\107\1\122\26\107\1\110\1\123"
          + "\1\124\31\110\4\75\1\125\1\111\26\75\14\0\1\126"
          + "\37\0\1\127\42\0\1\130\4\0\4\101\1\131\1\115"
          + "\26\101\2\0\1\117\33\0\1\121\31\0\4\107\1\132"
          + "\1\122\26\107\2\0\1\124\46\0\1\133\37\0\1\134"
          + "\32\0\1\135\14\0\1\136\1\137\3\0\1\133\37\0"
          + "\1\140\40\0\1\141\16\0\1\137\37\0\1\142\37\0"
          + "\1\133\27\0\1\142\13\0\1\143\2\0\1\144\31\0"
          + "\1\145\27\0\1\146\31\0\1\147\42\0\1\150\25\0"
          + "\1\151\33\0\1\152\36\0\1\153\24\0\1\154\35\0"
          + "\1\155\45\0\1\156\31\0\1\157\32\0\1\160\25\0"
          + "\1\161\35\0\1\162\14\0\1\161\1\136\1\137\31\161"
          + "\12\0\1\161\21\0";

  private static int[] zzUnpackTrans() {
    int[] result = new int[2352];
    int offset = 0;
    offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
    return result;
  }

  private static int zzUnpackTrans(String packed, int offset, int[] result) {
    int i = 0; /* index in packed string  */
    int j = offset; /* index in unpacked array */
    int l = packed.length();
    while (i < l) {
      int count = packed.charAt(i++);
      int value = packed.charAt(i++);
      value--;
      do result[j++] = value;
      while (--count > 0);
    }
    return j;
  }

  /* error codes */
  private static final int ZZ_UNKNOWN_ERROR = 0;
  private static final int ZZ_NO_MATCH = 1;
  private static final int ZZ_PUSHBACK_2BIG = 2;

  /* error messages for the codes above */
  private static final String ZZ_ERROR_MSG[] = {
    "Unkown internal scanner error",
    "Error: could not match input",
    "Error: pushback value was too large"
  };

  /** ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code> */
  private static final int[] ZZ_ATTRIBUTE = zzUnpackAttribute();

  private static final String ZZ_ATTRIBUTE_PACKED_0 =
      "\14\0\1\11\1\1\2\11\1\1\1\11\2\1\1\11"
          + "\3\1\3\11\1\1\2\11\2\1\2\11\1\1\1\11"
          + "\1\1\1\0\1\1\1\11\1\0\3\1\1\11\1\1"
          + "\2\11\1\1\1\11\3\1\1\11\1\1\1\11\1\1"
          + "\1\11\1\1\1\11\7\0\1\1\1\11\10\0\1\1"
          + "\1\11\1\1\1\11\1\0\1\1\2\11\3\0\2\11"
          + "\3\0\1\1\1\11\23\0";

  private static int[] zzUnpackAttribute() {
    int[] result = new int[114];
    int offset = 0;
    offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
    return result;
  }

  private static int zzUnpackAttribute(String packed, int offset, int[] result) {
    int i = 0; /* index in packed string  */
    int j = offset; /* index in unpacked array */
    int l = packed.length();
    while (i < l) {
      int count = packed.charAt(i++);
      int value = packed.charAt(i++);
      do result[j++] = value;
      while (--count > 0);
    }
    return j;
  }

  /** the input device */
  private java.io.Reader zzReader;

  /** the current state of the DFA */
  private int zzState;

  /** the current lexical state */
  private int zzLexicalState = YYINITIAL;

  /**
   * this buffer contains the current text to be matched and is the source of the yytext() string
   */
  private char zzBuffer[] = new char[ZZ_BUFFERSIZE];

  /** the textposition at the last accepting state */
  private int zzMarkedPos;

  /** the textposition at the last state to be included in yytext */
  private int zzPushbackPos;

  /** the current text position in the buffer */
  private int zzCurrentPos;

  /** startRead marks the beginning of the yytext() string in the buffer */
  private int zzStartRead;

  /** endRead marks the last character in the buffer, that has been read from input */
  private int zzEndRead;

  /** number of newlines encountered up to the start of the matched text */
  private int yyline;

  /** the number of characters up to the start of the matched text */
  private int yychar;

  /** the number of characters from the last newline up to the start of the matched text */
  private int yycolumn;

  /** zzAtBOL == true <=> the scanner is currently at the beginning of a line */
  private boolean zzAtBOL = true;

  /** zzAtEOF == true <=> the scanner is at the EOF */
  private boolean zzAtEOF;

  /** denotes if the user-EOF-code has already been executed */
  private boolean zzEOFDone;

  /* user code: */
  private static FrameworkLogger logger = FrameworkLogger.getLog(SqlFileScanner.class);
  private StringBuffer commandBuffer = new StringBuffer();
  private boolean interactive;
  private PrintStream psStd = System.out;
  private String magicPrefix;
  private int requestedState = YYINITIAL;
  private String rawLeadinPrompt;
  private boolean specialAppendState;
  // This last is needed for very unique check needed when appending to
  // a SQL command.  Only applies to interactive mode.

  public void setRequestedState(int requestedState) {
    this.requestedState = requestedState;
  }

  /**
   * Really need a way to validate that this is called before using the scanner, like Spring's
   * init-method property. For now, will just check explicitly before using.
   */
  public void setRawLeadinPrompt(String rawLeadinPrompt) {
    this.rawLeadinPrompt = rawLeadinPrompt;
  }

  private void rawLeadinPrompt() {
    if (!interactive) {
      return;
    }
    if (rawLeadinPrompt == null) {
      throw new RuntimeException(
          "Internal assertion failed.  "
              + "Scanner's message Resource Bundle not initialized properly");
    }
    psStd.println(rawLeadinPrompt);
  }

  // Trims only the end
  private void trimBuffer() {
    int len = commandBuffer.length();
    commandBuffer.setLength(len - ((len > 1 && commandBuffer.charAt(len - 2) == '\r') ? 2 : 1));
  }

  public void setCommandBuffer(String s) {
    commandBuffer.setLength(0);
    commandBuffer.append(s);
  }

  public void setInteractive(boolean interactive) {
    this.interactive = interactive;
  }

  public void setMagicPrefix(String magicPrefix) {
    this.magicPrefix = magicPrefix;
  }

  public void setStdPrintStream(PrintStream psStd) {
    this.psStd = psStd;
  }

  // private String sqlPrompt = "+sql> ";
  private String sqlPrompt = null;

  public void setSqlPrompt(String sqlPrompt) {
    this.sqlPrompt = sqlPrompt;
  }

  public String getSqlPrompt() {
    return sqlPrompt;
  }

  // private String sqltoolPrompt = "sql> ";
  private String sqltoolPrompt = null;

  public void setSqltoolPrompt(String sqltoolPrompt) {
    this.sqltoolPrompt = sqltoolPrompt;
  }

  public String getSqltoolPrompt() {
    return sqltoolPrompt;
  }
  // private String rawPrompt = "raw> ";
  private String rawPrompt = null;

  public void setRawPrompt(String rawPrompt) {
    this.rawPrompt = rawPrompt;
  }

  public String getRawPrompt() {
    return rawPrompt;
  }

  private void debug(String id, String msg) {
    logger.finest(id + ":  [" + msg + ']');
  }

  public String strippedYytext() {
    String lineString = yytext();
    int len = lineString.length();
    len = len - ((len > 1 && lineString.charAt(len - 2) == '\r') ? 2 : 1);
    return (lineString.substring(0, len));
  }

  // Trims only the end
  public void pushbackTrim() {
    String lineString = yytext();
    int len = lineString.length();
    yypushback((len > 1 && lineString.charAt(len - 2) == '\r') ? 2 : 1);
  }

  private void prompt(String s) {
    if (!interactive) return;
    psStd.print(s);
  }

  public void prompt() {
    if (sqltoolPrompt != null) prompt(sqltoolPrompt);
    specialAppendState = (interactive && magicPrefix != null);
    // This tells scanner that if SQL input "looks" empty, it isn't.
    if (interactive && magicPrefix != null) {
      psStd.print(magicPrefix);
      magicPrefix = null;
    }
  }

  /**
   * Creates a new scanner There is also a java.io.InputStream version of this constructor.
   *
   * @param in the java.io.Reader to read input from.
   */
  public SqlFileScanner(java.io.Reader in) {
    this.zzReader = in;
  }

  /**
   * Creates a new scanner. There is also java.io.Reader version of this constructor.
   *
   * @param in the java.io.Inputstream to read input from.
   */
  public SqlFileScanner(java.io.InputStream in) {
    this(new java.io.InputStreamReader(in));
  }

  /**
   * Unpacks the compressed character translation table.
   *
   * @param packed the packed character translation table
   * @return the unpacked character translation table
   */
  private static char[] zzUnpackCMap(String packed) {
    char[] map = new char[0x10000];
    int i = 0; /* index in packed string  */
    int j = 0; /* index in unpacked array */
    while (i < 132) {
      int count = packed.charAt(i++);
      char value = packed.charAt(i++);
      do map[j++] = value;
      while (--count > 0);
    }
    return map;
  }

  /**
   * Refills the input buffer.
   *
   * @return <code>false</code>, iff there was new input.
   * @exception java.io.IOException if any I/O-Error occurs
   */
  private boolean zzRefill() throws java.io.IOException {

    /* first: make room (if you can) */
    if (zzStartRead > 0) {
      System.arraycopy(zzBuffer, zzStartRead, zzBuffer, 0, zzEndRead - zzStartRead);

      /* translate stored positions */
      zzEndRead -= zzStartRead;
      zzCurrentPos -= zzStartRead;
      zzMarkedPos -= zzStartRead;
      zzPushbackPos -= zzStartRead;
      zzStartRead = 0;
    }

    /* is the buffer big enough? */
    if (zzCurrentPos >= zzBuffer.length) {
      /* if not: blow it up */
      char newBuffer[] = new char[zzCurrentPos * 2];
      System.arraycopy(zzBuffer, 0, newBuffer, 0, zzBuffer.length);
      zzBuffer = newBuffer;
    }

    /* finally: fill the buffer with new input */
    int numRead = zzReader.read(zzBuffer, zzEndRead, zzBuffer.length - zzEndRead);

    if (numRead < 0) {
      return true;
    } else {
      zzEndRead += numRead;
      return false;
    }
  }

  /** Closes the input stream. */
  public final void yyclose() throws java.io.IOException {
    zzAtEOF = true; /* indicate end of file */
    zzEndRead = zzStartRead; /* invalidate buffer    */

    if (zzReader != null) zzReader.close();
  }

  /**
   * Resets the scanner to read from a new input stream. Does not close the old reader.
   *
   * <p>All internal variables are reset, the old input stream <b>cannot</b> be reused (internal
   * buffer is discarded and lost). Lexical state is set to <tt>ZZ_INITIAL</tt>.
   *
   * @param reader the new input stream
   */
  public final void yyreset(java.io.Reader reader) {
    zzReader = reader;
    zzAtBOL = true;
    zzAtEOF = false;
    zzEndRead = zzStartRead = 0;
    zzCurrentPos = zzMarkedPos = zzPushbackPos = 0;
    yyline = yychar = yycolumn = 0;
    zzLexicalState = YYINITIAL;
  }

  /** Returns the current lexical state. */
  public final int yystate() {
    return zzLexicalState;
  }

  /**
   * Enters a new lexical state
   *
   * @param newState the new lexical state
   */
  public final void yybegin(int newState) {
    zzLexicalState = newState;
  }

  /** Returns the text matched by the current regular expression. */
  public final String yytext() {
    return new String(zzBuffer, zzStartRead, zzMarkedPos - zzStartRead);
  }

  /**
   * Returns the character at position <tt>pos</tt> from the matched text.
   *
   * <p>It is equivalent to yytext().charAt(pos), but faster
   *
   * @param pos the position of the character to fetch. A value from 0 to yylength()-1.
   * @return the character at position pos
   */
  public final char yycharat(int pos) {
    return zzBuffer[zzStartRead + pos];
  }

  /** Returns the length of the matched text region. */
  public final int yylength() {
    return zzMarkedPos - zzStartRead;
  }

  /**
   * Reports an error that occured while scanning.
   *
   * <p>In a wellformed scanner (no or only correct usage of yypushback(int) and a match-all
   * fallback rule) this method will only be called with things that "Can't Possibly Happen". If
   * this method is called, something is seriously wrong (e.g. a JFlex bug producing a faulty
   * scanner etc.).
   *
   * <p>Usual syntax/scanner level error handling should be done in error fallback rules.
   *
   * @param errorCode the code of the errormessage to display
   */
  private void zzScanError(int errorCode) {
    String message;
    try {
      message = ZZ_ERROR_MSG[errorCode];
    } catch (ArrayIndexOutOfBoundsException e) {
      message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
    }

    throw new Error(message);
  }

  /**
   * Pushes the specified amount of characters back into the input stream.
   *
   * <p>They will be read again by then next call of the scanning method
   *
   * @param number the number of characters to be read again. This number must not be greater than
   *     yylength()!
   */
  public void yypushback(int number) {
    if (number > yylength()) zzScanError(ZZ_PUSHBACK_2BIG);

    zzMarkedPos -= number;
  }

  /**
   * Contains user EOF-code, which will be executed exactly once, when the end of file is reached
   */
  private void zzDoEOF() throws java.io.IOException {
    if (!zzEOFDone) {
      zzEOFDone = true;
      yyclose();
    }
  }

  /**
   * Resumes scanning until the next regular expression is matched, the end of input is encountered
   * or an I/O-Error occurs.
   *
   * @return the next token
   * @exception java.io.IOException if any I/O-Error occurs
   */
  public Token yylex() throws java.io.IOException {
    int zzInput;
    int zzAction;

    // cached fields:
    int zzCurrentPosL;
    int zzMarkedPosL;
    int zzEndReadL = zzEndRead;
    char[] zzBufferL = zzBuffer;
    char[] zzCMapL = ZZ_CMAP;

    int[] zzTransL = ZZ_TRANS;
    int[] zzRowMapL = ZZ_ROWMAP;
    int[] zzAttrL = ZZ_ATTRIBUTE;

    while (true) {
      zzMarkedPosL = zzMarkedPos;

      boolean zzR = false;
      for (zzCurrentPosL = zzStartRead; zzCurrentPosL < zzMarkedPosL; zzCurrentPosL++) {
        switch (zzBufferL[zzCurrentPosL]) {
          case '\u000B':
          case '\u000C':
          case '\u0085':
          case '\u2028':
          case '\u2029':
            yyline++;
            yycolumn = 0;
            zzR = false;
            break;
          case '\r':
            yyline++;
            yycolumn = 0;
            zzR = true;
            break;
          case '\n':
            if (zzR) zzR = false;
            else {
              yyline++;
              yycolumn = 0;
            }
            break;
          default:
            zzR = false;
            yycolumn++;
        }
      }

      if (zzR) {
        // peek one character ahead if it is \n (if we have counted one line too much)
        boolean zzPeek;
        if (zzMarkedPosL < zzEndReadL) zzPeek = zzBufferL[zzMarkedPosL] == '\n';
        else if (zzAtEOF) zzPeek = false;
        else {
          boolean eof = zzRefill();
          zzEndReadL = zzEndRead;
          zzMarkedPosL = zzMarkedPos;
          zzBufferL = zzBuffer;
          if (eof) zzPeek = false;
          else zzPeek = zzBufferL[zzMarkedPosL] == '\n';
        }
        if (zzPeek) yyline--;
      }
      if (zzMarkedPosL > zzStartRead) {
        switch (zzBufferL[zzMarkedPosL - 1]) {
          case '\n':
          case '\u000B':
          case '\u000C':
          case '\u0085':
          case '\u2028':
          case '\u2029':
            zzAtBOL = true;
            break;
          case '\r':
            if (zzMarkedPosL < zzEndReadL) zzAtBOL = zzBufferL[zzMarkedPosL] != '\n';
            else if (zzAtEOF) zzAtBOL = false;
            else {
              boolean eof = zzRefill();
              zzMarkedPosL = zzMarkedPos;
              zzEndReadL = zzEndRead;
              zzBufferL = zzBuffer;
              if (eof) zzAtBOL = false;
              else zzAtBOL = zzBufferL[zzMarkedPosL] != '\n';
            }
            break;
          default:
            zzAtBOL = false;
        }
      }
      zzAction = -1;

      zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;

      if (zzAtBOL) zzState = ZZ_LEXSTATE[zzLexicalState + 1];
      else zzState = ZZ_LEXSTATE[zzLexicalState];

      zzForAction:
      {
        while (true) {

          if (zzCurrentPosL < zzEndReadL) zzInput = zzBufferL[zzCurrentPosL++];
          else if (zzAtEOF) {
            zzInput = YYEOF;
            break zzForAction;
          } else {
            // store back cached positions
            zzCurrentPos = zzCurrentPosL;
            zzMarkedPos = zzMarkedPosL;
            boolean eof = zzRefill();
            // get translated positions and possibly new buffer
            zzCurrentPosL = zzCurrentPos;
            zzMarkedPosL = zzMarkedPos;
            zzBufferL = zzBuffer;
            zzEndReadL = zzEndRead;
            if (eof) {
              zzInput = YYEOF;
              break zzForAction;
            } else {
              zzInput = zzBufferL[zzCurrentPosL++];
            }
          }
          int zzNext = zzTransL[zzRowMapL[zzState] + zzCMapL[zzInput]];
          if (zzNext == -1) break zzForAction;
          zzState = zzNext;

          int zzAttributes = zzAttrL[zzState];
          if ((zzAttributes & 1) == 1) {
            zzAction = zzState;
            zzMarkedPosL = zzCurrentPosL;
            if ((zzAttributes & 8) == 8) break zzForAction;
          }
        }
      }

      // store back cached position
      zzMarkedPos = zzMarkedPosL;

      switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
        case 19:
          {
            commandBuffer.append(yytext());
            debug("SQL '", yytext());
            yybegin(SQL);
          }
        case 35:
          break;
        case 9:
          {
            commandBuffer.setLength(0);
            yybegin(SPECIAL);
          }
        case 36:
          break;
        case 30:
          {
            pushbackTrim();
            /* embedded comment may disable opening quotes and closing ; */
            debug("Spl. -- Comment", yytext());
          }
        case 37:
          break;
        case 10:
          {
            commandBuffer.setLength(0);
            yybegin(EDIT);
          }
        case 38:
          break;
        case 21:
          {
            yybegin(YYINITIAL);
            debug("Gobbled", yytext());
            prompt();
          }
        case 39:
          break;
        case 31:
          {
              /* Ignore top-level traditional comments */
            debug("/**/ Comment", yytext());
          }
        case 40:
          break;
        case 8:
          {
            return new Token(Token.SQL_TYPE, yyline);
          }
        case 41:
          break;
        case 2:
          {
            prompt();
          }
        case 42:
          break;
        case 22:
          {
            if (commandBuffer.toString().trim().equals(".")) {
              commandBuffer.setLength(0);
              yybegin(RAW);
              rawLeadinPrompt();
              if (rawPrompt != null) prompt(rawPrompt);
            } else {
              requestedState = YYINITIAL;
              yybegin(PROMPT_CHANGE_STATE);
              pushbackTrim();
              return new Token(Token.SPECIAL_TYPE, commandBuffer, yyline);
            }
          }
        case 43:
          break;
        case 28:
          {
            specialAppendState = false;
            commandBuffer.append(yytext());
            /* embedded comment may disable opening quotes and closing ; */
            debug("SQL -- Comment", yytext());
          }
        case 44:
          break;
        case 17:
          {
            if (commandBuffer.length() > 0) commandBuffer.append('\n');
            commandBuffer.append(strippedYytext());
            if (rawPrompt != null) prompt(rawPrompt);
          }
        case 45:
          break;
        case 26:
          {
            yybegin(requestedState);
            prompt();
          }
        case 46:
          break;
        case 4:
          {
            commandBuffer.setLength(0);
            yybegin(MACRO);
          }
        case 47:
          break;
        case 6:
          {
              /* Ignore top-level whte space */
            debug("Whitespace", yytext());
          }
        case 48:
          break;
        case 18:
          {
            commandBuffer.append(yytext());
          }
        case 49:
          break;
        case 11:
          {
            specialAppendState = false;
            commandBuffer.append(yytext());
          }
        case 50:
          break;
        case 25:
          {
            requestedState = YYINITIAL;
            yybegin(PROMPT_CHANGE_STATE);
            pushbackTrim();
            return new Token(Token.MACRO_TYPE, commandBuffer, yyline);
          }
        case 51:
          break;
        case 16:
          {
            if (interactive && !specialAppendState) {
              requestedState = YYINITIAL;
              yybegin(PROMPT_CHANGE_STATE);
              pushbackTrim();
              trimBuffer();
              return new Token(Token.BUFFER_TYPE, commandBuffer, yyline);
            }
            specialAppendState = false;
            commandBuffer.append(yytext());
          }
        case 52:
          break;
        case 29:
          {
            yybegin(YYINITIAL);
            prompt();
            return new Token(Token.RAWEXEC_TYPE, commandBuffer, yyline);
          }
        case 53:
          break;
        case 27:
          {
            yybegin(YYINITIAL);
            prompt();
            return new Token(Token.RAW_TYPE, commandBuffer, yyline);
          }
        case 54:
          break;
        case 14:
          {
            specialAppendState = false;
            yybegin(YYINITIAL);
            return new Token(Token.SQL_TYPE, commandBuffer, yyline);
          }
        case 55:
          break;
        case 33:
          {
              /* embedded comment may disable opening closing \n */
            debug("Spl. /**/ Comment", yytext());
          }
        case 56:
          break;
        case 3:
          {
            yybegin(GOBBLE);
            return new Token(Token.SYNTAX_ERR_TYPE, yytext(), yyline);
          }
        case 57:
          break;
        case 20:
          {
            commandBuffer.append(yytext());
            yybegin(SQL);
            debug("SQL \"", yytext());
          }
        case 58:
          break;
        case 1:
          {
            setCommandBuffer(yytext());
            yybegin(SQL);
          }
        case 59:
          break;
        case 23:
          {
            requestedState = YYINITIAL;
            yybegin(PROMPT_CHANGE_STATE);
            pushbackTrim();
            return new Token(Token.PL_TYPE, commandBuffer, yyline);
          }
        case 60:
          break;
        case 12:
          {
            specialAppendState = false;
            commandBuffer.append(yytext());
            if (sqlPrompt != null) prompt(sqlPrompt);
          }
        case 61:
          break;
        case 24:
          {
            requestedState = YYINITIAL;
            yybegin(PROMPT_CHANGE_STATE);
            pushbackTrim();
            return new Token(Token.EDIT_TYPE, commandBuffer, yyline);
          }
        case 62:
          break;
        case 7:
          {
            debug("-- Comment", yytext());
          }
        case 63:
          break;
        case 15:
          {
            specialAppendState = false;
            commandBuffer.append(yytext());
            yybegin(SQL_SINGLE_QUOTED);
          }
        case 64:
          break;
        case 5:
          {
            commandBuffer.setLength(0);
            yybegin(PL);
          }
        case 65:
          break;
        case 34:
          {
              /* These are commands which may contain nested commands and/or which
               * require the closing semicolon to sent to the DB engine.
               * The BEGIN and DECLARE needed for PL/SQL probably do not need to
               * terminate the line, as we have it specified here, but I'd rather not be
               * too liberal with proprietary SQL like this, because it's easy to
               * envision other proprietary or non-proprietary commands beginning with
               * DECLARE or BEGIN. */
            setCommandBuffer(strippedYytext());
            yybegin(RAW);
            rawLeadinPrompt();
            if (rawPrompt != null) prompt(rawPrompt);
          }
        case 66:
          break;
        case 32:
          {
            specialAppendState = false;
            commandBuffer.append(yytext());
            /* embedded comment may disable opening quotes and closing ; */
            debug("SQL /**/ Comment", yytext());
          }
        case 67:
          break;
        case 13:
          {
            specialAppendState = false;
            commandBuffer.append(yytext());
            yybegin(SQL_DOUBLE_QUOTED);
          }
        case 68:
          break;
        default:
          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
            zzAtEOF = true;
            zzDoEOF();
            switch (zzLexicalState) {
              case SPECIAL:
                {
                  yybegin(YYINITIAL);
                  return new Token(Token.UNTERM_TYPE, commandBuffer, yyline);
                }
              case 115:
                break;
              case SQL_DOUBLE_QUOTED:
                {
                  yybegin(YYINITIAL);
                  return new Token(Token.UNTERM_TYPE, commandBuffer, yyline);
                }
              case 116:
                break;
              case SQL_SINGLE_QUOTED:
                {
                  yybegin(YYINITIAL);
                  return new Token(Token.UNTERM_TYPE, commandBuffer, yyline);
                }
              case 117:
                break;
              case SQL:
                {
                  yybegin(YYINITIAL);
                  return new Token(Token.UNTERM_TYPE, commandBuffer, yyline);
                }
              case 118:
                break;
              case EDIT:
                {
                  yybegin(YYINITIAL);
                  return new Token(Token.UNTERM_TYPE, commandBuffer, yyline);
                }
              case 119:
                break;
              case PL:
                {
                  yybegin(YYINITIAL);
                  return new Token(Token.UNTERM_TYPE, commandBuffer, yyline);
                }
              case 120:
                break;
              case MACRO:
                {
                  yybegin(YYINITIAL);
                  return new Token(Token.UNTERM_TYPE, commandBuffer, yyline);
                }
              case 121:
                break;
              default:
                return null;
            }
          } else {
            zzScanError(ZZ_NO_MATCH);
          }
      }
    }
  }
}
Exemple #4
0
 private void debug(String id, String msg) {
   logger.finest(id + ":  [" + msg + ']');
 }
  /**
   * Closes this Database using the specified mode.
   *
   * <p>
   *
   * <ol>
   *   <LI>closemode -1 performs SHUTDOWN IMMEDIATELY, equivalent to a poweroff or crash.
   *   <LI>closemode 0 performs a normal SHUTDOWN that checkpoints the database normally.
   *   <LI>closemode 1 performs a shutdown compact that scripts out the contents of any CACHED
   *       tables to the log then deletes the existing *.data file that contains the data for all
   *       CACHED table before the normal checkpoint process which in turn creates a new, compact
   *       *.data file.
   * </ol>
   */
  public void close(int closemode) {

    HsqlException he = null;

    // multiple simultaneous close
    synchronized (this) {
      if (getState() != DATABASE_ONLINE) {
        return;
      }

      setState(DATABASE_CLOSING);
    }

    sessionManager.closeAllSessions();

    if (filesReadOnly) {
      closemode = CLOSEMODE_IMMEDIATELY;
    }

    /** impact of possible error conditions in closing the log for the CLOSEMODE_COMPACT mode */
    boolean result = logger.close(closemode);

    lobManager.close();
    sessionManager.close();

    try {
      if (result && closemode == CLOSEMODE_COMPACT) {
        clearStructures();
        reopen();
        setState(DATABASE_CLOSING);
        sessionManager.closeAllSessions();
        logger.close(CLOSEMODE_NORMAL);
        lobManager.close();
        sessionManager.close();
      }
    } catch (Throwable t) {
      if (t instanceof HsqlException) {
        he = (HsqlException) t;
      } else {
        he = Error.error(ErrorCode.GENERAL_ERROR, t);
      }
    }

    lobManager = null;

    logger.releaseLock();
    setState(DATABASE_SHUTDOWN);
    clearStructures();

    // fredt - this could change to avoid removing a db from the
    // DatabaseManager repository if there are pending getDatabase()
    // calls
    DatabaseManager.removeDatabase(this);

    // todo - when hsqldb.sql. framework logging is supported, add another call
    FrameworkLogger.clearLoggers("hsqldb.db." + getUniqueName());

    if (he != null) {
      throw he;
    }
  }
Exemple #6
0
/**
 * A command-line JDBC SQL tool supporting both interactive and non-interactive usage.
 *
 * <p>See JavaDocs for the main method for syntax of how to run from the command-line.
 *
 * <p>
 *
 * <p>Programmatic users will usually want to use the objectMain(String[]) method if they want
 * arguments and behavior exactly like command-line SqlTool. But in many cases, you will have better
 * control and efficiency by using the SqlFile class directly. The file <CODE>
 * src/org/hsqldb/sample/SqlFileEmbedder.java</CODE> in the HSQLDB distribution provides an example
 * for this latter strategy.
 *
 * <p>
 *
 * @see <a href="../../../../util-guide/sqltool-chapt.html" target="guide"> The SqlTool chapter of
 *     the HyperSQL Utilities Guide</a>
 * @see #main(String[])
 * @see #objectMain(String[])
 * @see SqlFile
 * @see org.hsqldb.sample.SqlFileEmbedder
 * @version $Revision: 4720 $, $Date: 2011-11-08 00:10:09 +0000 (Tue, 08 Nov 2011) $
 * @author Blaine Simpson (blaine dot simpson at admc dot com)
 */
public class SqlTool {
  private static FrameworkLogger logger = FrameworkLogger.getLog(SqlTool.class);
  public static final String DEFAULT_RCFILE = System.getProperty("user.home") + "/sqltool.rc";
  // N.b. the following are static!
  private static final String revString = "$Revision: 4720 $";
  private static final int revStringLength = revString.length();
  private static final String revnum =
      (revStringLength - " $".length() > "$Revision: ".length())
          ? revString.substring("$Revision: ".length(), revStringLength - " $".length())
          : "<UNTRACKED>";

  public static final int SQLTOOLERR_EXITVAL = 1;
  public static final int SYNTAXERR_EXITVAL = 11;
  public static final int RCERR_EXITVAL = 2;
  public static final int SQLERR_EXITVAL = 3;
  public static final int IOERR_EXITVAL = 4;
  public static final int FILEERR_EXITVAL = 5;
  public static final int INPUTERR_EXITVAL = 6;
  public static final int CONNECTERR_EXITVAL = 7;

  /**
   * The configuration identifier to use when connection parameters are specified on the command
   * line
   */
  private static String CMDLINE_ID = "cmdline";

  /** Platform-specific line separator */
  public static String LS = System.getProperty("line.separator");

  /** Utility nested class for internal use. */
  private static class BadCmdline extends Exception {
    static final long serialVersionUID = -2134764796788108325L;

    BadCmdline() {
      // Purposefully empty
    }
  }

  /** Utility object for internal use. */
  private static BadCmdline bcl = new BadCmdline();

  /** For trapping of exceptions inside this class. These are always handled inside this class. */
  private static class PrivateException extends Exception {
    static final long serialVersionUID = -7765061479594523462L;

    /* Unused at this time
    PrivateException() {
        super();
    }
    */

    PrivateException(String s) {
      super(s);
    }
  }

  public static class SqlToolException extends Exception {
    static final long serialVersionUID = 1424909871915188519L;

    int exitValue = 1;

    SqlToolException(String message, int exitValue) {
      super(message);
      this.exitValue = exitValue;
    }

    SqlToolException(int exitValue, String message) {
      this(message, exitValue);
    }

    SqlToolException(int exitValue) {
      super();
      this.exitValue = exitValue;
    }
  }

  /**
   * Prompt the user for a password.
   *
   * @param username The user the password is for
   * @return The password the user entered
   */
  private static String promptForPassword(String username) throws PrivateException {

    BufferedReader console;
    String password;

    password = null;

    try {
      console = new BufferedReader(new InputStreamReader(System.in));

      // Prompt for password
      System.out.print(SqltoolRB.passwordFor_prompt.getString(RCData.expandSysPropVars(username)));

      // Read the password from the command line
      password = console.readLine();

      if (password == null) {
        password = "";
      } else {
        password = password.trim();
      }
    } catch (IOException e) {
      throw new PrivateException(e.getMessage());
    } finally {
      console = null; // Encourage GC of buffers
    }

    return password;
  }

  /**
   * Parses a comma delimited string of name value pairs into a <code>Map</code> object.
   *
   * @param varString The string to parse
   * @param varMap The map to save the paired values into
   * @param lowerCaseKeys Set to <code>true</code> if the map keys should be converted to lower case
   */
  private static void varParser(
      String inVarString, Map<String, String> varMap, boolean lowerCaseKeys)
      throws PrivateException {

    int equals;
    String var;
    String val;

    if (varMap == null) {
      throw new IllegalArgumentException("varMap is null in SqlTool.varParser call");
    }
    if (inVarString == null) {
      throw new IllegalArgumentException("inVarString is null in SqlTool.varParser call");
    }
    boolean escapesPresent = inVarString.indexOf("\\,") > -1;
    String varString = escapesPresent ? inVarString.replace("\\,", "\u0002") : inVarString;

    for (String token : varString.split("\\s*,\\s*")) {
      equals = token.indexOf('=');

      if (equals < 1) {
        throw new PrivateException(SqltoolRB.SqlTool_varset_badformat.getString());
      }

      var = token.substring(0, equals).trim();
      val = token.substring(equals + 1).trim();
      if (escapesPresent) {
        val = val.replace("\u0002", ",");
      }

      if (var.length() < 1) {
        throw new PrivateException(SqltoolRB.SqlTool_varset_badformat.getString());
      }

      if (lowerCaseKeys) {
        var = var.toLowerCase();
      }

      varMap.put(var, val);
    }
  }

  /**
   * A static wrapper for objectMain, so that that method may be executed as a Java "program".
   *
   * <p>Throws only RuntimeExceptions or Errors, because this method is intended to System.exit()
   * for all but disastrous system problems, for which the inconvenience of a stack trace would be
   * the least of your worries.
   *
   * <p>
   *
   * <p>If you don't want SqlTool to System.exit(), then use the method objectMain() instead of this
   * method.
   *
   * <p>
   *
   * @see #objectMain(String[])
   */
  public static void main(String[] args) {
    try {
      SqlTool.objectMain(args);
    } catch (SqlToolException fr) {
      System.err.println((fr.getMessage() == null) ? fr : fr.getMessage());
      System.exit(fr.exitValue);
    }
    System.exit(0);
  }

  /**
   * Connect to a JDBC Database and execute the commands given on stdin or in SQL file(s).
   *
   * <p>This method is changed for HSQLDB 1.8.0.8 and later to never System.exit(). Developers may
   * catch Throwables to handle all fatal situations.
   *
   * @param arg Run "java... org.hsqldb.cmdline.SqlTool --help" for syntax.
   * @throws SqlToolException Upon any fatal error, with useful reason as the exception's message.
   */
  public static void objectMain(String[] arg) throws SqlToolException {
    logger.finer("Invoking SqlTool");

    /*
     * The big picture is, we parse input args; load a RCData;
     * get a JDBC Connection with the RCData; instantiate and
     * execute as many SqlFiles as we need to.
     */
    String rcFile = null;
    PipedReader tmpReader = null;
    String sqlText = null;
    String driver = null;
    String targetDb = null;
    boolean debug = false;
    File[] scriptFiles = null;
    int i = -1;
    boolean listMode = false;
    boolean interactive = false;
    boolean noinput = false;
    boolean noautoFile = false;
    boolean autoCommit = false;
    Boolean coeOverride = null;
    Boolean stdinputOverride = null;
    String rcParams = null;
    String rcUrl = null;
    String rcUsername = null;
    String rcPassword = null;
    String rcCharset = null;
    String rcTruststore = null;
    String rcTransIso = null;
    Map<String, String> rcFields = null;
    String parameter;
    SqlFile[] sqlFiles = null;
    Connection conn = null;
    Map<String, String> userVars = new HashMap<String, String>();

    try { // Try block to GC tmpReader
      try { // Try block for BadCmdline
        while ((i + 1 < arg.length))
          if (arg[i + 1].startsWith("--")) {
            i++;

            if (arg[i].length() == 2) {
              break; // "--"
            }

            parameter = arg[i].substring(2).toLowerCase();

            if (parameter.equals("help")) {
              System.out.println(
                  SqltoolRB.SqlTool_syntax.getString(revnum, RCData.DEFAULT_JDBC_DRIVER));
              return;
            }
            if (parameter.equals("abortonerr")) {
              if (coeOverride != null) {
                throw new SqlToolException(
                    SYNTAXERR_EXITVAL,
                    SqltoolRB.SqlTool_abort_continue_mutuallyexclusive.getString());
              }

              coeOverride = Boolean.FALSE;
            } else if (parameter.equals("continueonerr")) {
              if (coeOverride != null) {
                throw new SqlToolException(
                    SYNTAXERR_EXITVAL,
                    SqltoolRB.SqlTool_abort_continue_mutuallyexclusive.getString());
              }

              coeOverride = Boolean.TRUE;
            } else if (parameter.startsWith("continueonerr=")) {
              if (coeOverride != null) {
                throw new SqlToolException(
                    SYNTAXERR_EXITVAL,
                    SqltoolRB.SqlTool_abort_continue_mutuallyexclusive.getString());
              }

              coeOverride = Boolean.valueOf(arg[i].substring("--continueonerr=".length()));
            } else if (parameter.equals("list")) {
              if (listMode) {
                throw new SqlToolException(
                    SYNTAXERR_EXITVAL, SqltoolRB.SqlTool_params_redundant.getString());
              }
              listMode = true;
            } else if (parameter.equals("rcfile")) {
              if (++i == arg.length) {
                throw bcl;
              }
              if (rcFile != null) {
                throw new SqlToolException(
                    SYNTAXERR_EXITVAL, SqltoolRB.SqlTool_params_redundant.getString());
              }

              rcFile = arg[i];
            } else if (parameter.startsWith("rcfile=")) {
              if (rcFile != null) {
                throw new SqlToolException(
                    SYNTAXERR_EXITVAL, SqltoolRB.SqlTool_params_redundant.getString());
              }
              rcFile = arg[i].substring("--rcfile=".length());
            } else if (parameter.equals("setvar")) {
              if (++i == arg.length) {
                throw bcl;
              }

              try {
                varParser(arg[i], userVars, false);
              } catch (PrivateException pe) {
                throw new SqlToolException(RCERR_EXITVAL, pe.getMessage());
              }
            } else if (parameter.startsWith("setvar=")) {
              try {
                varParser(arg[i].substring("--setvar=".length()), userVars, false);
              } catch (PrivateException pe) {
                throw new SqlToolException(RCERR_EXITVAL, pe.getMessage());
              }
            } else if (parameter.equals("sql")) {
              noinput = true; // but turn back on if file "-" specd.

              if (++i == arg.length) {
                throw bcl;
              }
              if (sqlText != null) {
                throw new SqlToolException(
                    SYNTAXERR_EXITVAL, SqltoolRB.SqlTool_params_redundant.getString());
              }

              sqlText = arg[i];
            } else if (parameter.startsWith("sql=")) {
              noinput = true; // but turn back on if file "-" specd.
              if (sqlText != null) {
                throw new SqlToolException(
                    SYNTAXERR_EXITVAL, SqltoolRB.SqlTool_params_redundant.getString());
              }
              sqlText = arg[i].substring("--sql=".length());
            } else if (parameter.equals("debug")) {
              if (debug) {
                throw new SqlToolException(
                    SYNTAXERR_EXITVAL, SqltoolRB.SqlTool_params_redundant.getString());
              }
              debug = true;
            } else if (parameter.equals("noautofile")) {
              if (noautoFile) {
                throw new SqlToolException(
                    SYNTAXERR_EXITVAL, SqltoolRB.SqlTool_params_redundant.getString());
              }
              noautoFile = true;
            } else if (parameter.equals("autocommit")) {
              if (autoCommit) {
                throw new SqlToolException(
                    SYNTAXERR_EXITVAL, SqltoolRB.SqlTool_params_redundant.getString());
              }
              autoCommit = true;
            } else if (parameter.equals("stdinput")) {
              noinput = false;
              if (stdinputOverride != null) {
                throw new SqlToolException(
                    SYNTAXERR_EXITVAL, SqltoolRB.SqlTool_params_redundant.getString());
              }
              stdinputOverride = Boolean.TRUE;
            } else if (parameter.equals("noinput")) {
              noinput = true;
              if (stdinputOverride != null) {
                throw new SqlToolException(
                    SYNTAXERR_EXITVAL, SqltoolRB.SqlTool_params_redundant.getString());
              }
              stdinputOverride = Boolean.FALSE;
            } else if (parameter.equals("driver")) {
              if (++i == arg.length) {
                throw bcl;
              }
              if (driver != null) {
                throw new SqlToolException(
                    SYNTAXERR_EXITVAL, SqltoolRB.SqlTool_params_redundant.getString());
              }

              driver = arg[i];
            } else if (parameter.startsWith("driver=")) {
              if (driver != null) {
                throw new SqlToolException(
                    SYNTAXERR_EXITVAL, SqltoolRB.SqlTool_params_redundant.getString());
              }
              driver = arg[i].substring("--driver=".length());
            } else if (parameter.equals("inlinerc")) {
              if (++i == arg.length) {
                throw bcl;
              }
              if (rcParams != null) {
                throw new SqlToolException(
                    SYNTAXERR_EXITVAL, SqltoolRB.SqlTool_params_redundant.getString());
              }

              rcParams = arg[i];
            } else if (parameter.startsWith("inlinerc=")) {
              if (rcParams != null) {
                throw new SqlToolException(
                    SYNTAXERR_EXITVAL, SqltoolRB.SqlTool_params_redundant.getString());
              }
              rcParams = arg[i].substring("--inlinerc=".length());
            } else {
              throw bcl;
            }
          } else if (arg[i + 1].startsWith("-P") || arg[i + 1].startsWith("-p")) {
            i++;
            boolean sepSwitch = arg[i].length() < 3;
            if (sepSwitch) {
              if (++i == arg.length) {
                throw bcl;
              }
            }

            int equalAt = arg[i].indexOf('=');
            if (equalAt < (sepSwitch ? 1 : 3)) {
              throw new SqlToolException(RCERR_EXITVAL, "Specified var assignment contains no '='");
            }
            userVars.put(
                arg[i].substring(sepSwitch ? 0 : 2, equalAt), arg[i].substring(equalAt + 1));
          } else {
            break;
          }

        if (!listMode && rcParams == null && ++i != arg.length) {
          // If an inline RC file was specified, don't look for targetDb
          targetDb = arg[i];
          if (targetDb.equals("-")) targetDb = null;
        }

        int scriptIndex = 0;

        if (sqlText != null) {
          try {
            tmpReader = new PipedReader();
            PipedWriter tmpWriter = new PipedWriter(tmpReader);
            // My best guess is that the encoding here will be however
            // we read the SQL text from the command-line, which will
            // be the platform default encoding.  Therefore, don't
            // specify an encoding for this pipe.
            try {
              tmpWriter.write(sqlText + LS);
              tmpWriter.flush();
            } finally {
              try {
                tmpWriter.close();
              } finally {
                tmpWriter = null; // Encourage GC of buffers
              }
            }
          } catch (IOException ioe) {
            throw new SqlToolException(
                IOERR_EXITVAL, SqltoolRB.sqltempfile_fail.getString(ioe.toString()));
          }
        }

        if (stdinputOverride != null) {
          noinput = !stdinputOverride.booleanValue();
        }

        interactive = (!noinput) && (arg.length <= i + 1);

        if (arg.length == i + 2 && arg[i + 1].equals("-")) {
          if (stdinputOverride == null) {
            noinput = false;
          }
        } else if (arg.length > i + 1) {

          // I.e., if there are any SQL files specified.
          scriptFiles =
              new File
                  [arg.length
                      - i
                      - 1
                      + ((stdinputOverride == null || !stdinputOverride.booleanValue()) ? 0 : 1)];

          if (debug) {
            System.err.println("scriptFiles has " + scriptFiles.length + " elements");
          }

          while (i + 1 < arg.length) {
            scriptFiles[scriptIndex++] = new File(arg[++i]);
          }

          if (stdinputOverride != null && stdinputOverride.booleanValue()) {
            scriptFiles[scriptIndex++] = null;
            noinput = true;
          }
        }
      } catch (BadCmdline bcle) {
        throw new SqlToolException(
            SYNTAXERR_EXITVAL,
            SqltoolRB.SqlTool_syntax.getString(revnum, RCData.DEFAULT_JDBC_DRIVER));
      }

      RCData conData = null;

      // Use the inline RC file if it was specified
      if (rcParams != null) {
        rcFields = new HashMap<String, String>();

        try {
          varParser(rcParams, rcFields, true);
        } catch (PrivateException e) {
          throw new SqlToolException(SYNTAXERR_EXITVAL, e.getMessage());
        }

        rcUrl = rcFields.remove("url");
        rcUsername = rcFields.remove("user");
        rcCharset = rcFields.remove("charset");
        rcTruststore = rcFields.remove("truststore");
        rcPassword = rcFields.remove("password");
        rcTransIso = rcFields.remove("transiso");

        // Don't ask for password if what we have already is invalid!
        if (rcUrl == null || rcUrl.length() < 1)
          throw new SqlToolException(RCERR_EXITVAL, SqltoolRB.rcdata_inlineurl_missing.getString());
        // We now allow both null and "" user name, but we require password
        // if the user name != null.
        if (rcPassword != null && rcPassword.length() > 0)
          throw new SqlToolException(RCERR_EXITVAL, SqltoolRB.rcdata_password_visible.getString());
        if (rcFields.size() > 0) {
          throw new SqlToolException(
              INPUTERR_EXITVAL,
              SqltoolRB.rcdata_inline_extravars.getString(rcFields.keySet().toString()));
        }

        if (rcUsername != null && rcPassword == null)
          try {
            rcPassword = promptForPassword(rcUsername);
          } catch (PrivateException e) {
            throw new SqlToolException(
                INPUTERR_EXITVAL, SqltoolRB.password_readfail.getString(e.getMessage()));
          }
        try {
          conData =
              new RCData(
                  CMDLINE_ID,
                  rcUrl,
                  rcUsername,
                  rcPassword,
                  driver,
                  rcCharset,
                  rcTruststore,
                  null,
                  rcTransIso);
        } catch (RuntimeException re) {
          throw re; // Unrecoverable
        } catch (Exception e) {
          throw new SqlToolException(
              RCERR_EXITVAL, SqltoolRB.rcdata_genfromvalues_fail.getString());
        }
      } else if (listMode || targetDb != null) {
        try {
          conData = new RCData(new File((rcFile == null) ? DEFAULT_RCFILE : rcFile), targetDb);
        } catch (RuntimeException re) {
          throw re; // Unrecoverable
        } catch (Exception e) {
          throw new SqlToolException(
              RCERR_EXITVAL, SqltoolRB.conndata_retrieval_fail.getString(targetDb, e.getMessage()));
        }
      }

      // if (debug) {
      // conData.report();
      // }

      if (listMode) {
        // listMode has been handled above.
        // Just returning here to prevent unexpected consequences if the
        // user specifies both an inline RC (will will be ignored) and
        // --list.
        return;
      }

      if (interactive) System.out.print("SqlTool v. " + revnum + '.' + LS);

      if (conData != null)
        try {
          conn = conData.getConnection(driver, System.getProperty("javax.net.ssl.trustStore"));

          conn.setAutoCommit(autoCommit);

          String conBanner;
          if (interactive && (conBanner = SqlFile.getBanner(conn)) != null) {
            System.out.println(conBanner);
          }
        } catch (RuntimeException re) {
          throw re; // Unrecoverable
        } catch (Exception e) {
          if (debug) logger.error(e.getClass().getName(), e);

          // Let's not continue as if nothing is wrong.
          String reportUser = (conData.username == null) ? "<DFLTUSER>" : conData.username;
          throw new SqlToolException(
              CONNECTERR_EXITVAL,
              SqltoolRB.connection_fail.getString(conData.url, reportUser, e.getMessage()));
        }

      File[] emptyFileArray = {};
      File[] singleNullFileArray = {null};
      File autoFile = null;

      if (interactive && !noautoFile) {
        autoFile = new File(System.getProperty("user.home") + "/auto.sql");

        if ((!autoFile.isFile()) || !autoFile.canRead()) {
          autoFile = null;
        }
      }

      if (scriptFiles == null) {

        // I.e., if no SQL files given on command-line.
        // Input file list is either nothing or {null} to read stdin.
        scriptFiles = (noinput ? emptyFileArray : singleNullFileArray);
      }

      int numFiles = scriptFiles.length;

      if (tmpReader != null) {
        numFiles += 1;
      }

      if (autoFile != null) {
        numFiles += 1;
      }

      sqlFiles = new SqlFile[numFiles];

      // We print version before execing this one.
      int interactiveFileIndex = -1;
      String encoding = (conData == null) ? null : conData.charset;

      try {
        int fileIndex = 0;

        if (autoFile != null) {
          sqlFiles[fileIndex++] = new SqlFile(autoFile, encoding);
        }

        if (tmpReader != null) {
          sqlFiles[fileIndex++] = new SqlFile(tmpReader, "--sql", System.out, null, false, null);
        }

        for (File scriptFile : scriptFiles) {
          if (interactiveFileIndex < 0 && interactive) {
            interactiveFileIndex = fileIndex;
          }

          sqlFiles[fileIndex++] =
              (scriptFile == null)
                  ? (new SqlFile(encoding, interactive))
                  : (new SqlFile(scriptFile, encoding, interactive));
        }
      } catch (IOException ioe) {
        try {
          if (conn != null) conn.close();
        } catch (Exception e) {
          // Can only report on so many errors at one time
        }

        throw new SqlToolException(FILEERR_EXITVAL, ioe.getMessage());
      }
    } finally {
      // DO NOT close tmpReader, since SqlFile needs to read from it
      // (and will auto-close it).
      tmpReader = null; // Encourage GC of buffers
    }

    Map<String, Token> macros = null;
    try {
      for (SqlFile sqlFile : sqlFiles) {
        if (conn != null) sqlFile.setConnection(conn);
        if (userVars.size() > 0) sqlFile.addUserVars(userVars);
        if (macros != null) sqlFile.addMacros(macros);
        if (coeOverride != null) sqlFile.setContinueOnError(coeOverride.booleanValue());

        sqlFile.execute();
        userVars = sqlFile.getUserVars();
        macros = sqlFile.getMacros();
        conn = sqlFile.getConnection();
      }
      // Following two Exception types are handled properly inside of
      // SqlFile.  We just need to return an appropriate error status.
    } catch (SqlToolError ste) {
      throw new SqlToolException(SQLTOOLERR_EXITVAL);
    } catch (SQLException se) {
      // SqlTool will only throw an SQLException if it is in
      // "\c false" mode.
      throw new SqlToolException(SQLERR_EXITVAL);
    } finally {
      try {
        if (conn != null) conn.close();
      } catch (Exception e) {
        // Purposefully doing nothing
      }
    }
  }
}
Exemple #7
0
  /**
   * Connect to a JDBC Database and execute the commands given on stdin or in SQL file(s).
   *
   * <p>This method is changed for HSQLDB 1.8.0.8 and later to never System.exit(). Developers may
   * catch Throwables to handle all fatal situations.
   *
   * @param arg Run "java... org.hsqldb.cmdline.SqlTool --help" for syntax.
   * @throws SqlToolException Upon any fatal error, with useful reason as the exception's message.
   */
  public static void objectMain(String[] arg) throws SqlToolException {
    logger.finer("Invoking SqlTool");

    /*
     * The big picture is, we parse input args; load a RCData;
     * get a JDBC Connection with the RCData; instantiate and
     * execute as many SqlFiles as we need to.
     */
    String rcFile = null;
    PipedReader tmpReader = null;
    String sqlText = null;
    String driver = null;
    String targetDb = null;
    boolean debug = false;
    File[] scriptFiles = null;
    int i = -1;
    boolean listMode = false;
    boolean interactive = false;
    boolean noinput = false;
    boolean noautoFile = false;
    boolean autoCommit = false;
    Boolean coeOverride = null;
    Boolean stdinputOverride = null;
    String rcParams = null;
    String rcUrl = null;
    String rcUsername = null;
    String rcPassword = null;
    String rcCharset = null;
    String rcTruststore = null;
    String rcTransIso = null;
    Map<String, String> rcFields = null;
    String parameter;
    SqlFile[] sqlFiles = null;
    Connection conn = null;
    Map<String, String> userVars = new HashMap<String, String>();

    try { // Try block to GC tmpReader
      try { // Try block for BadCmdline
        while ((i + 1 < arg.length))
          if (arg[i + 1].startsWith("--")) {
            i++;

            if (arg[i].length() == 2) {
              break; // "--"
            }

            parameter = arg[i].substring(2).toLowerCase();

            if (parameter.equals("help")) {
              System.out.println(
                  SqltoolRB.SqlTool_syntax.getString(revnum, RCData.DEFAULT_JDBC_DRIVER));
              return;
            }
            if (parameter.equals("abortonerr")) {
              if (coeOverride != null) {
                throw new SqlToolException(
                    SYNTAXERR_EXITVAL,
                    SqltoolRB.SqlTool_abort_continue_mutuallyexclusive.getString());
              }

              coeOverride = Boolean.FALSE;
            } else if (parameter.equals("continueonerr")) {
              if (coeOverride != null) {
                throw new SqlToolException(
                    SYNTAXERR_EXITVAL,
                    SqltoolRB.SqlTool_abort_continue_mutuallyexclusive.getString());
              }

              coeOverride = Boolean.TRUE;
            } else if (parameter.startsWith("continueonerr=")) {
              if (coeOverride != null) {
                throw new SqlToolException(
                    SYNTAXERR_EXITVAL,
                    SqltoolRB.SqlTool_abort_continue_mutuallyexclusive.getString());
              }

              coeOverride = Boolean.valueOf(arg[i].substring("--continueonerr=".length()));
            } else if (parameter.equals("list")) {
              if (listMode) {
                throw new SqlToolException(
                    SYNTAXERR_EXITVAL, SqltoolRB.SqlTool_params_redundant.getString());
              }
              listMode = true;
            } else if (parameter.equals("rcfile")) {
              if (++i == arg.length) {
                throw bcl;
              }
              if (rcFile != null) {
                throw new SqlToolException(
                    SYNTAXERR_EXITVAL, SqltoolRB.SqlTool_params_redundant.getString());
              }

              rcFile = arg[i];
            } else if (parameter.startsWith("rcfile=")) {
              if (rcFile != null) {
                throw new SqlToolException(
                    SYNTAXERR_EXITVAL, SqltoolRB.SqlTool_params_redundant.getString());
              }
              rcFile = arg[i].substring("--rcfile=".length());
            } else if (parameter.equals("setvar")) {
              if (++i == arg.length) {
                throw bcl;
              }

              try {
                varParser(arg[i], userVars, false);
              } catch (PrivateException pe) {
                throw new SqlToolException(RCERR_EXITVAL, pe.getMessage());
              }
            } else if (parameter.startsWith("setvar=")) {
              try {
                varParser(arg[i].substring("--setvar=".length()), userVars, false);
              } catch (PrivateException pe) {
                throw new SqlToolException(RCERR_EXITVAL, pe.getMessage());
              }
            } else if (parameter.equals("sql")) {
              noinput = true; // but turn back on if file "-" specd.

              if (++i == arg.length) {
                throw bcl;
              }
              if (sqlText != null) {
                throw new SqlToolException(
                    SYNTAXERR_EXITVAL, SqltoolRB.SqlTool_params_redundant.getString());
              }

              sqlText = arg[i];
            } else if (parameter.startsWith("sql=")) {
              noinput = true; // but turn back on if file "-" specd.
              if (sqlText != null) {
                throw new SqlToolException(
                    SYNTAXERR_EXITVAL, SqltoolRB.SqlTool_params_redundant.getString());
              }
              sqlText = arg[i].substring("--sql=".length());
            } else if (parameter.equals("debug")) {
              if (debug) {
                throw new SqlToolException(
                    SYNTAXERR_EXITVAL, SqltoolRB.SqlTool_params_redundant.getString());
              }
              debug = true;
            } else if (parameter.equals("noautofile")) {
              if (noautoFile) {
                throw new SqlToolException(
                    SYNTAXERR_EXITVAL, SqltoolRB.SqlTool_params_redundant.getString());
              }
              noautoFile = true;
            } else if (parameter.equals("autocommit")) {
              if (autoCommit) {
                throw new SqlToolException(
                    SYNTAXERR_EXITVAL, SqltoolRB.SqlTool_params_redundant.getString());
              }
              autoCommit = true;
            } else if (parameter.equals("stdinput")) {
              noinput = false;
              if (stdinputOverride != null) {
                throw new SqlToolException(
                    SYNTAXERR_EXITVAL, SqltoolRB.SqlTool_params_redundant.getString());
              }
              stdinputOverride = Boolean.TRUE;
            } else if (parameter.equals("noinput")) {
              noinput = true;
              if (stdinputOverride != null) {
                throw new SqlToolException(
                    SYNTAXERR_EXITVAL, SqltoolRB.SqlTool_params_redundant.getString());
              }
              stdinputOverride = Boolean.FALSE;
            } else if (parameter.equals("driver")) {
              if (++i == arg.length) {
                throw bcl;
              }
              if (driver != null) {
                throw new SqlToolException(
                    SYNTAXERR_EXITVAL, SqltoolRB.SqlTool_params_redundant.getString());
              }

              driver = arg[i];
            } else if (parameter.startsWith("driver=")) {
              if (driver != null) {
                throw new SqlToolException(
                    SYNTAXERR_EXITVAL, SqltoolRB.SqlTool_params_redundant.getString());
              }
              driver = arg[i].substring("--driver=".length());
            } else if (parameter.equals("inlinerc")) {
              if (++i == arg.length) {
                throw bcl;
              }
              if (rcParams != null) {
                throw new SqlToolException(
                    SYNTAXERR_EXITVAL, SqltoolRB.SqlTool_params_redundant.getString());
              }

              rcParams = arg[i];
            } else if (parameter.startsWith("inlinerc=")) {
              if (rcParams != null) {
                throw new SqlToolException(
                    SYNTAXERR_EXITVAL, SqltoolRB.SqlTool_params_redundant.getString());
              }
              rcParams = arg[i].substring("--inlinerc=".length());
            } else {
              throw bcl;
            }
          } else if (arg[i + 1].startsWith("-P") || arg[i + 1].startsWith("-p")) {
            i++;
            boolean sepSwitch = arg[i].length() < 3;
            if (sepSwitch) {
              if (++i == arg.length) {
                throw bcl;
              }
            }

            int equalAt = arg[i].indexOf('=');
            if (equalAt < (sepSwitch ? 1 : 3)) {
              throw new SqlToolException(RCERR_EXITVAL, "Specified var assignment contains no '='");
            }
            userVars.put(
                arg[i].substring(sepSwitch ? 0 : 2, equalAt), arg[i].substring(equalAt + 1));
          } else {
            break;
          }

        if (!listMode && rcParams == null && ++i != arg.length) {
          // If an inline RC file was specified, don't look for targetDb
          targetDb = arg[i];
          if (targetDb.equals("-")) targetDb = null;
        }

        int scriptIndex = 0;

        if (sqlText != null) {
          try {
            tmpReader = new PipedReader();
            PipedWriter tmpWriter = new PipedWriter(tmpReader);
            // My best guess is that the encoding here will be however
            // we read the SQL text from the command-line, which will
            // be the platform default encoding.  Therefore, don't
            // specify an encoding for this pipe.
            try {
              tmpWriter.write(sqlText + LS);
              tmpWriter.flush();
            } finally {
              try {
                tmpWriter.close();
              } finally {
                tmpWriter = null; // Encourage GC of buffers
              }
            }
          } catch (IOException ioe) {
            throw new SqlToolException(
                IOERR_EXITVAL, SqltoolRB.sqltempfile_fail.getString(ioe.toString()));
          }
        }

        if (stdinputOverride != null) {
          noinput = !stdinputOverride.booleanValue();
        }

        interactive = (!noinput) && (arg.length <= i + 1);

        if (arg.length == i + 2 && arg[i + 1].equals("-")) {
          if (stdinputOverride == null) {
            noinput = false;
          }
        } else if (arg.length > i + 1) {

          // I.e., if there are any SQL files specified.
          scriptFiles =
              new File
                  [arg.length
                      - i
                      - 1
                      + ((stdinputOverride == null || !stdinputOverride.booleanValue()) ? 0 : 1)];

          if (debug) {
            System.err.println("scriptFiles has " + scriptFiles.length + " elements");
          }

          while (i + 1 < arg.length) {
            scriptFiles[scriptIndex++] = new File(arg[++i]);
          }

          if (stdinputOverride != null && stdinputOverride.booleanValue()) {
            scriptFiles[scriptIndex++] = null;
            noinput = true;
          }
        }
      } catch (BadCmdline bcle) {
        throw new SqlToolException(
            SYNTAXERR_EXITVAL,
            SqltoolRB.SqlTool_syntax.getString(revnum, RCData.DEFAULT_JDBC_DRIVER));
      }

      RCData conData = null;

      // Use the inline RC file if it was specified
      if (rcParams != null) {
        rcFields = new HashMap<String, String>();

        try {
          varParser(rcParams, rcFields, true);
        } catch (PrivateException e) {
          throw new SqlToolException(SYNTAXERR_EXITVAL, e.getMessage());
        }

        rcUrl = rcFields.remove("url");
        rcUsername = rcFields.remove("user");
        rcCharset = rcFields.remove("charset");
        rcTruststore = rcFields.remove("truststore");
        rcPassword = rcFields.remove("password");
        rcTransIso = rcFields.remove("transiso");

        // Don't ask for password if what we have already is invalid!
        if (rcUrl == null || rcUrl.length() < 1)
          throw new SqlToolException(RCERR_EXITVAL, SqltoolRB.rcdata_inlineurl_missing.getString());
        // We now allow both null and "" user name, but we require password
        // if the user name != null.
        if (rcPassword != null && rcPassword.length() > 0)
          throw new SqlToolException(RCERR_EXITVAL, SqltoolRB.rcdata_password_visible.getString());
        if (rcFields.size() > 0) {
          throw new SqlToolException(
              INPUTERR_EXITVAL,
              SqltoolRB.rcdata_inline_extravars.getString(rcFields.keySet().toString()));
        }

        if (rcUsername != null && rcPassword == null)
          try {
            rcPassword = promptForPassword(rcUsername);
          } catch (PrivateException e) {
            throw new SqlToolException(
                INPUTERR_EXITVAL, SqltoolRB.password_readfail.getString(e.getMessage()));
          }
        try {
          conData =
              new RCData(
                  CMDLINE_ID,
                  rcUrl,
                  rcUsername,
                  rcPassword,
                  driver,
                  rcCharset,
                  rcTruststore,
                  null,
                  rcTransIso);
        } catch (RuntimeException re) {
          throw re; // Unrecoverable
        } catch (Exception e) {
          throw new SqlToolException(
              RCERR_EXITVAL, SqltoolRB.rcdata_genfromvalues_fail.getString());
        }
      } else if (listMode || targetDb != null) {
        try {
          conData = new RCData(new File((rcFile == null) ? DEFAULT_RCFILE : rcFile), targetDb);
        } catch (RuntimeException re) {
          throw re; // Unrecoverable
        } catch (Exception e) {
          throw new SqlToolException(
              RCERR_EXITVAL, SqltoolRB.conndata_retrieval_fail.getString(targetDb, e.getMessage()));
        }
      }

      // if (debug) {
      // conData.report();
      // }

      if (listMode) {
        // listMode has been handled above.
        // Just returning here to prevent unexpected consequences if the
        // user specifies both an inline RC (will will be ignored) and
        // --list.
        return;
      }

      if (interactive) System.out.print("SqlTool v. " + revnum + '.' + LS);

      if (conData != null)
        try {
          conn = conData.getConnection(driver, System.getProperty("javax.net.ssl.trustStore"));

          conn.setAutoCommit(autoCommit);

          String conBanner;
          if (interactive && (conBanner = SqlFile.getBanner(conn)) != null) {
            System.out.println(conBanner);
          }
        } catch (RuntimeException re) {
          throw re; // Unrecoverable
        } catch (Exception e) {
          if (debug) logger.error(e.getClass().getName(), e);

          // Let's not continue as if nothing is wrong.
          String reportUser = (conData.username == null) ? "<DFLTUSER>" : conData.username;
          throw new SqlToolException(
              CONNECTERR_EXITVAL,
              SqltoolRB.connection_fail.getString(conData.url, reportUser, e.getMessage()));
        }

      File[] emptyFileArray = {};
      File[] singleNullFileArray = {null};
      File autoFile = null;

      if (interactive && !noautoFile) {
        autoFile = new File(System.getProperty("user.home") + "/auto.sql");

        if ((!autoFile.isFile()) || !autoFile.canRead()) {
          autoFile = null;
        }
      }

      if (scriptFiles == null) {

        // I.e., if no SQL files given on command-line.
        // Input file list is either nothing or {null} to read stdin.
        scriptFiles = (noinput ? emptyFileArray : singleNullFileArray);
      }

      int numFiles = scriptFiles.length;

      if (tmpReader != null) {
        numFiles += 1;
      }

      if (autoFile != null) {
        numFiles += 1;
      }

      sqlFiles = new SqlFile[numFiles];

      // We print version before execing this one.
      int interactiveFileIndex = -1;
      String encoding = (conData == null) ? null : conData.charset;

      try {
        int fileIndex = 0;

        if (autoFile != null) {
          sqlFiles[fileIndex++] = new SqlFile(autoFile, encoding);
        }

        if (tmpReader != null) {
          sqlFiles[fileIndex++] = new SqlFile(tmpReader, "--sql", System.out, null, false, null);
        }

        for (File scriptFile : scriptFiles) {
          if (interactiveFileIndex < 0 && interactive) {
            interactiveFileIndex = fileIndex;
          }

          sqlFiles[fileIndex++] =
              (scriptFile == null)
                  ? (new SqlFile(encoding, interactive))
                  : (new SqlFile(scriptFile, encoding, interactive));
        }
      } catch (IOException ioe) {
        try {
          if (conn != null) conn.close();
        } catch (Exception e) {
          // Can only report on so many errors at one time
        }

        throw new SqlToolException(FILEERR_EXITVAL, ioe.getMessage());
      }
    } finally {
      // DO NOT close tmpReader, since SqlFile needs to read from it
      // (and will auto-close it).
      tmpReader = null; // Encourage GC of buffers
    }

    Map<String, Token> macros = null;
    try {
      for (SqlFile sqlFile : sqlFiles) {
        if (conn != null) sqlFile.setConnection(conn);
        if (userVars.size() > 0) sqlFile.addUserVars(userVars);
        if (macros != null) sqlFile.addMacros(macros);
        if (coeOverride != null) sqlFile.setContinueOnError(coeOverride.booleanValue());

        sqlFile.execute();
        userVars = sqlFile.getUserVars();
        macros = sqlFile.getMacros();
        conn = sqlFile.getConnection();
      }
      // Following two Exception types are handled properly inside of
      // SqlFile.  We just need to return an appropriate error status.
    } catch (SqlToolError ste) {
      throw new SqlToolException(SQLTOOLERR_EXITVAL);
    } catch (SQLException se) {
      // SqlTool will only throw an SQLException if it is in
      // "\c false" mode.
      throw new SqlToolException(SQLERR_EXITVAL);
    } finally {
      try {
        if (conn != null) conn.close();
      } catch (Exception e) {
        // Purposefully doing nothing
      }
    }
  }
public class HsqldbSlaveAuthBean implements AuthFunctionBean {
  private static FrameworkLogger logger = FrameworkLogger.getLog(HsqldbSlaveAuthBean.class);
  private String masterJdbcUrl;
  private String validationUser;
  private String validationPassword;
  private boolean delegateRolesSchema = true;
  protected boolean initialized;

  public void setValidationUser(String paramString) {
    this.validationUser = paramString;
  }

  public void setValidationPassword(String paramString) {
    this.validationPassword = paramString;
  }

  public void setMasterJdbcUrl(String paramString) {
    this.masterJdbcUrl = paramString;
  }

  public void setDelegateRolesSchema(boolean paramBoolean) {
    this.delegateRolesSchema = paramBoolean;
  }

  public void init() throws SQLException {
    if (this.masterJdbcUrl == null)
      throw new IllegalStateException("Required property 'masterJdbcUrl' not set");
    if ((this.validationUser != null) || (this.validationPassword != null)) {
      if ((this.validationUser == null) || (this.validationPassword == null))
        throw new IllegalStateException(
            "If you set one property of 'validationUser' or 'validationPassword', then you must set both.");
      Connection localConnection = null;
      Object localObject1 = null;
      try {
        localConnection =
            DriverManager.getConnection(
                this.masterJdbcUrl, this.validationUser, this.validationPassword);
      } catch (SQLException localSQLException2) {
        logger.error("Master/slave Connection validation failure", localSQLException2);
        localObject1 = localSQLException2;
      } finally {
        if (localConnection != null)
          try {
            localConnection.close();
            localConnection = null;
          } catch (SQLException localSQLException4) {
            logger.error("Failed to close test master/slave Connection", localSQLException4);
            if (localObject1 == null) throw localSQLException4;
          }
      }
    }
    this.initialized = true;
  }

  public String[] authenticate(String paramString1, String paramString2) throws DenyException {
    if (!this.initialized)
      throw new IllegalStateException(
          "You must invoke the 'init' method to initialize the "
              + HsqldbSlaveAuthBean.class.getName()
              + " instance.");
    Connection localConnection = null;
    try {
      localConnection = DriverManager.getConnection(this.masterJdbcUrl, paramString1, paramString2);
      if (this.delegateRolesSchema) {
        localSet = AuthUtils.getEnabledRoles(localConnection);
        String str = AuthUtils.getInitialSchema(localConnection);
        if (str != null) localSet.add(str);
        logger.finer("Slave delegating schema+roles: " + localSet);
        String[] arrayOfString = (String[]) localSet.toArray(new String[0]);
        return arrayOfString;
      }
      Set localSet = null;
      return localSet;
    } catch (SQLException localSQLException1) {
      throw new DenyException();
    } finally {
      if (localConnection != null)
        try {
          localConnection.close();
          localConnection = null;
        } catch (SQLException localSQLException4) {
          logger.severe("Failed to close master/slave Connection", localSQLException4);
        }
    }
  }
}