/** Initializes this connection and runs the request handling loop until closed. */
  public void run() {

    init();

    if (session != null) {
      try {
        while (keepAlive) {
          Result resultIn = Result.read(rowIn, dataInput);

          server.printRequest(mThread, resultIn);

          Result resultOut;

          if (resultIn.mode == ResultConstants.HSQLRESETSESSION) {
            resultOut = resetSession();
          } else {
            resultOut = session.execute(resultIn);
          }

          Result.write(resultOut, rowOut, dataOutput);
          rowOut.setBuffer(mainBuffer);
          rowIn.resetRow(mainBuffer.length);
        }
      } catch (IOException e) {

        // fredt - is thrown when connection drops
        server.printWithThread(mThread + ":disconnected " + user);
      } catch (HsqlException e) {

        // fredt - is thrown while constructing the result
        server.printStackTrace(e);
      }
    }

    close();
  }