Esempio n. 1
0
        private LockData CreateLockDataSub <TRecord>(RecordViewTableMap <TRecord> aRecordViewTableMap
                                                     , long apTranId
                                                     , string recordName
                                                     , string tableName
                                                     , Dictionary <string, string> cnf)
            where TRecord : class, IRecord, new()
        {
            //主キーを含む全ての一致条件を格納するオブジェクト
            CNFofEquation cnfOfEquation = new CNFofEquation();
            //主キーに対する一致条件のみを格納するオブジェクト
            CNFofEquation cnfOfPKey = new CNFofEquation();

            //乗法標準形を用意する
            foreach (KeyValuePair <string, string> eqPredicate in cnf)
            {
                string varName = eqPredicate.Key;
                //SQLリテラル表記で値を取得する
                string value = eqPredicate.Value;

                //valueがIsNullPropertyValue()でNULL値と判定された場合、Predicateに含まれない(暫定実装)
                TableInfo  aTableInfo  = aRecordViewTableMap.GetTableInfo(tableName);
                ColumnInfo aColumnInfo = aTableInfo[varName];

                //一致条件を述語に追加する
                cnfOfEquation.Add(new Equation(varName, value));

                //主キーに対する一致条件であればcnfOfPKeyにも格納する
                if (aColumnInfo.PrimaryKey.HasValue && aColumnInfo.PrimaryKey.Value)
                {
                    cnfOfPKey.Add(new Equation(varName, value));
                    //テーブルの全ての主キーに対する一致条件が取得できれば、
                    //主キーに対する一致条件のみの述語だけで必要十分である
                    if (cnfOfPKey.Count == aTableInfo.GetPrimaryKeys().Count)
                    {
                        return(new LockData(apTranId, recordName, "", tableName, cnfOfPKey));
                    }
                }
            }

            return(new LockData(apTranId, recordName, "", tableName, cnfOfEquation));
        }
Esempio n. 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);
        }