/**************************************************************************
//	
//	파일명 : Update.java
//	기능 : 자바 클래스 내의 Select문을 제외한 SQL문 분석 정보를 제공해 주는 클래스
//	작성일 : 
//
***************************************************************************/

package extractor.SCA_API;

import java.io.*;
import java.util.*;
import java.sql.*;

public class Update
{
//	int iCount;
	public String tableName = null;
	public int row_num;
	public String sql_id[];
	public String sql_tbln[];
	public Vector[] sql_wvrn = null;
	public Vector[] sql_vrop = null;
	public Vector[] sql_vvop = null;
	public String sql_rlsr[];

	Statement stmt = null;
	String query1 = null;
	String query2 = null;

// 생성자 메소드
	public Update(){
		DBConnection dbCon = new DBConnection();
		stmt = dbCon.createStatement();
		query1 = "SELECT * FROM TQ_UPDATE";
		query2="SELECT SQL_ID FROM TQ_UPDATE";
		
		try{
			ResultSet rs1 = stmt.executeQuery(query1);

			// select되는 행의 갯수를 알기 위한 Statement와 ResultSet객체 생성
			Statement stmt2 = dbCon.createStatement();
			ResultSet rs2 = stmt2.executeQuery(query2);

			// 행 갯수 카운팅
			int iCount=0;
			while(rs2.next())
			{
				iCount++;
			}
			rs2.close();


			// DB에 저장된 sql_id와 sql_tbln을 저장하기위한 배열 정의
			sql_wvrn = new Vector[iCount];
			sql_vrop = new Vector[iCount];
			sql_vvop = new Vector[iCount];
			
			sql_id = new String[iCount];
			sql_tbln = new String[iCount];
			sql_rlsr = new String[iCount];

			// 질의된 결과를 담은 ResultSet객체의 MetaData 정보를 담을 수 있는 MetaData 변수 선언
			ResultSetMetaData md = rs1.getMetaData();

			// rs1 객체의 컬럼 갯수 파악
			int col_count = md.getColumnCount();
			int row = 0;
			int j = 0;

			String whereVariableNames = null;
			String variableOperators = null;
			String variable2Operators = null;

			while (rs1.next()){
				System.out.print("\nRow: " + ++row  + "\t");
				
				for (int i = 1;i<=col_count ;i++ )
				{
					System.out.print(rs1.getString(md.getColumnName(i)) + ", \t");

					switch (i)
					{
					case 1:
						sql_id[j] = rs1.getString(md.getColumnName(i));
						break;
					case 2:
						sql_tbln[j] = rs1.getString(md.getColumnName(i));
						break;
					case 3:
						whereVariableNames = (rs1.getString(md.getColumnName(i)));
						StringTokenizer st1 = new StringTokenizer(whereVariableNames, "|");

						while( st1.hasMoreTokens()){
							
							sql_wvrn[j]= new Vector();
							//System.out.println("크기 = "+"|"+str1+"|"+ str1.length()+"  "+sql_wvrn[j] +"  "+iCount);
							
							//sql_wvrn[j].addElement(str1);

							sql_wvrn[j].addElement(st1.nextToken("|"));
						}
						
						break;	

					case 4:
						variableOperators = (rs1.getString(md.getColumnName(i)));
						StringTokenizer st2 = new StringTokenizer(variableOperators, "|");

						while( st2.hasMoreTokens()){
							sql_vrop[j] = new Vector();
							sql_vrop[j].addElement(st2.nextToken("|"));
							//System.out.println(st1.nextToken("|"));
						}

						break;
					case 5:
						if (rs1.getString(md.getColumnName(i)) == null)
						{
							sql_vvop[j] = new Vector();
							sql_vvop[j].addElement("null");
						}else
						{
						variable2Operators = (rs1.getString(md.getColumnName(i)));
						//System.out.println("rs1.getString120"+ rs1.getString(md.getColumnName(i)));
						StringTokenizer st3 = new StringTokenizer(variable2Operators, "|");
							while(st3.hasMoreTokens()){
								sql_vvop[j] = new Vector();
								sql_vvop[j].addElement(st3.nextToken("|"));
							}
						}
						
						break;
					case 6:
						sql_rlsr[j] = rs1.getString(md.getColumnName(i));
					
					}
				
				}
				j++;
			}

		}catch(SQLException ex){
				System.err.println("SQL문에 에러가 있습니다.\n" + ex.getMessage());
			}
	}

// tableName을 받아서 SQLID[]을 리턴해 주는 메소드

	public String[] getSQLID(String tableName){

		return sql_id;
	}
	
// sql_id[]를 받아서 sql_tbln[]을 리턴해 주는 메소드

	public String[] getSQLTableName(String[] sql_id){

		return sql_tbln;
	}

// sql_id[]를 받아서 sql_wvrn[]을 리턴해 주는 메소드

	public Vector[] getSQLWhereVariableName(String[] sql_id){

		return sql_wvrn;
	}

// sql_id[]를 받아서 sql_vrop[]을 리턴해 주는 메소드

	public Vector[] getSQLVariableOperator(String[] sql_id){

		return sql_vrop;
	}

// sql_id[]를 받아서 sql_vvop[]을 리턴해 주는 메소드

	public Vector[] getSQLVariable2Operator(String[] sql_id){

		return sql_vvop;
	}

// sql_id[]를 받아서 sql_rlsr[]을 리턴해 주는 메소드

	public String[] getSQLRelatedSource(String[] sql_id){

		return sql_rlsr;
	}
	// Update API 기능 확인을 위한 자체 메인함수
	// sql_id[], sql_tbln[] 값 출력
	public static void main(String[] args) 
		{
			String tableName = null;

			Update upd = new Update();
			String[] sqlID = upd.getSQLID(tableName);
			String[] sqlTableName = upd.getSQLTableName(sqlID);
			Vector[] sqlWhereVariableName = upd.getSQLWhereVariableName(sqlID);
			Vector[] sqlVariableOperator = upd.getSQLVariableOperator(sqlID);
			Vector[] sqlVariable2Operator = upd.getSQLVariable2Operator(sqlID);
			String[] sqlRelatedSource = upd.getSQLRelatedSource(sqlID);
			System.out.println();
			for (int i =0; i < sqlTableName.length ; i++ )
			{
				System.out.println("sqlID : " + sqlID[i] + ", \t");
				
				for (Iterator ir = sqlVariableOperator[i].iterator();ir.hasNext(); )
				{
					System.out.println("sqlVariableOperator : " + ir.next() +" == ");
				}
			}

		}

}