--- FM2SQL/Attic/Convert.java 2004/08/05 11:17:10 1.68
+++ FM2SQL/Attic/Convert.java 2004/08/16 10:16:27 1.74
@@ -31,9 +31,9 @@ import java.sql.Statement;
import java.sql.Types;
import java.text.ParseException;
import java.util.ArrayList;
+import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
-import java.util.Properties;
import java.util.StringTokenizer;
import java.util.TreeSet;
import java.util.Vector;
@@ -43,6 +43,31 @@ import com.exploringxml.xml.Xparse;
class Convert
{
+ /**Helper class for index creation
+ * @author rogo
+ *
+ */
+ public static class IndexList extends Vector
+ {
+ public String toString()
+ {
+ StringBuffer buff = new StringBuffer(1000);
+ int count = 0;
+ for (Iterator iter = this.iterator(); iter.hasNext();)
+ {
+ String element = (String) iter.next();
+ if (count < elementCount - 1)
+ {
+ buff.append(element).append(", ");
+ count++;
+ } else
+ buff.append(element);
+
+ }
+
+ return buff.toString();
+ }
+ }
static DBBean bean = new DBBean();
static DBBean beanDest = new DBBean();
@@ -51,7 +76,8 @@ class Convert
static boolean batchRun = false;
static Vector databases = new Vector();
final static int numHits = 5000;
- final static int numIntervalls = 2;
+ final static int numIntervalls = 4;
+ static boolean debug = false;
public static void main(String args[])
{
/* try
@@ -76,10 +102,12 @@ class Convert
{
e1.printStackTrace();
}
- PrintStream stream = new PrintStream(file);
- // System.setOut(stream);
- //System.setErr(stream);
-
+ PrintStream stream = new PrintStream(file,false);
+ if(!debug)
+ {
+ System.setOut(stream);
+ System.setErr(stream);
+ }
readXMLFile(args[0]);
if (!(new File(args[0]).exists()))
System.exit(0);
@@ -1127,6 +1155,7 @@ class Convert
Vector selects = new Vector();
Vector creates = new Vector();
Vector ids = new Vector();
+ Vector indexListVec = new Vector();
String delimiter = "|";
int mode = -1;
@@ -1146,6 +1175,7 @@ class Convert
selects = new Vector();
creates = new Vector();
ids = new Vector();
+ indexListVec = new Vector();
// parse dataBase
Node node = root.find("convert/source/database/url", new int[] { 1, 1, i, 1 });
Node node1 = root.find("convert/source/database/user", new int[] { 1, 1, i, 1, 1 });
@@ -1220,6 +1250,8 @@ class Convert
String name = (String) node4.attributes.get("name");
String layout = (String) node4.attributes.get("layout");
String id = (String) node4.attributes.get("id");
+ String indexList = (String) node4.attributes.get("indexList");
+
System.out.println("id was " + id);
if (name == null)
throw new Error("parse error required table tag attribute name missing");
@@ -1227,11 +1259,15 @@ class Convert
layout = "";
if (id == null)
id = "";
+ if (indexList == null)
+ indexList = "";
if (name.equals(""))
throw new Error("parse error table tag attribute must not be empty");
tables.add(name);
layouts.add(layout);
+
ids.add(id);
+ indexListVec.add(indexList);
String query = (node5 == null) ? "" : node5.getCharacters();
if (query.equals(""))
System.err.println("Warning empty select tag or select tag missing !!");
@@ -1245,6 +1281,7 @@ class Convert
}
DataBase dataBase = new DataBase(database, tables, layouts, selects, creates, ids, mode);
dataBase.delimiter = delimiter;
+ dataBase.buildIndexTable(indexListVec);
databases.add(dataBase);
}
DBBean database = new DBBean();
@@ -1273,7 +1310,7 @@ class Convert
userDest = database.user;
passwdDest = database.passwd;
- synchronize(db.bean.url, database.url, db.tables, db.layouts, db.selects, db.creates, db.ids, mode, db.delimiter);
+ synchronize(db.bean.url, database.url, db.tables, db.layouts, db.selects, db.creates, db.ids, mode, db.delimiter, new Vector(db.htIndex.values()));
}
}
// printContents(node3);
@@ -1575,6 +1612,10 @@ class Convert
Vector tables;
Vector ids;
String delimiter = "//";
+ /**
+ * maps table name to index fields
+ */
+ Hashtable htIndex = new Hashtable();
boolean useNormanToUnicodeMapper = false;
final static int CONVERT_MODE = 1;
@@ -1597,6 +1638,16 @@ class Convert
this.bean.setIDVector(ids);
}
/**
+ * @param indexListVec
+ */
+ public void buildIndexTable(Vector indexListVec)
+ {
+ for (int i = 0; i < tables.size(); i++)
+ {
+ fillIndexList((String) tables.get(i), (String) indexListVec.get(i));
+ }
+ }
+ /**
* writes the data contained in this object to the buffered writer
* * @param buffr
* @throws Exception
@@ -1630,8 +1681,10 @@ class Convert
String select = (String) selects.get(index);
String create = (String) creates.get(index);
String id = (String) ids.get(index);
-
- buffr.write("
\n");
+ IndexList indexList = (IndexList) htIndex.get(table);
+ if (indexList == null)
+ indexList = new IndexList();
+ buffr.write(" \n");
buffr.write(" \n");
if (!create.equals(""))
buffr.write(" " + create + " \n");
@@ -1640,6 +1693,19 @@ class Convert
}
buffr.write(" \n");
}
+
+ public void fillIndexList(String table, String list)
+ {
+ IndexList indexList = new IndexList();
+ StringTokenizer tokenizer = new StringTokenizer(list, ",");
+ while (tokenizer.hasMoreTokens())
+ {
+ indexList.add(tokenizer.nextToken());
+ }
+ System.out.println(indexList);
+
+ htIndex.put(table, indexList);
+ }
public String toString()
{
return bean.url + " " + tables;
@@ -1897,7 +1963,8 @@ class Convert
*/
// TODO implement append,update and delete in one method
// TODO using id based algorithm
- public static void synchronize(String source, String destination, Vector names, Vector layouts, Vector selects, Vector creates, Vector ids, int mode, String delimiter) throws Exception
+ public static void synchronize(String source, String destination, Vector names, Vector layouts, Vector selects, Vector creates, Vector ids, int mode, String delimiter, Vector indexList)
+ throws Exception
{
System.out.println(" bin in synchronize!!!");
FM2SQL.ProgressDialog dialog = null;
@@ -1994,6 +2061,7 @@ class Convert
int endIndex = -1;
String tempQuery = query;
String destQuery = query.replaceAll(names.get(tbIndex).toString(), destTableName);
+ // TODO remove layout part for destQuery
String tempQueryDest = destQuery;
// remove extra query parts destQuery.substring(0,destQuery.lastIndexOf(destTableName)+destTableName.length()+1);
System.out.println("new Query " + tempQueryDest);
@@ -2012,7 +2080,7 @@ class Convert
dialog.title.setText("Check if more data is available");
myIds = bean.getIDVector(ids.get(tbIndex).toString(), (String) names.get(tbIndex), tempQuery, 0);
myIdsDest = beanDest.getIDVector(convertText(idField), destTableName, tempQueryDest, 0);
- //System.out.println("status of remove "+myIds.remove("b015892"));
+ //System.out.println("status of remove "+myIds.remove("b015892"));
if (myIds.isEmpty())
break;
vec = new Vector(myIds);
@@ -2020,7 +2088,7 @@ class Convert
rowCount = vec.size();
// Deletion will work this way
Vector deleted = new Vector(vec);
-
+
TreeSet linesToAppend = new TreeSet(vec);
linesToAppend.addAll(vec);
linesToDelete = new TreeSet(vecDest);
@@ -2038,10 +2106,10 @@ class Convert
StringBuffer delCommand = createDeleteCommand(destTableName, tempIDdest);
PreparedStatement insPst = beanDest.getConnection().prepareStatement(insCommand.toString());
PreparedStatement updPst = beanDest.getConnection().prepareStatement(updCommand.toString());
- delPSt = beanDest.getConnection().prepareStatement(delCommand.toString());
- // delPSt.setString(1,"b015892");
- // delPSt.execute();
- // if (true)
+ delPSt = beanDest.getConnection().prepareStatement(delCommand.toString());
+ // delPSt.setString(1,"b015892");
+ // delPSt.execute();
+ // if (true)
// return;
if (vec.size() <= numIntervalls)
{
@@ -2082,7 +2150,7 @@ class Convert
System.out.println(tempQuery);
if (dialog != null)
dialog.title.setText("Reading table data ...");
- // bean.makeQuery(tempQuery, 0);
+ // bean.makeQuery(tempQuery, 0);
if (dialog != null)
dialog.title.setText("Writing table data ...");
performSynchronize(idField, vec, tempQuery, linesToDelete, linesToAppend, insPst, updPst, delPSt, deltaID, delimiter);
@@ -2095,7 +2163,34 @@ class Convert
tempQuery = query + " where " + tempID + ">'" + vec.lastElement() + "'";
}
-
+ String tableName = names.get(tbIndex).toString();
+ IndexList idList = (IndexList) indexList.get(0);
+ System.out.println("found list " + idList);
+ Statement stm = beanDest.getConnection().createStatement();
+ Vector destTables = beanDest.getTableNames();
+ beanDest.makeQuery(tempQueryDest,0);
+ for (Iterator iter = idList.iterator(); iter.hasNext();)
+ {
+ String indexField = (String) iter.next();
+ indexField = convertText(indexField);
+ String indexName = destTableName + "_" + indexField;
+ if (destTables.contains(indexName))
+ {
+ stm.execute("DROP INDEX "+destTableName+"_"+indexField);
+ // continue;
+ }
+
+ String type = beanDest.getColumnType(indexField).toLowerCase();
+ // System.out.println(indexField+" "+type+" "+(type.indexOf("text") >= 0 || type.indexOf("varchar") >= 0 || type.indexOf("char") >= 0));
+ if (type.indexOf("text") >= 0 || type.indexOf("varchar") >= 0 || type.indexOf("char") >= 0)
+ stm.execute("CREATE INDEX " + indexName + " ON " + destTableName + "(LOWER(" + indexField + "))");
+ else
+ stm.execute("CREATE INDEX " + destTableName + "_" + indexField + " ON " + destTableName + "(" + indexField + ")");
+
+ // stm.execute("DROP INDEX "+destTableName+"_"+indexField);
+
+ }
+ // CREATE UNIQUE INDEX title_idx ON films (title);
for (Iterator iter = linesToDelete.iterator(); iter.hasNext();)
{
String id = (String) iter.next();
@@ -2183,11 +2278,11 @@ class Convert
updPst.setNull(l + 1, Types.NULL);
}
updPst.setString(line.size() + 1, line.get(idIndex).toString());
+ //updPst.addBatch();
updPst.execute();
-
}
}
-
+ //updPst.executeBatch();
} // to method
/**
@@ -3709,7 +3804,7 @@ class Convert
while (tokenizer.hasMoreTokens())
{
String fieldName = tokenizer.nextToken().trim();
- fieldNames[fieldIndex] = convertText(fieldName);
+ fieldNames[fieldIndex] =beanDest.getQC() + convertText(fieldName)+beanDest.getQC();
// System.out.println("field "+ fieldNames[fieldIndex]);
fieldIndex++;
}
@@ -3722,7 +3817,7 @@ class Convert
for (Iterator iter = fieldNamesVec.iterator(); iter.hasNext();)
{
String element = (String) iter.next();
- fieldNames[++fieldIndex] = bean.getQC() + convertText(element) + bean.getQC();
+ fieldNames[++fieldIndex] = beanDest.getQC() + convertText(element) + beanDest.getQC();
// System.out.println("field " + fieldNames[fieldIndex]);
}
}