package jp.arcanum.myaddress.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import jp.arcanum.myaddress.MyAddressApp;


public class MyUtil {

	/**
	 * ＳＥＬＥＣＴ系ＳＱＬを実行します。
	 * @param sql
	 * @return
	 */
	public static List select(String sql){
		
		List ret = new ArrayList();
		
		System.out.println("=======================================");
		System.out.println(sql);
		System.out.println("=======================================");
		
		Statement st = null;
		ResultSet result = null;
		try {
            
			Class.forName(MyAddressApp.DB_DRIVER);
            Connection conn = DriverManager.getConnection(
            		MyAddressApp.DB_URL,
            		MyAddressApp.DB_USER,
            		MyAddressApp.DB_PASS
            );
            
        	st = conn.createStatement();
        	result = st.executeQuery(sql);

        	while(result.next()){
        		Map map = new HashMap();
        		ResultSetMetaData meta = result.getMetaData();
        		for(int i = 1 ; i < meta.getColumnCount()+1; i++){
        			String colname = meta.getColumnName(i);
        			Object value   = result.getObject(i);
        			map.put(colname, value);
        			
        		}
        		ret.add(map);
        	}
            
            
		} 
		catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
		finally{
			try {
				if(st != null)st.close();
				if(result != null)result.close();
			} 
			catch (SQLException e) {
				e.printStackTrace();
				throw new RuntimeException(e);
			}
		}

		
		
		return ret;
		
	}
	
	/**
	 * 更新系ＳＱＬを実行します。
	 * 実行が成功した場合、自動的にコミットされます。
	 * 実行が失敗した場合、RuntimeExceptionが送出されます。
	 * @param sql 実行したいＳＱＬ
	 * @return 実行できた数
	 */
	public static int update(String sql){
		
		int ret = 0;
		
		System.out.println("=======================================");
		System.out.println(sql);
		System.out.println("=======================================");

		Statement st = null;
		ResultSet result = null;
		try {
            
			Class.forName(MyAddressApp.DB_DRIVER);
            Connection conn = DriverManager.getConnection(
            		MyAddressApp.DB_URL,
            		MyAddressApp.DB_USER,
            		MyAddressApp.DB_PASS
            );
            
            
            st = conn.createStatement();
        	ret = st.executeUpdate(sql);
            
        	
		} 
		catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
		finally{
			try {
				if(st != null)st.close();
				if(result != null)result.close();
			} 
			catch (SQLException e) {
				e.printStackTrace();
				throw new RuntimeException(e);
			}
		}

		return ret;
		
	}
	
	/**
	 * シングルクォート処理
	 * @param o シングルクォートで囲みたいオブジェクト
	 * @return
	 */
	public static final String quote(Object o){
		return "'" + o.toString() + "'";
	}

	/**
	 * トリミング処理（左右の全半角スペースを取り除く）
	 * @param str トリミングしたい文字列
	 * @return トリミングされた文字列
	 */
	public static final String trimAll(String str){
		
		if(str == null){
			return "";
		}
		
		int length = str.length();
		int end = length;
		int start = 0;
		
		char[] val = str.toCharArray();
		while((start<length)&&((val[start]<=' ')||val[start]=='　')){
			start++;
		}
		while((start<end)&&((val[end - 1]<=' ')||val[end - 1]=='　')){
			end--;
		}
		
		return ((start > 0) || (end<length)) ? str.substring(start,end):str;
	}
	
}
