///*
// * Copyright (c) 2013 Websquared, Inc.
// * All rights reserved. This program and the accompanying materials
// * are made available under the terms of the GNU Public License v2.0
// * which accompanies this distribution, and is available at
// * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
// *
// * Contributors:
// * swsong - initial API and implementation
// */
//
//package org.fastcatsearch.util;
//
//import java.io.FileOutputStream;
//import java.io.IOException;
//import java.sql.Connection;
//import java.sql.Driver;
//import java.sql.DriverManager;
//import java.sql.PreparedStatement;
//import java.sql.ResultSet;
//import java.sql.ResultSetMetaData;
//import java.sql.SQLException;
//import java.sql.Types;
//import java.util.Properties;
//
//import org.fastcatsearch.ir.common.IRException;
//import org.fastcatsearch.ir.config.DataSourceConfig;
//import org.fastcatsearch.settings.IRSettings;
//import org.fastcatsearch.util.DynamicClassLoader;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//
//
//public class MakeSchema {
// private static Logger logger = LoggerFactory.getLogger(MakeSchema.class);
// private static String strDelimeter = "\"";
// private static String strSchemaHead = "<schema";
// private static String strSchemaTail = "</schema>";
// private static String strFieldHead = "<field";
// private static String strSchematail = "/>";
// private static String strName = "name=";
// private static String strType = "type=";
// private static String strIndex = "index=\"org.fastcatsearch.ir.analysis.KoreanTokenizer\"";
// private static String strSize = "size=";
// private static String strPrimary = "primary=";
//
// public static boolean makeSchema(String collectionId, DataSourceConfig setting) throws IRException, SQLException {
// String strHead = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
//
// Connection con = null;
// PreparedStatement pstmt = null;
// // 여기서는 index 까지는 만들지 않는다.
// StringBuffer sb = new StringBuffer();
// FileOutputStream writer = null;
// ResultSet r = null;
//
//// DataSourceSetting setting = IRSettings.getDatasource(collection, true);
// if ( "db".equalsIgnoreCase(setting.sourceType) == false )
// return false;
//
// try {
// if (setting.driver != null && setting.driver.length() > 0) {
// Object object = DynamicClassLoader.loadObject(setting.driver);
// if (object == null) {
// throw new IRException("Cannot find sql driver = " + setting.driver);
// } else {
// Driver driver = (Driver) object;
// DriverManager.registerDriver(driver);
// Properties info = new Properties();
// info.put("user", setting.user);
// info.put("password", setting.password);
// logger.debug("url : " + setting.url);
// logger.debug("info : " + info.toString());
// con = driver.connect(setting.url, info);
// con.setAutoCommit(true);
// }
// } else
// throw new IRException("JDBC driver is empty!");
//
// if (setting.fullQuery == null || setting.fullQuery.length() == 0)
// throw new IRException("Full query sql is empty!");
//
// pstmt = con.prepareStatement(setting.fullQuery);
//
// if (setting.fetchSize > 0)
// pstmt.setFetchSize(setting.fetchSize);
// else if (setting.fetchSize <= 0)
// pstmt.setFetchSize(Integer.MIN_VALUE);
//
// r = pstmt.executeQuery();
//
// ResultSetMetaData rsMetadata = r.getMetaData();
// int columnCount = rsMetadata.getColumnCount();
//
// sb.append(strHead).append("\r\n");
// sb.append(strSchemaHead).append(" ").append(strName).append(strDelimeter).append(collectionId).append(strDelimeter);
// sb.append(" ").append("version=\"1.0\">").append("\r\n");
//
// for (int i = 0; i < columnCount; i++)
// sb.append(makeField(rsMetadata, i + 1));
// sb.append(strSchemaTail);
//
// try {
// writer = new FileOutputStream(IRSettings.getKey(collectionId, IRSettings.schemaWorkFilename));
// writer.write(sb.toString().getBytes());
// } catch (IOException e) {
// logger.error(e.getMessage(), e);
// }
// } catch (Exception e) {
// logger.error(e.getMessage(), e);
// } finally {
// try {
// writer.close();
// } catch (IOException e) {
// // ignore
// } catch (Exception e) {
// try {
// if (r != null)
// r.close();
// } catch (SQLException e1) {
// }
//
// try {
// if (pstmt != null)
// pstmt.close();
// } catch (SQLException e1) {
// }
//
// try {
// if (con != null && !con.isClosed())
// con.close();
// } catch (SQLException e1) {
// }
// }
// }
// return false;
//
// }
//
// private static String makeField(ResultSetMetaData rsMetadata, int idx) {
// String strTypeValue = "";
// String strSizeValue = "";
//
// StringBuffer sb = new StringBuffer();
//
// try {
//
// switch (rsMetadata.getColumnType(idx)) {
// case Types.INTEGER:
// case Types.TINYINT:
// case Types.SMALLINT:
// strTypeValue = "int";
// strSizeValue = "4";
// break;
//
// case Types.BIGINT:
// strTypeValue = "long";
// strSizeValue = "8";
// break;
//
// case Types.NUMERIC:
// case Types.DOUBLE:
// case Types.FLOAT:
// strTypeValue = "double";
// strSizeValue = "8";
// break;
//
// case Types.DATE:
// case Types.TIME:
// case Types.TIMESTAMP:
// strTypeValue = "datetime";
// strSizeValue = "8";
// break;
//
// case Types.CHAR:
// case Types.VARCHAR:
// case Types.LONGVARCHAR:
// strTypeValue = "uchar";
// strSizeValue = rsMetadata.getColumnDisplaySize(idx) > 256 ? "-1" : rsMetadata.getColumnDisplaySize(idx) + "";
// break;
//
// default:
// strTypeValue = "achar";
// strSizeValue = rsMetadata.getColumnDisplaySize(idx) > 256 ? "-1" : rsMetadata.getColumnDisplaySize(idx) + "";
// break;
// }
//
// // field
// sb.append(strFieldHead).append(" ");
// // Name
// sb.append(strName).append(strDelimeter).append(rsMetadata.getColumnName(idx).toLowerCase()).append(strDelimeter).append(" ");
// if (1 == idx) {
// // 첫번째 필드는 primary로 설정한다.
// // primary일때 uchar를 achar로 변환한다.
// if (strTypeValue.equalsIgnoreCase("uchar")) {
// strTypeValue = "achar";
// }
// // type
// sb.append(strType).append(strDelimeter).append(strTypeValue).append(strDelimeter).append(" ");
// // primary
// sb.append(strPrimary).append(strDelimeter).append("true").append(strDelimeter).append(" ");
// } else
// // type
// sb.append(strType).append(strDelimeter).append(strTypeValue).append(strDelimeter).append(" ");
//
// if ( idx > 1 && strTypeValue.equalsIgnoreCase("uchar"))
// sb.append(strIndex).append(" ");
//
// // size
// sb.append(strSize).append(strDelimeter).append(strSizeValue).append(strDelimeter).append(" ");
// // tail
// sb.append(strSchematail).append("\r\n");
//
// } catch (Exception e) {
// e.printStackTrace();
// }
// return sb.toString();
// }
//
//}