mirror of https://github.com/postgres/postgres
Thu Jan 18 12:24:00 GMT 2001 peter@retep.org.uk
- These methods in org.postgresql.jdbc2.ResultSet are now implemented:
getBigDecimal(int) ie: without a scale (why did this get missed?)
getBlob(int)
getCharacterStream(int)
getConcurrency()
getDate(int,Calendar)
getFetchDirection()
getFetchSize()
getTime(int,Calendar)
getTimestamp(int,Calendar)
getType()
NB: Where int represents the column name, the associated version
taking a String were already implemented by calling the int
version.
- These methods no longer throw the not implemented but the new noupdate
error. This is in preparation for the Updateable ResultSet support
which will overide these methods by extending the existing class to
implement that functionality, but needed to show something other than
notimplemented:
cancelRowUpdates()
deleteRow()
- Added new error message into errors.properties "postgresql.noupdate"
This is used by jdbc2.ResultSet when an update method is called and
the ResultSet is not updateable. A new method notUpdateable() has been
added to that class to throw this exception, keeping the binary size
down.
- Added new error message into errors.properties "postgresql.psqlnotimp"
This is used instead of unimplemented when it's a feature in the
backend that is preventing this method from being implemented.
- Removed getKeysetSize() as its not part of the ResultSet API
Thu Jan 18 09:46:00 GMT 2001 peter@retep.org.uk
- Applied modified patch from Richard Bullington-McGuire
<rbulling@microstate.com>. I had to modify it as some of the code
patched now exists in different classes, and some of it actually
patched obsolete code.
Wed Jan 17 10:19:00 GMT 2001 peter@retep.org.uk
- Updated Implementation to include both ANT & JBuilder
- Updated README to reflect the changes since 7.0
- Created jdbc.jpr file which allows JBuilder to be used to edit the
source. JBuilder _CAN_NOT_ be used to compile. You must use ANT for
that. It's only to allow JBuilders syntax checking to improve the
drivers source. Refer to Implementation for more details
REL7_1_STABLE
parent
89ac643964
commit
45b5d792af
@ -0,0 +1,94 @@ |
||||
<!-- |
||||
|
||||
build file to allow ant (http://jakarta.apache.org/ant/) to be used |
||||
to build the PostgreSQL JDBC Driver and any associated java utilities under |
||||
/contrib. |
||||
|
||||
This is placed here for three reasons: |
||||
|
||||
1: You only need to run ANT once to get everything. |
||||
2: To let people know that there are more java sources under /contrib. |
||||
3: In the next release (after 7.1) it's intended to have configure to |
||||
detect the presence of both the JDK and ANT, and if both are found |
||||
to build the jdbc driver and utils with the rest of postgresql. |
||||
|
||||
$Id: build.xml,v 1.1 2001/01/18 14:50:14 peter Exp $ |
||||
|
||||
--> |
||||
|
||||
<project name="postgresql" default="jar" basedir="."> |
||||
|
||||
<!-- |
||||
This is the normal entry point. It builds first the |
||||
jdbc driver, then the extra tools. |
||||
--> |
||||
<target name="jar"> |
||||
<antcall target="call"> |
||||
<param name="target" value="jar" /> |
||||
</antcall> |
||||
</target> |
||||
|
||||
<!-- |
||||
This entry point clears the source tree. Call this when you want |
||||
to build a clean install. |
||||
--> |
||||
<target name="clean"> |
||||
<antcall target="call"> |
||||
<param name="target" value="clean" /> |
||||
</antcall> |
||||
</target> |
||||
|
||||
<!-- |
||||
This entry point installs the .jar files into an install directory. |
||||
|
||||
To use this, call ant as follows: |
||||
|
||||
ant -Dinstall.directory=mydir install |
||||
|
||||
Where mydir is the _Absolute_ path of the directory to create. |
||||
|
||||
|
||||
If the directory mydir does not exist it will be created. |
||||
|
||||
If the directory is not absolute then the install will fail by |
||||
creating subdirectories in the build path. Be careful. |
||||
|
||||
|
||||
This is intended for "make install" to call it. |
||||
|
||||
e.g. |
||||
Windows: ant -Dc:\jars install |
||||
Unix: ant -Dinstall.directory=/usr/local/lib/jars install |
||||
Cygwin: ant -Dinstall.directory=$(cygpath -w /usr/local/lib/jars) install |
||||
|
||||
--> |
||||
<target name="install" if="install.directory"> |
||||
<mkdir dir="${install.directory}" /> |
||||
<antcall target="call"> |
||||
<param name="target" value="install" /> |
||||
</antcall> |
||||
</target> |
||||
|
||||
<!-- |
||||
This actually calls the other two build.xml files. |
||||
To use it, use the <antcall> tag, and pass the destination target |
||||
within a <param> tag using name="target". |
||||
|
||||
ie: |
||||
|
||||
<antcall target="call"> |
||||
<param name="target" value="mytarget" /> |
||||
</antcall> |
||||
|
||||
Here, the target mytarget will be called from all the sub build.xml |
||||
files. |
||||
|
||||
Note: The target must be present in _ALL_ build.xml files otherwise |
||||
the build will fail. |
||||
--> |
||||
<target name="call"> |
||||
<ant dir="src/interfaces/jdbc" target="${target}" /> |
||||
<ant dir="contrib/retep" target="${target}" /> |
||||
</target> |
||||
</project> |
||||
|
||||
@ -0,0 +1,60 @@ |
||||
<!-- |
||||
|
||||
build file to build the donated retep tools packages |
||||
|
||||
$Id: build.xml,v 1.1 2001/01/18 14:50:14 peter Exp $ |
||||
|
||||
--> |
||||
|
||||
<project name="retep" default="jar" basedir="."> |
||||
|
||||
<!-- set global properties for this build --> |
||||
<property name="src" value="." /> |
||||
<property name="dest" value="build" /> |
||||
<property name="package" value="uk/org/retep" /> |
||||
<property name="jars" value="jars" /> |
||||
|
||||
<!-- Some checks used to build dependent on the environment --> |
||||
<target name="checks"> |
||||
<available property="jdk1.2+" classname="java.lang.ThreadLocal" /> |
||||
<available property="jdk1.3+" classname="java.lang.StrictMath" /> |
||||
<available property="jdk1.2e+" classname="javax.sql.DataSource" /> |
||||
<available property="xml" classname="org.xml.sax.Parser" /> |
||||
</target> |
||||
|
||||
<!-- Prepares the build by creating a directory to place the class files --> |
||||
<target name="prepare"> |
||||
<mkdir dir="${dest}" /> |
||||
<mkdir dir="${jars}" /> |
||||
</target> |
||||
|
||||
<!-- This target removes any class files from the build directory --> |
||||
<target name="clean"> |
||||
<delete dir="${dest}" /> |
||||
<delete dir="${jars}" /> |
||||
</target> |
||||
|
||||
<!-- Builds the XML Tools --> |
||||
<target name="xml" depends="checks,prepare" if="xml"> |
||||
<javac srcdir="${src}" destdir="${dest}"> |
||||
<include name="${package}/xml/**" /> |
||||
</javac> |
||||
</target> |
||||
|
||||
<!-- Builds the various jar files --> |
||||
<target name="jar" depends="xml"> |
||||
<jar jarfile="${jars}/retepTools.jar" basedir="${dest}"> |
||||
<include name="${package}/xml/parser/**" if="xml" /> |
||||
</jar> |
||||
</target> |
||||
|
||||
<target name="install" depends="jar" if="install.directory"> |
||||
<copy todir="${install.directory}" overwrite="true" filtering="off"> |
||||
<fileset dir="${jars}"> |
||||
<include name="**/*.jar" /> |
||||
</fileset> |
||||
</copy> |
||||
</target> |
||||
|
||||
</project> |
||||
|
||||
@ -0,0 +1,44 @@ |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
||||
<!--JBuilder XML Project--> |
||||
<project> |
||||
<property category="idl" name="ProcessIDL" value="false" /> |
||||
<property category="runtime.0" name="RunnableType" value="com.borland.jbuilder.runtime.ApplicationRunner" /> |
||||
<property category="runtime.0" name="jsprunner.docbase" value="." /> |
||||
<property category="runtime.0" name="jsprunner.jspfile" value="E%|/docs/java/xml/example6" /> |
||||
<property category="sys" name="AuthorLabel" value="@author" /> |
||||
<property category="sys" name="BackupPath" value="bak" /> |
||||
<property category="sys" name="BeansInstantiate" value="false" /> |
||||
<property category="sys" name="BraceStyle" value="1" /> |
||||
<property category="sys" name="CheckStable" value="1" /> |
||||
<property category="sys" name="Company" value="" /> |
||||
<property category="sys" name="CompanyLabel" value="Company:" /> |
||||
<property category="sys" name="Copyright" value="Copyright (c) 2001" /> |
||||
<property category="sys" name="CopyrightLabel" value="Copyright:" /> |
||||
<property category="sys" name="DefaultPackage" value="org.postgresql.core" /> |
||||
<property category="sys" name="Description" value="" /> |
||||
<property category="sys" name="DescriptionLabel" value="Description:" /> |
||||
<property category="sys" name="DocPath" value="doc" /> |
||||
<property category="sys" name="EventMatch" value="false" /> |
||||
<property category="sys" name="EventStyle" value="1" /> |
||||
<property category="sys" name="ExcludeClassEnabled" value="0" /> |
||||
<property category="sys" name="InstanceVisibility" value="0" /> |
||||
<property category="sys" name="JDK" value="java 1.3.0-C" /> |
||||
<property category="sys" name="LastTag" value="0" /> |
||||
<property category="sys" name="Libraries" value="JAXP" /> |
||||
<property category="sys" name="MakeStable" value="0" /> |
||||
<property category="sys" name="OutPath" value="build" /> |
||||
<property category="sys" name="SourcePath" value="." /> |
||||
<property category="sys" name="Title" value="" /> |
||||
<property category="sys" name="TitleLabel" value="Title:" /> |
||||
<property category="sys" name="Version" value="1.0" /> |
||||
<property category="sys" name="VersionLabel" value="@version" /> |
||||
<property category="sys" name="WorkingDirectory" value="." /> |
||||
<node type="Package" name="uk.org.retep.xml.jdbc" /> |
||||
<node type="Package" name="uk.org.retep.xml.parser" /> |
||||
<file path="build.xml" /> |
||||
<file path="CHANGELOG" /> |
||||
<file path="Implementation" /> |
||||
<file path="README" /> |
||||
</project> |
||||
|
||||
@ -0,0 +1,202 @@ |
||||
package uk.org.retep.xml.parser; |
||||
|
||||
import java.io.CharArrayWriter; |
||||
import java.io.IOException; |
||||
import java.util.List; |
||||
import java.util.Iterator; |
||||
import java.util.Map; |
||||
import java.util.HashSet; |
||||
import java.util.ArrayList; |
||||
import java.util.HashMap; |
||||
import org.xml.sax.AttributeList; |
||||
import org.xml.sax.HandlerBase; |
||||
import org.xml.sax.InputSource; |
||||
import org.xml.sax.Parser; |
||||
import org.xml.sax.SAXException; |
||||
import javax.xml.parsers.ParserConfigurationException; |
||||
import javax.xml.parsers.SAXParser; |
||||
import javax.xml.parsers.SAXParserFactory; |
||||
|
||||
/** |
||||
* This class implements the base of the XML handler. You create an instance, |
||||
* register classes (who implement TagListener) that are interested in the tags |
||||
* and pass it to SAX. |
||||
* |
||||
* <p>Or you create an instance, register the TagListeners and use the getParser() |
||||
* method to create a Parser. Then start parsing by calling it's parse() method. |
||||
*/ |
||||
|
||||
public class TagHandler extends HandlerBase { |
||||
|
||||
/** |
||||
* The current active level |
||||
*/ |
||||
private int level; |
||||
|
||||
/** |
||||
* cache used to handle nesting of tags |
||||
*/ |
||||
private List contents; |
||||
|
||||
/** |
||||
* cache used to handle nesting of tags |
||||
*/ |
||||
private List tags; |
||||
|
||||
/** |
||||
* cache used to handle nesting of tags |
||||
*/ |
||||
private List args; |
||||
|
||||
// Current active content writer
|
||||
private CharArrayWriter content; |
||||
|
||||
// List of TagListener's who want to be fed data
|
||||
private HashSet tagListeners; |
||||
|
||||
/** |
||||
* default constructor |
||||
*/ |
||||
public TagHandler() { |
||||
level=0; |
||||
contents = new ArrayList(); |
||||
tags = new ArrayList(); |
||||
args = new ArrayList(); |
||||
tagListeners = new HashSet(); |
||||
} |
||||
|
||||
/** |
||||
* Called by SAX when a tag is begun. This simply creates a new level in the |
||||
* cache and stores the parameters and tag name in there. |
||||
*/ |
||||
public void startElement(String p0, AttributeList p1) throws SAXException { |
||||
|
||||
// Now move up and fetch a CharArrayWriter from the cache
|
||||
// creating if this is the first time at this level
|
||||
if(contents.size()<=level) { |
||||
contents.add(new CharArrayWriter()); |
||||
tags.add(p0); |
||||
args.add(new HashMap()); |
||||
} |
||||
|
||||
content=(CharArrayWriter) contents.get(level); |
||||
content.reset(); |
||||
|
||||
// Also cache the tag's text and argument list
|
||||
tags.set(level,p0); |
||||
|
||||
HashMap h = (HashMap) args.get(level); |
||||
h.clear(); |
||||
for(int i=p1.getLength()-1;i>-1;i--) { |
||||
h.put(p1.getName(i),p1.getValue(i)); |
||||
} |
||||
|
||||
// Now notify any TagListeners
|
||||
Iterator it = tagListeners.iterator(); |
||||
while(it.hasNext()) |
||||
( (TagListener) it.next() ).tagStart(level,p0,h); |
||||
|
||||
// Now move up a level
|
||||
level++; |
||||
} |
||||
|
||||
/** |
||||
* This is called by SAX at the end of a tag. This calls handleTag() and then |
||||
* raises the level, so that the previous parent tag may continue. |
||||
*/ |
||||
public void endElement(String p0) throws SAXException { |
||||
// move up a level retrieving that level's current content
|
||||
// Now this exception should never occur as the underlying parser should
|
||||
// actually trap it.
|
||||
if(level<1) |
||||
throw new SAXException("Already at top level?"); |
||||
level--; |
||||
|
||||
// Now notify any TagListeners
|
||||
Iterator it = tagListeners.iterator(); |
||||
while(it.hasNext()) |
||||
( (TagListener) it.next() ).tagContent(content); |
||||
|
||||
// allows large content to be released early
|
||||
content.reset(); |
||||
|
||||
// Now reset content to the previous level
|
||||
content=(CharArrayWriter) contents.get(level); |
||||
} |
||||
|
||||
/** |
||||
* Called by SAX so that content between the start and end tags are captured. |
||||
*/ |
||||
public void characters(char[] p0, int p1, int p2) throws SAXException { |
||||
content.write(p0,p1,p2); |
||||
} |
||||
|
||||
/** |
||||
* Adds a TagListener so that it is notified of tags as they are processed. |
||||
* @param handler TagListener to add |
||||
*/ |
||||
public void addTagListener(TagListener h) { |
||||
tagListeners.add(h); |
||||
} |
||||
|
||||
/** |
||||
* Removes the TagListener so it no longer receives notifications of tags |
||||
*/ |
||||
public void removeTagListener(TagListener h) { |
||||
tagListeners.remove(h); |
||||
} |
||||
|
||||
/** |
||||
* This method returns a org.xml.sax.Parser object that will parse the |
||||
* contents of a URI. |
||||
* |
||||
* <p>Normally you would call this method, then call the parse(uri) method of |
||||
* the returned object. |
||||
* @return org.xml.sax.Parser object |
||||
*/ |
||||
public Parser getParser() |
||||
throws SAXException |
||||
{ |
||||
try { |
||||
SAXParserFactory spf = SAXParserFactory.newInstance(); |
||||
|
||||
String validation = System.getProperty ("javax.xml.parsers.validation", "false"); |
||||
if (validation.equalsIgnoreCase("true")) |
||||
spf.setValidating (true); |
||||
|
||||
SAXParser sp = spf.newSAXParser(); |
||||
Parser parser = sp.getParser (); |
||||
|
||||
parser.setDocumentHandler(this); |
||||
|
||||
return(parser); |
||||
} catch(ParserConfigurationException pce) { |
||||
throw new SAXException(pce.toString()); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* This method will parse the specified URI. |
||||
* |
||||
* <p>Internally this is the same as getParser().parse(uri); |
||||
* @param uri The URI to parse |
||||
*/ |
||||
public void parse(String uri) |
||||
throws IOException, SAXException |
||||
{ |
||||
getParser().parse(uri); |
||||
} |
||||
|
||||
/** |
||||
* This method will parse the specified InputSource. |
||||
* |
||||
* <p>Internally this is the same as getParser().parse(is); |
||||
* @param is The InputSource to parse |
||||
*/ |
||||
public void parse(InputSource is) |
||||
throws IOException, SAXException |
||||
{ |
||||
getParser().parse(is); |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,30 @@ |
||||
package uk.org.retep.xml.parser; |
||||
|
||||
import java.util.HashMap; |
||||
import java.io.CharArrayWriter; |
||||
|
||||
/** |
||||
* This interface defines the methods a class needs to implement if it wants the |
||||
* xml parser to notify it of any xml tags. |
||||
*/ |
||||
|
||||
public interface TagListener { |
||||
/** |
||||
* This is called when a tag has just been started. |
||||
* <p><b>NB:</b> args is volatile, so if you use it beyond the lifetime of |
||||
* this call, then you must make a copy of the HashMap (and not use simply |
||||
* store this HashMap). |
||||
* @param level The number of tags above this |
||||
* @param tag The tag name |
||||
* @param args A HashMap of any arguments |
||||
*/ |
||||
public void tagStart(int level,String tag,HashMap args); |
||||
/** |
||||
* This method is called by ContHandler to process a tag once it has been |
||||
* fully processed. |
||||
* <p><b>NB:</b> content is volatile, so you must copy its contents if you use |
||||
* it beyond the lifetime of this call. |
||||
* @param content CharArrayWriter containing the content of the tag. |
||||
*/ |
||||
public void tagContent(CharArrayWriter content); |
||||
} |
||||
@ -0,0 +1,31 @@ |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
||||
<!--JBuilder XML Project--> |
||||
<project> |
||||
<property category="runtime.0" name="RunnableType" value="com.borland.jbuilder.runtime.ApplicationRunner" /> |
||||
<property category="runtime.0" name="jsprunner.docbase" value="." /> |
||||
<property category="runtime.0" name="jsprunner.jspfile" value="E%|/docs/java/xml/example6" /> |
||||
<property category="sys" name="BackupPath" value="bak" /> |
||||
<property category="sys" name="CheckStable" value="1" /> |
||||
<property category="sys" name="Company" value="" /> |
||||
<property category="sys" name="Copyright" value="Copyright (c) 2001" /> |
||||
<property category="sys" name="DefaultPackage" value="org.postgresql.core" /> |
||||
<property category="sys" name="Description" value="" /> |
||||
<property category="sys" name="DocPath" value="doc" /> |
||||
<property category="sys" name="ExcludeClassEnabled" value="0" /> |
||||
<property category="sys" name="JDK" value="java 1.3.0-C" /> |
||||
<property category="sys" name="LastTag" value="0" /> |
||||
<property category="sys" name="Libraries" value="" /> |
||||
<property category="sys" name="MakeStable" value="0" /> |
||||
<property category="sys" name="OutPath" value="build" /> |
||||
<property category="sys" name="SourcePath" value="." /> |
||||
<property category="sys" name="Title" value="" /> |
||||
<property category="sys" name="Version" value="1.0" /> |
||||
<property category="sys" name="WorkingDirectory" value="." /> |
||||
<node type="Package" name="org.postgresql.core" /> |
||||
<file path="build.xml" /> |
||||
<file path="CHANGELOG" /> |
||||
<file path="Implementation" /> |
||||
<file path="README" /> |
||||
</project> |
||||
|
||||
@ -0,0 +1,95 @@ |
||||
package org.postgresql.core; |
||||
|
||||
/** |
||||
* A simple and efficient class to pool one dimensional byte arrays |
||||
* of different sizes. |
||||
*/ |
||||
public class BytePoolDim1 { |
||||
|
||||
/** |
||||
* The maximum size of the array we manage. |
||||
*/ |
||||
int maxsize = 256; |
||||
/** |
||||
* The pools not currently in use |
||||
*/ |
||||
ObjectPool notusemap[] = new ObjectPool[maxsize+1]; |
||||
/** |
||||
* The pools currently in use |
||||
*/ |
||||
ObjectPool inusemap[] = new ObjectPool[maxsize+1]; |
||||
/** |
||||
* |
||||
*/ |
||||
byte binit[][] = new byte[maxsize][0]; |
||||
|
||||
/** |
||||
* Construct a new pool |
||||
*/ |
||||
public BytePoolDim1(){ |
||||
for(int i = 0; i <= maxsize; i++){ |
||||
binit[i] = new byte[i]; |
||||
inusemap[i] = new SimpleObjectPool(); |
||||
notusemap[i] = new SimpleObjectPool(); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Allocate a byte[] of a specified size and put it in the pool. If it's |
||||
* larger than maxsize then it is not pooled. |
||||
* @return the byte[] allocated |
||||
*/ |
||||
public byte[] allocByte(int size) { |
||||
// for now until the bug can be removed
|
||||
return new byte[size]; |
||||
/* |
||||
// Don't pool if >maxsize
|
||||
if(size > maxsize){ |
||||
return new byte[size]; |
||||
} |
||||
|
||||
ObjectPool not_usel = notusemap[size]; |
||||
ObjectPool in_usel = inusemap[size]; |
||||
byte b[] = null; |
||||
|
||||
// Fetch from the unused pool if available otherwise allocate a new
|
||||
// now array
|
||||
if(!not_usel.isEmpty()) { |
||||
Object o = not_usel.remove(); |
||||
b = (byte[]) o; |
||||
} else |
||||
b = new byte[size]; |
||||
in_usel.add(b); |
||||
|
||||
return b; |
||||
*/ |
||||
} |
||||
|
||||
/** |
||||
* Release an array |
||||
* @param b byte[] to release |
||||
*/ |
||||
public void release(byte[] b) { |
||||
// If it's larger than maxsize then we don't touch it
|
||||
if(b.length>maxsize) |
||||
return; |
||||
|
||||
ObjectPool not_usel = notusemap[b.length]; |
||||
ObjectPool in_usel = inusemap[b.length]; |
||||
|
||||
in_usel.remove(b); |
||||
not_usel.add(b); |
||||
} |
||||
|
||||
/** |
||||
* Deallocate all |
||||
* @deprecated Real bad things happen if this is called! |
||||
*/ |
||||
public void deallocate() { |
||||
//for(int i = 0; i <= maxsize; i++){
|
||||
// notusemap[i].addAll(inusemap[i]);
|
||||
// inusemap[i].clear();
|
||||
//}
|
||||
} |
||||
} |
||||
|
||||
@ -0,0 +1,62 @@ |
||||
package org.postgresql.core; |
||||
|
||||
public class BytePoolDim2 { |
||||
int maxsize = 32; |
||||
ObjectPool notusemap[] = new ObjectPool[maxsize+1]; |
||||
ObjectPool inusemap[] = new ObjectPool[maxsize+1]; |
||||
|
||||
public BytePoolDim2(){ |
||||
for(int i = 0; i <= maxsize; i++){ |
||||
inusemap[i] = new SimpleObjectPool(); |
||||
notusemap[i] = new SimpleObjectPool(); |
||||
} |
||||
} |
||||
|
||||
public byte[][] allocByte(int size){ |
||||
// For now until the bug can be removed
|
||||
return new byte[size][0]; |
||||
/* |
||||
if(size > maxsize){ |
||||
return new byte[size][0]; |
||||
} |
||||
ObjectPool not_usel = notusemap[size]; |
||||
ObjectPool in_usel = inusemap[size]; |
||||
|
||||
byte b[][] = null; |
||||
|
||||
if(!not_usel.isEmpty()) { |
||||
Object o = not_usel.remove(); |
||||
b = (byte[][]) o; |
||||
} else |
||||
b = new byte[size][0]; |
||||
in_usel.add(b); |
||||
return b; |
||||
*/ |
||||
} |
||||
|
||||
public void release(byte[][] b){ |
||||
if(b.length > maxsize){ |
||||
return; |
||||
} |
||||
ObjectPool not_usel = notusemap[b.length]; |
||||
ObjectPool in_usel = inusemap[b.length]; |
||||
|
||||
in_usel.remove(b); |
||||
not_usel.add(b); |
||||
} |
||||
|
||||
/** |
||||
* Deallocate the object cache. |
||||
* PM 17/01/01: Commented out this code as it blows away any hope of |
||||
* multiple queries on the same connection. I'll redesign the allocation |
||||
* code to use some form of Statement context, so the buffers are per |
||||
* Statement and not per Connection/PG_Stream as it is now. |
||||
*/ |
||||
public void deallocate(){ |
||||
//for(int i = 0; i <= maxsize; i++){
|
||||
// notusemap[i].addAll(inusemap[i]);
|
||||
// inusemap[i].clear();
|
||||
//}
|
||||
} |
||||
} |
||||
|
||||
@ -0,0 +1,18 @@ |
||||
package org.postgresql.core; |
||||
|
||||
/** |
||||
* This interface defines the methods to access the memory pool classes. |
||||
*/ |
||||
public interface MemoryPool { |
||||
/** |
||||
* Allocate an array from the pool |
||||
* @return byte[] allocated |
||||
*/ |
||||
public byte[] allocByte(int size); |
||||
|
||||
/** |
||||
* Frees an object back to the pool |
||||
* @param o Object to release |
||||
*/ |
||||
public void release(Object o); |
||||
} |
||||
@ -0,0 +1,48 @@ |
||||
package org.postgresql.core; |
||||
|
||||
/** |
||||
* This interface defines methods needed to implement a simple object pool. |
||||
* There are two known classes that implement this, one for jdk1.1 and the |
||||
* other for jdk1.2+ |
||||
*/ |
||||
|
||||
public interface ObjectPool { |
||||
/** |
||||
* Adds an object to the pool |
||||
* @param o Object to add |
||||
*/ |
||||
public void add(Object o); |
||||
|
||||
/** |
||||
* Removes an object from the pool |
||||
* @param o Object to remove |
||||
*/ |
||||
public void remove(Object o); |
||||
|
||||
/** |
||||
* Removes the top object from the pool |
||||
* @return Object from the top. |
||||
*/ |
||||
public Object remove(); |
||||
|
||||
/** |
||||
* @return true if the pool is empty |
||||
*/ |
||||
public boolean isEmpty(); |
||||
|
||||
/** |
||||
* @return the number of objects in the pool |
||||
*/ |
||||
public int size(); |
||||
|
||||
/** |
||||
* Adds all objects in one pool to this one |
||||
* @param pool The pool to take the objects from |
||||
*/ |
||||
public void addAll(ObjectPool pool); |
||||
|
||||
/** |
||||
* Clears the pool of all objects |
||||
*/ |
||||
public void clear(); |
||||
} |
||||
@ -0,0 +1,97 @@ |
||||
package org.postgresql.core; |
||||
|
||||
/** |
||||
* A simple and fast object pool implementation that can pool objects |
||||
* of any type. This implementation is not thread safe, it is up to the users |
||||
* of this class to assure thread safety. |
||||
*/ |
||||
|
||||
public class SimpleObjectPool implements ObjectPool |
||||
{ |
||||
// This was originally in PG_Stream but moved out to fix the major problem
|
||||
// where more than one query (usually all the time) overwrote the results
|
||||
// of another query.
|
||||
int cursize = 0; |
||||
int maxsize = 16; |
||||
Object arr[] = new Object[maxsize]; |
||||
|
||||
/** |
||||
* Adds an object to the pool |
||||
* @param o Object to add |
||||
*/ |
||||
public void add(Object o) |
||||
{ |
||||
if(cursize >= maxsize){ |
||||
Object newarr[] = new Object[maxsize*2]; |
||||
System.arraycopy(arr, 0, newarr, 0, maxsize); |
||||
maxsize = maxsize * 2; |
||||
arr = newarr; |
||||
} |
||||
arr[cursize++] = o; |
||||
} |
||||
|
||||
/** |
||||
* Removes the top object from the pool |
||||
* @return Object from the top. |
||||
*/ |
||||
public Object remove(){ |
||||
return arr[--cursize]; |
||||
} |
||||
|
||||
/** |
||||
* Removes the given object from the pool |
||||
* @param o Object to remove |
||||
*/ |
||||
public void remove(Object o) { |
||||
int p=0; |
||||
while(p<cursize && !arr[p].equals(o)) |
||||
p++; |
||||
if(arr[p].equals(o)) { |
||||
// This should be ok as there should be no overlap conflict
|
||||
System.arraycopy(arr,p+1,arr,p,cursize-p); |
||||
cursize--; |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* @return true if the pool is empty |
||||
*/ |
||||
public boolean isEmpty(){ |
||||
return cursize == 0; |
||||
} |
||||
|
||||
/** |
||||
* @return the number of objects in the pool |
||||
*/ |
||||
public int size(){ |
||||
return cursize; |
||||
} |
||||
|
||||
/** |
||||
* Adds all objects in one pool to this one |
||||
* @param pool The pool to take the objects from |
||||
*/ |
||||
public void addAll(ObjectPool p){ |
||||
SimpleObjectPool pool = (SimpleObjectPool)p; |
||||
|
||||
int srcsize = pool.size(); |
||||
if(srcsize == 0) |
||||
return; |
||||
int totalsize = srcsize + cursize; |
||||
if(totalsize > maxsize){ |
||||
Object newarr[] = new Object[totalsize*2]; |
||||
System.arraycopy(arr, 0, newarr, 0, cursize); |
||||
maxsize = maxsize = totalsize * 2; |
||||
arr = newarr; |
||||
} |
||||
System.arraycopy(pool.arr, 0, arr, cursize, srcsize); |
||||
cursize = totalsize; |
||||
} |
||||
|
||||
/** |
||||
* Clears the pool of all objects |
||||
*/ |
||||
public void clear(){ |
||||
cursize = 0; |
||||
} |
||||
} |
||||
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue