com.tesora.dve.sql.util.StorageGroupDDL.java Source code

Java tutorial

Introduction

Here is the source code for com.tesora.dve.sql.util.StorageGroupDDL.java

Source

package com.tesora.dve.sql.util;

/*
 * #%L
 * Tesora Inc.
 * Database Virtualization Engine
 * %%
 * Copyright (C) 2011 - 2014 Tesora Inc.
 * %%
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License, version 3,
 * as published by the Free Software Foundation.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU Affero General Public License for more details.
 * 
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 * #L%
 */

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.StringUtils;

import com.tesora.dve.common.catalog.TestCatalogHelper;
import com.tesora.dve.exceptions.PEException;
import com.tesora.dve.sql.SchemaTest;
import com.tesora.dve.sql.SchemaTest.TempTableChecker;
import com.tesora.dve.sql.util.Functional;
import com.tesora.dve.sql.util.UnaryFunction;

public class StorageGroupDDL extends TestDDL {

    private String siteKern;
    private int nsites;
    private String name;
    private int holdBack;
    private boolean throwDropGroupInUseException = true;

    public StorageGroupDDL(String kern, int maxsites, String groupName) {
        this(kern, maxsites, 0, groupName);
    }

    public StorageGroupDDL(String kern, int maxsites, int holdback, String groupName) {
        siteKern = kern;
        nsites = maxsites;
        name = groupName;
        this.holdBack = holdback;
    }

    public String getName() {
        return name;
    }

    public String getAddGenerations() throws Exception {
        if (holdBack == 0 || (nsites - holdBack) == 0)
            return null;
        ArrayList<String> names = new ArrayList<String>();
        for (int i = 1; i <= holdBack; i++) {
            String siteName = siteKern + (nsites - i);
            names.add(siteName);
        }
        return "alter persistent group " + name + " add generation " + Functional.join(names, ",");
    }

    @Override
    public List<String> getCreateStatements() throws Exception {
        ArrayList<String> buf = new ArrayList<String>();
        if (isCreated())
            return buf;
        ArrayList<String> siteNames = new ArrayList<String>();
        for (int i = 0; i < nsites; i++) {
            String sname = siteKern + i;
            siteNames.add(sname);
            // create all the sites up front
            buf.add("create persistent site " + sname + " url='"
                    + TestCatalogHelper.getInstance().getCatalogBaseUrl() + "' user='"
                    + TestCatalogHelper.getInstance().getCatalogUser() + "' password='"
                    + TestCatalogHelper.getInstance().getCatalogPassword() + "'");
        }
        if (holdBack > 0 && siteNames.size() > holdBack) {
            // we're going to hold back the trailing sites
            int lim = siteNames.size() - holdBack;
            while (siteNames.size() > lim)
                siteNames.remove(siteNames.size() - 1);
        }
        buf.add("create persistent group " + name + " add " + Functional.join(siteNames, ","));
        setCreated();
        return buf;
    }

    public List<String> getSetupDrops(String dbname) {
        return Functional.apply(getPhysicalSiteNames(dbname), new UnaryFunction<String, String>() {

            @Override
            public String evaluate(String object) {
                return "DROP DATABASE IF EXISTS " + object;
            }

        });
    }

    public List<String> getPhysicalSiteNames(String dbname) {
        ArrayList<String> buf = new ArrayList<String>();
        for (int i = 0; i < nsites; i++) {
            buf.add(SchemaTest.buildDBName(siteKern, i, dbname));
        }
        return buf;
    }

    public TempTableChecker buildTempTableChecker(String dbName) {
        return new TempTableChecker(siteKern, nsites, dbName);
    }

    @Override
    public List<String> getDestroyStatements() throws Exception {
        return null;
    }

    @Override
    public List<String> getSetupDrops() {
        throw new IllegalStateException("persistent group does not have setup drops");
    }

    @Override
    public void destroy(ConnectionResource mr) throws Throwable {
        if (!isCreated())
            return;
        try {
            // drop the group
            mr.execute("drop persistent group " + name);
            // and also drop all the sites
            for (int i = 0; i < nsites; i++)
                mr.execute("drop persistent site " + siteKern + i);
            clearCreated();
        } catch (PEException e) {
            if (!throwDropGroupInUseException
                    && (StringUtils.containsIgnoreCase(e.getMessage(), "Unable to drop persistent group")
                            && StringUtils.containsIgnoreCase(e.getMessage(), "because used by database"))) {
                // eat the exception
            } else {
                throw e;
            }
        }
    }

    public StorageGroupDDL setThrowDropGroupInUseException(boolean value) {
        this.throwDropGroupInUseException = value;
        return this;
    }
}