Beispiel #1
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);
        }
Beispiel #2
0
        private List <LockData> CreateLockDataFromRecord_new <TRecord>(long apTranId
                                                                       , TRecord aRecord
                                                                       , IEnumerable <SqlTable> usedTableNames)
            where TRecord : class, IRecord, new()
        {
            List <LockData> ret = new List <LockData>();

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

            foreach (KeyValuePair <SqlTable, Dictionary <string, SqlExpr> > kv in aRecordViewTableMap.GetCNFExpression(aRecord
                                                                                                                       , usedTableNames))
            {
                string tableName = kv.Key.Name;
                //CNFを作成する
                Dictionary <string, string> cnf = new Dictionary <string, string>();
                foreach (KeyValuePair <string, SqlExpr> eq in kv.Value)
                {
                    //CNFの素論理式はリテラル値への一致条件のみとする
                    if (eq.Value.IsLiteral)
                    {
                        cnf.Add(eq.Key, eq.Value.ToString());
                    }
                }

                //ロック情報を作成する
                LockData aLockData = this.CreateLockDataSub(aRecordViewTableMap
                                                            , apTranId
                                                            , aRecordInfo.Name
                                                            , tableName
                                                            , cnf);
                ret.Add(aLockData);
            }

            return(ret);
        }