public void CircularReferenceBreaker_Test()
        {
            XmlConfigurator.Configure();

            var breaker = new CircularReferenceBreaker();

            Assert.IsFalse(breaker.IsVisited<object, object, object>(this.TestMethod));

            breaker.Push<object, object, object>(this.TestMethod);

            Assert.IsTrue(breaker.IsVisited<object, object, object>(this.TestMethod));

            breaker.Push<object, object, object>(this.TestMethod);

            Assert.IsTrue(breaker.IsVisited<object, object, object>(this.TestMethod));

            breaker.Pop();

            Assert.IsTrue(breaker.IsVisited<object, object, object>(this.TestMethod));

            breaker.Pop();

            Assert.IsFalse(breaker.IsVisited<object, object, object>(this.TestMethod));
        }
        public void WritePrimaryKeyOperations_Test()
        {
            // Arrange

            var primaryKeyOperations = new[]
            {
                new Mock<InsertRecord>(this.insertRecordService, null, this.peers, null),
                new Mock<InsertRecord>(this.insertRecordService, null, this.peers, null),
            };

            // Act

            var breaker = new CircularReferenceBreaker();
            var currentOrder = new Counter();
            var orderedOperations = new AbstractRepositoryOperation[0];

            this.insertRecordService.WritePrimaryKeyOperations(this.writerMock.Object,
                primaryKeyOperations.Select(m => m.Object), breaker, currentOrder, orderedOperations);

            // Assert

            primaryKeyOperations.ToList()
                .ForEach(
                    o =>
                        o.Verify(m => m.Write(breaker, this.writerMock.Object, currentOrder, orderedOperations),
                            Times.Once));
        }
 private void TestMethod(CircularReferenceBreaker breaker, object arg1, object arg2, object arg3)
 {
 }
        public override void Write(CircularReferenceBreaker breaker, IWritePrimitives writer, Counter order, AbstractRepositoryOperation[] orderedOperations)
        {
            InsertRecord.Logger.Debug("Entering Write:" + this);
            InsertRecord.Logger.Debug($"breaker: {breaker}");

            if (breaker.IsVisited<IWritePrimitives, Counter, AbstractRepositoryOperation[]>(this.Write))
            {
                InsertRecord.Logger.Debug("Write already visited. Exiting");
                return;
            }

            if (this.IsWriteDone)
            {
                InsertRecord.Logger.Debug("Write already done. Exiting");
                return;
            }

            breaker.Push<IWritePrimitives, Counter, AbstractRepositoryOperation[]>(this.Write);

            this.primaryKeyOperations = this.service.GetPrimaryKeyOperations(this.Peers).ToList();

            this.service.WritePrimaryKeyOperations(writer, this.primaryKeyOperations, breaker, order, orderedOperations);

            Columns columnData = this.GetColumnData(writer);

            this.Order = order.Value++;
            InsertRecord.Logger.Debug($"this.Order: {this.Order}");
            orderedOperations[this.Order] = this;

            TableName tableName = Helper.GetTableName(this.RecordReference.RecordType, this.attributeDecorator);

            this.service.WritePrimitives(writer, tableName.CatalogueName, tableName.Schema, tableName.Name, columnData.AllColumns, this.primaryKeyValues);

            this.service.CopyPrimaryToForeignKeyColumns(columnData.ForeignKeyColumns);

            this.IsWriteDone = true;

            breaker.Pop();

            InsertRecord.Logger.Debug("Exiting Write");
        }
        public virtual void WritePrimaryKeyOperations(IWritePrimitives writer, IEnumerable<AbstractRepositoryOperation> primaryKeyOperations,
            CircularReferenceBreaker breaker, Counter order, AbstractRepositoryOperation[] orderedOperations)
        {
            InsertRecordService.Logger.Debug("Entering WritePrimaryKeyOperations");

            primaryKeyOperations = primaryKeyOperations.ToList();

            InsertRecordService.Logger.Debug($"primaryKeyOperations: {primaryKeyOperations.GetRecordTypesString()}");
            InsertRecordService.Logger.Debug($"order: {order.Value}");

            InsertRecordService.Logger.Debug($"orderedOperations: {orderedOperations.GetRecordTypesString()}");

            primaryKeyOperations.ToList().ForEach(o => o.Write(breaker, writer, order, orderedOperations));

            InsertRecordService.Logger.Debug("Exiting WritePrimaryKeyOperations");
        }
 public abstract void Write(CircularReferenceBreaker breaker, IWritePrimitives writer, Counter order, AbstractRepositoryOperation[] orderedOperations);