Added: incubator/derby/code/trunk/java/client/org/apache/derby/jdbc/ClientDriver.java URL: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/client/org/apache/derby/jdbc/ClientDriver.java?rev=165178&view=auto ============================================================================== --- incubator/derby/code/trunk/java/client/org/apache/derby/jdbc/ClientDriver.java (added) +++ incubator/derby/code/trunk/java/client/org/apache/derby/jdbc/ClientDriver.java Thu Apr 28 12:05:42 2005 @@ -0,0 +1,297 @@ +/* + + Derby - Class org.apache.derby.jdbc.ClientDriver + + Copyright (c) 2001, 2005 The Apache Software Foundation or its licensors, where applicable. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +*/ + +package org.apache.derby.jdbc; + +import org.apache.derby.client.resources.ResourceKeys; +import org.apache.derby.client.am.ResourceUtilities; +import org.apache.derby.client.am.Utils; +import org.apache.derby.client.am.Configuration; +import org.apache.derby.client.am.SqlException; +import org.apache.derby.client.am.Version; + + +public class ClientDriver implements java.sql.Driver +{ + private transient int traceFileSuffixIndex_ = 0; + + private final static int DERBY_REMOTE_PROTOCOL = 1; + + static private SqlException exceptionsOnLoadDriver__ = null; + // Keep track of the registere driver so that we can deregister it if we're a stored proc. + static private ClientDriver registeredDriver__ = null; + + static { + // This may possibly hit the race-condition bug of java 1.1. + // The Configuration static clause should execute before the following line does. + if (Configuration.exceptionsOnLoadResources != null) { + exceptionsOnLoadDriver__ = + Utils.accumulateSQLException (Configuration.exceptionsOnLoadResources, + exceptionsOnLoadDriver__); + } + try { + registeredDriver__ = new ClientDriver(); + java.sql.DriverManager.registerDriver (registeredDriver__); + } + catch (java.sql.SQLException e) { + // A null log writer is passed, because jdbc 1 sql exceptions are automatically traced + exceptionsOnLoadDriver__ = + new SqlException (null, "Error occurred while trying to register Dnc driver with JDBC 1 Driver Manager"); + exceptionsOnLoadDriver__.setNextException (e); + } + } + + public ClientDriver() {} + + public java.sql.Connection connect (String url, + java.util.Properties properties) throws java.sql.SQLException + { + if (exceptionsOnLoadDriver__ != null) throw exceptionsOnLoadDriver__; + + if (properties == null) properties = new java.util.Properties(); + + java.util.StringTokenizer urlTokenizer = + new java.util.StringTokenizer (url, "/:= \t\n\r\f", true); + + int protocol = tokenizeProtocol (url, urlTokenizer); + if (protocol == 0) return null; // unrecognized database URL prefix. + + String slashOrNull = null; + if (protocol == DERBY_REMOTE_PROTOCOL) { + try { + slashOrNull = urlTokenizer.nextToken (":/"); + } + catch (java.util.NoSuchElementException e) { + // A null log writer is passed, because jdbc 1 sqlexceptions are automatically traced + throw new SqlException (null, e, "Invalid database url syntax: " + url); + } + } + String server = tokenizeServerName (urlTokenizer, url); // "/server" + int port = tokenizeOptionalPortNumber (urlTokenizer, url); // "[:port]/" + if (port == 0) + port = ClientDataSource.propertyDefault_portNumber; + + // longDatabase is the databaseName and attributes. This will be + // sent to network server as the databaseName + String database = tokenizeDatabase (urlTokenizer, url); // "database" + java.util.Properties augmentedProperties = tokenizeURLProperties (url, properties); + + + int traceLevel; + try { + traceLevel = ClientDataSource.getTraceLevel (augmentedProperties); + } + catch (java.lang.NumberFormatException e) { + // A null log writer is passed, because jdbc 1 sqlexceptions are automatically traced + throw new SqlException (null, e, "trouble reading traceLevel connection property"); + } + + // Jdbc 1 connections will write driver trace info on a + // driver-wide basis using the jdbc 1 driver manager log writer. + // This log writer may be narrowed to the connection-level + // This log writer will be passed to the agent constructor. + org.apache.derby.client.am.LogWriter dncLogWriter = + ClientDataSource.computeDncLogWriterForNewConnection ( + java.sql.DriverManager.getLogWriter(), + ClientDataSource.getTraceDirectory (augmentedProperties), + ClientDataSource.getTraceFile (augmentedProperties), + ClientDataSource.getTraceFileAppend (augmentedProperties), + traceLevel, + "_driver", + traceFileSuffixIndex_++); + + org.apache.derby.client.net.NetConnection conn = + new org.apache.derby.client.net.NetConnection ( + (org.apache.derby.client.net.NetLogWriter) dncLogWriter, + java.sql.DriverManager.getLoginTimeout(), + server, + port, + database, + augmentedProperties); + return conn; + } + + public boolean acceptsURL (String url) throws java.sql.SQLException + { + java.util.StringTokenizer urlTokenizer = new java.util.StringTokenizer (url, "/:=; \t\n\r\f", true); + int protocol = tokenizeProtocol (url, urlTokenizer); + return protocol != 0; + } + + public java.sql.DriverPropertyInfo[] getPropertyInfo (String url, + java.util.Properties properties) throws java.sql.SQLException + { + java.sql.DriverPropertyInfo driverPropertyInfo[] = new java.sql.DriverPropertyInfo[2]; + + // If there are no properties set already, + // then create a dummy properties just to make the calls go thru. + if (properties == null) + properties = new java.util.Properties (); + + driverPropertyInfo[0] = + new java.sql.DriverPropertyInfo (ClientDataSource.propertyKey_user, + properties.getProperty (ClientDataSource.propertyKey_user,ClientDataSource.propertyDefault_user)); + + driverPropertyInfo[1] = + new java.sql.DriverPropertyInfo (ClientDataSource.propertyKey_password, + properties.getProperty (ClientDataSource.propertyKey_password)); + + driverPropertyInfo[0].description = + ResourceUtilities.getResource (ResourceKeys.propertyDescription__user); + driverPropertyInfo[1].description = + ResourceUtilities.getResource (ResourceKeys.propertyDescription__password); + + driverPropertyInfo[0].required = true; + driverPropertyInfo[1].required = false; // depending on the security mechanism + + return driverPropertyInfo; + } + + public int getMajorVersion() + { + return Version.getMajorVersion(); + } + + public int getMinorVersion() + { + return Version.getMinorVersion(); + } + + public boolean jdbcCompliant() + { + return Configuration.jdbcCompliant; + } + + // ----------------helper methods--------------------------------------------- + + // Tokenize one of the following: + // "jdbc:derby:" + // and return 0 if the protcol is unrecognized + // return DERBY_PROTOCOL for "jdbc:derby" + private static int tokenizeProtocol (String url, java.util.StringTokenizer urlTokenizer) throws SqlException + { + // Is this condition necessary, StringTokenizer constructor may do this for us + if (url == null) return 0; + + if (urlTokenizer == null) return 0; + + try { + String jdbc = urlTokenizer.nextToken (":"); + if (!jdbc.equals ("jdbc")) return 0; + if (!urlTokenizer.nextToken (":").equals (":")) + return 0; // Skip over the first colon in jdbc:derby: + String dbname = urlTokenizer.nextToken (":"); + int protocol = 0; + if (dbname.equals("derby") && (url.indexOf("derby://") != -1)){ + // For Derby AS need to check for // since jdbc:derby: is also the + // embedded prefix + protocol = DERBY_REMOTE_PROTOCOL; + } + else + return 0; + + if (!urlTokenizer.nextToken (":").equals (":") ) + return 0; // Skip over the second colon in jdbc:derby: + + return protocol; + } + catch (java.util.NoSuchElementException e) { + return 0; + } + } + + // tokenize "/server" from URL jdbc:derby://server:port/ + // returns server name + private static String tokenizeServerName (java.util.StringTokenizer urlTokenizer, + String url) throws SqlException + { + try { + if (!urlTokenizer.nextToken("/").equals ("/")) + // A null log writer is passed, because jdbc 1 sqlexceptions are automatically traced + throw new SqlException (null, "Invalid database url syntax: " + url); + return urlTokenizer.nextToken ("/:"); + } + catch (java.util.NoSuchElementException e) { + // A null log writer is passed, because jdbc 1 sqlexceptions are automatically traced + throw new SqlException (null, e, "Invalid database url syntax: " + url); + } + } + + // tokenize "[:portNumber]/" from URL jdbc:derby://server[:port]/ + // returns the portNumber or zero if portNumber is not specified. + private static int tokenizeOptionalPortNumber (java.util.StringTokenizer urlTokenizer, + String url) throws SqlException + { + try { + String firstToken = urlTokenizer.nextToken(":/"); + if (firstToken.equals (":")) { + String port = urlTokenizer.nextToken ("/"); + if (!urlTokenizer.nextToken ("/").equals ("/")) { + // A null log writer is passed, because jdbc 1 sqlexceptions are automatically traced + throw new SqlException (null, "Invalid database url syntax: " + url); + } + return Integer.parseInt (port); + } + else if (firstToken.equals ("/")) { + return 0; + } + else { + // A null log writer is passed, because jdbc 1 sqlexceptions are automatically traced + throw new SqlException (null, "Invalid database url syntax: " + url); + } + } + catch (java.util.NoSuchElementException e) { + // A null log writer is passed, because jdbc 1 sqlexceptions are automatically traced + throw new SqlException (null, e, "Invalid database url syntax: " + url); + } + } + + //return database name and attributes + private static String tokenizeDatabase (java.util.StringTokenizer urlTokenizer, + String url) throws SqlException + { + try { + String databaseName = urlTokenizer.nextToken (" \t\n\r\f"); + return databaseName; + } + catch (java.util.NoSuchElementException e) { + // A null log writer is passed, because jdbc 1 sqlexceptions are automatically traced + throw new SqlException (null, e, "Invalid database url syntax: " + url); + } + } + + private static java.util.Properties tokenizeURLProperties (String url, + java.util.Properties properties) + throws SqlException + { + String attributeString = null; + int attributeIndex = -1; + + if ((url != null) && + ((attributeIndex = url.indexOf(";")) != -1)) + attributeString = url.substring(attributeIndex); + return ClientDataSource.tokenizeAttributes(attributeString, properties); + } + + +} + + +
Propchange: incubator/derby/code/trunk/java/client/org/apache/derby/jdbc/ClientDriver.java ------------------------------------------------------------------------------ svn:eol-style = native Added: incubator/derby/code/trunk/java/client/org/apache/derby/jdbc/ClientXADataSource.java URL: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/client/org/apache/derby/jdbc/ClientXADataSource.java?rev=165178&view=auto ============================================================================== --- incubator/derby/code/trunk/java/client/org/apache/derby/jdbc/ClientXADataSource.java (added) +++ incubator/derby/code/trunk/java/client/org/apache/derby/jdbc/ClientXADataSource.java Thu Apr 28 12:05:42 2005 @@ -0,0 +1,63 @@ +/* + + Derby - Class org.apache.derby.jdbc.ClientXADataSource + + Copyright (c) 2001, 2005 The Apache Software Foundation or its licensors, where applicable. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +*/ + +package org.apache.derby.jdbc; + +import javax.sql.*; +import org.apache.derby.client.ClientXAConnection; + + +public class ClientXADataSource extends ClientDataSource implements XADataSource, + java.io.Serializable, + javax.naming.Referenceable +{ + public static final String className__ = "org.apache.derby.jdbc.ClientXADataSource"; + + // following serialVersionUID was generated by the JDK's serialver program + // verify it everytime that ClientXADataSource is modified + static final long serialVersionUID = 7057075094707674880L; + + private String password = null; + synchronized public void setPassword (String password) { this.password = password; } + public final static String propertyKey_password = "password"; + + public ClientXADataSource() + { + this.setResultSetHoldability( org.apache.derby.client.ClientBaseDataSource.CLOSE_CURSORS_AT_COMMIT ); + } + + public XAConnection getXAConnection() throws java.sql.SQLException + { + + return getXAConnection(this.user, this.password); + } + + public XAConnection getXAConnection (String user, String password) throws java.sql.SQLException + { + org.apache.derby.client.am.LogWriter dncLogWriter = super.computeDncLogWriterForNewConnection ("_xads"); + + + ClientXAConnection xaConn_ = new ClientXAConnection( this, + (org.apache.derby.client.net.NetLogWriter) dncLogWriter, + user, + password); + return xaConn_; + } +} Propchange: incubator/derby/code/trunk/java/client/org/apache/derby/jdbc/ClientXADataSource.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: incubator/derby/code/trunk/tools/ant/properties/dirs.properties URL: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/tools/ant/properties/dirs.properties?rev=165178&r1=165177&r2=165178&view=diff ============================================================================== --- incubator/derby/code/trunk/tools/ant/properties/dirs.properties (original) +++ incubator/derby/code/trunk/tools/ant/properties/dirs.properties Thu Apr 28 12:05:42 2005 @@ -34,6 +34,7 @@ derby.engine.src.dir=${derbysrc.dir}/engine derby.drda.src.dir=${derbysrc.dir}/drda +derby.client.src.dir=${derbysrc.dir}/client derby.tools.src.dir=${derbysrc.dir}/tools derby.build.src.dir=${derbysrc.dir}/build derby.demo.src.dir=${derbysrc.dir}/demo @@ -42,6 +43,7 @@ derby.engine.dir=${derby.engine.src.dir}/${derby.dir} derby.drda.dir=${derby.drda.src.dir}/${derby.dir} +derby.client.dir=${derby.client.src.dir}/{derby.dir} derby.tools.dir=${derby.tools.src.dir}/${derby.dir} derby.build.dir=${derby.build.src.dir}/org/apache/derbyBuild derby.locales.dir=${derby.engine.dir}/loc