Пример #1
0
 private void ProcessEntityRelations(IEntity entity, ICodeWriterSql sql)
 {
     foreach (IRelation r in entity.Relations)
     {
         if (r.IsChild(entity) && r.Persistence.Persisted)
         {
             sql.WriteCommentLine(", FOREIGN KEY {0} REFERENCES {1}({2})",
                                  r.ForeignKey.Name,
                                  r.ForeignKey.ParentTable.Persistence.Name,
                                  r.ForeignKey.ChildTableColumns.ToPersistentNamesString(", "));
         }
     }
 }
Пример #2
0
        public CodeGenDb(SqliteGenie owner)
        {
            genie = owner;
            owner.Model.MetaObjects.SetUnprocessedAll();
            environment = owner.Model.Lamp.GenieLampUtils.GetEnvironmentHelper(TargetEnvironment.Sqlite);

            dbCreate   = genie.Config.Params.ValueByName("Database.Create", dbCreate);
            dbFileName = genie.Config.Params.ValueByName("Database.FileName",
                                                         String.Format("{0}.db", genie.Model.Lamp.ProjectName));
            creator = genie.Model.Lamp.CodeWritersFactory.CreateCodeWriterSql();
            cleaner = genie.Model.Lamp.CodeWritersFactory.CreateCodeWriterSql();

            outFileNameDDLCreate = Path.Combine(genie.Config.OutDir, "CRE_" + genie.Config.OutFileName);
            outFileNameDDLDelete = Path.Combine(genie.Config.OutDir, "DEL_" + genie.Config.OutFileName);
            outFileNameDb        = Path.Combine(genie.Config.OutDir, dbFileName);

            foreach (IPatternConfig pattern in owner.Model.Lamp.Config.Patterns)
            {
                if (pattern.OnPersistentLayer)
                {
                    throw new GlException("Pattern '{0}' cannot be implemented on persistent layer", pattern.Name);
                }
            }
        }
Пример #3
0
        private void ProcessEntity(IEntity entity)
        {
            creator.WriteCommentLine("Table of {0}", entity.FullName);

            ICodeWriterSql sql = Model.Lamp.CodeWritersFactory.CreateCodeWriterSql();

            sql.WriteLine("CREATE TABLE IF NOT EXISTS {0} (", entity.Persistence.FullName);
            sql.Indent++;
            int count = 1;

            IAttributes attributes;

            switch (Model.Lamp.Config.Layers.DomainConfig.MappingStrategy)
            {
            case GenieLamp.Core.Layers.MappingStrategy.TablePerSubclass:
                attributes = entity.GetAttributes(false);
                break;

            case GenieLamp.Core.Layers.MappingStrategy.TablePerClass:
                attributes = entity.GetAttributes(true);
                break;

            default:
                throw new GenieLamp.Core.Exceptions.GlException("Mapping strategy is not supported: '{0}'",
                                                                Model.Lamp.Config.Layers.DomainConfig.MappingStrategy);
            }
            foreach (IAttribute attribute in attributes)
            {
                if (attribute.Persistence.Persisted)
                {
                    sql.WriteColumnDefinition(attribute, environment);
                    if (attribute.IsPrimaryId && entity.Constraints.PrimaryId.HasGenerator)
                    {
                        sql.Write(" CONSTRAINT {0} PRIMARY KEY AUTOINCREMENT",
                                  entity.Constraints.PrimaryId.Persistence.Name);
                        entity.Constraints.PrimaryId.Processed = true;
                    }

                    foreach (IRelation r in entity.Relations)
                    {
                        if (r.IsChild(entity) &&
                            r.Persistence.Persisted &&
                            r.AttributesMatch.Count == 1 &&
                            r.ForeignKey.ChildTableColumns[0].Name == attribute.Name)
                        {
                            sql.Write(" REFERENCES {0}({1})",
                                      r.ForeignKey.ParentTable.Persistence.Name,
                                      attribute.Persistence.Name);
                        }
                    }

                    sql.WriteLine(count == attributes.Count ? "" : ",");
                }
                count++;
            }

            if (!entity.Constraints.PrimaryId.Processed)
            {
                sql.WriteLine(", CONSTRAINT {0} PRIMARY KEY ({1})",
                              entity.Constraints.PrimaryId.Persistence.Name,
                              entity.Constraints.PrimaryId.Attributes.ToPersistentNamesString(", "));
            }

            foreach (IUniqueId uc in entity.Constraints.UniqueIds)
            {
                sql.WriteLine(", CONSTRAINT {0} UNIQUE ({1})",
                              uc.Persistence.Name,
                              uc.Attributes.ToPersistentNamesString(", "));
            }

            ProcessEntityRelations(entity, sql);

            sql.Indent--;
            sql.WriteLine(")", entity.Persistence.FullName);
            creator.WriteFrom(sql);
            creator.WriteSeparator();

            cleaner.WriteDropTable(entity, environment);
            cleaner.WriteSeparator();

            genie.Config.NotifyAssistants("Create", entity, sql.ToString(true));
        }