~ubuntu-branches/ubuntu/karmic/apgdiff/karmic

« back to all changes in this revision

Viewing changes to src/main/java/cz/startnet/utils/pgdiff/parsers/CreateTriggerParser.java

  • Committer: Bazaar Package Importer
  • Author(s): Christoph Berg
  • Date: 2008-09-09 15:42:54 UTC
  • Revision ID: james.westby@ubuntu.com-20080909154254-458sv7ew1rczdal1
Tags: upstream-1.2
ImportĀ upstreamĀ versionĀ 1.2

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * $Id: CreateTriggerParser.java 80 2007-09-01 20:25:45Z fordfrog $
 
3
 */
 
4
package cz.startnet.utils.pgdiff.parsers;
 
5
 
 
6
import cz.startnet.utils.pgdiff.schema.PgDatabase;
 
7
import cz.startnet.utils.pgdiff.schema.PgTrigger;
 
8
 
 
9
import java.util.regex.Matcher;
 
10
import java.util.regex.Pattern;
 
11
 
 
12
 
 
13
/**
 
14
 * Parses CREATE TRIGGER commands.
 
15
 *
 
16
 * @author fordfrog
 
17
 * @version $Id: CreateTriggerParser.java 80 2007-09-01 20:25:45Z fordfrog $
 
18
 */
 
19
public class CreateTriggerParser {
 
20
    /**
 
21
     * Pattern for parsing CREATE TRIGGER command.
 
22
     */
 
23
    private static final Pattern PATTERN =
 
24
        Pattern.compile(
 
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);
 
31
 
 
32
    /**
 
33
     * Creates a new CreateTableParser object.
 
34
     */
 
35
    private CreateTriggerParser() {
 
36
        super();
 
37
    }
 
38
 
 
39
    /**
 
40
     * Parses CREATE TRIGGER command.
 
41
     *
 
42
     * @param database database
 
43
     * @param command CREATE TRIGGER command
 
44
     *
 
45
     * @throws ParserException Thrown if problem occured while parsing the
 
46
     *         command.
 
47
     */
 
48
    public static void parse(final PgDatabase database, final String command) {
 
49
        final Matcher matcher = PATTERN.matcher(command.trim());
 
50
 
 
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);
 
58
 
 
59
            final String tableName = matcher.group(6);
 
60
            final String fireOn = matcher.group(7);
 
61
            final String procedure = matcher.group(8);
 
62
 
 
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());
 
73
 
 
74
            database.getDefaultSchema().getTable(trigger.getTableName()).addTrigger(
 
75
                    trigger);
 
76
        } else {
 
77
            throw new ParserException(
 
78
                    ParserException.CANNOT_PARSE_COMMAND + command);
 
79
        }
 
80
    }
 
81
 
 
82
    /**
 
83
     * Returns true if <code>event</code> is present in
 
84
     * <code>events</code>, otherwise false.
 
85
     *
 
86
     * @param events array of events
 
87
     * @param event event to be searched
 
88
     *
 
89
     * @return true if <code>event</code> is present in <code>events</code>,
 
90
     *         otherwise false
 
91
     */
 
92
    private static boolean isEventPresent(
 
93
        final String[] events,
 
94
        final String event) {
 
95
        boolean present = false;
 
96
 
 
97
        for (String curEvent : events) {
 
98
            if (event.equalsIgnoreCase(curEvent)) {
 
99
                present = true;
 
100
 
 
101
                break;
 
102
            }
 
103
        }
 
104
 
 
105
        return present;
 
106
    }
 
107
}