1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
|
/*-------------------------------------------------------------------------
*
* Copyright (c) 2004-2005, PostgreSQL Global Development Group
* Copyright (c) 2004, Open Cloud Limited.
*
* IDENTIFICATION
* $PostgreSQL: pgjdbc/org/postgresql/core/v3/SimpleQuery.java,v 1.9 2005/07/04 18:50:29 davec Exp $
*
*-------------------------------------------------------------------------
*/
package org.postgresql.core.v3;
import org.postgresql.core.*;
import java.lang.ref.PhantomReference;
/**
* V3 Query implementation for a single-statement query.
* This also holds the state of any associated server-side
* named statement. We use a PhantomReference managed by
* the QueryExecutor to handle statement cleanup.
*
* @author Oliver Jowett (oliver@opencloud.com)
*/
class SimpleQuery implements V3Query {
SimpleQuery(String[] fragments) {
this.fragments = fragments;
}
public ParameterList createParameterList() {
if (fragments.length == 1)
return NO_PARAMETERS;
return new SimpleParameterList(fragments.length - 1);
}
public String toString(ParameterList parameters) {
StringBuffer sbuf = new StringBuffer(fragments[0]);
for (int i = 1; i < fragments.length; ++i)
{
if (parameters == null)
sbuf.append('?');
else
sbuf.append(parameters.toString(i));
sbuf.append(fragments[i]);
}
return sbuf.toString();
}
public String toString() {
return toString(null);
}
public void close() {
unprepare();
}
//
// V3Query
//
public SimpleQuery[] getSubqueries() {
return null;
}
//
// Implementation guts
//
String[] getFragments() {
return fragments;
}
void setStatementName(String statementName) {
this.statementName = statementName;
this.encodedStatementName = Utils.encodeUTF8(statementName);
}
void setStatementTypes(int[] paramTypes) {
this.preparedTypes = paramTypes;
}
String getStatementName() {
return statementName;
}
boolean isPreparedFor(int[] paramTypes) {
if (statementName == null)
return false; // Not prepared.
// Check for compatible types.
for (int i = 0; i < paramTypes.length; ++i)
if (paramTypes[i] != preparedTypes[i])
return false;
return true;
}
byte[] getEncodedStatementName() {
return encodedStatementName;
}
void setCleanupRef(PhantomReference cleanupRef) {
this.cleanupRef = cleanupRef;
}
void unprepare() {
if (cleanupRef != null)
{
cleanupRef.clear();
cleanupRef.enqueue();
cleanupRef = null;
}
statementName = null;
encodedStatementName = null;
}
private final String[] fragments;
private String statementName;
private byte[] encodedStatementName;
private PhantomReference cleanupRef;
private int[] preparedTypes;
final static SimpleParameterList NO_PARAMETERS = new SimpleParameterList(0);
}
|