/// <summary> /// Initializes a given column to the values defined in this ColumnAttribute. /// </summary> /// <param name="column"></param> public void RemapColumn(OidColumn column) { // If the attribute was set over a class definition, // it should overwrite existing values. // If the attribute is assembly wide // existing values should only be altered, if they don't equal // the initial values of a column. if (!IsAssemblyWideDefinition || !column.AutoIncremented) { column.AutoIncremented = this.autoIncremented; } if (!IsAssemblyWideDefinition || column.AutoIncrementStart == 1) { column.AutoIncrementStart = this.autoIncrementStart; } if (!IsAssemblyWideDefinition || column.AutoIncrementStep == 1) { column.AutoIncrementStep = this.autoIncrementStep; } if (!IsAssemblyWideDefinition || String.IsNullOrEmpty(column.FieldName)) { column.FieldName = this.fieldName; } if (!IsAssemblyWideDefinition || String.IsNullOrEmpty(column.RelationName)) { column.RelationName = this.relationName; } base.RemapColumn(column); }
/// <summary> /// Creates a new OidColumn object and initializes it to the values defined in this OidColumnAttribute. /// </summary> /// <param name="parent"></param> /// <returns></returns> public OidColumn CreateOidColumn(ClassOid parent) { OidColumn oidColumn = new OidColumn(parent); SetOidColumnValues(oidColumn); return(oidColumn); }
private void OnIdGeneration(Type t, ObjectId oid) { if (!t.FullName.StartsWith("NDOObjectIdTestClasses.")) { return; // Use the other handler } Class cl = pm.NDOMapping.FindClass(t); Assert.NotNull(cl); OidColumn oidColumn = (OidColumn)cl.Oid.OidColumns[0]; if (t == typeof(NDOoidAndHandler) || t == typeof(ClassWithHint)) { if (oidColumn.SystemType == typeof(string)) { oid.Id[0] = this.guid.ToString(); } else { oid.Id[0] = this.guid; } } else { oid.Id[0] = 1; } }
public void HintEnhancerTest() { Class cl = pm.NDOMapping.FindClass(typeof(ClassWithHint)); IProvider provider = NDOProviderFactory.Instance[((Connection)pm.NDOMapping.Connections.First()).Type]; Assert.NotNull(cl, "Class not found"); Assert.AreEqual(typeof(Guid), ((OidColumn)cl.Oid.OidColumns[0]).SystemType, "Wrong type"); Type t = pm.GetType(); FieldInfo fi = t.GetField("ds", BindingFlags.NonPublic | BindingFlags.Instance); Assert.NotNull(fi, "Field 'ds' not found"); DataSet ds = (DataSet)fi.GetValue(pm); Assert.NotNull(ds, "DataSet is null"); DataTable dt = ds.Tables[cl.TableName]; Assert.NotNull(dt, "DataTable is null"); OidColumn oidColumn = (OidColumn)cl.Oid.OidColumns[0]; DataColumn dc = dt.Columns[oidColumn.Name]; Assert.NotNull(dc, "DataColumn is null"); Assert.NotNull(provider, "Provider is null"); if (provider.SupportsNativeGuidType) { Assert.AreEqual(typeof(Guid), dc.DataType, "Wrong column type"); } else { Assert.AreEqual(typeof(string), dc.DataType, "Wrong column type"); } }
/// <summary> /// Initializes a given column to the values defined in this ColumnAttribute. /// </summary> /// <param name="column"></param> public void SetOidColumnValues(OidColumn column) { column.AutoIncremented = this.autoIncremented; column.AutoIncrementStart = this.autoIncrementStart; column.AutoIncrementStep = this.autoIncrementStep; column.FieldName = this.fieldName; column.RelationName = this.relationName; base.SetColumnValues(column); }
private void GenerateDeleteCommand() { string sql = "DELETE FROM {0} WHERE ({1})"; //{0} = Tabellenname: Mitarbeiter //{1} = Where-Bedingung: id = @Original_id string where = string.Empty; int oidCount = this.classMapping.Oid.OidColumns.Count; for (int i = 0; i < oidCount; i++) { OidColumn oidColumn = (OidColumn)this.classMapping.Oid.OidColumns[i]; if (provider.UseNamedParams) { where += provider.GetQuotedName(oidColumn.Name) + " = " + provider.GetNamedParameter("D_Original_" + oidColumn.Name); } else { where += provider.GetQuotedName(oidColumn.Name) + " = ?"; } provider.AddParameter(deleteCommand, provider.GetNamedParameter("D_Original_" + oidColumn.Name), provider.GetDbType(oidColumn.SystemType), oidColumn.TypeLength, System.Data.ParameterDirection.Input, false, ((System.Byte)(0)), ((System.Byte)(0)), oidColumn.Name, System.Data.DataRowVersion.Original, null); Relation r = oidColumn.Relation; if (!this.hasGuidOid && r != null && r.ForeignKeyTypeColumnName != null) { where += " AND " + provider.GetQuotedName(r.ForeignKeyTypeColumnName) + " = " + provider.GetNamedParameter("D_Original_" + r.ForeignKeyTypeColumnName); provider.AddParameter(updateCommand, provider.GetNamedParameter("D_Original_" + r.ForeignKeyTypeColumnName), provider.GetDbType(typeof(int)), provider.GetDefaultLength(typeof(int)), System.Data.ParameterDirection.Input, false, ((System.Byte)(0)), ((System.Byte)(0)), r.ForeignKeyTypeColumnName, System.Data.DataRowVersion.Original, null); } if (i < oidCount - 1) { where += " AND "; } } string whereTS = string.Empty; if (this.timeStampColumn != null) { if (provider.UseNamedParams) { whereTS = " AND " + provider.GetQuotedName(timeStampColumn) + " = " + provider.GetNamedParameter("D_Original_" + timeStampColumn); } else { whereTS = " AND " + provider.GetQuotedName(timeStampColumn) + " = ?"; } provider.AddParameter(deleteCommand, provider.GetNamedParameter("D_Original_" + timeStampColumn), provider.GetDbType(typeof(Guid)), guidlength, System.Data.ParameterDirection.Input, false, ((System.Byte)(0)), ((System.Byte)(0)), timeStampColumn, System.Data.DataRowVersion.Original, null); } sql = string.Format(sql, qualifiedTableName, where + whereTS); this.deleteCommand.CommandText = sql; }
public static void OnIdGenerationEvent(Type t, ObjectId oid) { if (t.FullName.StartsWith ("NDOObjectIdTestClasses.")) return; // Use the other handler OidColumn oidColumn = (OidColumn)PmFactory.NewPersistenceManager().NDOMapping.FindClass(t).Oid.OidColumns[0]; if (oidColumn.SystemType == typeof(int)) oid.Id[0] = NextId(); else if (oidColumn.SystemType == typeof(Guid)) oid.Id[0] = Guid.NewGuid(); }
void Initialize(MappingNode mappingNode, IEnumerable <OidColumn> oidColumns, IEnumerable <ForeignKeyColumn> fkColumns, KeyValuePair <string, int>?typeCodeInfo) { IEnumerator <OidColumn> oidEnumerator = oidColumns.GetEnumerator(); oidEnumerator.MoveNext(); List <OqlExpression> compareExpressions = new List <OqlExpression>(); foreach (ForeignKeyColumn fkColumn in fkColumns) { OidColumn oidColumn = oidEnumerator.Current; compareExpressions.Add(new OnCompareExpression(mappingNode, oidColumn, fkColumn)); oidEnumerator.MoveNext(); } if (typeCodeInfo.HasValue) { compareExpressions.Add(new OnCompareExpression(mappingNode, typeCodeInfo.Value.Key, typeCodeInfo.Value.Value)); } if (compareExpressions.Count == 1) { Add(compareExpressions[0]); } else { OqlExpression andExpression = new OqlExpression(0, 0); int i = 0; foreach (var compareExpression in compareExpressions) { if (i++ == 0) { andExpression.Add(compareExpression); } else { andExpression.Add(compareExpression, "AND"); } } Add(andExpression); } }
/// <summary> /// Determines if a given OidColumn complies to the requirements defined by this OidColumnAttribute instance. /// </summary> /// <param name="oidColumn">The OidColumn to check.</param> /// <returns>True, if the OidColumn complies to the requirements defined by this OidColumnAttribute instance.</returns> public bool MatchesOidColumn(OidColumn oidColumn) { if (this.autoIncremented != oidColumn.AutoIncremented) { return(false); } if (this.autoIncrementStart != oidColumn.AutoIncrementStart) { return(false); } if (this.autoIncrementStep != oidColumn.AutoIncrementStep) { return(false); } if (this.fieldName != oidColumn.FieldName) // No Test for null, because column must be null too, if attribute defines null { return(false); } if (this.relationName != oidColumn.RelationName) // No Test for null, because column must be null too, if attribute defines null { return(false); } return(base.MatchesColumn(oidColumn)); }
public OnCompareExpression(MappingNode mappingNode, OidColumn oidColumn, ForeignKeyColumn fkColumn) : base(null, 0, 0) { Class fkParentClass = mappingNode as Class; if (fkParentClass != null) { Add(new RawIdentifierExpression(QualifiedColumnName.Get(oidColumn), 0, 0)); Add(new RawIdentifierExpression(QualifiedColumnName.Get(fkParentClass, fkColumn), 0, 0), "="); return; } MappingTable mappingTable = mappingNode as MappingTable; if (mappingTable != null) { Add(new RawIdentifierExpression(QualifiedColumnName.Get(oidColumn), 0, 0)); Add(new RawIdentifierExpression(QualifiedColumnName.Get(mappingTable, fkColumn), 0, 0), "="); return; } else { throw new ArgumentException("OnCompareExpression: Unexpected mapping node type", "mappingNode"); } }
static int Main(string[] args) { if (args.Length < 2) { Console.WriteLine("usage: ManipulateOidColumns mapping-file Guid|Auto"); return(-1); } Console.WriteLine("ManipulateOidColums: args: " + args[0] + " " + args[1]); if (!File.Exists(args[0])) { Console.WriteLine("can't find file " + args[0]); return(-2); } try { NDOMapping mapping = new NDOMapping(args[0]); foreach (Class cl in mapping.Classes) { if (cl.Oid.OidColumns.Count == 1) { OidColumn oidCol = (OidColumn)cl.Oid.OidColumns[0]; if (cl.FullName == "NDOObjectIdTestClasses.HintOwner") { oidCol.AutoIncremented = false; oidCol.NetType = "System.Int32,mscorlib"; } else if (cl.FullName == "NDOObjectIdTestClasses.ClassWithHint") { oidCol.AutoIncremented = false; oidCol.NetType = "System.Guid,mscorlib"; } else if (cl.FullName == "NDOObjectIdTestClasses.AbstractBaseGuid" || cl.FullName == "NDOObjectIdTestClasses.DerivedGuid") { oidCol.AutoIncremented = false; oidCol.NetType = "System.Guid,mscorlib"; oidCol.FieldName = "guid"; } else if (cl.FullName == "NDOObjectIdTestClasses.NDOoidAndHandler") { oidCol.AutoIncremented = false; oidCol.NetType = "System.Guid,mscorlib"; oidCol.FieldName = "myId"; } else if (cl.FullName == "NDOObjectIdTestClasses.ObjectOwner") { oidCol.AutoIncremented = false; oidCol.NetType = "System.Int32,mscorlib"; } else { if (args[1] == "Guid") { oidCol.AutoIncremented = false; oidCol.NetType = "System.Guid,mscorlib"; } else { oidCol.AutoIncremented = true; oidCol.NetType = null; } } } } mapping.Save(); } catch (Exception ex) { Console.WriteLine("ManipulateTableNames: " + ex.Message); return(-3); } return(0); }
/// <summary> /// Initializes the PersistenceHandler /// </summary> /// <param name="ndoMapping">Mapping information.</param> /// <param name="t">Type for which the Handler is constructed.</param> /// <param name="disposeCallback">Method to be called at the end of the usage. The method can be used to push back the object to the PersistenceHandlerPool.</param> public void Initialize(NDOMapping ndoMapping, Type t, Action <Type, IPersistenceHandler> disposeCallback) { this.ndoMapping = ndoMapping; this.classMapping = ndoMapping.FindClass(t); this.timeStampColumn = classMapping.TimeStampColumn; this.typeNameColumn = classMapping.TypeNameColumn; this.hasAutoincrementedColumn = false; foreach (OidColumn oidColumn in this.classMapping.Oid.OidColumns) { if (oidColumn.AutoIncremented) { this.hasAutoincrementedColumn = true; this.autoIncrementColumn = oidColumn; break; } } this.hasGuidOid = this.classMapping.HasGuidOid; this.tableName = classMapping.TableName; Connection connInfo = ndoMapping.FindConnection(classMapping); this.provider = ndoMapping.GetProvider(connInfo); this.qualifiedTableName = provider.GetQualifiedTableName(tableName); // The connection object will be initialized by the pm, to // enable connection string housekeeping. // CheckTransaction is the place, where this happens. this.conn = null; var columnListGenerator = CreateColumnListGenerator(classMapping); this.hollowFields = columnListGenerator.HollowFields; this.hollowFieldsWithAlias = columnListGenerator.HollowFieldsWithAlias; this.namedParamList = columnListGenerator.ParamList; this.fieldList = columnListGenerator.BaseList; this.selectFieldList = columnListGenerator.SelectList; this.selectFieldListWithAlias = columnListGenerator.SelectListWithAlias; this.guidlength = provider.GetDefaultLength(typeof(Guid)); if (this.guidlength == 0) { this.guidlength = provider.SupportsNativeGuidType ? 16 : 36; } this.disposeCallback = disposeCallback; this.selectCommand = provider.NewSqlCommand(conn); this.insertCommand = provider.NewSqlCommand(conn); this.updateCommand = provider.NewSqlCommand(conn); this.deleteCommand = provider.NewSqlCommand(conn); this.dataAdapter = provider.NewDataAdapter(selectCommand, updateCommand, insertCommand, deleteCommand); this.type = t; CollectFields(); // Alle Feldinformationen landen in persistentField // determine the relations, which have a foreign key // column in the table of the given class relationInfos = new RelationCollector(this.classMapping) .CollectRelations().ToList(); GenerateSelectCommand(); GenerateInsertCommand(); GenerateUpdateCommand(); GenerateDeleteCommand(); }
private void GenerateUpdateCommand() { string sql; NDO.Mapping.Field fieldMapping; sql = @"UPDATE {0} SET {1} WHERE ({2})"; //{0} = Tabellenname: Mitarbeiter //{1} = Zuweisungsliste: vorname = @vorname, nachname = @nachname //{2} = Where-Bedingung: id = @Original_id [ AND TimeStamp = @Original_timestamp ] AssignmentGenerator assignmentGenerator = new AssignmentGenerator(this.classMapping); string zuwListe = assignmentGenerator.Result; foreach (var e in this.persistentFields) { Type memberType; if (e.Value is FieldInfo) { memberType = ((FieldInfo)e.Value).FieldType; } else { memberType = ((PropertyInfo)e.Value).PropertyType; } fieldMapping = classMapping.FindField((string)e.Key); if (fieldMapping != null) { provider.AddParameter(updateCommand, provider.GetNamedParameter("U_" + fieldMapping.Column.Name), fieldMapping.ColumnDbType, ParameterLength(fieldMapping, memberType), fieldMapping.Column.Name); } } foreach (RelationFieldInfo ri in relationInfos) { Relation r = ri.Rel; if (r.Multiplicity == RelationMultiplicity.Element && r.MappingTable == null || r.Multiplicity == RelationMultiplicity.List && r.MappingTable == null && r.Parent.FullName != classMapping.FullName) { foreach (ForeignKeyColumn fkColumn in r.ForeignKeyColumns) { Type systemType = fkColumn.SystemType; provider.AddParameter(updateCommand, provider.GetNamedParameter("U_" + fkColumn.Name), provider.GetDbType(systemType), provider.GetDefaultLength(systemType), fkColumn.Name); } if (r.ForeignKeyTypeColumnName != null) { provider.AddParameter(updateCommand, provider.GetNamedParameter("U_" + r.ForeignKeyTypeColumnName), provider.GetDbType(typeof(int)), provider.GetDefaultLength(typeof(int)), r.ForeignKeyTypeColumnName); } } } string where = string.Empty; if (this.timeStampColumn != null) { if (provider.UseNamedParams) { where += provider.GetQuotedName(timeStampColumn) + " = " + provider.GetNamedParameter("U_Original_" + timeStampColumn) + " AND "; } else { where += provider.GetQuotedName(timeStampColumn) + " = ? AND "; } // The new timestamp value as parameter provider.AddParameter(updateCommand, provider.GetNamedParameter("U_" + timeStampColumn), provider.GetDbType(typeof(Guid)), guidlength, timeStampColumn); provider.AddParameter(updateCommand, provider.GetNamedParameter("U_Original_" + timeStampColumn), provider.GetDbType(typeof(Guid)), guidlength, System.Data.ParameterDirection.Input, false, ((System.Byte)(0)), ((System.Byte)(0)), timeStampColumn, System.Data.DataRowVersion.Original, null); } int oidCount = classMapping.Oid.OidColumns.Count; for (int i = 0; i < oidCount; i++) { OidColumn oidColumn = (OidColumn)classMapping.Oid.OidColumns[i]; // Oid as parameter provider.AddParameter(updateCommand, provider.GetNamedParameter("U_Original_" + oidColumn.Name), provider.GetDbType(oidColumn.SystemType), oidColumn.TypeLength, System.Data.ParameterDirection.Input, false, ((System.Byte)(0)), ((System.Byte)(0)), oidColumn.Name, System.Data.DataRowVersion.Original, null); if (provider.UseNamedParams) { where += provider.GetQuotedName(oidColumn.Name) + " = " + provider.GetNamedParameter("U_Original_" + oidColumn.Name); } else { where += provider.GetQuotedName(oidColumn.Name) + " = ?"; } Relation r = oidColumn.Relation; if (!this.hasGuidOid && r != null && r.ForeignKeyTypeColumnName != null) { where += " AND " + provider.GetQuotedName(r.ForeignKeyTypeColumnName) + " = " + provider.GetNamedParameter("U_Original_" + r.ForeignKeyTypeColumnName); provider.AddParameter(updateCommand, provider.GetNamedParameter("U_Original_" + r.ForeignKeyTypeColumnName), provider.GetDbType(typeof(int)), provider.GetDefaultLength(typeof(int)), System.Data.ParameterDirection.Input, false, ((System.Byte)(0)), ((System.Byte)(0)), r.ForeignKeyTypeColumnName, System.Data.DataRowVersion.Original, null); } if (i < oidCount - 1) { where += " AND "; } } //else //{ // // Dual oids are defined using two relations. // MultiKeyHandler dkh = new MultiKeyHandler(this.classMapping); // for (int i = 0; i < 2; i++) // { // where += provider.GetQuotedName(dkh.ForeignKeyColumnName(i)) + " = " + provider.GetNamedParameter("U_Original_" + dkh.ForeignKeyColumnName(i)); // provider.AddParameter(updateCommand, provider.GetNamedParameter("U_Original_" + dkh.ForeignKeyColumnName(i)), provider.GetDbType(dkh.GetClass(i).Oid.FieldType), dkh.GetClass(i).Oid.TypeLength, System.Data.ParameterDirection.Input, false, ((System.Byte)(0)), ((System.Byte)(0)), dkh.ForeignKeyColumnName(i), System.Data.DataRowVersion.Original, null); // if (dkh.ForeignKeyTypeColumnName(i) != null && dkh.GetClass(i).Oid.FieldType != typeof(Guid)) // { // where += " AND " + // provider.GetQuotedName(dkh.ForeignKeyTypeColumnName(i)) + " = " + provider.GetNamedParameter("U_Original_" + dkh.ForeignKeyTypeColumnName(i)); // provider.AddParameter(updateCommand, provider.GetNamedParameter("U_Original_" + dkh.ForeignKeyTypeColumnName(i)), provider.GetDbType(typeof(int)), provider.GetDefaultLength(typeof(int)), System.Data.ParameterDirection.Input, false, ((System.Byte)(0)), ((System.Byte)(0)), dkh.ForeignKeyTypeColumnName(i), System.Data.DataRowVersion.Original, null); // } // if (i == 0) // where += " AND "; // } //} sql = string.Format(sql, qualifiedTableName, zuwListe, where); //Console.WriteLine(sql); this.updateCommand.CommandText = sql; }