/******************************************************************************* * Copyright 2016 * Ubiquitous Knowledge Processing (UKP) Lab * Technische Universität Darmstadt * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ package de.tudarmstadt.ukp.lmf.transform; import java.io.FileNotFoundException; import java.util.Iterator; import java.util.Set; import java.util.TreeSet; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.hibernate.mapping.Table; import org.hibernate.service.ServiceRegistryBuilder; import org.hibernate.tool.hbm2ddl.SchemaExport; import org.hibernate.tool.hbm2ddl.SchemaUpdate; import de.tudarmstadt.ukp.lmf.hibernate.HibernateConnect; public class LMFDBUtils { /** * Create all LMF Tables in the database based on the hibernate mapping * @param dbConfig * @throws FileNotFoundException */ public static void createTables(DBConfig dbConfig) throws FileNotFoundException{ // public static void createTables(DBConfig dbConfig/*, boolean constraints*/) System.out.println("CREATE TABLES"); Configuration cfg = HibernateConnect.getConfiguration(dbConfig); cfg.setProperty("hibernate.hbm2ddl.auto", "none"); SchemaExport se = new SchemaExport(cfg); se.create(true, true); /*if (constraints) { turnOnConstraints(dbConfig); }*/ } /** * Create all LMF Tables in the database based on the hibernate mapping * @param dbConfig * @throws FileNotFoundException */ public static void updateTables(DBConfig dbConfig) throws FileNotFoundException{ // public static void updateTables(DBConfig dbConfig/*, boolean constraints*/) System.out.println("UPDATE TABLES"); Configuration cfg = HibernateConnect.getConfiguration(dbConfig); SchemaUpdate su = new SchemaUpdate(cfg); su.execute(true, true); /*if (constraints) { turnOnConstraints(dbConfig); }*/ } public static void dropTables(final DBConfig dbConfig) { System.out.println("DROP TABLES"); Configuration cfg = HibernateConnect.getConfiguration(dbConfig); cfg.setProperty("hibernate.hbm2ddl.auto", "none"); SessionFactory sf = cfg.buildSessionFactory( new ServiceRegistryBuilder().applySettings( cfg.getProperties()).buildServiceRegistry()); Session session = sf.openSession(); Transaction tx = session.beginTransaction(); try { // Create a set of all tables. Set<String> dropSQL = new TreeSet<String>(); Iterator<Table> iter = cfg.getTableMappings(); while (iter.hasNext()) dropSQL.add("DROP TABLE " + iter.next().getName()); // Try to delete them repeatedly until no tables are left or // there have been too many repetitions. int remainingLoops = dropSQL.size(); while (!dropSQL.isEmpty() && remainingLoops >= 0) { Iterator<String> sqlIter = dropSQL.iterator(); while (sqlIter.hasNext()) { try { String sql = sqlIter.next(); session.createSQLQuery(sql).executeUpdate(); sqlIter.remove(); System.out.println(sql); } catch (HibernateException e) {} } remainingLoops--; } } finally { tx.commit(); session.disconnect(); session.close(); } } public static void truncateTables(final DBConfig dbConfig) { System.out.println("TRUNCATE TABLES"); Configuration cfg = HibernateConnect.getConfiguration(dbConfig); SessionFactory sf = cfg.buildSessionFactory( new ServiceRegistryBuilder().applySettings( cfg.getProperties()).buildServiceRegistry()); Session session = sf.openSession(); try { session.createSQLQuery("SET FOREIGN_KEY_CHECKS=0").executeUpdate(); Iterator<Table> iter = cfg.getTableMappings(); while (iter.hasNext()) session.createSQLQuery("TRUNCATE TABLE " + iter.next().getName()).executeUpdate(); } finally { session.createSQLQuery("SET FOREIGN_KEY_CHECKS=1").executeUpdate(); session.disconnect(); session.close(); } } }