Project

General

Profile

Download (7.23 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2015 EDIT
3
* European Distributed Institute of Taxonomy
4
* http://www.e-taxonomy.eu
5
*
6
* The contents of this file are subject to the Mozilla Public License Version 1.1
7
* See LICENSE.TXT at the top of this package for the full license terms.
8
*/
9
package eu.etaxonomy.taxeditor.util;
10

    
11
/**
12
 * based on from http://code.google.com/p/java-tester/source/browse/trunk/src/main/java/org/jtester/unitils/database/H2DbSupport.java
13
 */
14
import java.util.Set;
15

    
16
import org.unitils.core.dbsupport.DbSupport;
17

    
18
public class H2DbSupport extends DbSupport {
19
        /**
20
         * Creates support for H2 databases.
21
         */
22
        public H2DbSupport() {
23
                super("h2");
24
        }
25

    
26
        @Override
27
        public Set<String> getColumnNames(String tableName) {
28
                return getSQLHandler().getItemsAsStringSet(
29
                                "select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = '" + tableName
30
                                                + "' AND TABLE_SCHEMA = '" + getSchemaName() + "'");
31
        }
32

    
33
        @Override
34
        public Set<String> getTableNames() {
35
                return getSQLHandler().getItemsAsStringSet(
36
                                "select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_TYPE = 'TABLE' AND TABLE_SCHEMA = '"
37
                                                + getSchemaName() + "'");
38
        }
39

    
40
        @Override
41
        public Set<String> getViewNames() {
42
                return getSQLHandler().getItemsAsStringSet(
43
                                "select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_TYPE = 'VIEW' AND TABLE_SCHEMA = '"
44
                                                + getSchemaName() + "'");
45
        }
46

    
47
        @Override
48
        public Set<String> getSequenceNames() {
49
                return getSQLHandler().getItemsAsStringSet(
50
                                "select SEQUENCE_NAME from INFORMATION_SCHEMA.SEQUENCES where SEQUENCE_SCHEMA = '"
51
                                                + getSchemaName() + "'");
52
        }
53

    
54
        @Override
55
        public Set<String> getTriggerNames() {
56
                return getSQLHandler().getItemsAsStringSet(
57
                                "select TRIGGER_NAME from INFORMATION_SCHEMA.TRIGGERS where TRIGGER_SCHEMA = '" + getSchemaName()
58
                                                + "'");
59
        }
60

    
61
        @Override
62
        public long getSequenceValue(String sequenceName) {
63
                return getSQLHandler().getItemAsLong(
64
                                "select CURRENT_VALUE from INFORMATION_SCHEMA.SEQUENCES where SEQUENCE_SCHEMA = '"
65
                                                + getSchemaName() + "' and SEQUENCE_NAME = '" + sequenceName + "'");
66
        }
67

    
68
        @Override
69
        public boolean supportsSequences() {
70
                return true;
71
        }
72

    
73
        @Override
74
        public boolean supportsTriggers() {
75
                return true;
76
        }
77

    
78
        @Override
79
        public boolean supportsIdentityColumns() {
80
                return true;
81
        }
82

    
83
        @Override
84
        public void incrementSequenceToValue(String sequenceName, long newSequenceValue) {
85
                getSQLHandler().executeUpdate(
86
                	"alter sequence " + qualified(sequenceName) + " restart with " + newSequenceValue);
87
        }
88

    
89
        @Override
90
        public void incrementIdentityColumnToValue(String tableName, String identityColumnName, long identityValue) {
91
                getSQLHandler().executeUpdate(
92
                      "alter table " + qualified(tableName) + " alter column " + quoted(identityColumnName)
93
                           + " RESTART WITH " + identityValue);
94
        }
95

    
96
        @Override
97
        public void disableReferentialConstraints() {
98
                Set<String> tableNames = getTableNames();
99
                for (String tableName : tableNames) {
100
                	disableReferentialConstraints(tableName);
101
                }
102
        }
103

    
104
        @Override
105
        public void disableValueConstraints() {
106
                Set<String> tableNames = getTableNames();
107
                for (String tableName : tableNames) {
108
                        disableValueConstraints(tableName);
109
                }
110
        }
111

    
112
        private void disableReferentialConstraints(String tableName) {
113
                Set<String> constraintNames = this.getForeignKeyConstraintNames(tableName);
114
                for (String constraintName : constraintNames) {
115
                	this.removeForeignKeyConstraint(tableName, constraintName);
116
                }
117
        }
118

    
119
        private void disableValueConstraints(String tableName) {
120
                Set<String> primaryKeyColumnNames = this.getPrimaryKeyColumnNames(tableName);
121

    
122
                Set<String> notNullColumnNames = this.getNotNullColummnNames(tableName);
123
                for (String notNullColumnName : notNullColumnNames) {
124
                    if (primaryKeyColumnNames.contains(notNullColumnName)) {
125
                            continue;
126
                    }
127
                    this.removeNotNullConstraint(tableName, notNullColumnName);
128
                }
129
        }
130

    
131
        /**
132
         * Gets the names of all identity columns of the given table.
133
         * <p/>
134
         * todo check, at this moment the PK columns are returned
135
         *
136
         * @param tableName The table, not null
137
         * @return The names of the identity columns of the table with the given name
138
         */
139
        @Override
140
        public Set<String> getIdentityColumnNames(String tableName) {
141
            return getPrimaryKeyColumnNames(tableName);
142
        }
143

    
144
        private Set<String> getPrimaryKeyColumnNames(String tableName) {
145
                return getSQLHandler().getItemsAsStringSet(
146
                                "select COLUMN_NAME from INFORMATION_SCHEMA.INDEXES where PRIMARY_KEY=TRUE AND TABLE_NAME = '"
147
                                                + tableName + "' AND TABLE_SCHEMA = '" + getSchemaName() + "'");
148
        }
149

    
150
        private Set<String> getNotNullColummnNames(String tableName) {
151
                return getSQLHandler().getItemsAsStringSet(
152
                                "select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where IS_NULLABLE = 'NO' AND TABLE_NAME = '"
153
                                                + tableName + "' AND TABLE_SCHEMA = '" + getSchemaName() + "'");
154
        }
155

    
156
        private Set<String> getForeignKeyConstraintNames(String tableName) {
157
                return getSQLHandler().getItemsAsStringSet(
158
                                "select CONSTRAINT_NAME from INFORMATION_SCHEMA.CONSTRAINTS "
159
                                                + "where CONSTRAINT_TYPE = 'REFERENTIAL' AND TABLE_NAME = '" + tableName
160
                                                + "' AND CONSTRAINT_SCHEMA = '" + getSchemaName() + "'");
161
        }
162

    
163
        private void removeForeignKeyConstraint(String tableName, String constraintName) {
164
                getSQLHandler().executeUpdate(
165
                                "alter table " + qualified(tableName) + " drop constraint " + quoted(constraintName));
166
        }
167

    
168
        private void removeNotNullConstraint(String tableName, String columnName) {
169
                getSQLHandler().executeUpdate(
170
                                "alter table " + qualified(tableName) + " alter column " + quoted(columnName) + " set null");
171
        }
172
}
    (1-1/1)