public static void Update(FieldInfo fi, SoodaTransaction transaction) { if (!fi.IsDynamic) { throw new InvalidOperationException(fi.Name + " is not a dynamic field"); } ClassInfo ci = fi.ParentClass; SoodaDataSource ds = transaction.OpenDataSource(ci.GetDataSource()); ds.ExecuteNonQuery("update SoodaDynamicField set nullable={0} where class={1} and field={2}", fi.IsNullable ? 1 : 0, ci.Name, fi.Name); }
public static void Add(FieldInfo fi, SoodaTransaction transaction) { ClassInfo ci = fi.ParentClass; fi.ResolveReferences(ci.Schema); SqlDataSource ds = (SqlDataSource)transaction.OpenDataSource(ci.GetDataSource()); LockCookie lockCookie = LockWrite(transaction); try { TableInfo table = Prepare(fi); fi.Table = table; StringWriter sw = new StringWriter(); sw.Write("insert into SoodaDynamicField (class, field, type, nullable, fieldsize, precision) values ({0}, {1}, {2}, {3}, {4}, {5})"); ds.ExecuteNonQuery(sw.ToString(), ci.Name, fi.Name, fi.TypeName, fi.IsNullable ? 1 : 0, NegativeToNull(fi.Size), NegativeToNull(fi.Precision)); sw = new StringWriter(); ds.SqlBuilder.GenerateCreateTable(sw, table, null, ""); ds.ExecuteNonQuery(sw.ToString()); sw = new StringWriter(); ds.SqlBuilder.GeneratePrimaryKey(sw, table, null, ""); ds.ExecuteNonQuery(sw.ToString()); sw = new StringWriter(); ds.SqlBuilder.GenerateForeignKeys(sw, table, ""); string sql = sw.ToString(); if (sql.Length > 0) { ds.ExecuteNonQuery(sql); } ci.LocalTables.Add(table); Resolve(ci); } finally { transaction.Schema._rwLock.DowngradeFromWriterLock(ref lockCookie); } }
public static void Remove(FieldInfo fi, SoodaTransaction transaction) { if (!fi.IsDynamic) { throw new InvalidOperationException(fi.Name + " is not a dynamic field"); } ClassInfo ci = fi.ParentClass; SoodaDataSource ds = transaction.OpenDataSource(ci.GetDataSource()); LockCookie lockCookie = LockWrite(transaction); try { ds.ExecuteNonQuery("delete from SoodaDynamicField where class={0} and field={1}", ci.Name, fi.Name); ds.ExecuteNonQuery("drop table " + fi.Table.DBTableName); ci.LocalTables.Remove(fi.Table); Resolve(ci); } finally { transaction.Schema._rwLock.DowngradeFromWriterLock(ref lockCookie); } }
public void GenerateClassStub(CodeNamespace nspace, ClassInfo ci, bool miniStub) { if (!string.IsNullOrEmpty(ci.Schema.AssemblyName)) return; if (!miniStub) GenerateClassValues(nspace, ci, miniStub); CodeDomClassStubGenerator gen = new CodeDomClassStubGenerator(ci, Project); CDILContext context = new CDILContext(); context["ClassName"] = ci.Name; context["HasBaseClass"] = ci.InheritsFromClass != null; context["MiniStub"] = miniStub; context["HasKeyGen"] = gen.KeyGen != "none"; if (ci.ExtBaseClassName != null && !miniStub) { context["BaseClassName"] = ci.ExtBaseClassName; } else if (ci.InheritFrom != null && !miniStub) { context["BaseClassName"] = ci.InheritFrom; } else if (Project.BaseClassName != null && !miniStub) { context["BaseClassName"] = Project.BaseClassName; } else { context["BaseClassName"] = "SoodaObject"; } context["ArrayFieldValues"] = ci.GetDataSource().EnableDynamicFields; CodeTypeDeclaration ctd = CDILParser.ParseClass(CDILTemplate.Get("Stub.cdil"), context); if (ci.Description != null) { ctd.Comments.Add(new CodeCommentStatement("<summary>", true)); ctd.Comments.Add(new CodeCommentStatement(ci.Description, true)); ctd.Comments.Add(new CodeCommentStatement("</summary>", true)); } nspace.Types.Add(ctd); if (miniStub) return; CodeTypeDeclaration ctdLoader = GetLoaderClass(ci); if (!Project.LoaderClass) { foreach (CodeTypeMember m in ctdLoader.Members) { ctd.Members.Add(m); } } // class constructor if (gen.KeyGen != "none") { ctd.Members.Add(gen.Field_keyGenerator()); } gen.GenerateFields(ctd, ci); gen.GenerateProperties(ctd, ci); // literals if (ci.Constants != null && ci.GetPrimaryKeyFields().Length == 1) { foreach (ConstantInfo constInfo in ci.Constants) { object value; switch (ci.GetFirstPrimaryKeyField().DataType) { case FieldDataType.Integer: value = int.Parse(constInfo.Key); break; case FieldDataType.String: case FieldDataType.AnsiString: value = constInfo.Key; break; default: throw new NotSupportedException("Primary key type " + ci.GetFirstPrimaryKeyField().DataType + " is not supported"); } ctd.Members.Add(gen.Prop_LiteralValue(constInfo.Name, value)); } } foreach (FieldInfo fi in ci.LocalFields) { if (fi.IsPrimaryKey) continue; if (ci.Triggers || fi.ForceTrigger) { ctd.Members.Add(gen.Method_TriggerFieldUpdate(fi, "BeforeFieldUpdate")); ctd.Members.Add(gen.Method_TriggerFieldUpdate(fi, "AfterFieldUpdate")); } } }
public void GenerateClassValues(CodeNamespace nspace, ClassInfo ci, bool miniStub) { if (!string.IsNullOrEmpty(ci.Schema.AssemblyName) || ci.GetDataSource().EnableDynamicFields) return; CodeDomClassStubGenerator gen = new CodeDomClassStubGenerator(ci, Project); CodeTypeDeclaration ctd = new CodeTypeDeclaration(ci.Name + "_Values"); if (ci.InheritFrom != null) ctd.BaseTypes.Add(ci.InheritFrom + "_Values"); else ctd.BaseTypes.Add(typeof(SoodaObjectReflectionCachingFieldValues)); ctd.Attributes = MemberAttributes.Assembly; foreach (FieldInfo fi in ci.LocalFields) { CodeTypeReference fieldType; if (fi.References != null) { fieldType = gen.GetReturnType(PrimitiveRepresentation.SqlType, fi); } else if (fi.IsNullable) { fieldType = gen.GetReturnType(Project.NullableRepresentation, fi); } else { fieldType = gen.GetReturnType(Project.NotNullRepresentation, fi); } CodeMemberField field = new CodeMemberField(fieldType, fi.Name); field.Attributes = MemberAttributes.Public; ctd.Members.Add(field); } CodeConstructor constructor2 = new CodeConstructor(); constructor2.Attributes = MemberAttributes.Public; constructor2.Parameters.Add(new CodeParameterDeclarationExpression(typeof(SoodaObjectReflectionCachingFieldValues), "other")); constructor2.BaseConstructorArgs.Add(new CodeArgumentReferenceExpression("other")); ctd.Members.Add(constructor2); CodeConstructor constructor3 = new CodeConstructor(); constructor3.Attributes = MemberAttributes.Public; constructor3.Parameters.Add(new CodeParameterDeclarationExpression(typeof(string[]), "fieldNames")); constructor3.BaseConstructorArgs.Add(new CodeArgumentReferenceExpression("fieldNames")); ctd.Members.Add(constructor3); CodeMemberMethod cloneMethod = new CodeMemberMethod(); cloneMethod.Name = "Clone"; cloneMethod.ReturnType = new CodeTypeReference(typeof(SoodaObjectFieldValues)); cloneMethod.Attributes = MemberAttributes.Public | MemberAttributes.Override; cloneMethod.Statements.Add( new CodeMethodReturnStatement( new CodeObjectCreateExpression(ci.Name + "_Values", new CodeThisReferenceExpression()))); ctd.Members.Add(cloneMethod); nspace.Types.Add(ctd); }