package com.steering.comm.db;

import java.sql.SQLException;
import java.util.ArrayList;

import CoreFS.SA01.CoreIComponent;
import CoreFS.SA06.CoreReturnObject;
import CoreFS.SA08.CoreXmlSqlParsersFactory;
import CoreFS.SC01.CoreConstantData;

import com.steering.comm.tools.StringTool;

/**
 * 数据库基本操作方法类
 * @author siy 2014/10/13
 * @version v1.1
 * @modify siy 2015/03/06
 */
public class DBCommon extends CoreIComponent {
    /**
     * 执行基本SQL查询语句并返回结果
     * @param sql 需执行的SQL
     * @return CoreReturnObject 平台统一返回对象
     */
    protected CoreReturnObject getData(String sql) {
        return this.getData(CoreConstantData.sysbeanstr, sql, null);
    }

    /**
     * 执行基本SQL查询语句并返回结果
     * @param daoName 数据源名称
     * @param sql 需执行的SQL
     * @return CoreReturnObject 平台统一返回对象
     */
    protected CoreReturnObject getData(String daoName, String sql) {
        return this.getData(daoName, sql, null);
    }

    /**
     * 执行带参数的SQL查询语句并返回结果
     * @param sql 需执行的SQL
     * @param params SQL对应的参数
     * @return CoreReturnObject 平台统一返回对象
     */
    protected CoreReturnObject getData(String sql, Object[] params) {
        return this.getData(CoreConstantData.sysbeanstr, sql, params);
    }

    /**
     * 执行带参数的SQL查询语句并返回结果
     * @param daoName 数据源名称
     * @param sql 需执行的SQL
     * @param params SQL对应的参数
     * @return CoreReturnObject 平台统一返回对象
     */
    protected CoreReturnObject getData(String daoName, String sql,
            Object[] params) {
        CoreReturnObject cro = new CoreReturnObject();
        if (StringTool.isNullOrEmpty(sql)) {
            cro.setV_errCode(-1);
            cro.setV_errMsg("SQL语句不能为空！");
            return cro;
        }
        if (params == null || params.length == 0) {
            cro = this.getDao(daoName).ExcuteSortResultByQuery(sql);
        }
        else {
            cro = this.getDao(daoName).ExcuteSortResultByQuery(sql, params);
        }

        return cro;
    }

    /**
     * 根据SQLID执行查询语句并返回结果，SQLID配置在对应的XML文件中，在Server/WebRoot/query对应目录下
     * @param sqlID xml中对应SQL的节点ID
     * @return CoreReturnObject 平台统一返回对象
     */
    protected CoreReturnObject getDataBySqlID(String sqlID) {
        return this.getDataBySqlID(CoreConstantData.sysbeanstr, sqlID, null);
    }

    /**
     * 根据SQLID执行查询语句并返回结果，SQLID配置在对应的XML文件中，在Server/WebRoot/query对应目录下
     * @param daoName 数据源名称
     * @param sqlID xml中对应SQL的节点ID
     * @return CoreReturnObject 平台统一返回对象
     */
    protected CoreReturnObject getDataBySqlID(String daoName, String sqlID) {
        return this.getDataBySqlID(daoName, sqlID, null);
    }

    /**
     * 根据SQLID执行带参数的查询语句并返回结果，SQLID配置在对应的XML文件中，在Server/WebRoot/query对应目录下
     * @param sqlID xml中对应SQL的节点ID
     * @param params SQL对应的参数
     * @return CoreReturnObject 平台统一返回对象
     */
    protected CoreReturnObject getDataBySqlID(String sqlID, Object[] params) {
        return this.getDataBySqlID(CoreConstantData.sysbeanstr, sqlID, params);
    }

    /**
     * 根据SQLID执行带参数的查询语句并返回结果，SQLID配置在对应的XML文件中，在Server/WebRoot/query对应目录下
     * @param daoName 数据源名称
     * @param sqlID xml中对应SQL的节点ID
     * @param params SQL对应的参数
     * @return CoreReturnObject 平台统一返回对象
     */
    protected CoreReturnObject getDataBySqlID(String daoName, String sqlID,
            Object[] params) {
        CoreReturnObject cro = new CoreReturnObject();

        if (StringTool.isNullOrEmpty(sqlID)) {
            cro.setV_errCode(-2);
            cro.setV_errMsg("未指定SqlID！");
            return cro;
        }

        String sql = CoreXmlSqlParsersFactory.getSql(sqlID);
        if (StringTool.isNullOrEmpty(sql)) {
            cro.setV_errCode(-3);
            cro.setV_errMsg("找不到指定SQL语句！\nSqlID：" + sqlID.trim() + "！");
            return cro;
        }

        return this.getData(daoName, sql, params);
    }

    /**
     * 执行SQL语句并返回结果(insert/update/delete)
     * @param sql 需执行的SQL
     * @return CoreReturnObject 平台统一返回对象
     */
    protected CoreReturnObject setData(String sql) {
        return this.setData(CoreConstantData.sysbeanstr, sql, null);
    }

    /**
     * 执行SQL语句并返回结果(insert/update/delete)
     * @param daoName 数据源名称
     * @param sql 需执行的SQL
     * @return CoreReturnObject 平台统一返回对象
     */
    protected CoreReturnObject setData(String daoName, String sql) {
        return this.setData(daoName, sql, null);
    }

    /**
     * 执行带参数的SQL语句并返回结果(insert/update/delete)
     * @param sql 需执行的SQL
     * @param params SQL对应的参数
     * @return CoreReturnObject 平台统一返回对象
     */
    protected CoreReturnObject setData(String sql, Object[] params) {
        return setData(CoreConstantData.sysbeanstr, sql, params);
    }

    /**
     * 执行带参数的SQL语句并返回结果(insert/update/delete)
     * @param daoName 数据源名称
     * @param sql 需执行的SQL
     * @param params SQL对应的参数
     * @return CoreReturnObject 平台统一返回对象
     */
    protected CoreReturnObject setData(String daoName, String sql,
            Object[] params) {
        CoreReturnObject cro = new CoreReturnObject();
        if (StringTool.isNullOrEmpty(sql)) {
            cro.setV_errCode(-1);
            cro.setV_errMsg("SQL语句不能为空！");
            return cro;
        }
        try {
            if (params == null || params.length == 0) {
                cro = this.getDao(daoName).ExcuteNonQuery(sql);
            }
            else {
                cro = this.getDao(daoName).ExcuteNonQuery(sql, params);
            }
            cro.setResult(1);
        }
        catch (SQLException sqle) {
            cro.setV_errCode(sqle.getErrorCode());
            cro.setV_errMsg(sqle.getMessage());
            logAdapter.filelogger
                    .logError("DBCommon.setData(String sql, Object[] params) "
                            + sqle.getMessage());
        }

        return cro;
    }

    /**
     * 根据SQLID执行语句(insert/update/delete)并返回结果，SQLID配置在对应的XML文件中，在Server/WebRoot/
     * query对应目录下
     * @param sqlID xml中对应SQL的节点ID
     * @return CoreReturnObject 平台统一返回对象
     */
    protected CoreReturnObject setDataBySqlID(String sqlID) {
        return this.setDataBySqlID(CoreConstantData.sysbeanstr, sqlID, null);
    }

    /**
     * 根据SQLID执行语句(insert/update/delete)并返回结果，SQLID配置在对应的XML文件中，在Server/WebRoot/
     * query对应目录下
     * @param daoName 数据源名称
     * @param sqlID xml中对应SQL的节点ID
     * @return CoreReturnObject 平台统一返回对象
     */
    protected CoreReturnObject setDataBySqlID(String daoName, String sqlID) {
        return this.setDataBySqlID(daoName, sqlID, null);
    }

    /**
     * 根据SQLID执行带参数的语句(insert/update/delete)并返回结果，SQLID配置在对应的XML文件中，在Server/
     * WebRoot/query对应目录下
     * @param sqlID xml中对应SQL的节点ID
     * @param params SQL对应的参数
     * @return CoreReturnObject 平台统一返回对象
     */
    protected CoreReturnObject setDataBySqlID(String sqlID, Object[] params) {
        return this.setDataBySqlID(CoreConstantData.sysbeanstr, sqlID, params);
    }

    /**
     * 根据SQLID执行带参数的语句(insert/update/delete)并返回结果，SQLID配置在对应的XML文件中，在Server/
     * WebRoot/query对应目录下
     * @param daoName 数据源名称
     * @param sqlID xml中对应SQL的节点ID
     * @param params SQL对应的参数
     * @return CoreReturnObject 平台统一返回对象
     */
    protected CoreReturnObject setDataBySqlID(String daoName, String sqlID,
            Object[] params) {
        CoreReturnObject cro = new CoreReturnObject();

        if (StringTool.isNullOrEmpty(sqlID)) {
            cro.setV_errCode(-2);
            cro.setV_errMsg("未指定SqlID！");
            return cro;
        }

        String sql = CoreXmlSqlParsersFactory.getSql(sqlID);
        if (StringTool.isNullOrEmpty(sql)) {
            cro.setV_errCode(-3);
            cro.setV_errMsg("找不到指定SQL语句！\nSqlID：" + sqlID.trim() + "！");
            return cro;
        }

        return this.setData(daoName, sql, params);
    }

    /**
     * 批量执行带参数的SQL语句并返回结果(insert/update/delete)
     * @param sqllist 需执行的SQL集合
     * @param params SQL对应的参数集合
     * @return CoreReturnObject 平台统一返回对象
     */
    protected CoreReturnObject setData(ArrayList<String> sqllist,
            ArrayList<Object[]> params) {
        return setData(CoreConstantData.sysbeanstr, sqllist, params);
    }

    /**
     * 批量执行带参数的SQL语句并返回结果(insert/update/delete)
     * @param daoName 数据源名称
     * @param sqllist 需执行的SQL集合
     * @param params SQL对应的参数集合
     * @return CoreReturnObject 平台统一返回对象
     */
    protected CoreReturnObject setData(String daoName,
            ArrayList<String> sqllist, ArrayList<Object[]> params) {
        CoreReturnObject cro = new CoreReturnObject();
        if (sqllist == null || sqllist.size() == 0) {
            cro.setV_errCode(-1);
            cro.setV_errMsg("SQL语句不能为空！");
            return cro;
        }

        if (params == null || params.size() == 0) {
            cro = this.getDao(daoName).ExcuteTransction(sqllist);
        }
        else {
            cro = this.getDao(daoName).ExcuteTransction(sqllist, params);
        }
        cro.setResult(sqllist.size());
        return cro;
    }

    /**
     * 根据SQLID批量执行带参数的语句(insert/update/delete)并返回结果，SQLID配置在对应的XML文件中，在Server/
     * WebRoot/query对应目录下
     * @param sqlIDlist xml中对应SQL的节点ID集合
     * @param params SQL对应的参数集合
     * @return CoreReturnObject 平台统一返回对象
     */
    public CoreReturnObject setDataById(ArrayList<String> sqlIDlist,
            ArrayList<Object[]> params) {
        CoreReturnObject cro = new CoreReturnObject();
        if (sqlIDlist == null || sqlIDlist.size() == 0) {
            cro.setV_errCode(-2);
            cro.setV_errMsg("未指定SqlID！");
            return cro;
        }

        ArrayList<String> sqllist = new ArrayList<String>();
        for (int i = 0; i < sqlIDlist.size(); i++) {
            String sql = CoreXmlSqlParsersFactory.getSql(sqlIDlist.get(i));
            if (StringTool.isNullOrEmpty(sql)) {
                cro.setV_errCode(-3);
                cro.setV_errMsg("找不到指定SQL语句！\nSqlID：" + sqlIDlist.get(i).trim()
                        + "！");
                return cro;
            }
            sqllist.add(sql);
        }

        return this.setData(sqllist, params);
    }

    /**
     * 根据SQLID批量执行带参数的语句(insert/update/delete)并返回结果，SQLID配置在对应的XML文件中，在Server/
     * WebRoot/query对应目录下
     * @param daoName 数据源名称
     * @param sqlIDlist xml中对应SQL的节点ID集合
     * @param params SQL对应的参数集合
     * @return CoreReturnObject 平台统一返回对象
     */
    public CoreReturnObject setDataById(String daoName,
            ArrayList<String> sqlIDlist, ArrayList<Object[]> params) {
        CoreReturnObject cro = new CoreReturnObject();
        if (sqlIDlist == null || sqlIDlist.size() == 0) {
            cro.setV_errCode(-2);
            cro.setV_errMsg("未指定SqlID！");
            return cro;
        }

        ArrayList<String> sqllist = new ArrayList<String>();
        for (int i = 0; i < sqlIDlist.size(); i++) {
            String sql = CoreXmlSqlParsersFactory.getSql(sqlIDlist.get(i));
            if (StringTool.isNullOrEmpty(sql)) {
                cro.setV_errCode(-3);
                cro.setV_errMsg("找不到指定SQL语句！\nSqlID：" + sqlIDlist.get(i).trim()
                        + "！");
                return cro;
            }
            sqllist.add(sql);
        }

        return this.setData(daoName, sqllist, params);
    }
}
