SqlAppQueryService

using System;
using System.Collections.Generic;
using System.Text;
using SharpErp.Framework.Data;

namespace SharpErp.Framework.Data
{
    public class SqlAppQueryService : IDataQueryService, IServiceProvider
    {
        private Dictionary<string, string> appWhere = new Dictionary<string, string>();
        private Dictionary<string, RecordParameterCollection> appParameters = new Dictionary<string, RecordParameterCollection>();
        private bool initParas;

        #region IDataFindService Members

        public void AppendClause(IDataBlock dataBlock, string clause)
        {
            string currentClause = dataBlock.WhereClause;
            if (!appWhere.ContainsKey(dataBlock.DataBlockName))
            {
                appWhere.Add(dataBlock.DataBlockName, dataBlock.WhereClause);
            }
            dataBlock.WhereClause = JoinClause(currentClause, clause);
        }

        public string JoinClause(string clause1, string clause2)
        {
            if (string.IsNullOrEmpty(clause1))
                return clause2;
            else if (string.IsNullOrEmpty(clause2))
                return clause1;
            else
                return clause1 + " and (" + clause2 + ")";
        }

        public void QueryForeignKey(IDataBlock dataBlock, string dbField, string nonDbField, string tableNname, string idColumn, string nameColumn, string extraWhereClause)
        {
            throw new Exception("The method or operation is not implemented.");
        }

        /// <summary>
        ///  -- For folder support, when a -1=-1 or -2=-2 are in the WHERE,
        ///  -- the folder has already saved the clause, so reset to that.
        ///  -- If neither exists restore from the record group.
        /// </summary>
        /// <param name="dataBlock"></param>
        public void Reset(IDataBlock dataBlock)
        {
            if (dataBlock == null || string.IsNullOrEmpty(dataBlock.WhereClause))
            {
                initParas = true;
                return;
            }
            string clause = dataBlock.WhereClause;

            int marker_pos = clause.IndexOf(" AND -2=-2");
            if (marker_pos != -1)
            {
                clause = clause.Substring(0, marker_pos + 10);
                dataBlock.WhereClause = clause;
            }
            else
            {
                marker_pos = clause.IndexOf(" AND -1=-1");
                if (marker_pos != -1)
                {
                    clause = clause.Substring(0, marker_pos + 10);
                    dataBlock.WhereClause = clause;
                }
                else
                {
                    if (appWhere.ContainsKey(dataBlock.DataBlockName))
                        dataBlock.WhereClause = appWhere[dataBlock.DataBlockName];
                    else
                        appWhere.Add(dataBlock.DataBlockName, dataBlock.WhereClause);
                }
            }
            if (initParas)
            {
                dataBlock.Parameters.Clear();
                if (appParameters.ContainsKey(dataBlock.DataBlockName))
                {
                    RecordParameterCollection paras = appParameters[dataBlock.DataBlockName];
                    if (paras != null)
                    {
                        foreach (RecordParameter para in paras)
                        {
                            dataBlock.Parameters.Add(para);
                        }
                    }
                }
            }
            else
            {
                if (dataBlock.Parameters != null && dataBlock.Parameters.Count > 0)
                {
                    RecordParameterCollection paras = new RecordParameterCollection();
                    paras.AddRange(dataBlock.Parameters);
                    appParameters.Add(dataBlock.DataBlockName, paras);
                }
                initParas = true;
            }
        }

        #endregion

        #region IServiceProvider Members

        public object GetService(Type serviceType)
        {
            if (serviceType == typeof(IDataQueryService))
            {
                return this;
            }
            return null;
        }

        #endregion
    }
}

posted @ 2010-06-12 19:03  leslie116  阅读(337)  评论(0编辑  收藏  举报