Annotation of FM2SQL/Convert.java, revision 1.76
1.51 rogo 1: /*
2: * Convert.java -- Converter class - Filemaker to SQL Converter
1.52 rogo 3: * Copyright (C) 2003 Robert Gordesch (rogo@mpiwg-berlin.mpg.de)
1.51 rogo 4: * This program is free software; you can redistribute it and/or modify it
5: * under the terms of the GNU General Public License as published by the Free
6: * Software Foundation; either version 2 of the License, or (at your option)
7: * any later version. Please read license.txt for the full details. A copy of
8: * the GPL may be found at http://www.gnu.org/copyleft/lgpl.html You should
9: * have received a copy of the GNU General Public License along with this
10: * program; if not, write to the Free Software Foundation, Inc., 59 Temple
11: * Place, Suite 330, Boston, MA 02111-1307 USA Created on 15.09.2003 by
12: * rogo
13: */
14:
1.1 rogo 15: import java.awt.Cursor;
16: import java.io.BufferedReader;
17: import java.io.BufferedWriter;
18: import java.io.File;
19: import java.io.FileInputStream;
20: import java.io.FileNotFoundException;
21: import java.io.FileOutputStream;
1.60 rogo 22: import java.io.InputStream;
1.1 rogo 23: import java.io.InputStreamReader;
24: import java.io.OutputStreamWriter;
25: import java.io.PrintStream;
26: import java.io.UnsupportedEncodingException;
1.60 rogo 27: import java.net.URL;
1.57 rogo 28: import java.sql.PreparedStatement;
29: import java.sql.SQLException;
30: import java.sql.Statement;
31: import java.sql.Types;
1.66 rogo 32: import java.text.ParseException;
1.57 rogo 33: import java.util.ArrayList;
1.69 rogo 34: import java.util.Hashtable;
1.57 rogo 35: import java.util.Iterator;
36: import java.util.List;
37: import java.util.StringTokenizer;
38: import java.util.TreeSet;
39: import java.util.Vector;
1.1 rogo 40:
41: import com.exploringxml.xml.Node;
42: import com.exploringxml.xml.Xparse;
43:
1.34 rogo 44: class Convert
1.1 rogo 45: {
1.69 rogo 46: /**Helper class for index creation
47: * @author rogo
48: *
49: */
50: public static class IndexList extends Vector
51: {
52: public String toString()
53: {
54: StringBuffer buff = new StringBuffer(1000);
55: int count = 0;
56: for (Iterator iter = this.iterator(); iter.hasNext();)
57: {
58: String element = (String) iter.next();
1.71 rogo 59: if (count < elementCount - 1)
1.69 rogo 60: {
61: buff.append(element).append(", ");
62: count++;
63: } else
64: buff.append(element);
65:
66: }
67:
68: return buff.toString();
69: }
70: }
1.34 rogo 71: static DBBean bean = new DBBean();
72: static DBBean beanDest = new DBBean();
1.1 rogo 73:
1.34 rogo 74: static String user = "", passwd = "e1nste1n";
75: static String userDest = "postgres", passwdDest = "rogo";
76: static boolean batchRun = false;
1.1 rogo 77: static Vector databases = new Vector();
1.30 rogo 78: final static int numHits = 5000;
1.74 rogo 79: final static int numIntervalls = 4;
1.76 ! rogo 80: static boolean debug = false;
1.1 rogo 81: public static void main(String args[])
82: {
1.34 rogo 83: /* try
84: {
85: //byte[] b = "ö".getBytes("UTF-8");
86: // System.out.println("QueryString " +b[0]+" "+b[1]+(new String(b).getBytes()[0])+" "+new String(b).getBytes()[1]);
87: //System.out.println(new String(b,"UTF-8"));
88: } catch (UnsupportedEncodingException e)
89: {
90: e.printStackTrace();
91: }*/
1.1 rogo 92: FileOutputStream file = null;
1.34 rogo 93: if (args.length != 1)
1.1 rogo 94: {
1.34 rogo 95: System.out.println("Usage: java Convert <xml config file>");
96: System.exit(-1);
1.1 rogo 97: }
98: try
99: {
100: file = new FileOutputStream("./log.txt");
101: } catch (FileNotFoundException e1)
102: {
103: e1.printStackTrace();
1.34 rogo 104: }
1.76 ! rogo 105: PrintStream stream = new PrintStream(file, false);
! 106: if (!debug)
1.73 rogo 107: {
108: System.setOut(stream);
109: System.setErr(stream);
110: }
1.34 rogo 111: readXMLFile(args[0]);
1.60 rogo 112: if (!(new File(args[0]).exists()))
113: System.exit(0);
114:
1.34 rogo 115: System.out.println("Finished!");
1.1 rogo 116: //convert("jdbc:fmpro:http://141.14.237.74:8050","jdbc:postgresql://erebos/test",null,null);
117: }
1.55 rogo 118: public static void convertBatch(DBBean source, DBBean destination, Vector names, Vector layouts, Vector selects, Vector creates, Vector ids, int mode, String delimiter) throws Exception
1.1 rogo 119: {
1.34 rogo 120: bean = source;
121: beanDest = destination;
1.55 rogo 122: convert(null, null, names, layouts, selects, creates, ids, mode, delimiter);
123: if (true)
124: return;
1.34 rogo 125: StringBuffer command = null;
1.1 rogo 126: try
127: {
128: bean.setConnection(source.url);
1.34 rogo 129: if (names == null)
130: names = bean.getTableNames();
1.1 rogo 131: //Collections.sort(names);
1.34 rogo 132: int tbIndex = 1;
133:
134: for (tbIndex = 0; tbIndex < names.size(); ++tbIndex)
1.1 rogo 135: {
136: Vector[] result = null;
1.34 rogo 137: try
1.1 rogo 138: {
1.34 rogo 139: String query = "select * from " + bean.getQC() + names.get(tbIndex).toString() + bean.getQC();
140: String layout = (layouts.isEmpty()) ? "" : layouts.get(tbIndex).toString();
141: query = (selects != null) ? selects.get(tbIndex).toString() : query;
142: //if vectors[1].get(i) != null)
143: if (!layout.equals(""))
144: {
145: System.out.println("before " + query + " table" + names.get(tbIndex));
146: layout = " layout " + bean.getQC() + layout + bean.getQC();
147: String name = names.get(tbIndex).toString();
148: StringBuffer queryLayout = new StringBuffer(query);
149: queryLayout.insert(queryLayout.indexOf(name) + name.length() + 1, " " + layout);
150: query = queryLayout.toString();
151: System.out.println("added layout " + query);
152:
153: }
154: System.out.println(" performing query " + query);
1.1 rogo 155: //result = bean.getQueryData(query, null, 0);
1.34 rogo 156: bean.getConnection();
157: bean.makeQuery(query, 0);
158: } catch (Exception e)
1.1 rogo 159: {
160: System.out.println(e.getMessage());
161: e.printStackTrace();
162: continue;
163: }
164: //beanDest.setConnection("jdbc:postgresql://erebos/test3");
165: beanDest.setConnection(destination.url);
166:
167: Statement stm = beanDest.getConnection().createStatement();
168:
169: Vector tables = beanDest.getTableNames();
1.34 rogo 170: // Collections.sort(tables);
171: System.out.println("converting table " + names.get(tbIndex) + " " + tables.indexOf(convertText((String) names.get(tbIndex)))); // "//beanDest.getTypeNames());
1.1 rogo 172: tables = beanDest.getTableNames();
173: // System.out.println(beanDest.getTableNames(beanDest.getCatalogs().get(2).toString()));
174: stm = beanDest.getConnection().createStatement();
175: // System.exit(0);
1.34 rogo 176: if (mode == Convert.DataBase.CONVERT_MODE)
1.1 rogo 177: {
1.34 rogo 178: if (tables.indexOf(names.get(tbIndex)) >= 0)
179: {
180: stm.executeUpdate("drop table " + beanDest.getQC() + names.get(tbIndex) + beanDest.getQC());
181: tables.remove((String) names.get(tbIndex));
182: System.out.println("dropped table " + names.get(tbIndex));
183: } else if (tables.indexOf(convertText(names.get(tbIndex).toString())) >= 0)
1.1 rogo 184: {
1.34 rogo 185: stm.executeUpdate("drop table " + beanDest.getQC() + convertText((String) names.get(tbIndex)) + beanDest.getQC());
186: tables.remove(convertText((String) names.get(tbIndex)));
187: System.out.println("dropped table " + names.get(tbIndex));
188: }
189:
190: if (tables.indexOf(names.get(tbIndex)) < 0 && tables.indexOf(convertText(names.get(tbIndex).toString())) < 0)
1.1 rogo 191: {
1.34 rogo 192: if (creates.get(tbIndex).equals("") || creates.get(tbIndex).toString().toLowerCase().indexOf("create") < 0)
193: {
194: System.out.println("Warning empty or invalid create statement - creating one for you\n");
195:
196: command = new StringBuffer(50);
197: command.append("CREATE TABLE ");
198: command.append(beanDest.getQC());
199: command.append(convertText((String) names.get(tbIndex)));
200: command.append(beanDest.getQC());
201: command.append("(");
202: String type = null;
203: Vector columnNames = bean.getColumnNames();
204: for (int i = 0; i < columnNames.size() - 1; ++i)
205: {
206: type = bean.metaData.getColumnTypeName(i + 1);
207: // System.out.println(i+" "+result[1].get(i)+" "+type);
208: type = (type.equals("NUMBER")) ? "INT4" : type;
209: type = (type.equals("CONTAINER")) ? "TEXT" : type;
210:
211: command.append(beanDest.getQC() + convertText((String) columnNames.get(i)) + beanDest.getQC() + " " + type + ", ");
212: }
213: type = bean.metaData.getColumnTypeName(columnNames.size());
214: type = (type.equals("NUMBER")) ? "INT4" : type;
215: type = (type.equals("CONTAINER")) ? "TEXT" : type;
216: command.append(beanDest.getQC() + convertText((String) columnNames.get(columnNames.size() - 1)) + beanDest.getQC() + " " + type);
217: command.append(" )");
218: } else
219: command = new StringBuffer().append(creates.get(tbIndex).toString());
220:
221: System.out.println(command);
222: // System.exit(0);
223: //command.append(DBBean.getQC());
224: stm.executeUpdate(command.toString());
1.1 rogo 225:
1.34 rogo 226: }
1.1 rogo 227: }
1.34 rogo 228: Vector row = null;
229: command = new StringBuffer();
1.1 rogo 230:
231: command.append("INSERT INTO ");
232: command.append(beanDest.getQC());
233: command.append(convertText((String) names.get(tbIndex)));
234: command.append(beanDest.getQC());
235: command.append(" values ( ");
1.3 rogo 236:
1.34 rogo 237: for (int i = 0; i < bean.getColumnNames().size() - 1; ++i)
238: command.append("?,");
239: command.append("?)");
240: PreparedStatement pstm = beanDest.getConnection().prepareStatement(command.toString());
241: System.out.println(command);
242: while ((row = bean.getNextRow()) != null)
243: {
244: //print rows
245: Object obj = null;
246: for (int k = 0; k < row.size(); ++k)
247: {
248: obj = row.get(k);
249: if (obj instanceof ArrayList)
1.55 rogo 250: obj = formatFileMakerArray((List) obj, "\n");
1.34 rogo 251: String str = (obj == null) ? "NULL" : obj.toString();
252: if (!str.equals("NULL"))
253: pstm.setString(k + 1, str);
254: else
255: pstm.setNull(k + 1, Types.NULL);
256: }
257: pstm.execute();
258:
259: } // to for loop
260:
261: }
262: } catch (Exception e)
263: {
264: System.out.println("Error while connecting to database " + e);
265: //dialog.setVisible(false);
266: //dialog.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
267: //FM2SQL.fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
268: java.io.ByteArrayOutputStream b = new java.io.ByteArrayOutputStream();
269: java.io.PrintStream stream = new java.io.PrintStream(b);
270: stream.print(command + "\n\n");
271: e.printStackTrace(stream);
272: System.err.println(b);
273: //FM2SQL.showErrorDialog(b.toString(), "Error occured !");
274:
1.1 rogo 275: }
1.34 rogo 276: // dialog.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
277: //FM2SQL.fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
1.1 rogo 278:
1.34 rogo 279: // dialog.setVisible(false);
1.1 rogo 280: }
1.55 rogo 281: public static String formatFileMakerArray(List list, String delimiter)
282: {
283: StringBuffer formattedString = new StringBuffer();
284: for (int i = 0; i < list.size(); ++i)
285: {
286: formattedString.append(list.get(i).toString());
287: if (i < list.size() - 1)
288: formattedString.append(delimiter);
289: }
290: return formattedString.toString();
291: }
1.38 rogo 292: /**
293: * Method for SQL UPDATE
294: * @param source
295: * @param destination
296: * @param names
297: * @param layouts
298: * @param selects
299: * @param creates
300: * @param ids
301: * @param mode
302: * @throws Exception
303: */
1.34 rogo 304: public static void update(String source, String destination, Vector names, Vector layouts, Vector selects, Vector creates, Vector ids, int mode) throws Exception
1.12 rogo 305: {
306: FM2SQL.ProgressDialog dialog = null;
307: if (FM2SQL.fmInstance != null)
308: {
1.55 rogo 309: dialog = new FM2SQL.ProgressDialog(FM2SQL.fmInstance, bean);
1.12 rogo 310: dialog.setTitle("Conversion running ...");
311: dialog.title.setText("Getting table data ...");
312: dialog.setLocation(FM2SQL.fmInstance.getLocationOnScreen().x + (FM2SQL.fmInstance.getWidth() - 400) / 2, FM2SQL.fmInstance.getLocationOnScreen().y + (FM2SQL.fmInstance.getHeight() - 250) / 2);
313: dialog.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
314: FM2SQL.fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
315: dialog.thread = Thread.currentThread();
316: }
317: // setting user and passwd
318: bean.setUserAndPasswd(user, passwd);
319: // setting user and passwd
320: beanDest.setUserAndPasswd(userDest, passwdDest);
321: if (dialog != null)
322: dialog.setSize(400, 250);
323: StringBuffer command = null;
324: String query = null;
325: try
326: {
327: //bean.setConnection("jdbc:fmpro:http://141.14.237.74:8050");
328: //bean.setConnection("jdbc:postgresql://erebos/test","postgres","rogo");
329: bean.setConnection(source);
330: if (names == null)
331: names = bean.getTableNames();
332: // Collections.sort(names);
333: int tbIndex = 1;
1.55 rogo 334:
1.12 rogo 335: // System.out.println("Start at "+names.indexOf("archimedes_facsimiles"));
336: for (tbIndex = 0; tbIndex < names.size(); ++tbIndex)
337: {
338: Vector[] result = null;
1.45 rogo 339: String destTableName = "";
1.12 rogo 340: try
341: {
342: query = "select * from " + bean.getQC() + names.get(tbIndex).toString() + bean.getQC();
343: String layout = (layouts.isEmpty()) ? "" : layouts.get(tbIndex).toString();
344: query = (selects != null) ? selects.get(tbIndex).toString() : query;
345: //if vectors[1].get(i) != null)
346: if (layout != "")
347: {
348: layout = " layout " + bean.getQC() + layout + bean.getQC();
349: String name = names.get(tbIndex).toString();
350: StringBuffer queryLayout = new StringBuffer(query);
351: queryLayout.insert(queryLayout.indexOf(name) + name.length() + 1, " " + layout);
352: query = queryLayout.toString();
353: System.out.println("added layout " + query);
354:
355: }
356: dialog.title.setText("Getting table data ...");
357: dialog.table.setText(names.get(tbIndex).toString());
358: dialog.status.setText("Table " + (tbIndex + 1) + " of " + names.size());
359: dialog.show();
360: bean.getConnection();
361: bean.makeQuery(query, 0);
362: } catch (Exception e)
363: {
364: continue;
365: }
1.45 rogo 366: // determine destTableName from createStatement or from source table name
1.55 rogo 367: if (!creates.get(tbIndex).equals(""))
368: {
369: String create = creates.get(tbIndex).toString().toLowerCase();
370: int fromIndex = create.indexOf("table") + 5;
371: int toIndex = create.indexOf("(");
372: destTableName = create.substring(fromIndex, toIndex).replaceAll(beanDest.getQC(), "").trim();
373: System.out.println("destTable " + destTableName);
374:
375: } else
376: destTableName = convertText(names.get(tbIndex).toString());
1.45 rogo 377:
1.12 rogo 378: //beanDest.setConnection("jdbc:postgresql://erebos/test3");
379: beanDest.setConnection(destination);
380:
381: Statement stm = beanDest.getConnection().createStatement();
382:
383: Vector tables = beanDest.getTableNames();
384: // Collections.sort(tables);
385: System.out.println(names.get(tbIndex) + " " + tables.indexOf(convertText((String) names.get(tbIndex)))); // "//beanDest.getTypeNames());
386: tables = beanDest.getTableNames();
387: // System.out.println(beanDest.getTableNames(beanDest.getCatalogs().get(2).toString()));
388: stm = beanDest.getConnection().createStatement();
389: // System.exit(0);
1.34 rogo 390:
1.12 rogo 391: if (dialog != null)
1.36 rogo 392: dialog.title.setText("Updating table data ...");
1.12 rogo 393:
394: int j = -1;
1.34 rogo 395:
1.12 rogo 396: Vector row = null;
397: command = new StringBuffer();
398:
399: command.append("UPDATE ");
400: command.append(beanDest.getQC());
1.45 rogo 401: command.append(destTableName);
402: //command.append(convertText((String) names.get(tbIndex)));
1.12 rogo 403: command.append(beanDest.getQC());
404: command.append(" SET ");
405:
406: int size = bean.getColumnNames().size();
407: for (int i = 0; i < size - 1; ++i)
1.34 rogo 408: command.append(beanDest.getQC() + convertText((String) bean.getColumnNames().get(i)) + beanDest.getQC() + " = ? ,");
409: command.append(convertText((String) bean.getColumnNames().get(size - 1)) + " = ? ");
410: command.append("WHERE " + convertText(ids.get(tbIndex).toString()) + " = ?");
1.12 rogo 411: PreparedStatement pstm = beanDest.getConnection().prepareStatement(command.toString());
1.34 rogo 412: System.out.println(command + " " + tbIndex);
413: int rowCount = bean.getRowCount(query);
414: int idIndex = bean.getColumnNames().indexOf(ids.get(tbIndex));
1.12 rogo 415: while ((row = bean.getNextRow()) != null)
416: {
417: j++;
418: //print rows
419: Object obj = null;
420: /* for(int k=0;k<row.size()-1;++k)
421: {
422: obj = row.get(k);
423: //System.out.println("row "+obj+" "+k);
424: if(obj!=null&&!(obj instanceof ArrayList))
425: command.append("'"+convertUml(obj.toString())+"',");
426: else if(obj!=null&& obj instanceof ArrayList)
427: command.append("'"+convertUml(((ArrayList)obj).get(0).toString())+"',");
428: else command.append("NULL,");
429: }
430: obj = row.get(row.size() - 1);
431: if (obj != null && !(obj instanceof ArrayList))
432: command.append("'"+convertUml(obj.toString())+"')");
433: else
434: if(obj!=null&& obj instanceof ArrayList)
435: command.append("'"+convertUml(((ArrayList)obj).get(0).toString())+"')"); //command.append(obj.toString()+")");
436: else command.append("NULL)");
437: */
438: //command.append("'"+row.get(row.size()-1)+"')");
439: //command.append(" )");
440: // for(int k=0;k<row.size();++k)
441:
442: // System.out.println();
443: // System.out.println(command+" "+j+" "+row.size()+" "+ ((Vector)result2[0].get(j)).size());
444: // System.out.println(command);
445: for (int k = 0; k < row.size(); ++k)
446: {
447: obj = row.get(k);
448: if (obj instanceof ArrayList)
449: obj = ((List) obj).get(0);
450: String str = (obj == null) ? "NULL" : obj.toString();
451: if (!str.equals("NULL"))
452: pstm.setString(k + 1, str);
453: else
454: pstm.setNull(k + 1, Types.NULL);
455: }
1.34 rogo 456: pstm.setString(row.size() + 1, row.get(idIndex).toString());
457: //System.out.println(pstm.toString());
458: // System.exit(0);
1.12 rogo 459: pstm.execute();
460: //stm.executeUpdate(command.toString());
1.34 rogo 461: if (dialog != null)
462: dialog.progress.setValue((int) (((double) (j + 1) / (double) rowCount) * 100.0));
1.12 rogo 463: // System.out.println( (int)(((double)(j+1)/(double)result[0].size())*100.0)+" "+result[0].size()+" "+j);
464: command = null;
465: } // to for loop
466:
467: }
468: } catch (Exception e)
469: {
470: System.out.println("Error while connecting to database " + e);
1.18 rogo 471: if (dialog != null)
472: {
473: dialog.setVisible(false);
474: dialog.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
475: FM2SQL.fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
476: }
1.12 rogo 477: java.io.ByteArrayOutputStream b = new java.io.ByteArrayOutputStream();
478: java.io.PrintStream stream = new java.io.PrintStream(b);
479: stream.print(command + "\n\n");
480: e.printStackTrace(stream);
481: FM2SQL.showErrorDialog(b.toString(), "Error occured !");
482:
483: }
1.18 rogo 484: if (dialog != null)
485: {
486: dialog.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
487: FM2SQL.fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
488:
489: dialog.setVisible(false);
490: }
1.12 rogo 491:
492: }
1.34 rogo 493: /**
1.38 rogo 494: * transfers the specified array of tables to the destination database
495: and creates the table if it does not exist if it exists and mode is not append the table is dropped
1.55 rogo 496:
1.38 rogo 497: * @param source
498: * @param destination
499: * @param names
500: * @param layouts
501: * @param selects
502: * @param creates
503: * @param ids
504: * @param mode
505: * @throws Exception
1.55 rogo 506: */
507:
508: public static void convert(String source, String destination, Vector names, Vector layouts, Vector selects, Vector creates, Vector ids, int mode, String delimiter) throws Exception
1.1 rogo 509: {
1.34 rogo 510:
511: FM2SQL.ProgressDialog dialog = null;
512:
513: if (FM2SQL.fmInstance != null)
514: {
1.55 rogo 515: dialog = new FM2SQL.ProgressDialog(FM2SQL.fmInstance, bean);
1.34 rogo 516: dialog.setTitle("Conversion running ...");
517: dialog.title.setText("Getting table data ...");
518: dialog.setLocation(FM2SQL.fmInstance.getLocationOnScreen().x + (FM2SQL.fmInstance.getWidth() - 400) / 2, FM2SQL.fmInstance.getLocationOnScreen().y + (FM2SQL.fmInstance.getHeight() - 250) / 2);
519: dialog.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
520: FM2SQL.fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
521: dialog.thread = Thread.currentThread();
522: dialog.setSize(400, 250);
523: }
524: java.util.TreeSet myIds = new TreeSet();
525: int deltaID = 1;
526: String idField = "";
1.38 rogo 527: String destTableName = "";
1.55 rogo 528: String[] fieldNames = null;
1.34 rogo 529: if (source != null && destination != null)
530: {
531: // setting user and passwd
532: bean.setUserAndPasswd(user, passwd);
533: // setting user and passwd
534: beanDest.setUserAndPasswd(userDest, passwdDest);
535: }
536: StringBuffer command = null;
537: String query = null;
1.1 rogo 538: try
539: {
1.55 rogo 540: if (source != null)
541: bean.setConnection(source);
1.34 rogo 542: else
1.55 rogo 543: bean.setConnection(bean.url);
544:
1.34 rogo 545: if (names == null)
546: names = bean.getTableNames();
547: // Collections.sort(names);
548: int tbIndex = 1;
549:
550: // System.out.println("Start at "+names.indexOf("archimedes_facsimiles"));
551: for (tbIndex = 0; tbIndex < names.size(); ++tbIndex)
1.1 rogo 552: {
553: Vector[] result = null;
1.34 rogo 554: try
1.1 rogo 555: {
1.34 rogo 556: query = "select * from " + bean.getQC() + names.get(tbIndex).toString() + bean.getQC();
557: String layout = (layouts.isEmpty()) ? "" : layouts.get(tbIndex).toString();
558: query = (selects != null) ? selects.get(tbIndex).toString() : query;
559: //if vectors[1].get(i) != null)
560: if (layout != "")
561: {
562: layout = " layout " + bean.getQC() + layout + bean.getQC();
563: String name = names.get(tbIndex).toString();
564: StringBuffer queryLayout = new StringBuffer(query);
565: queryLayout.insert(queryLayout.indexOf(name) + name.length() + 1, " " + layout);
566: query = queryLayout.toString();
567: System.out.println("added layout " + query);
1.21 rogo 568:
1.34 rogo 569: }
570: // if ( layout!= "")
571: // query += " layout " + bean.getQC() + layout + bean.getQC();
572: if (dialog != null)
573: {
574: dialog.title.setText("Reading table data ...");
575: dialog.table.setText(names.get(tbIndex).toString());
576: dialog.status.setText("Table " + (tbIndex + 1) + " of " + names.size());
577: dialog.show();
578: }
579: //result = bean.getQueryData(query, dialog, 0);
580: bean.getConnection();
581: bean.makeQuery(query, 50);
582: idField = ids.get(tbIndex).toString();
583:
584: } catch (Exception e)
585: {
586: System.out.println(e);
587: continue;
1.1 rogo 588: }
1.55 rogo 589: if (destination != null)
590: beanDest.setConnection(destination);
1.34 rogo 591: else
1.55 rogo 592: beanDest.setConnection(beanDest.url);
1.1 rogo 593: Statement stm = beanDest.getConnection().createStatement();
594:
595: Vector tables = beanDest.getTableNames();
1.34 rogo 596: // Collections.sort(tables);
1.1 rogo 597: System.out.println(names.get(tbIndex) + " " + tables.indexOf(convertText((String) names.get(tbIndex)))); // "//beanDest.getTypeNames());
598: tables = beanDest.getTableNames();
599: // System.out.println(beanDest.getTableNames(beanDest.getCatalogs().get(2).toString()));
600: stm = beanDest.getConnection().createStatement();
601: // System.exit(0);
1.55 rogo 602:
603: // determine destTableName from createStatement or from source table name
1.65 rogo 604: ConversionProperties prop = getFieldNamesAndDestTableName(creates.get(tbIndex).toString(), query, names.get(tbIndex).toString());
605: destTableName = prop.destTableName;
606: fieldNames = prop.fieldNames;
607: if (mode == Convert.DataBase.CONVERT_MODE)
1.1 rogo 608: {
1.38 rogo 609:
610: if (tables.indexOf(destTableName) >= 0)
611: {
612: stm.executeUpdate("drop table " + beanDest.getQC() + destTableName + beanDest.getQC());
613: tables.remove(destTableName);
614: System.out.println("dropped table" + destTableName);
615:
616: }
617: /*
618: if(destTableName.equals(""))
1.34 rogo 619: if (tables.indexOf(names.get(tbIndex)) >= 0)
620: {
621: stm.executeUpdate("drop table " + beanDest.getQC() + names.get(tbIndex) + beanDest.getQC());
622: tables.remove((String) names.get(tbIndex));
623: System.out.println("dropped table" + names.get(tbIndex));
624: } else if (tables.indexOf(convertText(names.get(tbIndex).toString())) >= 0)
1.1 rogo 625: {
1.34 rogo 626: stm.executeUpdate("drop table " + beanDest.getQC() + convertText((String) names.get(tbIndex)) + beanDest.getQC());
627: tables.remove(convertText((String) names.get(tbIndex)));
628: System.out.println("dropped table" + names.get(tbIndex));
629: }
1.55 rogo 630: */
1.38 rogo 631: if ((tables.indexOf(destTableName) < 0)) //&& tables.indexOf(names.get(tbIndex)) < 0 && tables.indexOf(convertText(names.get(tbIndex).toString())) < 0 )
1.1 rogo 632: {
1.55 rogo 633:
1.34 rogo 634: if (creates.get(tbIndex).equals("") || creates.get(tbIndex).toString().toLowerCase().indexOf("create") < 0)
635: {
636: System.out.println("Warning empty or invalid create statement - creating one for you\n");
637:
638: command = new StringBuffer(50);
639: command.append("CREATE TABLE ");
640: command.append(beanDest.getQC());
641: command.append(convertText((String) names.get(tbIndex)));
642: command.append(beanDest.getQC());
643: command.append("(");
644: String type = null;
645: Vector columnNames = bean.getColumnNames();
646: for (int i = 0; i < columnNames.size() - 1; ++i)
647: {
648: type = bean.metaData.getColumnTypeName(i + 1);
649: // System.out.println(i+" "+result[1].get(i)+" "+type);
650: type = (type.equals("NUMBER")) ? "INT4" : type;
651: type = (type.equals("CONTAINER")) ? "TEXT" : type;
652:
653: command.append(beanDest.getQC() + convertText((String) columnNames.get(i)) + beanDest.getQC() + " " + type + ", ");
654: }
655: type = bean.metaData.getColumnTypeName(columnNames.size());
656: type = (type.equals("NUMBER")) ? "INT4" : type;
657: type = (type.equals("CONTAINER")) ? "TEXT" : type;
658: command.append(beanDest.getQC() + convertText((String) columnNames.get(columnNames.size() - 1)) + beanDest.getQC() + " " + type);
659: command.append(" )");
660:
661: // System.out.println(command);
662: // System.exit(0);
663: //command.append(DBBean.getQC());
664: } else
1.38 rogo 665: command = new StringBuffer().append(creates.get(tbIndex).toString().toLowerCase());
1.34 rogo 666: stm.executeUpdate(command.toString());
1.1 rogo 667:
1.34 rogo 668: }
1.1 rogo 669: }
1.55 rogo 670: if (dialog != null)
671: dialog.title.setText("Writing table data ...");
1.34 rogo 672:
673: // prepare the insert statement
674: int j = -1;
675: Vector row = null;
676: command = new StringBuffer();
677:
678: command.append("INSERT INTO ");
679: command.append(beanDest.getQC());
1.38 rogo 680: command.append(destTableName); //convertText((String) names.get(tbIndex)));
1.34 rogo 681: command.append(beanDest.getQC());
1.55 rogo 682: command.append(" (");
683: for (int i = 0; i < fieldNames.length; i++)
684: {
685: command.append(fieldNames[i]);
686: if (i < fieldNames.length - 1)
687: command.append(",");
688: }
689: command.append(") ");
690:
1.34 rogo 691: command.append(" values ( ");
692:
1.38 rogo 693: // add a question marks for every field
1.34 rogo 694: for (int i = 0; i < bean.getColumnNames().size() - 1; ++i)
695: command.append("?,");
696: command.append("?)");
697: PreparedStatement pstm = beanDest.getConnection().prepareStatement(command.toString());
698: System.out.println(command);
699: int rowCount = (idField != "") ? myIds.size() : bean.getRowCount(query);
700: Vector vec = new Vector(myIds);
701: int endIndex = -1;
702: String tempQuery = query;
703: String tempID = bean.getQC() + idField + bean.getQC();
1.38 rogo 704: // if id_field not do incremental conversion else do it all at once
1.34 rogo 705: if (!idField.equals(""))
706: {
707: long startTime = System.currentTimeMillis();
708: int counter = -1;
709: while (true)
710: {
711: ++counter;
1.55 rogo 712: if (counter == 0 && dialog != null)
1.34 rogo 713: dialog.title.setText("Check if data is available");
1.55 rogo 714: else if (dialog != null)
1.34 rogo 715: dialog.title.setText("Check if more data is available");
716: myIds = bean.getIDVector(ids.get(tbIndex).toString(), (String) names.get(tbIndex), tempQuery, numHits);
717: if (myIds.isEmpty())
718: break;
719: vec = new Vector(myIds);
720: rowCount = vec.size();
721: System.out.println("ID LIST SIZE " + Math.round((double) myIds.size() / (double) numIntervalls) + " " + myIds.size());
722: deltaID = (int) Math.round((double) myIds.size() / (double) numIntervalls);
723: if (vec.size() <= numIntervalls)
724: {
725: endIndex = 0;
726: deltaID = vec.size();
727: }
728: for (int k = 0; k < vec.size() - deltaID; k = k + deltaID)
729: {
730: System.out.println(vec.get(k) + " " + vec.get(k + deltaID) + " " + vec.lastElement());
731: if (query.indexOf("where") > 0)
1.55 rogo 732: tempQuery = query + " and " + tempID + ">='" + vec.get(k) + "' and " + tempID + "<='" + vec.get(k + deltaID) + "'";
1.34 rogo 733: else
1.55 rogo 734: tempQuery = query + " where " + tempID + ">='" + vec.get(k) + "' and " + tempID + "<='" + vec.get(k + deltaID) + "'";
1.34 rogo 735: System.out.println(tempQuery);
1.55 rogo 736: if (dialog != null)
737: dialog.title.setText("Reading table data ...");
1.34 rogo 738:
739: bean.makeQuery(tempQuery, deltaID);
1.55 rogo 740: if (dialog != null)
741: dialog.title.setText("Writing table data ...");
1.34 rogo 742:
1.55 rogo 743: command = writeDatainDestTable(dialog, command, k, pstm, rowCount, delimiter);
1.34 rogo 744: endIndex = k + deltaID;
745: }
746: System.out.println(endIndex);
1.38 rogo 747: //all data written ? if not write last chunk of data
1.34 rogo 748: if (endIndex == vec.size() - 1)
749: System.out.println("fits");
750: else
751: {
752: System.out.println(" last intervall from " + vec.get(endIndex) + " " + vec.lastElement());
1.1 rogo 753:
1.34 rogo 754: if (query.indexOf("where") > 0)
1.55 rogo 755: tempQuery = query + " and " + tempID + ">='" + vec.get(endIndex) + "' and " + tempID + "<='" + vec.lastElement() + "'";
1.34 rogo 756: else
1.55 rogo 757: tempQuery = query + " where " + tempID + ">='" + vec.get(endIndex) + "' and " + tempID + "<='" + vec.lastElement() + "'";
1.34 rogo 758: System.out.println(tempQuery);
1.55 rogo 759: if (dialog != null)
760: dialog.title.setText("Reading table data ...");
1.34 rogo 761: bean.makeQuery(tempQuery, 0);
1.55 rogo 762: if (dialog != null)
763: dialog.title.setText("Writing table data ...");
764: command = writeDatainDestTable(dialog, command, endIndex, pstm, rowCount, delimiter);
1.34 rogo 765: }
1.38 rogo 766: // prepare new query for next chunk
1.34 rogo 767: if (query.indexOf("where") > 0)
1.55 rogo 768: tempQuery = query + " and " + tempID + ">'" + vec.lastElement() + "'";
1.34 rogo 769: else
1.55 rogo 770: tempQuery = query + " where " + tempID + ">'" + vec.lastElement() + "'";
1.34 rogo 771:
772: }
773: long endTime = System.currentTimeMillis();
774: System.out.println("Time for incremental convert elapsed " + (endTime - startTime));
775: } else
1.29 rogo 776: {
1.38 rogo 777: // read and write all in one big chunk
1.34 rogo 778: long startTime = System.currentTimeMillis();
1.55 rogo 779:
1.34 rogo 780: bean.makeQuery(query, 0);
1.55 rogo 781: command = writeDatainDestTable(dialog, command, j, pstm, rowCount, delimiter);
1.34 rogo 782: long endTime = System.currentTimeMillis();
783: System.out.println("Time for old convert elapsed " + (endTime - startTime));
1.29 rogo 784:
785: }
1.34 rogo 786: }
787: } catch (Exception e)
788: {
789: System.out.println("Error while connecting to database " + e);
790: if (dialog != null)
791: {
792: dialog.setVisible(false);
793: dialog.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
794: FM2SQL.fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
795: java.io.ByteArrayOutputStream b = new java.io.ByteArrayOutputStream();
796: java.io.PrintStream stream = new java.io.PrintStream(b);
797: stream.print(command + "\n\n");
798: e.printStackTrace(stream);
799: FM2SQL.showErrorDialog(b.toString(), "Error occured !");
800: } else
801: {
802: e.printStackTrace();
1.33 rogo 803:
1.3 rogo 804: }
1.1 rogo 805: }
1.34 rogo 806: if (dialog != null)
807: {
808: dialog.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
809: FM2SQL.fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
810: dialog.setVisible(false);
811: }
1.27 rogo 812: }
1.38 rogo 813: /**
814: * Writes data to the destination table
815: * @param dialog progress dialog
816: * @param command
817: * @param j data index for progress bar
818: * @param pstm prepared statement
819: * @param rowCount number of datasets
820: * @return command
821: * @throws Exception
822: * @throws SQLException
823: */
1.55 rogo 824: private static StringBuffer writeDatainDestTable(FM2SQL.ProgressDialog dialog, StringBuffer command, int j, PreparedStatement pstm, int rowCount, String delimiter) throws Exception, SQLException
1.27 rogo 825: {
826: Vector row;
1.34 rogo 827: while ((row = bean.getNextRow()) != null)
828: {
829: j++;
830: // row = (Vector) result[0].get(j);
831: /* command = new StringBuffer();
832:
833: command.append("INSERT INTO ");
834: command.append(beanDest.getQC());
835: command.append(convertText((String) names.get(tbIndex)));
836: command.append(beanDest.getQC());
837: command.append(" values ( ");
838: */
839: //print rows
840: Object obj = null;
841: /* for(int k=0;k<row.size()-1;++k)
842: {
843: obj = row.get(k);
844: //System.out.println("row "+obj+" "+k);
845: if(obj!=null&&!(obj instanceof ArrayList))
846: command.append("'"+convertUml(obj.toString())+"',");
847: else if(obj!=null&& obj instanceof ArrayList)
848: command.append("'"+convertUml(((ArrayList)obj).get(0).toString())+"',");
849: else command.append("NULL,");
850: }
851: obj = row.get(row.size() - 1);
852: if (obj != null && !(obj instanceof ArrayList))
853: command.append("'"+convertUml(obj.toString())+"')");
854: else
855: if(obj!=null&& obj instanceof ArrayList)
856: command.append("'"+convertUml(((ArrayList)obj).get(0).toString())+"')"); //command.append(obj.toString()+")");
857: else command.append("NULL)");
858: */
859: //command.append("'"+row.get(row.size()-1)+"')");
860: //command.append(" )");
861: // for(int k=0;k<row.size();++k)
862:
863: // System.out.println();
864: // System.out.println(command+" "+j+" "+row.size()+" "+ ((Vector)result2[0].get(j)).size());
865: // System.out.println(command);
866: for (int k = 0; k < row.size(); ++k)
867: {
868: obj = row.get(k);
1.55 rogo 869:
870: if (obj instanceof ArrayList)
871: obj = formatFileMakerArray((List) obj, delimiter);
872:
1.34 rogo 873: String str = (obj == null) ? "NULL" : obj.toString();
1.55 rogo 874: if (obj instanceof Double)
875: {
876: pstm.setDouble(k + 1, ((Double) obj).doubleValue());
877: } else if (!str.equals("NULL"))
1.34 rogo 878: pstm.setString(k + 1, str);
879: else
880: pstm.setNull(k + 1, Types.NULL);
881: }
882: pstm.execute();
883: //stm.executeUpdate(command.toString());
884: if (dialog != null)
885: dialog.progress.setValue((int) (((double) (j + 1) / (double) rowCount) * 100.0));
886: // System.out.println( (int)(((double)(j+1)/(double)result[0].size())*100.0)+" "+result[0].size()+" "+j);
887: command = null;
888: } // to while loop
1.27 rogo 889: return command;
1.1 rogo 890: }
891:
1.38 rogo 892: /**
893: * removes special characters from the input string as well as .fp5
894: * @param newName String to change
895: * @return
896: */
1.34 rogo 897: public static String convertText(String newName)
1.1 rogo 898: {
899: StringBuffer alterMe = new StringBuffer(newName.trim().toLowerCase());
900: int length = alterMe.length();
901: int j = 0;
1.34 rogo 902: int index = alterMe.indexOf(".fp5");
903: if (index >= 0)
904: {
905: alterMe.delete(index, index + 4);
906: length = length - 4;
907: }
908:
1.1 rogo 909: while (j < length)
1.34 rogo 910: {
1.1 rogo 911: if (alterMe.charAt(j) == ' ')
912: {
913: alterMe.setCharAt(j, '_');
1.34 rogo 914: // if(j<length-1) j=j+1;
915: } else if (alterMe.charAt(j) == '_')
916: {
917:
918: if (alterMe.charAt(j + 1) == '_')
919: alterMe.deleteCharAt(j);
920: length = length - 1;
921: // if(j<length-1) j=j+1;
922: } else if (alterMe.charAt(j) == 'ä')
923: {
924: alterMe.setCharAt(j, 'a');
925: alterMe.insert(j + 1, "e");
926: length = length + 1;
927: if (j < length - 1)
928: j = j + 1;
929: } else if (alterMe.charAt(j) == 'ö')
930: {
931: alterMe.setCharAt(j, 'o');
932: alterMe.insert(j + 1, "e");
933: length = length + 1;
934: if (j < length - 1)
935: j = j + 1;
936: } else if (alterMe.charAt(j) == 'ü')
937: {
938: alterMe.setCharAt(j, 'u');
939: alterMe.insert(j + 1, "e");
940: length = length + 1;
941: if (j < length - 1)
942: j = j + 1;
943: } else if (alterMe.charAt(j) == 'ß')
944: {
945: alterMe.setCharAt(j, 's');
946: alterMe.insert(j + 1, "s");
947: length = length + 1;
948: if (j < length - 1)
949: j = j + 1;
950: } else if (alterMe.charAt(j) == ':')
1.1 rogo 951: {
1.34 rogo 952: if (j < length - 1)
953: {
954: if (alterMe.charAt(j + 1) == ':')
955: {
956: alterMe.setCharAt(j, '_');
957: alterMe.delete(j + 1, j + 2);
958: length = length - 1;
959:
960: }
1.1 rogo 961:
1.34 rogo 962: if (j < length - 1)
963: j = j + 1;
964: }
965: } else if (alterMe.charAt(j) == '-')
966: {
967: alterMe.setCharAt(j, '_');
1.16 rogo 968:
1.34 rogo 969: } else if (alterMe.charAt(j) == '?')
1.3 rogo 970: {
1.34 rogo 971: // changed ? to _ because of update statement
972: alterMe.setCharAt(j, '_');
973: // length = length + 1;
974: // j=j+1;
975: System.out.println(alterMe);
976: } else if (alterMe.charAt(j) == '.')
977: {
978: if (j == length - 1)
979: {
980: alterMe.delete(j, j);
981: length--;
982: } else
983: alterMe.setCharAt(j, '_');
1.3 rogo 984: }
1.34 rogo 985:
986: ++j;
1.1 rogo 987: }
988: return alterMe.toString();
989: }
1.38 rogo 990: /**
991: * Converts > and < in an entity (> or <)
992: * @param newName
993: * @return
994: */
1.4 rogo 995: public static String convertToEntities(String newName)
996: {
997: StringBuffer alterMe = new StringBuffer(newName.trim());
998: int length = alterMe.length();
999: int j = 0;
1000:
1001: while (j < length)
1002: {
1003:
1004: if (alterMe.charAt(j) == '>')
1005: {
1006: alterMe.setCharAt(j, '&');
1007: alterMe.insert(j + 1, "gt;");
1008: length = length + 2;
1009: if (j < length - 1)
1010: j = j + 1;
1011:
1012: } else if (alterMe.charAt(j) == '<')
1013: {
1014: alterMe.setCharAt(j, '&');
1015: alterMe.insert(j + 1, "lt;");
1016: length = length + 2;
1017: if (j < length - 1)
1018: j = j + 1;
1019:
1020: }
1021: ++j;
1022: }
1023: return alterMe.toString();
1024: }
1.38 rogo 1025: /**
1026: * Masks the single quote character '-->\'
1027: * @param newName
1028: * @return
1029: */
1.1 rogo 1030: public static String convertUml(String newName)
1.34 rogo 1031: {
1032: StringBuffer alterMe = new StringBuffer(newName.trim());
1033: int length = alterMe.length();
1034: int j = 0;
1035:
1036: while (j < length)
1037: {
1038:
1039: if (alterMe.charAt(j) == '\'')
1040: {
1041: alterMe.setCharAt(j, '\\');
1042: alterMe.insert(j + 1, "'");
1043: length = length + 1;
1044: if (j < length - 1)
1045: j = j + 1;
1046: }
1047: /* else
1048: if (alterMe.charAt(j) == '"')
1049: {
1050: alterMe.setCharAt(j, '\\');
1051: alterMe.insert(j + 1, "\"");
1052: length = length + 1;
1053: if(j<length-1) j=j+1;
1054: }
1055: else
1056: if (alterMe.charAt(j) == '>')
1057: {
1058: alterMe.setCharAt(j, '\\');
1059: alterMe.insert(j + 1, ">");
1060: length = length + 1;
1061: if(j<length-1) j=j+1;
1062: }
1063: else
1064: if (alterMe.charAt(j) == '<')
1065: {
1066: alterMe.setCharAt(j, '\\');
1067: alterMe.insert(j + 1, "<");
1068: length = length + 1;
1069: if(j<length-1) j=j+1;
1070: }
1071: else
1072: if (alterMe.charAt(j) == '?')
1073: {
1074: alterMe.setCharAt(j, '\\');
1075: alterMe.insert(j + 1, "?");
1076: length = length + 1;
1077: if(j<length-1) j=j+1;
1078: }
1079: else
1080: if (alterMe.charAt(j) == '&')
1081: {
1082: alterMe.setCharAt(j, '\\');
1083: alterMe.insert(j + 1, "&");
1084: length = length + 1;
1085: if(j<length-1) j=j+1;
1086: }
1087: else
1088: if (alterMe.charAt(j) == '=')
1089: {
1090: alterMe.setCharAt(j, '\\');
1091: alterMe.insert(j + 1, "=");
1092: length = length + 1;
1093: if(j<length-1) j=j+1;
1094: }
1095: else
1096: if (alterMe.charAt(j) == ',')
1097: {
1098: alterMe.setCharAt(j, '\\');
1099: alterMe.insert(j + 1, ",");
1100: length = length + 1;
1101: if(j<length-1) j=j+1;
1102: }
1103: else
1104: if (alterMe.charAt(j) == '.')
1105: {
1106: alterMe.setCharAt(j, '\\');
1107: alterMe.insert(j + 1, ".");
1108: length = length + 1;
1109: if(j<length-1) j=j+1;
1110: }
1111: else
1112: if (alterMe.charAt(j) == '[')
1113: {
1114: alterMe.setCharAt(j, '\\');
1115: alterMe.insert(j + 1, ".");
1116: length = length + 1;
1117: if(j<length-1) j=j+1;
1118: }
1119: else
1120: if (alterMe.charAt(j) == ']')
1121: {
1122: alterMe.setCharAt(j, '\\');
1123: alterMe.insert(j + 1, ".");
1124: length = length + 1;
1125: if(j<length-1) j=j+1;
1126: }
1127: else
1128: if (alterMe.charAt(j) == '%')
1129: {
1130: alterMe.setCharAt(j, '\\');
1131: alterMe.insert(j + 1, "%");
1132: length = length + 1;
1133: if(j<length-1) j=j+1;
1134: }*/
1135: ++j;
1136: }
1137: return alterMe.toString();
1138: }
1.55 rogo 1139: /**
1140: * parses the input xml file for batch conversion
1141: * called from readXMLFile
1142: * * @param sb
1143: */
1.34 rogo 1144: public static void parseXMLConfig(StringBuffer sb)
1145: {
1146: boolean finished = false;
1147: // parse string and build document tree
1148: Xparse parser = new Xparse();
1149: parser.changeEntities = true;
1150: Node root = parser.parse(sb.toString());
1151: // printContents(root);
1152: Vector databases = new Vector();
1153: Vector tables = new Vector();
1154: Vector layouts = new Vector();
1155: Vector selects = new Vector();
1156: Vector creates = new Vector();
1157: Vector ids = new Vector();
1.71 rogo 1158: Vector indexListVec = new Vector();
1.42 rogo 1159: String delimiter = "|";
1.34 rogo 1160: int mode = -1;
1161:
1162: try
1.1 rogo 1163: {
1.34 rogo 1164: Node tempNode = root.find("convert/source", new int[] { 1, 1 });
1165: if (tempNode == null)
1166: throw new Error("parse error source tag missing");
1167: System.out.println(tempNode.name);
1168: int length = countNodes(tempNode);
1169: for (int i = 1; i <= length; i++)
1.1 rogo 1170: {
1.34 rogo 1171:
1.1 rogo 1172: DBBean database = new DBBean();
1.34 rogo 1173: tables = new Vector();
1174: layouts = new Vector();
1175: selects = new Vector();
1176: creates = new Vector();
1177: ids = new Vector();
1.71 rogo 1178: indexListVec = new Vector();
1.1 rogo 1179: // parse dataBase
1.34 rogo 1180: Node node = root.find("convert/source/database/url", new int[] { 1, 1, i, 1 });
1181: Node node1 = root.find("convert/source/database/user", new int[] { 1, 1, i, 1, 1 });
1182: Node node2 = root.find("convert/source/database/password", new int[] { 1, 1, i, 1, 1 });
1183: Node node3 = root.find("convert/source/database", new int[] { 1, 1, i });
1184: Node nodeMode = root.find("convert/source/database/mode", new int[] { 1, 1, i, 1, 1 });
1.55 rogo 1185: Node delimiterNode = root.find("convert/source/database/delimiter", new int[] { 1, 1, i, 1, 1 });
1.59 rogo 1186: Node useNormanToUnicodeMapper = root.find("convert/source/database/usenormantounicodemapper", new int[] { 1, 1, i, 1, 1 });
1.65 rogo 1187:
1.34 rogo 1188: if (node3 == null)
1189: throw new Error("parse error database tag missing");
1190: if (node == null)
1191: throw new Error("parse error url tag missing");
1192: if (node1 == null)
1193: throw new Error("parse error user tag missing");
1194: if (node2 == null)
1195: throw new Error("parse error password tag missing");
1.55 rogo 1196: if (delimiterNode != null)
1197: delimiter = delimiterNode.getCharacters();
1.65 rogo 1198: if (useNormanToUnicodeMapper != null)
1.59 rogo 1199: {
1200: database.setUseNormanToUnicodeMapper(Boolean.valueOf(useNormanToUnicodeMapper.getCharacters()).booleanValue());
1.65 rogo 1201: System.out.println("useMapper " + Boolean.valueOf(useNormanToUnicodeMapper.getCharacters().trim()).booleanValue());
1202: }
1203:
1.1 rogo 1204: String url = node.getCharacters();
1205: String user = node1.getCharacters();
1206: String password = node2.getCharacters();
1207: database.setURL(url.trim());
1208: database.setUserAndPasswd(user.trim(), password.trim());
1.34 rogo 1209: System.out.println(node.name + " " + node.getCharacters());
1210: System.out.println(node1.name + " " + node1.getCharacters());
1211: System.out.println(node2.name + " " + node2.getCharacters());
1212: String modeString = "";
1213: if (nodeMode == null)
1214: modeString = "convert";
1215: else
1216: modeString = nodeMode.getCharacters();
1217: if (modeString.equals("convert"))
1218: mode = DataBase.CONVERT_MODE;
1219: else if (modeString.equals("append"))
1220: mode = DataBase.APPEND_MODE;
1221: else if (modeString.equals("update"))
1222: mode = DataBase.UPDATE_MODE;
1.48 rogo 1223: else if (modeString.equals("delete"))
1224: mode = DataBase.DELETE_MODE;
1.62 rogo 1225: else if (modeString.equals("synchronize"))
1.65 rogo 1226: mode = DataBase.SYNCHRONIZE_MODE;
1.48 rogo 1227:
1.34 rogo 1228: // if(node3!=null)
1229: // System.out.println(node3.name);
1230:
1231: int length2 = countNodes(node3);
1232:
1233: System.out.println("number of tables " + length2);
1234:
1235: for (int j = 1; j <= length2; ++j)
1236: {
1237: Node node4 = root.find("convert/source/database/table", new int[] { 1, 1, i, j });
1238: Node node5 = root.find("convert/source/database/table/select", new int[] { 1, 1, i, j, 1 });
1239: Node node6 = root.find("convert/source/database/table/create", new int[] { 1, 1, i, j, 1 });
1240: if (node4 != null)
1241: System.out.println(node4.name + " " + node4.attributes.get("layout").equals(""));
1242: if (node5 != null)
1243: System.out.println(node5.name + " " + node5.getCharacters());
1244: if (node6 != null)
1245: System.out.println(node6.name + " " + node6.getCharacters());
1246: if (node4 == null)
1247: throw new Error("parse error table tag missing");
1248: // if(node5==null) throw new Error("parse error select tag missing");
1249: // if(node6==null) throw new Error("parse error create tag missing");
1250: String name = (String) node4.attributes.get("name");
1251: String layout = (String) node4.attributes.get("layout");
1252: String id = (String) node4.attributes.get("id");
1.69 rogo 1253: String indexList = (String) node4.attributes.get("indexList");
1.71 rogo 1254:
1.34 rogo 1255: System.out.println("id was " + id);
1256: if (name == null)
1257: throw new Error("parse error required table tag attribute name missing");
1258: if (layout == null)
1259: layout = "";
1260: if (id == null)
1261: id = "";
1.71 rogo 1262: if (indexList == null)
1263: indexList = "";
1.34 rogo 1264: if (name.equals(""))
1265: throw new Error("parse error table tag attribute must not be empty");
1266: tables.add(name);
1267: layouts.add(layout);
1.71 rogo 1268:
1.34 rogo 1269: ids.add(id);
1.69 rogo 1270: indexListVec.add(indexList);
1.34 rogo 1271: String query = (node5 == null) ? "" : node5.getCharacters();
1272: if (query.equals(""))
1273: System.err.println("Warning empty select tag or select tag missing !!");
1274: query = (query.equals("")) ? "select * from " + database.getQC() + name + database.getQC() : query;
1275: selects.add(query);
1276: if (node6 != null)
1277: creates.add(node6.getCharacters().trim());
1278: else
1279: creates.add("");
1280:
1281: }
1.42 rogo 1282: DataBase dataBase = new DataBase(database, tables, layouts, selects, creates, ids, mode);
1283: dataBase.delimiter = delimiter;
1.69 rogo 1284: dataBase.buildIndexTable(indexListVec);
1.42 rogo 1285: databases.add(dataBase);
1.34 rogo 1286: }
1287: DBBean database = new DBBean();
1288: // parse dataBase
1289: Node node = root.find("convert/destination/database/url", new int[] { 1, 1, 1, 1 });
1290: Node node1 = root.find("convert/destination/database/user", new int[] { 1, 1, 1, 1, 1 });
1291: Node node2 = root.find("convert/destination/database/password", new int[] { 1, 1, 1, 1, 1 });
1292: String url = node.getCharacters();
1293: String user = node1.getCharacters();
1294: String password = node2.getCharacters();
1295: System.out.println(url);
1296: database.setURL(url.trim());
1297: database.setUserAndPasswd(user.trim(), password.trim());
1298: //databases.add(database);
1299: for (Iterator iter = databases.iterator(); iter.hasNext();)
1.1 rogo 1300: {
1301: DataBase db = (DataBase) iter.next();
1.62 rogo 1302: if (mode == DataBase.CONVERT_MODE || mode == DataBase.APPEND_MODE)
1.55 rogo 1303: convertBatch(db.bean, database, db.tables, db.layouts, db.selects, db.creates, db.ids, mode, db.delimiter);
1.65 rogo 1304: else if (mode == DataBase.UPDATE_MODE)
1305: update(db.bean.url, database.url, db.tables, db.layouts, db.selects, db.creates, db.ids, mode);
1306: else if (mode == DataBase.SYNCHRONIZE_MODE)
1307: {
1308: user = bean.user;
1309: passwd = bean.passwd;
1310: userDest = database.user;
1311: passwdDest = database.passwd;
1312:
1.71 rogo 1313: synchronize(db.bean.url, database.url, db.tables, db.layouts, db.selects, db.creates, db.ids, mode, db.delimiter, new Vector(db.htIndex.values()));
1.65 rogo 1314: }
1.1 rogo 1315: }
1.34 rogo 1316: // printContents(node3);
1317: // FM2SQL.fmInstance=new FM2SQL();
1318: } catch (Exception e)
1319: {
1.55 rogo 1320:
1.34 rogo 1321: e.printStackTrace();
1.65 rogo 1322:
1323: } finally
1324: {
1325: bean.closeAllConnections();
1326: beanDest.closeAllConnections();
1.34 rogo 1327: }
1328: }
1329: public static Vector getXMLConfig(String xmlFile)
1330: {
1331: StringBuffer sb = null;
1332: try
1333: {
1334: // read XML Metadata from a file
1335: FileInputStream fi = new FileInputStream(xmlFile);
1336: InputStreamReader isr = new InputStreamReader(fi, "UTF-8");
1337: BufferedReader buffr = new BufferedReader(isr);
1338: sb = new StringBuffer();
1339: int c = 0;
1340: while ((c = buffr.read()) != -1)
1341: {
1342: char ch = (char) c;
1343: sb.append(ch);
1344: // System.out.print((char)c);
1.1 rogo 1345: }
1346:
1.34 rogo 1347: } catch (Exception e)
1348: {
1349: e.printStackTrace();
1350: }
1351:
1352: boolean finished = false;
1353: // parse string and build document tree
1354: Xparse parser = new Xparse();
1355: parser.changeEntities = true;
1356: Node root = parser.parse(sb.toString());
1357: // printContents(root);
1358: Vector databases = new Vector();
1359: Vector tables = new Vector();
1360: Vector layouts = new Vector();
1361: Vector selects = new Vector();
1362: Vector creates = new Vector();
1363: Vector ids = new Vector();
1.55 rogo 1364: String delimiter = "|";
1.34 rogo 1365: int mode = -1;
1366: try
1.1 rogo 1367: {
1.34 rogo 1368: Node tempNode = root.find("convert/source", new int[] { 1, 1 });
1369: if (tempNode == null)
1370: throw new Error("parse error source tag missing");
1371: System.out.println(tempNode.name);
1372: int length = countNodes(tempNode);
1373: for (int i = 1; i <= length; i++)
1.1 rogo 1374: {
1.34 rogo 1375:
1376: DBBean database = new DBBean();
1377: tables = new Vector();
1378: layouts = new Vector();
1379: selects = new Vector();
1380: creates = new Vector();
1381: ids = new Vector();
1382: // parse dataBase
1383: Node node = root.find("convert/source/database/url", new int[] { 1, 1, i, 1 });
1384: Node node1 = root.find("convert/source/database/user", new int[] { 1, 1, i, 1, 1 });
1385: Node node2 = root.find("convert/source/database/password", new int[] { 1, 1, i, 1, 1 });
1386: Node node3 = root.find("convert/source/database", new int[] { 1, 1, i });
1387: Node nodeMode = root.find("convert/source/database/mode", new int[] { 1, 1, i, 1, 1 });
1.55 rogo 1388: Node delimiterNode = root.find("convert/source/database/delimiter", new int[] { 1, 1, i, 1, 1 });
1.59 rogo 1389: Node useNormanToUnicodeMapper = root.find("convert/source/database/usenormantounicodemapper", new int[] { 1, 1, i, 1, 1 });
1.55 rogo 1390:
1.44 rogo 1391: if (delimiterNode != null)
1392: delimiter = delimiterNode.getCharacters();
1.65 rogo 1393: if (useNormanToUnicodeMapper != null)
1.59 rogo 1394: {
1395: database.setUseNormanToUnicodeMapper(Boolean.valueOf(useNormanToUnicodeMapper.getCharacters()).booleanValue());
1.65 rogo 1396: System.out.println("useMapper " + Boolean.valueOf(useNormanToUnicodeMapper.getCharacters().trim()).booleanValue());
1397: }
1.59 rogo 1398:
1.34 rogo 1399: if (node3 == null)
1400: throw new Error("parse error database tag missing");
1401: if (node == null)
1402: throw new Error("parse error url tag missing");
1403: if (node1 == null)
1404: throw new Error("parse error user tag missing");
1405: if (node2 == null)
1406: throw new Error("parse error password tag missing");
1407: String url = node.getCharacters();
1408: String user = node1.getCharacters();
1409: String password = node2.getCharacters();
1410: database.setURL(url.trim());
1411: database.setUserAndPasswd(user.trim(), password.trim());
1412: System.out.println(node.name + " " + node.getCharacters());
1413: System.out.println(node1.name + " " + node1.getCharacters());
1414: System.out.println(node2.name + " " + node2.getCharacters());
1415: String modeString = "";
1416: if (nodeMode == null)
1417: modeString = "convert";
1418: else
1419: modeString = nodeMode.getCharacters();
1420: if (modeString.equals("convert"))
1421: mode = DataBase.CONVERT_MODE;
1422: else if (modeString.equals("append"))
1423: mode = DataBase.APPEND_MODE;
1424: else if (modeString.equals("update"))
1425: mode = DataBase.UPDATE_MODE;
1.48 rogo 1426: else if (modeString.equals("delete"))
1427: mode = DataBase.DELETE_MODE;
1428:
1.34 rogo 1429: // if(node3!=null)
1430: // System.out.println(node3.name);
1431:
1432: int length2 = countNodes(node3);
1433:
1434: System.out.println("number of tables " + length2);
1435:
1436: for (int j = 1; j <= length2; ++j)
1437: {
1438: Node node4 = root.find("convert/source/database/table", new int[] { 1, 1, i, j });
1439: Node node5 = root.find("convert/source/database/table/select", new int[] { 1, 1, i, j, 1 });
1440: Node node6 = root.find("convert/source/database/table/create", new int[] { 1, 1, i, j, 1 });
1441: if (node4 != null)
1442: System.out.println(node4.name + " " + node4.attributes.get("layout").equals(""));
1443: if (node5 != null)
1444: System.out.println(node5.name + " " + node5.getCharacters());
1445: if (node6 != null)
1446: System.out.println(node6.name + " " + node6.getCharacters());
1447: if (node4 == null)
1448: throw new Error("parse error table tag missing");
1449: // if(node5==null) throw new Error("parse error select tag missing");
1450: // if(node6==null) throw new Error("parse error create tag missing");
1451: String name = (String) node4.attributes.get("name");
1452: String layout = (String) node4.attributes.get("layout");
1453: String id = (String) node4.attributes.get("id");
1454: System.out.println("id was " + id);
1455:
1456: if (name == null)
1457: throw new Error("parse error required table tag attribute name missing");
1458: if (layout == null)
1459: layout = "";
1460: if (id == null)
1461: id = "";
1462: if (name.equals(""))
1463: throw new Error("parse error table tag attribute must not be empty");
1464: tables.add(name);
1465: layouts.add(layout);
1466: ids.add(id);
1467: String query = (node5 == null) ? "" : node5.getCharacters();
1468: if (query.equals(""))
1469: System.err.println("Warning empty select tag or select tag missing !!");
1470: query = (query.equals("")) ? "select * from " + database.getQC() + name + database.getQC() : query;
1471: selects.add(query);
1472: if (node6 != null)
1473: creates.add(node6.getCharacters().trim());
1474: else
1475: creates.add("");
1476:
1477: }
1.55 rogo 1478: DataBase dataBase = new DataBase(database, tables, layouts, selects, creates, ids, mode);
1479: dataBase.delimiter = delimiter;
1.43 rogo 1480: databases.add(dataBase);
1.1 rogo 1481: }
1.34 rogo 1482: DBBean database = new DBBean();
1483: // parse dataBase
1484: Node node = root.find("convert/destination/database/url", new int[] { 1, 1, 1, 1 });
1485: Node node1 = root.find("convert/destination/database/user", new int[] { 1, 1, 1, 1, 1 });
1486: Node node2 = root.find("convert/destination/database/password", new int[] { 1, 1, 1, 1, 1 });
1487: String url = node.getCharacters();
1488: String user = node1.getCharacters();
1489: String password = node2.getCharacters();
1490: System.out.println(url);
1491: database.setURL(url.trim());
1492: database.setUserAndPasswd(user.trim(), password.trim());
1493: databases.add(new DataBase(database, null, null, null, null, null, 0));
1494: //databases.add(database);
1495: /* for (Iterator iter = databases.iterator(); iter.hasNext();)
1496: {
1497: DataBase db = (DataBase) iter.next();
1498: convertBatch(db.bean,database,db.tables,db.layouts,db.selects,db.creates);
1499:
1500: }*/
1501: // printContents(node3);
1502: // FM2SQL.fmInstance=new FM2SQL();
1503: } catch (Exception e)
1504: {
1505: // TODO Auto-generated catch block
1506: e.printStackTrace();
1.1 rogo 1507: }
1.34 rogo 1508: return databases;
1509: }
1510:
1511: private static int countNodes(Node tempNode)
1512: {
1513: int length = 0;
1514: for (int i = 0; i < tempNode.contents.v.size(); ++i)
1.1 rogo 1515: {
1.34 rogo 1516: Node node = (Node) tempNode.contents.v.elementAt(i);
1517: if (node.type.equals("element"))
1.1 rogo 1518: {
1.34 rogo 1519: if (node.name.equals("database"))
1520: length++;
1521: if (node.name.equals("table"))
1522: length++;
1.1 rogo 1523: }
1.34 rogo 1524:
1525: // System.out.println(((Node)tempNode.contents.v.elementAt(i)).attributes+" "+i);
1.1 rogo 1526: }
1.34 rogo 1527: return length;
1528: }
1529: private static void printContents(Node root)
1530: {
1531:
1532: Vector contents = (root.index == null) ? root.contents.v : root.index.v;
1533: for (int i = 0; i < contents.size(); ++i)
1.1 rogo 1534: {
1.34 rogo 1535: Node n = (Node) contents.elementAt(i);
1536: if (n.type.equals("element"))
1537: {
1538: System.out.println("tag " + n.name);
1539: System.out.println(n.getCharacters());
1540: //contents=n.contents.v i=0;
1541: }
1542: // System.out.println(n.type);
1.1 rogo 1543: }
1.34 rogo 1544: }
1.38 rogo 1545: /**
1546: * reads the specified xml file
1547: * @param xmlFile
1548: */
1.34 rogo 1549: public static void readXMLFile(String xmlFile)
1.1 rogo 1550: {
1.34 rogo 1551: try
1552: {
1.60 rogo 1553: InputStream stream = null;
1.65 rogo 1554:
1555: if (xmlFile.indexOf("file://") >= 0 || xmlFile.indexOf("http://") >= 0)
1.60 rogo 1556: {
1.65 rogo 1557: URL url = new URL(xmlFile);
1.60 rogo 1558: stream = url.openStream();
1.65 rogo 1559: } else
1560: // read XML Metadata from a file
1561: stream = new FileInputStream(xmlFile);
1.60 rogo 1562: InputStreamReader isr = new InputStreamReader(stream, "UTF-8");
1.34 rogo 1563: BufferedReader buffr = new BufferedReader(isr);
1564: StringBuffer sb = new StringBuffer();
1565: int c = 0;
1566: while ((c = buffr.read()) != -1)
1567: {
1568: char ch = (char) c;
1569: sb.append(ch);
1570: // System.out.print((char)c);
1571: }
1572: parseXMLConfig(sb);
1573: } catch (Exception e)
1574: {
1575: e.printStackTrace();
1576: }
1.1 rogo 1577: }
1.64 rogo 1578: /**
1579: * Helper class for Conversion etc
1580: * Holds the some data
1581: * @author rogo
1582: *
1583: */
1.65 rogo 1584:
1585: public static class ConversionProperties
1.64 rogo 1586: {
1587: String destTableName;
1.65 rogo 1588: String[] fieldNames;
1589: public ConversionProperties()
1.64 rogo 1590: {
1591: }
1.65 rogo 1592: public ConversionProperties(String destTableName, String[] fieldNames)
1.64 rogo 1593: {
1594: this.destTableName = destTableName;
1.65 rogo 1595: this.fieldNames = fieldNames;
1596:
1.64 rogo 1597: }
1.65 rogo 1598:
1.64 rogo 1599: }
1.38 rogo 1600: /**
1601: * Helper class for XML-File parsing
1602: * Holds the parsed data
1603: * @author rogo
1604: *
1605: */
1.34 rogo 1606: public static class DataBase
1607: {
1608: DBBean bean;
1609: Vector creates;
1610: Vector selects;
1611: Vector layouts;
1612: Vector tables;
1613: Vector ids;
1.43 rogo 1614: String delimiter = "//";
1.69 rogo 1615: /**
1616: * maps table name to index fields
1617: */
1618: Hashtable htIndex = new Hashtable();
1.59 rogo 1619: boolean useNormanToUnicodeMapper = false;
1.65 rogo 1620:
1.34 rogo 1621: final static int CONVERT_MODE = 1;
1622: final static int APPEND_MODE = 2;
1623: final static int UPDATE_MODE = 3;
1.40 rogo 1624: final static int DELETE_MODE = 4;
1.62 rogo 1625: final static int SYNCHRONIZE_MODE = 5;
1.65 rogo 1626:
1.34 rogo 1627: int mode = -1;
1628:
1629: public DataBase(DBBean bean, Vector tables, Vector layouts, Vector selects, Vector creates, Vector ids, int mode)
1630: {
1631: this.bean = bean;
1632: this.tables = tables;
1633: this.layouts = layouts;
1634: this.selects = selects;
1635: this.creates = creates;
1636: this.ids = ids;
1637: this.mode = mode;
1638: this.bean.setIDVector(ids);
1639: }
1.38 rogo 1640: /**
1.69 rogo 1641: * @param indexListVec
1642: */
1643: public void buildIndexTable(Vector indexListVec)
1644: {
1.71 rogo 1645: for (int i = 0; i < tables.size(); i++)
1.69 rogo 1646: {
1.71 rogo 1647: fillIndexList((String) tables.get(i), (String) indexListVec.get(i));
1648: }
1.69 rogo 1649: }
1650: /**
1.42 rogo 1651: * writes the data contained in this object to the buffered writer
1.38 rogo 1652: * * @param buffr
1653: * @throws Exception
1654: */
1.34 rogo 1655: public void exportToXML(BufferedWriter buffr) throws Exception
1656: {
1657: // ids=bean.getIDVector();
1658: buffr.write(" <database>\n");
1659: buffr.write(" <url>" + bean.url + "</url>\n");
1660: buffr.write(" <user>" + bean.user + "</user>\n");
1661: buffr.write(" <password>" + bean.passwd + "</password>\n");
1.55 rogo 1662: buffr.write(" <delimiter>" + delimiter + "</delimiter>\n");
1.34 rogo 1663: String modeString = "";
1664: if (mode == CONVERT_MODE)
1665: modeString = "convert";
1666: else if (mode == APPEND_MODE)
1.5 rogo 1667: modeString = "append";
1.34 rogo 1668: else if (mode == UPDATE_MODE)
1669: modeString = "update";
1.48 rogo 1670: else if (mode == DELETE_MODE)
1.55 rogo 1671: modeString = "delete";
1.34 rogo 1672:
1673: buffr.write(" <mode>" + modeString + "</mode>\n");
1.59 rogo 1674: buffr.write(" <usenormantounicodemapper>" + useNormanToUnicodeMapper + "</usenormantounicodemapper>\n");
1.65 rogo 1675:
1.34 rogo 1676: int index = 0;
1677: while (index < tables.size())
1678: {
1679: String table = (String) tables.get(index);
1680: String layout = (String) layouts.get(index);
1681: String select = (String) selects.get(index);
1682: String create = (String) creates.get(index);
1683: String id = (String) ids.get(index);
1.69 rogo 1684: IndexList indexList = (IndexList) htIndex.get(table);
1685: if (indexList == null)
1686: indexList = new IndexList();
1687: buffr.write(" <table name = \"" + table + "\" layout = \"" + layout + "\" id = \"" + id + "\" indexList =\"" + indexList + "\">\n");
1.34 rogo 1688: buffr.write(" <select>" + convertToEntities(select) + "</select>\n");
1689: if (!create.equals(""))
1690: buffr.write(" <create>" + create + " </create>\n");
1691: buffr.write(" </table>\n");
1692: index++;
1693: }
1694: buffr.write(" </database>\n");
1695: }
1.69 rogo 1696:
1697: public void fillIndexList(String table, String list)
1698: {
1699: IndexList indexList = new IndexList();
1700: StringTokenizer tokenizer = new StringTokenizer(list, ",");
1701: while (tokenizer.hasMoreTokens())
1702: {
1703: indexList.add(tokenizer.nextToken());
1704: }
1705: System.out.println(indexList);
1.71 rogo 1706:
1707: htIndex.put(table, indexList);
1.69 rogo 1708: }
1.34 rogo 1709: public String toString()
1710: {
1711: return bean.url + " " + tables;
1712: }
1.1 rogo 1713:
1.34 rogo 1714: }
1715: public static String convertToUTF8(Object command)
1.1 rogo 1716: {
1.34 rogo 1717: String str = null;
1718: try
1719: {
1720: str = new String(command.toString().getBytes("UTF-8"));
1721: } catch (UnsupportedEncodingException e)
1722: {
1723: // TODO Auto-generated catch block
1724: e.printStackTrace();
1725: }
1726: return str;
1.1 rogo 1727: }
1728: public static void writeConfig(String file, DataBase source, DataBase destination) throws Exception
1729: {
1.34 rogo 1730: if (!file.toLowerCase().endsWith(".xml"))
1731: file += ".xml";
1.1 rogo 1732: File f = new File(file);
1.34 rogo 1733:
1734: FileOutputStream fout = new FileOutputStream(f);
1735: OutputStreamWriter outsw = new OutputStreamWriter(fout, "UTF-8");
1.1 rogo 1736: BufferedWriter buffw = new BufferedWriter(outsw);
1737: buffw.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
1738: buffw.newLine();
1739: buffw.write("<convert>\n");
1740: buffw.write(" <source>\n");
1741: source.exportToXML(buffw);
1742: buffw.write(" </source>\n");
1743: buffw.write("\n <destination>\n");
1744: destination.exportToXML(buffw);
1745: buffw.write(" </destination>\n");
1746: buffw.write("</convert>\n");
1747: buffw.close();
1.34 rogo 1748: }
1.46 rogo 1749: public static void delete(String source, String destination, Vector names, Vector layouts, Vector selects, Vector creates, Vector ids, int mode) throws Exception
1750: {
1751: FM2SQL.ProgressDialog dialog = null;
1752: if (FM2SQL.fmInstance != null)
1753: {
1.55 rogo 1754: dialog = new FM2SQL.ProgressDialog(FM2SQL.fmInstance, bean);
1.46 rogo 1755: dialog.setTitle("Conversion running ...");
1756: dialog.title.setText("Getting table data ...");
1757: dialog.setLocation(FM2SQL.fmInstance.getLocationOnScreen().x + (FM2SQL.fmInstance.getWidth() - 400) / 2, FM2SQL.fmInstance.getLocationOnScreen().y + (FM2SQL.fmInstance.getHeight() - 250) / 2);
1758: dialog.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
1759: FM2SQL.fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
1760: dialog.thread = Thread.currentThread();
1761: }
1762: // setting user and passwd
1763: bean.setUserAndPasswd(user, passwd);
1764: // setting user and passwd
1765: beanDest.setUserAndPasswd(userDest, passwdDest);
1766: if (dialog != null)
1767: dialog.setSize(400, 250);
1768: StringBuffer command = null;
1769: String query = null;
1770: try
1771: {
1772: //bean.setConnection("jdbc:fmpro:http://141.14.237.74:8050");
1773: //bean.setConnection("jdbc:postgresql://erebos/test","postgres","rogo");
1774: bean.setConnection(source);
1775: if (names == null)
1776: names = bean.getTableNames();
1777: // Collections.sort(names);
1778: int tbIndex = 1;
1779:
1780: // System.out.println("Start at "+names.indexOf("archimedes_facsimiles"));
1781: for (tbIndex = 0; tbIndex < names.size(); ++tbIndex)
1782: {
1783: Vector[] result = null;
1784: java.util.TreeSet myIds = new TreeSet();
1785: java.util.TreeSet myIdsDest = new TreeSet();
1786: int deltaID = 1;
1787: String idField = "";
1788: String destTableName = "";
1789:
1790: try
1791: {
1792: query = "select * from " + bean.getQC() + names.get(tbIndex).toString() + bean.getQC();
1793: String layout = (layouts.isEmpty()) ? "" : layouts.get(tbIndex).toString();
1794: query = (selects != null) ? selects.get(tbIndex).toString() : query;
1795: //if vectors[1].get(i) != null)
1796: if (layout != "")
1797: {
1798: layout = " layout " + bean.getQC() + layout + bean.getQC();
1799: String name = names.get(tbIndex).toString();
1800: StringBuffer queryLayout = new StringBuffer(query);
1801: queryLayout.insert(queryLayout.indexOf(name) + name.length() + 1, " " + layout);
1802: query = queryLayout.toString();
1803: System.out.println("added layout " + query);
1804:
1805: }
1806: dialog.title.setText("Getting table data ...");
1807: dialog.table.setText(names.get(tbIndex).toString());
1808: dialog.status.setText("Table " + (tbIndex + 1) + " of " + names.size());
1809: dialog.show();
1810: bean.getConnection();
1811: bean.makeQuery(query, 50);
1812: idField = ids.get(tbIndex).toString();
1813:
1814: } catch (Exception e)
1815: {
1816: continue;
1817: }
1818: // determine destTableName from createStatement or from source table name
1819: if (!creates.get(tbIndex).equals(""))
1820: {
1821: String create = creates.get(tbIndex).toString().toLowerCase();
1822: int fromIndex = create.indexOf("table") + 5;
1823: int toIndex = create.indexOf("(");
1824: destTableName = create.substring(fromIndex, toIndex).replaceAll(beanDest.getQC(), "").trim();
1825: System.out.println("destTable " + destTableName);
1826:
1827: } else
1828: destTableName = convertText(names.get(tbIndex).toString());
1829:
1830: // for id kram
1831: Vector vec = null;
1832: Vector vecDest = null;
1.47 rogo 1833: // tempo
1834: beanDest.setConnection(destination);
1.46 rogo 1835: int rowCount = (idField != "") ? myIds.size() : bean.getRowCount(query);
1836: String tempID = bean.getQC() + idField + bean.getQC();
1837: String tempIDdest = beanDest.getQC() + convertText(idField) + beanDest.getQC();
1.47 rogo 1838:
1.46 rogo 1839: int endIndex = -1;
1840: String tempQuery = query;
1.47 rogo 1841: String destQuery = query.replaceAll(names.get(tbIndex).toString(), destTableName);
1.49 rogo 1842: String tempQueryDest = destQuery;
1843: // remove extra query parts destQuery.substring(0,destQuery.lastIndexOf(destTableName)+destTableName.length()+1);
1.47 rogo 1844: System.out.println("new Query " + tempQueryDest);
1.46 rogo 1845: if (!idField.equals(""))
1846: {
1847: long startTime = System.currentTimeMillis();
1848: int counter = -1;
1849: while (true)
1850: {
1851: ++counter;
1852: if (counter == 0 && dialog != null)
1853: dialog.title.setText("Check if data is available");
1854: else if (dialog != null)
1855: dialog.title.setText("Check if more data is available");
1856: myIds = bean.getIDVector(ids.get(tbIndex).toString(), (String) names.get(tbIndex), tempQuery, numHits);
1857: myIdsDest = beanDest.getIDVector(convertText(idField), destTableName, tempQueryDest, numHits);
1858: if (myIds.isEmpty())
1859: break;
1860: vec = new Vector(myIds);
1861: vecDest = new Vector(myIdsDest);
1862: rowCount = vec.size();
1.47 rogo 1863: // Deletion will work this way
1864: Vector deleted = new Vector(vec);
1865: Vector linesToDelete = new Vector(vecDest);
1866: // remove all lines that should not be deleted
1867: linesToDelete.removeAll(deleted);
1868: // System.out.println("ID LIST SIZE " + Math.round((double) myIds.size() / (double) numIntervalls) + " " + myIdsDest.size());
1.46 rogo 1869: /// @TODO complete delete task remove query show lines to be deleted let user choose if he wants that
1.47 rogo 1870: System.out.println("number of lines to be deleted " + linesToDelete.size());
1.46 rogo 1871: deltaID = (int) Math.round((double) myIds.size() / (double) numIntervalls);
1.47 rogo 1872: beanDest.setConnection(destination);
1.46 rogo 1873:
1.47 rogo 1874: Statement stm = beanDest.getConnection().createStatement();
1.46 rogo 1875:
1.47 rogo 1876: Vector tables = beanDest.getTableNames();
1877: // Collections.sort(tables);
1878: System.out.println(names.get(tbIndex) + " " + tables.indexOf(convertText((String) names.get(tbIndex)))); // "//beanDest.getTypeNames());
1879: tables = beanDest.getTableNames();
1880: // System.out.println(beanDest.getTableNames(beanDest.getCatalogs().get(2).toString()));
1881: stm = beanDest.getConnection().createStatement();
1882:
1883: if (dialog != null)
1884: dialog.title.setText(" Deleting table data ...");
1885:
1886: int j = -1;
1887:
1888: Vector row = null;
1889: command = new StringBuffer();
1890:
1891: command.append("DELETE FROM");
1892: command.append(beanDest.getQC());
1893: command.append(destTableName);
1894: //command.append(convertText((String) names.get(tbIndex)));
1895: command.append(beanDest.getQC());
1896: int size = bean.getColumnNames().size();
1897: command.append("WHERE " + convertText(ids.get(tbIndex).toString()) + " = ?");
1898: PreparedStatement pstm = beanDest.getConnection().prepareStatement(command.toString());
1899: System.out.println(command + " " + tbIndex);
1900: //int rowCount = bean.getRowCount(query);
1901: // int idIndex = bean.getColumnNames().indexOf(ids.get(tbIndex));
1902: while (true)
1.46 rogo 1903: {
1904:
1.48 rogo 1905: ++j;
1.47 rogo 1906: if (j == linesToDelete.size())
1907: break;
1908: //print rows
1909: pstm.setString(1, linesToDelete.get(j).toString());
1910: System.out.println(pstm.toString());
1.55 rogo 1911: pstm.execute();
1.46 rogo 1912: if (dialog != null)
1.47 rogo 1913: dialog.progress.setValue((int) (((double) (j + 1) / (double) rowCount) * 100.0));
1914: command = null;
1.46 rogo 1915: }
1916: // prepare new query for next chunk
1917: if (query.indexOf("where") > 0)
1918: tempQuery = query + " and " + tempID + ">'" + vec.lastElement() + "'";
1919: else
1920: tempQuery = query + " where " + tempID + ">'" + vec.lastElement() + "'";
1921:
1.47 rogo 1922: } //to outer while
1923: } // to idfield if
1924: } // table loop
1925:
1926: } catch (Exception e)
1.55 rogo 1927: {
1928: System.out.println("Error while connecting to database " + e);
1.47 rogo 1929: if (dialog != null)
1930: {
1.55 rogo 1931: dialog.setVisible(false);
1.47 rogo 1932: dialog.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
1933: FM2SQL.fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
1.55 rogo 1934: }
1935: java.io.ByteArrayOutputStream b = new java.io.ByteArrayOutputStream();
1936: java.io.PrintStream stream = new java.io.PrintStream(b);
1937: stream.print(command + "\n\n");
1938: e.printStackTrace(stream);
1939: FM2SQL.showErrorDialog(b.toString(), "Error occured !");
1940:
1941: }
1942: if (dialog != null)
1943: {
1944: dialog.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
1945: FM2SQL.fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
1.46 rogo 1946:
1.55 rogo 1947: dialog.setVisible(false);
1948: }
1949: } // to method
1.65 rogo 1950:
1.60 rogo 1951: /**
1952: * synchronize method based on delete method code
1953: *
1954: * @param source
1955: * @param destination
1956: * @param names
1957: * @param layouts
1958: * @param selects
1959: * @param creates
1960: * @param ids
1961: * @param mode
1962: * @throws Exception
1963: */
1964: // TODO implement append,update and delete in one method
1965: // TODO using id based algorithm
1.71 rogo 1966: public static void synchronize(String source, String destination, Vector names, Vector layouts, Vector selects, Vector creates, Vector ids, int mode, String delimiter, Vector indexList)
1967: throws Exception
1.60 rogo 1968: {
1.62 rogo 1969: System.out.println(" bin in synchronize!!!");
1.60 rogo 1970: FM2SQL.ProgressDialog dialog = null;
1971: if (FM2SQL.fmInstance != null)
1972: {
1973: dialog = new FM2SQL.ProgressDialog(FM2SQL.fmInstance, bean);
1.61 rogo 1974: dialog.setTitle("Synchronize running ...");
1.60 rogo 1975: dialog.title.setText("Getting table data ...");
1976: dialog.setLocation(FM2SQL.fmInstance.getLocationOnScreen().x + (FM2SQL.fmInstance.getWidth() - 400) / 2, FM2SQL.fmInstance.getLocationOnScreen().y + (FM2SQL.fmInstance.getHeight() - 250) / 2);
1977: dialog.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
1978: FM2SQL.fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
1979: dialog.thread = Thread.currentThread();
1980: }
1981: // setting user and passwd
1982: bean.setUserAndPasswd(user, passwd);
1983: // setting user and passwd
1984: beanDest.setUserAndPasswd(userDest, passwdDest);
1985: if (dialog != null)
1986: dialog.setSize(400, 250);
1987: StringBuffer command = null;
1988: String query = null;
1989: try
1990: {
1991: //bean.setConnection("jdbc:fmpro:http://141.14.237.74:8050");
1992: //bean.setConnection("jdbc:postgresql://erebos/test","postgres","rogo");
1993: bean.setConnection(source);
1994: if (names == null)
1995: names = bean.getTableNames();
1996: // Collections.sort(names);
1997: int tbIndex = 1;
1998:
1999: // System.out.println("Start at "+names.indexOf("archimedes_facsimiles"));
2000: for (tbIndex = 0; tbIndex < names.size(); ++tbIndex)
2001: {
2002: Vector[] result = null;
2003: java.util.TreeSet myIds = new TreeSet();
2004: java.util.TreeSet myIdsDest = new TreeSet();
2005: int deltaID = 1;
2006: String idField = "";
2007: String destTableName = "";
2008:
2009: try
2010: {
2011: query = "select * from " + bean.getQC() + names.get(tbIndex).toString() + bean.getQC();
2012: String layout = (layouts.isEmpty()) ? "" : layouts.get(tbIndex).toString();
2013: query = (selects != null) ? selects.get(tbIndex).toString() : query;
2014: //if vectors[1].get(i) != null)
1.62 rogo 2015: if (!layout.equals(""))
1.60 rogo 2016: {
2017: layout = " layout " + bean.getQC() + layout + bean.getQC();
2018: String name = names.get(tbIndex).toString();
2019: StringBuffer queryLayout = new StringBuffer(query);
2020: queryLayout.insert(queryLayout.indexOf(name) + name.length() + 1, " " + layout);
2021: query = queryLayout.toString();
2022: System.out.println("added layout " + query);
2023:
2024: }
1.65 rogo 2025: if (dialog != null)
2026: {
2027: dialog.title.setText("Getting table data ...");
2028: dialog.table.setText(names.get(tbIndex).toString());
2029: dialog.status.setText("Table " + (tbIndex + 1) + " of " + names.size());
2030: dialog.show();
1.62 rogo 2031: }
1.60 rogo 2032: bean.getConnection();
2033: bean.makeQuery(query, 50);
2034: idField = ids.get(tbIndex).toString();
2035:
2036: } catch (Exception e)
2037: {
2038: continue;
2039: }
2040: // determine destTableName from createStatement or from source table name
2041: if (!creates.get(tbIndex).equals(""))
2042: {
2043: String create = creates.get(tbIndex).toString().toLowerCase();
2044: int fromIndex = create.indexOf("table") + 5;
2045: int toIndex = create.indexOf("(");
2046: destTableName = create.substring(fromIndex, toIndex).replaceAll(beanDest.getQC(), "").trim();
2047: System.out.println("destTable " + destTableName);
2048:
2049: } else
2050: destTableName = convertText(names.get(tbIndex).toString());
2051:
2052: // for id kram
2053: Vector vec = null;
2054: Vector vecDest = null;
2055: // tempo
2056: beanDest.setConnection(destination);
2057: int rowCount = (idField != "") ? myIds.size() : bean.getRowCount(query);
2058: String tempID = bean.getQC() + idField + bean.getQC();
2059: String tempIDdest = beanDest.getQC() + convertText(idField) + beanDest.getQC();
2060:
2061: int endIndex = -1;
2062: String tempQuery = query;
2063: String destQuery = query.replaceAll(names.get(tbIndex).toString(), destTableName);
1.76 ! rogo 2064: destQuery = destQuery.replaceAll(bean.getQC(), beanDest.getQC());
! 2065: destQuery = removeLayoutPartFromQuery(destQuery, layouts.get(tbIndex).toString());
1.74 rogo 2066: // TODO remove layout part for destQuery
1.60 rogo 2067: String tempQueryDest = destQuery;
2068: // remove extra query parts destQuery.substring(0,destQuery.lastIndexOf(destTableName)+destTableName.length()+1);
2069: System.out.println("new Query " + tempQueryDest);
2070: if (!idField.equals(""))
2071: {
2072: long startTime = System.currentTimeMillis();
2073: int counter = -1;
1.66 rogo 2074: TreeSet linesToDelete = null;
2075: PreparedStatement delPSt = null;
1.60 rogo 2076: while (true)
2077: {
2078: ++counter;
2079: if (counter == 0 && dialog != null)
2080: dialog.title.setText("Check if data is available");
2081: else if (dialog != null)
2082: dialog.title.setText("Check if more data is available");
1.68 rogo 2083: myIds = bean.getIDVector(ids.get(tbIndex).toString(), (String) names.get(tbIndex), tempQuery, 0);
2084: myIdsDest = beanDest.getIDVector(convertText(idField), destTableName, tempQueryDest, 0);
1.69 rogo 2085: //System.out.println("status of remove "+myIds.remove("b015892"));
1.60 rogo 2086: if (myIds.isEmpty())
2087: break;
2088: vec = new Vector(myIds);
2089: vecDest = new Vector(myIdsDest);
2090: rowCount = vec.size();
2091: // Deletion will work this way
2092: Vector deleted = new Vector(vec);
1.69 rogo 2093:
1.67 rogo 2094: TreeSet linesToAppend = new TreeSet(vec);
2095: linesToAppend.addAll(vec);
1.66 rogo 2096: linesToDelete = new TreeSet(vecDest);
1.61 rogo 2097: // remove all lines that are already in dest database
2098: linesToAppend.removeAll(vecDest);
1.60 rogo 2099: // remove all lines that should not be deleted
2100: linesToDelete.removeAll(deleted);
1.67 rogo 2101: System.out.println("linesToAppend " + linesToAppend + " " + destTableName);
2102: System.out.println("linesToDelete " + linesToDelete + " " + destTableName);
1.66 rogo 2103: System.out.println("ID LIST SIZE " + Math.round((double) myIds.size() / (double) numIntervalls) + " " + myIds.size());
2104: deltaID = (int) Math.round((double) myIds.size() / (double) numIntervalls);
1.65 rogo 2105: ConversionProperties prop = getFieldNamesAndDestTableName(creates.get(tbIndex).toString(), query, names.get(tbIndex).toString());
2106: StringBuffer insCommand = createInsertCommand(prop.destTableName, prop.fieldNames);
1.67 rogo 2107: StringBuffer updCommand = createUpdateCommand(prop.destTableName, prop.fieldNames, tempIDdest);
2108: StringBuffer delCommand = createDeleteCommand(destTableName, tempIDdest);
1.65 rogo 2109: PreparedStatement insPst = beanDest.getConnection().prepareStatement(insCommand.toString());
2110: PreparedStatement updPst = beanDest.getConnection().prepareStatement(updCommand.toString());
1.69 rogo 2111: delPSt = beanDest.getConnection().prepareStatement(delCommand.toString());
2112: // delPSt.setString(1,"b015892");
2113: // delPSt.execute();
2114: // if (true)
1.67 rogo 2115: // return;
1.66 rogo 2116: if (vec.size() <= numIntervalls)
1.65 rogo 2117: {
1.66 rogo 2118: endIndex = 0;
2119: deltaID = vec.size();
1.65 rogo 2120: }
1.66 rogo 2121: for (int k = 0; k < vec.size() - deltaID; k = k + deltaID)
2122: {
2123: System.out.println(vec.get(k) + " " + vec.get(k + deltaID) + " " + vec.lastElement());
2124: if (query.indexOf("where") > 0)
2125: tempQuery = query + " and " + tempID + ">='" + vec.get(k) + "' and " + tempID + "<='" + vec.get(k + deltaID) + "'";
2126: else
2127: tempQuery = query + " where " + tempID + ">='" + vec.get(k) + "' and " + tempID + "<='" + vec.get(k + deltaID) + "'";
2128: System.out.println(tempQuery);
2129: if (dialog != null)
2130: dialog.title.setText("Reading table data ...");
1.65 rogo 2131:
1.66 rogo 2132: // bean.makeQuery(tempQuery, deltaID);
2133: if (dialog != null)
2134: dialog.title.setText("Writing table data ...");
1.60 rogo 2135:
1.68 rogo 2136: performSynchronize(idField, vec, tempQuery, linesToDelete, linesToAppend, insPst, updPst, delPSt, deltaID, delimiter);
1.66 rogo 2137: // System.out.println("ID LIST SIZE " + Math.round((double) myIds.size() / (double) numIntervalls) + " " + myIdsDest.size());
2138: endIndex = k + deltaID;
2139: }
2140: System.out.println(endIndex);
2141: //all data written ? if not write last chunk of data
2142: if (endIndex == vec.size() - 1)
2143: System.out.println("fits");
2144: else
1.60 rogo 2145: {
1.66 rogo 2146: System.out.println(" last intervall from " + vec.get(endIndex) + " " + vec.lastElement());
1.60 rogo 2147:
1.66 rogo 2148: if (query.indexOf("where") > 0)
2149: tempQuery = query + " and " + tempID + ">='" + vec.get(endIndex) + "' and " + tempID + "<='" + vec.lastElement() + "'";
2150: else
2151: tempQuery = query + " where " + tempID + ">='" + vec.get(endIndex) + "' and " + tempID + "<='" + vec.lastElement() + "'";
2152: System.out.println(tempQuery);
2153: if (dialog != null)
2154: dialog.title.setText("Reading table data ...");
1.69 rogo 2155: // bean.makeQuery(tempQuery, 0);
1.60 rogo 2156: if (dialog != null)
1.66 rogo 2157: dialog.title.setText("Writing table data ...");
1.68 rogo 2158: performSynchronize(idField, vec, tempQuery, linesToDelete, linesToAppend, insPst, updPst, delPSt, deltaID, delimiter);
1.66 rogo 2159: // System.out.println("ID LIST SIZE " + Math.round((double) myIds.size() / (double) numIntervalls) + " " + myIdsDest.size());
1.60 rogo 2160: }
2161: // prepare new query for next chunk
2162: if (query.indexOf("where") > 0)
2163: tempQuery = query + " and " + tempID + ">'" + vec.lastElement() + "'";
2164: else
2165: tempQuery = query + " where " + tempID + ">'" + vec.lastElement() + "'";
1.66 rogo 2166:
2167: }
1.71 rogo 2168: String tableName = names.get(tbIndex).toString();
2169: IndexList idList = (IndexList) indexList.get(0);
2170: System.out.println("found list " + idList);
2171: Statement stm = beanDest.getConnection().createStatement();
2172: Vector destTables = beanDest.getTableNames();
1.76 ! rogo 2173: System.out.println("tempQueryDest" + tempQueryDest);
! 2174: beanDest.makeQuery(tempQueryDest, 0);
1.71 rogo 2175: for (Iterator iter = idList.iterator(); iter.hasNext();)
2176: {
2177: String indexField = (String) iter.next();
2178: indexField = convertText(indexField);
2179: String indexName = destTableName + "_" + indexField;
2180: if (destTables.contains(indexName))
2181: {
1.76 ! rogo 2182: stm.execute("DROP INDEX " + destTableName + "_" + indexField);
! 2183: // continue;
1.71 rogo 2184: }
1.76 ! rogo 2185: // stm.execute("DROP INDEX "+destTableName+"_"+indexField);
1.69 rogo 2186:
1.71 rogo 2187: String type = beanDest.getColumnType(indexField).toLowerCase();
1.76 ! rogo 2188: // System.out.println(indexField+" "+type+" "+(type.indexOf("text") >= 0 || type.indexOf("varchar") >= 0 || type.indexOf("char") >= 0));
1.71 rogo 2189: if (type.indexOf("text") >= 0 || type.indexOf("varchar") >= 0 || type.indexOf("char") >= 0)
1.76 ! rogo 2190: {
! 2191: if (beanDest.url.indexOf("mysql") >= 0)
! 2192: {
! 2193: //System.out.println("CREATE INDEX " + indexName + " ON " + destTableName + " (" + indexField + "(10))");
! 2194: // TODO problem if index exist !!!
! 2195: stm.execute("CREATE INDEX " + indexName + " ON " + destTableName + " (" + indexField + "(10))");
! 2196: } else
! 2197: {
! 2198: stm.execute("CREATE INDEX " + indexName + " ON " + destTableName + " (lower( " + indexField + "))");
! 2199:
! 2200: }
! 2201:
! 2202: } else
! 2203: {
1.71 rogo 2204: stm.execute("CREATE INDEX " + destTableName + "_" + indexField + " ON " + destTableName + "(" + indexField + ")");
2205:
1.76 ! rogo 2206: }
! 2207:
! 2208: // stm.execute("DROP INDEX "+destTableName+"_"+indexField);
1.71 rogo 2209:
2210: }
2211: // CREATE UNIQUE INDEX title_idx ON films (title);
1.66 rogo 2212: for (Iterator iter = linesToDelete.iterator(); iter.hasNext();)
2213: {
2214: String id = (String) iter.next();
2215: delPSt.setString(1, id);
2216: delPSt.execute();
2217:
2218: }
2219:
2220: long endTime = System.currentTimeMillis();
2221: System.out.println("Time for incremental synchronize elapsed " + (endTime - startTime));
1.60 rogo 2222: } // to idfield if
2223: } // table loop
2224:
2225: } catch (Exception e)
2226: {
2227: System.out.println("Error while connecting to database " + e);
1.67 rogo 2228: e.printStackTrace();
1.60 rogo 2229: if (dialog != null)
2230: {
2231: dialog.setVisible(false);
2232: dialog.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
2233: FM2SQL.fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
2234: }
2235: java.io.ByteArrayOutputStream b = new java.io.ByteArrayOutputStream();
2236: java.io.PrintStream stream = new java.io.PrintStream(b);
2237: stream.print(command + "\n\n");
2238: e.printStackTrace(stream);
2239: FM2SQL.showErrorDialog(b.toString(), "Error occured !");
2240:
2241: }
2242: if (dialog != null)
2243: {
2244: dialog.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
2245: FM2SQL.fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
2246:
2247: dialog.setVisible(false);
2248: }
1.66 rogo 2249: }
1.75 rogo 2250: /**
1.76 ! rogo 2251: * @param destQuery
! 2252: * @param string
! 2253: * @return
! 2254: */
! 2255: private static String removeLayoutPartFromQuery(String destQuery, String layoutName)
! 2256: {
! 2257: String removeString = "layout " + beanDest.getQC() + layoutName + beanDest.getQC();
! 2258: destQuery = destQuery.replaceFirst(removeString, "");
! 2259: System.out.println("destQuery change to " + destQuery);
! 2260: return destQuery;
! 2261: }
! 2262: private static void performSynchronize(
1.66 rogo 2263: String idField,
2264: Vector vec,
2265: String tempQuery,
2266: TreeSet linesToDelete,
2267: TreeSet linesToAppend,
2268: PreparedStatement insPst,
2269: PreparedStatement updPst,
2270: PreparedStatement delPSt,
1.67 rogo 2271: int deltaID,
2272: String delimiter)
1.66 rogo 2273: throws SQLException, ParseException
2274: {
2275: Vector[] vectors = bean.getQueryData(tempQuery, deltaID);
2276: int idIndex = vectors[1].indexOf(idField);
2277: // todo arraylist code has to be added
2278: for (Iterator iter = vectors[0].iterator(); iter.hasNext();)
2279: {
2280: Vector line = (Vector) iter.next();
2281: Object lineIDIndex = line.get(idIndex);
1.67 rogo 2282: if (linesToAppend.contains(lineIDIndex))
2283: System.out.println("line " + linesToAppend.contains(line.get(idIndex)) + " " + lineIDIndex);
1.66 rogo 2284: if (linesToAppend.contains(lineIDIndex))
2285: {
2286: for (int l = 0; l < line.size(); ++l)
2287: {
2288: Object obj = line.get(l);
1.67 rogo 2289: if (obj instanceof ArrayList)
2290: obj = formatFileMakerArray((List) obj, delimiter);
1.66 rogo 2291: if (obj != null)
2292: insPst.setString(l + 1, obj.toString());
2293: else
2294: insPst.setNull(l + 1, Types.NULL);
2295: }
2296: insPst.execute();
2297:
2298: } else // update
2299: {
2300: for (int l = 0; l < line.size(); ++l)
2301: {
2302: Object obj = line.get(l);
1.67 rogo 2303: if (obj instanceof ArrayList)
2304: obj = formatFileMakerArray((List) obj, delimiter);
1.66 rogo 2305: if (obj != null)
2306: updPst.setString(l + 1, obj.toString());
2307: else
2308: updPst.setNull(l + 1, Types.NULL);
2309: }
2310: updPst.setString(line.size() + 1, line.get(idIndex).toString());
1.72 rogo 2311: //updPst.addBatch();
1.66 rogo 2312: updPst.execute();
2313: }
2314: }
1.72 rogo 2315: //updPst.executeBatch();
1.60 rogo 2316: } // to method
2317:
1.56 rogo 2318: /**
2319: * Converts input String in norman encoding to unicode
2320: * @param inp
2321: * @return converted String
2322: */
1.65 rogo 2323: static public String normanToUnicode(String inp)
2324: {
1.56 rogo 2325: StringBuffer buf = new StringBuffer();
1.65 rogo 2326: for (int i = 0; i < inp.length(); i++)
2327: {
1.56 rogo 2328: char c = inp.charAt(i);
1.65 rogo 2329: // System.out.println("char "+c+" "+(int)c);
2330: switch (c)
2331: {
2332: case 1 :
2333: buf.append("\u00d0");
2334: break; // Eth
2335: case 2 :
2336: buf.append("\u00f0");
2337: break; // eth
2338: case 3 :
2339: buf.append("\u0141");
2340: break; // Lslash
2341: case 4 :
2342: buf.append("\u0142");
2343: break; // lslash
2344: case 5 :
2345: buf.append("\u0160");
2346: break; // S caron
2347: case 6 :
2348: buf.append("\u0161");
2349: break; // s caron
2350: case 7 :
2351: buf.append("\u00dd");
2352: break; // Y acute
2353: case 8 :
2354: buf.append("\u00fd");
2355: break; // y acute
2356: case 11 :
2357: buf.append("\u00de");
2358: break; // Thorn
2359: case 12 :
2360: buf.append("\u00fe");
2361: break; // thorn
2362: case 14 :
2363: buf.append("\u017d");
2364: break; // Z caron
2365: case 15 :
2366: buf.append("\u017e");
2367: break; // z caron
2368: case 17 :
2369: buf.append("\u0073");
2370: break; // asciitilde
2371: case 18 :
2372: buf.append("j\u0305");
2373: break; // j macron [does a single char exist?]
2374: case 19 :
2375: buf.append("^");
2376: break; // circumflex
2377: case 20 :
2378: buf.append("\u0303");
2379: break; // tilde
2380: case 21 :
2381: buf.append("\u00bd");
2382: break; // onehalf
2383: case 22 :
2384: buf.append("\u00bc");
2385: break; // onequarter
2386: case 23 :
2387: buf.append("\u00b9");
2388: break; // onesuperior
2389: case 24 :
2390: buf.append("\u00be");
2391: break; // threequarters
2392: case 25 :
2393: buf.append("\u00b3");
2394: break; // threesuperior
2395: case 26 :
2396: buf.append("\u00b2");
2397: break; // twosuperior
2398: case 27 :
2399: buf.append("\u00a6");
2400: break; // brokenbar
2401: case 28 :
2402: buf.append("-");
2403: break; // minus
2404: case 29 :
2405: buf.append("\u00d7");
2406: break; // multiply
2407: case 39 :
2408: buf.append("'");
2409: break; // quotesingle
2410: case 94 :
2411: buf.append("\u0302");
2412: break; // circumflex
2413: case 96 :
2414: buf.append("\u0300");
2415: break; // grave
2416: case 196 :
2417: buf.append("\u00c4");
2418: break; // A dieresis
2419: case 197 :
2420: buf.append("\u00c5");
2421: break; // A ring
2422: case 201 :
2423: buf.append("\u00c9");
2424: break; // E acute
2425: case 209 :
2426: buf.append("\u00d1");
2427: break; // N tilde
2428: case 214 :
2429: buf.append("\u00d6");
2430: break; // O dieresis
2431: case 220 :
2432: buf.append("\u00dc");
2433: break; // U dieresis
2434: case 225 :
2435: buf.append("\u00e1");
2436: break; // a acute
2437: case 224 :
2438: buf.append("\u00e0");
2439: break; // a grave
2440: case 226 :
2441: buf.append("\u00e2");
2442: break; // a circumflex
2443: case 228 :
2444: buf.append("\u00e4");
2445: break; // a dieresis
2446: case 227 :
2447: buf.append("\u00e3");
2448: break; // a tilde
2449: case 229 :
2450: buf.append("\u0101");
2451: break; // a macron
2452: case 231 :
2453: buf.append("\u00e7");
2454: break; // c cedilla
2455: case 233 :
2456: buf.append("\u00e9");
2457: break; // e acute
2458: case 232 :
2459: buf.append("\u00e8");
2460: break; // e grave
2461: case 234 :
2462: buf.append("\u00ea");
2463: break; // e circumflex
2464: case 235 :
2465: buf.append("\u00eb");
2466: break; // e dieresis
2467: case 237 :
2468: buf.append("\u00ed");
2469: break; // i acute
2470: case 236 :
2471: buf.append("\u00ec");
2472: break; // i grave
2473: case 238 :
2474: buf.append("\u00ee");
2475: break; // i circumflex
2476: case 239 :
2477: buf.append("\u00ef");
2478: break; // i dieresis
2479: case 241 :
2480: buf.append("\u00f1");
2481: break; // n tilde
2482: case 243 :
2483: buf.append("\u00f3");
2484: break; // o acute
2485: case 242 :
2486: buf.append("\u00f2");
2487: break; // o grave
2488: case 244 :
2489: buf.append("\u00f4");
2490: break; // o circumflex
2491: case 246 :
2492: buf.append("\u00f6");
2493: break; // o dieresis
2494: case 245 :
2495: buf.append("\u00f5");
2496: break; // o tilde
2497: case 250 :
2498: buf.append("\u00fa");
2499: break; // u acute
2500: case 249 :
2501: buf.append("\u00f9");
2502: break; // u grave
2503: case 251 :
2504: buf.append("\u00fb");
2505: break; // u circumflex
2506: case 252 :
2507: buf.append("\u00fc");
2508: break; // u dieresis
2509: case 8224 :
2510: buf.append("\u1e6d");
2511: break; // t underdot
2512: case 176 :
2513: buf.append("\u00b0");
2514: break; // degree
2515: case 162 :
2516: buf.append("\u1ebd");
2517: break; // e tilde
2518: case 163 :
2519: buf.append("\u00a3");
2520: break; // sterling
2521: case 167 :
2522: buf.append("\u00a7");
2523: break; // section
2524: case 182 :
2525: buf.append("\u00b6");
2526: break; // paragraph
2527: case 223 :
2528: buf.append("\u015b");
2529: break; // s acute
2530: case 174 :
2531: buf.append("\u1e5b");
2532: break; // r underdot
2533: case 169 :
2534: buf.append("\u1e45");
2535: break; // n overdot
2536: case 353 :
2537: buf.append("\u1e45");
2538: break; // n overdot
2539: case 180 :
2540: buf.append("\u0301");
2541: break; // acute
2542: case 168 :
2543: buf.append("\u0308");
2544: break; // dieresis
2545: case 8800 :
2546: buf.append("\u1e6d");
2547: break; // t underdot
2548: case 198 :
2549: buf.append("\u00c6");
2550: break; // AE
2551: case 216 :
2552: buf.append("\u014d");
2553: break; // o macron
2554: case 8734 :
2555: buf.append("\u0129");
2556: break; // i tilde
2557: case 177 :
2558: buf.append("\u00b1");
2559: break; // plusminus
2560: case 165 :
2561: buf.append("\u012b");
2562: break; // i macron
2563: case 181 :
2564: buf.append("\u1e43");
2565: break; // m underdot
2566: case 8706 :
2567: buf.append("\u1e0d");
2568: break; // d underdot
2569: case 240 :
2570: buf.append("\u1e0d");
2571: break; // d underdot
2572:
2573: case 8721 :
2574: buf.append("\u1e63");
2575: break; // s underdot
2576: case 960 :
2577: buf.append("\u017a");
2578: break; // z acute
2579: case 8747 :
2580: buf.append("\u1e45");
2581: break; // n overdot
2582: case 937 :
2583: buf.append("\u0169");
2584: break; // u tilde
2585: case 230 :
2586: buf.append("\u00e6");
2587: break; // ae
2588: case 248 :
2589: buf.append("\u00f8");
2590: break; // oslash
2591: case 191 :
2592: buf.append("\u0304\u0306");
2593: break; // macron breve
2594: case 172 :
2595: buf.append("\u1e37");
2596: break; //
2597: case 8730 :
2598: buf.append("j\u0305");
2599: break; // j macron [does a single char exist?]
2600: case 402 :
2601: buf.append("\u0103");
2602: break; // a breve
2603: case 8776 :
2604: buf.append("\u016d");
2605: break; // u breve
2606: case 187 :
2607: buf.append("\u1e42");
2608: break; // M underdot
2609: case 8230 :
2610: buf.append("\u2026");
2611: break; // ellipsis
2612: case 192 :
2613: buf.append("\u00c0");
2614: break; // A grave
2615: case 195 :
2616: buf.append("\u00c3");
2617: break; // A tilde
2618: case 213 :
2619: buf.append("\u00d5");
2620: break; // O tilde
2621: case 338 :
2622: buf.append("m\u0306");
2623: break; // m breve
2624: case 339 :
2625: buf.append("\u0153");
2626: break; // oe
2627: case 8211 :
2628: buf.append("\u2013");
2629: break; // endash
2630: case 8212 :
2631: buf.append("\u2014");
2632: break; // emdash
2633: case 8220 :
2634: buf.append("\u201c");
2635: break; // quotedblleft
2636: case 8221 :
2637: buf.append("\u201d");
2638: break; // quotedblright
2639: case 8216 :
2640: buf.append("\u2018");
2641: break; // quoteleft
2642: case 8217 :
2643: buf.append("\u2019");
2644: break; // quoteright
2645: case 247 :
2646: buf.append("\u1e37");
2647: break; // l underring [actually underdot]
2648: case 9674 :
2649: buf.append("\u1e41");
2650: break; // m overdot
2651: case 255 :
2652: buf.append("n\u0306");
2653: break; // n breve
2654: case 376 :
2655: buf.append("\u00d7");
2656: break; // multiply
2657: case 8364 :
2658: buf.append("\u1e5b");
2659: break; // r underring [actually underdot]
2660: case 8249 :
2661: buf.append("\u1e44");
2662: break; // N overdot
2663: case 8250 :
2664: buf.append("\u1e62");
2665: break; // S underdot
2666: case 64257 :
2667: buf.append("\u1e24");
2668: break; // H underdot
2669: case 64258 :
2670: buf.append("\u1e0c");
2671: break; // D underdot
2672: case 8225 :
2673: buf.append("\u2021");
2674: break; // daggerdbl
2675: case 8218 :
2676: buf.append("\u1e36");
2677: break; // L underdot
2678: case 8222 :
2679: buf.append("\u0113");
2680: break; // e macron
2681: case 194 :
2682: buf.append("\u1e5f");
2683: break; // r underbar
2684: case 202 :
2685: buf.append("r\u0324");
2686: break; // r underdieresis
2687: case 193 :
2688: buf.append("\u012a");
2689: break; // I macron
2690: case 8486 :
2691: case 203 :
2692: buf.append("\u016b");
2693: break; // u macron
2694: case 200 :
2695: buf.append("\u1e6c");
2696: break; // T underdot
2697: case 205 :
2698: buf.append("\u1e64");
2699: break; // S acute
2700: case 206 :
2701: buf.append("\u2020");
2702: break; // dagger
2703: case 207 :
2704: buf.append("\u0115");
2705: break; // e breve
2706: case 204 :
2707: buf.append("\u014f");
2708: break; // o breve
2709: case 211 :
2710: buf.append("\u0100");
2711: break; // A macron
2712: case 212 :
2713: buf.append("\u1e46");
2714: break; // N underdot
2715: case 210 :
2716: buf.append("\u1e3b");
2717: break; // l underbar
2718: case 218 :
2719: buf.append("\u016a");
2720: break; // U macron
2721: case 219 :
2722: buf.append("\u0179");
2723: break; // Z acute
2724: case 217 :
2725: buf.append("\u1e5a");
2726: break; // R underdot
2727: case 305 :
2728: buf.append("\u0131");
2729: break; // dotlessi
2730: case 710 :
2731: buf.append("\u1e47");
2732: break; // n underdot
2733: case 732 :
2734: buf.append("\u1e49");
2735: break; // n underbar
2736: case 175 :
2737: buf.append("\u0304");
2738: break; // macron
2739: case 728 :
2740: buf.append("\u0306");
2741: break; // breve
2742: case 729 :
2743: case 215 :
2744: buf.append("\u1e25");
2745: break; // h underdot
2746: case 730 :
2747: buf.append("\u012d");
2748: break; // i breve
2749: case 184 :
2750: buf.append("\u0327");
2751: break; // cedilla
2752: case 733 :
2753: buf.append("\u030b");
2754: break; // hungarumlaut
2755: case 731 :
2756: buf.append("\u0328");
2757: break; // ogonek
2758: case 711 :
2759: buf.append("\u030c");
2760: break; // caron
2761: case 199 :
2762: buf.append("\u012b\u0303");
2763: break; // imacron tilde
2764: case 8226 :
2765: buf.append("\u1e5d");
2766: break; // runderdot macron
2767: case 8482 :
2768: buf.append("\u016b\0306");
2769: break; // umacron breve
2770: case 8804 :
2771: buf.append("\u0101\u0301");
2772: break; // amacron acute
2773: case 8805 :
2774: buf.append("\u016b\u0301");
2775: break; // umacron acute
2776: case 8719 :
2777: buf.append("\u0113\u0301");
2778: break; // emacron acute
2779: case 170 :
2780: buf.append("\u0113\u0300");
2781: break; // emacron breve
2782: case 186 :
2783: buf.append("\u014d\u0300");
2784: break; // omacron breve
2785: case 161 :
2786: buf.append("\u0101\u0306");
2787: break; // amacron breve
2788: case 8710 :
2789: buf.append("\u0101\u0303");
2790: break; // amacron tilde
2791: case 171 :
2792: buf.append("\u012b\u0301");
2793: break; // imacron acute
2794: case 8260 :
2795: buf.append("\u1e00");
2796: break; // runderdotmacron acute
2797: case 183 :
2798: buf.append("\u1e5b\u0301");
2799: break; // runderdot acute
2800: case 8240 :
2801: buf.append("\u012b\u0306");
2802: break; // imacron breve
2803: case 63743 :
2804: buf.append("\u016b\u0303");
2805: break; // umacron tilde
2806: default :
2807: buf.append(c);
2808: if ((int) c > 127)
2809: System.out.println("char " + c + " " + (int) c);
2810: break;
1.57 rogo 2811: }
2812: }
2813: return buf.toString();
2814: }
2815:
1.65 rogo 2816: static public String normanToUnicodeOld(String inp)
2817: {
1.57 rogo 2818: StringBuffer buf = new StringBuffer();
1.65 rogo 2819: for (int i = 0; i < inp.length(); i++)
2820: {
1.57 rogo 2821: char c = inp.charAt(i);
1.65 rogo 2822: switch (c)
2823: {
2824: case 1 :
2825: buf.append("\u00d0");
2826: break; // Eth
2827: case 2 :
2828: buf.append("\u00f0");
2829: break; // eth
2830: case 3 :
2831: buf.append("\u0141");
2832: break; // Lslash
2833: case 4 :
2834: buf.append("\u0142");
2835: break; // lslash
2836: case 5 :
2837: buf.append("\u0160");
2838: break; // S caron
2839: case 6 :
2840: buf.append("\u0161");
2841: break; // s caron
2842: case 7 :
2843: buf.append("\u00dd");
2844: break; // Y acute
2845: case 8 :
2846: buf.append("\u00fd");
2847: break; // y acute
2848: case 11 :
2849: buf.append("\u00de");
2850: break; // Thorn
2851: case 12 :
2852: buf.append("\u00fe");
2853: break; // thorn
2854: case 14 :
2855: buf.append("\u017d");
2856: break; // Z caron
2857: case 15 :
2858: buf.append("\u017e");
2859: break; // z caron
2860: case 17 :
2861: buf.append("\u0073");
2862: break; // asciitilde
2863: case 18 :
2864: buf.append("j\u0305");
2865: break; // j macron [does a single char exist?]
2866: case 19 :
2867: buf.append("^");
2868: break; // circumflex
2869: case 20 :
2870: buf.append("\u0303");
2871: break; // tilde
2872: case 21 :
2873: buf.append("\u00bd");
2874: break; // onehalf
2875: case 22 :
2876: buf.append("\u00bc");
2877: break; // onequarter
2878: case 23 :
2879: buf.append("\u00b9");
2880: break; // onesuperior
2881: case 24 :
2882: buf.append("\u00be");
2883: break; // threequarters
2884: case 25 :
2885: buf.append("\u00b3");
2886: break; // threesuperior
2887: case 26 :
2888: buf.append("\u00b2");
2889: break; // twosuperior
2890: case 27 :
2891: buf.append("\u00a6");
2892: break; // brokenbar
2893: case 28 :
2894: buf.append("-");
2895: break; // minus
2896: case 29 :
2897: buf.append("\u00d7");
2898: break; // multiply
2899: case 39 :
2900: buf.append("'");
2901: break; // quotesingle
2902: case 94 :
2903: buf.append("\u0302");
2904: break; // circumflex
2905: case 96 :
2906: buf.append("\u0300");
2907: break; // grave
2908: case 128 :
2909: buf.append("\u00c4");
2910: break; // A dieresis
2911: case 129 :
2912: buf.append("\u00c5");
2913: break; // A ring
2914: case 131 :
2915: buf.append("\u00c9");
2916: break; // E acute
2917: case 132 :
2918: buf.append("\u00d1");
2919: break; // N tilde
2920: case 133 :
2921: buf.append("\u00d6");
2922: break; // O dieresis
2923: case 134 :
2924: buf.append("\u00dc");
2925: break; // U dieresis
2926: case 135 :
2927: buf.append("\u00e1");
2928: break; // a acute
2929: case 136 :
2930: buf.append("\u00e0");
2931: break; // a grave
2932: case 137 :
2933: buf.append("\u00e2");
2934: break; // a circumflex
2935: case 138 :
2936: buf.append("\u00e4");
2937: break; // a dieresis
2938: case 139 :
2939: buf.append("\u00e3");
2940: break; // a tilde
2941: case 140 :
2942: buf.append("\u0101");
2943: break; // a macron
2944: case 141 :
2945: buf.append("\u00e7");
2946: break; // c cedilla
2947: case 142 :
2948: buf.append("\u00e9");
2949: break; // e acute
2950: case 143 :
2951: buf.append("\u00e8");
2952: break; // e grave
2953: case 144 :
2954: buf.append("\u00ea");
2955: break; // e circumflex
2956: case 145 :
2957: buf.append("\u00eb");
2958: break; // e dieresis
2959: case 146 :
2960: buf.append("\u00ed");
2961: break; // i acute
2962: case 147 :
2963: buf.append("\u00ec");
2964: break; // i grave
2965: case 148 :
2966: buf.append("\u00ee");
2967: break; // i circumflex
2968: case 149 :
2969: buf.append("\u00ef");
2970: break; // i dieresis
2971: case 150 :
2972: buf.append("\u00f1");
2973: break; // n tilde
2974: case 151 :
2975: buf.append("\u00f3");
2976: break; // o acute
2977: case 152 :
2978: buf.append("\u00f2");
2979: break; // o grave
2980: case 153 :
2981: buf.append("\u00f4");
2982: break; // o circumflex
2983: case 154 :
2984: buf.append("\u00f6");
2985: break; // o dieresis
2986: case 155 :
2987: buf.append("\u00f5");
2988: break; // o tilde
2989: case 156 :
2990: buf.append("\u00fa");
2991: break; // u acute
2992: case 157 :
2993: buf.append("\u00f9");
2994: break; // u grave
2995: case 158 :
2996: buf.append("\u00fb");
2997: break; // u circumflex
2998: case 159 :
2999: buf.append("\u00fc");
3000: break; // u dieresis
3001: case 160 :
3002: buf.append("\u1e6d");
3003: break; // t underdot
3004: case 161 :
3005: buf.append("\u00b0");
3006: break; // degree
3007: case 162 :
3008: buf.append("\u1ebd");
3009: break; // e tilde
3010: case 163 :
3011: buf.append("\u00a3");
3012: break; // sterling
3013: case 164 :
3014: buf.append("\u00a7");
3015: break; // section
3016: case 166 :
3017: buf.append("\u00b6");
3018: break; // paragraph
3019: case 167 :
3020: buf.append("\u015b");
3021: break; // s acute
3022: case 168 :
3023: buf.append("\u1e5b");
3024: break; // r underdot
3025: case 169 :
3026: buf.append("\u1e67");
3027: break; // s caron
3028: case 171 :
3029: buf.append("\u0301");
3030: break; // acute
3031: case 172 :
3032: buf.append("\u0308");
3033: break; // dieresis
3034: case 173 :
3035: buf.append("\u1e6d");
3036: break; // t underdot
3037: case 174 :
3038: buf.append("\u00c6");
3039: break; // AE
3040: case 175 :
3041: buf.append("\u014d");
3042: break; // o macron
3043: case 176 :
3044: buf.append("\u0129");
3045: break; // i tilde
3046: case 177 :
3047: buf.append("\u00b1");
3048: break; // plusminus
3049: case 180 :
3050: buf.append("\u012b");
3051: break; // i macron
3052: case 181 :
3053: buf.append("\u1e43");
3054: break; // m underdot
3055: case 182 :
3056: buf.append("\u1e0d");
3057: break; // d underdot
3058: case 183 :
3059: buf.append("\u1e63");
3060: break; // s underdot
3061: case 185 :
3062: buf.append("\u017a");
3063: break; // z acute
3064: case 186 :
3065: buf.append("\u1e45");
3066: break; // n overdot
3067: case 189 :
3068: buf.append("\u0169");
3069: break; // u tilde
3070: case 190 :
3071: buf.append("\u00e6");
3072: break; // ae
3073: case 191 :
3074: buf.append("\u00f8");
3075: break; // oslash
3076: case 192 :
3077: buf.append("\u0304\u0306");
3078: break; // macron breve
3079: case 194 :
3080: buf.append("\u1e37");
3081: break; //
3082: case 195 :
3083: buf.append("j\u0305");
3084: break; // j macron [does a single char exist?]
3085: case 196 :
3086: buf.append("\u0103");
3087: break; // a breve
3088: case 197 :
3089: buf.append("\u016d");
3090: break; // u breve
3091: case 200 :
3092: buf.append("\u1e42");
3093: break; // M underdot
3094: case 201 :
3095: buf.append("\u2026");
3096: break; // ellipsis
3097: case 203 :
3098: buf.append("\u00c0");
3099: break; // A grave
3100: case 204 :
3101: buf.append("\u00c3");
3102: break; // A tilde
3103: case 205 :
3104: buf.append("\u00d5");
3105: break; // O tilde
3106: case 206 :
3107: buf.append("m\u0306");
3108: break; // m breve
3109: case 207 :
3110: buf.append("\u0153");
3111: break; // oe
3112: case 208 :
3113: buf.append("\u2013");
3114: break; // endash
3115: case 209 :
3116: buf.append("\u2014");
3117: break; // emdash
3118: case 210 :
3119: buf.append("\u201c");
3120: break; // quotedblleft
3121: case 211 :
3122: buf.append("\u201d");
3123: break; // quotedblright
3124: case 212 :
3125: buf.append("\u2018");
3126: break; // quoteleft
3127: case 213 :
3128: buf.append("\u2019");
3129: break; // quoteright
3130: case 214 :
3131: buf.append("\u1e37");
3132: break; // l underring [actually underdot]
3133: case 215 :
3134: buf.append("\u1e41");
3135: break; // m overdot
3136: case 216 :
3137: buf.append("n\u0306");
3138: break; // n breve
3139: case 217 :
3140: buf.append("\u00d7");
3141: break; // multiply
3142: case 219 :
3143: buf.append("\u1e5b");
3144: break; // r underring [actually underdot]
3145: case 220 :
3146: buf.append("\u1e44");
3147: break; // N overdot
3148: case 221 :
3149: buf.append("\u1e62");
3150: break; // S underdot
3151: case 222 :
3152: buf.append("\u1e24");
3153: break; // H underdot
3154: case 223 :
3155: buf.append("\u1e0c");
3156: break; // D underdot
3157: case 224 :
3158: buf.append("\u2021");
3159: break; // daggerdbl
3160: case 226 :
3161: buf.append("\u1e36");
3162: break; // L underdot
3163: case 227 :
3164: buf.append("\u0113");
3165: break; // e macron
3166: case 229 :
3167: buf.append("\u1e5f");
3168: break; // r underbar
3169: case 230 :
3170: buf.append("r\u0324");
3171: break; // r underdieresis
3172: case 231 :
3173: buf.append("\u012a");
3174: break; // I macron
3175: case 232 :
3176: buf.append("\u016b");
3177: break; // u macron
3178: case 233 :
3179: buf.append("\u01e6c");
3180: break; // T underdot
3181: case 234 :
3182: buf.append("\u1e64");
3183: break; // S acute
3184: case 235 :
3185: buf.append("\u2020");
3186: break; // dagger
3187: case 236 :
3188: buf.append("\u0115");
3189: break; // e breve
3190: case 237 :
3191: buf.append("\u014f");
3192: break; // o breve
3193: case 238 :
3194: buf.append("\u0100");
3195: break; // A macron
3196: case 239 :
3197: buf.append("\u1e46");
3198: break; // N underdot
3199: case 241 :
3200: buf.append("\u1e3b");
3201: break; // l underbar
3202: case 242 :
3203: buf.append("\u016a");
3204: break; // U macron
3205: case 243 :
3206: buf.append("\u0179");
3207: break; // Z acute
3208: case 244 :
3209: buf.append("\u1e5a");
3210: break; // R underdot
3211: case 245 :
3212: buf.append("\u0131");
3213: break; // dotlessi
3214: case 246 :
3215: buf.append("\u1e47");
3216: break; // n underdot
3217: case 247 :
3218: buf.append("\u1e49");
3219: break; // n underbar
3220: case 248 :
3221: buf.append("\u0304");
3222: break; // macron
3223: case 249 :
3224: buf.append("\u0306");
3225: break; // breve
3226: case 250 :
3227: buf.append("\u1e25");
3228: break; // h underdot
3229: case 251 :
3230: buf.append("\u012d");
3231: break; // i breve
3232: case 252 :
3233: buf.append("\u0327");
3234: break; // cedilla
3235: case 253 :
3236: buf.append("\u030b");
3237: break; // hungarumlaut
3238: case 254 :
3239: buf.append("\u0328");
3240: break; // ogonek
3241: case 255 :
3242: buf.append("\u030c");
3243: break; // caron
3244: case 130 :
3245: buf.append("\u012b\u0303");
3246: break; // imacron tilde
3247: case 165 :
3248: buf.append("\u1e5d");
3249: break; // runderdot macron
3250: case 170 :
3251: buf.append("\u016b\0306");
3252: break; // umacron breve
3253: case 178 :
3254: buf.append("\u0101\u0301");
3255: break; // amacron acute
3256: case 179 :
3257: buf.append("\u016b\u0301");
3258: break; // umacron acute
3259: case 184 :
3260: buf.append("\u0113\u0301");
3261: break; // emacron acute
3262: case 187 :
3263: buf.append("\u0113\u0300");
3264: break; // emacron breve
3265: case 188 :
3266: buf.append("\u014d\u0300");
3267: break; // omacron breve
3268: case 193 :
3269: buf.append("\u0101\u0306");
3270: break; // amacron breve
3271: case 198 :
3272: buf.append("\u0101\u0303");
3273: break; // amacron tilde
3274: case 199 :
3275: buf.append("\u012b\u0301");
3276: break; // imacron acute
3277: case 218 :
3278: buf.append("\u1e00");
3279: break; // runderdotmacron acute
3280: case 225 :
3281: buf.append("\u1e5b\u0301");
3282: break; // runderdot acute
3283: case 228 :
3284: buf.append("\u012b\u0306");
3285: break; // imacron breve
3286: case 240 :
3287: buf.append("\u016b\u0303");
3288: break; // umacron tilde
3289: default :
3290: buf.append(c);
3291: break;
1.56 rogo 3292: }
3293: }
3294: return buf.toString();
3295: }
1.65 rogo 3296: static public String normanToUnicodeNew(String inp)
3297: {
1.58 rogo 3298: StringBuffer buf = new StringBuffer();
1.65 rogo 3299: for (int i = 0; i < inp.length(); i++)
3300: {
1.58 rogo 3301: char c = inp.charAt(i);
1.65 rogo 3302: switch (c)
3303: {
3304: case 1 :
3305: buf.append("\u00d0");
3306: break; // Eth
3307: case 2 :
3308: buf.append("\u00f0");
3309: break; // eth
3310: case 3 :
3311: buf.append("\u0141");
3312: break; // Lslash
3313: case 4 :
3314: buf.append("\u0142");
3315: break; // lslash
3316: case 5 :
3317: buf.append("\u0160");
3318: break; // S caron
3319: case 6 :
3320: buf.append("\u0161");
3321: break; // s caron
3322: case 7 :
3323: buf.append("\u00dd");
3324: break; // Y acute
3325: case 8 :
3326: buf.append("\u00fd");
3327: break; // y acute
3328: case 11 :
3329: buf.append("\u00de");
3330: break; // Thorn
3331: case 12 :
3332: buf.append("\u00fe");
3333: break; // thorn
3334: case 14 :
3335: buf.append("\u017d");
3336: break; // Z caron
3337: case 15 :
3338: buf.append("\u017e");
3339: break; // z caron
3340: case 17 :
3341: buf.append("\u0073");
3342: break; // asciitilde
3343: case 18 :
3344: buf.append("j\u0305");
3345: break; // j macron [does a single char exist?]
3346: case 19 :
3347: buf.append("^");
3348: break; // circumflex
3349: case 20 :
3350: buf.append("\u0303");
3351: break; // tilde
3352: case 21 :
3353: buf.append("\u00bd");
3354: break; // onehalf
3355: case 22 :
3356: buf.append("\u00bc");
3357: break; // onequarter
3358: case 23 :
3359: buf.append("\u00b9");
3360: break; // onesuperior
3361: case 24 :
3362: buf.append("\u00be");
3363: break; // threequarters
3364: case 25 :
3365: buf.append("\u00b3");
3366: break; // threesuperior
3367: case 26 :
3368: buf.append("\u00b2");
3369: break; // twosuperior
3370: case 27 :
3371: buf.append("\u00a6");
3372: break; // brokenbar
3373: case 28 :
3374: buf.append("-");
3375: break; // minus
3376: case 29 :
3377: buf.append("\u00d7");
3378: break; // multiply
3379: case 39 :
3380: buf.append("'");
3381: break; // quotesingle
3382: case 94 :
3383: buf.append("\u0302");
3384: break; // circumflex
3385: case 96 :
3386: buf.append("\u0300");
3387: break; // grave
3388: case 196 :
3389: buf.append("\u00c4");
3390: break; // A dieresis
3391: case 197 :
3392: buf.append("\u00c5");
3393: break; // A ring
3394: case 201 :
3395: buf.append("\u00c9");
3396: break; // E acute
3397: case 209 :
3398: buf.append("\u00d1");
3399: break; // N tilde
3400: case 214 :
3401: buf.append("\u00d6");
3402: break; // O dieresis
3403: case 220 :
3404: buf.append("\u00dc");
3405: break; // U dieresis
3406: case 225 :
3407: buf.append("\u00e1");
3408: break; // a acute
3409: case 224 :
3410: buf.append("\u00e0");
3411: break; // a grave
3412: case 226 :
3413: buf.append("\u00e2");
3414: break; // a circumflex
3415: case 228 :
3416: buf.append("\u00e4");
3417: break; // a dieresis
3418: case 227 :
3419: buf.append("\u00e3");
3420: break; // a tilde
3421: case 229 :
3422: buf.append("\u0101");
3423: break; // a macron
3424: case 231 :
3425: buf.append("\u00e7");
3426: break; // c cedilla
3427: case 233 :
3428: buf.append("\u00e9");
3429: break; // e acute
3430: case 232 :
3431: buf.append("\u00e8");
3432: break; // e grave
3433: case 234 :
3434: buf.append("\u00ea");
3435: break; // e circumflex
3436: case 235 :
3437: buf.append("\u00eb");
3438: break; // e dieresis
3439: case 237 :
3440: buf.append("\u00ed");
3441: break; // i acute
3442: case 236 :
3443: buf.append("\u00ec");
3444: break; // i grave
3445: case 238 :
3446: buf.append("\u00ee");
3447: break; // i circumflex
3448: case 239 :
3449: buf.append("\u00ef");
3450: break; // i dieresis
3451: case 241 :
3452: buf.append("\u00f1");
3453: break; // n tilde
3454: case 243 :
3455: buf.append("\u00f3");
3456: break; // o acute
3457: case 242 :
3458: buf.append("\u00f2");
3459: break; // o grave
3460: case 244 :
3461: buf.append("\u00f4");
3462: break; // o circumflex
3463: case 246 :
3464: buf.append("\u00f6");
3465: break; // o dieresis
3466: case 245 :
3467: buf.append("\u00f5");
3468: break; // o tilde
3469: case 250 :
3470: buf.append("\u00fa");
3471: break; // u acute
3472: case 249 :
3473: buf.append("\u00f9");
3474: break; // u grave
3475: case 251 :
3476: buf.append("\u00fb");
3477: break; // u circumflex
3478: case 252 :
3479: buf.append("\u00fc");
3480: break; // u dieresis
3481: case 8224 :
3482: buf.append("\u1e6d");
3483: break; // t underdot
3484: case 176 :
3485: buf.append("\u00b0");
3486: break; // degree
3487: case 162 :
3488: buf.append("\u1ebd");
3489: break; // e tilde
3490: case 163 :
3491: buf.append("\u00a3");
3492: break; // sterling
3493: case 167 :
3494: buf.append("\u00a7");
3495: break; // section
3496: case 182 :
3497: buf.append("\u00b6");
3498: break; // paragraph
3499: case 223 :
3500: buf.append("\u015b");
3501: break; // s acute
3502: case 174 :
3503: buf.append("\u1e5b");
3504: break; // r underdot
3505: case 169 :
3506: buf.append("\u1e45");
3507: break; // n overdot
3508: case 180 :
3509: buf.append("\u0301");
3510: break; // acute
3511: case 168 :
3512: buf.append("\u0308");
3513: break; // dieresis
3514: case 8800 :
3515: buf.append("\u1e6d");
3516: break; // t underdot
3517: case 198 :
3518: buf.append("\u00c6");
3519: break; // AE
3520: case 216 :
3521: buf.append("\u014d");
3522: break; // o macron
3523: case 8734 :
3524: buf.append("\u0129");
3525: break; // i tilde
3526: case 177 :
3527: buf.append("\u00b1");
3528: break; // plusminus
3529: case 165 :
3530: buf.append("\u012b");
3531: break; // i macron
3532: case 181 :
3533: buf.append("\u1e43");
3534: break; // m underdot
3535: case 8706 :
3536: buf.append("\u1e0d");
3537: break; // d underdot
3538: case 8721 :
3539: buf.append("\u1e63");
3540: break; // s underdot
3541: case 960 :
3542: buf.append("\u017a");
3543: break; // z acute
3544: case 8747 :
3545: buf.append("\u1e45");
3546: break; // n overdot
3547: case 937 :
3548: buf.append("\u0169");
3549: break; // u tilde
3550: case 230 :
3551: buf.append("\u00e6");
3552: break; // ae
3553: case 248 :
3554: buf.append("\u00f8");
3555: break; // oslash
3556: case 191 :
3557: buf.append("\u0304\u0306");
3558: break; // macron breve
3559: case 172 :
3560: buf.append("\u1e37");
3561: break; //
3562: case 8730 :
3563: buf.append("j\u0305");
3564: break; // j macron [does a single char exist?]
3565: case 402 :
3566: buf.append("\u0103");
3567: break; // a breve
3568: case 8776 :
3569: buf.append("\u016d");
3570: break; // u breve
3571: case 187 :
3572: buf.append("\u1e42");
3573: break; // M underdot
3574: case 8230 :
3575: buf.append("\u2026");
3576: break; // ellipsis
3577: case 192 :
3578: buf.append("\u00c0");
3579: break; // A grave
3580: case 195 :
3581: buf.append("\u00c3");
3582: break; // A tilde
3583: case 213 :
3584: buf.append("\u00d5");
3585: break; // O tilde
3586: case 338 :
3587: buf.append("m\u0306");
3588: break; // m breve
3589: case 339 :
3590: buf.append("\u0153");
3591: break; // oe
3592: case 8211 :
3593: buf.append("\u2013");
3594: break; // endash
3595: case 8212 :
3596: buf.append("\u2014");
3597: break; // emdash
3598: case 8220 :
3599: buf.append("\u201c");
3600: break; // quotedblleft
3601: case 8221 :
3602: buf.append("\u201d");
3603: break; // quotedblright
3604: case 8216 :
3605: buf.append("\u2018");
3606: break; // quoteleft
3607: case 8217 :
3608: buf.append("\u2019");
3609: break; // quoteright
3610: case 247 :
3611: buf.append("\u1e37");
3612: break; // l underring [actually underdot]
3613: case 9674 :
3614: buf.append("\u1e41");
3615: break; // m overdot
3616: case 255 :
3617: buf.append("n\u0306");
3618: break; // n breve
3619: case 376 :
3620: buf.append("\u00d7");
3621: break; // multiply
3622: case 8364 :
3623: buf.append("\u1e5b");
3624: break; // r underring [actually underdot]
3625: case 8249 :
3626: buf.append("\u1e44");
3627: break; // N overdot
3628: case 8250 :
3629: buf.append("\u1e62");
3630: break; // S underdot
3631: case 64257 :
3632: buf.append("\u1e24");
3633: break; // H underdot
3634: case 64258 :
3635: buf.append("\u1e0c");
3636: break; // D underdot
3637: case 8225 :
3638: buf.append("\u2021");
3639: break; // daggerdbl
3640: case 8218 :
3641: buf.append("\u1e36");
3642: break; // L underdot
3643: case 8222 :
3644: buf.append("\u0113");
3645: break; // e macron
3646: case 194 :
3647: buf.append("\u1e5f");
3648: break; // r underbar
3649: case 202 :
3650: buf.append("r\u0324");
3651: break; // r underdieresis
3652: case 193 :
3653: buf.append("\u012a");
3654: break; // I macron
3655: case 203 :
3656: buf.append("\u016b");
3657: break; // u macron
3658: case 200 :
3659: buf.append("\u1e6c");
3660: break; // T underdot
3661: case 205 :
3662: buf.append("\u1e64");
3663: break; // S acute
3664: case 206 :
3665: buf.append("\u2020");
3666: break; // dagger
3667: case 207 :
3668: buf.append("\u0115");
3669: break; // e breve
3670: case 204 :
3671: buf.append("\u014f");
3672: break; // o breve
3673: case 211 :
3674: buf.append("\u0100");
3675: break; // A macron
3676: case 212 :
3677: buf.append("\u1e46");
3678: break; // N underdot
3679: case 210 :
3680: buf.append("\u1e3b");
3681: break; // l underbar
3682: case 218 :
3683: buf.append("\u016a");
3684: break; // U macron
3685: case 219 :
3686: buf.append("\u0179");
3687: break; // Z acute
3688: case 217 :
3689: buf.append("\u1e5a");
3690: break; // R underdot
3691: case 305 :
3692: buf.append("\u0131");
3693: break; // dotlessi
3694: case 710 :
3695: buf.append("\u1e47");
3696: break; // n underdot
3697: case 732 :
3698: buf.append("\u1e49");
3699: break; // n underbar
3700: case 175 :
3701: buf.append("\u0304");
3702: break; // macron
3703: case 728 :
3704: buf.append("\u0306");
3705: break; // breve
3706: case 729 :
3707: buf.append("\u1e25");
3708: break; // h underdot
3709: case 730 :
3710: buf.append("\u012d");
3711: break; // i breve
3712: case 184 :
3713: buf.append("\u0327");
3714: break; // cedilla
3715: case 733 :
3716: buf.append("\u030b");
3717: break; // hungarumlaut
3718: case 731 :
3719: buf.append("\u0328");
3720: break; // ogonek
3721: case 711 :
3722: buf.append("\u030c");
3723: break; // caron
3724: case 199 :
3725: buf.append("\u012b\u0303");
3726: break; // imacron tilde
3727: case 8226 :
3728: buf.append("\u1e5d");
3729: break; // runderdot macron
3730: case 8482 :
3731: buf.append("\u016b\0306");
3732: break; // umacron breve
3733: case 8804 :
3734: buf.append("\u0101\u0301");
3735: break; // amacron acute
3736: case 8805 :
3737: buf.append("\u016b\u0301");
3738: break; // umacron acute
3739: case 8719 :
3740: buf.append("\u0113\u0301");
3741: break; // emacron acute
3742: case 170 :
3743: buf.append("\u0113\u0300");
3744: break; // emacron breve
3745: case 186 :
3746: buf.append("\u014d\u0300");
3747: break; // omacron breve
3748: case 161 :
3749: buf.append("\u0101\u0306");
3750: break; // amacron breve
3751: case 8710 :
3752: buf.append("\u0101\u0303");
3753: break; // amacron tilde
3754: case 171 :
3755: buf.append("\u012b\u0301");
3756: break; // imacron acute
3757: case 8260 :
3758: buf.append("\u1e00");
3759: break; // runderdotmacron acute
3760: case 183 :
3761: buf.append("\u1e5b\u0301");
3762: break; // runderdot acute
3763: case 8240 :
3764: buf.append("\u012b\u0306");
3765: break; // imacron breve
3766: case 63743 :
3767: buf.append("\u016b\u0303");
3768: break; // umacron tilde
3769: default :
3770: buf.append(c);
3771: break;
1.58 rogo 3772: }
3773: }
3774: return buf.toString();
3775: }
1.65 rogo 3776: public static ConversionProperties getFieldNamesAndDestTableName(String create, String query, String tableName)
1.64 rogo 3777: {
3778: String[] fieldNames = null;
3779: String destTableName = null;
3780: // determine destTableName from createStatement or from source table name
3781: if (!create.equals(""))
3782: {
3783: int fromIndex = create.toLowerCase().indexOf("table") + 5;
3784: int toIndex = create.indexOf("(");
3785: int endIndex = create.indexOf(")", toIndex);
3786:
3787: destTableName = create.substring(fromIndex, toIndex).replaceAll(beanDest.getQC(), "").trim();
3788: System.out.println("destTable " + destTableName);
3789: // retrieve field_names from select statement
3790: // TODO problem with different fieldNames in create statement will overwrite them
3791: if (query.indexOf("*") < 0)
3792: {
3793: int selectEndIndex = query.indexOf("from");
3794: StringTokenizer tokenizer = new StringTokenizer(query.substring(6, selectEndIndex), ",");
3795: int numFields = tokenizer.countTokens();
3796: fieldNames = new String[numFields];
3797: int fieldIndex = 0;
3798: while (tokenizer.hasMoreTokens())
3799: {
3800: String fieldName = tokenizer.nextToken().trim();
3801: fieldNames[fieldIndex] = convertText(fieldName);
3802: System.out.println(fieldNames[fieldIndex]);
3803: fieldIndex++;
3804: }
1.58 rogo 3805:
1.64 rogo 3806: } else
3807: {
3808: // use create statement for field names
3809: StringTokenizer tokenizer = new StringTokenizer(create.substring(toIndex + 1, endIndex), ",");
3810: int numFields = tokenizer.countTokens();
3811: fieldNames = new String[numFields];
3812: int fieldIndex = 0;
3813: while (tokenizer.hasMoreTokens())
3814: {
3815: String fieldName = tokenizer.nextToken().trim();
3816: int index = fieldName.lastIndexOf(" ");
3817: fieldNames[fieldIndex] = fieldName.substring(0, index);
3818: System.out.println(fieldNames[fieldIndex]);
3819: fieldIndex++;
3820: }
3821: }
3822: } else
3823: {
3824: destTableName = convertText(tableName);
1.58 rogo 3825:
1.64 rogo 3826: // retrieve field_names from select statement
3827: if (query.indexOf("*") < 0)
3828: {
3829: int selectEndIndex = query.indexOf("from");
3830: StringTokenizer tokenizer = new StringTokenizer(query.substring(6, selectEndIndex), ",");
3831: int numFields = tokenizer.countTokens();
3832: fieldNames = new String[numFields];
3833: int fieldIndex = 0;
3834: while (tokenizer.hasMoreTokens())
3835: {
3836: String fieldName = tokenizer.nextToken().trim();
1.76 ! rogo 3837: fieldNames[fieldIndex] = beanDest.getQC() + convertText(fieldName) + beanDest.getQC();
1.65 rogo 3838: // System.out.println("field "+ fieldNames[fieldIndex]);
1.64 rogo 3839: fieldIndex++;
3840: }
3841:
3842: } else
3843: {
3844: Vector fieldNamesVec = bean.getColumnNames();
3845: fieldNames = new String[fieldNamesVec.size()];
3846: int fieldIndex = -1;
3847: for (Iterator iter = fieldNamesVec.iterator(); iter.hasNext();)
3848: {
3849: String element = (String) iter.next();
1.70 rogo 3850: fieldNames[++fieldIndex] = beanDest.getQC() + convertText(element) + beanDest.getQC();
1.65 rogo 3851: // System.out.println("field " + fieldNames[fieldIndex]);
1.64 rogo 3852: }
3853: }
3854: }
1.65 rogo 3855: return new ConversionProperties(destTableName, fieldNames);
3856: }
3857: /**
3858: * creates an insert into statement for the specified table and given
3859: * field names
3860: * @param destTableName
3861: * @param fieldNames
3862: * @return
3863: */
3864: public static StringBuffer createInsertCommand(String destTableName, String[] fieldNames)
3865: {
3866: StringBuffer command = new StringBuffer();
3867: command.append("INSERT INTO ");
3868: command.append(beanDest.getQC());
3869: command.append(destTableName); //convertText((String) names.get(tbIndex)));
3870: command.append(beanDest.getQC());
3871: command.append(" (");
3872: for (int i = 0; i < fieldNames.length; i++)
3873: {
3874: command.append(fieldNames[i]);
3875: if (i < fieldNames.length - 1)
3876: command.append(",");
3877: }
3878: command.append(") ");
3879:
3880: command.append(" values ( ");
3881: // add a question marks for every field
3882: for (int i = 0; i < bean.getColumnNames().size() - 1; ++i)
3883: command.append("?,");
3884: command.append("?)");
3885: return command;
3886: }
3887: public static StringBuffer createUpdateCommand(String destTableName, String[] fieldNames, String id)
3888: {
3889: StringBuffer command = new StringBuffer();
3890:
3891: command.append("UPDATE ");
3892: command.append(beanDest.getQC());
3893: command.append(destTableName);
3894: //command.append(convertText((String) names.get(tbIndex)));
3895: command.append(beanDest.getQC());
3896: command.append(" SET ");
3897:
3898: int size = bean.getColumnNames().size();
3899: for (int i = 0; i < size - 1; ++i)
3900: command.append(fieldNames[i] + " = ? ,");
3901: command.append(fieldNames[size - 1] + " = ? ");
3902: command.append("WHERE " + id + " = ?");
3903: return command;
3904: }
3905: public static StringBuffer createDeleteCommand(String destTableName, String idField)
3906: {
3907: StringBuffer command = new StringBuffer();
3908:
3909: command.append("DELETE FROM");
3910: command.append(beanDest.getQC());
3911: command.append(destTableName);
3912: //command.append(convertText((String) names.get(tbIndex)));
3913: command.append(beanDest.getQC());
3914: command.append("WHERE " + idField + " = ?");
1.66 rogo 3915: return command;
1.64 rogo 3916: }
1.55 rogo 3917: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>