// Programm 5-8b:  ./JDBCclientserver/MsqlDirektServer.java
import java.io.*;
import java.net.*;
import java.sql.*;

public class MsqlDirektServer {
  final static int port = 6787;
  ServerSocket servsock;
  Connection c; Statement s;
  int zähler;

  public MsqlDirektServer() {
    try {
      registerDatabase();
      servsock = new ServerSocket(port);
      System.out.println(
            "\nMiddleware Server auf Port " + port + " ...\n");
    }
    catch (Exception ex) {ex.printStackTrace();}
    while(true) {                         // Serverschleife
      StringBuffer  buf = new StringBuffer();
      String addr = "";
      try  {
        Socket lauschen = servsock.accept();
        byte[] ad = (lauschen.getInetAddress()).getAddress();
        for (int i = 0; i < 4; i++) addr += (ad[i]&0xff) + ".";
        InputStream in = lauschen.getInputStream();
        PrintWriter out =
                   new PrintWriter(lauschen.getOutputStream());
        zähler++;
        for (int ch; (ch = in.read()) > 0;)
          buf.append((char) ch);
        out.print(queryDatabase(buf.toString()));
        out.close();
      }
      catch (Exception ex) {ex.printStackTrace();}
      System.out.println(
                 zähler + ": " + addr + " " + buf.toString());
    }
  }

  private void registerDatabase() throws Exception {
    Class.forName("com.imaginary.sql.msql.MsqlDriver"); 
    c = DriverManager.getConnection(
             "jdbc:msql://localhost:1112/Kurse");
    s = c.createStatement();
  }

  private String queryDatabase(String sql) {
    StringBuffer buf = new StringBuffer();
    try {
      if (s.execute(sql)) {
        ResultSet rs = s.getResultSet();
        ResultSetMetaData rsmd = rs.getMetaData();
        while(rs.next()) {
           for (int i  = 1, max = rsmd.getColumnCount();
                                                 i <= max; i++)
            buf.append(
                  rs.getString(i) + (i == max ? "\n" : ", "));
        }
      }
      else
        buf.append(
             String.valueOf(s.getUpdateCount()) + " Zeile(n)");
    }
    catch (Exception ex) {
      buf.append("SQL-Fehler!\n" + ex.getMessage());
    }
    finally {
      return buf.toString();
    }
  }

  public static void main(String[] args) {  
    new MsqlDirektServer();                  // Server starten
  }
}                                 // Ende class MsqlDirektServer

