This project has retired. For details please refer to its
Attic page.
001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018 package org.apache.oozie.store;
019
020 import java.sql.Blob;
021 import java.sql.Timestamp;
022 import java.util.ArrayList;
023 import java.util.HashMap;
024 import java.util.List;
025 import java.util.Map;
026
027 import org.apache.oozie.util.db.Schema;
028 import org.apache.oozie.util.db.Schema.Column;
029 import org.apache.oozie.util.db.Schema.DBType;
030 import org.apache.oozie.util.db.Schema.Index;
031 import org.apache.oozie.util.db.Schema.Table;
032
033 public class OozieSchema {
034
035 private static String oozieDbName;
036
037 private static final String OOZIE_VERSION = "0.1";
038
039 public static final Map<Table, List<Column>> TABLE_COLUMNS = new HashMap<Table, List<Column>>();
040
041 static {
042 for (Column column : OozieColumn.values()) {
043 List<Column> tColumns = TABLE_COLUMNS.get(column.table());
044 if (tColumns == null) {
045 tColumns = new ArrayList<Column>();
046 TABLE_COLUMNS.put(column.table(), tColumns);
047 }
048 tColumns.add(column);
049 }
050 }
051
052 public static void setOozieDbName(String dbName) {
053 oozieDbName = dbName;
054 }
055
056 public static enum OozieTable implements Table {
057 WORKFLOWS,
058 ACTIONS,
059 WF_PROCESS_INSTANCE,
060 VERSION;
061
062 @Override
063 public String toString() {
064 return oozieDbName + "." + name().toUpperCase();
065 }
066 }
067
068 public static enum OozieIndex implements Index {
069 IDX_WF_APPNAME(OozieColumn.WF_appName),
070 IDX_WF_USER(OozieColumn.WF_userName),
071 IDX_WF_GROUP(OozieColumn.WF_groupName),
072 IDX_WF_STATUS(OozieColumn.WF_status),
073 IDX_WF_EXTERNAL_ID(OozieColumn.WF_externalId),
074
075 IDX_ACTIONS_BEGINTIME(OozieColumn.ACTIONS_pendingAge),
076 IDX_ACTIONS_WFID(OozieColumn.ACTIONS_wfId);
077
078 final Column column;
079
080 OozieIndex(Column column) {
081 this.column = column;
082 }
083
084 public Column column() {
085 return column;
086 }
087 }
088
089 public static enum OozieColumn implements Column {
090 // Process Instance Table
091 PI_wfId(OozieTable.WF_PROCESS_INSTANCE, String.class, true, 100),
092 PI_state(OozieTable.WF_PROCESS_INSTANCE, Blob.class, false),
093
094 // WorkflowJob Table
095 WF_id(OozieTable.WORKFLOWS, String.class, true, 100),
096 WF_externalId(OozieTable.WORKFLOWS, String.class, false, 100),
097 WF_appName(OozieTable.WORKFLOWS, String.class, false, 100),
098 WF_appPath(OozieTable.WORKFLOWS, String.class, false, 255),
099 WF_conf(OozieTable.WORKFLOWS, String.class, false),
100 WF_protoActionConf(OozieTable.WORKFLOWS, String.class, false),
101 WF_logToken(OozieTable.WORKFLOWS, String.class, false, 100),
102 WF_status(OozieTable.WORKFLOWS, String.class, false, 100),
103 WF_run(OozieTable.WORKFLOWS, Long.class, false),
104 WF_lastModTime(OozieTable.WORKFLOWS, Timestamp.class, false),
105 WF_createdTime(OozieTable.WORKFLOWS, Timestamp.class, false),
106 WF_startTime(OozieTable.WORKFLOWS, Timestamp.class, false),
107 WF_endTime(OozieTable.WORKFLOWS, Timestamp.class, false),
108 WF_userName(OozieTable.WORKFLOWS, String.class, false, 100),
109 WF_groupName(OozieTable.WORKFLOWS, String.class, false, 100),
110 WF_authToken(OozieTable.WORKFLOWS, String.class, false),
111
112 // Actions Table
113 ACTIONS_id(OozieTable.ACTIONS, String.class, true, 100),
114 ACTIONS_name(OozieTable.ACTIONS, String.class, false, 100),
115 ACTIONS_type(OozieTable.ACTIONS, String.class, false, 100),
116 ACTIONS_wfId(OozieTable.ACTIONS, String.class, false, 100),
117 ACTIONS_conf(OozieTable.ACTIONS, String.class, false),
118 ACTIONS_status(OozieTable.ACTIONS, String.class, false, 100),
119 ACTIONS_externalStatus(OozieTable.ACTIONS, String.class, false, 100),
120 ACTIONS_errorCode(OozieTable.ACTIONS, String.class, false, 100),
121 ACTIONS_errorMessage(OozieTable.ACTIONS, String.class, false),
122 ACTIONS_transition(OozieTable.ACTIONS, String.class, false, 100),
123 ACTIONS_retries(OozieTable.ACTIONS, Long.class, false),
124 ACTIONS_startTime(OozieTable.ACTIONS, Timestamp.class, false),
125 ACTIONS_endTime(OozieTable.ACTIONS, Timestamp.class, false),
126 ACTIONS_lastCheckTime(OozieTable.ACTIONS, Timestamp.class, false),
127 ACTIONS_data(OozieTable.ACTIONS, String.class, false),
128 ACTIONS_externalId(OozieTable.ACTIONS, String.class, false, 100),
129 ACTIONS_trackerUri(OozieTable.ACTIONS, String.class, false, 100),
130 ACTIONS_consoleUrl(OozieTable.ACTIONS, String.class, false, 100),
131 ACTIONS_executionPath(OozieTable.ACTIONS, String.class, false, 255),
132 ACTIONS_pending(OozieTable.ACTIONS, Boolean.class, false),
133 ACTIONS_pendingAge(OozieTable.ACTIONS, Timestamp.class, false),
134 ACTIONS_signalValue(OozieTable.ACTIONS, String.class, false, 100),
135 ACTIONS_logToken(OozieTable.ACTIONS, String.class, false, 100),
136
137 // Version Table
138 VER_versionNumber(OozieTable.VERSION, String.class, false, 255);
139
140 final Table table;
141 final Class<?> type;
142 int length = -1;
143 final boolean isPrimaryKey;
144
145 OozieColumn(Table table, Class<?> type, boolean isPrimaryKey) {
146 this(table, type, isPrimaryKey, -1);
147 }
148
149 OozieColumn(Table table, Class<?> type, boolean isPrimaryKey, int length) {
150 this.table = table;
151 this.type = type;
152 this.isPrimaryKey = isPrimaryKey;
153 this.length = length;
154 }
155
156 private String getName() {
157 String tName = table.name();
158 return tName + "." + columnName();
159 }
160
161 public String columnName() {
162 return name().split("_")[1].toLowerCase();
163 }
164
165 @Override
166 public String toString() {
167 return getName();
168 }
169
170 public Table table() {
171 return table;
172 }
173
174 public Class<?> getType() {
175 return type;
176 }
177
178 public int getLength() {
179 return length;
180 }
181
182 public String asLabel() {
183 return name().toUpperCase();
184 }
185
186 public boolean isPrimaryKey() {
187 return isPrimaryKey;
188 }
189 }
190
191 /**
192 * Generates the create table SQL Statement
193 *
194 * @param table
195 * @param dbType
196 * @return SQL Statement to create the table
197 */
198 public static String generateCreateTableScript(Table table, DBType dbType) {
199 return Schema.generateCreateTableScript(table, dbType, TABLE_COLUMNS.get(table));
200 }
201
202 /**
203 * Gets the query that will be used to validate the connection
204 *
205 * @param dbName
206 * @return
207 */
208 public static String getValidationQuery(String dbName) {
209 return "select count(" + OozieColumn.VER_versionNumber.columnName() + ") from " + dbName + "."
210 + OozieTable.VERSION.name().toUpperCase();
211 }
212
213 /**
214 * Generates the Insert statement to insert the OOZIE_VERSION to table
215 *
216 * @param dbName
217 * @return
218 */
219 public static String generateInsertVersionScript(String dbName) {
220 return "INSERT INTO " + dbName + "." + OozieTable.VERSION.name().toUpperCase() + "("
221 + OozieColumn.VER_versionNumber.columnName() + ") VALUES(" + OOZIE_VERSION + ")";
222 }
223
224 /**
225 * Gets the Oozie Schema Version
226 *
227 * @return
228 */
229 public static String getOozieVersion() {
230 return OOZIE_VERSION;
231 }
232 }