metadata.java
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:8k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. package example;
  2. import java.io.*;
  3. import java.sql.*;
  4. import java.text.*;
  5. /**
  6.  * This example application is not really an example. It actually performs
  7.  * some tests on various methods in the DatabaseMetaData and ResultSetMetaData
  8.  * classes.
  9.  *
  10.  * To use it, simply have a database created. It will create some work tables
  11.  * and run tests on them.
  12.  */
  13. public class metadata
  14. {
  15.   Connection    db; // The connection to the database
  16.   Statement    st; // Our statement to run queries with
  17.   DatabaseMetaData dbmd; // This defines the structure of the database
  18.   
  19.   /**
  20.    * These are the available tests on DatabaseMetaData
  21.    */
  22.   public void doDatabaseMetaData() throws SQLException {
  23.     if(doTest("getProcedures() - should show all available procedures"))
  24.       displayResult(dbmd.getProcedures(null,null,null));
  25.     
  26.     if(doTest("getProcedures() with pattern - should show all circle procedures"))
  27.       displayResult(dbmd.getProcedures(null,null,"circle%"));
  28.     
  29.     if(doTest("getProcedureColumns() on circle procedures"))
  30.       displayResult(dbmd.getProcedureColumns(null,null,"circle%",null));
  31.     
  32.     if(doTest("getTables()"))
  33.       displayResult(dbmd.getTables(null,null,null,null));
  34.     
  35.     if(doTest("getColumns() - should show all tables, can take a while to run"))
  36.       displayResult(dbmd.getColumns(null,null,null,null));
  37.     
  38.     if(doTest("getColumns() - should show the test_b table"))
  39.       displayResult(dbmd.getColumns(null,null,"test_b",null));
  40.     
  41.     if(doTest("getColumnPrivileges() - should show all tables"))
  42.       displayResult(dbmd.getColumnPrivileges(null,null,null,null));
  43.     
  44.     if(doTest("getPrimaryKeys()"))
  45.       displayResult(dbmd.getPrimaryKeys(null,null,null));
  46.     
  47.     if(doTest("getTypeInfo()"))
  48.       displayResult(dbmd.getTypeInfo());
  49.     
  50.   }
  51.   
  52.   /**
  53.    * These are the available tests on ResultSetMetaData
  54.    */
  55.   public void doResultSetMetaData() throws SQLException {
  56.     
  57.     String sql = "select imagename,descr,source,cost from test_a,test_b,test_c where test_a.id=test_b.imageid and test_a.id=test_c.imageid";
  58.     
  59.     System.out.println("Executing query for tests");
  60.     ResultSet rs = st.executeQuery(sql);
  61.     ResultSetMetaData rsmd = rs.getMetaData();
  62.     
  63.     if(doTest("isCurrency()"))
  64.       System.out.println("isCurrency on col 1 = "+rsmd.isCurrency(1)+" should be falsenisCurrency on col 4 = "+rsmd.isCurrency(4)+" should be true");
  65.     
  66.     // Finally close the query. Now give the user a chance to display the
  67.     // ResultSet.
  68.     //
  69.     // NB: displayResult() actually closes the ResultSet.
  70.     if(doTest("Display query result")) {
  71.       System.out.println("Query: "+sql);
  72.       displayResult(rs);
  73.     } else
  74.       rs.close();
  75.   }
  76.   
  77.   /**
  78.    * This creates some test data
  79.    */
  80.   public void init() throws SQLException {
  81.     System.out.println("Creating some tables");
  82.     cleanup();
  83.     st.executeUpdate("create table test_a (imagename name,image oid,id int4)");
  84.     st.executeUpdate("create table test_b (descr text,imageid int4,id int4)");
  85.     st.executeUpdate("create table test_c (source text,cost money,imageid int4)");
  86.     
  87.     System.out.println("Adding some data");
  88.     st.executeUpdate("insert into test_a values ('test1',0,1)");
  89.     st.executeUpdate("insert into test_b values ('A test description',1,2)");
  90.     st.executeUpdate("insert into test_c values ('nowhere particular','$10.99',1)");
  91.   }
  92.   
  93.   /**
  94.    * This removes the test data
  95.    */
  96.   public void cleanup() throws SQLException {
  97.     try {
  98.       st.executeUpdate("drop table test_a");
  99.       st.executeUpdate("drop table test_b");
  100.       st.executeUpdate("drop table test_c");
  101.     } catch(Exception ex) {
  102.       // We ignore any errors here
  103.     }
  104.   }
  105.   
  106.   public metadata(String args[]) throws ClassNotFoundException, FileNotFoundException, IOException, SQLException
  107.   {
  108.     String url = args[0];
  109.     String usr = args[1];
  110.     String pwd = args[2];
  111.     
  112.     // Load the driver
  113.     Class.forName("postgresql.Driver");
  114.     
  115.     // Connect to database
  116.     System.out.println("Connecting to Database URL = " + url);
  117.     db = DriverManager.getConnection(url, usr, pwd);
  118.     
  119.     dbmd = db.getMetaData();
  120.     st = db.createStatement();
  121.     
  122.     // This prints the backend's version
  123.     System.out.println("Connected to "+dbmd.getDatabaseProductName()+" "+dbmd.getDatabaseProductVersion());
  124.     
  125.     init();
  126.     
  127.     System.out.println();
  128.     
  129.     // Now the tests
  130.     if(doTest("Test DatabaseMetaData"))
  131.       doDatabaseMetaData();
  132.     
  133.     if(doTest("Test ResultSetMetaData"))
  134.       doResultSetMetaData();
  135.     
  136.     System.out.println("nNow closing the connection");
  137.     st.close();
  138.     db.close();
  139.     
  140.     cleanup();
  141.   }
  142.   
  143.   /**
  144.    * This asks if the user requires to run a test.
  145.    */
  146.   public boolean doTest(String s) {
  147.     System.out.println();
  148.     System.out.print(s);
  149.     System.out.print(" Perform test? Y or N:");
  150.     System.out.flush();
  151.     char c = ' ';
  152.     try {
  153.       while(!(c=='n' || c=='y' || c=='N' || c=='Y')) {
  154. c=(char)System.in.read();
  155.       }
  156.     } catch(IOException ioe) {
  157.       return false;
  158.     }
  159.     
  160.     return c=='y' || c=='Y';
  161.   }
  162.   
  163.   /**
  164.    * This displays a result set.
  165.    * Note: it closes the result once complete.
  166.    */
  167.   public void displayResult(ResultSet rs) throws SQLException
  168.   {
  169.     ResultSetMetaData rsmd = rs.getMetaData();
  170.     int count=0;
  171.     
  172.     // Print the result column names
  173.     int cols = rsmd.getColumnCount();
  174.     for(int i=1;i<=cols;i++)
  175.       System.out.print(rsmd.getColumnLabel(i)+(i<cols?"t":"n"));
  176.     
  177.     // now the results
  178.     while(rs.next()) {
  179.       count++;
  180.       for(int i=1;i<=cols;i++) {
  181. Object o = rs.getObject(i);
  182. if(rs.wasNull())
  183.   System.out.print("{null}"+(i<cols?"t":"n"));
  184. else
  185.   System.out.print(o.toString()+(i<cols?"t":"n"));
  186.       }
  187.     }
  188.     
  189.     System.out.println("Result returned "+count+" rows.");
  190.     
  191.     // finally close the result set
  192.     rs.close();
  193.   }
  194.   
  195.   /**
  196.    * This process / commands (for now just /d)
  197.    */
  198.   public void processSlashCommand(String line) throws SQLException
  199.   {
  200.     if(line.startsWith("\d")) {
  201.       
  202.       if(line.startsWith("\d ")) {
  203. // Display details about a table
  204. String table=line.substring(3);
  205. displayResult(dbmd.getColumns(null,null,table,"%"));
  206.       } else {
  207. String types[] = null;
  208. if(line.equals("\d"))
  209.   types=allUserTables;
  210. else if(line.equals("\di"))
  211.   types=usrIndices;
  212. else if(line.equals("\dt"))
  213.   types=usrTables;
  214. else if(line.equals("\ds"))
  215.   types=usrSequences;
  216. else if(line.equals("\dS"))
  217.   types=sysTables;
  218. else
  219.   throw new SQLException("Unsupported \d command: "+line);
  220. // Display details about all system tables
  221. //
  222. // Note: the first two arguments are ignored. To keep to the spec,
  223. //       you must put null here
  224. //
  225. displayResult(dbmd.getTables(null,null,"%",types));
  226.       }
  227.     } else
  228.       throw new SQLException("Unsupported \ command: "+line);
  229.   }
  230.   
  231.   private static final String allUserTables[] = {"TABLE","INDEX","SEQUENCE"};
  232.   private static final String usrIndices[] = {"INDEX"};
  233.   private static final String usrTables[] = {"TABLE"};
  234.   private static final String usrSequences[] = {"SEQUENCE"};
  235.   private static final String sysTables[] = {"SYSTEM TABLE","SYSTEM INDEX"};
  236.   
  237.   /**
  238.    * Display some instructions on how to run the example
  239.    */
  240.   public static void instructions()
  241.   {
  242.     System.out.println("nThis is not really an example, but is used to test the various methods innthe DatabaseMetaData and ResultSetMetaData classes.n");
  243.     System.out.println("Useage:n java example.metadata jdbc:postgresql:database user password [debug]nnThe debug field can be anything. It's presence will enable DriverManager'sndebug trace. Unless you want to see screens of debug items, don't put anything innhere.");
  244.     System.exit(1);
  245.   }
  246.   
  247.   /**
  248.    * This little lot starts the test
  249.    */
  250.   public static void main(String args[])
  251.   {
  252.     System.out.println("PostgreSQL metdata tester v6.4 rev 1n");
  253.     
  254.     if(args.length<3)
  255.       instructions();
  256.     
  257.     // This line outputs debug information to stderr. To enable this, simply
  258.     // add an extra parameter to the command line
  259.     if(args.length>3)
  260.       DriverManager.setLogStream(System.err);
  261.     
  262.     // Now run the tests
  263.     try {
  264.       metadata test = new metadata(args);
  265.     } catch(Exception ex) {
  266.       System.err.println("Exception caught.n"+ex);
  267.       ex.printStackTrace();
  268.     }
  269.   }
  270. }