/** * Licensed to JumpMind Inc under one or more contributor * license agreements. See the NOTICE file distributed * with this work for additional information regarding * copyright ownership. JumpMind Inc licenses this file * to you under the GNU General Public License, version 3.0 (GPLv3) * (the "License"); you may not use this file except in compliance * with the License. * * You should have received a copy of the GNU General Public License, * version 3.0 (GPLv3) along with this library; if not, see * <http://www.gnu.org/licenses/>. * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.jumpmind.symmetric; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import java.util.Properties; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.Options; import org.apache.commons.lang.ArrayUtils; import org.jumpmind.db.model.Table; import org.jumpmind.symmetric.common.ParameterConstants; import org.jumpmind.symmetric.io.data.DbFill; import org.jumpmind.symmetric.service.IParameterService; public class DbFillCommand extends AbstractCommandLauncher { private static final String OPTION_SCHEMA = "schema"; private static final String OPTION_CATALOG = "catalog"; private static final String OPTION_COUNT = "count"; private static final String OPTION_CASCADE = "cascade"; private static final String OPTION_IGNORE_TABLES = "ignore"; private static final String OPTION_PREFIXED_TABLES = "prefixed"; private static final String OPTION_INTERVAL = "interval"; private static final String OPTION_WEIGHTS = "weights"; private static final String OPTION_CONTINUE = "continue"; private static final String OPTION_PRINT = "print"; public DbFillCommand() { super("dbfill", "[tablename...]", "DbFill.Option."); } public static void main(String[] args) { new DbFillCommand().execute(args); } @Override protected boolean printHelpIfNoOptionsAreProvided() { return false; } @Override protected boolean requiresPropertiesFile() { return true; } @Override protected void printHelp(CommandLine cmd, Options options) { System.out.println(app + " version " + Version.version()); System.out.println("Fill database tables with random generated data.\n"); super.printHelp(cmd, options); } @Override protected void buildOptions(Options options) { super.buildOptions(options); addOption(options, null, OPTION_SCHEMA, true); addOption(options, null, OPTION_CATALOG, true); addOption(options, null, OPTION_COUNT, true); addOption(options, null, OPTION_CASCADE, false); addOption(options, null, OPTION_IGNORE_TABLES, true); addOption(options, null, OPTION_PREFIXED_TABLES, true); addOption(options, null, OPTION_INTERVAL, true); addOption(options, null, OPTION_WEIGHTS, true); addOption(options, null, OPTION_CONTINUE, false); addOption(options, null, OPTION_PRINT, false); } @Override protected boolean executeWithOptions(CommandLine line) throws Exception { DbFill dbFill = new DbFill(getDatabasePlatform(false)); if (line.hasOption(OPTION_SCHEMA)) { dbFill.setSchema(line.getOptionValue(OPTION_SCHEMA)); } if (line.hasOption(OPTION_CATALOG)) { dbFill.setCatalog(line.getOptionValue(OPTION_CATALOG)); } if (line.hasOption(OPTION_COUNT)) { dbFill.setRecordCount(Integer.parseInt(line.getOptionValue(OPTION_COUNT))); } if (line.hasOption(OPTION_CASCADE)) { dbFill.setCascading(true); } if (line.hasOption(OPTION_INTERVAL)) { dbFill.setInterval(Integer.parseInt(line.getOptionValue(OPTION_INTERVAL))); } if (line.hasOption(OPTION_WEIGHTS)) { int[] dmlWeight = {0,0,0}; String[] strWeight = line.getOptionValue(OPTION_WEIGHTS).split(","); if (strWeight != null && strWeight.length == 3) { for (int i=0; i<3; i++) { dmlWeight[i] = new Integer(strWeight[i]); } dbFill.setDmlWeight(dmlWeight); } } if (line.hasOption(OPTION_DEBUG)) { dbFill.setDebug(true); } if (line.hasOption(OPTION_VERBOSE_CONSOLE)) { dbFill.setVerbose(true); } String ignore[] = null; if (line.hasOption(OPTION_IGNORE_TABLES)) { ignore = line.getOptionValue(OPTION_IGNORE_TABLES).split(","); } String prefixed[] = null; if (line.hasOption(OPTION_PREFIXED_TABLES)) { prefixed = line.getOptionValue(OPTION_PREFIXED_TABLES).split(","); } if (line.hasOption(OPTION_CONTINUE)) { dbFill.setContinueOnError(true); } if (line.hasOption(OPTION_PRINT)) { dbFill.setPrint(true); } // Ignore the Symmetric config tables. getSymmetricEngine(); IParameterService parameterService = engine.getParameterService(); String cfgPrefix = parameterService.getString(ParameterConstants.RUNTIME_CONFIG_TABLE_PREFIX); dbFill.setIgnore((String[])ArrayUtils.add(ignore, cfgPrefix)); dbFill.setPrefixed(prefixed); Map<String,int[]> tableProperties = parseTableProperties(); // If tables are provided in the property file, ignore the tables provided at the command line. String[] tableNames = null; if (tableProperties.size() != 0) { tableNames = tableProperties.keySet().toArray(new String[0]); } else { tableNames = line.getArgs(); } if (!dbFill.getPrint()) { dbFill.fillTables(tableNames, tableProperties); } else { for (String tableName : tableNames) { Table table = platform.readTableFromDatabase(dbFill.getCatalogToUse(), dbFill.getSchemaToUse(), tableName); if (table != null) { for (int i = 0; i < dbFill.getRecordCount(); i++) { for (int j = 0; j < dbFill.getInsertWeight(); j++) { String sql = dbFill.createDynamicRandomInsertSql(table); System.out.println(sql); } for (int j = 0; j < dbFill.getUpdateWeight(); j++) { String sql = dbFill.createDynamicRandomUpdateSql(table); System.out.println(sql); } for (int j = 0; j < dbFill.getDeleteWeight(); j++) { String sql = dbFill.createDynamicRandomDeleteSql(table); System.out.println(sql); } } } } } return true; } private Map<String,int[]> parseTableProperties() { Map<String,int[]> tableProperties = new HashMap<String,int[]>(); Properties properties = engine.getProperties(); Enumeration<Object> keys = properties.keys(); while (keys.hasMoreElements()) { String key = (String) keys.nextElement(); String value = (String) properties.get(key); if (key.startsWith("fill.")) { String tableName = null; tableName = key.substring(key.lastIndexOf(".") + 1); int[] iudVal = new int[3]; int i = 0; for (String str : value.split(",")) { iudVal[i++] = Integer.valueOf(str).intValue(); } tableProperties.put(tableName, iudVal); } } return tableProperties; } }