/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2008, Open Source Geospatial Foundation (OSGeo)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library 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
* Lesser General Public License for more details.
*/
package org.geotools.gce.imagemosaic.jdbc;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* Utility class for generating ddl scripts for a specific spatial extension.
* The generated scripts should be used as a base for db setup. Manual
* verification for performance issues is necessary.
*
*
*
* @author mcr
*
*/
class DDLGenerator extends AbstractCmd {
private final static int DefaultPyramids = 0;
private final static String FN_CREATEMETA = "createmeta.sql";
private final static String FN_DROPMETA = "dropmeta.sql";
private final static String UsageInfo = "Generating DDL scripts\n"
+ "-config URLOrFile -spatialTNPrefix spatialTNPrefix [-tileTNPrefix tileTNPrefix]\n"
+ " [-pyramids pyramids] -statementDelim statementDelim [-srs srs ] -targetDir directory";
private final static String NotSuppord = "DDL generation not supported for type ";
private Config config;
private String spatialTNPrefix;
private String tileTNPrefix;
private int pyramids = DefaultPyramids;
private String statementDelim;
private Logger logger;
private DBDialect dbDialect;
private String srs;
private String targetDir;
/**
* Constructor
*
* @param config
* the config object
* @param spatialTNPrefix
* the prefix for spatial table names
* @param tileTNPrefix
* the prefix for tile table names
* @param pyramids
* number of pyramids
* @param statementDelim
* statement delimiter used in the scripts
* @param srs
* name of spatial reference system
* @param targetDir
* the target directory for the scripts
*/
DDLGenerator(Config config, String spatialTNPrefix, String tileTNPrefix,
int pyramids, String statementDelim, String srs, String targetDir) {
this.config = config;
this.pyramids = pyramids;
this.spatialTNPrefix = spatialTNPrefix;
this.tileTNPrefix = tileTNPrefix;
this.statementDelim = statementDelim;
this.srs = srs;
this.logger = Logger.getLogger(this.getClass().getName());
this.dbDialect = DBDialect.getDBDialect(config);
if (targetDir.endsWith(File.separator))
this.targetDir = targetDir;
else
this.targetDir = targetDir + File.separator;
}
/**
* Entry point, called from Toolbox class
*
* @param args
*/
public static void start(String[] args) {
Config config = null;
String spatialTNPrefix = null;
String tileTNPrefix = null;
String statementDelim = null;
String srs = null;
String targetDir = null;
int pyramids = DefaultPyramids;
for (int i = 0; i < args.length; i++) {
if (args[i].equals(CONFIGPARAM)) {
try {
config = Config.readFrom(getURLFromString(args[i + 1]));
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
if (config !=null && (config.getSpatialExtension()==SpatialExtension.GEORASTER ||
config.getSpatialExtension()==SpatialExtension.CUSTOM)) {
System.out.println(NotSuppord+config.getSpatialExtension());
System.exit(1);
}
i++;
} else if (args[i].equals(SPATIALTNPREFIXPARAM)) {
spatialTNPrefix = args[i + 1];
i++;
} else if (args[i].equals(TILETNPREFIXPARAM)) {
tileTNPrefix = args[i + 1];
i++;
} else if (args[i].equals("-statementDelim")) {
statementDelim = args[i + 1];
i++;
} else if (args[i].equals("-srs")) {
srs = args[i + 1];
i++;
} else if (args[i].equals("-pyramids")) {
pyramids = new Integer(args[i + 1]);
i++;
} else if (args[i].equals("-targetDir")) {
targetDir = args[i + 1];
i++;
} else {
System.out.println("Unkwnown option: " + args[i]);
System.exit(1);
}
}
if ((config == null) || (spatialTNPrefix == null)
|| (statementDelim == null)) {
System.out.println(UsageInfo);
System.exit(1);
}
if (targetDir == null) {
System.out.println("Must specify -targetDir ");
System.exit(1);
}
if (needsSpatialRegistry(config) && (srs == null)) {
System.out.println("Must specify -srs ");
System.exit(1);
}
DDLGenerator gen = new DDLGenerator(config, spatialTNPrefix,
tileTNPrefix, pyramids, statementDelim, srs, targetDir);
try {
gen.generate();
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
System.exit(0);
}
void generate() throws Exception {
writeCreateMeta();
writeDropMeta();
String fn = targetDir + "add_" + config.getCoverageName() + ".sql";
PrintWriter w = new PrintWriter(fn);
w.println();
writeFillMeta(w);
w.println();
writeCreateTables(w);
w.println();
writeRegister(w);
w.println();
writeCreateIndexes(w);
w.close();
if (logger.isLoggable(Level.INFO))
logger.info(fn + " generated");
fn = targetDir + "remove_" + config.getCoverageName() + ".sql";
w = new PrintWriter(fn);
w.println();
writeDropIndexes(w);
w.println();
writeUnRegister(w);
w.println();
writeDropTables(w);
w.println();
writeDeleteMeta(w);
w.close();
if (logger.isLoggable(Level.INFO))
logger.info(fn + " generated");
}
void writeFillMeta(PrintWriter w) throws IOException {
String statmentString = "INSERT INTO " + config.getMasterTable() + "("
+ config.getCoverageNameAttribute() + ","
+ config.getTileTableNameAtribute() + ","
+ config.getSpatialTableNameAtribute()
+ ") VALUES ('%s','%s','%s')";
for (int i = 0; i <= pyramids; i++) {
String stn = getTableName(spatialTNPrefix, i);
String ttn = (tileTNPrefix == null) ? stn : getTableName(
tileTNPrefix, i);
Object[] args = new Object[] { config.getCoverageName(), ttn, stn };
w.printf(statmentString, args);
w.println(statementDelim);
}
}
void writeDeleteMeta(PrintWriter w) throws IOException {
String statmentString = "DELETE FROM " + config.getMasterTable()
+ " WHERE " + config.getCoverageNameAttribute()
+ " = '%s' AND " + config.getTileTableNameAtribute()
+ " = '%s' AND " + config.getSpatialTableNameAtribute()
+ " = '%s' ";
for (int i = 0; i <= pyramids; i++) {
String stn = getTableName(spatialTNPrefix, i);
String ttn = (tileTNPrefix == null) ? stn : getTableName(
tileTNPrefix, i);
Object[] args = new Object[] { config.getCoverageName(), ttn, stn };
w.printf(statmentString, args);
w.println(statementDelim);
}
}
void writeCreateMeta() throws Exception {
PrintWriter w = new PrintWriter(targetDir + FN_CREATEMETA);
w.print(dbDialect.getCreateMasterStatement());
w.println(statementDelim);
w.close();
if (logger.isLoggable(Level.INFO))
logger.info(FN_CREATEMETA + " generated");
}
void writeCreateTables(PrintWriter w) throws Exception {
for (int i = 0; i <= pyramids; i++) {
if (tileTNPrefix == null) {
w.print(dbDialect
.getCreateSpatialTableStatementJoined(getTableName(
spatialTNPrefix, i)));
w.println(statementDelim);
} else {
w.print(dbDialect.getCreateSpatialTableStatement(getTableName(
spatialTNPrefix, i)));
w.println(statementDelim);
w.print(dbDialect.getCreateTileTableStatement(getTableName(
tileTNPrefix, i)));
w.println(statementDelim);
}
}
}
void writeCreateIndexes(PrintWriter w) throws Exception {
for (int i = 0; i <= pyramids; i++) {
w.print(dbDialect.getCreateIndexStatement(getTableName(
spatialTNPrefix, i)));
w.println(statementDelim);
}
}
void writeDropMeta() throws IOException {
PrintWriter w = new PrintWriter(targetDir + FN_DROPMETA);
w.print(dbDialect.getDropTableStatement(config.getMasterTable()));
w.println(statementDelim);
w.close();
if (logger.isLoggable(Level.INFO))
logger.info(FN_DROPMETA + " generated");
}
void writeDropTables(PrintWriter w) throws IOException {
for (int i = 0; i <= pyramids; i++) {
w.print(dbDialect.getDropTableStatement(getTableName(
spatialTNPrefix, i)));
w.println(statementDelim);
}
if (tileTNPrefix != null) {
w.println();
for (int i = 0; i <= pyramids; i++) {
w.print(dbDialect.getDropTableStatement(getTableName(
tileTNPrefix, i)));
w.println(statementDelim);
}
}
}
void writeDropIndexes(PrintWriter w) throws IOException {
for (int i = 0; i <= pyramids; i++) {
w.print(dbDialect.getDropIndexStatment(getTableName(
spatialTNPrefix, i)));
w.println(statementDelim);
}
}
static boolean needsSpatialRegistry(Config config) {
SpatialExtension type = config.getSpatialExtension();
if ((type == SpatialExtension.DB2)
|| (type == SpatialExtension.POSTGIS)
|| (type == SpatialExtension.ORACLE)) {
return true;
}
return false;
}
void writeRegister(PrintWriter w) throws IOException {
if (needsSpatialRegistry(config) == false) {
return;
}
for (int i = 0; i <= pyramids; i++) {
w.print(dbDialect.getRegisterSpatialStatement(getTableName(
spatialTNPrefix, i), srs));
w.println(statementDelim);
}
}
void writeUnRegister(PrintWriter w) throws IOException {
if (needsSpatialRegistry(config) == false) {
return;
}
for (int i = 0; i <= pyramids; i++) {
w.print(dbDialect.getUnregisterSpatialStatement(getTableName(
spatialTNPrefix, i)));
w.println(statementDelim);
}
}
}