public SqlClientPersistence(IWritePrimitives writePrimitives,
     IDeferredValueGenerator<LargeInteger> deferredValueGenerator,
     IAttributeDecorator attributeDecorator, bool enforceKeyReferenceCheck)
 {
     this.writePrimitives = writePrimitives;
     this.deferredValueGenerator = deferredValueGenerator;
     this.attributeDecorator = attributeDecorator;
     this.enforceKeyReferenceCheck = enforceKeyReferenceCheck;
 }
        public SqlWriterDictionary(LetterEncoder encoder, IWritePrimitives writePrimitives, SqlWriterCommandTextGenerator commandTextGenerator)
        {
            SqlWriterDictionary.Logger.Debug("Entering constructor");

            this.encoder = encoder;
            this.writePrimitives = writePrimitives;
            this.commandTextGenerator = commandTextGenerator;

            this.PopulateWriterDictionary();

            SqlWriterDictionary.Logger.Debug("Exiting constructor");
        }
        private Columns GetColumnData(IWritePrimitives writer)
        {
            InsertRecord.Logger.Debug("Entering GetColumnData");

            // ReSharper disable once UseObjectOrCollectionInitializer
            var result = new Columns();

            result.RegularColumns = this.service.GetRegularColumns(writer);

            this.foreignKeyColumns = this.service.GetForeignKeyColumns(this.primaryKeyOperations);

            result.ForeignKeyColumns =
                this.foreignKeyColumns.Select(
                    columnSymbol => new Column {Name = columnSymbol.ColumnName, Value = columnSymbol.Value});

            InsertRecord.Logger.Debug("Exiting GetColumnData");
            return result;
        }
        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");
        }
        private void PopulatePrimaryKeyValues(IWritePrimitives writer, List<ColumnSymbol> primaryKeyValues, IEnumerable<Column> columns)
        {
            InsertRecordService.Logger.Debug("Entering PopulatePrimaryKeyValues");

            columns = columns.ToList();

            InsertRecordService.Logger.Debug($"columns: {Helper.ToCompositeString(columns)}");

            IEnumerable<PropertyAttribute<PrimaryKeyAttribute>> pkPropertyAttributes =
                this.attributeDecorator.GetPropertyAttributes<PrimaryKeyAttribute>(this.recordReference.RecordType);

            IEnumerable<ColumnSymbol> result = pkPropertyAttributes.Select(pa =>
            {
                string columnName = Helper.GetColumnName(pa.PropertyInfo, this.attributeDecorator);

                Column sourceColumn = columns.FirstOrDefault(c => c.Name.Equals(columnName, StringComparison.Ordinal));

                if (sourceColumn == null)
                {
                    if (pa.Attribute.KeyType != PrimaryKeyAttribute.KeyTypeEnum.Auto)
                    {
                        throw new PopulatePrimaryKeyException(Messages.ColumnNotInInputList, pa.PropertyInfo);
                    }

                    if (
                        !new[]
                        {typeof (int), typeof (short), typeof (long), typeof (uint), typeof (ushort), typeof (ulong),}
                            .Contains(pa.PropertyInfo.PropertyType.GetUnderLyingType()))
                    {
                        throw new PopulatePrimaryKeyException(Messages.AutoKeyMustBeInteger, pa.PropertyInfo);
                    }

                    sourceColumn = new Column {Name = columnName, Value = writer.SelectIdentity(columnName)};
                }

                var symbol = new ColumnSymbol
                {
                    ColumnName = sourceColumn.Name,

                    TableType = this.recordReference.RecordType,

                    Value = sourceColumn.Value,
                };

                return symbol;
            }).ToList();

            InsertRecordService.Logger.Debug($"Exiting PopulatePrimaryKeyValues. result: {Helper.ToCompositeString(result)}");

            primaryKeyValues.AddRange(result);
        }
        public virtual void WritePrimitives(IWritePrimitives writer, string catalogueName, string schema, string tableName, IEnumerable<Column> columns, List<ColumnSymbol> primaryKeyValues)
        {
            InsertRecordService.Logger.Debug("Entering WritePrimitives");

            columns = columns.ToList();

            InsertRecordService.Logger.Debug($"tableName: {tableName}, columns: {Helper.ToCompositeString(columns)}");

            writer.Insert(catalogueName, schema, tableName, columns);

            this.PopulatePrimaryKeyValues(writer, primaryKeyValues, columns);

            InsertRecordService.Logger.Debug("Exiting WritePrimitives");
        }
        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 virtual IEnumerable<Column> GetRegularColumns(IWritePrimitives writer)
        {
            InsertRecordService.Logger.Debug("Entering GetRegularColumns");

            IEnumerable<Column> result =
                this.recordReference.RecordType.GetPropertiesHelper()
                    .Where(p =>
                    {
                        PrimaryKeyAttribute pka;

                        bool filter =

                            this.attributeDecorator.GetSingleAttribute<ForeignKeyAttribute>(p) == null

                            &&

                            ((pka = this.attributeDecorator.GetSingleAttribute<PrimaryKeyAttribute>(p)) == null ||
                             pka.KeyType != PrimaryKeyAttribute.KeyTypeEnum.Auto);

                        return filter;
                    })
                    .Select(
                        p =>
                        {
                            string columnName = Helper.GetColumnName(p, this.attributeDecorator);

                            var column = new Column
                            {
                                Name = columnName,

                                Value =

                                    p.PropertyType.IsGuid() && !this.recordReference.IsExplicitlySet(p)

                                        ? writer.WriteGuid(columnName)

                                        : p.GetValue(this.recordReference.RecordObject)
                            };

                            return column;
                        }
                    ).ToList();

            InsertRecordService.Logger.Debug($"Exiting GetRegularColumns. result: {Helper.ToCompositeString(result)}");

            return result;
        }
 public abstract void Write(CircularReferenceBreaker breaker, IWritePrimitives writer, Counter order, AbstractRepositoryOperation[] orderedOperations);