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
|
/*-------------------------------------------------------------------------
*
* Copyright (c) 2003-2008, PostgreSQL Global Development Group
* Copyright (c) 2004, Open Cloud Limited.
*
* IDENTIFICATION
* $PostgreSQL: pgjdbc/org/postgresql/core/v2/V2Query.java,v 1.8 2008/01/08 06:56:27 jurka Exp $
*
*-------------------------------------------------------------------------
*/
package org.postgresql.core.v2;
import java.util.Vector;
import org.postgresql.core.*;
/**
* Query implementation for all queries via the V2 protocol.
*/
class V2Query implements Query {
V2Query(String query, boolean withParameters, ProtocolConnection pconn) {
useEStringSyntax = pconn.getServerVersion() != null
&& pconn.getServerVersion().compareTo("8.1") > 0;
boolean stdStrings = pconn.getStandardConformingStrings();
if (!withParameters)
{
fragments = new String[] { query };
return ;
}
// Parse query and find parameter placeholders.
Vector v = new Vector();
int lastParmEnd = 0;
char []aChars = query.toCharArray();
for (int i = 0; i < aChars.length; ++i)
{
switch (aChars[i])
{
case '\'': // single-quotes
i = Parser.parseSingleQuotes(aChars, i, stdStrings);
break;
case '"': // double-quotes
i = Parser.parseDoubleQuotes(aChars, i);
break;
case '-': // possibly -- style comment
i = Parser.parseLineComment(aChars, i);
break;
case '/': // possibly /* */ style comment
i = Parser.parseBlockComment(aChars, i);
break;
case '$': // possibly dollar quote start
i = Parser.parseDollarQuotes(aChars, i);
break;
case '?':
v.addElement(query.substring (lastParmEnd, i));
lastParmEnd = i + 1;
break;
default:
break;
}
}
v.addElement(query.substring (lastParmEnd, query.length()));
fragments = new String[v.size()];
for (int i = 0 ; i < fragments.length; ++i)
fragments[i] = (String)v.elementAt(i);
}
public ParameterList createParameterList() {
if (fragments.length == 1)
return NO_PARAMETERS;
return new SimpleParameterList(fragments.length - 1, useEStringSyntax);
}
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 void close() {
}
String[] getFragments() {
return fragments;
}
private static final ParameterList NO_PARAMETERS = new SimpleParameterList(0, false);
private final String[] fragments; // Query fragments, length == # of parameters + 1
private final boolean useEStringSyntax; // whether escaped string syntax should be used
}
|