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
|
* WARRANTY OF ANY KIND, either express or implied. See the License for the specific
|
||||||
* language governing rights and limitations under the License.
|
* 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>,
|
* 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
|
* 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.util.DOMElementHelper;
|
||||||
import com.silverwrist.venice.core.ConfigException;
|
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
|
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
|
* 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
|
public DataPool(Element cfg) throws ConfigException, SQLException
|
||||||
{
|
{
|
||||||
// Make sure they passed the <database/> section to us.
|
// 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()
|
protected void finalize()
|
||||||
{
|
{
|
||||||
closeConnections(avail_connections);
|
closeConnections(avail_connections);
|
||||||
avail_connections = null;
|
|
||||||
closeConnections(busy_connections);
|
closeConnections(busy_connections);
|
||||||
busy_connections = null;
|
|
||||||
driver = null;
|
|
||||||
url = null;
|
|
||||||
username = null;
|
|
||||||
password = null;
|
|
||||||
|
|
||||||
} // end finalize
|
} // 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
|
private Connection makeNewConnection() throws SQLException
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
@ -242,6 +263,11 @@ public class DataPool implements Runnable
|
||||||
|
|
||||||
} // end makeNewConnection
|
} // end makeNewConnection
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Spins off a background thread to create a new database connection.
|
||||||
|
*
|
||||||
|
* @see #run()
|
||||||
|
*/
|
||||||
private void makeBackgroundConnection()
|
private void makeBackgroundConnection()
|
||||||
{
|
{
|
||||||
pending = true;
|
pending = true;
|
||||||
|
@ -260,7 +286,12 @@ public class DataPool implements Runnable
|
||||||
|
|
||||||
} // end makeBackgroundConnection
|
} // 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())
|
if (logger.isDebugEnabled())
|
||||||
logger.debug("closeConnections(" + String.valueOf(vconn.size()) + " to be closed)");
|
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()
|
public void run()
|
||||||
{
|
{
|
||||||
try
|
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()
|
public synchronized int numConnections()
|
||||||
{
|
{
|
||||||
int rc = avail_connections.size() + busy_connections.size();
|
int rc = avail_connections.size() + busy_connections.size();
|
||||||
|
@ -328,6 +372,14 @@ public class DataPool implements Runnable
|
||||||
|
|
||||||
} // end numConnections
|
} // 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
|
public synchronized Connection getConnection() throws SQLException
|
||||||
{
|
{
|
||||||
for (;;)
|
for (;;)
|
||||||
|
@ -387,14 +439,28 @@ public class DataPool implements Runnable
|
||||||
|
|
||||||
} // end getConnection
|
} // 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)
|
public synchronized void releaseConnection(Connection c)
|
||||||
{
|
{
|
||||||
busy_connections.removeElement(c); // move from one vector to another
|
if (c!=null)
|
||||||
avail_connections.addElement(c);
|
{ // move from one vector to another
|
||||||
notifyAll(); // wake up! Got a new connection for you!
|
busy_connections.removeElement(c);
|
||||||
|
avail_connections.addElement(c);
|
||||||
|
notifyAll(); // wake up! Got a new connection for you!
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
} // end releaseConnection
|
} // end releaseConnection
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Closes all connections managed by this data pool.
|
||||||
|
*
|
||||||
|
* @see #closeConnections(java.util.Vector)
|
||||||
|
*/
|
||||||
public synchronized void closeAllConnections()
|
public synchronized void closeAllConnections()
|
||||||
{
|
{
|
||||||
if (logger.isDebugEnabled())
|
if (logger.isDebugEnabled())
|
||||||
|
@ -406,6 +472,11 @@ public class DataPool implements Runnable
|
||||||
|
|
||||||
} // end closeAllConnections
|
} // 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()
|
public synchronized String toString()
|
||||||
{
|
{
|
||||||
StringBuffer info = new StringBuffer();
|
StringBuffer info = new StringBuffer();
|
||||||
|
|
|
@ -19,8 +19,16 @@ package com.silverwrist.venice.db;
|
||||||
|
|
||||||
import java.sql.*;
|
import java.sql.*;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import com.silverwrist.util.AnyCharMatcher;
|
||||||
import com.silverwrist.util.StringUtil;
|
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
|
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");
|
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
|
private static java.util.Date convertDateTimeString(String dstr) throws SQLException
|
||||||
{
|
{
|
||||||
if (dstr==null)
|
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)
|
public static String encodeString(String str)
|
||||||
{
|
{
|
||||||
return StringUtil.encodeStringSQL(str);
|
return StringUtil.encodeStringSQL(str);
|
||||||
|
|
||||||
} // end encodeString
|
} // 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)
|
public static String encodeStringArg(String str)
|
||||||
{
|
{
|
||||||
if (str==null)
|
if (str==null)
|
||||||
|
@ -81,41 +118,62 @@ public class SQLUtil
|
||||||
|
|
||||||
} // end encodeStringArg
|
} // 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)
|
public static String encodeStringWildcards(String str)
|
||||||
{
|
{
|
||||||
if ((str.indexOf('_')<0) && (str.indexOf('%')<0))
|
if (str==null)
|
||||||
return StringUtil.encodeStringSQL(str);
|
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();
|
StringBuffer buf = new StringBuffer();
|
||||||
for (int i=0; i<str.length(); i++)
|
while (ndx>=0)
|
||||||
{ // loop through the string encoding its characters
|
{ // append the matched "head" and then the encoded character
|
||||||
char c = str.charAt(i);
|
if (ndx>0)
|
||||||
switch (c)
|
buf.append(str.substring(0,ndx));
|
||||||
|
switch (str.charAt(ndx++))
|
||||||
{
|
{
|
||||||
case '\'':
|
case '%':
|
||||||
buf.append("\'\'");
|
buf.append("\\%");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '_':
|
case '_':
|
||||||
buf.append("\\_");
|
buf.append("\\_");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '%':
|
case '\'':
|
||||||
buf.append("\\%");
|
buf.append("\'\'");
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
buf.append(c);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
} // end switch
|
} // 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();
|
return buf.toString();
|
||||||
|
|
||||||
} // end encodeStringWildcards
|
} // 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)
|
public static String encodeDate(java.util.Date d)
|
||||||
{
|
{
|
||||||
// Break down the date as a UTC value.
|
// Break down the date as a UTC value.
|
||||||
|
@ -167,12 +225,28 @@ public class SQLUtil
|
||||||
|
|
||||||
} // end encodeDate
|
} // 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
|
public static java.util.Date getFullDateTime(ResultSet rs, String column) throws SQLException
|
||||||
{
|
{
|
||||||
return convertDateTimeString(rs.getString(column));
|
return convertDateTimeString(rs.getString(column));
|
||||||
|
|
||||||
} // end getFullDateTime
|
} // 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
|
public static java.util.Date getFullDateTime(ResultSet rs, int column) throws SQLException
|
||||||
{
|
{
|
||||||
return convertDateTimeString(rs.getString(column));
|
return convertDateTimeString(rs.getString(column));
|
||||||
|
@ -180,4 +254,3 @@ public class SQLUtil
|
||||||
} // end getFullDateTime
|
} // end getFullDateTime
|
||||||
|
|
||||||
} // end class SQLUtil
|
} // end class SQLUtil
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user