001    // Copyright (c) 2001 Hursh Jain (http://www.mollypages.org) 
002    // The Molly framework is freely distributable under the terms of an
003    // MIT-style license. For details, see the molly pages web site at:
004    // http://www.mollypages.org/. Use, modify, have fun !
005    
006    package fc.jdbc.dbo;
007    
008    import java.sql.*;
009    import java.util.*;
010    import java.io.*;
011    
012    import fc.io.*;
013    import fc.util.*;
014    import fc.jdbc.*;
015    
016    /**
017    Create a table containing all JDBC/SQL types we are interested in. The
018    table is created using the database and jdbc url in the specified
019    configuration file. The "-db" flag is optional, if specified that table
020    is created in that catalog/schema. (Note: postgresql doesn't currently
021    allow us to set a db catalog, the db catalog/schema must be specified as
022    part of the jdbc url itself).
023    */
024    public class CreateAllTypes
025    {
026    static DBName dbname ;
027    static String tablename;
028    
029    public static void main(String args[]) throws Exception
030      {
031      String defaultTableName = "alltypes";
032      
033      Args myargs = new Args(args);
034      myargs.setUsage("java CreateAllTypes -conf conf_file [-db db_schema] [-table table_name_to_create]");
035      
036      String db     = myargs.get("db");
037      String conf   = myargs.getRequired("conf");
038      tablename     = myargs.get("table", defaultTableName);
039    
040      Log.getDefault().setLevel(SystemLog.DEBUG); 
041      FilePropertyMgr fprops = new FilePropertyMgr(new File(conf));
042      ConnectionMgr cmgr = new SimpleConnectionMgr(fprops);
043      
044      String url = fprops.get("jdbc.url");
045      if (url.indexOf("postgres") != -1)
046        dbname = DBName.postgres;
047      else if (url.indexOf("mysql") != -1)
048        dbname = DBName.mysql;
049      else if (url.indexOf("oracle") != -1)
050        dbname = DBName.oracle;
051      else
052        throw new Exception("I do not understand this database type. Only mysql/postgresql supported currently."); /*f$%# oracle*/
053        
054      Connection con = cmgr.getConnection();
055      if (db != null)
056        con.setCatalog(db);
057    
058      String sql = getSQL();
059      Statement stmt = con.createStatement();
060      System.out.println("Creating table..");
061      int result = stmt.executeUpdate(sql);
062      System.out.println("...done [success]");
063      con.close();
064      }
065    
066    static String getSQL() 
067      {
068      String create = 
069      "create table " + tablename + " ( ";  
070      
071      create += (dbname == DBName.mysql) ?
072        "id         int auto_increment, "
073        :
074        "id         serial, "; 
075      
076      create += 
077         "smallint_val    smallint, " 
078       + "int_val       int not null, "
079       + "bigint_val      bigint, "
080       + "float_val     float(24), "
081       + "double_val      float(53), "
082       + "numeric_val     numeric(5,2), "
083       + "char_val      char(10), "
084       + "varchar_val     varchar(10), "
085       + "longvarchar_val   text, "
086       + "date_val      date, "
087       + "time_val      time, "
088       + "timestamp_val   timestamp, "
089       + "bit_val       bit, "
090       ;
091       
092      create += (dbname == DBName.mysql) ?
093        ("boolean_val     bool, " 
094       + "varbinary_val   blob, ")
095        :
096        ("boolean_val     boolean, " 
097       + "varbinary_val   bytea, ");
098      
099      if (dbname == DBName.mysql) {
100      create += 
101        "json_val       json, ";
102      }
103      else if (dbname == DBName.postgres) {
104      create += 
105        "array_val      varchar(10)[], "
106      + "json_val       json, "
107      + "jsonb_val      jsonb, ";
108      }
109    
110      create += " PRIMARY KEY (id) )";
111      
112      return create;
113      }
114      
115    }