Exemple #1
0
        /// <summary>
        /// Creates a procedure that collects table locks needed for the 'Load' operation.
        /// </summary>
        /// <param name="externalInterfaceClass"></param>
        public LoadLock(ExternalInterfaceSchema ExternalInterfaceSchema, MiddleTierTable middleTierTable)
            : base(ExternalInterfaceSchema, middleTierTable)
        {
            // These are shorthand notations for values that are use often to construct the tables:
            string tableVariable = string.Format("{0}Table", this.MiddleTierTable.ElementTable.Name[0].ToString().ToLower() + this.MiddleTierTable.ElementTable.Name.Remove(0, 1));
            string rowVariable   = string.Format("{0}Row", this.MiddleTierTable.ElementTable.Name[0].ToString().ToLower() + this.MiddleTierTable.ElementTable.Name.Remove(0, 1));
            string tableTypeName = string.Format("{0}.{1}DataTable", this.ExternalInterfaceSchema.DataSetName, this.MiddleTierTable.ElementTable.Name);

            //        /// <summary>Collects the table lock request(s) for an 'Load' operation</summary>
            //        /// <param name="requestLocks">A collection of table locks required for this operation.</param>
            //        public static void Load(LockRequestList lockRequests)
            //        {
            this.Comments.Add(new CodeCommentStatement("<summary>Collects the table lock request(s) for an 'Load' operation</summary>", true));
            this.Comments.Add(new CodeCommentStatement(@"<param name=""adoTransaction"">A collection of table locks required for this operation</param>", true));
            this.Attributes = MemberAttributes.Public | MemberAttributes.Final | MemberAttributes.Static;
            if (this.MiddleTierTable.ElementBaseTable != null)
            {
                this.Attributes |= MemberAttributes.New;
            }
            this.Name = "Load";
            this.Parameters.Add(new CodeParameterDeclarationExpression("AdoTransaction", "adoTransaction"));

            //            // Call the internal methods to lock the tables required for an insert or update operation.
            //            Shadows.Web.Service.Equity.Insert(transaction);
            //            Shadows.Web.Service.Equity.Update(transaction);
            this.Statements.Add(new CodeCommentStatement("Call the internal methods to lock the tables required for an insert or update operation."));
            this.Statements.Add(new CodeMethodInvokeExpression(new CodeTypeReferenceExpression(string.Format("{0}.{1}", this.ExternalInterfaceSchema.InternalNamespace, this.MiddleTierTable.ElementTable.Name)), "Insert", new CodeExpression[] { new CodeVariableReferenceExpression("adoTransaction") }));
            if (this.MiddleTierTable.NonPrimaryKeyColumns != 0)
            {
                this.Statements.Add(new CodeMethodInvokeExpression(new CodeTypeReferenceExpression(string.Format("{0}.{1}", this.ExternalInterfaceSchema.InternalNamespace, this.MiddleTierTable.ElementTable.Name)), "Update", new CodeExpression[] { new CodeVariableReferenceExpression("adoTransaction") }));
            }

            //            // These table lock(s) are required for the 'Load' operation.
            //            transaction.Locks.AddReaderLock(ServerMarketData.ConfigurationLock);
            //            transaction.Locks.AddWriterLock(ServerMarketData.AlgorithmLock);
            //            transaction.Locks.AddReaderLock(ServerMarketData.AlgorithmTypeLock);
            this.Statements.Add(new CodeCommentStatement("These table lock(s) are required for the 'Load' operation."));
            this.Statements.Add(new CodeMethodInvokeExpression(new CodeFieldReferenceExpression(new CodeArgumentReferenceExpression("adoTransaction"), "LockRequests"), "AddReaderLock", new CodeExpression[] { new CodeFieldReferenceExpression(new CodeTypeReferenceExpression(this.ExternalInterfaceSchema.DataSetName), string.Format("{0}Lock", this.MiddleTierTable.ElementTable.Name)) }));
            ArrayList arrayLock = new ArrayList();

            foreach (XmlSchemaKeyref keyrefParent in this.MiddleTierTable.KeyrefParents)
            {
                // Get the name of the parent table.
                XmlSchemaIdentityConstraint keyParent          = this.ExternalInterfaceSchema.FindKey(keyrefParent.Refer.Name);
                XmlSchemaElement            elementParentTable = this.ExternalInterfaceSchema.FindTable(this.ExternalInterfaceSchema.RemoveXPath(keyParent.Selector));
                // Collect the locks of all the parent tables.
                CollectTableLocks(arrayLock, elementParentTable);
            }
            // This will set a flag is the configuration table is needed to resolve external identifiers.
            bool needsCondigurationTable = this.MiddleTierTable.IsExternalIdClass;

            foreach (XmlSchemaElement elementParentTable in arrayLock)
            {
                if (this.ExternalInterfaceSchema.HasExternalIdColumn(elementParentTable))
                {
                    needsCondigurationTable = true;
                    break;
                }
            }
            if (needsCondigurationTable)
            {
                this.Statements.Add(new CodeMethodInvokeExpression(new CodeFieldReferenceExpression(new CodeArgumentReferenceExpression("adoTransaction"), "LockRequests"), "AddReaderLock", new CodeExpression[] { new CodeFieldReferenceExpression(new CodeTypeReferenceExpression(this.ExternalInterfaceSchema.DataSetName), "ConfigurationLock") }));
            }
            foreach (XmlSchemaElement elementParentTable in arrayLock)
            {
                this.Statements.Add(new CodeMethodInvokeExpression(new CodeFieldReferenceExpression(new CodeArgumentReferenceExpression("adoTransaction"), "LockRequests"), "AddReaderLock", new CodeExpression[] { new CodeFieldReferenceExpression(new CodeTypeReferenceExpression(this.ExternalInterfaceSchema.DataSetName), string.Format("{0}Lock", elementParentTable.Name)) }));
            }
        }