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);