--- FM2SQL/src/Convert.java 2005/03/21 10:32:03 1.5 +++ FM2SQL/src/Convert.java 2005/04/22 11:03:53 1.12 @@ -29,11 +29,14 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.sql.Types; +import java.text.DateFormat; import java.text.ParseException; import java.util.ArrayList; +import java.util.Date; import java.util.Hashtable; import java.util.Iterator; import java.util.List; +import java.util.Locale; import java.util.StringTokenizer; import java.util.TreeSet; import java.util.Vector; @@ -47,6 +50,8 @@ import com.exploringxml.xml.Xparse; class Convert { + private static final String _TEMP = "_temp"; + /** * Helper class for index creation * @@ -93,9 +98,13 @@ class Convert public void executeCommand() throws SQLException, Exception { + System.out.println("Executing command: \n"); + System.out.println(command); + java.sql.Connection con = bean.getConnection(); Statement stm = con.createStatement(); stm.execute(command); + stm.close(); } } @@ -129,8 +138,16 @@ class Convert static Vector postSQLCommands = new Vector(); + static final String versionID = new String("FM2SQL Version 0.9.5b\n"); + + private static boolean noError = false; + public static void main(String args[]) throws IOException { + // DateFormat d = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, + // Locale.GERMANY); + // System.out.println(convertText("rogoistSuper" + "_" + d.format(new Date()).replace(':', '_'))); + /* * try { //byte[] b = "�".getBytes("UTF-8"); // * System.out.println("QueryString " +b[0]+" "+b[1]+(new @@ -138,32 +155,50 @@ class Convert * //System.out.println(new String(b,"UTF-8")); } catch * (UnsupportedEncodingException e) { e.printStackTrace(); } */ + File tmpPath = new File(System.getProperty("java.io.tmpdir")); isGUI = false; FileOutputStream file = null; if (args.length != 1) { + System.out.println(versionID); System.out.println("Usage: java Convert "); System.exit(-1); } + File temp = null; try { - File temp = File.createTempFile("fm2sql", ".txt"); + temp = new File(tmpPath, "fm2sql.txt"); + int count = 1; + while (temp.exists()) + { + temp = new File(tmpPath, "fm2sql" + generateSuffix(count++) + ".txt"); + } file = new FileOutputStream(temp); } catch (FileNotFoundException e1) { e1.printStackTrace(); } PrintStream stream = new PrintStream(file, true); + // write info for user to stdout + System.out.println(versionID); + System.out.println("Loading " + args[0] + "...."); + System.out.println("Log will be written to " + temp.getCanonicalPath()); + if (!debug) { System.setOut(stream); System.setErr(stream); } + System.out.println(versionID); + System.out.println("Using config file : " + args[0] + "...."); + StringBuffer sb = readXMLFile(args[0]); parseXMLConfig(sb); if (!(new File(args[0]).exists())) - System.exit(0); + { + System.exit(0); + } System.out.println("Finished!"); // convert("jdbc:fmpro:http://141.14.237.74:8050","jdbc:postgresql://erebos/test",null,null); } @@ -238,8 +273,9 @@ class Convert String layout = (layouts.isEmpty()) ? "" : layouts.get(tbIndex).toString(); query = (selects != null) ? selects.get(tbIndex).toString() : query; // if vectors[1].get(i) != null) - if (layout != "") + if (!layout.equals("")) { + query = addLayoutToQuery(names, query, tbIndex, layout); } @@ -417,7 +453,7 @@ class Convert public static void convert(String source, String destination, Vector names, Vector layouts, Vector selects, Vector creates, Vector ids, int mode, String delimiter) throws Exception { - + // TODO implement convert_temp mode!!! FM2SQL.ProgressDialog dialog = null; if (isGUI) @@ -462,7 +498,7 @@ class Convert String layout = (layouts.isEmpty()) ? "" : layouts.get(tbIndex).toString(); query = (selects != null) ? selects.get(tbIndex).toString() : "select * from " + bean.getQC() + names.get(tbIndex).toString() + bean.getQC(); - if (layout != "") + if (layout.intern() != "") { query = addLayoutToQuery(names, query, tbIndex, layout); @@ -502,8 +538,12 @@ class Convert ConversionProperties prop = getFieldNamesAndDestTableName(creates.get(tbIndex).toString(), query, names.get(tbIndex).toString()); destTableName = prop.destTableName; + if (mode == Convert.DataBase.CONVERT_TEMP_MODE) + { + destTableName += _TEMP; + } fieldNames = prop.fieldNames; - if (mode == Convert.DataBase.CONVERT_MODE) + if (mode == Convert.DataBase.CONVERT_MODE || mode == Convert.DataBase.CONVERT_TEMP_MODE) { if (tables.indexOf(destTableName) >= 0) @@ -511,7 +551,6 @@ class Convert stm.executeUpdate("drop table " + beanDest.getQC() + destTableName + beanDest.getQC()); tables.remove(destTableName); System.out.println("dropped table" + destTableName); - } if ((tables.indexOf(destTableName) < 0)) { @@ -525,7 +564,7 @@ class Convert command = new StringBuffer(50); command.append("CREATE TABLE "); command.append(beanDest.getQC()); - command.append(convertText((String) names.get(tbIndex))); + command.append(destTableName);//convertText((String) names.get(tbIndex))); command.append(beanDest.getQC()); command.append("("); String type = null; @@ -577,7 +616,6 @@ class Convert command.append(") "); command.append(" values ( "); - // add a question marks for every field for (int i = 0; i < bean.getColumnNames().size() - 1; ++i) command.append("?,"); @@ -674,6 +712,7 @@ class Convert long startTime = System.currentTimeMillis(); bean.makeQuery(query, 0); + System.err.println("query for whole table done"); command = writeDatainDestTable(dialog, command, j, pstm, rowCount, delimiter); long endTime = System.currentTimeMillis(); System.out.println("Time for old convert elapsed " + (endTime - startTime)); @@ -681,10 +720,29 @@ class Convert } if (isGUI) resetGUI(dialog); + noError = true; + if (mode == Convert.DataBase.CONVERT_TEMP_MODE) + { + String originalName = destTableName.split(_TEMP)[0]; + // TODO + if (beanDest.getTableNames().contains(originalName)) + { + DateFormat d = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT); + d.setTimeZone(java.util.TimeZone.getTimeZone("CET")); + + String date = d.format(new Date()); + date = date.replace(':', '_'); + renameTable(beanDest, addQuotes(beanDest, originalName), addQuotes(beanDest, + convertText(originalName + "_" + date))); + } + renameTable(beanDest, addQuotes(beanDest, destTableName), addQuotes(beanDest, + originalName)); + } } } catch (Exception e) { - System.out.println("Error while connecting to database " + e); + System.out.println("Error while connecting to database " + e.getMessage()); + noError = false; if (isGUI) { showExceptionDialog(dialog, command, e); @@ -694,11 +752,28 @@ class Convert e.printStackTrace(); } + } catch (Error e) + { + noError = false; + + System.out.println(e); + e.printStackTrace(); } } /** + * + * @param beanDest2 + * @param originalName + * @return + */ + private static String addQuotes(DBBean bean, String originalName) + { + return bean.getQC() + originalName + bean.getQC(); + } + + /** * @param names * @param dialog * @param tbIndex @@ -981,9 +1056,19 @@ class Convert try { databases = getXMLConfig(sb); - + + // destination DataBase object + DataBase dbDest = ((DataBase) databases.lastElement()); + DBBean database = ((DataBase) databases.lastElement()).bean; databases.remove(databases.size() - 1); + + for (Iterator iterator = dbDest.preCommands.iterator(); iterator.hasNext();) + { + SQLCommand sqlCommand = (SQLCommand) iterator.next(); + sqlCommand.executeCommand(); + } + // databases.add(database); for (Iterator iter = databases.iterator(); iter.hasNext();) { @@ -994,6 +1079,24 @@ class Convert sqlCommand.executeCommand(); } int mode = db.mode; + if (mode == DataBase.CONVERT_TEMP_MODE) + { + convertBatch(db.bean, database, db.tables, db.layouts, db.selects, db.creates, db.ids, + mode, db.delimiter); + if (noError) + { + System.out.println("no Error occured "); + // db.bean.setURL(database.url); + // db.bean.setUserAndPasswd(database.user,database.passwd); + // + // Convert.user = db.bean.user; + // Convert.passwd = db.bean.passwd; + // userDest = database.user; + // passwdDest = database.passwd; + // synchronize(db.bean.url, database.url, db.tables, db.layouts, db.selects, db.creates, + // db.ids, mode, db.delimiter, new Vector(db.htIndex.values())); + } + } if (mode == DataBase.CONVERT_MODE || mode == DataBase.APPEND_MODE) convertBatch(db.bean, database, db.tables, db.layouts, db.selects, db.creates, db.ids, mode, db.delimiter); @@ -1024,6 +1127,11 @@ class Convert } } + for (Iterator iterator = dbDest.postCommands.iterator(); iterator.hasNext();) + { + SQLCommand sqlCommand = (SQLCommand) iterator.next(); + sqlCommand.executeCommand(); + } } catch (Exception e) { @@ -1037,6 +1145,21 @@ class Convert } } + /** + * + * @param database + * @param db + * @throws Exception + * @throws SQLException + */ + private static void renameTable(DBBean database, String sourceTable, String destTable) + throws SQLException, Exception + { + String command = "alter table " + sourceTable + " rename " + " to " + destTable; + SQLCommand sqlCommand = new SQLCommand(database, command); + sqlCommand.executeCommand(); + } + public static Vector getXMLConfig(StringBuffer sb) { @@ -1143,6 +1266,9 @@ class Convert else if (modeString.equals("synchronize")) mode = DataBase.SYNCHRONIZE_MODE; + else if (modeString.equals("convert_temp")) + mode = DataBase.CONVERT_TEMP_MODE; + // if(node3!=null) // System.out.println(node3.name); @@ -1184,9 +1310,9 @@ class Convert id = ""; if (name.equals("")) throw new Error("parse error table tag attribute must not be empty"); - tables.add(name); - layouts.add(layout); - ids.add(id); + tables.add(name.intern()); + layouts.add(layout.intern()); + ids.add(id.intern()); String query = (node5 == null) ? "" : node5.getCharacters(); if (query.equals("")) System.err.println("Warning empty select tag or select tag missing !!"); @@ -1404,7 +1530,7 @@ class Convert Vector layouts; - Vector tables=new Vector(); + Vector tables = new Vector(); Vector ids; @@ -1430,6 +1556,8 @@ class Convert final static int SYNCHRONIZE_MODE = 5; + final static int CONVERT_TEMP_MODE = 6; + int mode = -1; public DataBase(DBBean bean, Vector tables, Vector layouts, Vector selects, Vector creates, @@ -1495,8 +1623,9 @@ class Convert { while (count < preCommands.size()) { - SQLCommand sqlcommand=(SQLCommand)preCommands.get(count); - buffr.write(" " + sqlcommand.command + "\n"); + SQLCommand sqlcommand = (SQLCommand) preCommands.get(count); + buffr.write(" " + sqlcommand.command + + "\n"); count++; } } @@ -1505,9 +1634,10 @@ class Convert count = 0; while (count < postCommands.size()) { - SQLCommand sqlcommand=(SQLCommand)postCommands.get(count); - - buffr.write(" " + sqlcommand.command + "\n"); + SQLCommand sqlcommand = (SQLCommand) postCommands.get(count); + + buffr.write(" " + sqlcommand.command + + "\n"); count++; } } @@ -3638,7 +3768,7 @@ class Convert // retrieve field_names from select statement // TODO problem with different fieldNames in create statement will // overwrite them - if (query.indexOf("*") < 0) + if (query.indexOf("*") < 0 && create.equals(""))// quick hack for hartmut { int selectEndIndex = query.indexOf("from"); StringTokenizer tokenizer = new StringTokenizer(query.substring(6, selectEndIndex), ","); @@ -3677,7 +3807,7 @@ class Convert // retrieve field_names from select statement if (query.indexOf("*") < 0) { - int selectEndIndex = query.indexOf("from"); + int selectEndIndex = query.lastIndexOf("from"); StringTokenizer tokenizer = new StringTokenizer(query.substring(6, selectEndIndex), ","); int numFields = tokenizer.countTokens(); fieldNames = new String[numFields]; @@ -3685,7 +3815,11 @@ class Convert while (tokenizer.hasMoreTokens()) { String fieldName = tokenizer.nextToken().trim(); - fieldNames[fieldIndex] = beanDest.getQC() + convertText(fieldName) + beanDest.getQC(); + String text = convertText(fieldName); + if (text.indexOf("\"") >= 0) + fieldNames[fieldIndex] = convertText(fieldName); + else + fieldNames[fieldIndex] = beanDest.getQC() + convertText(fieldName) + beanDest.getQC(); // System.out.println("field "+ fieldNames[fieldIndex]); fieldIndex++; } @@ -3830,4 +3964,17 @@ class Convert // ****** end Test ****** } + + public final static String generateSuffix(final int step) + { + String fileString = null; + if (step < 10) + fileString = "00" + step; + else if (step < 100) + fileString = "0" + step; + else + fileString = step + ""; + return fileString; + } + } \ No newline at end of file