package jdbc;

import java.io.PrintStream;
import java.sql.*;
import java.util.Vector;

public final class DataBaseQuery {

  private static DataBaseQuery dbq
      = new DataBaseQuery();
  String dsn = "addBk.addressBook";
  String url = "jdbc:odbc:" + dsn;
  Connection connection = null;
  Statement statement = null;
  DatabaseMetaData dmd = null;

  PrintStream out = System.out;


  String sqlQuery =
      "SELECT Addresses.FirstName, Addresses.LastName, "
      + "Addresses.Address, "
      + "Addresses.EmailAddress FROM Addresses;";
  ResultSet rs = null;
  ResultSetMetaData rsmd = null;
  int colCount = 0;

  private DataBaseQuery() {
    try {
      init();
    } catch (Exception e) {
    }
  }

  public void setOutputStream(PrintStream _out) {
    out = _out;
  }

  public static DataBaseQuery getDataBaseQuery() {
    return dbq;
  }

  public void init() throws Exception {
    // load driver
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

    connection = DriverManager.getConnection(url);
    statement = connection.createStatement();
    dmd = connection.getMetaData();

    rs = statement.executeQuery(sqlQuery);
    freshenMetaData();
  }

  public void freshenMetaData() throws Exception {
    rsmd = rs.getMetaData();
    colCount = rsmd.getColumnCount();
  }

  public void printMetaData() throws Exception {
    out.println(
        "Connected to:" + dmd.getURL());

  }

  public Vector getQuery() throws Exception {
    Vector v = new Vector();
    while (rs.next()) {
      freshenMetaData();
      String s[] = new String[colCount];
      for (int i = 1; i <= colCount; i++) {
        s[i - 1] = rs.getString(i);
      }
      v.addElement(s);
    }
    return v;
  }

  public String[][] getStringArray(Vector v) {
    String sa[][] = new String[v.size()][colCount];

    for (int x = 0; x < v.size(); x++) {
      String s[] = (String[]) (v.elementAt(x));
      for (int y = 0; y < s.length; y++)
        sa[x][y] = s[y];
    }
    return sa;
  }

  public void print(Vector v) {
    for (int i = 0; i < v.size(); i++)
      print((String[]) v.elementAt(i));
  }

  public void print(String a[]) {
    for (int i = 0; i < a.length; i++)
      out.print(a[i] + " ");
    out.println();
  }

  public void print(String a[][]) {
    for (int x = 0; x < a.length; x++) {
      for (int y = 0; y < a[0].length; y++)
        out.print(a[x][y] + " ");
      out.println();
    }
  }

  public String[][] get2DArray() {
    try {
      return getStringArray(
          getQuery()
      );
    } catch (Exception e) {
    }
    return null;
  }


  public void loadDriver() {
    try {
      //init();
      printMetaData();
      print(
          getStringArray(
              getQuery()));
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  public void print() {
    print(get2DArray());
  }

  public static void main(String[] args) {
    jdbc.DataBaseQuery dbq =
        jdbc.DataBaseQuery.getDataBaseQuery();
    System.out.println("this is a test from main");
    dbq.setOutputStream(System.out);
    dbq.print();
  }

}