Example #1
0
            public SqlBuilder GetSelectSql <TRecord>(Query <TRecord> query
                                                     , LoadMode aLoadMode)
                where TRecord : class, IRecord, new()
            {
                //TRecord型レコードとViewのマッピング情報を取得する
                RecordViewTableMap <TRecord> aRecordViewMap = _aRecordViewTableMapFactory.CreateRecordViewTableMap <TRecord>();
                //TRecordに対応するSqlPodを生成する
                SqlPod aSqlPod = _aSqlPodFactory.CreateSqlPod <TRecord>();

                //aQueryが持つ条件のプロパティ型リテラル値をDBデータ型に型変換する
                query = aRecordViewMap.CastQuery(query);

                //SQL文を作成する
                //引数aLoadModeとaRecordTableMapを追加したのは苦渋の決断
                //(SqlBuilderがテーブルのメタ情報を扱うことを想定していなかったので、後付による拡張が綺麗にならない)
                RecordViewTableMap <TRecord> aRecordViewTableMap = _aRecordViewTableMapFactory.CreateRecordViewTableMap <TRecord>();

                return(aSqlPod.GetSelectSql(query, aRecordViewTableMap));
            }
Example #2
0
        /// <summary>
        /// SQL文の抽出条件からロックを作成する
        /// </summary>
        /// <typeparam name="TRecord"></typeparam>
        /// <param name="apTranId">APトランザクションID</param>
        /// <param name="sql">SQL文</param>
        /// <returns>作成したロックデータ</returns>
        /// <remarks></remarks>
        private List <LockData> CreateLockData <TRecord>(long apTranId
                                                         , SqlBuilder sql)
            where TRecord : class, IRecord, new()
        {
            List <LockData> ret = new List <LockData>();

            //TRecord型レコードとテーブルのマッピング情報を取得する
            RecordViewTableMap <TRecord> aRecordViewTableMap = _aRecordViewTableMapFactory.CreateRecordViewTableMap <TRecord>();
            //TRecord型レコードのメタ情報を取得する
            RecordInfo <TRecord> aRecordInfo = aRecordViewTableMap.GetRecordInfo();

            //テーブル列リストを作成する
            Dictionary <string, IEnumerable <string> > tableColumns = new Dictionary <string, IEnumerable <string> >();

            foreach (string srcTableName in sql.GetSrcTableNames())
            {
                //相関テーブルの主キーリストを作成する
                List <string> allColumnNames = new List <string>();
                foreach (ColumnInfo column in aRecordViewTableMap.GetTableInfo(srcTableName).GetAllColumns())
                {
                    allColumnNames.Add(column.ColumnName);
                }
                tableColumns.Add(srcTableName, allColumnNames);
            }

            //SQL文の抽出条件からロック情報を作成する
            foreach (KeyValuePair <SqlTable, Dictionary <string, string> > tableNameCnfPair in sql.GetCNF(tableColumns))
            {
                string srcTableName             = tableNameCnfPair.Key.Name;
                Dictionary <string, string> cnf = tableNameCnfPair.Value;
                LockData aLockData = this.CreateLockDataSub(aRecordViewTableMap
                                                            , apTranId
                                                            , aRecordInfo.Name
                                                            , srcTableName
                                                            , cnf);
                ret.Add(aLockData);
            }

            return(ret);
        }