001/*
002 * Copyright (c) 2006-2013 Nuxeo SA (http://nuxeo.com/) and others.
003 *
004 * All rights reserved. This program and the accompanying materials
005 * are made available under the terms of the Eclipse Public License v1.0
006 * which accompanies this distribution, and is available at
007 * http://www.eclipse.org/legal/epl-v10.html
008 *
009 * Contributors:
010 *     Florent Guillaume
011 */
012
013package org.nuxeo.ecm.core.storage.sql;
014
015import java.sql.Connection;
016import java.sql.DriverManager;
017import java.sql.ResultSet;
018import java.sql.Statement;
019import java.util.ArrayList;
020import java.util.HashMap;
021import java.util.List;
022import java.util.Map;
023
024import org.apache.commons.logging.Log;
025import org.apache.commons.logging.LogFactory;
026import org.nuxeo.runtime.api.Framework;
027
028public class DatabaseDB2 extends DatabaseHelper {
029
030    private static final Log log = LogFactory.getLog(DatabaseDB2.class);
031
032    public static DatabaseHelper INSTANCE = new DatabaseDB2();
033
034    private static final String DEF_SERVER = "localhost";
035
036    private static final String DEF_PORT = "3700";
037
038    // 8 chars max
039    private static final String DEFAULT_DATABASE_NAME = "nuxeotst";
040
041    private static final String DEF_USER = "db2inst1";
042
043    private static final String DEF_PASSWORD = "db2inst1pw99";
044
045    private static final String CONTRIB_XML = "OSGI-INF/test-repo-repository-db2-contrib.xml";
046
047    private static final String DRIVER = "com.ibm.db2.jcc.DB2Driver";
048
049    private static final String XA_DATASOURCE = "com.ibm.db2.jcc.DB2XADataSource";
050
051    protected void setProperties() {
052        databaseName = DEFAULT_DATABASE_NAME;
053        Framework.getProperties().setProperty(REPOSITORY_PROPERTY, repositoryName);
054        setProperty(DATABASE_PROPERTY, databaseName);
055        setProperty(SERVER_PROPERTY, DEF_SERVER);
056        setProperty(PORT_PROPERTY, DEF_PORT);
057        setProperty(USER_PROPERTY, DEF_USER);
058        setProperty(PASSWORD_PROPERTY, DEF_PASSWORD);
059        // for sql directory tests
060        setProperty(DRIVER_PROPERTY, DRIVER);
061        String url = String.format("jdbc:db2://%s:%s/%s", Framework.getProperty(SERVER_PROPERTY),
062                Framework.getProperty(PORT_PROPERTY), Framework.getProperty(DATABASE_PROPERTY));
063        setProperty(URL_PROPERTY, url);
064    }
065
066    @Override
067    public void setUp() throws Exception {
068        super.setUp();
069        Class.forName(DRIVER);
070        setProperties();
071        Connection connection = DriverManager.getConnection(Framework.getProperty(URL_PROPERTY),
072                Framework.getProperty(USER_PROPERTY), Framework.getProperty(PASSWORD_PROPERTY));
073        doOnAllTables(connection, null, Framework.getProperty(USER_PROPERTY).toUpperCase(), "DROP TABLE \"%s\"");
074        dropSequences(connection);
075        connection.close();
076    }
077
078    public void dropSequences(Connection connection) throws Exception {
079        List<String> sequenceNames = new ArrayList<String>();
080        Statement st = connection.createStatement();
081        ResultSet rs = st.executeQuery("SELECT SEQUENCE_NAME FROM USER_SEQUENCES");
082        while (rs.next()) {
083            String sequenceName = rs.getString(1);
084            if (sequenceName.indexOf('$') != -1) {
085                continue;
086            }
087            sequenceNames.add(sequenceName);
088        }
089        rs.close();
090        for (String sequenceName : sequenceNames) {
091            String sql = String.format("DROP SEQUENCE \"%s\"", sequenceName);
092            log.trace("SQL: " + sql);
093            st.execute(sql);
094        }
095        st.close();
096    }
097
098    @Override
099    public String getDeploymentContrib() {
100        return CONTRIB_XML;
101    }
102
103    @Override
104    public RepositoryDescriptor getRepositoryDescriptor() {
105        RepositoryDescriptor descriptor = new RepositoryDescriptor();
106        descriptor.xaDataSourceName = XA_DATASOURCE;
107        Map<String, String> properties = new HashMap<String, String>();
108        properties.put("URL", Framework.getProperty(URL_PROPERTY));
109        properties.put("User", Framework.getProperty(USER_PROPERTY));
110        properties.put("Password", Framework.getProperty(PASSWORD_PROPERTY));
111        descriptor.properties = properties;
112        return descriptor;
113    }
114
115    @Override
116    public boolean supportsClustering() {
117        return true;
118    }
119
120}