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