/**
   * Method declaration
   *
   * @param compact
   * @throws SQLException
   */
  void close(boolean compact) throws SQLException {

    if (Trace.TRACE) {
      Trace.trace();
    }

    if (bReadOnly) {
      return;
    }

    // no more scripting
    closeScript();

    // create '.script.new' (for this the cache may be still required)
    writeScript(compact);

    // flush the cache (important: after writing the script)
    if (cCache != null) {
      cCache.flush();
    }

    closeAllTextCaches(compact);

    // create '.backup.new' using the '.data'
    backup();

    // we have the new files
    pProperties.setProperty("modified", "yes-new-files");
    pProperties.save();

    // old files can be removed and new files renamed
    renameNewToCurrent(sFileScript);
    renameNewToCurrent(sFileBackup);

    // now its done completely
    pProperties.setProperty("modified", "no");
    pProperties.setProperty("version", jdbcDriver.VERSION);
    pProperties.setProperty("hsqldb.compatible_version", "1.7.0");
    pProperties.save();
    pProperties.close();

    if (compact) {

      // stop the runner thread of this process (just for security)
      stop();

      // delete the .data so then a new file is created
      (new File(sFileCache)).delete();
      (new File(sFileBackup)).delete();

      // tony_lai@users 20020820
      // The database re-open and close has been moved to
      // Database#close(int closemode) for saving memory usage.
    }
  }
  /**
   * Method declaration
   *
   * @throws SQLException
   */
  void shutdown() throws SQLException {

    tRunner = null;

    if (cCache != null) {
      cCache.closeFile();

      cCache = null;
    }

    shutdownAllTextCaches();
    closeScript();
    pProperties.close();
  }
  /**
   * Method declaration
   *
   * @throws SQLException
   */
  public void save() throws SQLException {

    close();

    if (Trace.TRACE) {
      Trace.trace();
    }

    try {
      super.save();

      // after saving, open the file again
      load();
    } catch (Exception e) {
      throw Trace.error(Trace.FILE_IO_ERROR, fileName + ".properties " + e);
    }
  }
  /**
   * check by trying to delete the properties file this will not work if some application has the
   * file open this is why the properties file is kept open when running ;-) todo: check if this
   * works in all operating systems
   *
   * @return true if file is open
   * @exception java.sql.SQLException
   */
  protected boolean isFileOpen() throws java.sql.SQLException {

    close();

    if (Trace.TRACE) {
      Trace.trace();
    }

    if ((new File(fileName + ".properties")).delete() == false) {
      return true;
    }

    // the file was deleted, so recreate it now
    save();

    return false;
  }
  public void load() throws SQLException {

    close();

    if (Trace.TRACE) {
      Trace.trace();
    }

    try {
      File f = new File(fileName + ".properties");

      // the file is closed only when the database is closed
      propsFileStream = new FileInputStream(f);

      stringProps.load(propsFileStream);
    } catch (Exception e) {
      throw Trace.error(Trace.FILE_IO_ERROR, fileName + ".properties " + e);
    }
  }