/**
   * Initialize index information
   *
   * @throws SQLException
   */
  private void initIndexes() throws SQLException {
    if (isView() || isRemote()) return;

    // first try to initialize using the index query spec'd in the .properties
    // do this first because some DB's (e.g. Oracle) do 'bad' things with getIndexInfo()
    // (they try to do a DDL analyze command that has some bad side-effects)
    if (initIndexes(properties.getProperty("selectIndexesSql"))) return;

    // couldn't, so try the old fashioned approach
    ResultSet rs = null;

    try {
      rs = db.getMetaData().getIndexInfo(null, getSchema(), getName(), false, true);

      while (rs.next()) {
        if (rs.getShort("TYPE") != DatabaseMetaData.tableIndexStatistic) addIndex(rs);
      }
    } catch (SQLException exc) {
      logger.warning(
          "Unable to extract index info for table '"
              + getName()
              + "' in schema '"
              + getSchema()
              + "': "
              + exc);
    } finally {
      if (rs != null) rs.close();
    }
  }
  /**
   * Try to initialize index information based on the specified SQL
   *
   * @return boolean <code>true</code> if it worked, otherwise <code>false</code>
   */
  private boolean initIndexes(String selectIndexesSql) {
    if (selectIndexesSql == null) return false;

    PreparedStatement stmt = null;
    ResultSet rs = null;

    try {
      stmt = db.prepareStatement(selectIndexesSql, getName());
      rs = stmt.executeQuery();

      while (rs.next()) {
        if (rs.getShort("TYPE") != DatabaseMetaData.tableIndexStatistic) addIndex(rs);
      }
    } catch (SQLException sqlException) {
      logger.warning("Failed to query index information with SQL: " + selectIndexesSql);
      logger.warning(sqlException.toString());
      return false;
    } finally {
      if (rs != null) {
        try {
          rs.close();
        } catch (Exception exc) {
          exc.printStackTrace();
        }
      }
      if (stmt != null) {
        try {
          stmt.close();
        } catch (Exception exc) {
          exc.printStackTrace();
        }
      }
    }

    return true;
  }