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

数据库系统

开发平台:

Unix_Linux

  1. package example;
  2. import java.io.*;
  3. import java.sql.*;
  4. import java.text.*;
  5. /**
  6.  * This example application demonstrates some of the drivers other features
  7.  * by implementing a simple psql replacement in Java.
  8.  *
  9.  */
  10. public class psql
  11. {
  12.   Connection    db; // The connection to the database
  13.   Statement    st; // Our statement to run queries with
  14.   DatabaseMetaData dbmd; // This defines the structure of the database
  15.   
  16.   public psql(String args[]) throws ClassNotFoundException, FileNotFoundException, IOException, SQLException
  17.   {
  18.     String url = args[0];
  19.     String usr = args[1];
  20.     String pwd = args[2];
  21.     
  22.     // Load the driver
  23.     Class.forName("postgresql.Driver");
  24.     
  25.     // Connect to database
  26.     System.out.println("Connecting to Database URL = " + url);
  27.     db = DriverManager.getConnection(url, usr, pwd);
  28.     
  29.     dbmd = db.getMetaData();
  30.     st = db.createStatement();
  31.     
  32.     // This prints the backend's version
  33.     System.out.println("Connected to "+dbmd.getDatabaseProductName()+" "+dbmd.getDatabaseProductVersion());
  34.     
  35.     System.out.println();
  36.     
  37.     // This provides us the means of reading from stdin
  38.     StreamTokenizer input = new StreamTokenizer(new InputStreamReader(System.in));
  39.     input.resetSyntax();
  40.     input.slashSlashComments(true); // allow // as a comment delimiter
  41.     input.eolIsSignificant(false); // treat eol's as spaces
  42.     input.wordChars(32,126);
  43.     input.whitespaceChars(59,59);
  44.     input.quoteChar(39);
  45.     
  46.     // Now the main loop.
  47.     int tt=0,lineno=1;
  48.     while(tt!=StreamTokenizer.TT_EOF) {
  49.       System.out.print("["+lineno+"] ");
  50.       System.out.flush();
  51.       
  52.       // Here, we trap SQLException so they don't terminate the application
  53.       try {
  54. if((tt=input.nextToken())==StreamTokenizer.TT_WORD) {
  55.   processLine(input.sval);
  56.   lineno++;
  57. }
  58.       } catch(SQLException ex) {
  59. System.out.println(ex.getMessage());
  60.       }
  61.     }
  62.     
  63.     System.out.println("Now closing the connection");
  64.     st.close();
  65.     db.close();
  66.     
  67.   }
  68.   
  69.   /**
  70.    * This processes a statement
  71.    */
  72.   public void processLine(String line) throws SQLException
  73.   {
  74.     if(line.startsWith("\")) {
  75.       processSlashCommand(line);
  76.       return;
  77.     }
  78.     
  79.     boolean type = st.execute(line);
  80.     boolean loop=true;
  81.     while(loop) {
  82.       if(type) {
  83. // A ResultSet was returned
  84. ResultSet rs=st.getResultSet();
  85. displayResult(rs);
  86.       } else {
  87. int count = st.getUpdateCount();
  88. if(count==-1) {
  89.   // This indicates nothing left
  90.   loop=false;
  91. } else {
  92.   // An update count was returned
  93.   System.out.println("Updated "+st.getUpdateCount()+" rows");
  94. }
  95.       }
  96.       
  97.       if(loop)
  98. type = st.getMoreResults();
  99.     }
  100.   }
  101.   
  102.   /**
  103.    * This displays a result set.
  104.    * Note: it closes the result once complete.
  105.    */
  106.   public void displayResult(ResultSet rs) throws SQLException
  107.   {
  108.     ResultSetMetaData rsmd = rs.getMetaData();
  109.     
  110.     // Print the result column names
  111.     int cols = rsmd.getColumnCount();
  112.     for(int i=1;i<=cols;i++)
  113.       System.out.print(rsmd.getColumnLabel(i)+(i<cols?"t":"n"));
  114.     
  115.     // now the results
  116.     while(rs.next()) {
  117.       for(int i=1;i<=cols;i++) {
  118. Object o = rs.getObject(i);
  119. if(rs.wasNull())
  120.   System.out.print("{null}"+(i<cols?"t":"n"));
  121. else
  122.   System.out.print(o.toString()+(i<cols?"t":"n"));
  123.       }
  124.     }
  125.     
  126.     // finally close the result set
  127.     rs.close();
  128.   }
  129.   
  130.   /**
  131.    * This process / commands (for now just /d)
  132.    */
  133.   public void processSlashCommand(String line) throws SQLException
  134.   {
  135.     if(line.startsWith("\d")) {
  136.       
  137.       if(line.startsWith("\d ")) {
  138. // Display details about a table
  139. String table=line.substring(3);
  140. displayResult(dbmd.getColumns(null,null,table,"%"));
  141.       } else {
  142. String types[] = null;
  143. if(line.equals("\d"))
  144.   types=allUserTables;
  145. else if(line.equals("\di"))
  146.   types=usrIndices;
  147. else if(line.equals("\dt"))
  148.   types=usrTables;
  149. else if(line.equals("\ds"))
  150.   types=usrSequences;
  151. else if(line.equals("\dS"))
  152.   types=sysTables;
  153. else
  154.   throw new SQLException("Unsupported \d command: "+line);
  155. // Display details about all system tables
  156. //
  157. // Note: the first two arguments are ignored. To keep to the spec,
  158. //       you must put null here
  159. //
  160. displayResult(dbmd.getTables(null,null,"%",types));
  161.       }
  162.     } else
  163.       throw new SQLException("Unsupported \ command: "+line);
  164.   }
  165.   
  166.   private static final String allUserTables[] = {"TABLE","INDEX","SEQUENCE"};
  167.   private static final String usrIndices[] = {"INDEX"};
  168.   private static final String usrTables[] = {"TABLE"};
  169.   private static final String usrSequences[] = {"SEQUENCE"};
  170.   private static final String sysTables[] = {"SYSTEM TABLE","SYSTEM INDEX"};
  171.   
  172.   /**
  173.    * Display some instructions on how to run the example
  174.    */
  175.   public static void instructions()
  176.   {
  177.     System.out.println("nThis example shows how some of the other JDBC features work within thendriver. It does this by implementing a very simple psql equivalent in java.nNot everything that psql does is implemented.n");
  178.     System.out.println("Useage:n java example.psql 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 items, don't put anything innhere.");
  179.     System.exit(1);
  180.   }
  181.   
  182.   /**
  183.    * This little lot starts the test
  184.    */
  185.   public static void main(String args[])
  186.   {
  187.     System.out.println("PostgreSQL psql example v6.3 rev 1n");
  188.     
  189.     if(args.length<3)
  190.       instructions();
  191.     
  192.     // This line outputs debug information to stderr. To enable this, simply
  193.     // add an extra parameter to the command line
  194.     if(args.length>3)
  195.       DriverManager.setLogStream(System.err);
  196.     
  197.     // Now run the tests
  198.     try {
  199.       psql test = new psql(args);
  200.     } catch(Exception ex) {
  201.       System.err.println("Exception caught.n"+ex);
  202.       ex.printStackTrace();
  203.     }
  204.   }
  205. }