|
|
| version 1.5, 2005/03/21 10:32:03 | version 1.13, 2005/05/02 12:45:36 |
|---|---|
| Line 29 import java.sql.ResultSet; | Line 29 import java.sql.ResultSet; |
| import java.sql.SQLException; | import java.sql.SQLException; |
| import java.sql.Statement; | import java.sql.Statement; |
| import java.sql.Types; | import java.sql.Types; |
| import java.text.DateFormat; | |
| import java.text.ParseException; | import java.text.ParseException; |
| import java.util.ArrayList; | import java.util.ArrayList; |
| import java.util.Date; | |
| import java.util.Hashtable; | import java.util.Hashtable; |
| import java.util.Iterator; | import java.util.Iterator; |
| import java.util.List; | import java.util.List; |
| Line 47 import com.exploringxml.xml.Xparse; | Line 49 import com.exploringxml.xml.Xparse; |
| class Convert | class Convert |
| { | { |
| private static final String _TEMP = "_temp"; | |
| /** | /** |
| * Helper class for index creation | * Helper class for index creation |
| * | * |
| Line 93 class Convert | Line 97 class Convert |
| public void executeCommand() throws SQLException, Exception | public void executeCommand() throws SQLException, Exception |
| { | { |
| System.out.println("Executing command: \n"); | |
| System.out.println(command); | |
| java.sql.Connection con = bean.getConnection(); | java.sql.Connection con = bean.getConnection(); |
| Statement stm = con.createStatement(); | Statement stm = con.createStatement(); |
| stm.execute(command); | stm.execute(command); |
| stm.close(); | |
| } | } |
| } | } |
| Line 129 class Convert | Line 137 class Convert |
| static Vector postSQLCommands = new Vector(); | static Vector postSQLCommands = new Vector(); |
| static final String versionID = new String("FM2SQL Version 0.9.6b\n"); | |
| private static boolean noError = false; | |
| public static void main(String args[]) throws IOException | 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"); // | * try { //byte[] b = "�".getBytes("UTF-8"); // |
| * System.out.println("QueryString " +b[0]+" "+b[1]+(new | * System.out.println("QueryString " +b[0]+" "+b[1]+(new |
| Line 138 class Convert | Line 154 class Convert |
| * //System.out.println(new String(b,"UTF-8")); } catch | * //System.out.println(new String(b,"UTF-8")); } catch |
| * (UnsupportedEncodingException e) { e.printStackTrace(); } | * (UnsupportedEncodingException e) { e.printStackTrace(); } |
| */ | */ |
| File tmpPath = new File(System.getProperty("java.io.tmpdir")); | |
| isGUI = false; | isGUI = false; |
| FileOutputStream file = null; | FileOutputStream file = null; |
| if (args.length != 1) | if (args.length != 1) |
| { | { |
| System.out.println(versionID); | |
| System.out.println("Usage: java Convert <xml config file>"); | System.out.println("Usage: java Convert <xml config file>"); |
| System.exit(-1); | System.exit(-1); |
| } | } |
| File temp = null; | |
| try | 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); | file = new FileOutputStream(temp); |
| } catch (FileNotFoundException e1) | } catch (FileNotFoundException e1) |
| { | { |
| e1.printStackTrace(); | e1.printStackTrace(); |
| } | } |
| PrintStream stream = new PrintStream(file, true); | 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) | if (!debug) |
| { | { |
| System.setOut(stream); | System.setOut(stream); |
| System.setErr(stream); | System.setErr(stream); |
| } | } |
| System.out.println(versionID); | |
| System.out.println("Using config file : " + args[0] + "...."); | |
| StringBuffer sb = readXMLFile(args[0]); | StringBuffer sb = readXMLFile(args[0]); |
| parseXMLConfig(sb); | parseXMLConfig(sb); |
| if (!(new File(args[0]).exists())) | if (!(new File(args[0]).exists())) |
| System.exit(0); | { |
| System.exit(0); | |
| } | |
| System.out.println("Finished!"); | System.out.println("Finished!"); |
| // convert("jdbc:fmpro:http://141.14.237.74:8050","jdbc:postgresql://erebos/test",null,null); | // convert("jdbc:fmpro:http://141.14.237.74:8050","jdbc:postgresql://erebos/test",null,null); |
| } | } |
| Line 238 class Convert | Line 272 class Convert |
| String layout = (layouts.isEmpty()) ? "" : layouts.get(tbIndex).toString(); | String layout = (layouts.isEmpty()) ? "" : layouts.get(tbIndex).toString(); |
| query = (selects != null) ? selects.get(tbIndex).toString() : query; | query = (selects != null) ? selects.get(tbIndex).toString() : query; |
| // if vectors[1].get(i) != null) | // if vectors[1].get(i) != null) |
| if (layout != "") | if (!layout.equals("")) |
| { | { |
| query = addLayoutToQuery(names, query, tbIndex, layout); | query = addLayoutToQuery(names, query, tbIndex, layout); |
| } | } |
| Line 417 class Convert | Line 452 class Convert |
| public static void convert(String source, String destination, Vector names, Vector layouts, | public static void convert(String source, String destination, Vector names, Vector layouts, |
| Vector selects, Vector creates, Vector ids, int mode, String delimiter) throws Exception | Vector selects, Vector creates, Vector ids, int mode, String delimiter) throws Exception |
| { | { |
| // TODO implement convert_temp mode!!! | |
| FM2SQL.ProgressDialog dialog = null; | FM2SQL.ProgressDialog dialog = null; |
| if (isGUI) | if (isGUI) |
| Line 462 class Convert | Line 497 class Convert |
| String layout = (layouts.isEmpty()) ? "" : layouts.get(tbIndex).toString(); | String layout = (layouts.isEmpty()) ? "" : layouts.get(tbIndex).toString(); |
| query = (selects != null) ? selects.get(tbIndex).toString() : "select * from " | query = (selects != null) ? selects.get(tbIndex).toString() : "select * from " |
| + bean.getQC() + names.get(tbIndex).toString() + bean.getQC(); | + bean.getQC() + names.get(tbIndex).toString() + bean.getQC(); |
| if (layout != "") | if (layout.intern() != "") |
| { | { |
| query = addLayoutToQuery(names, query, tbIndex, layout); | query = addLayoutToQuery(names, query, tbIndex, layout); |
| Line 502 class Convert | Line 537 class Convert |
| ConversionProperties prop = getFieldNamesAndDestTableName(creates.get(tbIndex).toString(), | ConversionProperties prop = getFieldNamesAndDestTableName(creates.get(tbIndex).toString(), |
| query, names.get(tbIndex).toString()); | query, names.get(tbIndex).toString()); |
| destTableName = prop.destTableName; | destTableName = prop.destTableName; |
| if (mode == Convert.DataBase.CONVERT_TEMP_MODE) | |
| { | |
| destTableName += _TEMP; | |
| } | |
| fieldNames = prop.fieldNames; | 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) | if (tables.indexOf(destTableName) >= 0) |
| Line 511 class Convert | Line 550 class Convert |
| stm.executeUpdate("drop table " + beanDest.getQC() + destTableName + beanDest.getQC()); | stm.executeUpdate("drop table " + beanDest.getQC() + destTableName + beanDest.getQC()); |
| tables.remove(destTableName); | tables.remove(destTableName); |
| System.out.println("dropped table" + destTableName); | System.out.println("dropped table" + destTableName); |
| } | } |
| if ((tables.indexOf(destTableName) < 0)) | if ((tables.indexOf(destTableName) < 0)) |
| { | { |
| Line 525 class Convert | Line 563 class Convert |
| command = new StringBuffer(50); | command = new StringBuffer(50); |
| command.append("CREATE TABLE "); | command.append("CREATE TABLE "); |
| command.append(beanDest.getQC()); | 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(beanDest.getQC()); |
| command.append("("); | command.append("("); |
| String type = null; | String type = null; |
| Line 577 class Convert | Line 615 class Convert |
| command.append(") "); | command.append(") "); |
| command.append(" values ( "); | command.append(" values ( "); |
| // add a question marks for every field | // add a question marks for every field |
| for (int i = 0; i < bean.getColumnNames().size() - 1; ++i) | for (int i = 0; i < bean.getColumnNames().size() - 1; ++i) |
| command.append("?,"); | command.append("?,"); |
| Line 674 class Convert | Line 711 class Convert |
| long startTime = System.currentTimeMillis(); | long startTime = System.currentTimeMillis(); |
| bean.makeQuery(query, 0); | bean.makeQuery(query, 0); |
| System.err.println("query for whole table done"); | |
| command = writeDatainDestTable(dialog, command, j, pstm, rowCount, delimiter); | command = writeDatainDestTable(dialog, command, j, pstm, rowCount, delimiter); |
| long endTime = System.currentTimeMillis(); | long endTime = System.currentTimeMillis(); |
| System.out.println("Time for old convert elapsed " + (endTime - startTime)); | System.out.println("Time for old convert elapsed " + (endTime - startTime)); |
| Line 681 class Convert | Line 719 class Convert |
| } | } |
| if (isGUI) | if (isGUI) |
| resetGUI(dialog); | 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.MEDIUM); | |
| d.setTimeZone(java.util.TimeZone.getTimeZone("CET")); | |
| String date = d.format(new Date()); | |
| date = date.replace(':', '_'); | |
| String newName = addQuotes(beanDest, convertText(originalName + "_" + date)); | |
| // rename table to newName | |
| renameTable(beanDest, addQuotes(beanDest, originalName), newName); | |
| } | |
| // rename Table_temp to originalName | |
| renameTable(beanDest, addQuotes(beanDest, destTableName), addQuotes(beanDest, | |
| originalName)); | |
| } | |
| } | } |
| } catch (Exception e) | } 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) | if (isGUI) |
| { | { |
| showExceptionDialog(dialog, command, e); | showExceptionDialog(dialog, command, e); |
| Line 694 class Convert | Line 753 class Convert |
| e.printStackTrace(); | 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(); | |
| } | } |
| /** | /** |
| Line 982 class Convert | Line 1058 class Convert |
| { | { |
| databases = getXMLConfig(sb); | databases = getXMLConfig(sb); |
| // destination DataBase object | |
| DataBase dbDest = ((DataBase) databases.lastElement()); | |
| DBBean database = ((DataBase) databases.lastElement()).bean; | DBBean database = ((DataBase) databases.lastElement()).bean; |
| databases.remove(databases.size() - 1); | databases.remove(databases.size() - 1); |
| for (Iterator iterator = dbDest.preCommands.iterator(); iterator.hasNext();) | |
| { | |
| SQLCommand sqlCommand = (SQLCommand) iterator.next(); | |
| sqlCommand.executeCommand(); | |
| } | |
| // databases.add(database); | // databases.add(database); |
| for (Iterator iter = databases.iterator(); iter.hasNext();) | for (Iterator iter = databases.iterator(); iter.hasNext();) |
| { | { |
| Line 994 class Convert | Line 1080 class Convert |
| sqlCommand.executeCommand(); | sqlCommand.executeCommand(); |
| } | } |
| int mode = db.mode; | 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) | if (mode == DataBase.CONVERT_MODE || mode == DataBase.APPEND_MODE) |
| convertBatch(db.bean, database, db.tables, db.layouts, db.selects, db.creates, db.ids, | convertBatch(db.bean, database, db.tables, db.layouts, db.selects, db.creates, db.ids, |
| mode, db.delimiter); | mode, db.delimiter); |
| Line 1024 class Convert | Line 1128 class Convert |
| } | } |
| } | } |
| for (Iterator iterator = dbDest.postCommands.iterator(); iterator.hasNext();) | |
| { | |
| SQLCommand sqlCommand = (SQLCommand) iterator.next(); | |
| sqlCommand.executeCommand(); | |
| } | |
| } catch (Exception e) | } catch (Exception e) |
| { | { |
| Line 1037 class Convert | Line 1146 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) | public static Vector getXMLConfig(StringBuffer sb) |
| { | { |
| Line 1143 class Convert | Line 1267 class Convert |
| else if (modeString.equals("synchronize")) | else if (modeString.equals("synchronize")) |
| mode = DataBase.SYNCHRONIZE_MODE; | mode = DataBase.SYNCHRONIZE_MODE; |
| else if (modeString.equals("convert_temp")) | |
| mode = DataBase.CONVERT_TEMP_MODE; | |
| // if(node3!=null) | // if(node3!=null) |
| // System.out.println(node3.name); | // System.out.println(node3.name); |
| Line 1184 class Convert | Line 1311 class Convert |
| id = ""; | id = ""; |
| if (name.equals("")) | if (name.equals("")) |
| throw new Error("parse error table tag attribute must not be empty"); | throw new Error("parse error table tag attribute must not be empty"); |
| tables.add(name); | tables.add(name.intern()); |
| layouts.add(layout); | layouts.add(layout.intern()); |
| ids.add(id); | ids.add(id.intern()); |
| String query = (node5 == null) ? "" : node5.getCharacters(); | String query = (node5 == null) ? "" : node5.getCharacters(); |
| if (query.equals("")) | if (query.equals("")) |
| System.err.println("Warning empty select tag or select tag missing !!"); | System.err.println("Warning empty select tag or select tag missing !!"); |
| Line 1430 class Convert | Line 1557 class Convert |
| final static int SYNCHRONIZE_MODE = 5; | final static int SYNCHRONIZE_MODE = 5; |
| final static int CONVERT_TEMP_MODE = 6; | |
| int mode = -1; | int mode = -1; |
| public DataBase(DBBean bean, Vector tables, Vector layouts, Vector selects, Vector creates, | public DataBase(DBBean bean, Vector tables, Vector layouts, Vector selects, Vector creates, |
| Line 1471 class Convert | Line 1600 class Convert |
| buffr.write(" <password>" + bean.passwd + "</password>\n"); | buffr.write(" <password>" + bean.passwd + "</password>\n"); |
| buffr.write(" <delimiter>" + delimiter + "</delimiter>\n"); | buffr.write(" <delimiter>" + delimiter + "</delimiter>\n"); |
| String modeString = ""; | String modeString = ""; |
| if (mode == CONVERT_MODE) | if (mode == CONVERT_TEMP_MODE) |
| modeString = "convert_temp"; | |
| else if (mode == CONVERT_MODE) | |
| modeString = "convert"; | modeString = "convert"; |
| else if (mode == APPEND_MODE) | else if (mode == APPEND_MODE) |
| modeString = "append"; | modeString = "append"; |
| Line 1496 class Convert | Line 1627 class Convert |
| while (count < preCommands.size()) | while (count < preCommands.size()) |
| { | { |
| SQLCommand sqlcommand=(SQLCommand)preCommands.get(count); | SQLCommand sqlcommand=(SQLCommand)preCommands.get(count); |
| buffr.write(" <sqlcommand execute=\"before\">" + sqlcommand.command + "</sqlcommand>\n"); | buffr.write(" <sqlcommand execute=\"before\">" + sqlcommand.command |
| + "</sqlcommand>\n"); | |
| count++; | count++; |
| } | } |
| } | } |
| Line 1507 class Convert | Line 1639 class Convert |
| { | { |
| SQLCommand sqlcommand=(SQLCommand)postCommands.get(count); | SQLCommand sqlcommand=(SQLCommand)postCommands.get(count); |
| buffr.write(" <sqlcommand execute=\"after\">" + sqlcommand.command + "</sqlcommand>\n"); | buffr.write(" <sqlcommand execute=\"after\">" + sqlcommand.command |
| + "</sqlcommand>\n"); | |
| count++; | count++; |
| } | } |
| } | } |
| Line 3638 class Convert | Line 3771 class Convert |
| // retrieve field_names from select statement | // retrieve field_names from select statement |
| // TODO problem with different fieldNames in create statement will | // TODO problem with different fieldNames in create statement will |
| // overwrite them | // overwrite them |
| if (query.indexOf("*") < 0) | if (query.indexOf("*") < 0 && create.equals(""))// quick hack for hartmut |
| { | { |
| int selectEndIndex = query.indexOf("from"); | int selectEndIndex = query.indexOf("from"); |
| StringTokenizer tokenizer = new StringTokenizer(query.substring(6, selectEndIndex), ","); | StringTokenizer tokenizer = new StringTokenizer(query.substring(6, selectEndIndex), ","); |
| Line 3677 class Convert | Line 3810 class Convert |
| // retrieve field_names from select statement | // retrieve field_names from select statement |
| if (query.indexOf("*") < 0) | if (query.indexOf("*") < 0) |
| { | { |
| int selectEndIndex = query.indexOf("from"); | int selectEndIndex = query.lastIndexOf("from"); |
| StringTokenizer tokenizer = new StringTokenizer(query.substring(6, selectEndIndex), ","); | StringTokenizer tokenizer = new StringTokenizer(query.substring(6, selectEndIndex), ","); |
| int numFields = tokenizer.countTokens(); | int numFields = tokenizer.countTokens(); |
| fieldNames = new String[numFields]; | fieldNames = new String[numFields]; |
| Line 3685 class Convert | Line 3818 class Convert |
| while (tokenizer.hasMoreTokens()) | while (tokenizer.hasMoreTokens()) |
| { | { |
| String fieldName = tokenizer.nextToken().trim(); | String fieldName = tokenizer.nextToken().trim(); |
| String text = convertText(fieldName); | |
| if (text.indexOf("\"") >= 0) | |
| fieldNames[fieldIndex] = convertText(fieldName); | |
| else | |
| fieldNames[fieldIndex] = beanDest.getQC() + convertText(fieldName) + beanDest.getQC(); | fieldNames[fieldIndex] = beanDest.getQC() + convertText(fieldName) + beanDest.getQC(); |
| // System.out.println("field "+ fieldNames[fieldIndex]); | // System.out.println("field "+ fieldNames[fieldIndex]); |
| fieldIndex++; | fieldIndex++; |
| Line 3830 class Convert | Line 3967 class Convert |
| // ****** end Test ****** | // ****** 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; | |
| } | |
| } | } |