Skip to main content
aboutsummaryrefslogtreecommitdiffstats
blob: 7948b5cd8921024bae9a4117d38c72d5931fead2 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/*
 * Copyright (c) 2013, 2016 Eike Stepper (Berlin, Germany) and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Eike Stepper - initial API and implementation
 */
package org.eclipse.emf.cdo.tests.db;

import org.eclipse.emf.cdo.common.CDOCommonRepository.IDGenerationLocation;

import org.eclipse.net4j.db.DBException;
import org.eclipse.net4j.db.DBUtil;

import javax.sql.DataSource;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * @author Victor Roldan Betancort
 */
public abstract class AbstractSetupDBConfig extends DBConfig
{
  private static final long serialVersionUID = 1L;

  private transient DataSource setupDataSource;

  public AbstractSetupDBConfig(String name, boolean supportingAudits, boolean supportingBranches, boolean withRanges, boolean copyOnBranch,
      IDGenerationLocation idGenerationLocation)
  {
    super(name, supportingAudits, supportingBranches, withRanges, copyOnBranch, idGenerationLocation);
  }

  protected String getDBName(String repoName)
  {
    return "test_" + repoName;
  }

  @Override
  protected DataSource createDataSource(String repoName)
  {
    String dbName = getDBName(repoName);
    initDatabase(dbName);

    try
    {
      return createDataSourceForDB(dbName);
    }
    catch (SQLException ex)
    {
      throw new DBException(ex);
    }
  }

  protected void initDatabase(String dbName)
  {
    dropDatabase(dbName);

    Connection connection = null;
    Statement stmt = null;

    try
    {
      connection = getSetupConnection();
      stmt = connection.createStatement();
      initDatabase(connection, stmt, dbName);
    }
    catch (SQLException ignore)
    {
    }
    finally
    {
      DBUtil.close(stmt);
      DBUtil.close(connection);
    }
  }

  protected void initDatabase(Connection connection, Statement stmt, String dbName) throws SQLException
  {
    stmt.execute("CREATE DATABASE " + dbName);
  }

  protected void dropDatabase(String dbName)
  {
    Connection connection = null;
    Statement stmt = null;

    try
    {
      connection = getSetupConnection();
      stmt = connection.createStatement();
      dropDatabase(connection, stmt, dbName);
    }
    catch (SQLException ignore)
    {
    }
    finally
    {
      DBUtil.close(stmt);
      DBUtil.close(connection);
    }
  }

  protected void dropDatabase(Connection connection, Statement stmt, String dbName) throws SQLException
  {
    stmt.execute("DROP DATABASE " + dbName);
  }

  protected final Connection getSetupConnection()
  {
    try
    {
      return getSetupDataSource().getConnection();
    }
    catch (SQLException ex)
    {
      throw new DBException(ex);
    }
  }

  protected final DataSource getSetupDataSource() throws SQLException
  {
    if (setupDataSource == null)
    {
      setupDataSource = createDataSourceForDB(null);
    }

    return setupDataSource;
  }

  /**
   * Note that <code>dbName</code> can be <code>null</code>, in which case a <i>setup</i> datasource must be returned.
   * A connection from a setup datasource can be used to create or drop other databases.
   */
  protected abstract DataSource createDataSourceForDB(String dbName) throws SQLException;
}

Back to the top