1 /*
2 *
3 * The DbUnit Database Testing Framework
4 * Copyright (C)2002-2004, DbUnit.org
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 *
20 */
21
22 package org.dbunit.operation;
23
24 import org.slf4j.Logger;
25 import org.slf4j.LoggerFactory;
26
27 import org.dbunit.DatabaseUnitException;
28 import org.dbunit.database.DatabaseConfig;
29 import org.dbunit.database.IDatabaseConnection;
30 import org.dbunit.dataset.IDataSet;
31
32 import java.sql.SQLException;
33
34 /**
35 * Truncate tables present in the specified dataset. If the dataset does not
36 * contains a particular table, but that table exists in the database,
37 * the database table is not affected. Table are truncated in
38 * reverse sequence.
39 * <p>
40 * This operation has the same effect of as {@link DeleteAllOperation}.
41 * TruncateTableOperation is faster, and it is non-logged, meaning it cannot be
42 * rollback. DeleteAllOperation is more portable because not all database vendor
43 * support TRUNCATE_TABLE TABLE statement.
44 *
45 * @author Manuel Laflamme
46 * @since Apr 10, 2003
47 * @version $Revision$
48 * @see DeleteAllOperation
49 */
50 public class TruncateTableOperation extends DeleteAllOperation
51 {
52
53 /**
54 * Logger for this class
55 */
56 private static final Logger logger = LoggerFactory.getLogger(TruncateTableOperation.class);
57
58 TruncateTableOperation()
59 {
60 }
61
62 ////////////////////////////////////////////////////////////////////////////
63 // DeleteAllOperation class
64
65 protected String getDeleteAllCommand()
66 {
67 return "truncate table ";
68 }
69
70 @Override
71 protected String getDeleteAllCommandSuffix(IDatabaseConnection connection) throws SQLException
72 {
73 java.sql.Connection jdbcConnection = connection.getConnection();
74 if (jdbcConnection == null)
75 {
76 return "";
77 }
78 String productName = jdbcConnection.getMetaData().getDatabaseProductName();
79 if (productName != null && productName.toLowerCase().startsWith("db2"))
80 {
81 return " IMMEDIATE";
82 }
83 return "";
84 }
85
86 ////////////////////////////////////////////////////////////////////////////
87 // DatabaseOperation class
88
89 public void execute(IDatabaseConnection connection, IDataSet dataSet)
90 throws DatabaseUnitException, SQLException
91 {
92 logger.debug("execute(connection={}, dataSet={}) - start", connection, dataSet);
93
94 // Patch to make it work with MS SQL Server
95 DatabaseConfig config = connection.getConfig();
96 boolean oldValue = config.getFeature(DatabaseConfig.FEATURE_BATCHED_STATEMENTS);
97 try
98 {
99 config.setFeature(DatabaseConfig.FEATURE_BATCHED_STATEMENTS, false);
100 super.execute(connection, dataSet);
101 }
102 finally
103 {
104 config.setFeature(DatabaseConfig.FEATURE_BATCHED_STATEMENTS, oldValue);
105 }
106 }
107 }