home *** CD-ROM | disk | FTP | other *** search
/ PC Pro 1999 April / DPPCPRO0499.ISO / April / Notes / 50b2wic.exe / DATA1.CAB / NotesProgramFilesJavaSupport / rt.jar / sun / jdbc / odbc / JdbcOdbcDriver.class (.txt) < prev    next >
Encoding:
Java Class File  |  1998-04-23  |  7.2 KB  |  397 lines

  1. package sun.jdbc.odbc;
  2.  
  3. import java.sql.Connection;
  4. import java.sql.DriverManager;
  5. import java.sql.DriverPropertyInfo;
  6. import java.sql.SQLException;
  7. import java.util.Enumeration;
  8. import java.util.Hashtable;
  9. import java.util.Properties;
  10.  
  11. public class JdbcOdbcDriver extends JdbcOdbcObject implements JdbcOdbcDriverInterface {
  12.    protected static JdbcOdbc OdbcApi;
  13.    protected static int hEnv;
  14.    protected static int hDbc;
  15.    protected static Hashtable connectionList;
  16.    protected static String nativePrefix;
  17.  
  18.    public JdbcOdbcDriver() {
  19.       OdbcApi = null;
  20.       hEnv = 0;
  21.       hDbc = 0;
  22.       connectionList = new Hashtable();
  23.       nativePrefix = "";
  24.    }
  25.  
  26.    protected synchronized void finalize() {
  27.       if (JdbcOdbcObject.isTracing()) {
  28.          JdbcOdbcObject.trace("Driver.finalize");
  29.       }
  30.  
  31.       try {
  32.          if (hDbc != 0) {
  33.             this.disconnect(hDbc);
  34.             this.closeConnection(hDbc);
  35.             hDbc = 0;
  36.             return;
  37.          }
  38.       } catch (SQLException var1) {
  39.       }
  40.  
  41.    }
  42.  
  43.    public synchronized Connection connect(String var1, Properties var2) throws SQLException {
  44.       if (JdbcOdbcObject.isTracing()) {
  45.          JdbcOdbcObject.trace("*Driver.connect (" + var1 + ")");
  46.       }
  47.  
  48.       if (!this.acceptsURL(var1)) {
  49.          return null;
  50.       } else {
  51.          if (hDbc != 0) {
  52.             this.disconnect(hDbc);
  53.             this.closeConnection(hDbc);
  54.             hDbc = 0;
  55.          }
  56.  
  57.          if (!this.initialize()) {
  58.             return null;
  59.          } else {
  60.             JdbcOdbcConnection var3 = new JdbcOdbcConnection(OdbcApi, hEnv, this);
  61.             var3.initialize(getSubName(var1), var2, DriverManager.getLoginTimeout());
  62.             var3.setURL(var1);
  63.             return var3;
  64.          }
  65.       }
  66.    }
  67.  
  68.    public boolean acceptsURL(String var1) throws SQLException {
  69.       boolean var2 = false;
  70.       if (this.knownURL(var1) && this.trusted()) {
  71.          var2 = true;
  72.       }
  73.  
  74.       return var2;
  75.    }
  76.  
  77.    public DriverPropertyInfo[] getPropertyInfo(String var1, Properties var2) throws SQLException {
  78.       if (JdbcOdbcObject.isTracing()) {
  79.          JdbcOdbcObject.trace("*Driver.getPropertyInfo (" + var1 + ")");
  80.       }
  81.  
  82.       if (!this.acceptsURL(var1)) {
  83.          return null;
  84.       } else if (!this.initialize()) {
  85.          return null;
  86.       } else {
  87.          String var3 = makeConnectionString(var2);
  88.          String var4 = "";
  89.          var4 = this.getConnectionAttributes(getSubName(var1), var3);
  90.          Hashtable var5 = this.getAttributeProperties(var4);
  91.          DriverPropertyInfo[] var6 = new DriverPropertyInfo[var5.size()];
  92.  
  93.          for(int var7 = 0; var7 < var5.size(); ++var7) {
  94.             var6[var7] = (DriverPropertyInfo)var5.get(new Integer(var7));
  95.          }
  96.  
  97.          return var6;
  98.       }
  99.    }
  100.  
  101.    public int getMajorVersion() {
  102.       return 1;
  103.    }
  104.  
  105.    public int getMinorVersion() {
  106.       return 1001;
  107.    }
  108.  
  109.    public boolean jdbcCompliant() {
  110.       return true;
  111.    }
  112.  
  113.    private boolean initialize() throws SQLException {
  114.       boolean var1 = true;
  115.       if (OdbcApi == null) {
  116.          try {
  117.             OdbcApi = new JdbcOdbc(nativePrefix);
  118.          } catch (Exception var3) {
  119.             if (JdbcOdbcObject.isTracing()) {
  120.                JdbcOdbcObject.trace("Unable to load JdbcOdbc library");
  121.             }
  122.  
  123.             var1 = false;
  124.          }
  125.       }
  126.  
  127.       if (hEnv == 0) {
  128.          try {
  129.             hEnv = OdbcApi.SQLAllocEnv();
  130.          } catch (Exception var2) {
  131.             if (JdbcOdbcObject.isTracing()) {
  132.                JdbcOdbcObject.trace("Unable to allocate environment");
  133.             }
  134.  
  135.             var1 = false;
  136.          }
  137.       }
  138.  
  139.       return var1;
  140.    }
  141.  
  142.    private boolean knownURL(String var1) {
  143.       String var2 = getProtocol(var1);
  144.       if (!var2.equalsIgnoreCase("jdbc")) {
  145.          return false;
  146.       } else {
  147.          var2 = getSubProtocol(var1);
  148.          return var2.equalsIgnoreCase("odbc");
  149.       }
  150.    }
  151.  
  152.    public static String getProtocol(String var0) {
  153.       String var1 = "";
  154.       int var2 = var0.indexOf(58);
  155.       if (var2 >= 0) {
  156.          var1 = var0.substring(0, var2);
  157.       }
  158.  
  159.       return var1;
  160.    }
  161.  
  162.    public static String getSubProtocol(String var0) {
  163.       String var1 = "";
  164.       int var2 = var0.indexOf(58);
  165.       if (var2 >= 0) {
  166.          int var3 = var0.indexOf(58, var2 + 1);
  167.          if (var3 >= 0) {
  168.             var1 = var0.substring(var2 + 1, var3);
  169.          }
  170.       }
  171.  
  172.       return var1;
  173.    }
  174.  
  175.    public static String getSubName(String var0) {
  176.       String var1 = "";
  177.       int var2 = var0.indexOf(58);
  178.       if (var2 >= 0) {
  179.          int var3 = var0.indexOf(58, var2 + 1);
  180.          if (var3 >= 0) {
  181.             var1 = var0.substring(var3 + 1);
  182.          }
  183.       }
  184.  
  185.       return var1;
  186.    }
  187.  
  188.    private boolean trusted() {
  189.       boolean var1 = false;
  190.       if (JdbcOdbcObject.isTracing()) {
  191.          JdbcOdbcObject.trace("JDBC to ODBC Bridge: Checking security");
  192.       }
  193.  
  194.       SecurityManager var2 = System.getSecurityManager();
  195.       if (var2 != null) {
  196.          try {
  197.             String var3 = System.getProperty("browser");
  198.             if (var3 != null && var3.equalsIgnoreCase("Netscape Navigator")) {
  199.                nativePrefix = "Netscape_";
  200.                return true;
  201.             }
  202.          } catch (Exception var4) {
  203.          }
  204.  
  205.          try {
  206.             var2.checkWrite("JdbcOdbcSecurityCheck");
  207.             var1 = true;
  208.          } catch (SecurityException var5) {
  209.             if (JdbcOdbcObject.isTracing()) {
  210.                JdbcOdbcObject.trace("Security check failed: " + ((Throwable)var5).getMessage());
  211.             }
  212.  
  213.             var1 = false;
  214.          }
  215.       } else {
  216.          if (JdbcOdbcObject.isTracing()) {
  217.             JdbcOdbcObject.trace("No SecurityManager present, assuming trusted application/applet");
  218.          }
  219.  
  220.          var1 = true;
  221.       }
  222.  
  223.       var1 = true;
  224.       return var1;
  225.    }
  226.  
  227.    public String getConnectionAttributes(String var1, String var2) throws SQLException {
  228.       String var3 = "DSN=" + var1 + var2;
  229.       if (hDbc == 0) {
  230.          hDbc = this.allocConnection(hEnv);
  231.       }
  232.  
  233.       String var4 = OdbcApi.SQLBrowseConnect(hDbc, var3);
  234.       if (var4 == null) {
  235.          var4 = "";
  236.          this.disconnect(hDbc);
  237.          this.closeConnection(hDbc);
  238.          hDbc = 0;
  239.       }
  240.  
  241.       return var4;
  242.    }
  243.  
  244.    public Hashtable getAttributeProperties(String var1) {
  245.       int var3 = 0;
  246.       int var4 = 0;
  247.       int var8 = 0;
  248.       Hashtable var15 = new Hashtable();
  249.  
  250.       for(int var16 = var1.length(); var3 < var16; var3 = var4 + 1) {
  251.          boolean var10 = true;
  252.          String var11 = null;
  253.          String var12 = null;
  254.          String[] var13 = null;
  255.          String var14 = null;
  256.          var4 = var1.indexOf(";", var3);
  257.          if (var4 < 0) {
  258.             var4 = var16 + 1;
  259.          }
  260.  
  261.          String var2 = var1.substring(var3, var4);
  262.          int var5 = 0;
  263.          int var6 = var2.indexOf(":", 0);
  264.          int var7 = var2.indexOf("=", 0);
  265.          if (var2.startsWith("*")) {
  266.             var10 = false;
  267.             ++var5;
  268.          }
  269.  
  270.          if (var6 > 0) {
  271.             var11 = var2.substring(var5, var6);
  272.          }
  273.  
  274.          if (var6 > 0 && var7 > 0) {
  275.             var12 = var2.substring(var6 + 1, var7);
  276.          }
  277.  
  278.          if (var7 > 0) {
  279.             var14 = var2.substring(var7 + 1);
  280.             if (var14.equals("?")) {
  281.                var14 = null;
  282.             }
  283.          }
  284.  
  285.          if (var14 != null && var14.startsWith("{")) {
  286.             var13 = listToArray(var14);
  287.             var14 = null;
  288.          }
  289.  
  290.          DriverPropertyInfo var9 = new DriverPropertyInfo(var11, var14);
  291.          var9.description = var12;
  292.          var9.required = var10;
  293.          var9.choices = var13;
  294.          var15.put(new Integer(var8), var9);
  295.          ++var8;
  296.       }
  297.  
  298.       return var15;
  299.    }
  300.  
  301.    protected static String makeConnectionString(Properties var0) {
  302.       String var1 = "";
  303.       Enumeration var2 = var0.propertyNames();
  304.  
  305.       while(var2.hasMoreElements()) {
  306.          String var3 = (String)var2.nextElement();
  307.          String var4 = var0.getProperty(var3);
  308.          if (var3.equalsIgnoreCase("user")) {
  309.             var3 = "UID";
  310.          }
  311.  
  312.          if (var3.equalsIgnoreCase("password")) {
  313.             var3 = "PWD";
  314.          }
  315.  
  316.          if (var4 != null) {
  317.             var1 = var1 + ";" + var3 + "=" + var4;
  318.          }
  319.       }
  320.  
  321.       return var1;
  322.    }
  323.  
  324.    protected static String[] listToArray(String var0) {
  325.       Object var1 = null;
  326.       Hashtable var3 = new Hashtable();
  327.       int var4 = 0;
  328.       int var5 = 1;
  329.       int var6 = 1;
  330.       int var7 = var0.length();
  331.       if (!var0.startsWith("{")) {
  332.          return null;
  333.       } else if (!var0.endsWith("}")) {
  334.          return null;
  335.       } else {
  336.          while(var5 < var7) {
  337.             var6 = var0.indexOf(",", var5);
  338.             if (var6 < 0) {
  339.                var6 = var7 - 1;
  340.             }
  341.  
  342.             String var2 = var0.substring(var5, var6);
  343.             var3.put(new Integer(var4), var2);
  344.             ++var4;
  345.             var5 = var6 + 1;
  346.          }
  347.  
  348.          String[] var8 = new String[var4];
  349.  
  350.          for(int var10 = 0; var10 < var4; ++var10) {
  351.             String var9 = (String)var3.get(new Integer(var10));
  352.             var8[var10] = var9;
  353.          }
  354.  
  355.          return var8;
  356.       }
  357.    }
  358.  
  359.    public int allocConnection(int var1) throws SQLException {
  360.       int var2 = 0;
  361.       var2 = OdbcApi.SQLAllocConnect(var1);
  362.       connectionList.put(new Integer(var2), new Integer(var1));
  363.       return var2;
  364.    }
  365.  
  366.    public void closeConnection(int var1) throws SQLException {
  367.       OdbcApi.SQLFreeConnect(var1);
  368.       Integer var10000 = (Integer)connectionList.remove(new Integer(var1));
  369.       if (connectionList.size() == 0 && hEnv != 0) {
  370.          OdbcApi.SQLFreeEnv(hEnv);
  371.          hEnv = 0;
  372.       }
  373.  
  374.    }
  375.  
  376.    public void disconnect(int var1) throws SQLException {
  377.       OdbcApi.SQLDisconnect(var1);
  378.    }
  379.  
  380.    static {
  381.       if (JdbcOdbcObject.isTracing()) {
  382.          JdbcOdbcObject.trace("JdbcOdbcDriver class loaded");
  383.       }
  384.  
  385.       JdbcOdbcDriver var0 = new JdbcOdbcDriver();
  386.  
  387.       try {
  388.          DriverManager.registerDriver(var0);
  389.       } catch (SQLException var1) {
  390.          if (JdbcOdbcObject.isTracing()) {
  391.             JdbcOdbcObject.trace("Unable to register driver");
  392.          }
  393.  
  394.       }
  395.    }
  396. }
  397.