1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package p3j.database;
17
18 import james.SimSystem;
19 import james.core.data.DBConnectionData;
20
21 import java.sql.Connection;
22 import java.sql.DriverManager;
23 import java.sql.ResultSet;
24 import java.sql.SQLException;
25 import java.util.Properties;
26 import java.util.logging.Level;
27
28 import org.hibernate.cfg.Configuration;
29
30 import p3j.database.hibernate.P3MDatabase;
31 import p3j.gui.P3J;
32 import p3j.gui.misc.P3JConfigFile;
33 import p3j.misc.Misc;
34 import p3j.misc.gui.GUI;
35
36
37
38
39
40
41
42
43
44
45 public final class DatabaseFactory {
46
47
48
49
50
51 private static final String MYSQL_MATRIX_INDEX_NAME = "hash_index";
52
53
54
55
56 private DatabaseFactory() {
57 }
58
59
60 private static IP3MDatabase sqlDatabase;
61
62
63 private static DBConnectionData dbConnData = Misc.DEFAULT_DB_CONN;
64
65
66
67
68
69
70 public static IP3MDatabase getDatabaseSingleton() {
71 if (sqlDatabase == null) {
72 sqlDatabase = createDatabase(P3J.getInstance().getConfigFile());
73 }
74 return sqlDatabase;
75 }
76
77
78
79
80
81
82
83
84 public static IP3MDatabase createDatabase(P3JConfigFile configFile) {
85 P3MDatabase database = new P3MDatabase();
86 database.init(dbConnData, configFile);
87 try {
88 database.open();
89 attemptDBSpecificOptimizations(database.getConfig(), dbConnData);
90 } catch (Exception ex) {
91 SimSystem.report(ex);
92 }
93 return database;
94 }
95
96
97
98
99
100
101
102
103
104
105
106
107 private static void attemptDBSpecificOptimizations(Configuration config,
108 DBConnectionData connData) {
109 if (config.getProperty(Misc.PREF_HIBERNATE_DIALECT_PROPERTY).equals(
110 Misc.HIBERNATE_DIALECTS.get(DatabaseType.MYSQL))) {
111 createMatrixIndex(connData);
112 }
113 }
114
115
116
117
118
119
120
121
122
123 private static void createMatrixIndex(DBConnectionData connData) {
124
125 Properties connectionProps = new Properties();
126 connectionProps.put("user", connData.getUser());
127 connectionProps.put("password", connData.getPassword());
128
129 try (Connection conn = DriverManager.getConnection(dbConnData.getUrl(),
130 connectionProps)) {
131 ResultSet rs = conn.createStatement().executeQuery(
132 "SHOW INDEX FROM matrices WHERE KEY_NAME = '"
133 + MYSQL_MATRIX_INDEX_NAME + "'");
134 if (!rs.first()) {
135 SimSystem.report(Level.INFO, "Attempting to create index '"
136 + MYSQL_MATRIX_INDEX_NAME + "'");
137 conn.createStatement()
138 .executeUpdate(
139 "CREATE INDEX " + MYSQL_MATRIX_INDEX_NAME
140 + " ON matrices(ID,hash)");
141 SimSystem.report(Level.INFO, "Index creation successful.");
142 }
143 } catch (SQLException e) {
144 SimSystem.report(e);
145 }
146 }
147
148
149
150
151
152
153
154
155
156
157 public static IP3MDatabase createDatabase(String hibernateConfigFile) {
158 P3MDatabase.setHibernateConfigFile(hibernateConfigFile);
159 return createDatabase(P3J.getInstance().getConfigFile());
160 }
161
162
163
164
165
166
167 public static DBConnectionData getDbConnData() {
168 return dbConnData;
169 }
170
171
172
173
174
175
176
177 public static void setDbConnData(DBConnectionData dbConnData) {
178 try {
179 reset();
180 } catch (Exception ex) {
181 GUI.printErrorMessage("Error closing database connection", ex);
182 }
183 DatabaseFactory.dbConnData = dbConnData;
184 }
185
186
187
188
189 public static void reset() {
190 if (sqlDatabase != null) {
191 sqlDatabase.close();
192 }
193 sqlDatabase = null;
194 }
195
196 }