Package org.fbsql.servlet
Class SqlParseUtils
- java.lang.Object
-
- org.fbsql.servlet.SqlParseUtils
-
public class SqlParseUtils extends java.lang.Object
Provides utility methods for parsing SQL scripts and statements. Various utility methods might used to parse SQL scripts or particular SQL statements. Supports syntax of all existing (February 2020) SQL standards.
-
-
Field Summary
Fields Modifier and Type Field Description private static java.lang.String
INIT_SQL_FILE_EXT
private static java.lang.String
MULTI_LINE_COMMENT_START
Multiline line comment start: «/*»private static java.lang.String
MULTI_LINE_COMMENT_STOP
Multiline comment stop: «*/»private static char
Q1
Single quote: «'»private static char
Q2
Double quote: «"»private static java.lang.String
SINGLE_LINE_COMMENT_START
Single line comment start: «--»private static java.lang.String
SINGLE_LINE_COMMENT_STOP
Single line comment stop: (Caret return)static java.lang.String
SPECIAL_STATEMENT_CALL
static java.lang.String
SPECIAL_STATEMENT_CONNECT_TO
Special FBSQL statements that can be used only in «init.sql» scriptstatic java.lang.String
SPECIAL_STATEMENT_DECLARE_PROCEDURE
static java.lang.String
SPECIAL_STATEMENT_DECLARE_STATEMENT
static java.lang.String
SPECIAL_STATEMENT_INCLUDE
static java.lang.String
SPECIAL_STATEMENT_SCHEDULE
static java.lang.String
SPECIAL_STATEMENT_SWITCH_TO
private static java.lang.String
STATEMENT_SEPARATOR
SQL statement separator: «;»
-
Constructor Summary
Constructors Constructor Description SqlParseUtils()
-
Method Summary
All Methods Static Methods Concrete Methods Modifier and Type Method Description static java.lang.String
canonizeSql(java.lang.String sql)
Canonize SQL statement for compare (startsWith) E.g.private static java.lang.String
extractClause(javax.servlet.ServletConfig servletConfig, java.lang.String sql, java.lang.String clause)
Extract particular clause value from SQL statement(package private) static boolean
extractClauseAsBoolean(javax.servlet.ServletConfig servletConfig, java.lang.String sql, java.lang.String clause)
Extract particular clause value from SQL statement(package private) static java.lang.Integer
extractClauseAsInt(javax.servlet.ServletConfig servletConfig, java.lang.String sql, java.lang.String clause)
Extract particular clause value from SQL statement(package private) static java.util.List<java.lang.Object>
extractClauseAsList(javax.servlet.ServletConfig servletConfig, java.lang.String sql, java.lang.String clause)
Extract particular clause value from SQL statement(package private) static java.util.List<java.lang.String>
extractClauseAsListOfStrings(javax.servlet.ServletConfig servletConfig, java.lang.String sql, java.lang.String clause)
Extract particular clause value from SQL statementstatic java.lang.String
extractClauseAsString(javax.servlet.ServletConfig servletConfig, java.lang.String sql, java.lang.String clause)
Extract particular clause value from SQL statementstatic int
indexOf(java.lang.String sql, java.lang.String token)
Returns the index within SQL string of the first occurrence of the specified token.static ParseStmtConnectTo.StmtConnectTo
parseConnectStatement(javax.servlet.ServletConfig servletConfig, java.lang.String sql)
Parse CONNECT statementstatic void
parseDeclareProcedureStatement(javax.servlet.ServletConfig servletConfig, java.lang.String sql, java.util.Map<java.lang.String,NonNativeProcedure> proceduresMap)
Parse DECLARE PROCEDURE statementstatic ParseStmtDeclareStatement.StmtDeclareStatement
parseExposeStatement(javax.servlet.ServletConfig servletConfig, java.lang.String sql)
Parse EXPOSE statementstatic java.util.Map<java.lang.String,java.util.List<java.lang.Integer>>
parseNamedPreparedStatement(java.lang.String sql, java.lang.StringBuilder resultSQL)
Parse named prepared statement and return parameter name to index map and replace host variables with '?' character to provide standard prepared statement formstatic void
parseScheduleStatement(javax.servlet.ServletConfig servletConfig, java.lang.String sql, java.util.Map<java.lang.String,java.util.List<java.lang.String>> schedulersMap)
Parse SCHEDULE statementprivate static void
processIncludes(java.nio.file.Path path, java.util.List<java.lang.String> list)
Recursive method to process "INCLUDE SCRIPT FILE" statementprivate static void
processInitSqlFile(java.nio.file.Path path, java.util.Map<java.lang.String,java.util.List<java.lang.String>> sqlStatementsMap, java.util.Map<java.lang.String,java.lang.String> parentDirectoryMap)
Read 'init.sql' file, process 'includes', iterate record by record and divide it by instance name to mapstatic void
processInitSqlFiles(java.io.File file, java.util.Map<java.lang.String,java.util.List<java.lang.String>> sqlStatementsMap, java.util.Map<java.lang.String,java.lang.String> parentDirectoryMap)
Iterate directory recursive, find 'init.sql' files, and process them.static java.lang.String
processStatement(java.lang.String sql)
Process SQL statementprivate static void
readSqlScriptToList(java.lang.String sqlScript, java.util.List<java.lang.String> list)
Parse SQL script by splitting it on SQL statements Standard semicolon character «;» is used as statement separator.private static void
separateSqlFile(java.nio.file.Path path, java.util.List<java.lang.String> list, java.util.Map<java.lang.String,java.util.List<java.lang.String>> map, java.util.Map<java.lang.String,java.lang.String> parentDirectoryMap)
Read 'init.sql' file record by record and divide it by instance name to mapprivate static java.lang.String
stripBlockComments(java.lang.String sql)
Remove the comments from SQL statement, if exists.(package private) static java.lang.String
stripComments(java.lang.String sql)
Remove the comments from SQL statement, if exists.private static java.lang.String
stripLineComments(java.lang.String sql)
Remove the comments from SQL statement, if exists.
-
-
-
Field Detail
-
SPECIAL_STATEMENT_CONNECT_TO
public static final java.lang.String SPECIAL_STATEMENT_CONNECT_TO
Special FBSQL statements that can be used only in «init.sql» script
-
SPECIAL_STATEMENT_SWITCH_TO
public static final java.lang.String SPECIAL_STATEMENT_SWITCH_TO
-
SPECIAL_STATEMENT_DECLARE_PROCEDURE
public static final java.lang.String SPECIAL_STATEMENT_DECLARE_PROCEDURE
-
SPECIAL_STATEMENT_SCHEDULE
public static final java.lang.String SPECIAL_STATEMENT_SCHEDULE
-
SPECIAL_STATEMENT_DECLARE_STATEMENT
public static final java.lang.String SPECIAL_STATEMENT_DECLARE_STATEMENT
-
SPECIAL_STATEMENT_INCLUDE
public static final java.lang.String SPECIAL_STATEMENT_INCLUDE
-
SPECIAL_STATEMENT_CALL
public static final java.lang.String SPECIAL_STATEMENT_CALL
-
INIT_SQL_FILE_EXT
private static final java.lang.String INIT_SQL_FILE_EXT
- See Also:
- Constant Field Values
-
STATEMENT_SEPARATOR
private static final java.lang.String STATEMENT_SEPARATOR
SQL statement separator: «;»- See Also:
- Constant Field Values
-
MULTI_LINE_COMMENT_START
private static final java.lang.String MULTI_LINE_COMMENT_START
Multiline line comment start: «/*»- See Also:
- Constant Field Values
-
MULTI_LINE_COMMENT_STOP
private static final java.lang.String MULTI_LINE_COMMENT_STOP
Multiline comment stop: «*/»- See Also:
- Constant Field Values
-
SINGLE_LINE_COMMENT_START
private static final java.lang.String SINGLE_LINE_COMMENT_START
Single line comment start: «--»- See Also:
- Constant Field Values
-
SINGLE_LINE_COMMENT_STOP
private static final java.lang.String SINGLE_LINE_COMMENT_STOP
Single line comment stop: (Caret return)- See Also:
- Constant Field Values
-
Q1
private static final char Q1
Single quote: «'»- See Also:
- Constant Field Values
-
Q2
private static final char Q2
Double quote: «"»- See Also:
- Constant Field Values
-
-
Constructor Detail
-
SqlParseUtils
public SqlParseUtils()
-
-
Method Detail
-
indexOf
public static int indexOf(java.lang.String sql, java.lang.String token)
Returns the index within SQL string of the first occurrence of the specified token. If a token with valuetoken
occurs in the character sequence represented by SQL stringsql
, then the index of the first such occurrence is returned. This index is the smallest value i such that:
is true.sql.charAt(i) == token[0]
- Parameters:
sql
- a SQL string.token
- to search- Returns:
- the index of the first occurrence of the token in the
SQL string, or
-1
if the token does not occur.
-
parseConnectStatement
public static ParseStmtConnectTo.StmtConnectTo parseConnectStatement(javax.servlet.ServletConfig servletConfig, java.lang.String sql)
Parse CONNECT statement- Parameters:
sql
- - CONNECT statementinfo
- - ConnectionInfo Transfer object
-
parseDeclareProcedureStatement
public static void parseDeclareProcedureStatement(javax.servlet.ServletConfig servletConfig, java.lang.String sql, java.util.Map<java.lang.String,NonNativeProcedure> proceduresMap)
Parse DECLARE PROCEDURE statement- Parameters:
sql
- - DECLARE PROCEDURE statementproceduresMap
- - procedures Map for specific stored procedure name
-
parseExposeStatement
public static ParseStmtDeclareStatement.StmtDeclareStatement parseExposeStatement(javax.servlet.ServletConfig servletConfig, java.lang.String sql)
Parse EXPOSE statement- Parameters:
sql
- - EXPOSE statement- Throws:
java.security.NoSuchAlgorithmException
-
parseScheduleStatement
public static void parseScheduleStatement(javax.servlet.ServletConfig servletConfig, java.lang.String sql, java.util.Map<java.lang.String,java.util.List<java.lang.String>> schedulersMap)
Parse SCHEDULE statement- Parameters:
sql
- - SCHEDULE statementschedulersMap
- - Schedulers Map for specific SQL stored procedures
-
extractClauseAsList
static java.util.List<java.lang.Object> extractClauseAsList(javax.servlet.ServletConfig servletConfig, java.lang.String sql, java.lang.String clause)
Extract particular clause value from SQL statement- Parameters:
sql
- - source SQL statement (trimmed)clause
- - clause to search (trimmed)- Returns:
- - clause value
-
extractClauseAsListOfStrings
static java.util.List<java.lang.String> extractClauseAsListOfStrings(javax.servlet.ServletConfig servletConfig, java.lang.String sql, java.lang.String clause)
Extract particular clause value from SQL statement- Parameters:
sql
- - source SQL statement (trimmed)clause
- - clause to search (trimmed)- Returns:
- - clause value
-
extractClauseAsString
public static java.lang.String extractClauseAsString(javax.servlet.ServletConfig servletConfig, java.lang.String sql, java.lang.String clause)
Extract particular clause value from SQL statement- Parameters:
sql
- - source SQL statement (trimmed)clause
- - clause to search (trimmed)- Returns:
- - clause value
-
extractClauseAsInt
static java.lang.Integer extractClauseAsInt(javax.servlet.ServletConfig servletConfig, java.lang.String sql, java.lang.String clause)
Extract particular clause value from SQL statement- Parameters:
sql
- - source SQL statement (trimmed)clause
- - clause to search (trimmed)- Returns:
- - clause value
-
extractClauseAsBoolean
static boolean extractClauseAsBoolean(javax.servlet.ServletConfig servletConfig, java.lang.String sql, java.lang.String clause)
Extract particular clause value from SQL statement- Parameters:
sql
- - source SQL statement (trimmed)clause
- - clause to search (trimmed)- Returns:
- - clause value
-
extractClause
private static java.lang.String extractClause(javax.servlet.ServletConfig servletConfig, java.lang.String sql, java.lang.String clause)
Extract particular clause value from SQL statement- Parameters:
sql
- - source SQL statement (trimmed)clause
- - clause to search (trimmed)- Returns:
- - clause value
-
stripComments
static java.lang.String stripComments(java.lang.String sql)
Remove the comments from SQL statement, if exists. Multiline line (block) comments (start: «/*», stop: «*/») Single line comments (start: «--», stop: «\n»)- Parameters:
sql
- a SQL string with comments.- Returns:
- a SQL string without comments
-
stripLineComments
private static java.lang.String stripLineComments(java.lang.String sql)
Remove the comments from SQL statement, if exists. Multiline line (block) comments (start: «/*», stop: «*/») Single line comments (start: «--», stop: «\n»)- Parameters:
sql
- a SQL string with comments.- Returns:
- a SQL string without comments
-
stripBlockComments
private static java.lang.String stripBlockComments(java.lang.String sql)
Remove the comments from SQL statement, if exists. Multiline line (block) comments (start: «/*», stop: «*/») Single line comments (start: «--», stop: «\n»)- Parameters:
sql
- a SQL string with comments.- Returns:
- a SQL string without comments
-
processStatement
public static java.lang.String processStatement(java.lang.String sql)
Process SQL statement- Parameters:
sql
- - SQL statement- Returns:
- - processed SQL statement
-
parseNamedPreparedStatement
public static java.util.Map<java.lang.String,java.util.List<java.lang.Integer>> parseNamedPreparedStatement(java.lang.String sql, java.lang.StringBuilder resultSQL)
Parse named prepared statement and return parameter name to index map and replace host variables with '?' character to provide standard prepared statement form- Parameters:
sql
- - named prepared statementresultSQL
- - standard prepared statement- Returns:
- map parameter name to index (indexes starts from 1)
-
readSqlScriptToList
private static void readSqlScriptToList(java.lang.String sqlScript, java.util.List<java.lang.String> list) throws java.io.IOException
Parse SQL script by splitting it on SQL statements Standard semicolon character «;» is used as statement separator. This method also: - compress row(s) of each SQL statement by removing ambiguous trailing white spaces characters. - remove trailing statement separator «;»- Parameters:
sqlScript
- - SQL script to parselist
- - list of all presented in script SQL statements (output parameter)- Throws:
java.io.IOException
-
processIncludes
private static void processIncludes(java.nio.file.Path path, java.util.List<java.lang.String> list) throws java.io.IOException
Recursive method to process "INCLUDE SCRIPT FILE" statement- Parameters:
path
- - path to SQL script to parselist
- - list of all presented in script SQL statements with injected includes (output parameter)- Throws:
java.io.IOException
-
separateSqlFile
private static void separateSqlFile(java.nio.file.Path path, java.util.List<java.lang.String> list, java.util.Map<java.lang.String,java.util.List<java.lang.String>> map, java.util.Map<java.lang.String,java.lang.String> parentDirectoryMap) throws java.io.IOException
Read 'init.sql' file record by record and divide it by instance name to map- Parameters:
path
-map
-- Throws:
java.io.IOException
-
processInitSqlFiles
public static void processInitSqlFiles(java.io.File file, java.util.Map<java.lang.String,java.util.List<java.lang.String>> sqlStatementsMap, java.util.Map<java.lang.String,java.lang.String> parentDirectoryMap) throws java.io.IOException
Iterate directory recursive, find 'init.sql' files, and process them.- Parameters:
path
-sqlStatementsMap
-- Throws:
java.io.IOException
-
processInitSqlFile
private static void processInitSqlFile(java.nio.file.Path path, java.util.Map<java.lang.String,java.util.List<java.lang.String>> sqlStatementsMap, java.util.Map<java.lang.String,java.lang.String> parentDirectoryMap) throws java.io.IOException
Read 'init.sql' file, process 'includes', iterate record by record and divide it by instance name to map- Parameters:
path
-sqlStatementsMap
-- Throws:
java.io.IOException
-
canonizeSql
public static java.lang.String canonizeSql(java.lang.String sql)
Canonize SQL statement for compare (startsWith) E.g. "connect to" - > "CONNECTTO"- Parameters:
sql
-- Returns:
-
-