001: /*
002: * This file or a portion of this file is licensed under the terms of
003: * the Globus Toolkit Public License, found in file ../GTPL, or at
004: * http://www.globus.org/toolkit/download/license.html. This notice must
005: * appear in redistributions of this file, with or without modification.
006: *
007: * Redistributions of this Software, with or without modification, must
008: * reproduce the GTPL in: (1) the Software, or (2) the Documentation or
009: * some other similar material which is provided with the Software (if
010: * any).
011: *
012: * Copyright 1999-2004 University of Chicago and The University of
013: * Southern California. All rights reserved.
014: */
015: package org.griphyn.vdl.dbdriver;
016:
017: import org.griphyn.vdl.dbdriver.DatabaseDriver;
018: import java.sql.*;
019: import java.util.*;
020: import org.griphyn.vdl.util.*;
021:
022: /**
023: * This class implements the driver API for the Microsoft SQL Server
024: * 2000 database. Please note that due to the limited capabilities of
025: * the Microsoft-provided free JDBC driver for SQL-Server, it will
026: * <i>not</i> work as a database driver. However, if you have access to
027: * the commercial JDBC3-compatible driver, you are encouraged to
028: * implement the missing functionality.
029: *
030: * @author Jens-S. Vöckler
031: * @author Yong Zhao
032: * @version $Revision: 50 $
033: *
034: * @see DatabaseDriver
035: * @see org.griphyn.vdl.dbschema
036: */
037: public class SQLServer2000 extends DatabaseDriver {
038: /**
039: * Default constructor. As the constructor will do nothing, please use
040: * the connect method to obtain a database connection.
041: *
042: * @see #connect( String, Properties, Set )
043: */
044: public SQLServer2000() {
045: super ();
046: }
047:
048: /**
049: * Establish a connection to your database. The parameters will often
050: * be ignored or abused for different purposes on different backends.
051: * It is assumed that the connection is not in auto-commit mode, and
052: * explicit commits must be issued.
053: *
054: * @param url the contact string to database, or schema location
055: * @param info additional parameters, usually username and password
056: * @param tables is a set of all table names in the schema. The
057: * existence of all tables will be checked to verify
058: * that the schema is active in the database.
059: * @return true if the connection succeeded, false otherwise. Usually,
060: * false is returned, if the any of the tables or sequences is missing.
061: * @exception if the driver is incapable of establishing a connection.
062: */
063: public boolean connect(String url, Properties info, Set tables)
064: throws SQLException, ClassNotFoundException {
065: // load PostGreSQL driver class into memory
066: return this .connect(
067: "com.microsoft.jdbc.sqlserver.SQLServerDriver", url,
068: info, tables);
069:
070: }
071:
072: /**
073: * Determines, if the backend is expensive, and results should be cached.
074: * Ideally, this will move transparently into the backend itself.
075: * @return true if caching is advisable, false for no caching.
076: */
077: public boolean cachingMakesSense() {
078: return true;
079: }
080:
081: /**
082: * Quotes a string that may contain special SQL characters.
083: * @param s is the raw string.
084: * @return the quoted string, which may be just the input string.
085: */
086: public String quote(String s) {
087: if (s.indexOf('\'') != -1) {
088: StringBuffer result = new StringBuffer();
089: for (int i = 0; i < s.length(); ++i) {
090: char ch = s.charAt(i);
091: result.append(ch);
092: if (ch == '\'')
093: result.append(ch);
094: }
095: return result.toString();
096: } else {
097: return s;
098: }
099: }
100:
101: /**
102: * Obtains the next value from a sequence. JDBC drivers which allow
103: * explicit access to sequence generator will return a valid value
104: * in this function. All other JDBC drivers should return -1.
105: *
106: * @param name is the name of the sequence.
107: * @return the next sequence number.
108: * @exception if something goes wrong while fetching the new value.
109: */
110: public long sequence1(String name) throws SQLException {
111: throw new SQLException(this .getClass().getName()
112: + ": Method not implemented, "
113: + "please notify vds-support@griphyn.org");
114: }
115:
116: /**
117: * Obtains the sequence value for the current statement. JDBC driver
118: * that permit insertion of NULL into auto-increment value should use
119: * this method to return the inserted ID value via the statements
120: * getGeneratedKeys(). Other JDBC drivers should treat return the
121: * parametric id.
122: *
123: * @param s is a statment or prepared statement
124: * @param name is the name of the sequence.
125: * @param pos is the column number of the auto-increment column.
126: * @return the next sequence number.
127: * @exception if something goes wrong while fetching the new value.
128: */
129: public long sequence2(Statement s, String name, int pos)
130: throws SQLException {
131: throw new SQLException(this .getClass().getName()
132: + ": Method not implemented, "
133: + "please notify vds-support@griphyn.org");
134: }
135:
136: /**
137: * Predicate to tell the schema, if using a string instead of number
138: * will result in the speedier index scans instead of sequential scans.
139: * PostGreSQL has this problem, but using strings in the place of
140: * integers may not be universally portable.
141: *
142: * @return true, if using strings instead of integers and bigints
143: * will yield better performance.
144: *
145: */
146: public boolean preferString() {
147: return false;
148: }
149: }
|