added javadoc comments to some database classes
This commit is contained in:
		
							parent
							
								
									ef629c8e48
								
							
						
					
					
						commit
						33eecf87fc
					
				@ -7,7 +7,7 @@
 | 
			
		||||
 * WARRANTY OF ANY KIND, either express or implied. See the License for the specific
 | 
			
		||||
 * language governing rights and limitations under the License.
 | 
			
		||||
 * 
 | 
			
		||||
 * The Original Code is the Venice Web Community System.
 | 
			
		||||
 * The Original Code is the Venice Web Communities System.
 | 
			
		||||
 * 
 | 
			
		||||
 * The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
 | 
			
		||||
 * for Silverwrist Design Studios.  Portions created by Eric J. Bowersox are
 | 
			
		||||
@ -24,6 +24,16 @@ import org.w3c.dom.*;
 | 
			
		||||
import com.silverwrist.util.DOMElementHelper;
 | 
			
		||||
import com.silverwrist.venice.core.ConfigException;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * A simple pooling system for JDBC connections, which allows connections to be kept in a pool until
 | 
			
		||||
 * they're needed, avoiding the overhead of opening and closing connections for each transaction, or
 | 
			
		||||
 * keeping one database connection open for each user.<P>
 | 
			
		||||
 * Based on some code from Marty Hall's <EM>Core Servlets and Java Server Pages</EM> (Prentice Hall/
 | 
			
		||||
 * Sun Microsystems, 2000).
 | 
			
		||||
 *
 | 
			
		||||
 * @author Eric J. Bowersox <erbo@silcom.com>
 | 
			
		||||
 * @version X
 | 
			
		||||
 */
 | 
			
		||||
public class DataPool implements Runnable
 | 
			
		||||
{
 | 
			
		||||
  /*--------------------------------------------------------------------------------
 | 
			
		||||
@ -31,7 +41,7 @@ public class DataPool implements Runnable
 | 
			
		||||
   *--------------------------------------------------------------------------------
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  private static Category logger = Category.getInstance(DataPool.class.getName());
 | 
			
		||||
  private static Category logger = Category.getInstance(DataPool.class);
 | 
			
		||||
 | 
			
		||||
  /*--------------------------------------------------------------------------------
 | 
			
		||||
   * Attributes
 | 
			
		||||
@ -53,6 +63,13 @@ public class DataPool implements Runnable
 | 
			
		||||
   *--------------------------------------------------------------------------------
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Creates and configures a new database pool, based on a section from the Venice configuration file.
 | 
			
		||||
   *
 | 
			
		||||
   * @param cfg The <database/> section of the configuration file.
 | 
			
		||||
   * @exception com.silverwrist.venice.core.ConfigException The configuration is not correct in some way.
 | 
			
		||||
   * @exception java.sql.SQLException If the initial connections could not be created.
 | 
			
		||||
   */
 | 
			
		||||
  public DataPool(Element cfg) throws ConfigException, SQLException
 | 
			
		||||
  {
 | 
			
		||||
    // Make sure they passed the <database/> section to us.
 | 
			
		||||
@ -194,16 +211,14 @@ public class DataPool implements Runnable
 | 
			
		||||
   *--------------------------------------------------------------------------------
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Called by the garbage collector on an object when garbage collection determines that there are no
 | 
			
		||||
   * more references to the object.
 | 
			
		||||
   */
 | 
			
		||||
  protected void finalize()
 | 
			
		||||
  {
 | 
			
		||||
    closeConnections(avail_connections);
 | 
			
		||||
    avail_connections = null;
 | 
			
		||||
    closeConnections(busy_connections);
 | 
			
		||||
    busy_connections = null;
 | 
			
		||||
    driver = null;
 | 
			
		||||
    url = null;
 | 
			
		||||
    username = null;
 | 
			
		||||
    password = null;
 | 
			
		||||
 | 
			
		||||
  } // end finalize
 | 
			
		||||
 | 
			
		||||
@ -212,6 +227,12 @@ public class DataPool implements Runnable
 | 
			
		||||
   *--------------------------------------------------------------------------------
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Creates and returns a new database connection.
 | 
			
		||||
   *
 | 
			
		||||
   * @return The new database connection object.
 | 
			
		||||
   * @exception java.sql.SQLException An error prevented the creation of the connection.
 | 
			
		||||
   */
 | 
			
		||||
  private Connection makeNewConnection() throws SQLException
 | 
			
		||||
  {
 | 
			
		||||
    try
 | 
			
		||||
@ -242,6 +263,11 @@ public class DataPool implements Runnable
 | 
			
		||||
 | 
			
		||||
  } // end makeNewConnection
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Spins off a background thread to create a new database connection.
 | 
			
		||||
   *
 | 
			
		||||
   * @see #run()
 | 
			
		||||
   */
 | 
			
		||||
  private void makeBackgroundConnection()
 | 
			
		||||
  {
 | 
			
		||||
    pending = true;
 | 
			
		||||
@ -260,7 +286,12 @@ public class DataPool implements Runnable
 | 
			
		||||
 | 
			
		||||
  } // end makeBackgroundConnection
 | 
			
		||||
 | 
			
		||||
  private void closeConnections(Vector vconn)
 | 
			
		||||
  /**
 | 
			
		||||
   * Closes all database connections in the specified vector.
 | 
			
		||||
   *
 | 
			
		||||
   * @param vconn Vector of connections to be closed.
 | 
			
		||||
   */
 | 
			
		||||
  private static void closeConnections(Vector vconn)
 | 
			
		||||
  {
 | 
			
		||||
    if (logger.isDebugEnabled())
 | 
			
		||||
      logger.debug("closeConnections(" + String.valueOf(vconn.size()) + " to be closed)");
 | 
			
		||||
@ -289,6 +320,14 @@ public class DataPool implements Runnable
 | 
			
		||||
   *--------------------------------------------------------------------------------
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * The thread function which creates a new connection and adds it to the list of available
 | 
			
		||||
   * connections "in the background."  It then notifies all threads which are waiting for a
 | 
			
		||||
   * new connection.
 | 
			
		||||
   *
 | 
			
		||||
   * @see #makeBackgroundConnection()
 | 
			
		||||
   * @see #makeNewConnection()
 | 
			
		||||
   */
 | 
			
		||||
  public void run()
 | 
			
		||||
  {
 | 
			
		||||
    try
 | 
			
		||||
@ -319,6 +358,11 @@ public class DataPool implements Runnable
 | 
			
		||||
   *--------------------------------------------------------------------------------
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Returns the number of connections currently managed by this pool.
 | 
			
		||||
   *
 | 
			
		||||
   * @return The number of connections currently managed by this pool.
 | 
			
		||||
   */
 | 
			
		||||
  public synchronized int numConnections()
 | 
			
		||||
  {
 | 
			
		||||
    int rc = avail_connections.size() + busy_connections.size();
 | 
			
		||||
@ -328,6 +372,14 @@ public class DataPool implements Runnable
 | 
			
		||||
 | 
			
		||||
  } // end numConnections
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Attempts to get a database connection from the pool, waiting for one if the "wait-if-busy" flag was set
 | 
			
		||||
   * in the data pool's configuration.
 | 
			
		||||
   *
 | 
			
		||||
   * @return A new database connection.
 | 
			
		||||
   * @exception java.sql.SQLException The connection limit was reached, or an error prevented the creation
 | 
			
		||||
   *            of another connection.
 | 
			
		||||
   */
 | 
			
		||||
  public synchronized Connection getConnection() throws SQLException
 | 
			
		||||
  {
 | 
			
		||||
    for (;;)
 | 
			
		||||
@ -387,14 +439,28 @@ public class DataPool implements Runnable
 | 
			
		||||
 | 
			
		||||
  } // end getConnection
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Returns a database connection to the pool.
 | 
			
		||||
   *
 | 
			
		||||
   * @param c The connection to be returned to the pool.
 | 
			
		||||
   */
 | 
			
		||||
  public synchronized void releaseConnection(Connection c)
 | 
			
		||||
  {
 | 
			
		||||
    busy_connections.removeElement(c); // move from one vector to another
 | 
			
		||||
    avail_connections.addElement(c);
 | 
			
		||||
    notifyAll();  // wake up!  Got a new connection for you!
 | 
			
		||||
    if (c!=null)
 | 
			
		||||
    { // move from one vector to another
 | 
			
		||||
      busy_connections.removeElement(c);
 | 
			
		||||
      avail_connections.addElement(c);
 | 
			
		||||
      notifyAll();  // wake up!  Got a new connection for you!
 | 
			
		||||
 | 
			
		||||
    } // end if
 | 
			
		||||
 | 
			
		||||
  } // end releaseConnection
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Closes all connections managed by this data pool.
 | 
			
		||||
   *
 | 
			
		||||
   * @see #closeConnections(java.util.Vector)
 | 
			
		||||
   */
 | 
			
		||||
  public synchronized void closeAllConnections()
 | 
			
		||||
  {
 | 
			
		||||
    if (logger.isDebugEnabled())
 | 
			
		||||
@ -406,6 +472,11 @@ public class DataPool implements Runnable
 | 
			
		||||
 | 
			
		||||
  } // end closeAllConnections
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Returns a string reflecting the current state of the data pool, commonly used for debugging.
 | 
			
		||||
   *
 | 
			
		||||
   * @return The debugging string for this pool.
 | 
			
		||||
   */
 | 
			
		||||
  public synchronized String toString()
 | 
			
		||||
  {
 | 
			
		||||
    StringBuffer info = new StringBuffer();
 | 
			
		||||
 | 
			
		||||
@ -19,8 +19,16 @@ package com.silverwrist.venice.db;
 | 
			
		||||
 | 
			
		||||
import java.sql.*;
 | 
			
		||||
import java.util.*;
 | 
			
		||||
import com.silverwrist.util.AnyCharMatcher;
 | 
			
		||||
import com.silverwrist.util.StringUtil;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Utility functions commonly used for passing string values to SQL commands, and interpreting the results.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Eric J. Bowersox <erbo@silcom.com>
 | 
			
		||||
 * @version X
 | 
			
		||||
 * @see com.silverwrist.util.StringUtil
 | 
			
		||||
 */
 | 
			
		||||
public class SQLUtil
 | 
			
		||||
{
 | 
			
		||||
  /*--------------------------------------------------------------------------------
 | 
			
		||||
@ -28,6 +36,9 @@ public class SQLUtil
 | 
			
		||||
   *--------------------------------------------------------------------------------
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  private static final String SQL_WILDCARD_CHARS = "%_'";
 | 
			
		||||
 | 
			
		||||
  // used to convert dates and times to UTC for sending to SQL
 | 
			
		||||
  private static SimpleTimeZone utc = new SimpleTimeZone(0,"UTC");
 | 
			
		||||
 | 
			
		||||
  /*--------------------------------------------------------------------------------
 | 
			
		||||
@ -35,6 +46,13 @@ public class SQLUtil
 | 
			
		||||
   *--------------------------------------------------------------------------------
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Converts a date-and-time string (an SQL DATETIME value) to a standard Java date.
 | 
			
		||||
   *
 | 
			
		||||
   * @param dstr The date-and-time string to convert, presumed to be in UTC.
 | 
			
		||||
   * @return The converted date and time.
 | 
			
		||||
   * @exception java.sql.SQLException The date and time string was in an invalid format.
 | 
			
		||||
   */
 | 
			
		||||
  private static java.util.Date convertDateTimeString(String dstr) throws SQLException
 | 
			
		||||
  {
 | 
			
		||||
    if (dstr==null)
 | 
			
		||||
@ -65,12 +83,31 @@ public class SQLUtil
 | 
			
		||||
   *--------------------------------------------------------------------------------
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Performs SQL encoding of an arbitrary string.  When a string is SQL-encoded, all single-quote
 | 
			
		||||
   * characters are doubled, and all other characters are left untouched.
 | 
			
		||||
   *
 | 
			
		||||
   * @param str The string to be SQL-encoded.  May be <CODE>null</CODE>.
 | 
			
		||||
   * @return The SQL-encoded equivalent of <CODE>str</CODE>.  If <CODE>str</CODE> is
 | 
			
		||||
   *         <CODE>null</CODE>, returns <CODE>null</CODE>.
 | 
			
		||||
   * @see com.silverwrist.util.StringUtil#encodeStringSQL(java.lang.String)
 | 
			
		||||
   */
 | 
			
		||||
  public static String encodeString(String str)
 | 
			
		||||
  {
 | 
			
		||||
    return StringUtil.encodeStringSQL(str);
 | 
			
		||||
 | 
			
		||||
  } // end encodeString
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Performs SQL encoding of an arbitrary string, enclosing it in quotes, so that it may be passed as an
 | 
			
		||||
   * argument in an SQL statement.  When a string is SQL-encoded, all single-quote characters are doubled,
 | 
			
		||||
   * and all other characters are left untouched.
 | 
			
		||||
   *
 | 
			
		||||
   * @param str The string to be SQL-encoded.  May be <CODE>null</CODE>.
 | 
			
		||||
   * @return The SQL-encoded equivalent of <CODE>str</CODE>, in quotes.  If <CODE>str</CODE> is
 | 
			
		||||
   *         <CODE>null</CODE>, returns "NULL".
 | 
			
		||||
   * @see com.silverwrist.util.StringUtil#encodeStringSQL(java.lang.String)
 | 
			
		||||
   */
 | 
			
		||||
  public static String encodeStringArg(String str)
 | 
			
		||||
  {
 | 
			
		||||
    if (str==null)
 | 
			
		||||
@ -81,41 +118,62 @@ public class SQLUtil
 | 
			
		||||
 | 
			
		||||
  } // end encodeStringArg
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Performs SQL-encoding of a string which may contain the SQL wildcard characters, '%' and '_'.  The
 | 
			
		||||
   * wildcard characters are escaped with '\', and the single-quote characters are doubled, but all other
 | 
			
		||||
   * characters are left untouched.
 | 
			
		||||
   *
 | 
			
		||||
   * @param str The string to be SQL-encoded.  May be <CODE>null</CODE>.
 | 
			
		||||
   * @return The SQL-encoded equivalent of <CODE>str</CODE>.  If <CODE>str</CODE> is
 | 
			
		||||
   *         <CODE>null</CODE>, returns <CODE>null</CODE>.
 | 
			
		||||
   */
 | 
			
		||||
  public static String encodeStringWildcards(String str)
 | 
			
		||||
  {
 | 
			
		||||
    if ((str.indexOf('_')<0) && (str.indexOf('%')<0))
 | 
			
		||||
      return StringUtil.encodeStringSQL(str);
 | 
			
		||||
 | 
			
		||||
    if (str==null)
 | 
			
		||||
      return null;  // safety feature
 | 
			
		||||
    AnyCharMatcher nhc = new AnyCharMatcher(SQL_WILDCARD_CHARS);
 | 
			
		||||
    int ndx = nhc.get(str);
 | 
			
		||||
    if (ndx<0)
 | 
			
		||||
      return str;   // trivial short-circuit case
 | 
			
		||||
    StringBuffer buf = new StringBuffer();
 | 
			
		||||
    for (int i=0; i<str.length(); i++)
 | 
			
		||||
    { // loop through the string encoding its characters
 | 
			
		||||
      char c = str.charAt(i);
 | 
			
		||||
      switch (c)
 | 
			
		||||
    while (ndx>=0)
 | 
			
		||||
    { // append the matched "head" and then the encoded character
 | 
			
		||||
      if (ndx>0)
 | 
			
		||||
	buf.append(str.substring(0,ndx));
 | 
			
		||||
      switch (str.charAt(ndx++))
 | 
			
		||||
      {
 | 
			
		||||
	case '\'':
 | 
			
		||||
	  buf.append("\'\'");
 | 
			
		||||
	case '%':
 | 
			
		||||
	  buf.append("\\%");
 | 
			
		||||
	  break;
 | 
			
		||||
 | 
			
		||||
	case '_':
 | 
			
		||||
	  buf.append("\\_");
 | 
			
		||||
	  break;
 | 
			
		||||
 | 
			
		||||
	case '%':
 | 
			
		||||
	  buf.append("\\%");
 | 
			
		||||
	  break;
 | 
			
		||||
 | 
			
		||||
	default:
 | 
			
		||||
	  buf.append(c);
 | 
			
		||||
	case '\'':
 | 
			
		||||
	  buf.append("\'\'");
 | 
			
		||||
	  break;
 | 
			
		||||
 | 
			
		||||
      } // end switch
 | 
			
		||||
 | 
			
		||||
    } // end for
 | 
			
		||||
      if (ndx==str.length())
 | 
			
		||||
	return buf.toString();  // munched the entire string - all done!
 | 
			
		||||
      str = str.substring(ndx);
 | 
			
		||||
      ndx = nhc.get(str);
 | 
			
		||||
 | 
			
		||||
    } // end while
 | 
			
		||||
 | 
			
		||||
    buf.append(str);  // append the unmatched tail
 | 
			
		||||
    return buf.toString();
 | 
			
		||||
 | 
			
		||||
  } // end encodeStringWildcards
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Encodes a date as an SQL date/time string, expressed in UTC.
 | 
			
		||||
   *
 | 
			
		||||
   * @param d The date to be encoded.
 | 
			
		||||
   * @return The string equivalent of that date.
 | 
			
		||||
   */
 | 
			
		||||
  public static String encodeDate(java.util.Date d)
 | 
			
		||||
  {
 | 
			
		||||
    // Break down the date as a UTC value.
 | 
			
		||||
@ -167,12 +225,28 @@ public class SQLUtil
 | 
			
		||||
 | 
			
		||||
  } // end encodeDate
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Returns the value of a DATETIME column in the current row of an SQL result set, formatted as a date.
 | 
			
		||||
   *
 | 
			
		||||
   * @param rs The result set to look in.
 | 
			
		||||
   * @param column The name of the column to be returned.
 | 
			
		||||
   * @return The value of the specified column, expressed as a date.
 | 
			
		||||
   * @exception java.sql.SQLException If the column could not be retrieved or converted.
 | 
			
		||||
   */
 | 
			
		||||
  public static java.util.Date getFullDateTime(ResultSet rs, String column) throws SQLException
 | 
			
		||||
  {
 | 
			
		||||
    return convertDateTimeString(rs.getString(column));
 | 
			
		||||
 | 
			
		||||
  } // end getFullDateTime
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Returns the value of a DATETIME column in the current row of an SQL result set, formatted as a date.
 | 
			
		||||
   *
 | 
			
		||||
   * @param rs The result set to look in.
 | 
			
		||||
   * @param column The 1-based index of the column to be returned.
 | 
			
		||||
   * @return The value of the specified column, expressed as a date.
 | 
			
		||||
   * @exception java.sql.SQLException If the column could not be retrieved or converted.
 | 
			
		||||
   */
 | 
			
		||||
  public static java.util.Date getFullDateTime(ResultSet rs, int column) throws SQLException
 | 
			
		||||
  {
 | 
			
		||||
    return convertDateTimeString(rs.getString(column));
 | 
			
		||||
@ -180,4 +254,3 @@ public class SQLUtil
 | 
			
		||||
  } // end getFullDateTime
 | 
			
		||||
 | 
			
		||||
} // end class SQLUtil
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user