in xalan/src/main/java/org/apache/xalan/lib/sql/SQLQueryParser.java [300:439]
protected void inlineParser()
{
QueryParameter curParm = null;
int state = 0;
StringBuffer tok = new StringBuffer();
boolean firstword = true;
if (m_Parameters == null) m_Parameters = new Vector();
if (m_ParsedQuery == null) m_ParsedQuery = new StringBuffer();
for ( int idx = 0 ; idx < m_OrigQuery.length() ; idx++ )
{
char ch = m_OrigQuery.charAt(idx);
switch ( state )
{
case 0: // Normal
if ( ch == '\'' ) state = 1;
else if ( ch == '?' ) state = 4;
else if ( firstword && (Character.isLetterOrDigit(ch) || ch == '#') )
{
tok.append(ch);
state = 3;
}
m_ParsedQuery.append(ch);
break;
case 1: // In String
if ( ch == '\'' ) state = 0;
else if ( ch == '\\' ) state = 2;
m_ParsedQuery.append(ch);
break;
case 2: // In escape
state = 1;
m_ParsedQuery.append(ch);
break;
case 3: // First word
if ( Character.isLetterOrDigit(ch) || ch == '#' || ch == '_' ) tok.append(ch);
else
{
if ( tok.toString().equalsIgnoreCase("call") )
{
m_IsCallable = true;
if ( curParm != null )
{
// returnParm = true;
curParm.setIsOutput(true);
// hasOutput = true;
}
}
firstword = false;
tok = new StringBuffer();
if ( ch == '\'' ) state = 1;
else if ( ch == '?' ) state = 4;
else state = 0;
}
m_ParsedQuery.append(ch);
break;
case 4: // Get variable definition
if ( ch == '[' ) state = 5;
break;
case 5: // Read variable type.
if ( !Character.isWhitespace(ch) && ch != '=' )
{
tok.append(Character.toUpperCase(ch));
}
else if ( tok.length() > 0 )
{
// OK we have at least one parameter.
m_HasParameters = true;
curParm = new QueryParameter();
curParm.setTypeName(tok.toString());
// curParm.type = map_type(curParm.typeName);
m_Parameters.addElement(curParm);
tok = new StringBuffer();
if ( ch == '=' ) state = 7;
else state = 6;
}
break;
case 6: // Look for '='
if ( ch == '=' ) state = 7;
break;
case 7: // Read variable name.
if ( !Character.isWhitespace(ch) && ch != ']' ) tok.append(ch);
else if ( tok.length() > 0 )
{
curParm.setName(tok.toString());
tok = new StringBuffer();
if ( ch == ']' )
{
//param_output.addElement(new Boolean(false));
state = 0;
}
else state = 8;
}
break;
case 8: // Look for "OUTput.
if ( !Character.isWhitespace(ch) && ch != ']' )
{
tok.append(ch);
}
else if ( tok.length() > 0 )
{
tok.setLength(3);
if ( tok.toString().equalsIgnoreCase("OUT") )
{
curParm.setIsOutput(true);
m_hasOutput = true;
}
tok = new StringBuffer();
if ( ch == ']' )
{
state = 0;
}
}
break;
}
}
// Prepare statement or call.
if ( m_IsCallable )
{
m_ParsedQuery.insert(0, '{');
m_ParsedQuery.append('}');
}
}