2
* Copyright 2006 StartNet s.r.o.
4
* Distributed under MIT license
1
6
package cz.startnet.utils.pgdiff.parsers;
3
8
import cz.startnet.utils.pgdiff.schema.PgDatabase;
4
9
import cz.startnet.utils.pgdiff.schema.PgTrigger;
6
import java.util.regex.Matcher;
7
import java.util.regex.Pattern;
10
* Parses CREATE TRIGGER commands.
12
* Parses CREATE TRIGGER statements.
14
16
public class CreateTriggerParser {
17
* Pattern for parsing CREATE TRIGGER command.
19
private static final Pattern PATTERN = Pattern.compile(
20
"^CREATE[\\s]+TRIGGER[\\s]+\"?([^\\s\"]+)\"?[\\s]+(BEFORE|AFTER)[\\s]+"
21
+ "(INSERT|UPDATE|DELETE)(?:[\\s]+OR[\\s]+)?(INSERT|UPDATE|DELETE)?"
22
+ "(?:[\\s]+OR[\\s]+)?(INSERT|UPDATE|DELETE)?[\\s]+"
23
+ "ON[\\s]+\"?([^\\s\"]+)\"?[\\s]+(?:FOR[\\s]+)?(?:EACH[\\s]+)?"
24
+ "(ROW|STATEMENT)?[\\s]+EXECUTE[\\s]+PROCEDURE[\\s]+([^;]+);$",
25
Pattern.CASE_INSENSITIVE);
28
19
* Creates a new CreateTableParser object.
30
21
private CreateTriggerParser() {
35
* Parses CREATE TRIGGER command.
25
* Parses CREATE TRIGGER statement.
37
27
* @param database database
38
* @param command CREATE TRIGGER command
40
* @throws ParserException Thrown if problem occured while parsing the
43
public static void parse(final PgDatabase database, final String command) {
44
final Matcher matcher = PATTERN.matcher(command.trim());
46
if (matcher.matches()) {
47
final String triggerName = matcher.group(1);
48
final String when = matcher.group(2);
49
final String[] events = new String[3];
50
events[0] = matcher.group(3);
51
events[1] = matcher.group(4);
52
events[2] = matcher.group(5);
54
final String tableName = matcher.group(6);
55
final String fireOn = matcher.group(7);
56
final String procedure = matcher.group(8);
58
final PgTrigger trigger = new PgTrigger();
59
trigger.setBefore("BEFORE".equalsIgnoreCase(when));
60
trigger.setForEachRow(
61
(fireOn != null) && "ROW".equalsIgnoreCase(fireOn));
62
trigger.setFunction(procedure.trim());
63
trigger.setName(triggerName.trim());
64
trigger.setOnDelete(isEventPresent(events, "DELETE"));
65
trigger.setOnInsert(isEventPresent(events, "INSERT"));
66
trigger.setOnUpdate(isEventPresent(events, "UPDATE"));
67
trigger.setTableName(tableName.trim());
69
database.getDefaultSchema().getTable(
70
trigger.getTableName()).addTrigger(trigger);
72
throw new ParserException(
73
ParserException.CANNOT_PARSE_COMMAND + command);
78
* Returns true if <code>event</code> is present in
79
* <code>events</code>, otherwise false.
81
* @param events array of events
82
* @param event event to be searched
84
* @return true if <code>event</code> is present in <code>events</code>,
87
private static boolean isEventPresent(final String[] events,
89
boolean present = false;
91
for (String curEvent : events) {
92
if (event.equalsIgnoreCase(curEvent)) {
28
* @param statement CREATE TRIGGER statement
30
public static void parse(final PgDatabase database,
31
final String statement) {
32
final Parser parser = new Parser(statement);
33
parser.expect("CREATE", "TRIGGER");
35
final PgTrigger trigger = new PgTrigger();
36
trigger.setName(ParserUtils.getObjectName(parser.parseIdentifier()));
38
if (parser.expectOptional("BEFORE")) {
39
trigger.setBefore(true);
40
} else if (parser.expectOptional("AFTER")) {
41
trigger.setBefore(false);
47
if (!first && !parser.expectOptional("OR")) {
50
if (parser.expectOptional("INSERT")) {
51
trigger.setOnInsert(true);
52
} else if (parser.expectOptional("UPDATE")) {
53
trigger.setOnUpdate(true);
54
} else if (parser.expectOptional("DELETE")) {
55
trigger.setOnDelete(true);
56
} else if (parser.expectOptional("TRUNCATE")) {
57
trigger.setOnTruncate(true);
61
parser.throwUnsupportedCommand();
70
ParserUtils.getObjectName(parser.parseIdentifier()));
72
if (parser.expectOptional("FOR")) {
73
parser.expectOptional("EACH");
75
if (parser.expectOptional("ROW")) {
76
trigger.setForEachRow(true);
77
} else if (parser.expectOptional("STATEMENT")) {
78
trigger.setForEachRow(false);
80
parser.throwUnsupportedCommand();
84
if (parser.expectOptional("WHEN")) {
86
trigger.setWhen(parser.getExpression());
90
parser.expect("EXECUTE", "PROCEDURE");
91
trigger.setFunction(parser.getRest());
93
database.getDefaultSchema().getTable(
94
trigger.getTableName()).addTrigger(trigger);