2
* $Id: CreateTriggerParser.java 80 2007-09-01 20:25:45Z fordfrog $
4
package cz.startnet.utils.pgdiff.parsers;
6
import cz.startnet.utils.pgdiff.schema.PgDatabase;
7
import cz.startnet.utils.pgdiff.schema.PgTrigger;
9
import java.util.regex.Matcher;
10
import java.util.regex.Pattern;
14
* Parses CREATE TRIGGER commands.
17
* @version $Id: CreateTriggerParser.java 80 2007-09-01 20:25:45Z fordfrog $
19
public class CreateTriggerParser {
21
* Pattern for parsing CREATE TRIGGER command.
23
private static final Pattern PATTERN =
25
"^CREATE[\\s]+TRIGGER[\\s]+\"?([^\\s\"]+)\"?[\\s]+(BEFORE|AFTER)[\\s]+"
26
+ "(INSERT|UPDATE|DELETE)(?:[\\s]+OR[\\s]+)?(INSERT|UPDATE|DELETE)?"
27
+ "(?:[\\s]+OR[\\s]+)?(INSERT|UPDATE|DELETE)?[\\s]+"
28
+ "ON[\\s]+\"?([^\\s\"]+)\"?[\\s]+(?:FOR[\\s]+)?(?:EACH[\\s]+)?"
29
+ "(ROW|STATEMENT)?[\\s]+EXECUTE[\\s]+PROCEDURE[\\s]+([^;]+);$",
30
Pattern.CASE_INSENSITIVE);
33
* Creates a new CreateTableParser object.
35
private CreateTriggerParser() {
40
* Parses CREATE TRIGGER command.
42
* @param database database
43
* @param command CREATE TRIGGER command
45
* @throws ParserException Thrown if problem occured while parsing the
48
public static void parse(final PgDatabase database, final String command) {
49
final Matcher matcher = PATTERN.matcher(command.trim());
51
if (matcher.matches()) {
52
final String triggerName = matcher.group(1);
53
final String when = matcher.group(2);
54
final String[] events = new String[3];
55
events[0] = matcher.group(3);
56
events[1] = matcher.group(4);
57
events[2] = matcher.group(5);
59
final String tableName = matcher.group(6);
60
final String fireOn = matcher.group(7);
61
final String procedure = matcher.group(8);
63
final PgTrigger trigger = new PgTrigger();
64
trigger.setBefore("BEFORE".equalsIgnoreCase(when));
65
trigger.setForEachRow(
66
(fireOn != null) && "ROW".equalsIgnoreCase(fireOn));
67
trigger.setFunction(procedure.trim());
68
trigger.setName(triggerName.trim());
69
trigger.setOnDelete(isEventPresent(events, "DELETE"));
70
trigger.setOnInsert(isEventPresent(events, "INSERT"));
71
trigger.setOnUpdate(isEventPresent(events, "UPDATE"));
72
trigger.setTableName(tableName.trim());
74
database.getDefaultSchema().getTable(trigger.getTableName()).addTrigger(
77
throw new ParserException(
78
ParserException.CANNOT_PARSE_COMMAND + command);
83
* Returns true if <code>event</code> is present in
84
* <code>events</code>, otherwise false.
86
* @param events array of events
87
* @param event event to be searched
89
* @return true if <code>event</code> is present in <code>events</code>,
92
private static boolean isEventPresent(
93
final String[] events,
95
boolean present = false;
97
for (String curEvent : events) {
98
if (event.equalsIgnoreCase(curEvent)) {