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;
}
}