package parser.ServletParser.library;

import java.io.*;
/** 이 클래스는 특정 데이타 멤버에 대한 정보를 관리한다.
 */
public final
class SQLInfo extends Object implements Serializable
{
	/** 버전 제어를 위한 시리얼 넘버이다.
	 */
	public static final long serialVersionUID = 475335557816450595L;
	static public int ERROR = 0;
	static public int SELECT = 1;
	static public int INSERT = 2;
	static public int DELETE = 3;
	static public int UPDATE = 4;
	/** 쿼리의 종류를 나타낸다.
	 */
    public int queryType;
	/** 쿼리의 이름이다.
	 */
    public String queryName;
	/** 쿼리 전체 내용이다.
	 */
	public String queryFullString;
	/** 쿼리에 포함된 테이블 정보이다.
	 */
	public SQLTableInfoList tableInfos;
	/** 쿼리에 포함된 where 이후의 컨디션이다.
	 */
	public String whereCondition;
	/** 쿼리에 포함된 함수 값들의 리스트이다.
		예를들어 ... max(*), count(*) ...
	 */
	public StringList selectValues;
	/** 쿼리 파싱 시에 신택스 에러 발생 여부를 나타내는 플래그이다.
	 */
	public boolean syntaxError;
	/** 생성자이다.
	 */
	public SQLInfo() {
		queryType = ERROR;
		queryName = "";
		queryFullString = "";
		tableInfos = new SQLTableInfoList();
		whereCondition = "";
		selectValues = new StringList();
		syntaxError = false;
	}
	/** 쿼리 종류를 기록하는 함수이다.
	 */
	public void setQueryName(String qName) {
		if (qName.equalsIgnoreCase("select")) {
			queryType = SELECT;
		} else if (qName.equalsIgnoreCase("insert")) {
			queryType = INSERT;
		} else if (qName.equalsIgnoreCase("delete")) {
			queryType = DELETE;
		} else if (qName.equalsIgnoreCase("update")) {
			queryType = UPDATE;
		} else {
			queryType = ERROR;
		}
		queryName = new String(qName);
	}
	/** 쿼리 전체 내용을 기록하는 함수이다.
	 */
	public void setQueryFullString(String fullString) {
		queryFullString = new String(fullString);
	}
	/** 쿼리에 포함된 where 이후의 컨디션을 기록하는 함수이다.
	 */
	public void setQueryCondition(String cond) {
		if (cond == null) {
			whereCondition = "";
			return;
		}
		whereCondition = new String(cond);
	}
	/** 쿼리에서 사용된 테이블 이름을 insert 하는 함수이다.
	 */
	public void addTableName(String tName) {
		tableInfos.addTableName(tName);
	}
	/** 쿼리에서 사용된 테이블 필드 이름을 insert 하는 함수이다.
	 */
	public void addFieldName(String atTable,String field) {
		tableInfos.addFieldName(atTable,field);
	}
	/** 쿼리에서 사용된 함수값 이름을 insert 하는 함수이다.
	 */
	public void addSelectValue(String value) {
		selectValues.insert(value);
	}
	/** 쿼리에 대하여 필드 이름들에 대한 정리를 한다.
		별표가 있는가 확인하고 ...
		필드명이 없는 경우에는 별표를 집어넣고 ...
	 */
	public void refineForStarAndNoField() {
		SQLTableInfo aTableInfo = tableInfos.getFirst();
		while (aTableInfo != null) {
			boolean starFound = false;
			String aField = aTableInfo.fieldNames.getFirst();
			while (aField != null) {
				if (aField.equals("*")) {
					starFound = true;
					break;
				}
				aField = aTableInfo.fieldNames.getNext();
			}
			if (starFound == true && aTableInfo.fieldNames.nOfList() > 1) {
				aTableInfo.fieldNames.remove("*");
				aTableInfo.fieldNames.addHead(new String("*"));
			}
			aTableInfo = tableInfos.getNext();
		}
		
		aTableInfo = tableInfos.getFirst();
		while (aTableInfo != null) {
			if (aTableInfo.fieldNames.nOfList() == 0) {
				aTableInfo.fieldNames.insert(new String("*"));
			}
			aTableInfo = tableInfos.getNext();
		}
	}
}
