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.table; |
7 | |
8 | import java.util.ArrayList; |
9 | import java.util.List; |
10 | import org.h2.command.ddl.CreateTableData; |
11 | import org.h2.engine.Database; |
12 | import org.h2.engine.DbSettings; |
13 | import org.h2.mvstore.db.MVTableEngine; |
14 | import org.h2.util.StatementBuilder; |
15 | import org.h2.util.StringUtils; |
16 | |
17 | /** |
18 | * The base class of a regular table, or a user defined table. |
19 | * |
20 | * @author Thomas Mueller |
21 | * @author Sergi Vladykin |
22 | */ |
23 | public abstract class TableBase extends Table { |
24 | |
25 | /** |
26 | * The table engine used (null for regular tables). |
27 | */ |
28 | private final String tableEngine; |
29 | /** Provided table parameters */ |
30 | private List<String> tableEngineParams = new ArrayList<String>(); |
31 | |
32 | private final boolean globalTemporary; |
33 | |
34 | public TableBase(CreateTableData data) { |
35 | super(data.schema, data.id, data.tableName, |
36 | data.persistIndexes, data.persistData); |
37 | this.tableEngine = data.tableEngine; |
38 | this.globalTemporary = data.globalTemporary; |
39 | if (data.tableEngineParams != null) { |
40 | this.tableEngineParams = data.tableEngineParams; |
41 | } |
42 | setTemporary(data.temporary); |
43 | Column[] cols = new Column[data.columns.size()]; |
44 | data.columns.toArray(cols); |
45 | setColumns(cols); |
46 | } |
47 | |
48 | @Override |
49 | public String getDropSQL() { |
50 | return "DROP TABLE IF EXISTS " + getSQL() + " CASCADE"; |
51 | } |
52 | |
53 | @Override |
54 | public String getCreateSQL() { |
55 | Database db = getDatabase(); |
56 | if (db == null) { |
57 | // closed |
58 | return null; |
59 | } |
60 | StatementBuilder buff = new StatementBuilder("CREATE "); |
61 | if (isTemporary()) { |
62 | if (isGlobalTemporary()) { |
63 | buff.append("GLOBAL "); |
64 | } else { |
65 | buff.append("LOCAL "); |
66 | } |
67 | buff.append("TEMPORARY "); |
68 | } else if (isPersistIndexes()) { |
69 | buff.append("CACHED "); |
70 | } else { |
71 | buff.append("MEMORY "); |
72 | } |
73 | buff.append("TABLE "); |
74 | if (isHidden) { |
75 | buff.append("IF NOT EXISTS "); |
76 | } |
77 | buff.append(getSQL()); |
78 | if (comment != null) { |
79 | buff.append(" COMMENT ").append(StringUtils.quoteStringSQL(comment)); |
80 | } |
81 | buff.append("(\n "); |
82 | for (Column column : columns) { |
83 | buff.appendExceptFirst(",\n "); |
84 | buff.append(column.getCreateSQL()); |
85 | } |
86 | buff.append("\n)"); |
87 | if (tableEngine != null) { |
88 | DbSettings s = db.getSettings(); |
89 | String d = s.defaultTableEngine; |
90 | if (d == null && s.mvStore) { |
91 | d = MVTableEngine.class.getName(); |
92 | } |
93 | if (d == null || !tableEngine.endsWith(d)) { |
94 | buff.append("\nENGINE "); |
95 | buff.append(StringUtils.quoteIdentifier(tableEngine)); |
96 | } |
97 | } |
98 | if (!tableEngineParams.isEmpty()) { |
99 | buff.append("\nWITH "); |
100 | buff.resetCount(); |
101 | for (String parameter : tableEngineParams) { |
102 | buff.appendExceptFirst(", "); |
103 | buff.append(StringUtils.quoteIdentifier(parameter)); |
104 | } |
105 | } |
106 | if (!isPersistIndexes() && !isPersistData()) { |
107 | buff.append("\nNOT PERSISTENT"); |
108 | } |
109 | if (isHidden) { |
110 | buff.append("\nHIDDEN"); |
111 | } |
112 | return buff.toString(); |
113 | } |
114 | |
115 | @Override |
116 | public boolean isGlobalTemporary() { |
117 | return globalTemporary; |
118 | } |
119 | |
120 | } |