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 130 131 132 133
|
/*-------------------------------------------------------------------------
*
* 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.11 2006/08/06 18:02:45 jurka 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] != 0 && paramTypes[i] != preparedTypes[i])
return false;
return true;
}
byte[] getEncodedStatementName() {
return encodedStatementName;
}
void setCleanupRef(PhantomReference cleanupRef) {
if (this.cleanupRef != null) {
this.cleanupRef.clear();
this.cleanupRef.enqueue();
}
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);
}
|