📄 sqltoappdata.java
字号:
package org.apache.torque.engine.database.transform;/* ==================================================================== * The Apache Software License, Version 1.1 * * Copyright (c) 2001 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Apache" and "Apache Software Foundation" and * "Apache Turbine" must not be used to endorse or promote products * derived from this software without prior written permission. For * written permission, please contact apache@apache.org. * * 5. Products derived from this software may not be called "Apache", * "Apache Turbine", nor may "Apache" appear in their name, without * prior written permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */import java.io.BufferedReader;import java.io.FileReader;import java.io.IOException;import java.util.ArrayList;import java.util.List;import org.apache.torque.engine.database.model.AppData;import org.apache.torque.engine.database.model.Column;import org.apache.torque.engine.database.model.Database;import org.apache.torque.engine.database.model.ForeignKey;import org.apache.torque.engine.database.model.IDMethod;import org.apache.torque.engine.database.model.Table;import org.apache.torque.engine.sql.ParseException;import org.apache.torque.engine.sql.SQLScanner;import org.apache.torque.engine.sql.Token;/** * A Class that converts an sql input file to an AppData * structure. The class makes use of SQL Scanner to get * sql tokens and the parses these to create the AppData * class. SQLToAppData is in effect a simplified sql parser. * * @author <a href="mailto:leon@opticode.co.za">Leon Messerschmidt</a> * @author <a href="mailto:jon@latchkey.com">Jon S. Stevens</a> * @version $Id: SQLToAppData.java,v 1.2 2003/02/18 08:05:50 mpoeschl Exp $ */public class SQLToAppData{ private String sqlFile; private List tokens; private Token token; private AppData appData; private Database appDataDB; private int count; private String databaseType; private String basePropsFilePath; /** * Create a new class with an input Reader * * @param sqlFile the sql file */ public SQLToAppData(String sqlFile) { this.sqlFile = sqlFile; } /** * Create a new class with an input Reader. This ctor is not used * but putting here in the event db.props properties are found to * be useful converting sql to xml, the infrastructure will exist * * @param sqlFile the sql file * @param databaseType * @param basePropsFilePath */ public SQLToAppData(String sqlFile, String databaseType, String basePropsFilePath) { this.sqlFile = sqlFile; this.databaseType = databaseType; this.basePropsFilePath = basePropsFilePath; } /** * Get the current input sql file * * @return the sql file */ public String getSqlFile() { return sqlFile; } /** * Set the current input sql file * * @param sqlFile the sql file */ public void setSqlFile(String sqlFile) { this.sqlFile = sqlFile; } /** * Move to the next token. Throws an exception * if there is no more tokens available. * * @throws ParseException */ private void next() throws ParseException { if (count < tokens.size()) { token = (Token) tokens.get(count++); } else { throw new ParseException("No More Tokens"); } } /** * Creates an error condition and adds the line and * column number of the current token to the error * message. * * @param name name of the error * @throws ParseException */ private void err(String name) throws ParseException { throw new ParseException (name + " at [ line: " + token.getLine() + " col: " + token.getCol() + " ]"); } /** * Check if there is more tokens available for parsing. * * @return true if there are more tokens available */ private boolean hasTokens() { return count < tokens.size(); } /** * Parses a CREATE TABLE FOO command. * * @throws ParseException */ private void create() throws ParseException { next(); if (token.getStr().toUpperCase().equals("TABLE")) { create_Table(); } } /** * Parses a CREATE TABLE sql command * * @throws ParseException error parsing the input file */ private void create_Table() throws ParseException { next(); String tableName = token.getStr(); // name of the table next(); if (!token.getStr().equals("(")) { err("( expected"); } next(); Table tbl = new Table (tableName); //tbl.setIdMethod("none"); while (!token.getStr().equals(";")) { create_Table_Column(tbl); } if (tbl.getPrimaryKey().size() == 1) { tbl.setIdMethod(IDMethod.ID_BROKER); } else { tbl.setIdMethod(IDMethod.NO_ID_METHOD); } appDataDB.addTable (tbl); } /** * Parses column information between the braces of a CREATE * TABLE () sql statement. * * @throws ParseException error parsing the input file */ private void create_Table_Column(Table tbl) throws ParseException { // The token should be the first item // which is the name of the column or // PRIMARY/FOREIGN/UNIQUE if (token.getStr().equals(",")) { next(); } if (token.getStr().toUpperCase().equals("PRIMARY")) { create_Table_Column_Primary(tbl); } else if (token.getStr().toUpperCase().equals("FOREIGN")) { create_Table_Column_Foreign(tbl); } else if (token.getStr().toUpperCase().equals("UNIQUE")) { create_Table_Column_Unique(tbl); } else { create_Table_Column_Data(tbl); } } /** * Parses PRIMARY KEY (FOO,BAR) statement * * @throws ParseException error parsing the input file */ private void create_Table_Column_Primary (Table tbl) throws ParseException { next(); if (!token.getStr().toUpperCase().equals("KEY")) { err("KEY expected"); } next(); if (!token.getStr().toUpperCase().equals("(")) { err("( expected"); } next(); String colName = token.getStr(); Column c = tbl.getColumn(colName); if (c == null) { err("Invalid column name: " + colName); } c.setPrimaryKey(true); next(); while (token.getStr().equals(",")) { next(); colName = token.getStr(); c = tbl.getColumn(colName); if (c == null) { err("Invalid column name: " + colName); } c.setPrimaryKey(true); next(); } if (!token.getStr().toUpperCase().equals(")")) { err(") expected"); } next(); // skip the ) }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -