1 | /* |
2 | * Copyright 2004-2014 H2 Group. Multiple-Licensed under the MPL 2.0, |
3 | * and the EPL 1.0 (http://h2database.com/html/license.html). |
4 | * Initial Developer: H2 Group |
5 | */ |
6 | package org.h2.command.ddl; |
7 | |
8 | import org.h2.api.ErrorCode; |
9 | import org.h2.api.Trigger; |
10 | import org.h2.command.CommandInterface; |
11 | import org.h2.engine.Database; |
12 | import org.h2.engine.Session; |
13 | import org.h2.message.DbException; |
14 | import org.h2.schema.Schema; |
15 | import org.h2.schema.TriggerObject; |
16 | import org.h2.table.Table; |
17 | |
18 | /** |
19 | * This class represents the statement |
20 | * CREATE TRIGGER |
21 | */ |
22 | public class CreateTrigger extends SchemaCommand { |
23 | |
24 | private String triggerName; |
25 | private boolean ifNotExists; |
26 | |
27 | private boolean insteadOf; |
28 | private boolean before; |
29 | private int typeMask; |
30 | private boolean rowBased; |
31 | private int queueSize = TriggerObject.DEFAULT_QUEUE_SIZE; |
32 | private boolean noWait; |
33 | private String tableName; |
34 | private String triggerClassName; |
35 | private String triggerSource; |
36 | private boolean force; |
37 | private boolean onRollback; |
38 | |
39 | public CreateTrigger(Session session, Schema schema) { |
40 | super(session, schema); |
41 | } |
42 | |
43 | public void setInsteadOf(boolean insteadOf) { |
44 | this.insteadOf = insteadOf; |
45 | } |
46 | |
47 | public void setBefore(boolean before) { |
48 | this.before = before; |
49 | } |
50 | |
51 | public void setTriggerClassName(String triggerClassName) { |
52 | this.triggerClassName = triggerClassName; |
53 | } |
54 | |
55 | public void setTriggerSource(String triggerSource) { |
56 | this.triggerSource = triggerSource; |
57 | } |
58 | |
59 | public void setTypeMask(int typeMask) { |
60 | this.typeMask = typeMask; |
61 | } |
62 | |
63 | public void setRowBased(boolean rowBased) { |
64 | this.rowBased = rowBased; |
65 | } |
66 | |
67 | public void setQueueSize(int size) { |
68 | this.queueSize = size; |
69 | } |
70 | |
71 | public void setNoWait(boolean noWait) { |
72 | this.noWait = noWait; |
73 | } |
74 | |
75 | public void setTableName(String tableName) { |
76 | this.tableName = tableName; |
77 | } |
78 | |
79 | public void setTriggerName(String name) { |
80 | this.triggerName = name; |
81 | } |
82 | |
83 | public void setIfNotExists(boolean ifNotExists) { |
84 | this.ifNotExists = ifNotExists; |
85 | } |
86 | |
87 | @Override |
88 | public int update() { |
89 | session.commit(true); |
90 | Database db = session.getDatabase(); |
91 | if (getSchema().findTrigger(triggerName) != null) { |
92 | if (ifNotExists) { |
93 | return 0; |
94 | } |
95 | throw DbException.get( |
96 | ErrorCode.TRIGGER_ALREADY_EXISTS_1, |
97 | triggerName); |
98 | } |
99 | if ((typeMask & Trigger.SELECT) == Trigger.SELECT && rowBased) { |
100 | throw DbException.get( |
101 | ErrorCode.TRIGGER_SELECT_AND_ROW_BASED_NOT_SUPPORTED, |
102 | triggerName); |
103 | } |
104 | int id = getObjectId(); |
105 | Table table = getSchema().getTableOrView(session, tableName); |
106 | TriggerObject trigger = new TriggerObject(getSchema(), id, triggerName, table); |
107 | trigger.setInsteadOf(insteadOf); |
108 | trigger.setBefore(before); |
109 | trigger.setNoWait(noWait); |
110 | trigger.setQueueSize(queueSize); |
111 | trigger.setRowBased(rowBased); |
112 | trigger.setTypeMask(typeMask); |
113 | trigger.setOnRollback(onRollback); |
114 | if (this.triggerClassName != null) { |
115 | trigger.setTriggerClassName(triggerClassName, force); |
116 | } else { |
117 | trigger.setTriggerSource(triggerSource, force); |
118 | } |
119 | db.addSchemaObject(session, trigger); |
120 | table.addTrigger(trigger); |
121 | return 0; |
122 | } |
123 | |
124 | public void setForce(boolean force) { |
125 | this.force = force; |
126 | } |
127 | |
128 | public void setOnRollback(boolean onRollback) { |
129 | this.onRollback = onRollback; |
130 | } |
131 | |
132 | @Override |
133 | public int getType() { |
134 | return CommandInterface.CREATE_TRIGGER; |
135 | } |
136 | |
137 | } |