From 02f042187fda939c7bcbd470facbeaad5c954e05 Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Sun, 29 Oct 2023 16:17:38 +0100 Subject: [PATCH] Add Quartz.NET Migrations (#4586) * Add migrations for SQLite, SQL Server, MySQL and PostgreSQL --- Elsa.sln | 28 + .../Elsa.WorkflowServer.Web.csproj | 1 + .../Elsa.WorkflowServer.Web/Program.cs | 18 +- .../Elsa.WorkflowServer.Web/appsettings.json | 4 +- .../Elsa.Features/Implementations/Module.cs | 8 +- src/common/Elsa.Features/Services/IModule.cs | 5 + .../DesignTimeDbContextFactoryBase.cs | 2 +- ...sa.Quartz.EntityFrameworkCore.MySql.csproj | 30 + .../FodyWeavers.xml | 3 + .../20231029144426_AddQuartz.Designer.cs | 541 +++++++++++++++ .../Migrations/20231029144426_AddQuartz.cs | 393 +++++++++++ .../MySqlQuartzDbContextModelSnapshot.cs | 538 +++++++++++++++ .../MySqlQuartzDbContext.cs | 32 + .../MySqlQuartzExtensions.cs | 46 ++ ...artz.EntityFrameworkCore.PostgreSql.csproj | 30 + .../FodyWeavers.xml | 3 + .../20231029150749_AddQuartz.Designer.cs | 544 +++++++++++++++ .../Migrations/20231029150749_AddQuartz.cs | 373 ++++++++++ .../PostgreSqlQuartzDbContextModelSnapshot.cs | 541 +++++++++++++++ .../SqlServerQuartzDbContext.cs | 32 + .../SqlServerQuartzExtensions.cs | 46 ++ ...uartz.EntityFrameworkCore.SqlServer.csproj | 30 + .../FodyWeavers.xml | 3 + .../20231029143236_AddQuartz.Designer.cs | 643 ++++++++++++++++++ .../Migrations/20231029143236_AddQuartz.cs | 373 ++++++++++ .../SqlServerQuartzDbContextModelSnapshot.cs | 640 +++++++++++++++++ .../SqlServerQuartzDbContext.cs | 32 + .../SqlServerQuartzExtensions.cs | 46 ++ ...a.Quartz.EntityFrameworkCore.Sqlite.csproj | 30 + .../FodyWeavers.xml | 3 + .../20231028172754_AddQuartz.Designer.cs | 539 +++++++++++++++ .../Migrations/20231028172754_AddQuartz.cs | 331 +++++++++ .../SqliteQuartzDbContextModelSnapshot.cs | 536 +++++++++++++++ .../SqliteQuartzDbContext.cs | 32 + .../SqliteQuartzExtensions.cs | 43 ++ .../Elsa.Quartz/Features/QuartzFeature.cs | 15 +- .../Features/WorkflowManagementFeature.cs | 2 - 37 files changed, 6499 insertions(+), 17 deletions(-) create mode 100644 src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/Elsa.Quartz.EntityFrameworkCore.MySql.csproj create mode 100644 src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/FodyWeavers.xml create mode 100644 src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/Migrations/20231029144426_AddQuartz.Designer.cs create mode 100644 src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/Migrations/20231029144426_AddQuartz.cs create mode 100644 src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/Migrations/MySqlQuartzDbContextModelSnapshot.cs create mode 100644 src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/MySqlQuartzDbContext.cs create mode 100644 src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/MySqlQuartzExtensions.cs create mode 100644 src/modules/Elsa.Quartz.EntityFrameworkCore.PostgreSql/Elsa.Quartz.EntityFrameworkCore.PostgreSql.csproj create mode 100644 src/modules/Elsa.Quartz.EntityFrameworkCore.PostgreSql/FodyWeavers.xml create mode 100644 src/modules/Elsa.Quartz.EntityFrameworkCore.PostgreSql/Migrations/20231029150749_AddQuartz.Designer.cs create mode 100644 src/modules/Elsa.Quartz.EntityFrameworkCore.PostgreSql/Migrations/20231029150749_AddQuartz.cs create mode 100644 src/modules/Elsa.Quartz.EntityFrameworkCore.PostgreSql/Migrations/PostgreSqlQuartzDbContextModelSnapshot.cs create mode 100644 src/modules/Elsa.Quartz.EntityFrameworkCore.PostgreSql/SqlServerQuartzDbContext.cs create mode 100644 src/modules/Elsa.Quartz.EntityFrameworkCore.PostgreSql/SqlServerQuartzExtensions.cs create mode 100644 src/modules/Elsa.Quartz.EntityFrameworkCore.SqlServer/Elsa.Quartz.EntityFrameworkCore.SqlServer.csproj create mode 100644 src/modules/Elsa.Quartz.EntityFrameworkCore.SqlServer/FodyWeavers.xml create mode 100644 src/modules/Elsa.Quartz.EntityFrameworkCore.SqlServer/Migrations/20231029143236_AddQuartz.Designer.cs create mode 100644 src/modules/Elsa.Quartz.EntityFrameworkCore.SqlServer/Migrations/20231029143236_AddQuartz.cs create mode 100644 src/modules/Elsa.Quartz.EntityFrameworkCore.SqlServer/Migrations/SqlServerQuartzDbContextModelSnapshot.cs create mode 100644 src/modules/Elsa.Quartz.EntityFrameworkCore.SqlServer/SqlServerQuartzDbContext.cs create mode 100644 src/modules/Elsa.Quartz.EntityFrameworkCore.SqlServer/SqlServerQuartzExtensions.cs create mode 100644 src/modules/Elsa.Quartz.EntityFrameworkCore.Sqlite/Elsa.Quartz.EntityFrameworkCore.Sqlite.csproj create mode 100644 src/modules/Elsa.Quartz.EntityFrameworkCore.Sqlite/FodyWeavers.xml create mode 100644 src/modules/Elsa.Quartz.EntityFrameworkCore.Sqlite/Migrations/20231028172754_AddQuartz.Designer.cs create mode 100644 src/modules/Elsa.Quartz.EntityFrameworkCore.Sqlite/Migrations/20231028172754_AddQuartz.cs create mode 100644 src/modules/Elsa.Quartz.EntityFrameworkCore.Sqlite/Migrations/SqliteQuartzDbContextModelSnapshot.cs create mode 100644 src/modules/Elsa.Quartz.EntityFrameworkCore.Sqlite/SqliteQuartzDbContext.cs create mode 100644 src/modules/Elsa.Quartz.EntityFrameworkCore.Sqlite/SqliteQuartzExtensions.cs diff --git a/Elsa.sln b/Elsa.sln index 4d05d3ff6..186bbe3e9 100644 --- a/Elsa.sln +++ b/Elsa.sln @@ -269,6 +269,14 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ElsaStudioWebAssembly", "sr EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.EntityFrameworkCore.Common", "src\modules\Elsa.EntityFrameworkCore.Common\Elsa.EntityFrameworkCore.Common.csproj", "{FBA14F8A-9F14-4364-ABDB-B8AE81A0D755}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Quartz.EntityFrameworkCore.Sqlite", "src\modules\Elsa.Quartz.EntityFrameworkCore.Sqlite\Elsa.Quartz.EntityFrameworkCore.Sqlite.csproj", "{A71557F2-D5FB-4772-9391-F7D18A3B6C44}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Quartz.EntityFrameworkCore.SqlServer", "src\modules\Elsa.Quartz.EntityFrameworkCore.SqlServer\Elsa.Quartz.EntityFrameworkCore.SqlServer.csproj", "{05F3B23E-CF28-467B-AD3C-595EA4ED6B96}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Quartz.EntityFrameworkCore.MySql", "src\modules\Elsa.Quartz.EntityFrameworkCore.MySql\Elsa.Quartz.EntityFrameworkCore.MySql.csproj", "{74ACD9D0-8B4C-42FA-A582-E93BF0075023}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Quartz.EntityFrameworkCore.PostgreSql", "src\modules\Elsa.Quartz.EntityFrameworkCore.PostgreSql\Elsa.Quartz.EntityFrameworkCore.PostgreSql.csproj", "{CCCCEF8C-7D96-4BEA-B9D0-E91EDF08E65D}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -671,6 +679,22 @@ Global {FBA14F8A-9F14-4364-ABDB-B8AE81A0D755}.Debug|Any CPU.Build.0 = Debug|Any CPU {FBA14F8A-9F14-4364-ABDB-B8AE81A0D755}.Release|Any CPU.ActiveCfg = Release|Any CPU {FBA14F8A-9F14-4364-ABDB-B8AE81A0D755}.Release|Any CPU.Build.0 = Release|Any CPU + {A71557F2-D5FB-4772-9391-F7D18A3B6C44}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A71557F2-D5FB-4772-9391-F7D18A3B6C44}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A71557F2-D5FB-4772-9391-F7D18A3B6C44}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A71557F2-D5FB-4772-9391-F7D18A3B6C44}.Release|Any CPU.Build.0 = Release|Any CPU + {05F3B23E-CF28-467B-AD3C-595EA4ED6B96}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {05F3B23E-CF28-467B-AD3C-595EA4ED6B96}.Debug|Any CPU.Build.0 = Debug|Any CPU + {05F3B23E-CF28-467B-AD3C-595EA4ED6B96}.Release|Any CPU.ActiveCfg = Release|Any CPU + {05F3B23E-CF28-467B-AD3C-595EA4ED6B96}.Release|Any CPU.Build.0 = Release|Any CPU + {74ACD9D0-8B4C-42FA-A582-E93BF0075023}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {74ACD9D0-8B4C-42FA-A582-E93BF0075023}.Debug|Any CPU.Build.0 = Debug|Any CPU + {74ACD9D0-8B4C-42FA-A582-E93BF0075023}.Release|Any CPU.ActiveCfg = Release|Any CPU + {74ACD9D0-8B4C-42FA-A582-E93BF0075023}.Release|Any CPU.Build.0 = Release|Any CPU + {CCCCEF8C-7D96-4BEA-B9D0-E91EDF08E65D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CCCCEF8C-7D96-4BEA-B9D0-E91EDF08E65D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CCCCEF8C-7D96-4BEA-B9D0-E91EDF08E65D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CCCCEF8C-7D96-4BEA-B9D0-E91EDF08E65D}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -794,6 +818,10 @@ Global {9504E3F3-F77F-437A-8644-D23D7F5FCF8B} = {1B8D5897-902E-4632-8698-E89CAF3DDF54} {E12A1BDF-5D65-493B-835D-AFBC480A5650} = {F06B9573-DF68-4606-866C-A7546A10A05A} {FBA14F8A-9F14-4364-ABDB-B8AE81A0D755} = {9B4F139F-7D26-435C-A561-89E65A67A8E5} + {A71557F2-D5FB-4772-9391-F7D18A3B6C44} = {AB797AF0-C12C-46DE-A157-7E25625C6200} + {05F3B23E-CF28-467B-AD3C-595EA4ED6B96} = {AB797AF0-C12C-46DE-A157-7E25625C6200} + {74ACD9D0-8B4C-42FA-A582-E93BF0075023} = {AB797AF0-C12C-46DE-A157-7E25625C6200} + {CCCCEF8C-7D96-4BEA-B9D0-E91EDF08E65D} = {AB797AF0-C12C-46DE-A157-7E25625C6200} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {D4B5CEAA-7D70-4FCB-A68E-B03FBE5E0E5E} diff --git a/src/bundles/Elsa.WorkflowServer.Web/Elsa.WorkflowServer.Web.csproj b/src/bundles/Elsa.WorkflowServer.Web/Elsa.WorkflowServer.Web.csproj index bfc68cac8..fd10cdc39 100644 --- a/src/bundles/Elsa.WorkflowServer.Web/Elsa.WorkflowServer.Web.csproj +++ b/src/bundles/Elsa.WorkflowServer.Web/Elsa.WorkflowServer.Web.csproj @@ -14,6 +14,7 @@ + diff --git a/src/bundles/Elsa.WorkflowServer.Web/Program.cs b/src/bundles/Elsa.WorkflowServer.Web/Program.cs index 7a969cdcf..dc2a02c63 100644 --- a/src/bundles/Elsa.WorkflowServer.Web/Program.cs +++ b/src/bundles/Elsa.WorkflowServer.Web/Program.cs @@ -27,6 +27,7 @@ const bool useSqlServer = false; const bool useDapper = false; const bool useProtoActor = false; const bool useHangfire = false; +const bool useQuartz = true; var builder = WebApplication.CreateBuilder(args); var services = builder.Services; @@ -135,13 +136,13 @@ services { if (useHangfire) scheduling.UseHangfireScheduler(); + + if (useQuartz) + scheduling.UseQuartzScheduler(); }) .UseWorkflowsApi(api => api.AddFastEndpointsAssembly()) .UseRealTimeWorkflows() - .UseJavaScript(js => - { - js.JintOptions = options => options.AllowClrAccess = true; - }) + .UseJavaScript(js => { js.JintOptions = options => options.AllowClrAccess = true; }) .UseLiquid(liquid => liquid.FluidOptions = options => options.Encoder = HtmlEncoder.Default) .UseHttp(http => { @@ -163,7 +164,14 @@ services }) .UseWorkflowContexts(); - // Initialize drop-ins. + if (useQuartz) + { + elsa.UseQuartz(quartz => + { + quartz.UseSqlite(sqliteConnectionString); + }); + } + elsa.InstallDropIns(options => options.DropInRootDirectory = Path.Combine(Directory.GetCurrentDirectory(), "App_Data", "DropIns")); elsa.AddSwagger(); diff --git a/src/bundles/Elsa.WorkflowServer.Web/appsettings.json b/src/bundles/Elsa.WorkflowServer.Web/appsettings.json index f4c10c172..294b390fb 100644 --- a/src/bundles/Elsa.WorkflowServer.Web/appsettings.json +++ b/src/bundles/Elsa.WorkflowServer.Web/appsettings.json @@ -4,7 +4,6 @@ "Default": "Warning", "Elsa.Mediator": "Warning", "Elsa.Workflows.Runtime.HostedServices": "Information", - "Elsa.Workflows.Core.Activities.Flowchart.Activities.Flowchart": "Debug", "MassTransit": "Warning", "Microsoft.Extensions.Http": "Warning", "Microsoft.Hosting.Lifetime": "Information", @@ -97,5 +96,8 @@ "SweepInterval": "00:00:10:00", "BatchSize": 1000 } + }, + "Quartz": { + } } \ No newline at end of file diff --git a/src/common/Elsa.Features/Implementations/Module.cs b/src/common/Elsa.Features/Implementations/Module.cs index 87404f0f0..7347fd783 100644 --- a/src/common/Elsa.Features/Implementations/Module.cs +++ b/src/common/Elsa.Features/Implementations/Module.cs @@ -63,7 +63,13 @@ public class Module : IModule /// public IModule ConfigureHostedService(int priority = 0) where T : class, IHostedService { - _hostedServiceDescriptors.Add(new HostedServiceDescriptor(priority, typeof(T))); + return ConfigureHostedService(typeof(T), priority); + } + + /// + public IModule ConfigureHostedService(Type hostedServiceType, int priority = 0) + { + _hostedServiceDescriptors.Add(new HostedServiceDescriptor(priority, hostedServiceType)); return this; } diff --git a/src/common/Elsa.Features/Services/IModule.cs b/src/common/Elsa.Features/Services/IModule.cs index 9712be22f..22af7e7c0 100644 --- a/src/common/Elsa.Features/Services/IModule.cs +++ b/src/common/Elsa.Features/Services/IModule.cs @@ -33,6 +33,11 @@ public interface IModule /// IModule ConfigureHostedService(int priority = 0) where T : class, IHostedService; + /// + /// Configures a using an optional priority to control in which order it will be registered with the service container. + /// + IModule ConfigureHostedService(Type hostedServiceType, int priority = 0); + /// /// Will apply all configured features, causing the collection to be populated. /// diff --git a/src/modules/Elsa.EntityFrameworkCore.Common/Abstractions/DesignTimeDbContextFactoryBase.cs b/src/modules/Elsa.EntityFrameworkCore.Common/Abstractions/DesignTimeDbContextFactoryBase.cs index f1d2b11cb..27956abf4 100644 --- a/src/modules/Elsa.EntityFrameworkCore.Common/Abstractions/DesignTimeDbContextFactoryBase.cs +++ b/src/modules/Elsa.EntityFrameworkCore.Common/Abstractions/DesignTimeDbContextFactoryBase.cs @@ -25,7 +25,7 @@ public abstract class DesignTimeDbContextFactoryBase : IDesignTimeDb ConfigureBuilder(builder, connectionString); - return (TDbContext)Activator.CreateInstance(typeof(TDbContext), builder.Options)!; + return (TDbContext)Activator.CreateInstance(typeof(TDbContext), builder.Options); } /// diff --git a/src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/Elsa.Quartz.EntityFrameworkCore.MySql.csproj b/src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/Elsa.Quartz.EntityFrameworkCore.MySql.csproj new file mode 100644 index 000000000..7c846f4fb --- /dev/null +++ b/src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/Elsa.Quartz.EntityFrameworkCore.MySql.csproj @@ -0,0 +1,30 @@ + + + + + + + net6.0;net7.0 + + Provides EF Core migrations for Quartz.NET. + + elsa module scheduling quartz ef core migrations + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + \ No newline at end of file diff --git a/src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/FodyWeavers.xml b/src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/FodyWeavers.xml new file mode 100644 index 000000000..00e1d9a1c --- /dev/null +++ b/src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/Migrations/20231029144426_AddQuartz.Designer.cs b/src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/Migrations/20231029144426_AddQuartz.Designer.cs new file mode 100644 index 000000000..84cb5b586 --- /dev/null +++ b/src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/Migrations/20231029144426_AddQuartz.Designer.cs @@ -0,0 +1,541 @@ +// +using System; +using Elsa.Quartz.EntityFrameworkCore.MySql; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace Elsa.Quartz.EntityFrameworkCore.MySql.Migrations +{ + [DbContext(typeof(MySqlQuartzDbContext))] + [Migration("20231029144426_AddQuartz")] + partial class AddQuartz + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.13") + .HasAnnotation("Relational:MaxIdentifierLength", 64); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzBlobTrigger", b => + { + b.Property("SchedulerName") + .HasColumnType("varchar(120)") + .HasColumnName("SCHED_NAME"); + + b.Property("TriggerName") + .HasColumnType("varchar(200)") + .HasColumnName("TRIGGER_NAME"); + + b.Property("TriggerGroup") + .HasColumnType("varchar(200)") + .HasColumnName("TRIGGER_GROUP"); + + b.Property("BlobData") + .HasColumnType("blob") + .HasColumnName("BLOB_DATA"); + + b.HasKey("SchedulerName", "TriggerName", "TriggerGroup"); + + b.ToTable("QRTZ_BLOB_TRIGGERS", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzCalendar", b => + { + b.Property("SchedulerName") + .HasColumnType("varchar(120)") + .HasColumnName("SCHED_NAME"); + + b.Property("CalendarName") + .HasColumnType("varchar(200)") + .HasColumnName("CALENDAR_NAME"); + + b.Property("Calendar") + .IsRequired() + .HasColumnType("blob") + .HasColumnName("CALENDAR"); + + b.HasKey("SchedulerName", "CalendarName"); + + b.ToTable("QRTZ_CALENDARS", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzCronTrigger", b => + { + b.Property("SchedulerName") + .HasColumnType("varchar(120)") + .HasColumnName("SCHED_NAME"); + + b.Property("TriggerName") + .HasColumnType("varchar(200)") + .HasColumnName("TRIGGER_NAME"); + + b.Property("TriggerGroup") + .HasColumnType("varchar(200)") + .HasColumnName("TRIGGER_GROUP"); + + b.Property("CronExpression") + .IsRequired() + .HasColumnType("varchar(120)") + .HasColumnName("CRON_EXPRESSION"); + + b.Property("TimeZoneId") + .HasColumnType("varchar(80)") + .HasColumnName("TIME_ZONE_ID"); + + b.HasKey("SchedulerName", "TriggerName", "TriggerGroup"); + + b.ToTable("QRTZ_CRON_TRIGGERS", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzFiredTrigger", b => + { + b.Property("SchedulerName") + .HasColumnType("varchar(120)") + .HasColumnName("SCHED_NAME"); + + b.Property("EntryId") + .HasColumnType("varchar(140)") + .HasColumnName("ENTRY_ID"); + + b.Property("FiredTime") + .HasColumnType("bigint(19)") + .HasColumnName("FIRED_TIME"); + + b.Property("InstanceName") + .IsRequired() + .HasColumnType("varchar(200)") + .HasColumnName("INSTANCE_NAME"); + + b.Property("IsNonConcurrent") + .HasColumnType("tinyint(1)") + .HasColumnName("IS_NONCONCURRENT"); + + b.Property("JobGroup") + .HasColumnType("varchar(200)") + .HasColumnName("JOB_GROUP"); + + b.Property("JobName") + .HasColumnType("varchar(200)") + .HasColumnName("JOB_NAME"); + + b.Property("Priority") + .HasColumnType("integer") + .HasColumnName("PRIORITY"); + + b.Property("RequestsRecovery") + .HasColumnType("tinyint(1)") + .HasColumnName("REQUESTS_RECOVERY"); + + b.Property("ScheduledTime") + .HasColumnType("bigint(19)") + .HasColumnName("SCHED_TIME"); + + b.Property("State") + .IsRequired() + .HasColumnType("varchar(16)") + .HasColumnName("STATE"); + + b.Property("TriggerGroup") + .IsRequired() + .HasColumnType("varchar(200)") + .HasColumnName("TRIGGER_GROUP"); + + b.Property("TriggerName") + .IsRequired() + .HasColumnType("varchar(200)") + .HasColumnName("TRIGGER_NAME"); + + b.HasKey("SchedulerName", "EntryId"); + + b.HasIndex("InstanceName") + .HasDatabaseName("IDX_QRTZ_FT_TRIG_INST_NAME"); + + b.HasIndex("JobGroup") + .HasDatabaseName("IDX_QRTZ_FT_JOB_GROUP"); + + b.HasIndex("JobName") + .HasDatabaseName("IDX_QRTZ_FT_JOB_NAME"); + + b.HasIndex("RequestsRecovery") + .HasDatabaseName("IDX_QRTZ_FT_JOB_REQ_RECOVERY"); + + b.HasIndex("TriggerGroup") + .HasDatabaseName("IDX_QRTZ_FT_TRIG_GROUP"); + + b.HasIndex("TriggerName") + .HasDatabaseName("IDX_QRTZ_FT_TRIG_NAME"); + + b.HasIndex("SchedulerName", "TriggerName", "TriggerGroup") + .HasDatabaseName("IDX_QRTZ_FT_TRIG_NM_GP"); + + b.ToTable("QRTZ_FIRED_TRIGGERS", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzJobDetail", b => + { + b.Property("SchedulerName") + .HasColumnType("varchar(120)") + .HasColumnName("SCHED_NAME"); + + b.Property("JobName") + .HasColumnType("varchar(200)") + .HasColumnName("JOB_NAME"); + + b.Property("JobGroup") + .HasColumnType("varchar(200)") + .HasColumnName("JOB_GROUP"); + + b.Property("Description") + .HasColumnType("varchar(250)") + .HasColumnName("DESCRIPTION"); + + b.Property("IsDurable") + .HasColumnType("tinyint(1)") + .HasColumnName("IS_DURABLE"); + + b.Property("IsNonConcurrent") + .HasColumnType("tinyint(1)") + .HasColumnName("IS_NONCONCURRENT"); + + b.Property("IsUpdateData") + .HasColumnType("tinyint(1)") + .HasColumnName("IS_UPDATE_DATA"); + + b.Property("JobClassName") + .IsRequired() + .HasColumnType("varchar(250)") + .HasColumnName("JOB_CLASS_NAME"); + + b.Property("JobData") + .HasColumnType("blob") + .HasColumnName("JOB_DATA"); + + b.Property("RequestsRecovery") + .HasColumnType("tinyint(1)") + .HasColumnName("REQUESTS_RECOVERY"); + + b.HasKey("SchedulerName", "JobName", "JobGroup"); + + b.HasIndex("RequestsRecovery") + .HasDatabaseName("IDX_QRTZ_J_REQ_RECOVERY"); + + b.ToTable("QRTZ_JOB_DETAILS", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzLock", b => + { + b.Property("SchedulerName") + .HasColumnType("varchar(120)") + .HasColumnName("SCHED_NAME"); + + b.Property("LockName") + .HasColumnType("varchar(40)") + .HasColumnName("LOCK_NAME"); + + b.HasKey("SchedulerName", "LockName"); + + b.ToTable("QRTZ_LOCKS", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzPausedTriggerGroup", b => + { + b.Property("SchedulerName") + .HasColumnType("varchar(120)") + .HasColumnName("SCHED_NAME"); + + b.Property("TriggerGroup") + .HasColumnType("varchar(200)") + .HasColumnName("TRIGGER_GROUP"); + + b.HasKey("SchedulerName", "TriggerGroup"); + + b.ToTable("QRTZ_PAUSED_TRIGGER_GRPS", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSchedulerState", b => + { + b.Property("SchedulerName") + .HasColumnType("varchar(120)") + .HasColumnName("SCHED_NAME"); + + b.Property("InstanceName") + .HasColumnType("varchar(200)") + .HasColumnName("INSTANCE_NAME"); + + b.Property("CheckInInterval") + .HasColumnType("bigint(19)") + .HasColumnName("CHECKIN_INTERVAL"); + + b.Property("LastCheckInTime") + .HasColumnType("bigint(19)") + .HasColumnName("LAST_CHECKIN_TIME"); + + b.HasKey("SchedulerName", "InstanceName"); + + b.ToTable("QRTZ_SCHEDULER_STATE", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSimplePropertyTrigger", b => + { + b.Property("SchedulerName") + .HasColumnType("varchar(120)") + .HasColumnName("SCHED_NAME"); + + b.Property("TriggerName") + .HasColumnType("varchar(200)") + .HasColumnName("TRIGGER_NAME"); + + b.Property("TriggerGroup") + .HasColumnType("varchar(200)") + .HasColumnName("TRIGGER_GROUP"); + + b.Property("BooleanProperty1") + .HasColumnType("tinyint(1)") + .HasColumnName("BOOL_PROP_1"); + + b.Property("BooleanProperty2") + .HasColumnType("tinyint(1)") + .HasColumnName("BOOL_PROP_2"); + + b.Property("DecimalProperty1") + .HasColumnType("NUMERIC(13,4)") + .HasColumnName("DEC_PROP_1"); + + b.Property("DecimalProperty2") + .HasColumnType("NUMERIC(13,4)") + .HasColumnName("DEC_PROP_2"); + + b.Property("IntegerProperty1") + .HasColumnType("int") + .HasColumnName("INT_PROP_1"); + + b.Property("IntegerProperty2") + .HasColumnType("int") + .HasColumnName("INT_PROP_2"); + + b.Property("LongProperty1") + .HasColumnType("BIGINT") + .HasColumnName("LONG_PROP_1"); + + b.Property("LongProperty2") + .HasColumnType("BIGINT") + .HasColumnName("LONG_PROP_2"); + + b.Property("StringProperty1") + .HasColumnType("varchar(512)") + .HasColumnName("STR_PROP_1"); + + b.Property("StringProperty2") + .HasColumnType("varchar(512)") + .HasColumnName("STR_PROP_2"); + + b.Property("StringProperty3") + .HasColumnType("varchar(512)") + .HasColumnName("STR_PROP_3"); + + b.Property("TimeZoneId") + .HasColumnType("varchar(80)") + .HasColumnName("TIME_ZONE_ID"); + + b.HasKey("SchedulerName", "TriggerName", "TriggerGroup"); + + b.ToTable("QRTZ_SIMPROP_TRIGGERS", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSimpleTrigger", b => + { + b.Property("SchedulerName") + .HasColumnType("varchar(120)") + .HasColumnName("SCHED_NAME"); + + b.Property("TriggerName") + .HasColumnType("varchar(200)") + .HasColumnName("TRIGGER_NAME"); + + b.Property("TriggerGroup") + .HasColumnType("varchar(200)") + .HasColumnName("TRIGGER_GROUP"); + + b.Property("RepeatCount") + .HasColumnType("bigint(7)") + .HasColumnName("REPEAT_COUNT"); + + b.Property("RepeatInterval") + .HasColumnType("bigint(12)") + .HasColumnName("REPEAT_INTERVAL"); + + b.Property("TimesTriggered") + .HasColumnType("bigint(10)") + .HasColumnName("TIMES_TRIGGERED"); + + b.HasKey("SchedulerName", "TriggerName", "TriggerGroup"); + + b.ToTable("QRTZ_SIMPLE_TRIGGERS", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", b => + { + b.Property("SchedulerName") + .HasColumnType("varchar(120)") + .HasColumnName("SCHED_NAME"); + + b.Property("TriggerName") + .HasColumnType("varchar(200)") + .HasColumnName("TRIGGER_NAME"); + + b.Property("TriggerGroup") + .HasColumnType("varchar(200)") + .HasColumnName("TRIGGER_GROUP"); + + b.Property("CalendarName") + .HasColumnType("varchar(200)") + .HasColumnName("CALENDAR_NAME"); + + b.Property("Description") + .HasColumnType("varchar(250)") + .HasColumnName("DESCRIPTION"); + + b.Property("EndTime") + .HasColumnType("bigint(19)") + .HasColumnName("END_TIME"); + + b.Property("JobData") + .HasColumnType("blob") + .HasColumnName("JOB_DATA"); + + b.Property("JobGroup") + .IsRequired() + .HasColumnType("varchar(200)") + .HasColumnName("JOB_GROUP"); + + b.Property("JobName") + .IsRequired() + .HasColumnType("varchar(200)") + .HasColumnName("JOB_NAME"); + + b.Property("MisfireInstruction") + .HasColumnType("smallint(2)") + .HasColumnName("MISFIRE_INSTR"); + + b.Property("NextFireTime") + .HasColumnType("bigint(19)") + .HasColumnName("NEXT_FIRE_TIME"); + + b.Property("PreviousFireTime") + .HasColumnType("bigint(19)") + .HasColumnName("PREV_FIRE_TIME"); + + b.Property("Priority") + .HasColumnType("integer") + .HasColumnName("PRIORITY"); + + b.Property("StartTime") + .HasColumnType("bigint(19)") + .HasColumnName("START_TIME"); + + b.Property("TriggerState") + .IsRequired() + .HasColumnType("varchar(16)") + .HasColumnName("TRIGGER_STATE"); + + b.Property("TriggerType") + .IsRequired() + .HasColumnType("varchar(8)") + .HasColumnName("TRIGGER_TYPE"); + + b.HasKey("SchedulerName", "TriggerName", "TriggerGroup"); + + b.HasIndex("NextFireTime") + .HasDatabaseName("IDX_QRTZ_T_NEXT_FIRE_TIME"); + + b.HasIndex("TriggerState") + .HasDatabaseName("IDX_QRTZ_T_STATE"); + + b.HasIndex("NextFireTime", "TriggerState") + .HasDatabaseName("IDX_QRTZ_T_NFT_ST"); + + b.HasIndex("SchedulerName", "JobName", "JobGroup"); + + b.ToTable("QRTZ_TRIGGERS", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzBlobTrigger", b => + { + b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", "Trigger") + .WithMany("BlobTriggers") + .HasForeignKey("SchedulerName", "TriggerName", "TriggerGroup") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Trigger"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzCronTrigger", b => + { + b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", "Trigger") + .WithMany("CronTriggers") + .HasForeignKey("SchedulerName", "TriggerName", "TriggerGroup") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Trigger"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSimplePropertyTrigger", b => + { + b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", "Trigger") + .WithMany("SimplePropertyTriggers") + .HasForeignKey("SchedulerName", "TriggerName", "TriggerGroup") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Trigger"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSimpleTrigger", b => + { + b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", "Trigger") + .WithMany("SimpleTriggers") + .HasForeignKey("SchedulerName", "TriggerName", "TriggerGroup") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Trigger"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", b => + { + b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzJobDetail", "JobDetail") + .WithMany("Triggers") + .HasForeignKey("SchedulerName", "JobName", "JobGroup") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("JobDetail"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzJobDetail", b => + { + b.Navigation("Triggers"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", b => + { + b.Navigation("BlobTriggers"); + + b.Navigation("CronTriggers"); + + b.Navigation("SimplePropertyTriggers"); + + b.Navigation("SimpleTriggers"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/Migrations/20231029144426_AddQuartz.cs b/src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/Migrations/20231029144426_AddQuartz.cs new file mode 100644 index 000000000..e43acbc9d --- /dev/null +++ b/src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/Migrations/20231029144426_AddQuartz.cs @@ -0,0 +1,393 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Elsa.Quartz.EntityFrameworkCore.MySql.Migrations +{ + /// + public partial class AddQuartz : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterDatabase() + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "QRTZ_CALENDARS", + columns: table => new + { + SCHED_NAME = table.Column(type: "varchar(120)", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + CALENDAR_NAME = table.Column(type: "varchar(200)", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + CALENDAR = table.Column(type: "blob", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_QRTZ_CALENDARS", x => new { x.SCHED_NAME, x.CALENDAR_NAME }); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "QRTZ_FIRED_TRIGGERS", + columns: table => new + { + SCHED_NAME = table.Column(type: "varchar(120)", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + ENTRY_ID = table.Column(type: "varchar(140)", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + TRIGGER_NAME = table.Column(type: "varchar(200)", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + TRIGGER_GROUP = table.Column(type: "varchar(200)", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + INSTANCE_NAME = table.Column(type: "varchar(200)", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + FIRED_TIME = table.Column(type: "bigint(19)", nullable: false), + SCHED_TIME = table.Column(type: "bigint(19)", nullable: false), + PRIORITY = table.Column(type: "integer", nullable: false), + STATE = table.Column(type: "varchar(16)", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + JOB_NAME = table.Column(type: "varchar(200)", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + JOB_GROUP = table.Column(type: "varchar(200)", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + IS_NONCONCURRENT = table.Column(type: "tinyint(1)", nullable: false), + REQUESTS_RECOVERY = table.Column(type: "tinyint(1)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_QRTZ_FIRED_TRIGGERS", x => new { x.SCHED_NAME, x.ENTRY_ID }); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "QRTZ_JOB_DETAILS", + columns: table => new + { + SCHED_NAME = table.Column(type: "varchar(120)", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + JOB_NAME = table.Column(type: "varchar(200)", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + JOB_GROUP = table.Column(type: "varchar(200)", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + DESCRIPTION = table.Column(type: "varchar(250)", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + JOB_CLASS_NAME = table.Column(type: "varchar(250)", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + IS_DURABLE = table.Column(type: "tinyint(1)", nullable: false), + IS_NONCONCURRENT = table.Column(type: "tinyint(1)", nullable: false), + IS_UPDATE_DATA = table.Column(type: "tinyint(1)", nullable: false), + REQUESTS_RECOVERY = table.Column(type: "tinyint(1)", nullable: false), + JOB_DATA = table.Column(type: "blob", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_QRTZ_JOB_DETAILS", x => new { x.SCHED_NAME, x.JOB_NAME, x.JOB_GROUP }); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "QRTZ_LOCKS", + columns: table => new + { + SCHED_NAME = table.Column(type: "varchar(120)", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + LOCK_NAME = table.Column(type: "varchar(40)", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4") + }, + constraints: table => + { + table.PrimaryKey("PK_QRTZ_LOCKS", x => new { x.SCHED_NAME, x.LOCK_NAME }); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "QRTZ_PAUSED_TRIGGER_GRPS", + columns: table => new + { + SCHED_NAME = table.Column(type: "varchar(120)", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + TRIGGER_GROUP = table.Column(type: "varchar(200)", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4") + }, + constraints: table => + { + table.PrimaryKey("PK_QRTZ_PAUSED_TRIGGER_GRPS", x => new { x.SCHED_NAME, x.TRIGGER_GROUP }); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "QRTZ_SCHEDULER_STATE", + columns: table => new + { + SCHED_NAME = table.Column(type: "varchar(120)", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + INSTANCE_NAME = table.Column(type: "varchar(200)", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + LAST_CHECKIN_TIME = table.Column(type: "bigint(19)", nullable: false), + CHECKIN_INTERVAL = table.Column(type: "bigint(19)", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_QRTZ_SCHEDULER_STATE", x => new { x.SCHED_NAME, x.INSTANCE_NAME }); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "QRTZ_TRIGGERS", + columns: table => new + { + SCHED_NAME = table.Column(type: "varchar(120)", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + TRIGGER_NAME = table.Column(type: "varchar(200)", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + TRIGGER_GROUP = table.Column(type: "varchar(200)", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + JOB_NAME = table.Column(type: "varchar(200)", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + JOB_GROUP = table.Column(type: "varchar(200)", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + DESCRIPTION = table.Column(type: "varchar(250)", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + NEXT_FIRE_TIME = table.Column(type: "bigint(19)", nullable: true), + PREV_FIRE_TIME = table.Column(type: "bigint(19)", nullable: true), + PRIORITY = table.Column(type: "integer", nullable: true), + TRIGGER_STATE = table.Column(type: "varchar(16)", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + TRIGGER_TYPE = table.Column(type: "varchar(8)", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + START_TIME = table.Column(type: "bigint(19)", nullable: false), + END_TIME = table.Column(type: "bigint(19)", nullable: true), + CALENDAR_NAME = table.Column(type: "varchar(200)", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + MISFIRE_INSTR = table.Column(type: "smallint(2)", nullable: true), + JOB_DATA = table.Column(type: "blob", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_QRTZ_TRIGGERS", x => new { x.SCHED_NAME, x.TRIGGER_NAME, x.TRIGGER_GROUP }); + table.ForeignKey( + name: "FK_QRTZ_TRIGGERS_QRTZ_JOB_DETAILS_SCHED_NAME_JOB_NAME_JOB_GROUP", + columns: x => new { x.SCHED_NAME, x.JOB_NAME, x.JOB_GROUP }, + principalTable: "QRTZ_JOB_DETAILS", + principalColumns: new[] { "SCHED_NAME", "JOB_NAME", "JOB_GROUP" }, + onDelete: ReferentialAction.Cascade); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "QRTZ_BLOB_TRIGGERS", + columns: table => new + { + SCHED_NAME = table.Column(type: "varchar(120)", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + TRIGGER_NAME = table.Column(type: "varchar(200)", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + TRIGGER_GROUP = table.Column(type: "varchar(200)", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + BLOB_DATA = table.Column(type: "blob", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_QRTZ_BLOB_TRIGGERS", x => new { x.SCHED_NAME, x.TRIGGER_NAME, x.TRIGGER_GROUP }); + table.ForeignKey( + name: "FK_QRTZ_BLOB_TRIGGERS_QRTZ_TRIGGERS_SCHED_NAME_TRIGGER_NAME_TRI~", + columns: x => new { x.SCHED_NAME, x.TRIGGER_NAME, x.TRIGGER_GROUP }, + principalTable: "QRTZ_TRIGGERS", + principalColumns: new[] { "SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP" }, + onDelete: ReferentialAction.Cascade); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "QRTZ_CRON_TRIGGERS", + columns: table => new + { + SCHED_NAME = table.Column(type: "varchar(120)", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + TRIGGER_NAME = table.Column(type: "varchar(200)", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + TRIGGER_GROUP = table.Column(type: "varchar(200)", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + CRON_EXPRESSION = table.Column(type: "varchar(120)", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + TIME_ZONE_ID = table.Column(type: "varchar(80)", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4") + }, + constraints: table => + { + table.PrimaryKey("PK_QRTZ_CRON_TRIGGERS", x => new { x.SCHED_NAME, x.TRIGGER_NAME, x.TRIGGER_GROUP }); + table.ForeignKey( + name: "FK_QRTZ_CRON_TRIGGERS_QRTZ_TRIGGERS_SCHED_NAME_TRIGGER_NAME_TRI~", + columns: x => new { x.SCHED_NAME, x.TRIGGER_NAME, x.TRIGGER_GROUP }, + principalTable: "QRTZ_TRIGGERS", + principalColumns: new[] { "SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP" }, + onDelete: ReferentialAction.Cascade); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "QRTZ_SIMPLE_TRIGGERS", + columns: table => new + { + SCHED_NAME = table.Column(type: "varchar(120)", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + TRIGGER_NAME = table.Column(type: "varchar(200)", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + TRIGGER_GROUP = table.Column(type: "varchar(200)", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + REPEAT_COUNT = table.Column(type: "bigint(7)", nullable: false), + REPEAT_INTERVAL = table.Column(type: "bigint(12)", nullable: false), + TIMES_TRIGGERED = table.Column(type: "bigint(10)", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_QRTZ_SIMPLE_TRIGGERS", x => new { x.SCHED_NAME, x.TRIGGER_NAME, x.TRIGGER_GROUP }); + table.ForeignKey( + name: "FK_QRTZ_SIMPLE_TRIGGERS_QRTZ_TRIGGERS_SCHED_NAME_TRIGGER_NAME_T~", + columns: x => new { x.SCHED_NAME, x.TRIGGER_NAME, x.TRIGGER_GROUP }, + principalTable: "QRTZ_TRIGGERS", + principalColumns: new[] { "SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP" }, + onDelete: ReferentialAction.Cascade); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "QRTZ_SIMPROP_TRIGGERS", + columns: table => new + { + SCHED_NAME = table.Column(type: "varchar(120)", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + TRIGGER_NAME = table.Column(type: "varchar(200)", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + TRIGGER_GROUP = table.Column(type: "varchar(200)", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + STR_PROP_1 = table.Column(type: "varchar(512)", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + STR_PROP_2 = table.Column(type: "varchar(512)", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + STR_PROP_3 = table.Column(type: "varchar(512)", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + INT_PROP_1 = table.Column(type: "int", nullable: true), + INT_PROP_2 = table.Column(type: "int", nullable: true), + LONG_PROP_1 = table.Column(type: "BIGINT", nullable: true), + LONG_PROP_2 = table.Column(type: "BIGINT", nullable: true), + DEC_PROP_1 = table.Column(type: "NUMERIC(13,4)", nullable: true), + DEC_PROP_2 = table.Column(type: "NUMERIC(13,4)", nullable: true), + BOOL_PROP_1 = table.Column(type: "tinyint(1)", nullable: true), + BOOL_PROP_2 = table.Column(type: "tinyint(1)", nullable: true), + TIME_ZONE_ID = table.Column(type: "varchar(80)", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4") + }, + constraints: table => + { + table.PrimaryKey("PK_QRTZ_SIMPROP_TRIGGERS", x => new { x.SCHED_NAME, x.TRIGGER_NAME, x.TRIGGER_GROUP }); + table.ForeignKey( + name: "FK_QRTZ_SIMPROP_TRIGGERS_QRTZ_TRIGGERS_SCHED_NAME_TRIGGER_NAME_~", + columns: x => new { x.SCHED_NAME, x.TRIGGER_NAME, x.TRIGGER_GROUP }, + principalTable: "QRTZ_TRIGGERS", + principalColumns: new[] { "SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP" }, + onDelete: ReferentialAction.Cascade); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateIndex( + name: "IDX_QRTZ_FT_JOB_GROUP", + table: "QRTZ_FIRED_TRIGGERS", + column: "JOB_GROUP"); + + migrationBuilder.CreateIndex( + name: "IDX_QRTZ_FT_JOB_NAME", + table: "QRTZ_FIRED_TRIGGERS", + column: "JOB_NAME"); + + migrationBuilder.CreateIndex( + name: "IDX_QRTZ_FT_JOB_REQ_RECOVERY", + table: "QRTZ_FIRED_TRIGGERS", + column: "REQUESTS_RECOVERY"); + + migrationBuilder.CreateIndex( + name: "IDX_QRTZ_FT_TRIG_GROUP", + table: "QRTZ_FIRED_TRIGGERS", + column: "TRIGGER_GROUP"); + + migrationBuilder.CreateIndex( + name: "IDX_QRTZ_FT_TRIG_INST_NAME", + table: "QRTZ_FIRED_TRIGGERS", + column: "INSTANCE_NAME"); + + migrationBuilder.CreateIndex( + name: "IDX_QRTZ_FT_TRIG_NAME", + table: "QRTZ_FIRED_TRIGGERS", + column: "TRIGGER_NAME"); + + migrationBuilder.CreateIndex( + name: "IDX_QRTZ_FT_TRIG_NM_GP", + table: "QRTZ_FIRED_TRIGGERS", + columns: new[] { "SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP" }); + + migrationBuilder.CreateIndex( + name: "IDX_QRTZ_J_REQ_RECOVERY", + table: "QRTZ_JOB_DETAILS", + column: "REQUESTS_RECOVERY"); + + migrationBuilder.CreateIndex( + name: "IDX_QRTZ_T_NEXT_FIRE_TIME", + table: "QRTZ_TRIGGERS", + column: "NEXT_FIRE_TIME"); + + migrationBuilder.CreateIndex( + name: "IDX_QRTZ_T_NFT_ST", + table: "QRTZ_TRIGGERS", + columns: new[] { "NEXT_FIRE_TIME", "TRIGGER_STATE" }); + + migrationBuilder.CreateIndex( + name: "IDX_QRTZ_T_STATE", + table: "QRTZ_TRIGGERS", + column: "TRIGGER_STATE"); + + migrationBuilder.CreateIndex( + name: "IX_QRTZ_TRIGGERS_SCHED_NAME_JOB_NAME_JOB_GROUP", + table: "QRTZ_TRIGGERS", + columns: new[] { "SCHED_NAME", "JOB_NAME", "JOB_GROUP" }); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "QRTZ_BLOB_TRIGGERS"); + + migrationBuilder.DropTable( + name: "QRTZ_CALENDARS"); + + migrationBuilder.DropTable( + name: "QRTZ_CRON_TRIGGERS"); + + migrationBuilder.DropTable( + name: "QRTZ_FIRED_TRIGGERS"); + + migrationBuilder.DropTable( + name: "QRTZ_LOCKS"); + + migrationBuilder.DropTable( + name: "QRTZ_PAUSED_TRIGGER_GRPS"); + + migrationBuilder.DropTable( + name: "QRTZ_SCHEDULER_STATE"); + + migrationBuilder.DropTable( + name: "QRTZ_SIMPLE_TRIGGERS"); + + migrationBuilder.DropTable( + name: "QRTZ_SIMPROP_TRIGGERS"); + + migrationBuilder.DropTable( + name: "QRTZ_TRIGGERS"); + + migrationBuilder.DropTable( + name: "QRTZ_JOB_DETAILS"); + } + } +} diff --git a/src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/Migrations/MySqlQuartzDbContextModelSnapshot.cs b/src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/Migrations/MySqlQuartzDbContextModelSnapshot.cs new file mode 100644 index 000000000..aab19723b --- /dev/null +++ b/src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/Migrations/MySqlQuartzDbContextModelSnapshot.cs @@ -0,0 +1,538 @@ +// +using System; +using Elsa.Quartz.EntityFrameworkCore.MySql; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace Elsa.Quartz.EntityFrameworkCore.MySql.Migrations +{ + [DbContext(typeof(MySqlQuartzDbContext))] + partial class MySqlQuartzDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.13") + .HasAnnotation("Relational:MaxIdentifierLength", 64); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzBlobTrigger", b => + { + b.Property("SchedulerName") + .HasColumnType("varchar(120)") + .HasColumnName("SCHED_NAME"); + + b.Property("TriggerName") + .HasColumnType("varchar(200)") + .HasColumnName("TRIGGER_NAME"); + + b.Property("TriggerGroup") + .HasColumnType("varchar(200)") + .HasColumnName("TRIGGER_GROUP"); + + b.Property("BlobData") + .HasColumnType("blob") + .HasColumnName("BLOB_DATA"); + + b.HasKey("SchedulerName", "TriggerName", "TriggerGroup"); + + b.ToTable("QRTZ_BLOB_TRIGGERS", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzCalendar", b => + { + b.Property("SchedulerName") + .HasColumnType("varchar(120)") + .HasColumnName("SCHED_NAME"); + + b.Property("CalendarName") + .HasColumnType("varchar(200)") + .HasColumnName("CALENDAR_NAME"); + + b.Property("Calendar") + .IsRequired() + .HasColumnType("blob") + .HasColumnName("CALENDAR"); + + b.HasKey("SchedulerName", "CalendarName"); + + b.ToTable("QRTZ_CALENDARS", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzCronTrigger", b => + { + b.Property("SchedulerName") + .HasColumnType("varchar(120)") + .HasColumnName("SCHED_NAME"); + + b.Property("TriggerName") + .HasColumnType("varchar(200)") + .HasColumnName("TRIGGER_NAME"); + + b.Property("TriggerGroup") + .HasColumnType("varchar(200)") + .HasColumnName("TRIGGER_GROUP"); + + b.Property("CronExpression") + .IsRequired() + .HasColumnType("varchar(120)") + .HasColumnName("CRON_EXPRESSION"); + + b.Property("TimeZoneId") + .HasColumnType("varchar(80)") + .HasColumnName("TIME_ZONE_ID"); + + b.HasKey("SchedulerName", "TriggerName", "TriggerGroup"); + + b.ToTable("QRTZ_CRON_TRIGGERS", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzFiredTrigger", b => + { + b.Property("SchedulerName") + .HasColumnType("varchar(120)") + .HasColumnName("SCHED_NAME"); + + b.Property("EntryId") + .HasColumnType("varchar(140)") + .HasColumnName("ENTRY_ID"); + + b.Property("FiredTime") + .HasColumnType("bigint(19)") + .HasColumnName("FIRED_TIME"); + + b.Property("InstanceName") + .IsRequired() + .HasColumnType("varchar(200)") + .HasColumnName("INSTANCE_NAME"); + + b.Property("IsNonConcurrent") + .HasColumnType("tinyint(1)") + .HasColumnName("IS_NONCONCURRENT"); + + b.Property("JobGroup") + .HasColumnType("varchar(200)") + .HasColumnName("JOB_GROUP"); + + b.Property("JobName") + .HasColumnType("varchar(200)") + .HasColumnName("JOB_NAME"); + + b.Property("Priority") + .HasColumnType("integer") + .HasColumnName("PRIORITY"); + + b.Property("RequestsRecovery") + .HasColumnType("tinyint(1)") + .HasColumnName("REQUESTS_RECOVERY"); + + b.Property("ScheduledTime") + .HasColumnType("bigint(19)") + .HasColumnName("SCHED_TIME"); + + b.Property("State") + .IsRequired() + .HasColumnType("varchar(16)") + .HasColumnName("STATE"); + + b.Property("TriggerGroup") + .IsRequired() + .HasColumnType("varchar(200)") + .HasColumnName("TRIGGER_GROUP"); + + b.Property("TriggerName") + .IsRequired() + .HasColumnType("varchar(200)") + .HasColumnName("TRIGGER_NAME"); + + b.HasKey("SchedulerName", "EntryId"); + + b.HasIndex("InstanceName") + .HasDatabaseName("IDX_QRTZ_FT_TRIG_INST_NAME"); + + b.HasIndex("JobGroup") + .HasDatabaseName("IDX_QRTZ_FT_JOB_GROUP"); + + b.HasIndex("JobName") + .HasDatabaseName("IDX_QRTZ_FT_JOB_NAME"); + + b.HasIndex("RequestsRecovery") + .HasDatabaseName("IDX_QRTZ_FT_JOB_REQ_RECOVERY"); + + b.HasIndex("TriggerGroup") + .HasDatabaseName("IDX_QRTZ_FT_TRIG_GROUP"); + + b.HasIndex("TriggerName") + .HasDatabaseName("IDX_QRTZ_FT_TRIG_NAME"); + + b.HasIndex("SchedulerName", "TriggerName", "TriggerGroup") + .HasDatabaseName("IDX_QRTZ_FT_TRIG_NM_GP"); + + b.ToTable("QRTZ_FIRED_TRIGGERS", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzJobDetail", b => + { + b.Property("SchedulerName") + .HasColumnType("varchar(120)") + .HasColumnName("SCHED_NAME"); + + b.Property("JobName") + .HasColumnType("varchar(200)") + .HasColumnName("JOB_NAME"); + + b.Property("JobGroup") + .HasColumnType("varchar(200)") + .HasColumnName("JOB_GROUP"); + + b.Property("Description") + .HasColumnType("varchar(250)") + .HasColumnName("DESCRIPTION"); + + b.Property("IsDurable") + .HasColumnType("tinyint(1)") + .HasColumnName("IS_DURABLE"); + + b.Property("IsNonConcurrent") + .HasColumnType("tinyint(1)") + .HasColumnName("IS_NONCONCURRENT"); + + b.Property("IsUpdateData") + .HasColumnType("tinyint(1)") + .HasColumnName("IS_UPDATE_DATA"); + + b.Property("JobClassName") + .IsRequired() + .HasColumnType("varchar(250)") + .HasColumnName("JOB_CLASS_NAME"); + + b.Property("JobData") + .HasColumnType("blob") + .HasColumnName("JOB_DATA"); + + b.Property("RequestsRecovery") + .HasColumnType("tinyint(1)") + .HasColumnName("REQUESTS_RECOVERY"); + + b.HasKey("SchedulerName", "JobName", "JobGroup"); + + b.HasIndex("RequestsRecovery") + .HasDatabaseName("IDX_QRTZ_J_REQ_RECOVERY"); + + b.ToTable("QRTZ_JOB_DETAILS", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzLock", b => + { + b.Property("SchedulerName") + .HasColumnType("varchar(120)") + .HasColumnName("SCHED_NAME"); + + b.Property("LockName") + .HasColumnType("varchar(40)") + .HasColumnName("LOCK_NAME"); + + b.HasKey("SchedulerName", "LockName"); + + b.ToTable("QRTZ_LOCKS", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzPausedTriggerGroup", b => + { + b.Property("SchedulerName") + .HasColumnType("varchar(120)") + .HasColumnName("SCHED_NAME"); + + b.Property("TriggerGroup") + .HasColumnType("varchar(200)") + .HasColumnName("TRIGGER_GROUP"); + + b.HasKey("SchedulerName", "TriggerGroup"); + + b.ToTable("QRTZ_PAUSED_TRIGGER_GRPS", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSchedulerState", b => + { + b.Property("SchedulerName") + .HasColumnType("varchar(120)") + .HasColumnName("SCHED_NAME"); + + b.Property("InstanceName") + .HasColumnType("varchar(200)") + .HasColumnName("INSTANCE_NAME"); + + b.Property("CheckInInterval") + .HasColumnType("bigint(19)") + .HasColumnName("CHECKIN_INTERVAL"); + + b.Property("LastCheckInTime") + .HasColumnType("bigint(19)") + .HasColumnName("LAST_CHECKIN_TIME"); + + b.HasKey("SchedulerName", "InstanceName"); + + b.ToTable("QRTZ_SCHEDULER_STATE", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSimplePropertyTrigger", b => + { + b.Property("SchedulerName") + .HasColumnType("varchar(120)") + .HasColumnName("SCHED_NAME"); + + b.Property("TriggerName") + .HasColumnType("varchar(200)") + .HasColumnName("TRIGGER_NAME"); + + b.Property("TriggerGroup") + .HasColumnType("varchar(200)") + .HasColumnName("TRIGGER_GROUP"); + + b.Property("BooleanProperty1") + .HasColumnType("tinyint(1)") + .HasColumnName("BOOL_PROP_1"); + + b.Property("BooleanProperty2") + .HasColumnType("tinyint(1)") + .HasColumnName("BOOL_PROP_2"); + + b.Property("DecimalProperty1") + .HasColumnType("NUMERIC(13,4)") + .HasColumnName("DEC_PROP_1"); + + b.Property("DecimalProperty2") + .HasColumnType("NUMERIC(13,4)") + .HasColumnName("DEC_PROP_2"); + + b.Property("IntegerProperty1") + .HasColumnType("int") + .HasColumnName("INT_PROP_1"); + + b.Property("IntegerProperty2") + .HasColumnType("int") + .HasColumnName("INT_PROP_2"); + + b.Property("LongProperty1") + .HasColumnType("BIGINT") + .HasColumnName("LONG_PROP_1"); + + b.Property("LongProperty2") + .HasColumnType("BIGINT") + .HasColumnName("LONG_PROP_2"); + + b.Property("StringProperty1") + .HasColumnType("varchar(512)") + .HasColumnName("STR_PROP_1"); + + b.Property("StringProperty2") + .HasColumnType("varchar(512)") + .HasColumnName("STR_PROP_2"); + + b.Property("StringProperty3") + .HasColumnType("varchar(512)") + .HasColumnName("STR_PROP_3"); + + b.Property("TimeZoneId") + .HasColumnType("varchar(80)") + .HasColumnName("TIME_ZONE_ID"); + + b.HasKey("SchedulerName", "TriggerName", "TriggerGroup"); + + b.ToTable("QRTZ_SIMPROP_TRIGGERS", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSimpleTrigger", b => + { + b.Property("SchedulerName") + .HasColumnType("varchar(120)") + .HasColumnName("SCHED_NAME"); + + b.Property("TriggerName") + .HasColumnType("varchar(200)") + .HasColumnName("TRIGGER_NAME"); + + b.Property("TriggerGroup") + .HasColumnType("varchar(200)") + .HasColumnName("TRIGGER_GROUP"); + + b.Property("RepeatCount") + .HasColumnType("bigint(7)") + .HasColumnName("REPEAT_COUNT"); + + b.Property("RepeatInterval") + .HasColumnType("bigint(12)") + .HasColumnName("REPEAT_INTERVAL"); + + b.Property("TimesTriggered") + .HasColumnType("bigint(10)") + .HasColumnName("TIMES_TRIGGERED"); + + b.HasKey("SchedulerName", "TriggerName", "TriggerGroup"); + + b.ToTable("QRTZ_SIMPLE_TRIGGERS", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", b => + { + b.Property("SchedulerName") + .HasColumnType("varchar(120)") + .HasColumnName("SCHED_NAME"); + + b.Property("TriggerName") + .HasColumnType("varchar(200)") + .HasColumnName("TRIGGER_NAME"); + + b.Property("TriggerGroup") + .HasColumnType("varchar(200)") + .HasColumnName("TRIGGER_GROUP"); + + b.Property("CalendarName") + .HasColumnType("varchar(200)") + .HasColumnName("CALENDAR_NAME"); + + b.Property("Description") + .HasColumnType("varchar(250)") + .HasColumnName("DESCRIPTION"); + + b.Property("EndTime") + .HasColumnType("bigint(19)") + .HasColumnName("END_TIME"); + + b.Property("JobData") + .HasColumnType("blob") + .HasColumnName("JOB_DATA"); + + b.Property("JobGroup") + .IsRequired() + .HasColumnType("varchar(200)") + .HasColumnName("JOB_GROUP"); + + b.Property("JobName") + .IsRequired() + .HasColumnType("varchar(200)") + .HasColumnName("JOB_NAME"); + + b.Property("MisfireInstruction") + .HasColumnType("smallint(2)") + .HasColumnName("MISFIRE_INSTR"); + + b.Property("NextFireTime") + .HasColumnType("bigint(19)") + .HasColumnName("NEXT_FIRE_TIME"); + + b.Property("PreviousFireTime") + .HasColumnType("bigint(19)") + .HasColumnName("PREV_FIRE_TIME"); + + b.Property("Priority") + .HasColumnType("integer") + .HasColumnName("PRIORITY"); + + b.Property("StartTime") + .HasColumnType("bigint(19)") + .HasColumnName("START_TIME"); + + b.Property("TriggerState") + .IsRequired() + .HasColumnType("varchar(16)") + .HasColumnName("TRIGGER_STATE"); + + b.Property("TriggerType") + .IsRequired() + .HasColumnType("varchar(8)") + .HasColumnName("TRIGGER_TYPE"); + + b.HasKey("SchedulerName", "TriggerName", "TriggerGroup"); + + b.HasIndex("NextFireTime") + .HasDatabaseName("IDX_QRTZ_T_NEXT_FIRE_TIME"); + + b.HasIndex("TriggerState") + .HasDatabaseName("IDX_QRTZ_T_STATE"); + + b.HasIndex("NextFireTime", "TriggerState") + .HasDatabaseName("IDX_QRTZ_T_NFT_ST"); + + b.HasIndex("SchedulerName", "JobName", "JobGroup"); + + b.ToTable("QRTZ_TRIGGERS", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzBlobTrigger", b => + { + b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", "Trigger") + .WithMany("BlobTriggers") + .HasForeignKey("SchedulerName", "TriggerName", "TriggerGroup") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Trigger"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzCronTrigger", b => + { + b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", "Trigger") + .WithMany("CronTriggers") + .HasForeignKey("SchedulerName", "TriggerName", "TriggerGroup") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Trigger"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSimplePropertyTrigger", b => + { + b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", "Trigger") + .WithMany("SimplePropertyTriggers") + .HasForeignKey("SchedulerName", "TriggerName", "TriggerGroup") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Trigger"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSimpleTrigger", b => + { + b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", "Trigger") + .WithMany("SimpleTriggers") + .HasForeignKey("SchedulerName", "TriggerName", "TriggerGroup") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Trigger"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", b => + { + b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzJobDetail", "JobDetail") + .WithMany("Triggers") + .HasForeignKey("SchedulerName", "JobName", "JobGroup") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("JobDetail"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzJobDetail", b => + { + b.Navigation("Triggers"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", b => + { + b.Navigation("BlobTriggers"); + + b.Navigation("CronTriggers"); + + b.Navigation("SimplePropertyTriggers"); + + b.Navigation("SimpleTriggers"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/MySqlQuartzDbContext.cs b/src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/MySqlQuartzDbContext.cs new file mode 100644 index 000000000..97f9b360d --- /dev/null +++ b/src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/MySqlQuartzDbContext.cs @@ -0,0 +1,32 @@ +using AppAny.Quartz.EntityFrameworkCore.Migrations; +using AppAny.Quartz.EntityFrameworkCore.Migrations.MySql; +using Elsa.EntityFrameworkCore.Common.Abstractions; +using JetBrains.Annotations; +using Microsoft.EntityFrameworkCore; + +namespace Elsa.Quartz.EntityFrameworkCore.MySql; + +/// +/// Quartz DbContext for MySQL. +/// +[UsedImplicitly] +public class MySqlQuartzDbContext : DbContext +{ + /// + public MySqlQuartzDbContext(DbContextOptions options) : base(options) + { + } + + /// + protected override void OnModelCreating(ModelBuilder modelBuilder) => modelBuilder.AddQuartz(model => model.UseMySql()); +} + +/// +/// Design-time factory for Quartz DbContext for MySQL. +/// +[UsedImplicitly] +public class MySqlQuartzDbContextFactory : DesignTimeDbContextFactoryBase +{ + /// + protected override void ConfigureBuilder(DbContextOptionsBuilder builder, string connectionString) => builder.UseMySql(connectionString, ServerVersion.AutoDetect(connectionString)); +} \ No newline at end of file diff --git a/src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/MySqlQuartzExtensions.cs b/src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/MySqlQuartzExtensions.cs new file mode 100644 index 000000000..5cc56b460 --- /dev/null +++ b/src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/MySqlQuartzExtensions.cs @@ -0,0 +1,46 @@ +using Elsa.EntityFrameworkCore.Common; +using Elsa.Quartz.EntityFrameworkCore.MySql; +using Elsa.Quartz.Features; +using JetBrains.Annotations; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using Quartz; + +// ReSharper disable once CheckNamespace +namespace Elsa.EntityFrameworkCore.Extensions; + +/// +/// Provides extensions to configure EF Core to use SQL Server. +/// +[PublicAPI] +public static class MySqlQuartzExtensions +{ + /// + /// Configures the to use the MySQL job store. + /// + public static QuartzFeature UseMySql(this QuartzFeature feature, string connectionString = Constants.DefaultConnectionString, bool useClustering = true) + { + feature.Services.AddDbContextFactory(options => + { + // Use MySQL migrations. + options.UseMySql(connectionString, ServerVersion.AutoDetect(connectionString), sqlServerDbContextOptionsBuilder => { sqlServerDbContextOptionsBuilder.MigrationsAssembly(typeof(MySqlQuartzDbContext).Assembly.GetName().Name); }); + }); + + feature.ConfigureQuartz += quartz => + { + quartz.UsePersistentStore(store => + { + store.UseNewtonsoftJsonSerializer(); + store.UseMySql(connectionString); + + if (useClustering) + store.UseClustering(); + }); + }; + + // Configure the Quartz hosted service to run migrations. + feature.Module.ConfigureHostedService>(-100); + + return feature; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Quartz.EntityFrameworkCore.PostgreSql/Elsa.Quartz.EntityFrameworkCore.PostgreSql.csproj b/src/modules/Elsa.Quartz.EntityFrameworkCore.PostgreSql/Elsa.Quartz.EntityFrameworkCore.PostgreSql.csproj new file mode 100644 index 000000000..3214eb1f9 --- /dev/null +++ b/src/modules/Elsa.Quartz.EntityFrameworkCore.PostgreSql/Elsa.Quartz.EntityFrameworkCore.PostgreSql.csproj @@ -0,0 +1,30 @@ + + + + + + + net6.0;net7.0 + + Provides EF Core migrations for Quartz.NET. + + elsa module scheduling quartz ef core migrations + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + \ No newline at end of file diff --git a/src/modules/Elsa.Quartz.EntityFrameworkCore.PostgreSql/FodyWeavers.xml b/src/modules/Elsa.Quartz.EntityFrameworkCore.PostgreSql/FodyWeavers.xml new file mode 100644 index 000000000..00e1d9a1c --- /dev/null +++ b/src/modules/Elsa.Quartz.EntityFrameworkCore.PostgreSql/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/modules/Elsa.Quartz.EntityFrameworkCore.PostgreSql/Migrations/20231029150749_AddQuartz.Designer.cs b/src/modules/Elsa.Quartz.EntityFrameworkCore.PostgreSql/Migrations/20231029150749_AddQuartz.Designer.cs new file mode 100644 index 000000000..65693f773 --- /dev/null +++ b/src/modules/Elsa.Quartz.EntityFrameworkCore.PostgreSql/Migrations/20231029150749_AddQuartz.Designer.cs @@ -0,0 +1,544 @@ +// +using System; +using Elsa.Quartz.EntityFrameworkCore.PostgreSql; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Elsa.Quartz.EntityFrameworkCore.PostgreSql.Migrations +{ + [DbContext(typeof(PostgreSqlQuartzDbContext))] + [Migration("20231029150749_AddQuartz")] + partial class AddQuartz + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.13") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzBlobTrigger", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("sched_name"); + + b.Property("TriggerName") + .HasColumnType("text") + .HasColumnName("trigger_name"); + + b.Property("TriggerGroup") + .HasColumnType("text") + .HasColumnName("trigger_group"); + + b.Property("BlobData") + .HasColumnType("bytea") + .HasColumnName("blob_data"); + + b.HasKey("SchedulerName", "TriggerName", "TriggerGroup"); + + b.ToTable("qrtz_blob_triggers", "quartz"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzCalendar", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("sched_name"); + + b.Property("CalendarName") + .HasColumnType("text") + .HasColumnName("calendar_name"); + + b.Property("Calendar") + .IsRequired() + .HasColumnType("bytea") + .HasColumnName("calendar"); + + b.HasKey("SchedulerName", "CalendarName"); + + b.ToTable("qrtz_calendars", "quartz"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzCronTrigger", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("sched_name"); + + b.Property("TriggerName") + .HasColumnType("text") + .HasColumnName("trigger_name"); + + b.Property("TriggerGroup") + .HasColumnType("text") + .HasColumnName("trigger_group"); + + b.Property("CronExpression") + .IsRequired() + .HasColumnType("text") + .HasColumnName("cron_expression"); + + b.Property("TimeZoneId") + .HasColumnType("text") + .HasColumnName("time_zone_id"); + + b.HasKey("SchedulerName", "TriggerName", "TriggerGroup"); + + b.ToTable("qrtz_cron_triggers", "quartz"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzFiredTrigger", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("sched_name"); + + b.Property("EntryId") + .HasColumnType("text") + .HasColumnName("entry_id"); + + b.Property("FiredTime") + .HasColumnType("bigint") + .HasColumnName("fired_time"); + + b.Property("InstanceName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("instance_name"); + + b.Property("IsNonConcurrent") + .HasColumnType("bool") + .HasColumnName("is_nonconcurrent"); + + b.Property("JobGroup") + .HasColumnType("text") + .HasColumnName("job_group"); + + b.Property("JobName") + .HasColumnType("text") + .HasColumnName("job_name"); + + b.Property("Priority") + .HasColumnType("integer") + .HasColumnName("priority"); + + b.Property("RequestsRecovery") + .HasColumnType("bool") + .HasColumnName("requests_recovery"); + + b.Property("ScheduledTime") + .HasColumnType("bigint") + .HasColumnName("sched_time"); + + b.Property("State") + .IsRequired() + .HasColumnType("text") + .HasColumnName("state"); + + b.Property("TriggerGroup") + .IsRequired() + .HasColumnType("text") + .HasColumnName("trigger_group"); + + b.Property("TriggerName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("trigger_name"); + + b.HasKey("SchedulerName", "EntryId"); + + b.HasIndex("InstanceName") + .HasDatabaseName("idx_qrtz_ft_trig_inst_name"); + + b.HasIndex("JobGroup") + .HasDatabaseName("idx_qrtz_ft_job_group"); + + b.HasIndex("JobName") + .HasDatabaseName("idx_qrtz_ft_job_name"); + + b.HasIndex("RequestsRecovery") + .HasDatabaseName("idx_qrtz_ft_job_req_recovery"); + + b.HasIndex("TriggerGroup") + .HasDatabaseName("idx_qrtz_ft_trig_group"); + + b.HasIndex("TriggerName") + .HasDatabaseName("idx_qrtz_ft_trig_name"); + + b.HasIndex("SchedulerName", "TriggerName", "TriggerGroup") + .HasDatabaseName("idx_qrtz_ft_trig_nm_gp"); + + b.ToTable("qrtz_fired_triggers", "quartz"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzJobDetail", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("sched_name"); + + b.Property("JobName") + .HasColumnType("text") + .HasColumnName("job_name"); + + b.Property("JobGroup") + .HasColumnType("text") + .HasColumnName("job_group"); + + b.Property("Description") + .HasColumnType("text") + .HasColumnName("description"); + + b.Property("IsDurable") + .HasColumnType("bool") + .HasColumnName("is_durable"); + + b.Property("IsNonConcurrent") + .HasColumnType("bool") + .HasColumnName("is_nonconcurrent"); + + b.Property("IsUpdateData") + .HasColumnType("bool") + .HasColumnName("is_update_data"); + + b.Property("JobClassName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("job_class_name"); + + b.Property("JobData") + .HasColumnType("bytea") + .HasColumnName("job_data"); + + b.Property("RequestsRecovery") + .HasColumnType("bool") + .HasColumnName("requests_recovery"); + + b.HasKey("SchedulerName", "JobName", "JobGroup"); + + b.HasIndex("RequestsRecovery") + .HasDatabaseName("idx_qrtz_j_req_recovery"); + + b.ToTable("qrtz_job_details", "quartz"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzLock", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("sched_name"); + + b.Property("LockName") + .HasColumnType("text") + .HasColumnName("lock_name"); + + b.HasKey("SchedulerName", "LockName"); + + b.ToTable("qrtz_locks", "quartz"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzPausedTriggerGroup", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("sched_name"); + + b.Property("TriggerGroup") + .HasColumnType("text") + .HasColumnName("trigger_group"); + + b.HasKey("SchedulerName", "TriggerGroup"); + + b.ToTable("qrtz_paused_trigger_grps", "quartz"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSchedulerState", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("sched_name"); + + b.Property("InstanceName") + .HasColumnType("text") + .HasColumnName("instance_name"); + + b.Property("CheckInInterval") + .HasColumnType("bigint") + .HasColumnName("checkin_interval"); + + b.Property("LastCheckInTime") + .HasColumnType("bigint") + .HasColumnName("last_checkin_time"); + + b.HasKey("SchedulerName", "InstanceName"); + + b.ToTable("qrtz_scheduler_state", "quartz"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSimplePropertyTrigger", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("sched_name"); + + b.Property("TriggerName") + .HasColumnType("text") + .HasColumnName("trigger_name"); + + b.Property("TriggerGroup") + .HasColumnType("text") + .HasColumnName("trigger_group"); + + b.Property("BooleanProperty1") + .HasColumnType("bool") + .HasColumnName("bool_prop_1"); + + b.Property("BooleanProperty2") + .HasColumnType("bool") + .HasColumnName("bool_prop_2"); + + b.Property("DecimalProperty1") + .HasColumnType("numeric") + .HasColumnName("dec_prop_1"); + + b.Property("DecimalProperty2") + .HasColumnType("numeric") + .HasColumnName("dec_prop_2"); + + b.Property("IntegerProperty1") + .HasColumnType("integer") + .HasColumnName("int_prop_1"); + + b.Property("IntegerProperty2") + .HasColumnType("integer") + .HasColumnName("int_prop_2"); + + b.Property("LongProperty1") + .HasColumnType("bigint") + .HasColumnName("long_prop_1"); + + b.Property("LongProperty2") + .HasColumnType("bigint") + .HasColumnName("long_prop_2"); + + b.Property("StringProperty1") + .HasColumnType("text") + .HasColumnName("str_prop_1"); + + b.Property("StringProperty2") + .HasColumnType("text") + .HasColumnName("str_prop_2"); + + b.Property("StringProperty3") + .HasColumnType("text") + .HasColumnName("str_prop_3"); + + b.Property("TimeZoneId") + .HasColumnType("text") + .HasColumnName("time_zone_id"); + + b.HasKey("SchedulerName", "TriggerName", "TriggerGroup"); + + b.ToTable("qrtz_simprop_triggers", "quartz"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSimpleTrigger", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("sched_name"); + + b.Property("TriggerName") + .HasColumnType("text") + .HasColumnName("trigger_name"); + + b.Property("TriggerGroup") + .HasColumnType("text") + .HasColumnName("trigger_group"); + + b.Property("RepeatCount") + .HasColumnType("bigint") + .HasColumnName("repeat_count"); + + b.Property("RepeatInterval") + .HasColumnType("bigint") + .HasColumnName("repeat_interval"); + + b.Property("TimesTriggered") + .HasColumnType("bigint") + .HasColumnName("times_triggered"); + + b.HasKey("SchedulerName", "TriggerName", "TriggerGroup"); + + b.ToTable("qrtz_simple_triggers", "quartz"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("sched_name"); + + b.Property("TriggerName") + .HasColumnType("text") + .HasColumnName("trigger_name"); + + b.Property("TriggerGroup") + .HasColumnType("text") + .HasColumnName("trigger_group"); + + b.Property("CalendarName") + .HasColumnType("text") + .HasColumnName("calendar_name"); + + b.Property("Description") + .HasColumnType("text") + .HasColumnName("description"); + + b.Property("EndTime") + .HasColumnType("bigint") + .HasColumnName("end_time"); + + b.Property("JobData") + .HasColumnType("bytea") + .HasColumnName("job_data"); + + b.Property("JobGroup") + .IsRequired() + .HasColumnType("text") + .HasColumnName("job_group"); + + b.Property("JobName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("job_name"); + + b.Property("MisfireInstruction") + .HasColumnType("smallint") + .HasColumnName("misfire_instr"); + + b.Property("NextFireTime") + .HasColumnType("bigint") + .HasColumnName("next_fire_time"); + + b.Property("PreviousFireTime") + .HasColumnType("bigint") + .HasColumnName("prev_fire_time"); + + b.Property("Priority") + .HasColumnType("integer") + .HasColumnName("priority"); + + b.Property("StartTime") + .HasColumnType("bigint") + .HasColumnName("start_time"); + + b.Property("TriggerState") + .IsRequired() + .HasColumnType("text") + .HasColumnName("trigger_state"); + + b.Property("TriggerType") + .IsRequired() + .HasColumnType("text") + .HasColumnName("trigger_type"); + + b.HasKey("SchedulerName", "TriggerName", "TriggerGroup"); + + b.HasIndex("NextFireTime") + .HasDatabaseName("idx_qrtz_t_next_fire_time"); + + b.HasIndex("TriggerState") + .HasDatabaseName("idx_qrtz_t_state"); + + b.HasIndex("NextFireTime", "TriggerState") + .HasDatabaseName("idx_qrtz_t_nft_st"); + + b.HasIndex("SchedulerName", "JobName", "JobGroup"); + + b.ToTable("qrtz_triggers", "quartz"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzBlobTrigger", b => + { + b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", "Trigger") + .WithMany("BlobTriggers") + .HasForeignKey("SchedulerName", "TriggerName", "TriggerGroup") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Trigger"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzCronTrigger", b => + { + b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", "Trigger") + .WithMany("CronTriggers") + .HasForeignKey("SchedulerName", "TriggerName", "TriggerGroup") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Trigger"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSimplePropertyTrigger", b => + { + b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", "Trigger") + .WithMany("SimplePropertyTriggers") + .HasForeignKey("SchedulerName", "TriggerName", "TriggerGroup") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Trigger"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSimpleTrigger", b => + { + b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", "Trigger") + .WithMany("SimpleTriggers") + .HasForeignKey("SchedulerName", "TriggerName", "TriggerGroup") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Trigger"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", b => + { + b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzJobDetail", "JobDetail") + .WithMany("Triggers") + .HasForeignKey("SchedulerName", "JobName", "JobGroup") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("JobDetail"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzJobDetail", b => + { + b.Navigation("Triggers"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", b => + { + b.Navigation("BlobTriggers"); + + b.Navigation("CronTriggers"); + + b.Navigation("SimplePropertyTriggers"); + + b.Navigation("SimpleTriggers"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/modules/Elsa.Quartz.EntityFrameworkCore.PostgreSql/Migrations/20231029150749_AddQuartz.cs b/src/modules/Elsa.Quartz.EntityFrameworkCore.PostgreSql/Migrations/20231029150749_AddQuartz.cs new file mode 100644 index 000000000..46661de76 --- /dev/null +++ b/src/modules/Elsa.Quartz.EntityFrameworkCore.PostgreSql/Migrations/20231029150749_AddQuartz.cs @@ -0,0 +1,373 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Elsa.Quartz.EntityFrameworkCore.PostgreSql.Migrations +{ + /// + public partial class AddQuartz : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.EnsureSchema( + name: "quartz"); + + migrationBuilder.CreateTable( + name: "qrtz_calendars", + schema: "quartz", + columns: table => new + { + sched_name = table.Column(type: "text", nullable: false), + calendar_name = table.Column(type: "text", nullable: false), + calendar = table.Column(type: "bytea", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_qrtz_calendars", x => new { x.sched_name, x.calendar_name }); + }); + + migrationBuilder.CreateTable( + name: "qrtz_fired_triggers", + schema: "quartz", + columns: table => new + { + sched_name = table.Column(type: "text", nullable: false), + entry_id = table.Column(type: "text", nullable: false), + trigger_name = table.Column(type: "text", nullable: false), + trigger_group = table.Column(type: "text", nullable: false), + instance_name = table.Column(type: "text", nullable: false), + fired_time = table.Column(type: "bigint", nullable: false), + sched_time = table.Column(type: "bigint", nullable: false), + priority = table.Column(type: "integer", nullable: false), + state = table.Column(type: "text", nullable: false), + job_name = table.Column(type: "text", nullable: true), + job_group = table.Column(type: "text", nullable: true), + is_nonconcurrent = table.Column(type: "bool", nullable: false), + requests_recovery = table.Column(type: "bool", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_qrtz_fired_triggers", x => new { x.sched_name, x.entry_id }); + }); + + migrationBuilder.CreateTable( + name: "qrtz_job_details", + schema: "quartz", + columns: table => new + { + sched_name = table.Column(type: "text", nullable: false), + job_name = table.Column(type: "text", nullable: false), + job_group = table.Column(type: "text", nullable: false), + description = table.Column(type: "text", nullable: true), + job_class_name = table.Column(type: "text", nullable: false), + is_durable = table.Column(type: "bool", nullable: false), + is_nonconcurrent = table.Column(type: "bool", nullable: false), + is_update_data = table.Column(type: "bool", nullable: false), + requests_recovery = table.Column(type: "bool", nullable: false), + job_data = table.Column(type: "bytea", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_qrtz_job_details", x => new { x.sched_name, x.job_name, x.job_group }); + }); + + migrationBuilder.CreateTable( + name: "qrtz_locks", + schema: "quartz", + columns: table => new + { + sched_name = table.Column(type: "text", nullable: false), + lock_name = table.Column(type: "text", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_qrtz_locks", x => new { x.sched_name, x.lock_name }); + }); + + migrationBuilder.CreateTable( + name: "qrtz_paused_trigger_grps", + schema: "quartz", + columns: table => new + { + sched_name = table.Column(type: "text", nullable: false), + trigger_group = table.Column(type: "text", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_qrtz_paused_trigger_grps", x => new { x.sched_name, x.trigger_group }); + }); + + migrationBuilder.CreateTable( + name: "qrtz_scheduler_state", + schema: "quartz", + columns: table => new + { + sched_name = table.Column(type: "text", nullable: false), + instance_name = table.Column(type: "text", nullable: false), + last_checkin_time = table.Column(type: "bigint", nullable: false), + checkin_interval = table.Column(type: "bigint", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_qrtz_scheduler_state", x => new { x.sched_name, x.instance_name }); + }); + + migrationBuilder.CreateTable( + name: "qrtz_triggers", + schema: "quartz", + columns: table => new + { + sched_name = table.Column(type: "text", nullable: false), + trigger_name = table.Column(type: "text", nullable: false), + trigger_group = table.Column(type: "text", nullable: false), + job_name = table.Column(type: "text", nullable: false), + job_group = table.Column(type: "text", nullable: false), + description = table.Column(type: "text", nullable: true), + next_fire_time = table.Column(type: "bigint", nullable: true), + prev_fire_time = table.Column(type: "bigint", nullable: true), + priority = table.Column(type: "integer", nullable: true), + trigger_state = table.Column(type: "text", nullable: false), + trigger_type = table.Column(type: "text", nullable: false), + start_time = table.Column(type: "bigint", nullable: false), + end_time = table.Column(type: "bigint", nullable: true), + calendar_name = table.Column(type: "text", nullable: true), + misfire_instr = table.Column(type: "smallint", nullable: true), + job_data = table.Column(type: "bytea", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_qrtz_triggers", x => new { x.sched_name, x.trigger_name, x.trigger_group }); + table.ForeignKey( + name: "FK_qrtz_triggers_qrtz_job_details_sched_name_job_name_job_group", + columns: x => new { x.sched_name, x.job_name, x.job_group }, + principalSchema: "quartz", + principalTable: "qrtz_job_details", + principalColumns: new[] { "sched_name", "job_name", "job_group" }, + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "qrtz_blob_triggers", + schema: "quartz", + columns: table => new + { + sched_name = table.Column(type: "text", nullable: false), + trigger_name = table.Column(type: "text", nullable: false), + trigger_group = table.Column(type: "text", nullable: false), + blob_data = table.Column(type: "bytea", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_qrtz_blob_triggers", x => new { x.sched_name, x.trigger_name, x.trigger_group }); + table.ForeignKey( + name: "FK_qrtz_blob_triggers_qrtz_triggers_sched_name_trigger_name_tr~", + columns: x => new { x.sched_name, x.trigger_name, x.trigger_group }, + principalSchema: "quartz", + principalTable: "qrtz_triggers", + principalColumns: new[] { "sched_name", "trigger_name", "trigger_group" }, + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "qrtz_cron_triggers", + schema: "quartz", + columns: table => new + { + sched_name = table.Column(type: "text", nullable: false), + trigger_name = table.Column(type: "text", nullable: false), + trigger_group = table.Column(type: "text", nullable: false), + cron_expression = table.Column(type: "text", nullable: false), + time_zone_id = table.Column(type: "text", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_qrtz_cron_triggers", x => new { x.sched_name, x.trigger_name, x.trigger_group }); + table.ForeignKey( + name: "FK_qrtz_cron_triggers_qrtz_triggers_sched_name_trigger_name_tr~", + columns: x => new { x.sched_name, x.trigger_name, x.trigger_group }, + principalSchema: "quartz", + principalTable: "qrtz_triggers", + principalColumns: new[] { "sched_name", "trigger_name", "trigger_group" }, + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "qrtz_simple_triggers", + schema: "quartz", + columns: table => new + { + sched_name = table.Column(type: "text", nullable: false), + trigger_name = table.Column(type: "text", nullable: false), + trigger_group = table.Column(type: "text", nullable: false), + repeat_count = table.Column(type: "bigint", nullable: false), + repeat_interval = table.Column(type: "bigint", nullable: false), + times_triggered = table.Column(type: "bigint", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_qrtz_simple_triggers", x => new { x.sched_name, x.trigger_name, x.trigger_group }); + table.ForeignKey( + name: "FK_qrtz_simple_triggers_qrtz_triggers_sched_name_trigger_name_~", + columns: x => new { x.sched_name, x.trigger_name, x.trigger_group }, + principalSchema: "quartz", + principalTable: "qrtz_triggers", + principalColumns: new[] { "sched_name", "trigger_name", "trigger_group" }, + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "qrtz_simprop_triggers", + schema: "quartz", + columns: table => new + { + sched_name = table.Column(type: "text", nullable: false), + trigger_name = table.Column(type: "text", nullable: false), + trigger_group = table.Column(type: "text", nullable: false), + str_prop_1 = table.Column(type: "text", nullable: true), + str_prop_2 = table.Column(type: "text", nullable: true), + str_prop_3 = table.Column(type: "text", nullable: true), + int_prop_1 = table.Column(type: "integer", nullable: true), + int_prop_2 = table.Column(type: "integer", nullable: true), + long_prop_1 = table.Column(type: "bigint", nullable: true), + long_prop_2 = table.Column(type: "bigint", nullable: true), + dec_prop_1 = table.Column(type: "numeric", nullable: true), + dec_prop_2 = table.Column(type: "numeric", nullable: true), + bool_prop_1 = table.Column(type: "bool", nullable: true), + bool_prop_2 = table.Column(type: "bool", nullable: true), + time_zone_id = table.Column(type: "text", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_qrtz_simprop_triggers", x => new { x.sched_name, x.trigger_name, x.trigger_group }); + table.ForeignKey( + name: "FK_qrtz_simprop_triggers_qrtz_triggers_sched_name_trigger_name~", + columns: x => new { x.sched_name, x.trigger_name, x.trigger_group }, + principalSchema: "quartz", + principalTable: "qrtz_triggers", + principalColumns: new[] { "sched_name", "trigger_name", "trigger_group" }, + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "idx_qrtz_ft_job_group", + schema: "quartz", + table: "qrtz_fired_triggers", + column: "job_group"); + + migrationBuilder.CreateIndex( + name: "idx_qrtz_ft_job_name", + schema: "quartz", + table: "qrtz_fired_triggers", + column: "job_name"); + + migrationBuilder.CreateIndex( + name: "idx_qrtz_ft_job_req_recovery", + schema: "quartz", + table: "qrtz_fired_triggers", + column: "requests_recovery"); + + migrationBuilder.CreateIndex( + name: "idx_qrtz_ft_trig_group", + schema: "quartz", + table: "qrtz_fired_triggers", + column: "trigger_group"); + + migrationBuilder.CreateIndex( + name: "idx_qrtz_ft_trig_inst_name", + schema: "quartz", + table: "qrtz_fired_triggers", + column: "instance_name"); + + migrationBuilder.CreateIndex( + name: "idx_qrtz_ft_trig_name", + schema: "quartz", + table: "qrtz_fired_triggers", + column: "trigger_name"); + + migrationBuilder.CreateIndex( + name: "idx_qrtz_ft_trig_nm_gp", + schema: "quartz", + table: "qrtz_fired_triggers", + columns: new[] { "sched_name", "trigger_name", "trigger_group" }); + + migrationBuilder.CreateIndex( + name: "idx_qrtz_j_req_recovery", + schema: "quartz", + table: "qrtz_job_details", + column: "requests_recovery"); + + migrationBuilder.CreateIndex( + name: "idx_qrtz_t_next_fire_time", + schema: "quartz", + table: "qrtz_triggers", + column: "next_fire_time"); + + migrationBuilder.CreateIndex( + name: "idx_qrtz_t_nft_st", + schema: "quartz", + table: "qrtz_triggers", + columns: new[] { "next_fire_time", "trigger_state" }); + + migrationBuilder.CreateIndex( + name: "idx_qrtz_t_state", + schema: "quartz", + table: "qrtz_triggers", + column: "trigger_state"); + + migrationBuilder.CreateIndex( + name: "IX_qrtz_triggers_sched_name_job_name_job_group", + schema: "quartz", + table: "qrtz_triggers", + columns: new[] { "sched_name", "job_name", "job_group" }); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "qrtz_blob_triggers", + schema: "quartz"); + + migrationBuilder.DropTable( + name: "qrtz_calendars", + schema: "quartz"); + + migrationBuilder.DropTable( + name: "qrtz_cron_triggers", + schema: "quartz"); + + migrationBuilder.DropTable( + name: "qrtz_fired_triggers", + schema: "quartz"); + + migrationBuilder.DropTable( + name: "qrtz_locks", + schema: "quartz"); + + migrationBuilder.DropTable( + name: "qrtz_paused_trigger_grps", + schema: "quartz"); + + migrationBuilder.DropTable( + name: "qrtz_scheduler_state", + schema: "quartz"); + + migrationBuilder.DropTable( + name: "qrtz_simple_triggers", + schema: "quartz"); + + migrationBuilder.DropTable( + name: "qrtz_simprop_triggers", + schema: "quartz"); + + migrationBuilder.DropTable( + name: "qrtz_triggers", + schema: "quartz"); + + migrationBuilder.DropTable( + name: "qrtz_job_details", + schema: "quartz"); + } + } +} diff --git a/src/modules/Elsa.Quartz.EntityFrameworkCore.PostgreSql/Migrations/PostgreSqlQuartzDbContextModelSnapshot.cs b/src/modules/Elsa.Quartz.EntityFrameworkCore.PostgreSql/Migrations/PostgreSqlQuartzDbContextModelSnapshot.cs new file mode 100644 index 000000000..1547bbd7f --- /dev/null +++ b/src/modules/Elsa.Quartz.EntityFrameworkCore.PostgreSql/Migrations/PostgreSqlQuartzDbContextModelSnapshot.cs @@ -0,0 +1,541 @@ +// +using System; +using Elsa.Quartz.EntityFrameworkCore.PostgreSql; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Elsa.Quartz.EntityFrameworkCore.PostgreSql.Migrations +{ + [DbContext(typeof(PostgreSqlQuartzDbContext))] + partial class PostgreSqlQuartzDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.13") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzBlobTrigger", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("sched_name"); + + b.Property("TriggerName") + .HasColumnType("text") + .HasColumnName("trigger_name"); + + b.Property("TriggerGroup") + .HasColumnType("text") + .HasColumnName("trigger_group"); + + b.Property("BlobData") + .HasColumnType("bytea") + .HasColumnName("blob_data"); + + b.HasKey("SchedulerName", "TriggerName", "TriggerGroup"); + + b.ToTable("qrtz_blob_triggers", "quartz"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzCalendar", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("sched_name"); + + b.Property("CalendarName") + .HasColumnType("text") + .HasColumnName("calendar_name"); + + b.Property("Calendar") + .IsRequired() + .HasColumnType("bytea") + .HasColumnName("calendar"); + + b.HasKey("SchedulerName", "CalendarName"); + + b.ToTable("qrtz_calendars", "quartz"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzCronTrigger", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("sched_name"); + + b.Property("TriggerName") + .HasColumnType("text") + .HasColumnName("trigger_name"); + + b.Property("TriggerGroup") + .HasColumnType("text") + .HasColumnName("trigger_group"); + + b.Property("CronExpression") + .IsRequired() + .HasColumnType("text") + .HasColumnName("cron_expression"); + + b.Property("TimeZoneId") + .HasColumnType("text") + .HasColumnName("time_zone_id"); + + b.HasKey("SchedulerName", "TriggerName", "TriggerGroup"); + + b.ToTable("qrtz_cron_triggers", "quartz"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzFiredTrigger", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("sched_name"); + + b.Property("EntryId") + .HasColumnType("text") + .HasColumnName("entry_id"); + + b.Property("FiredTime") + .HasColumnType("bigint") + .HasColumnName("fired_time"); + + b.Property("InstanceName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("instance_name"); + + b.Property("IsNonConcurrent") + .HasColumnType("bool") + .HasColumnName("is_nonconcurrent"); + + b.Property("JobGroup") + .HasColumnType("text") + .HasColumnName("job_group"); + + b.Property("JobName") + .HasColumnType("text") + .HasColumnName("job_name"); + + b.Property("Priority") + .HasColumnType("integer") + .HasColumnName("priority"); + + b.Property("RequestsRecovery") + .HasColumnType("bool") + .HasColumnName("requests_recovery"); + + b.Property("ScheduledTime") + .HasColumnType("bigint") + .HasColumnName("sched_time"); + + b.Property("State") + .IsRequired() + .HasColumnType("text") + .HasColumnName("state"); + + b.Property("TriggerGroup") + .IsRequired() + .HasColumnType("text") + .HasColumnName("trigger_group"); + + b.Property("TriggerName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("trigger_name"); + + b.HasKey("SchedulerName", "EntryId"); + + b.HasIndex("InstanceName") + .HasDatabaseName("idx_qrtz_ft_trig_inst_name"); + + b.HasIndex("JobGroup") + .HasDatabaseName("idx_qrtz_ft_job_group"); + + b.HasIndex("JobName") + .HasDatabaseName("idx_qrtz_ft_job_name"); + + b.HasIndex("RequestsRecovery") + .HasDatabaseName("idx_qrtz_ft_job_req_recovery"); + + b.HasIndex("TriggerGroup") + .HasDatabaseName("idx_qrtz_ft_trig_group"); + + b.HasIndex("TriggerName") + .HasDatabaseName("idx_qrtz_ft_trig_name"); + + b.HasIndex("SchedulerName", "TriggerName", "TriggerGroup") + .HasDatabaseName("idx_qrtz_ft_trig_nm_gp"); + + b.ToTable("qrtz_fired_triggers", "quartz"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzJobDetail", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("sched_name"); + + b.Property("JobName") + .HasColumnType("text") + .HasColumnName("job_name"); + + b.Property("JobGroup") + .HasColumnType("text") + .HasColumnName("job_group"); + + b.Property("Description") + .HasColumnType("text") + .HasColumnName("description"); + + b.Property("IsDurable") + .HasColumnType("bool") + .HasColumnName("is_durable"); + + b.Property("IsNonConcurrent") + .HasColumnType("bool") + .HasColumnName("is_nonconcurrent"); + + b.Property("IsUpdateData") + .HasColumnType("bool") + .HasColumnName("is_update_data"); + + b.Property("JobClassName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("job_class_name"); + + b.Property("JobData") + .HasColumnType("bytea") + .HasColumnName("job_data"); + + b.Property("RequestsRecovery") + .HasColumnType("bool") + .HasColumnName("requests_recovery"); + + b.HasKey("SchedulerName", "JobName", "JobGroup"); + + b.HasIndex("RequestsRecovery") + .HasDatabaseName("idx_qrtz_j_req_recovery"); + + b.ToTable("qrtz_job_details", "quartz"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzLock", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("sched_name"); + + b.Property("LockName") + .HasColumnType("text") + .HasColumnName("lock_name"); + + b.HasKey("SchedulerName", "LockName"); + + b.ToTable("qrtz_locks", "quartz"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzPausedTriggerGroup", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("sched_name"); + + b.Property("TriggerGroup") + .HasColumnType("text") + .HasColumnName("trigger_group"); + + b.HasKey("SchedulerName", "TriggerGroup"); + + b.ToTable("qrtz_paused_trigger_grps", "quartz"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSchedulerState", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("sched_name"); + + b.Property("InstanceName") + .HasColumnType("text") + .HasColumnName("instance_name"); + + b.Property("CheckInInterval") + .HasColumnType("bigint") + .HasColumnName("checkin_interval"); + + b.Property("LastCheckInTime") + .HasColumnType("bigint") + .HasColumnName("last_checkin_time"); + + b.HasKey("SchedulerName", "InstanceName"); + + b.ToTable("qrtz_scheduler_state", "quartz"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSimplePropertyTrigger", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("sched_name"); + + b.Property("TriggerName") + .HasColumnType("text") + .HasColumnName("trigger_name"); + + b.Property("TriggerGroup") + .HasColumnType("text") + .HasColumnName("trigger_group"); + + b.Property("BooleanProperty1") + .HasColumnType("bool") + .HasColumnName("bool_prop_1"); + + b.Property("BooleanProperty2") + .HasColumnType("bool") + .HasColumnName("bool_prop_2"); + + b.Property("DecimalProperty1") + .HasColumnType("numeric") + .HasColumnName("dec_prop_1"); + + b.Property("DecimalProperty2") + .HasColumnType("numeric") + .HasColumnName("dec_prop_2"); + + b.Property("IntegerProperty1") + .HasColumnType("integer") + .HasColumnName("int_prop_1"); + + b.Property("IntegerProperty2") + .HasColumnType("integer") + .HasColumnName("int_prop_2"); + + b.Property("LongProperty1") + .HasColumnType("bigint") + .HasColumnName("long_prop_1"); + + b.Property("LongProperty2") + .HasColumnType("bigint") + .HasColumnName("long_prop_2"); + + b.Property("StringProperty1") + .HasColumnType("text") + .HasColumnName("str_prop_1"); + + b.Property("StringProperty2") + .HasColumnType("text") + .HasColumnName("str_prop_2"); + + b.Property("StringProperty3") + .HasColumnType("text") + .HasColumnName("str_prop_3"); + + b.Property("TimeZoneId") + .HasColumnType("text") + .HasColumnName("time_zone_id"); + + b.HasKey("SchedulerName", "TriggerName", "TriggerGroup"); + + b.ToTable("qrtz_simprop_triggers", "quartz"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSimpleTrigger", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("sched_name"); + + b.Property("TriggerName") + .HasColumnType("text") + .HasColumnName("trigger_name"); + + b.Property("TriggerGroup") + .HasColumnType("text") + .HasColumnName("trigger_group"); + + b.Property("RepeatCount") + .HasColumnType("bigint") + .HasColumnName("repeat_count"); + + b.Property("RepeatInterval") + .HasColumnType("bigint") + .HasColumnName("repeat_interval"); + + b.Property("TimesTriggered") + .HasColumnType("bigint") + .HasColumnName("times_triggered"); + + b.HasKey("SchedulerName", "TriggerName", "TriggerGroup"); + + b.ToTable("qrtz_simple_triggers", "quartz"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("sched_name"); + + b.Property("TriggerName") + .HasColumnType("text") + .HasColumnName("trigger_name"); + + b.Property("TriggerGroup") + .HasColumnType("text") + .HasColumnName("trigger_group"); + + b.Property("CalendarName") + .HasColumnType("text") + .HasColumnName("calendar_name"); + + b.Property("Description") + .HasColumnType("text") + .HasColumnName("description"); + + b.Property("EndTime") + .HasColumnType("bigint") + .HasColumnName("end_time"); + + b.Property("JobData") + .HasColumnType("bytea") + .HasColumnName("job_data"); + + b.Property("JobGroup") + .IsRequired() + .HasColumnType("text") + .HasColumnName("job_group"); + + b.Property("JobName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("job_name"); + + b.Property("MisfireInstruction") + .HasColumnType("smallint") + .HasColumnName("misfire_instr"); + + b.Property("NextFireTime") + .HasColumnType("bigint") + .HasColumnName("next_fire_time"); + + b.Property("PreviousFireTime") + .HasColumnType("bigint") + .HasColumnName("prev_fire_time"); + + b.Property("Priority") + .HasColumnType("integer") + .HasColumnName("priority"); + + b.Property("StartTime") + .HasColumnType("bigint") + .HasColumnName("start_time"); + + b.Property("TriggerState") + .IsRequired() + .HasColumnType("text") + .HasColumnName("trigger_state"); + + b.Property("TriggerType") + .IsRequired() + .HasColumnType("text") + .HasColumnName("trigger_type"); + + b.HasKey("SchedulerName", "TriggerName", "TriggerGroup"); + + b.HasIndex("NextFireTime") + .HasDatabaseName("idx_qrtz_t_next_fire_time"); + + b.HasIndex("TriggerState") + .HasDatabaseName("idx_qrtz_t_state"); + + b.HasIndex("NextFireTime", "TriggerState") + .HasDatabaseName("idx_qrtz_t_nft_st"); + + b.HasIndex("SchedulerName", "JobName", "JobGroup"); + + b.ToTable("qrtz_triggers", "quartz"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzBlobTrigger", b => + { + b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", "Trigger") + .WithMany("BlobTriggers") + .HasForeignKey("SchedulerName", "TriggerName", "TriggerGroup") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Trigger"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzCronTrigger", b => + { + b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", "Trigger") + .WithMany("CronTriggers") + .HasForeignKey("SchedulerName", "TriggerName", "TriggerGroup") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Trigger"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSimplePropertyTrigger", b => + { + b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", "Trigger") + .WithMany("SimplePropertyTriggers") + .HasForeignKey("SchedulerName", "TriggerName", "TriggerGroup") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Trigger"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSimpleTrigger", b => + { + b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", "Trigger") + .WithMany("SimpleTriggers") + .HasForeignKey("SchedulerName", "TriggerName", "TriggerGroup") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Trigger"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", b => + { + b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzJobDetail", "JobDetail") + .WithMany("Triggers") + .HasForeignKey("SchedulerName", "JobName", "JobGroup") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("JobDetail"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzJobDetail", b => + { + b.Navigation("Triggers"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", b => + { + b.Navigation("BlobTriggers"); + + b.Navigation("CronTriggers"); + + b.Navigation("SimplePropertyTriggers"); + + b.Navigation("SimpleTriggers"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/modules/Elsa.Quartz.EntityFrameworkCore.PostgreSql/SqlServerQuartzDbContext.cs b/src/modules/Elsa.Quartz.EntityFrameworkCore.PostgreSql/SqlServerQuartzDbContext.cs new file mode 100644 index 000000000..14970c19b --- /dev/null +++ b/src/modules/Elsa.Quartz.EntityFrameworkCore.PostgreSql/SqlServerQuartzDbContext.cs @@ -0,0 +1,32 @@ +using AppAny.Quartz.EntityFrameworkCore.Migrations; +using AppAny.Quartz.EntityFrameworkCore.Migrations.PostgreSQL; +using Elsa.EntityFrameworkCore.Common.Abstractions; +using JetBrains.Annotations; +using Microsoft.EntityFrameworkCore; + +namespace Elsa.Quartz.EntityFrameworkCore.PostgreSql; + +/// +/// Quartz DbContext for PostgreSQL. +/// +[UsedImplicitly] +public class PostgreSqlQuartzDbContext : DbContext +{ + /// + public PostgreSqlQuartzDbContext(DbContextOptions options) : base(options) + { + } + + /// + protected override void OnModelCreating(ModelBuilder modelBuilder) => modelBuilder.AddQuartz(model => model.UsePostgreSql()); +} + +/// +/// Design-time factory for Quartz DbContext for PostgreSQL. +/// +[UsedImplicitly] +public class SqlServerQuartzDbContextFactory : DesignTimeDbContextFactoryBase +{ + /// + protected override void ConfigureBuilder(DbContextOptionsBuilder builder, string connectionString) => builder.UseNpgsql(connectionString); +} \ No newline at end of file diff --git a/src/modules/Elsa.Quartz.EntityFrameworkCore.PostgreSql/SqlServerQuartzExtensions.cs b/src/modules/Elsa.Quartz.EntityFrameworkCore.PostgreSql/SqlServerQuartzExtensions.cs new file mode 100644 index 000000000..dde548e75 --- /dev/null +++ b/src/modules/Elsa.Quartz.EntityFrameworkCore.PostgreSql/SqlServerQuartzExtensions.cs @@ -0,0 +1,46 @@ +using Elsa.EntityFrameworkCore.Common; +using Elsa.Quartz.EntityFrameworkCore.PostgreSql; +using Elsa.Quartz.Features; +using JetBrains.Annotations; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using Quartz; + +// ReSharper disable once CheckNamespace +namespace Elsa.EntityFrameworkCore.Extensions; + +/// +/// Provides extensions to configure EF Core to use PostgreSQL. +/// +[PublicAPI] +public static class PostgreSqlQuartzExtensions +{ + /// + /// Configures the to use the PostgreSQL job store. + /// + public static QuartzFeature UseSqlServer(this QuartzFeature feature, string connectionString = Constants.DefaultConnectionString, bool useClustering = true) + { + feature.Services.AddDbContextFactory(options => + { + // Use PostgreSQL migrations. + options.UseNpgsql(connectionString, sqlServerDbContextOptionsBuilder => { sqlServerDbContextOptionsBuilder.MigrationsAssembly(typeof(PostgreSqlQuartzDbContext).Assembly.GetName().Name); }); + }); + + feature.ConfigureQuartz += quartz => + { + quartz.UsePersistentStore(store => + { + store.UseNewtonsoftJsonSerializer(); + store.UsePostgres(connectionString); + + if (useClustering) + store.UseClustering(); + }); + }; + + // Configure the Quartz hosted service to run migrations. + feature.Module.ConfigureHostedService>(-100); + + return feature; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Quartz.EntityFrameworkCore.SqlServer/Elsa.Quartz.EntityFrameworkCore.SqlServer.csproj b/src/modules/Elsa.Quartz.EntityFrameworkCore.SqlServer/Elsa.Quartz.EntityFrameworkCore.SqlServer.csproj new file mode 100644 index 000000000..c01f40913 --- /dev/null +++ b/src/modules/Elsa.Quartz.EntityFrameworkCore.SqlServer/Elsa.Quartz.EntityFrameworkCore.SqlServer.csproj @@ -0,0 +1,30 @@ + + + + + + + net6.0;net7.0 + + Provides EF Core migrations for Quartz.NET. + + elsa module scheduling quartz ef core migrations + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + \ No newline at end of file diff --git a/src/modules/Elsa.Quartz.EntityFrameworkCore.SqlServer/FodyWeavers.xml b/src/modules/Elsa.Quartz.EntityFrameworkCore.SqlServer/FodyWeavers.xml new file mode 100644 index 000000000..00e1d9a1c --- /dev/null +++ b/src/modules/Elsa.Quartz.EntityFrameworkCore.SqlServer/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/modules/Elsa.Quartz.EntityFrameworkCore.SqlServer/Migrations/20231029143236_AddQuartz.Designer.cs b/src/modules/Elsa.Quartz.EntityFrameworkCore.SqlServer/Migrations/20231029143236_AddQuartz.Designer.cs new file mode 100644 index 000000000..393bd0b7e --- /dev/null +++ b/src/modules/Elsa.Quartz.EntityFrameworkCore.SqlServer/Migrations/20231029143236_AddQuartz.Designer.cs @@ -0,0 +1,643 @@ +// +using System; +using Elsa.Quartz.EntityFrameworkCore.SqlServer; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace Elsa.Quartz.EntityFrameworkCore.SqlServer.Migrations +{ + [DbContext(typeof(SqlServerQuartzDbContext))] + [Migration("20231029143236_AddQuartz")] + partial class AddQuartz + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.13") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzBlobTrigger", b => + { + b.Property("SchedulerName") + .HasMaxLength(120) + .IsUnicode(true) + .HasColumnType("nvarchar(120)") + .HasColumnName("SCHED_NAME"); + + b.Property("TriggerName") + .HasMaxLength(150) + .IsUnicode(true) + .HasColumnType("nvarchar(150)") + .HasColumnName("TRIGGER_NAME"); + + b.Property("TriggerGroup") + .HasMaxLength(150) + .IsUnicode(true) + .HasColumnType("nvarchar(150)") + .HasColumnName("TRIGGER_GROUP"); + + b.Property("BlobData") + .HasColumnType("varbinary(max)") + .HasColumnName("BLOB_DATA"); + + b.HasKey("SchedulerName", "TriggerName", "TriggerGroup"); + + b.ToTable("QRTZ_BLOB_TRIGGERS", "quartz"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzCalendar", b => + { + b.Property("SchedulerName") + .HasMaxLength(120) + .IsUnicode(true) + .HasColumnType("nvarchar(120)") + .HasColumnName("SCHED_NAME"); + + b.Property("CalendarName") + .HasMaxLength(200) + .IsUnicode(true) + .HasColumnType("nvarchar(200)") + .HasColumnName("CALENDAR_NAME"); + + b.Property("Calendar") + .IsRequired() + .HasColumnType("varbinary(max)") + .HasColumnName("CALENDAR"); + + b.HasKey("SchedulerName", "CalendarName"); + + b.ToTable("QRTZ_CALENDARS", "quartz"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzCronTrigger", b => + { + b.Property("SchedulerName") + .HasMaxLength(120) + .IsUnicode(true) + .HasColumnType("nvarchar(120)") + .HasColumnName("SCHED_NAME"); + + b.Property("TriggerName") + .HasMaxLength(150) + .IsUnicode(true) + .HasColumnType("nvarchar(150)") + .HasColumnName("TRIGGER_NAME"); + + b.Property("TriggerGroup") + .HasMaxLength(150) + .IsUnicode(true) + .HasColumnType("nvarchar(150)") + .HasColumnName("TRIGGER_GROUP"); + + b.Property("CronExpression") + .IsRequired() + .HasMaxLength(120) + .IsUnicode(true) + .HasColumnType("nvarchar(120)") + .HasColumnName("CRON_EXPRESSION"); + + b.Property("TimeZoneId") + .HasMaxLength(120) + .IsUnicode(true) + .HasColumnType("nvarchar(120)") + .HasColumnName("TIME_ZONE_ID"); + + b.HasKey("SchedulerName", "TriggerName", "TriggerGroup"); + + b.ToTable("QRTZ_CRON_TRIGGERS", "quartz"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzFiredTrigger", b => + { + b.Property("SchedulerName") + .HasMaxLength(120) + .IsUnicode(true) + .HasColumnType("nvarchar(120)") + .HasColumnName("SCHED_NAME"); + + b.Property("EntryId") + .HasMaxLength(140) + .IsUnicode(true) + .HasColumnType("nvarchar(140)") + .HasColumnName("ENTRY_ID"); + + b.Property("FiredTime") + .HasColumnType("bigint") + .HasColumnName("FIRED_TIME"); + + b.Property("InstanceName") + .IsRequired() + .HasMaxLength(150) + .IsUnicode(true) + .HasColumnType("nvarchar(150)") + .HasColumnName("INSTANCE_NAME"); + + b.Property("IsNonConcurrent") + .HasColumnType("bit") + .HasColumnName("IS_NONCONCURRENT"); + + b.Property("JobGroup") + .HasMaxLength(150) + .IsUnicode(true) + .HasColumnType("nvarchar(150)") + .HasColumnName("JOB_GROUP"); + + b.Property("JobName") + .HasMaxLength(150) + .IsUnicode(true) + .HasColumnType("nvarchar(150)") + .HasColumnName("JOB_NAME"); + + b.Property("Priority") + .HasColumnType("int") + .HasColumnName("PRIORITY"); + + b.Property("RequestsRecovery") + .HasColumnType("bit") + .HasColumnName("REQUESTS_RECOVERY"); + + b.Property("ScheduledTime") + .HasColumnType("bigint") + .HasColumnName("SCHED_TIME"); + + b.Property("State") + .IsRequired() + .HasMaxLength(16) + .IsUnicode(true) + .HasColumnType("nvarchar(16)") + .HasColumnName("STATE"); + + b.Property("TriggerGroup") + .IsRequired() + .HasMaxLength(150) + .IsUnicode(true) + .HasColumnType("nvarchar(150)") + .HasColumnName("TRIGGER_GROUP"); + + b.Property("TriggerName") + .IsRequired() + .HasMaxLength(150) + .IsUnicode(true) + .HasColumnType("nvarchar(150)") + .HasColumnName("TRIGGER_NAME"); + + b.HasKey("SchedulerName", "EntryId"); + + b.HasIndex("InstanceName") + .HasDatabaseName("IDX_QRTZ_FT_TRIG_INST_NAME"); + + b.HasIndex("JobGroup") + .HasDatabaseName("IDX_QRTZ_FT_JOB_GROUP"); + + b.HasIndex("JobName") + .HasDatabaseName("IDX_QRTZ_FT_JOB_NAME"); + + b.HasIndex("RequestsRecovery") + .HasDatabaseName("IDX_QRTZ_FT_JOB_REQ_RECOVERY"); + + b.HasIndex("TriggerGroup") + .HasDatabaseName("IDX_QRTZ_FT_TRIG_GROUP"); + + b.HasIndex("TriggerName") + .HasDatabaseName("IDX_QRTZ_FT_TRIG_NAME"); + + b.HasIndex("SchedulerName", "TriggerName", "TriggerGroup") + .HasDatabaseName("IDX_QRTZ_FT_TRIG_NM_GP"); + + b.ToTable("QRTZ_FIRED_TRIGGERS", "quartz"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzJobDetail", b => + { + b.Property("SchedulerName") + .HasMaxLength(120) + .IsUnicode(true) + .HasColumnType("nvarchar(120)") + .HasColumnName("SCHED_NAME"); + + b.Property("JobName") + .HasMaxLength(150) + .IsUnicode(true) + .HasColumnType("nvarchar(150)") + .HasColumnName("JOB_NAME"); + + b.Property("JobGroup") + .HasMaxLength(150) + .IsUnicode(true) + .HasColumnType("nvarchar(150)") + .HasColumnName("JOB_GROUP"); + + b.Property("Description") + .HasMaxLength(250) + .IsUnicode(true) + .HasColumnType("nvarchar(250)") + .HasColumnName("DESCRIPTION"); + + b.Property("IsDurable") + .HasColumnType("bit") + .HasColumnName("IS_DURABLE"); + + b.Property("IsNonConcurrent") + .HasColumnType("bit") + .HasColumnName("IS_NONCONCURRENT"); + + b.Property("IsUpdateData") + .HasColumnType("bit") + .HasColumnName("IS_UPDATE_DATA"); + + b.Property("JobClassName") + .IsRequired() + .HasMaxLength(250) + .IsUnicode(true) + .HasColumnType("nvarchar(250)") + .HasColumnName("JOB_CLASS_NAME"); + + b.Property("JobData") + .HasColumnType("varbinary(max)") + .HasColumnName("JOB_DATA"); + + b.Property("RequestsRecovery") + .HasColumnType("bit") + .HasColumnName("REQUESTS_RECOVERY"); + + b.HasKey("SchedulerName", "JobName", "JobGroup"); + + b.HasIndex("RequestsRecovery") + .HasDatabaseName("IDX_QRTZ_J_REQ_RECOVERY"); + + b.ToTable("QRTZ_JOB_DETAILS", "quartz"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzLock", b => + { + b.Property("SchedulerName") + .HasMaxLength(120) + .IsUnicode(true) + .HasColumnType("nvarchar(120)") + .HasColumnName("SCHED_NAME"); + + b.Property("LockName") + .HasMaxLength(40) + .IsUnicode(true) + .HasColumnType("nvarchar(40)") + .HasColumnName("LOCK_NAME"); + + b.HasKey("SchedulerName", "LockName"); + + b.ToTable("QRTZ_LOCKS", "quartz"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzPausedTriggerGroup", b => + { + b.Property("SchedulerName") + .HasMaxLength(120) + .IsUnicode(true) + .HasColumnType("nvarchar(120)") + .HasColumnName("SCHED_NAME"); + + b.Property("TriggerGroup") + .HasMaxLength(150) + .IsUnicode(true) + .HasColumnType("nvarchar(150)") + .HasColumnName("TRIGGER_GROUP"); + + b.HasKey("SchedulerName", "TriggerGroup"); + + b.ToTable("QRTZ_PAUSED_TRIGGER_GRPS", "quartz"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSchedulerState", b => + { + b.Property("SchedulerName") + .HasMaxLength(120) + .IsUnicode(true) + .HasColumnType("nvarchar(120)") + .HasColumnName("SCHED_NAME"); + + b.Property("InstanceName") + .HasMaxLength(200) + .IsUnicode(true) + .HasColumnType("nvarchar(200)") + .HasColumnName("INSTANCE_NAME"); + + b.Property("CheckInInterval") + .HasColumnType("bigint") + .HasColumnName("CHECKIN_INTERVAL"); + + b.Property("LastCheckInTime") + .HasColumnType("bigint") + .HasColumnName("LAST_CHECKIN_TIME"); + + b.HasKey("SchedulerName", "InstanceName"); + + b.ToTable("QRTZ_SCHEDULER_STATE", "quartz"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSimplePropertyTrigger", b => + { + b.Property("SchedulerName") + .HasMaxLength(120) + .IsUnicode(true) + .HasColumnType("nvarchar(120)") + .HasColumnName("SCHED_NAME"); + + b.Property("TriggerName") + .HasMaxLength(150) + .IsUnicode(true) + .HasColumnType("nvarchar(150)") + .HasColumnName("TRIGGER_NAME"); + + b.Property("TriggerGroup") + .HasMaxLength(150) + .IsUnicode(true) + .HasColumnType("nvarchar(150)") + .HasColumnName("TRIGGER_GROUP"); + + b.Property("BooleanProperty1") + .HasColumnType("bit") + .HasColumnName("BOOL_PROP_1"); + + b.Property("BooleanProperty2") + .HasColumnType("bit") + .HasColumnName("BOOL_PROP_2"); + + b.Property("DecimalProperty1") + .HasColumnType("numeric(13,4)") + .HasColumnName("DEC_PROP_1"); + + b.Property("DecimalProperty2") + .HasColumnType("numeric(13,4)") + .HasColumnName("DEC_PROP_2"); + + b.Property("IntegerProperty1") + .HasColumnType("int") + .HasColumnName("INT_PROP_1"); + + b.Property("IntegerProperty2") + .HasColumnType("int") + .HasColumnName("INT_PROP_2"); + + b.Property("LongProperty1") + .HasColumnType("bigint") + .HasColumnName("LONG_PROP_1"); + + b.Property("LongProperty2") + .HasColumnType("bigint") + .HasColumnName("LONG_PROP_2"); + + b.Property("StringProperty1") + .IsRequired() + .HasMaxLength(512) + .IsUnicode(true) + .HasColumnType("nvarchar(512)") + .HasColumnName("STR_PROP_1"); + + b.Property("StringProperty2") + .IsRequired() + .HasMaxLength(512) + .IsUnicode(true) + .HasColumnType("nvarchar(512)") + .HasColumnName("STR_PROP_2"); + + b.Property("StringProperty3") + .IsRequired() + .HasMaxLength(512) + .IsUnicode(true) + .HasColumnType("nvarchar(512)") + .HasColumnName("STR_PROP_3"); + + b.Property("TimeZoneId") + .HasMaxLength(80) + .IsUnicode(true) + .HasColumnType("nvarchar(80)") + .HasColumnName("TIME_ZONE_ID"); + + b.HasKey("SchedulerName", "TriggerName", "TriggerGroup"); + + b.ToTable("QRTZ_SIMPROP_TRIGGERS", "quartz"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSimpleTrigger", b => + { + b.Property("SchedulerName") + .HasMaxLength(120) + .IsUnicode(true) + .HasColumnType("nvarchar(120)") + .HasColumnName("SCHED_NAME"); + + b.Property("TriggerName") + .HasMaxLength(150) + .IsUnicode(true) + .HasColumnType("nvarchar(150)") + .HasColumnName("TRIGGER_NAME"); + + b.Property("TriggerGroup") + .HasMaxLength(150) + .IsUnicode(true) + .HasColumnType("nvarchar(150)") + .HasColumnName("TRIGGER_GROUP"); + + b.Property("RepeatCount") + .HasColumnType("bigint") + .HasColumnName("REPEAT_COUNT"); + + b.Property("RepeatInterval") + .HasColumnType("bigint") + .HasColumnName("REPEAT_INTERVAL"); + + b.Property("TimesTriggered") + .HasColumnType("bigint") + .HasColumnName("TIMES_TRIGGERED"); + + b.HasKey("SchedulerName", "TriggerName", "TriggerGroup"); + + b.ToTable("QRTZ_SIMPLE_TRIGGERS", "quartz"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", b => + { + b.Property("SchedulerName") + .HasMaxLength(120) + .IsUnicode(true) + .HasColumnType("nvarchar(120)") + .HasColumnName("SCHED_NAME"); + + b.Property("TriggerName") + .HasMaxLength(150) + .IsUnicode(true) + .HasColumnType("nvarchar(150)") + .HasColumnName("TRIGGER_NAME"); + + b.Property("TriggerGroup") + .HasMaxLength(150) + .IsUnicode(true) + .HasColumnType("nvarchar(150)") + .HasColumnName("TRIGGER_GROUP"); + + b.Property("CalendarName") + .HasMaxLength(200) + .IsUnicode(true) + .HasColumnType("nvarchar(200)") + .HasColumnName("CALENDAR_NAME"); + + b.Property("Description") + .HasMaxLength(250) + .IsUnicode(true) + .HasColumnType("nvarchar(250)") + .HasColumnName("DESCRIPTION"); + + b.Property("EndTime") + .HasColumnType("bigint") + .HasColumnName("END_TIME"); + + b.Property("JobData") + .HasColumnType("varbinary(max)") + .HasColumnName("JOB_DATA"); + + b.Property("JobGroup") + .IsRequired() + .HasMaxLength(150) + .IsUnicode(true) + .HasColumnType("nvarchar(150)") + .HasColumnName("JOB_GROUP"); + + b.Property("JobName") + .IsRequired() + .HasMaxLength(150) + .IsUnicode(true) + .HasColumnType("nvarchar(150)") + .HasColumnName("JOB_NAME"); + + b.Property("MisfireInstruction") + .HasColumnType("smallint") + .HasColumnName("MISFIRE_INSTR"); + + b.Property("NextFireTime") + .HasColumnType("bigint") + .HasColumnName("NEXT_FIRE_TIME"); + + b.Property("PreviousFireTime") + .HasColumnType("bigint") + .HasColumnName("PREV_FIRE_TIME"); + + b.Property("Priority") + .HasColumnType("int") + .HasColumnName("PRIORITY"); + + b.Property("StartTime") + .HasColumnType("bigint") + .HasColumnName("START_TIME"); + + b.Property("TriggerState") + .IsRequired() + .HasMaxLength(16) + .IsUnicode(true) + .HasColumnType("nvarchar(16)") + .HasColumnName("TRIGGER_STATE"); + + b.Property("TriggerType") + .IsRequired() + .HasMaxLength(8) + .IsUnicode(true) + .HasColumnType("nvarchar(8)") + .HasColumnName("TRIGGER_TYPE"); + + b.HasKey("SchedulerName", "TriggerName", "TriggerGroup"); + + b.HasIndex("NextFireTime") + .HasDatabaseName("IDX_QRTZ_T_NEXT_FIRE_TIME"); + + b.HasIndex("TriggerState") + .HasDatabaseName("IDX_QRTZ_T_STATE"); + + b.HasIndex("NextFireTime", "TriggerState") + .HasDatabaseName("IDX_QRTZ_T_NFT_ST"); + + b.HasIndex("SchedulerName", "JobName", "JobGroup"); + + b.ToTable("QRTZ_TRIGGERS", "quartz"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzBlobTrigger", b => + { + b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", "Trigger") + .WithMany("BlobTriggers") + .HasForeignKey("SchedulerName", "TriggerName", "TriggerGroup") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Trigger"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzCronTrigger", b => + { + b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", "Trigger") + .WithMany("CronTriggers") + .HasForeignKey("SchedulerName", "TriggerName", "TriggerGroup") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Trigger"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSimplePropertyTrigger", b => + { + b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", "Trigger") + .WithMany("SimplePropertyTriggers") + .HasForeignKey("SchedulerName", "TriggerName", "TriggerGroup") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Trigger"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSimpleTrigger", b => + { + b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", "Trigger") + .WithMany("SimpleTriggers") + .HasForeignKey("SchedulerName", "TriggerName", "TriggerGroup") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Trigger"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", b => + { + b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzJobDetail", "JobDetail") + .WithMany("Triggers") + .HasForeignKey("SchedulerName", "JobName", "JobGroup") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("JobDetail"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzJobDetail", b => + { + b.Navigation("Triggers"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", b => + { + b.Navigation("BlobTriggers"); + + b.Navigation("CronTriggers"); + + b.Navigation("SimplePropertyTriggers"); + + b.Navigation("SimpleTriggers"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/modules/Elsa.Quartz.EntityFrameworkCore.SqlServer/Migrations/20231029143236_AddQuartz.cs b/src/modules/Elsa.Quartz.EntityFrameworkCore.SqlServer/Migrations/20231029143236_AddQuartz.cs new file mode 100644 index 000000000..cbd86e835 --- /dev/null +++ b/src/modules/Elsa.Quartz.EntityFrameworkCore.SqlServer/Migrations/20231029143236_AddQuartz.cs @@ -0,0 +1,373 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Elsa.Quartz.EntityFrameworkCore.SqlServer.Migrations +{ + /// + public partial class AddQuartz : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.EnsureSchema( + name: "quartz"); + + migrationBuilder.CreateTable( + name: "QRTZ_CALENDARS", + schema: "quartz", + columns: table => new + { + SCHED_NAME = table.Column(type: "nvarchar(120)", maxLength: 120, nullable: false), + CALENDAR_NAME = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: false), + CALENDAR = table.Column(type: "varbinary(max)", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_QRTZ_CALENDARS", x => new { x.SCHED_NAME, x.CALENDAR_NAME }); + }); + + migrationBuilder.CreateTable( + name: "QRTZ_FIRED_TRIGGERS", + schema: "quartz", + columns: table => new + { + SCHED_NAME = table.Column(type: "nvarchar(120)", maxLength: 120, nullable: false), + ENTRY_ID = table.Column(type: "nvarchar(140)", maxLength: 140, nullable: false), + TRIGGER_NAME = table.Column(type: "nvarchar(150)", maxLength: 150, nullable: false), + TRIGGER_GROUP = table.Column(type: "nvarchar(150)", maxLength: 150, nullable: false), + INSTANCE_NAME = table.Column(type: "nvarchar(150)", maxLength: 150, nullable: false), + FIRED_TIME = table.Column(type: "bigint", nullable: false), + SCHED_TIME = table.Column(type: "bigint", nullable: false), + PRIORITY = table.Column(type: "int", nullable: false), + STATE = table.Column(type: "nvarchar(16)", maxLength: 16, nullable: false), + JOB_NAME = table.Column(type: "nvarchar(150)", maxLength: 150, nullable: true), + JOB_GROUP = table.Column(type: "nvarchar(150)", maxLength: 150, nullable: true), + IS_NONCONCURRENT = table.Column(type: "bit", nullable: false), + REQUESTS_RECOVERY = table.Column(type: "bit", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_QRTZ_FIRED_TRIGGERS", x => new { x.SCHED_NAME, x.ENTRY_ID }); + }); + + migrationBuilder.CreateTable( + name: "QRTZ_JOB_DETAILS", + schema: "quartz", + columns: table => new + { + SCHED_NAME = table.Column(type: "nvarchar(120)", maxLength: 120, nullable: false), + JOB_NAME = table.Column(type: "nvarchar(150)", maxLength: 150, nullable: false), + JOB_GROUP = table.Column(type: "nvarchar(150)", maxLength: 150, nullable: false), + DESCRIPTION = table.Column(type: "nvarchar(250)", maxLength: 250, nullable: true), + JOB_CLASS_NAME = table.Column(type: "nvarchar(250)", maxLength: 250, nullable: false), + IS_DURABLE = table.Column(type: "bit", nullable: false), + IS_NONCONCURRENT = table.Column(type: "bit", nullable: false), + IS_UPDATE_DATA = table.Column(type: "bit", nullable: false), + REQUESTS_RECOVERY = table.Column(type: "bit", nullable: false), + JOB_DATA = table.Column(type: "varbinary(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_QRTZ_JOB_DETAILS", x => new { x.SCHED_NAME, x.JOB_NAME, x.JOB_GROUP }); + }); + + migrationBuilder.CreateTable( + name: "QRTZ_LOCKS", + schema: "quartz", + columns: table => new + { + SCHED_NAME = table.Column(type: "nvarchar(120)", maxLength: 120, nullable: false), + LOCK_NAME = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_QRTZ_LOCKS", x => new { x.SCHED_NAME, x.LOCK_NAME }); + }); + + migrationBuilder.CreateTable( + name: "QRTZ_PAUSED_TRIGGER_GRPS", + schema: "quartz", + columns: table => new + { + SCHED_NAME = table.Column(type: "nvarchar(120)", maxLength: 120, nullable: false), + TRIGGER_GROUP = table.Column(type: "nvarchar(150)", maxLength: 150, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_QRTZ_PAUSED_TRIGGER_GRPS", x => new { x.SCHED_NAME, x.TRIGGER_GROUP }); + }); + + migrationBuilder.CreateTable( + name: "QRTZ_SCHEDULER_STATE", + schema: "quartz", + columns: table => new + { + SCHED_NAME = table.Column(type: "nvarchar(120)", maxLength: 120, nullable: false), + INSTANCE_NAME = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: false), + LAST_CHECKIN_TIME = table.Column(type: "bigint", nullable: false), + CHECKIN_INTERVAL = table.Column(type: "bigint", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_QRTZ_SCHEDULER_STATE", x => new { x.SCHED_NAME, x.INSTANCE_NAME }); + }); + + migrationBuilder.CreateTable( + name: "QRTZ_TRIGGERS", + schema: "quartz", + columns: table => new + { + SCHED_NAME = table.Column(type: "nvarchar(120)", maxLength: 120, nullable: false), + TRIGGER_NAME = table.Column(type: "nvarchar(150)", maxLength: 150, nullable: false), + TRIGGER_GROUP = table.Column(type: "nvarchar(150)", maxLength: 150, nullable: false), + JOB_NAME = table.Column(type: "nvarchar(150)", maxLength: 150, nullable: false), + JOB_GROUP = table.Column(type: "nvarchar(150)", maxLength: 150, nullable: false), + DESCRIPTION = table.Column(type: "nvarchar(250)", maxLength: 250, nullable: true), + NEXT_FIRE_TIME = table.Column(type: "bigint", nullable: true), + PREV_FIRE_TIME = table.Column(type: "bigint", nullable: true), + PRIORITY = table.Column(type: "int", nullable: true), + TRIGGER_STATE = table.Column(type: "nvarchar(16)", maxLength: 16, nullable: false), + TRIGGER_TYPE = table.Column(type: "nvarchar(8)", maxLength: 8, nullable: false), + START_TIME = table.Column(type: "bigint", nullable: false), + END_TIME = table.Column(type: "bigint", nullable: true), + CALENDAR_NAME = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: true), + MISFIRE_INSTR = table.Column(type: "smallint", nullable: true), + JOB_DATA = table.Column(type: "varbinary(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_QRTZ_TRIGGERS", x => new { x.SCHED_NAME, x.TRIGGER_NAME, x.TRIGGER_GROUP }); + table.ForeignKey( + name: "FK_QRTZ_TRIGGERS_QRTZ_JOB_DETAILS_SCHED_NAME_JOB_NAME_JOB_GROUP", + columns: x => new { x.SCHED_NAME, x.JOB_NAME, x.JOB_GROUP }, + principalSchema: "quartz", + principalTable: "QRTZ_JOB_DETAILS", + principalColumns: new[] { "SCHED_NAME", "JOB_NAME", "JOB_GROUP" }, + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "QRTZ_BLOB_TRIGGERS", + schema: "quartz", + columns: table => new + { + SCHED_NAME = table.Column(type: "nvarchar(120)", maxLength: 120, nullable: false), + TRIGGER_NAME = table.Column(type: "nvarchar(150)", maxLength: 150, nullable: false), + TRIGGER_GROUP = table.Column(type: "nvarchar(150)", maxLength: 150, nullable: false), + BLOB_DATA = table.Column(type: "varbinary(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_QRTZ_BLOB_TRIGGERS", x => new { x.SCHED_NAME, x.TRIGGER_NAME, x.TRIGGER_GROUP }); + table.ForeignKey( + name: "FK_QRTZ_BLOB_TRIGGERS_QRTZ_TRIGGERS_SCHED_NAME_TRIGGER_NAME_TRIGGER_GROUP", + columns: x => new { x.SCHED_NAME, x.TRIGGER_NAME, x.TRIGGER_GROUP }, + principalSchema: "quartz", + principalTable: "QRTZ_TRIGGERS", + principalColumns: new[] { "SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP" }, + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "QRTZ_CRON_TRIGGERS", + schema: "quartz", + columns: table => new + { + SCHED_NAME = table.Column(type: "nvarchar(120)", maxLength: 120, nullable: false), + TRIGGER_NAME = table.Column(type: "nvarchar(150)", maxLength: 150, nullable: false), + TRIGGER_GROUP = table.Column(type: "nvarchar(150)", maxLength: 150, nullable: false), + CRON_EXPRESSION = table.Column(type: "nvarchar(120)", maxLength: 120, nullable: false), + TIME_ZONE_ID = table.Column(type: "nvarchar(120)", maxLength: 120, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_QRTZ_CRON_TRIGGERS", x => new { x.SCHED_NAME, x.TRIGGER_NAME, x.TRIGGER_GROUP }); + table.ForeignKey( + name: "FK_QRTZ_CRON_TRIGGERS_QRTZ_TRIGGERS_SCHED_NAME_TRIGGER_NAME_TRIGGER_GROUP", + columns: x => new { x.SCHED_NAME, x.TRIGGER_NAME, x.TRIGGER_GROUP }, + principalSchema: "quartz", + principalTable: "QRTZ_TRIGGERS", + principalColumns: new[] { "SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP" }, + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "QRTZ_SIMPLE_TRIGGERS", + schema: "quartz", + columns: table => new + { + SCHED_NAME = table.Column(type: "nvarchar(120)", maxLength: 120, nullable: false), + TRIGGER_NAME = table.Column(type: "nvarchar(150)", maxLength: 150, nullable: false), + TRIGGER_GROUP = table.Column(type: "nvarchar(150)", maxLength: 150, nullable: false), + REPEAT_COUNT = table.Column(type: "bigint", nullable: false), + REPEAT_INTERVAL = table.Column(type: "bigint", nullable: false), + TIMES_TRIGGERED = table.Column(type: "bigint", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_QRTZ_SIMPLE_TRIGGERS", x => new { x.SCHED_NAME, x.TRIGGER_NAME, x.TRIGGER_GROUP }); + table.ForeignKey( + name: "FK_QRTZ_SIMPLE_TRIGGERS_QRTZ_TRIGGERS_SCHED_NAME_TRIGGER_NAME_TRIGGER_GROUP", + columns: x => new { x.SCHED_NAME, x.TRIGGER_NAME, x.TRIGGER_GROUP }, + principalSchema: "quartz", + principalTable: "QRTZ_TRIGGERS", + principalColumns: new[] { "SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP" }, + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "QRTZ_SIMPROP_TRIGGERS", + schema: "quartz", + columns: table => new + { + SCHED_NAME = table.Column(type: "nvarchar(120)", maxLength: 120, nullable: false), + TRIGGER_NAME = table.Column(type: "nvarchar(150)", maxLength: 150, nullable: false), + TRIGGER_GROUP = table.Column(type: "nvarchar(150)", maxLength: 150, nullable: false), + STR_PROP_1 = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: false), + STR_PROP_2 = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: false), + STR_PROP_3 = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: false), + INT_PROP_1 = table.Column(type: "int", nullable: true), + INT_PROP_2 = table.Column(type: "int", nullable: true), + LONG_PROP_1 = table.Column(type: "bigint", nullable: true), + LONG_PROP_2 = table.Column(type: "bigint", nullable: true), + DEC_PROP_1 = table.Column(type: "numeric(13,4)", nullable: true), + DEC_PROP_2 = table.Column(type: "numeric(13,4)", nullable: true), + BOOL_PROP_1 = table.Column(type: "bit", nullable: true), + BOOL_PROP_2 = table.Column(type: "bit", nullable: true), + TIME_ZONE_ID = table.Column(type: "nvarchar(80)", maxLength: 80, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_QRTZ_SIMPROP_TRIGGERS", x => new { x.SCHED_NAME, x.TRIGGER_NAME, x.TRIGGER_GROUP }); + table.ForeignKey( + name: "FK_QRTZ_SIMPROP_TRIGGERS_QRTZ_TRIGGERS_SCHED_NAME_TRIGGER_NAME_TRIGGER_GROUP", + columns: x => new { x.SCHED_NAME, x.TRIGGER_NAME, x.TRIGGER_GROUP }, + principalSchema: "quartz", + principalTable: "QRTZ_TRIGGERS", + principalColumns: new[] { "SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP" }, + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IDX_QRTZ_FT_JOB_GROUP", + schema: "quartz", + table: "QRTZ_FIRED_TRIGGERS", + column: "JOB_GROUP"); + + migrationBuilder.CreateIndex( + name: "IDX_QRTZ_FT_JOB_NAME", + schema: "quartz", + table: "QRTZ_FIRED_TRIGGERS", + column: "JOB_NAME"); + + migrationBuilder.CreateIndex( + name: "IDX_QRTZ_FT_JOB_REQ_RECOVERY", + schema: "quartz", + table: "QRTZ_FIRED_TRIGGERS", + column: "REQUESTS_RECOVERY"); + + migrationBuilder.CreateIndex( + name: "IDX_QRTZ_FT_TRIG_GROUP", + schema: "quartz", + table: "QRTZ_FIRED_TRIGGERS", + column: "TRIGGER_GROUP"); + + migrationBuilder.CreateIndex( + name: "IDX_QRTZ_FT_TRIG_INST_NAME", + schema: "quartz", + table: "QRTZ_FIRED_TRIGGERS", + column: "INSTANCE_NAME"); + + migrationBuilder.CreateIndex( + name: "IDX_QRTZ_FT_TRIG_NAME", + schema: "quartz", + table: "QRTZ_FIRED_TRIGGERS", + column: "TRIGGER_NAME"); + + migrationBuilder.CreateIndex( + name: "IDX_QRTZ_FT_TRIG_NM_GP", + schema: "quartz", + table: "QRTZ_FIRED_TRIGGERS", + columns: new[] { "SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP" }); + + migrationBuilder.CreateIndex( + name: "IDX_QRTZ_J_REQ_RECOVERY", + schema: "quartz", + table: "QRTZ_JOB_DETAILS", + column: "REQUESTS_RECOVERY"); + + migrationBuilder.CreateIndex( + name: "IDX_QRTZ_T_NEXT_FIRE_TIME", + schema: "quartz", + table: "QRTZ_TRIGGERS", + column: "NEXT_FIRE_TIME"); + + migrationBuilder.CreateIndex( + name: "IDX_QRTZ_T_NFT_ST", + schema: "quartz", + table: "QRTZ_TRIGGERS", + columns: new[] { "NEXT_FIRE_TIME", "TRIGGER_STATE" }); + + migrationBuilder.CreateIndex( + name: "IDX_QRTZ_T_STATE", + schema: "quartz", + table: "QRTZ_TRIGGERS", + column: "TRIGGER_STATE"); + + migrationBuilder.CreateIndex( + name: "IX_QRTZ_TRIGGERS_SCHED_NAME_JOB_NAME_JOB_GROUP", + schema: "quartz", + table: "QRTZ_TRIGGERS", + columns: new[] { "SCHED_NAME", "JOB_NAME", "JOB_GROUP" }); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "QRTZ_BLOB_TRIGGERS", + schema: "quartz"); + + migrationBuilder.DropTable( + name: "QRTZ_CALENDARS", + schema: "quartz"); + + migrationBuilder.DropTable( + name: "QRTZ_CRON_TRIGGERS", + schema: "quartz"); + + migrationBuilder.DropTable( + name: "QRTZ_FIRED_TRIGGERS", + schema: "quartz"); + + migrationBuilder.DropTable( + name: "QRTZ_LOCKS", + schema: "quartz"); + + migrationBuilder.DropTable( + name: "QRTZ_PAUSED_TRIGGER_GRPS", + schema: "quartz"); + + migrationBuilder.DropTable( + name: "QRTZ_SCHEDULER_STATE", + schema: "quartz"); + + migrationBuilder.DropTable( + name: "QRTZ_SIMPLE_TRIGGERS", + schema: "quartz"); + + migrationBuilder.DropTable( + name: "QRTZ_SIMPROP_TRIGGERS", + schema: "quartz"); + + migrationBuilder.DropTable( + name: "QRTZ_TRIGGERS", + schema: "quartz"); + + migrationBuilder.DropTable( + name: "QRTZ_JOB_DETAILS", + schema: "quartz"); + } + } +} diff --git a/src/modules/Elsa.Quartz.EntityFrameworkCore.SqlServer/Migrations/SqlServerQuartzDbContextModelSnapshot.cs b/src/modules/Elsa.Quartz.EntityFrameworkCore.SqlServer/Migrations/SqlServerQuartzDbContextModelSnapshot.cs new file mode 100644 index 000000000..d0e7dd472 --- /dev/null +++ b/src/modules/Elsa.Quartz.EntityFrameworkCore.SqlServer/Migrations/SqlServerQuartzDbContextModelSnapshot.cs @@ -0,0 +1,640 @@ +// +using System; +using Elsa.Quartz.EntityFrameworkCore.SqlServer; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace Elsa.Quartz.EntityFrameworkCore.SqlServer.Migrations +{ + [DbContext(typeof(SqlServerQuartzDbContext))] + partial class SqlServerQuartzDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.13") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzBlobTrigger", b => + { + b.Property("SchedulerName") + .HasMaxLength(120) + .IsUnicode(true) + .HasColumnType("nvarchar(120)") + .HasColumnName("SCHED_NAME"); + + b.Property("TriggerName") + .HasMaxLength(150) + .IsUnicode(true) + .HasColumnType("nvarchar(150)") + .HasColumnName("TRIGGER_NAME"); + + b.Property("TriggerGroup") + .HasMaxLength(150) + .IsUnicode(true) + .HasColumnType("nvarchar(150)") + .HasColumnName("TRIGGER_GROUP"); + + b.Property("BlobData") + .HasColumnType("varbinary(max)") + .HasColumnName("BLOB_DATA"); + + b.HasKey("SchedulerName", "TriggerName", "TriggerGroup"); + + b.ToTable("QRTZ_BLOB_TRIGGERS", "quartz"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzCalendar", b => + { + b.Property("SchedulerName") + .HasMaxLength(120) + .IsUnicode(true) + .HasColumnType("nvarchar(120)") + .HasColumnName("SCHED_NAME"); + + b.Property("CalendarName") + .HasMaxLength(200) + .IsUnicode(true) + .HasColumnType("nvarchar(200)") + .HasColumnName("CALENDAR_NAME"); + + b.Property("Calendar") + .IsRequired() + .HasColumnType("varbinary(max)") + .HasColumnName("CALENDAR"); + + b.HasKey("SchedulerName", "CalendarName"); + + b.ToTable("QRTZ_CALENDARS", "quartz"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzCronTrigger", b => + { + b.Property("SchedulerName") + .HasMaxLength(120) + .IsUnicode(true) + .HasColumnType("nvarchar(120)") + .HasColumnName("SCHED_NAME"); + + b.Property("TriggerName") + .HasMaxLength(150) + .IsUnicode(true) + .HasColumnType("nvarchar(150)") + .HasColumnName("TRIGGER_NAME"); + + b.Property("TriggerGroup") + .HasMaxLength(150) + .IsUnicode(true) + .HasColumnType("nvarchar(150)") + .HasColumnName("TRIGGER_GROUP"); + + b.Property("CronExpression") + .IsRequired() + .HasMaxLength(120) + .IsUnicode(true) + .HasColumnType("nvarchar(120)") + .HasColumnName("CRON_EXPRESSION"); + + b.Property("TimeZoneId") + .HasMaxLength(120) + .IsUnicode(true) + .HasColumnType("nvarchar(120)") + .HasColumnName("TIME_ZONE_ID"); + + b.HasKey("SchedulerName", "TriggerName", "TriggerGroup"); + + b.ToTable("QRTZ_CRON_TRIGGERS", "quartz"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzFiredTrigger", b => + { + b.Property("SchedulerName") + .HasMaxLength(120) + .IsUnicode(true) + .HasColumnType("nvarchar(120)") + .HasColumnName("SCHED_NAME"); + + b.Property("EntryId") + .HasMaxLength(140) + .IsUnicode(true) + .HasColumnType("nvarchar(140)") + .HasColumnName("ENTRY_ID"); + + b.Property("FiredTime") + .HasColumnType("bigint") + .HasColumnName("FIRED_TIME"); + + b.Property("InstanceName") + .IsRequired() + .HasMaxLength(150) + .IsUnicode(true) + .HasColumnType("nvarchar(150)") + .HasColumnName("INSTANCE_NAME"); + + b.Property("IsNonConcurrent") + .HasColumnType("bit") + .HasColumnName("IS_NONCONCURRENT"); + + b.Property("JobGroup") + .HasMaxLength(150) + .IsUnicode(true) + .HasColumnType("nvarchar(150)") + .HasColumnName("JOB_GROUP"); + + b.Property("JobName") + .HasMaxLength(150) + .IsUnicode(true) + .HasColumnType("nvarchar(150)") + .HasColumnName("JOB_NAME"); + + b.Property("Priority") + .HasColumnType("int") + .HasColumnName("PRIORITY"); + + b.Property("RequestsRecovery") + .HasColumnType("bit") + .HasColumnName("REQUESTS_RECOVERY"); + + b.Property("ScheduledTime") + .HasColumnType("bigint") + .HasColumnName("SCHED_TIME"); + + b.Property("State") + .IsRequired() + .HasMaxLength(16) + .IsUnicode(true) + .HasColumnType("nvarchar(16)") + .HasColumnName("STATE"); + + b.Property("TriggerGroup") + .IsRequired() + .HasMaxLength(150) + .IsUnicode(true) + .HasColumnType("nvarchar(150)") + .HasColumnName("TRIGGER_GROUP"); + + b.Property("TriggerName") + .IsRequired() + .HasMaxLength(150) + .IsUnicode(true) + .HasColumnType("nvarchar(150)") + .HasColumnName("TRIGGER_NAME"); + + b.HasKey("SchedulerName", "EntryId"); + + b.HasIndex("InstanceName") + .HasDatabaseName("IDX_QRTZ_FT_TRIG_INST_NAME"); + + b.HasIndex("JobGroup") + .HasDatabaseName("IDX_QRTZ_FT_JOB_GROUP"); + + b.HasIndex("JobName") + .HasDatabaseName("IDX_QRTZ_FT_JOB_NAME"); + + b.HasIndex("RequestsRecovery") + .HasDatabaseName("IDX_QRTZ_FT_JOB_REQ_RECOVERY"); + + b.HasIndex("TriggerGroup") + .HasDatabaseName("IDX_QRTZ_FT_TRIG_GROUP"); + + b.HasIndex("TriggerName") + .HasDatabaseName("IDX_QRTZ_FT_TRIG_NAME"); + + b.HasIndex("SchedulerName", "TriggerName", "TriggerGroup") + .HasDatabaseName("IDX_QRTZ_FT_TRIG_NM_GP"); + + b.ToTable("QRTZ_FIRED_TRIGGERS", "quartz"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzJobDetail", b => + { + b.Property("SchedulerName") + .HasMaxLength(120) + .IsUnicode(true) + .HasColumnType("nvarchar(120)") + .HasColumnName("SCHED_NAME"); + + b.Property("JobName") + .HasMaxLength(150) + .IsUnicode(true) + .HasColumnType("nvarchar(150)") + .HasColumnName("JOB_NAME"); + + b.Property("JobGroup") + .HasMaxLength(150) + .IsUnicode(true) + .HasColumnType("nvarchar(150)") + .HasColumnName("JOB_GROUP"); + + b.Property("Description") + .HasMaxLength(250) + .IsUnicode(true) + .HasColumnType("nvarchar(250)") + .HasColumnName("DESCRIPTION"); + + b.Property("IsDurable") + .HasColumnType("bit") + .HasColumnName("IS_DURABLE"); + + b.Property("IsNonConcurrent") + .HasColumnType("bit") + .HasColumnName("IS_NONCONCURRENT"); + + b.Property("IsUpdateData") + .HasColumnType("bit") + .HasColumnName("IS_UPDATE_DATA"); + + b.Property("JobClassName") + .IsRequired() + .HasMaxLength(250) + .IsUnicode(true) + .HasColumnType("nvarchar(250)") + .HasColumnName("JOB_CLASS_NAME"); + + b.Property("JobData") + .HasColumnType("varbinary(max)") + .HasColumnName("JOB_DATA"); + + b.Property("RequestsRecovery") + .HasColumnType("bit") + .HasColumnName("REQUESTS_RECOVERY"); + + b.HasKey("SchedulerName", "JobName", "JobGroup"); + + b.HasIndex("RequestsRecovery") + .HasDatabaseName("IDX_QRTZ_J_REQ_RECOVERY"); + + b.ToTable("QRTZ_JOB_DETAILS", "quartz"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzLock", b => + { + b.Property("SchedulerName") + .HasMaxLength(120) + .IsUnicode(true) + .HasColumnType("nvarchar(120)") + .HasColumnName("SCHED_NAME"); + + b.Property("LockName") + .HasMaxLength(40) + .IsUnicode(true) + .HasColumnType("nvarchar(40)") + .HasColumnName("LOCK_NAME"); + + b.HasKey("SchedulerName", "LockName"); + + b.ToTable("QRTZ_LOCKS", "quartz"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzPausedTriggerGroup", b => + { + b.Property("SchedulerName") + .HasMaxLength(120) + .IsUnicode(true) + .HasColumnType("nvarchar(120)") + .HasColumnName("SCHED_NAME"); + + b.Property("TriggerGroup") + .HasMaxLength(150) + .IsUnicode(true) + .HasColumnType("nvarchar(150)") + .HasColumnName("TRIGGER_GROUP"); + + b.HasKey("SchedulerName", "TriggerGroup"); + + b.ToTable("QRTZ_PAUSED_TRIGGER_GRPS", "quartz"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSchedulerState", b => + { + b.Property("SchedulerName") + .HasMaxLength(120) + .IsUnicode(true) + .HasColumnType("nvarchar(120)") + .HasColumnName("SCHED_NAME"); + + b.Property("InstanceName") + .HasMaxLength(200) + .IsUnicode(true) + .HasColumnType("nvarchar(200)") + .HasColumnName("INSTANCE_NAME"); + + b.Property("CheckInInterval") + .HasColumnType("bigint") + .HasColumnName("CHECKIN_INTERVAL"); + + b.Property("LastCheckInTime") + .HasColumnType("bigint") + .HasColumnName("LAST_CHECKIN_TIME"); + + b.HasKey("SchedulerName", "InstanceName"); + + b.ToTable("QRTZ_SCHEDULER_STATE", "quartz"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSimplePropertyTrigger", b => + { + b.Property("SchedulerName") + .HasMaxLength(120) + .IsUnicode(true) + .HasColumnType("nvarchar(120)") + .HasColumnName("SCHED_NAME"); + + b.Property("TriggerName") + .HasMaxLength(150) + .IsUnicode(true) + .HasColumnType("nvarchar(150)") + .HasColumnName("TRIGGER_NAME"); + + b.Property("TriggerGroup") + .HasMaxLength(150) + .IsUnicode(true) + .HasColumnType("nvarchar(150)") + .HasColumnName("TRIGGER_GROUP"); + + b.Property("BooleanProperty1") + .HasColumnType("bit") + .HasColumnName("BOOL_PROP_1"); + + b.Property("BooleanProperty2") + .HasColumnType("bit") + .HasColumnName("BOOL_PROP_2"); + + b.Property("DecimalProperty1") + .HasColumnType("numeric(13,4)") + .HasColumnName("DEC_PROP_1"); + + b.Property("DecimalProperty2") + .HasColumnType("numeric(13,4)") + .HasColumnName("DEC_PROP_2"); + + b.Property("IntegerProperty1") + .HasColumnType("int") + .HasColumnName("INT_PROP_1"); + + b.Property("IntegerProperty2") + .HasColumnType("int") + .HasColumnName("INT_PROP_2"); + + b.Property("LongProperty1") + .HasColumnType("bigint") + .HasColumnName("LONG_PROP_1"); + + b.Property("LongProperty2") + .HasColumnType("bigint") + .HasColumnName("LONG_PROP_2"); + + b.Property("StringProperty1") + .IsRequired() + .HasMaxLength(512) + .IsUnicode(true) + .HasColumnType("nvarchar(512)") + .HasColumnName("STR_PROP_1"); + + b.Property("StringProperty2") + .IsRequired() + .HasMaxLength(512) + .IsUnicode(true) + .HasColumnType("nvarchar(512)") + .HasColumnName("STR_PROP_2"); + + b.Property("StringProperty3") + .IsRequired() + .HasMaxLength(512) + .IsUnicode(true) + .HasColumnType("nvarchar(512)") + .HasColumnName("STR_PROP_3"); + + b.Property("TimeZoneId") + .HasMaxLength(80) + .IsUnicode(true) + .HasColumnType("nvarchar(80)") + .HasColumnName("TIME_ZONE_ID"); + + b.HasKey("SchedulerName", "TriggerName", "TriggerGroup"); + + b.ToTable("QRTZ_SIMPROP_TRIGGERS", "quartz"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSimpleTrigger", b => + { + b.Property("SchedulerName") + .HasMaxLength(120) + .IsUnicode(true) + .HasColumnType("nvarchar(120)") + .HasColumnName("SCHED_NAME"); + + b.Property("TriggerName") + .HasMaxLength(150) + .IsUnicode(true) + .HasColumnType("nvarchar(150)") + .HasColumnName("TRIGGER_NAME"); + + b.Property("TriggerGroup") + .HasMaxLength(150) + .IsUnicode(true) + .HasColumnType("nvarchar(150)") + .HasColumnName("TRIGGER_GROUP"); + + b.Property("RepeatCount") + .HasColumnType("bigint") + .HasColumnName("REPEAT_COUNT"); + + b.Property("RepeatInterval") + .HasColumnType("bigint") + .HasColumnName("REPEAT_INTERVAL"); + + b.Property("TimesTriggered") + .HasColumnType("bigint") + .HasColumnName("TIMES_TRIGGERED"); + + b.HasKey("SchedulerName", "TriggerName", "TriggerGroup"); + + b.ToTable("QRTZ_SIMPLE_TRIGGERS", "quartz"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", b => + { + b.Property("SchedulerName") + .HasMaxLength(120) + .IsUnicode(true) + .HasColumnType("nvarchar(120)") + .HasColumnName("SCHED_NAME"); + + b.Property("TriggerName") + .HasMaxLength(150) + .IsUnicode(true) + .HasColumnType("nvarchar(150)") + .HasColumnName("TRIGGER_NAME"); + + b.Property("TriggerGroup") + .HasMaxLength(150) + .IsUnicode(true) + .HasColumnType("nvarchar(150)") + .HasColumnName("TRIGGER_GROUP"); + + b.Property("CalendarName") + .HasMaxLength(200) + .IsUnicode(true) + .HasColumnType("nvarchar(200)") + .HasColumnName("CALENDAR_NAME"); + + b.Property("Description") + .HasMaxLength(250) + .IsUnicode(true) + .HasColumnType("nvarchar(250)") + .HasColumnName("DESCRIPTION"); + + b.Property("EndTime") + .HasColumnType("bigint") + .HasColumnName("END_TIME"); + + b.Property("JobData") + .HasColumnType("varbinary(max)") + .HasColumnName("JOB_DATA"); + + b.Property("JobGroup") + .IsRequired() + .HasMaxLength(150) + .IsUnicode(true) + .HasColumnType("nvarchar(150)") + .HasColumnName("JOB_GROUP"); + + b.Property("JobName") + .IsRequired() + .HasMaxLength(150) + .IsUnicode(true) + .HasColumnType("nvarchar(150)") + .HasColumnName("JOB_NAME"); + + b.Property("MisfireInstruction") + .HasColumnType("smallint") + .HasColumnName("MISFIRE_INSTR"); + + b.Property("NextFireTime") + .HasColumnType("bigint") + .HasColumnName("NEXT_FIRE_TIME"); + + b.Property("PreviousFireTime") + .HasColumnType("bigint") + .HasColumnName("PREV_FIRE_TIME"); + + b.Property("Priority") + .HasColumnType("int") + .HasColumnName("PRIORITY"); + + b.Property("StartTime") + .HasColumnType("bigint") + .HasColumnName("START_TIME"); + + b.Property("TriggerState") + .IsRequired() + .HasMaxLength(16) + .IsUnicode(true) + .HasColumnType("nvarchar(16)") + .HasColumnName("TRIGGER_STATE"); + + b.Property("TriggerType") + .IsRequired() + .HasMaxLength(8) + .IsUnicode(true) + .HasColumnType("nvarchar(8)") + .HasColumnName("TRIGGER_TYPE"); + + b.HasKey("SchedulerName", "TriggerName", "TriggerGroup"); + + b.HasIndex("NextFireTime") + .HasDatabaseName("IDX_QRTZ_T_NEXT_FIRE_TIME"); + + b.HasIndex("TriggerState") + .HasDatabaseName("IDX_QRTZ_T_STATE"); + + b.HasIndex("NextFireTime", "TriggerState") + .HasDatabaseName("IDX_QRTZ_T_NFT_ST"); + + b.HasIndex("SchedulerName", "JobName", "JobGroup"); + + b.ToTable("QRTZ_TRIGGERS", "quartz"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzBlobTrigger", b => + { + b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", "Trigger") + .WithMany("BlobTriggers") + .HasForeignKey("SchedulerName", "TriggerName", "TriggerGroup") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Trigger"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzCronTrigger", b => + { + b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", "Trigger") + .WithMany("CronTriggers") + .HasForeignKey("SchedulerName", "TriggerName", "TriggerGroup") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Trigger"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSimplePropertyTrigger", b => + { + b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", "Trigger") + .WithMany("SimplePropertyTriggers") + .HasForeignKey("SchedulerName", "TriggerName", "TriggerGroup") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Trigger"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSimpleTrigger", b => + { + b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", "Trigger") + .WithMany("SimpleTriggers") + .HasForeignKey("SchedulerName", "TriggerName", "TriggerGroup") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Trigger"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", b => + { + b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzJobDetail", "JobDetail") + .WithMany("Triggers") + .HasForeignKey("SchedulerName", "JobName", "JobGroup") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("JobDetail"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzJobDetail", b => + { + b.Navigation("Triggers"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", b => + { + b.Navigation("BlobTriggers"); + + b.Navigation("CronTriggers"); + + b.Navigation("SimplePropertyTriggers"); + + b.Navigation("SimpleTriggers"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/modules/Elsa.Quartz.EntityFrameworkCore.SqlServer/SqlServerQuartzDbContext.cs b/src/modules/Elsa.Quartz.EntityFrameworkCore.SqlServer/SqlServerQuartzDbContext.cs new file mode 100644 index 000000000..cc4007634 --- /dev/null +++ b/src/modules/Elsa.Quartz.EntityFrameworkCore.SqlServer/SqlServerQuartzDbContext.cs @@ -0,0 +1,32 @@ +using AppAny.Quartz.EntityFrameworkCore.Migrations; +using AppAny.Quartz.EntityFrameworkCore.Migrations.SqlServer; +using Elsa.EntityFrameworkCore.Common.Abstractions; +using JetBrains.Annotations; +using Microsoft.EntityFrameworkCore; + +namespace Elsa.Quartz.EntityFrameworkCore.SqlServer; + +/// +/// Quartz DbContext for SQL Server. +/// +[UsedImplicitly] +public class SqlServerQuartzDbContext : DbContext +{ + /// + public SqlServerQuartzDbContext(DbContextOptions options) : base(options) + { + } + + /// + protected override void OnModelCreating(ModelBuilder modelBuilder) => modelBuilder.AddQuartz(model => model.UseSqlServer()); +} + +/// +/// Design-time factory for Quartz DbContext for SQL Server. +/// +[UsedImplicitly] +public class SqlServerQuartzDbContextFactory : DesignTimeDbContextFactoryBase +{ + /// + protected override void ConfigureBuilder(DbContextOptionsBuilder builder, string connectionString) => builder.UseSqlServer(connectionString); +} \ No newline at end of file diff --git a/src/modules/Elsa.Quartz.EntityFrameworkCore.SqlServer/SqlServerQuartzExtensions.cs b/src/modules/Elsa.Quartz.EntityFrameworkCore.SqlServer/SqlServerQuartzExtensions.cs new file mode 100644 index 000000000..bbf591041 --- /dev/null +++ b/src/modules/Elsa.Quartz.EntityFrameworkCore.SqlServer/SqlServerQuartzExtensions.cs @@ -0,0 +1,46 @@ +using Elsa.EntityFrameworkCore.Common; +using Elsa.Quartz.EntityFrameworkCore.SqlServer; +using Elsa.Quartz.Features; +using JetBrains.Annotations; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using Quartz; + +// ReSharper disable once CheckNamespace +namespace Elsa.EntityFrameworkCore.Extensions; + +/// +/// Provides extensions to configure EF Core to use SQL Server. +/// +[PublicAPI] +public static class SqlServerQuartzExtensions +{ + /// + /// Configures the to use the SQL Server job store. + /// + public static QuartzFeature UseSqlServer(this QuartzFeature feature, string connectionString = Constants.DefaultConnectionString, bool useClustering = true) + { + feature.Services.AddDbContextFactory(options => + { + // Use SQL Server migrations. + options.UseSqlServer(connectionString, sqlServerDbContextOptionsBuilder => { sqlServerDbContextOptionsBuilder.MigrationsAssembly(typeof(SqlServerQuartzDbContext).Assembly.GetName().Name); }); + }); + + feature.ConfigureQuartz += quartz => + { + quartz.UsePersistentStore(store => + { + store.UseNewtonsoftJsonSerializer(); + store.UseSqlServer(connectionString); + + if (useClustering) + store.UseClustering(); + }); + }; + + // Configure the Quartz hosted service to run migrations. + feature.Module.ConfigureHostedService>(-100); + + return feature; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Quartz.EntityFrameworkCore.Sqlite/Elsa.Quartz.EntityFrameworkCore.Sqlite.csproj b/src/modules/Elsa.Quartz.EntityFrameworkCore.Sqlite/Elsa.Quartz.EntityFrameworkCore.Sqlite.csproj new file mode 100644 index 000000000..21f6132d5 --- /dev/null +++ b/src/modules/Elsa.Quartz.EntityFrameworkCore.Sqlite/Elsa.Quartz.EntityFrameworkCore.Sqlite.csproj @@ -0,0 +1,30 @@ + + + + + + + net6.0;net7.0 + + Provides EF Core migrations for Quartz.NET. + + elsa module scheduling quartz ef core migrations + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + \ No newline at end of file diff --git a/src/modules/Elsa.Quartz.EntityFrameworkCore.Sqlite/FodyWeavers.xml b/src/modules/Elsa.Quartz.EntityFrameworkCore.Sqlite/FodyWeavers.xml new file mode 100644 index 000000000..00e1d9a1c --- /dev/null +++ b/src/modules/Elsa.Quartz.EntityFrameworkCore.Sqlite/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/modules/Elsa.Quartz.EntityFrameworkCore.Sqlite/Migrations/20231028172754_AddQuartz.Designer.cs b/src/modules/Elsa.Quartz.EntityFrameworkCore.Sqlite/Migrations/20231028172754_AddQuartz.Designer.cs new file mode 100644 index 000000000..f2aa0461a --- /dev/null +++ b/src/modules/Elsa.Quartz.EntityFrameworkCore.Sqlite/Migrations/20231028172754_AddQuartz.Designer.cs @@ -0,0 +1,539 @@ +// +using System; +using Elsa.Quartz.EntityFrameworkCore.Sqlite; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace Elsa.Quartz.EntityFrameworkCore.Sqlite.Migrations +{ + [DbContext(typeof(SqliteQuartzDbContext))] + [Migration("20231028172754_AddQuartz")] + partial class AddQuartz + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "7.0.13"); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzBlobTrigger", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("SCHED_NAME"); + + b.Property("TriggerName") + .HasColumnType("text") + .HasColumnName("TRIGGER_NAME"); + + b.Property("TriggerGroup") + .HasColumnType("text") + .HasColumnName("TRIGGER_GROUP"); + + b.Property("BlobData") + .HasColumnType("bytea") + .HasColumnName("BLOB_DATA"); + + b.HasKey("SchedulerName", "TriggerName", "TriggerGroup"); + + b.ToTable("QRTZ_BLOB_TRIGGERS", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzCalendar", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("SCHED_NAME"); + + b.Property("CalendarName") + .HasColumnType("text") + .HasColumnName("CALENDAR_NAME"); + + b.Property("Calendar") + .IsRequired() + .HasColumnType("bytea") + .HasColumnName("CALENDAR"); + + b.HasKey("SchedulerName", "CalendarName"); + + b.ToTable("QRTZ_CALENDARS", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzCronTrigger", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("SCHED_NAME"); + + b.Property("TriggerName") + .HasColumnType("text") + .HasColumnName("TRIGGER_NAME"); + + b.Property("TriggerGroup") + .HasColumnType("text") + .HasColumnName("TRIGGER_GROUP"); + + b.Property("CronExpression") + .IsRequired() + .HasColumnType("text") + .HasColumnName("CRON_EXPRESSION"); + + b.Property("TimeZoneId") + .HasColumnType("text") + .HasColumnName("TIME_ZONE_ID"); + + b.HasKey("SchedulerName", "TriggerName", "TriggerGroup"); + + b.ToTable("QRTZ_CRON_TRIGGERS", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzFiredTrigger", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("SCHED_NAME"); + + b.Property("EntryId") + .HasColumnType("text") + .HasColumnName("ENTRY_ID"); + + b.Property("FiredTime") + .HasColumnType("bigint") + .HasColumnName("FIRED_TIME"); + + b.Property("InstanceName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("INSTANCE_NAME"); + + b.Property("IsNonConcurrent") + .HasColumnType("bool") + .HasColumnName("IS_NONCONCURRENT"); + + b.Property("JobGroup") + .HasColumnType("text") + .HasColumnName("JOB_GROUP"); + + b.Property("JobName") + .HasColumnType("text") + .HasColumnName("JOB_NAME"); + + b.Property("Priority") + .HasColumnType("integer") + .HasColumnName("PRIORITY"); + + b.Property("RequestsRecovery") + .HasColumnType("bool") + .HasColumnName("REQUESTS_RECOVERY"); + + b.Property("ScheduledTime") + .HasColumnType("bigint") + .HasColumnName("SCHED_TIME"); + + b.Property("State") + .IsRequired() + .HasColumnType("text") + .HasColumnName("STATE"); + + b.Property("TriggerGroup") + .IsRequired() + .HasColumnType("text") + .HasColumnName("TRIGGER_GROUP"); + + b.Property("TriggerName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("TRIGGER_NAME"); + + b.HasKey("SchedulerName", "EntryId"); + + b.HasIndex("InstanceName") + .HasDatabaseName("IDX_QRTZ_FT_TRIG_INST_NAME"); + + b.HasIndex("JobGroup") + .HasDatabaseName("IDX_QRTZ_FT_JOB_GROUP"); + + b.HasIndex("JobName") + .HasDatabaseName("IDX_QRTZ_FT_JOB_NAME"); + + b.HasIndex("RequestsRecovery") + .HasDatabaseName("IDX_QRTZ_FT_JOB_REQ_RECOVERY"); + + b.HasIndex("TriggerGroup") + .HasDatabaseName("IDX_QRTZ_FT_TRIG_GROUP"); + + b.HasIndex("TriggerName") + .HasDatabaseName("IDX_QRTZ_FT_TRIG_NAME"); + + b.HasIndex("SchedulerName", "TriggerName", "TriggerGroup") + .HasDatabaseName("IDX_QRTZ_FT_TRIG_NM_GP"); + + b.ToTable("QRTZ_FIRED_TRIGGERS", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzJobDetail", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("SCHED_NAME"); + + b.Property("JobName") + .HasColumnType("text") + .HasColumnName("JOB_NAME"); + + b.Property("JobGroup") + .HasColumnType("text") + .HasColumnName("JOB_GROUP"); + + b.Property("Description") + .HasColumnType("text") + .HasColumnName("DESCRIPTION"); + + b.Property("IsDurable") + .HasColumnType("bool") + .HasColumnName("IS_DURABLE"); + + b.Property("IsNonConcurrent") + .HasColumnType("bool") + .HasColumnName("IS_NONCONCURRENT"); + + b.Property("IsUpdateData") + .HasColumnType("bool") + .HasColumnName("IS_UPDATE_DATA"); + + b.Property("JobClassName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("JOB_CLASS_NAME"); + + b.Property("JobData") + .HasColumnType("bytea") + .HasColumnName("JOB_DATA"); + + b.Property("RequestsRecovery") + .HasColumnType("bool") + .HasColumnName("REQUESTS_RECOVERY"); + + b.HasKey("SchedulerName", "JobName", "JobGroup"); + + b.HasIndex("RequestsRecovery") + .HasDatabaseName("IDX_QRTZ_J_REQ_RECOVERY"); + + b.ToTable("QRTZ_JOB_DETAILS", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzLock", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("SCHED_NAME"); + + b.Property("LockName") + .HasColumnType("text") + .HasColumnName("LOCK_NAME"); + + b.HasKey("SchedulerName", "LockName"); + + b.ToTable("QRTZ_LOCKS", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzPausedTriggerGroup", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("SCHED_NAME"); + + b.Property("TriggerGroup") + .HasColumnType("text") + .HasColumnName("TRIGGER_GROUP"); + + b.HasKey("SchedulerName", "TriggerGroup"); + + b.ToTable("QRTZ_PAUSED_TRIGGER_GRPS", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSchedulerState", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("SCHED_NAME"); + + b.Property("InstanceName") + .HasColumnType("text") + .HasColumnName("INSTANCE_NAME"); + + b.Property("CheckInInterval") + .HasColumnType("bigint") + .HasColumnName("CHECKIN_INTERVAL"); + + b.Property("LastCheckInTime") + .HasColumnType("bigint") + .HasColumnName("LAST_CHECKIN_TIME"); + + b.HasKey("SchedulerName", "InstanceName"); + + b.ToTable("QRTZ_SCHEDULER_STATE", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSimplePropertyTrigger", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("SCHED_NAME"); + + b.Property("TriggerName") + .HasColumnType("text") + .HasColumnName("TRIGGER_NAME"); + + b.Property("TriggerGroup") + .HasColumnType("text") + .HasColumnName("TRIGGER_GROUP"); + + b.Property("BooleanProperty1") + .HasColumnType("bool") + .HasColumnName("BOOL_PROP_1"); + + b.Property("BooleanProperty2") + .HasColumnType("bool") + .HasColumnName("BOOL_PROP_2"); + + b.Property("DecimalProperty1") + .HasColumnType("numeric") + .HasColumnName("DEC_PROP_1"); + + b.Property("DecimalProperty2") + .HasColumnType("numeric") + .HasColumnName("DEC_PROP_2"); + + b.Property("IntegerProperty1") + .HasColumnType("integer") + .HasColumnName("INT_PROP_1"); + + b.Property("IntegerProperty2") + .HasColumnType("integer") + .HasColumnName("INT_PROP_2"); + + b.Property("LongProperty1") + .HasColumnType("bigint") + .HasColumnName("LONG_PROP_1"); + + b.Property("LongProperty2") + .HasColumnType("bigint") + .HasColumnName("LONG_PROP_2"); + + b.Property("StringProperty1") + .HasColumnType("text") + .HasColumnName("STR_PROP_1"); + + b.Property("StringProperty2") + .HasColumnType("text") + .HasColumnName("STR_PROP_2"); + + b.Property("StringProperty3") + .HasColumnType("text") + .HasColumnName("STR_PROP_3"); + + b.Property("TimeZoneId") + .HasColumnType("text") + .HasColumnName("TIME_ZONE_ID"); + + b.HasKey("SchedulerName", "TriggerName", "TriggerGroup"); + + b.ToTable("QRTZ_SIMPROP_TRIGGERS", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSimpleTrigger", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("SCHED_NAME"); + + b.Property("TriggerName") + .HasColumnType("text") + .HasColumnName("TRIGGER_NAME"); + + b.Property("TriggerGroup") + .HasColumnType("text") + .HasColumnName("TRIGGER_GROUP"); + + b.Property("RepeatCount") + .HasColumnType("bigint") + .HasColumnName("REPEAT_COUNT"); + + b.Property("RepeatInterval") + .HasColumnType("bigint") + .HasColumnName("REPEAT_INTERVAL"); + + b.Property("TimesTriggered") + .HasColumnType("bigint") + .HasColumnName("TIMES_TRIGGERED"); + + b.HasKey("SchedulerName", "TriggerName", "TriggerGroup"); + + b.ToTable("QRTZ_SIMPLE_TRIGGERS", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("SCHED_NAME"); + + b.Property("TriggerName") + .HasColumnType("text") + .HasColumnName("TRIGGER_NAME"); + + b.Property("TriggerGroup") + .HasColumnType("text") + .HasColumnName("TRIGGER_GROUP"); + + b.Property("CalendarName") + .HasColumnType("text") + .HasColumnName("CALENDAR_NAME"); + + b.Property("Description") + .HasColumnType("text") + .HasColumnName("DESCRIPTION"); + + b.Property("EndTime") + .HasColumnType("bigint") + .HasColumnName("END_TIME"); + + b.Property("JobData") + .HasColumnType("bytea") + .HasColumnName("JOB_DATA"); + + b.Property("JobGroup") + .IsRequired() + .HasColumnType("text") + .HasColumnName("JOB_GROUP"); + + b.Property("JobName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("JOB_NAME"); + + b.Property("MisfireInstruction") + .HasColumnType("smallint") + .HasColumnName("MISFIRE_INSTR"); + + b.Property("NextFireTime") + .HasColumnType("bigint") + .HasColumnName("NEXT_FIRE_TIME"); + + b.Property("PreviousFireTime") + .HasColumnType("bigint") + .HasColumnName("PREV_FIRE_TIME"); + + b.Property("Priority") + .HasColumnType("integer") + .HasColumnName("PRIORITY"); + + b.Property("StartTime") + .HasColumnType("bigint") + .HasColumnName("START_TIME"); + + b.Property("TriggerState") + .IsRequired() + .HasColumnType("text") + .HasColumnName("TRIGGER_STATE"); + + b.Property("TriggerType") + .IsRequired() + .HasColumnType("text") + .HasColumnName("TRIGGER_TYPE"); + + b.HasKey("SchedulerName", "TriggerName", "TriggerGroup"); + + b.HasIndex("NextFireTime") + .HasDatabaseName("IDX_QRTZ_T_NEXT_FIRE_TIME"); + + b.HasIndex("TriggerState") + .HasDatabaseName("IDX_QRTZ_T_STATE"); + + b.HasIndex("NextFireTime", "TriggerState") + .HasDatabaseName("IDX_QRTZ_T_NFT_ST"); + + b.HasIndex("SchedulerName", "JobName", "JobGroup"); + + b.ToTable("QRTZ_TRIGGERS", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzBlobTrigger", b => + { + b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", "Trigger") + .WithMany("BlobTriggers") + .HasForeignKey("SchedulerName", "TriggerName", "TriggerGroup") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Trigger"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzCronTrigger", b => + { + b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", "Trigger") + .WithMany("CronTriggers") + .HasForeignKey("SchedulerName", "TriggerName", "TriggerGroup") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Trigger"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSimplePropertyTrigger", b => + { + b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", "Trigger") + .WithMany("SimplePropertyTriggers") + .HasForeignKey("SchedulerName", "TriggerName", "TriggerGroup") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Trigger"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSimpleTrigger", b => + { + b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", "Trigger") + .WithMany("SimpleTriggers") + .HasForeignKey("SchedulerName", "TriggerName", "TriggerGroup") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Trigger"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", b => + { + b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzJobDetail", "JobDetail") + .WithMany("Triggers") + .HasForeignKey("SchedulerName", "JobName", "JobGroup") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("JobDetail"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzJobDetail", b => + { + b.Navigation("Triggers"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", b => + { + b.Navigation("BlobTriggers"); + + b.Navigation("CronTriggers"); + + b.Navigation("SimplePropertyTriggers"); + + b.Navigation("SimpleTriggers"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/modules/Elsa.Quartz.EntityFrameworkCore.Sqlite/Migrations/20231028172754_AddQuartz.cs b/src/modules/Elsa.Quartz.EntityFrameworkCore.Sqlite/Migrations/20231028172754_AddQuartz.cs new file mode 100644 index 000000000..e8f266d3e --- /dev/null +++ b/src/modules/Elsa.Quartz.EntityFrameworkCore.Sqlite/Migrations/20231028172754_AddQuartz.cs @@ -0,0 +1,331 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Elsa.Quartz.EntityFrameworkCore.Sqlite.Migrations +{ + /// + public partial class AddQuartz : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "QRTZ_CALENDARS", + columns: table => new + { + SCHED_NAME = table.Column(type: "text", nullable: false), + CALENDAR_NAME = table.Column(type: "text", nullable: false), + CALENDAR = table.Column(type: "bytea", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_QRTZ_CALENDARS", x => new { x.SCHED_NAME, x.CALENDAR_NAME }); + }); + + migrationBuilder.CreateTable( + name: "QRTZ_FIRED_TRIGGERS", + columns: table => new + { + SCHED_NAME = table.Column(type: "text", nullable: false), + ENTRY_ID = table.Column(type: "text", nullable: false), + TRIGGER_NAME = table.Column(type: "text", nullable: false), + TRIGGER_GROUP = table.Column(type: "text", nullable: false), + INSTANCE_NAME = table.Column(type: "text", nullable: false), + FIRED_TIME = table.Column(type: "bigint", nullable: false), + SCHED_TIME = table.Column(type: "bigint", nullable: false), + PRIORITY = table.Column(type: "integer", nullable: false), + STATE = table.Column(type: "text", nullable: false), + JOB_NAME = table.Column(type: "text", nullable: true), + JOB_GROUP = table.Column(type: "text", nullable: true), + IS_NONCONCURRENT = table.Column(type: "bool", nullable: false), + REQUESTS_RECOVERY = table.Column(type: "bool", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_QRTZ_FIRED_TRIGGERS", x => new { x.SCHED_NAME, x.ENTRY_ID }); + }); + + migrationBuilder.CreateTable( + name: "QRTZ_JOB_DETAILS", + columns: table => new + { + SCHED_NAME = table.Column(type: "text", nullable: false), + JOB_NAME = table.Column(type: "text", nullable: false), + JOB_GROUP = table.Column(type: "text", nullable: false), + DESCRIPTION = table.Column(type: "text", nullable: true), + JOB_CLASS_NAME = table.Column(type: "text", nullable: false), + IS_DURABLE = table.Column(type: "bool", nullable: false), + IS_NONCONCURRENT = table.Column(type: "bool", nullable: false), + IS_UPDATE_DATA = table.Column(type: "bool", nullable: false), + REQUESTS_RECOVERY = table.Column(type: "bool", nullable: false), + JOB_DATA = table.Column(type: "bytea", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_QRTZ_JOB_DETAILS", x => new { x.SCHED_NAME, x.JOB_NAME, x.JOB_GROUP }); + }); + + migrationBuilder.CreateTable( + name: "QRTZ_LOCKS", + columns: table => new + { + SCHED_NAME = table.Column(type: "text", nullable: false), + LOCK_NAME = table.Column(type: "text", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_QRTZ_LOCKS", x => new { x.SCHED_NAME, x.LOCK_NAME }); + }); + + migrationBuilder.CreateTable( + name: "QRTZ_PAUSED_TRIGGER_GRPS", + columns: table => new + { + SCHED_NAME = table.Column(type: "text", nullable: false), + TRIGGER_GROUP = table.Column(type: "text", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_QRTZ_PAUSED_TRIGGER_GRPS", x => new { x.SCHED_NAME, x.TRIGGER_GROUP }); + }); + + migrationBuilder.CreateTable( + name: "QRTZ_SCHEDULER_STATE", + columns: table => new + { + SCHED_NAME = table.Column(type: "text", nullable: false), + INSTANCE_NAME = table.Column(type: "text", nullable: false), + LAST_CHECKIN_TIME = table.Column(type: "bigint", nullable: false), + CHECKIN_INTERVAL = table.Column(type: "bigint", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_QRTZ_SCHEDULER_STATE", x => new { x.SCHED_NAME, x.INSTANCE_NAME }); + }); + + migrationBuilder.CreateTable( + name: "QRTZ_TRIGGERS", + columns: table => new + { + SCHED_NAME = table.Column(type: "text", nullable: false), + TRIGGER_NAME = table.Column(type: "text", nullable: false), + TRIGGER_GROUP = table.Column(type: "text", nullable: false), + JOB_NAME = table.Column(type: "text", nullable: false), + JOB_GROUP = table.Column(type: "text", nullable: false), + DESCRIPTION = table.Column(type: "text", nullable: true), + NEXT_FIRE_TIME = table.Column(type: "bigint", nullable: true), + PREV_FIRE_TIME = table.Column(type: "bigint", nullable: true), + PRIORITY = table.Column(type: "integer", nullable: true), + TRIGGER_STATE = table.Column(type: "text", nullable: false), + TRIGGER_TYPE = table.Column(type: "text", nullable: false), + START_TIME = table.Column(type: "bigint", nullable: false), + END_TIME = table.Column(type: "bigint", nullable: true), + CALENDAR_NAME = table.Column(type: "text", nullable: true), + MISFIRE_INSTR = table.Column(type: "smallint", nullable: true), + JOB_DATA = table.Column(type: "bytea", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_QRTZ_TRIGGERS", x => new { x.SCHED_NAME, x.TRIGGER_NAME, x.TRIGGER_GROUP }); + table.ForeignKey( + name: "FK_QRTZ_TRIGGERS_QRTZ_JOB_DETAILS_SCHED_NAME_JOB_NAME_JOB_GROUP", + columns: x => new { x.SCHED_NAME, x.JOB_NAME, x.JOB_GROUP }, + principalTable: "QRTZ_JOB_DETAILS", + principalColumns: new[] { "SCHED_NAME", "JOB_NAME", "JOB_GROUP" }, + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "QRTZ_BLOB_TRIGGERS", + columns: table => new + { + SCHED_NAME = table.Column(type: "text", nullable: false), + TRIGGER_NAME = table.Column(type: "text", nullable: false), + TRIGGER_GROUP = table.Column(type: "text", nullable: false), + BLOB_DATA = table.Column(type: "bytea", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_QRTZ_BLOB_TRIGGERS", x => new { x.SCHED_NAME, x.TRIGGER_NAME, x.TRIGGER_GROUP }); + table.ForeignKey( + name: "FK_QRTZ_BLOB_TRIGGERS_QRTZ_TRIGGERS_SCHED_NAME_TRIGGER_NAME_TRIGGER_GROUP", + columns: x => new { x.SCHED_NAME, x.TRIGGER_NAME, x.TRIGGER_GROUP }, + principalTable: "QRTZ_TRIGGERS", + principalColumns: new[] { "SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP" }, + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "QRTZ_CRON_TRIGGERS", + columns: table => new + { + SCHED_NAME = table.Column(type: "text", nullable: false), + TRIGGER_NAME = table.Column(type: "text", nullable: false), + TRIGGER_GROUP = table.Column(type: "text", nullable: false), + CRON_EXPRESSION = table.Column(type: "text", nullable: false), + TIME_ZONE_ID = table.Column(type: "text", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_QRTZ_CRON_TRIGGERS", x => new { x.SCHED_NAME, x.TRIGGER_NAME, x.TRIGGER_GROUP }); + table.ForeignKey( + name: "FK_QRTZ_CRON_TRIGGERS_QRTZ_TRIGGERS_SCHED_NAME_TRIGGER_NAME_TRIGGER_GROUP", + columns: x => new { x.SCHED_NAME, x.TRIGGER_NAME, x.TRIGGER_GROUP }, + principalTable: "QRTZ_TRIGGERS", + principalColumns: new[] { "SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP" }, + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "QRTZ_SIMPLE_TRIGGERS", + columns: table => new + { + SCHED_NAME = table.Column(type: "text", nullable: false), + TRIGGER_NAME = table.Column(type: "text", nullable: false), + TRIGGER_GROUP = table.Column(type: "text", nullable: false), + REPEAT_COUNT = table.Column(type: "bigint", nullable: false), + REPEAT_INTERVAL = table.Column(type: "bigint", nullable: false), + TIMES_TRIGGERED = table.Column(type: "bigint", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_QRTZ_SIMPLE_TRIGGERS", x => new { x.SCHED_NAME, x.TRIGGER_NAME, x.TRIGGER_GROUP }); + table.ForeignKey( + name: "FK_QRTZ_SIMPLE_TRIGGERS_QRTZ_TRIGGERS_SCHED_NAME_TRIGGER_NAME_TRIGGER_GROUP", + columns: x => new { x.SCHED_NAME, x.TRIGGER_NAME, x.TRIGGER_GROUP }, + principalTable: "QRTZ_TRIGGERS", + principalColumns: new[] { "SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP" }, + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "QRTZ_SIMPROP_TRIGGERS", + columns: table => new + { + SCHED_NAME = table.Column(type: "text", nullable: false), + TRIGGER_NAME = table.Column(type: "text", nullable: false), + TRIGGER_GROUP = table.Column(type: "text", nullable: false), + STR_PROP_1 = table.Column(type: "text", nullable: true), + STR_PROP_2 = table.Column(type: "text", nullable: true), + STR_PROP_3 = table.Column(type: "text", nullable: true), + INT_PROP_1 = table.Column(type: "integer", nullable: true), + INT_PROP_2 = table.Column(type: "integer", nullable: true), + LONG_PROP_1 = table.Column(type: "bigint", nullable: true), + LONG_PROP_2 = table.Column(type: "bigint", nullable: true), + DEC_PROP_1 = table.Column(type: "numeric", nullable: true), + DEC_PROP_2 = table.Column(type: "numeric", nullable: true), + BOOL_PROP_1 = table.Column(type: "bool", nullable: true), + BOOL_PROP_2 = table.Column(type: "bool", nullable: true), + TIME_ZONE_ID = table.Column(type: "text", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_QRTZ_SIMPROP_TRIGGERS", x => new { x.SCHED_NAME, x.TRIGGER_NAME, x.TRIGGER_GROUP }); + table.ForeignKey( + name: "FK_QRTZ_SIMPROP_TRIGGERS_QRTZ_TRIGGERS_SCHED_NAME_TRIGGER_NAME_TRIGGER_GROUP", + columns: x => new { x.SCHED_NAME, x.TRIGGER_NAME, x.TRIGGER_GROUP }, + principalTable: "QRTZ_TRIGGERS", + principalColumns: new[] { "SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP" }, + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IDX_QRTZ_FT_JOB_GROUP", + table: "QRTZ_FIRED_TRIGGERS", + column: "JOB_GROUP"); + + migrationBuilder.CreateIndex( + name: "IDX_QRTZ_FT_JOB_NAME", + table: "QRTZ_FIRED_TRIGGERS", + column: "JOB_NAME"); + + migrationBuilder.CreateIndex( + name: "IDX_QRTZ_FT_JOB_REQ_RECOVERY", + table: "QRTZ_FIRED_TRIGGERS", + column: "REQUESTS_RECOVERY"); + + migrationBuilder.CreateIndex( + name: "IDX_QRTZ_FT_TRIG_GROUP", + table: "QRTZ_FIRED_TRIGGERS", + column: "TRIGGER_GROUP"); + + migrationBuilder.CreateIndex( + name: "IDX_QRTZ_FT_TRIG_INST_NAME", + table: "QRTZ_FIRED_TRIGGERS", + column: "INSTANCE_NAME"); + + migrationBuilder.CreateIndex( + name: "IDX_QRTZ_FT_TRIG_NAME", + table: "QRTZ_FIRED_TRIGGERS", + column: "TRIGGER_NAME"); + + migrationBuilder.CreateIndex( + name: "IDX_QRTZ_FT_TRIG_NM_GP", + table: "QRTZ_FIRED_TRIGGERS", + columns: new[] { "SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP" }); + + migrationBuilder.CreateIndex( + name: "IDX_QRTZ_J_REQ_RECOVERY", + table: "QRTZ_JOB_DETAILS", + column: "REQUESTS_RECOVERY"); + + migrationBuilder.CreateIndex( + name: "IDX_QRTZ_T_NEXT_FIRE_TIME", + table: "QRTZ_TRIGGERS", + column: "NEXT_FIRE_TIME"); + + migrationBuilder.CreateIndex( + name: "IDX_QRTZ_T_NFT_ST", + table: "QRTZ_TRIGGERS", + columns: new[] { "NEXT_FIRE_TIME", "TRIGGER_STATE" }); + + migrationBuilder.CreateIndex( + name: "IDX_QRTZ_T_STATE", + table: "QRTZ_TRIGGERS", + column: "TRIGGER_STATE"); + + migrationBuilder.CreateIndex( + name: "IX_QRTZ_TRIGGERS_SCHED_NAME_JOB_NAME_JOB_GROUP", + table: "QRTZ_TRIGGERS", + columns: new[] { "SCHED_NAME", "JOB_NAME", "JOB_GROUP" }); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "QRTZ_BLOB_TRIGGERS"); + + migrationBuilder.DropTable( + name: "QRTZ_CALENDARS"); + + migrationBuilder.DropTable( + name: "QRTZ_CRON_TRIGGERS"); + + migrationBuilder.DropTable( + name: "QRTZ_FIRED_TRIGGERS"); + + migrationBuilder.DropTable( + name: "QRTZ_LOCKS"); + + migrationBuilder.DropTable( + name: "QRTZ_PAUSED_TRIGGER_GRPS"); + + migrationBuilder.DropTable( + name: "QRTZ_SCHEDULER_STATE"); + + migrationBuilder.DropTable( + name: "QRTZ_SIMPLE_TRIGGERS"); + + migrationBuilder.DropTable( + name: "QRTZ_SIMPROP_TRIGGERS"); + + migrationBuilder.DropTable( + name: "QRTZ_TRIGGERS"); + + migrationBuilder.DropTable( + name: "QRTZ_JOB_DETAILS"); + } + } +} diff --git a/src/modules/Elsa.Quartz.EntityFrameworkCore.Sqlite/Migrations/SqliteQuartzDbContextModelSnapshot.cs b/src/modules/Elsa.Quartz.EntityFrameworkCore.Sqlite/Migrations/SqliteQuartzDbContextModelSnapshot.cs new file mode 100644 index 000000000..5c163dae9 --- /dev/null +++ b/src/modules/Elsa.Quartz.EntityFrameworkCore.Sqlite/Migrations/SqliteQuartzDbContextModelSnapshot.cs @@ -0,0 +1,536 @@ +// +using System; +using Elsa.Quartz.EntityFrameworkCore.Sqlite; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace Elsa.Quartz.EntityFrameworkCore.Sqlite.Migrations +{ + [DbContext(typeof(SqliteQuartzDbContext))] + partial class SqliteQuartzDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "7.0.13"); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzBlobTrigger", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("SCHED_NAME"); + + b.Property("TriggerName") + .HasColumnType("text") + .HasColumnName("TRIGGER_NAME"); + + b.Property("TriggerGroup") + .HasColumnType("text") + .HasColumnName("TRIGGER_GROUP"); + + b.Property("BlobData") + .HasColumnType("bytea") + .HasColumnName("BLOB_DATA"); + + b.HasKey("SchedulerName", "TriggerName", "TriggerGroup"); + + b.ToTable("QRTZ_BLOB_TRIGGERS", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzCalendar", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("SCHED_NAME"); + + b.Property("CalendarName") + .HasColumnType("text") + .HasColumnName("CALENDAR_NAME"); + + b.Property("Calendar") + .IsRequired() + .HasColumnType("bytea") + .HasColumnName("CALENDAR"); + + b.HasKey("SchedulerName", "CalendarName"); + + b.ToTable("QRTZ_CALENDARS", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzCronTrigger", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("SCHED_NAME"); + + b.Property("TriggerName") + .HasColumnType("text") + .HasColumnName("TRIGGER_NAME"); + + b.Property("TriggerGroup") + .HasColumnType("text") + .HasColumnName("TRIGGER_GROUP"); + + b.Property("CronExpression") + .IsRequired() + .HasColumnType("text") + .HasColumnName("CRON_EXPRESSION"); + + b.Property("TimeZoneId") + .HasColumnType("text") + .HasColumnName("TIME_ZONE_ID"); + + b.HasKey("SchedulerName", "TriggerName", "TriggerGroup"); + + b.ToTable("QRTZ_CRON_TRIGGERS", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzFiredTrigger", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("SCHED_NAME"); + + b.Property("EntryId") + .HasColumnType("text") + .HasColumnName("ENTRY_ID"); + + b.Property("FiredTime") + .HasColumnType("bigint") + .HasColumnName("FIRED_TIME"); + + b.Property("InstanceName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("INSTANCE_NAME"); + + b.Property("IsNonConcurrent") + .HasColumnType("bool") + .HasColumnName("IS_NONCONCURRENT"); + + b.Property("JobGroup") + .HasColumnType("text") + .HasColumnName("JOB_GROUP"); + + b.Property("JobName") + .HasColumnType("text") + .HasColumnName("JOB_NAME"); + + b.Property("Priority") + .HasColumnType("integer") + .HasColumnName("PRIORITY"); + + b.Property("RequestsRecovery") + .HasColumnType("bool") + .HasColumnName("REQUESTS_RECOVERY"); + + b.Property("ScheduledTime") + .HasColumnType("bigint") + .HasColumnName("SCHED_TIME"); + + b.Property("State") + .IsRequired() + .HasColumnType("text") + .HasColumnName("STATE"); + + b.Property("TriggerGroup") + .IsRequired() + .HasColumnType("text") + .HasColumnName("TRIGGER_GROUP"); + + b.Property("TriggerName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("TRIGGER_NAME"); + + b.HasKey("SchedulerName", "EntryId"); + + b.HasIndex("InstanceName") + .HasDatabaseName("IDX_QRTZ_FT_TRIG_INST_NAME"); + + b.HasIndex("JobGroup") + .HasDatabaseName("IDX_QRTZ_FT_JOB_GROUP"); + + b.HasIndex("JobName") + .HasDatabaseName("IDX_QRTZ_FT_JOB_NAME"); + + b.HasIndex("RequestsRecovery") + .HasDatabaseName("IDX_QRTZ_FT_JOB_REQ_RECOVERY"); + + b.HasIndex("TriggerGroup") + .HasDatabaseName("IDX_QRTZ_FT_TRIG_GROUP"); + + b.HasIndex("TriggerName") + .HasDatabaseName("IDX_QRTZ_FT_TRIG_NAME"); + + b.HasIndex("SchedulerName", "TriggerName", "TriggerGroup") + .HasDatabaseName("IDX_QRTZ_FT_TRIG_NM_GP"); + + b.ToTable("QRTZ_FIRED_TRIGGERS", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzJobDetail", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("SCHED_NAME"); + + b.Property("JobName") + .HasColumnType("text") + .HasColumnName("JOB_NAME"); + + b.Property("JobGroup") + .HasColumnType("text") + .HasColumnName("JOB_GROUP"); + + b.Property("Description") + .HasColumnType("text") + .HasColumnName("DESCRIPTION"); + + b.Property("IsDurable") + .HasColumnType("bool") + .HasColumnName("IS_DURABLE"); + + b.Property("IsNonConcurrent") + .HasColumnType("bool") + .HasColumnName("IS_NONCONCURRENT"); + + b.Property("IsUpdateData") + .HasColumnType("bool") + .HasColumnName("IS_UPDATE_DATA"); + + b.Property("JobClassName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("JOB_CLASS_NAME"); + + b.Property("JobData") + .HasColumnType("bytea") + .HasColumnName("JOB_DATA"); + + b.Property("RequestsRecovery") + .HasColumnType("bool") + .HasColumnName("REQUESTS_RECOVERY"); + + b.HasKey("SchedulerName", "JobName", "JobGroup"); + + b.HasIndex("RequestsRecovery") + .HasDatabaseName("IDX_QRTZ_J_REQ_RECOVERY"); + + b.ToTable("QRTZ_JOB_DETAILS", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzLock", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("SCHED_NAME"); + + b.Property("LockName") + .HasColumnType("text") + .HasColumnName("LOCK_NAME"); + + b.HasKey("SchedulerName", "LockName"); + + b.ToTable("QRTZ_LOCKS", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzPausedTriggerGroup", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("SCHED_NAME"); + + b.Property("TriggerGroup") + .HasColumnType("text") + .HasColumnName("TRIGGER_GROUP"); + + b.HasKey("SchedulerName", "TriggerGroup"); + + b.ToTable("QRTZ_PAUSED_TRIGGER_GRPS", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSchedulerState", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("SCHED_NAME"); + + b.Property("InstanceName") + .HasColumnType("text") + .HasColumnName("INSTANCE_NAME"); + + b.Property("CheckInInterval") + .HasColumnType("bigint") + .HasColumnName("CHECKIN_INTERVAL"); + + b.Property("LastCheckInTime") + .HasColumnType("bigint") + .HasColumnName("LAST_CHECKIN_TIME"); + + b.HasKey("SchedulerName", "InstanceName"); + + b.ToTable("QRTZ_SCHEDULER_STATE", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSimplePropertyTrigger", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("SCHED_NAME"); + + b.Property("TriggerName") + .HasColumnType("text") + .HasColumnName("TRIGGER_NAME"); + + b.Property("TriggerGroup") + .HasColumnType("text") + .HasColumnName("TRIGGER_GROUP"); + + b.Property("BooleanProperty1") + .HasColumnType("bool") + .HasColumnName("BOOL_PROP_1"); + + b.Property("BooleanProperty2") + .HasColumnType("bool") + .HasColumnName("BOOL_PROP_2"); + + b.Property("DecimalProperty1") + .HasColumnType("numeric") + .HasColumnName("DEC_PROP_1"); + + b.Property("DecimalProperty2") + .HasColumnType("numeric") + .HasColumnName("DEC_PROP_2"); + + b.Property("IntegerProperty1") + .HasColumnType("integer") + .HasColumnName("INT_PROP_1"); + + b.Property("IntegerProperty2") + .HasColumnType("integer") + .HasColumnName("INT_PROP_2"); + + b.Property("LongProperty1") + .HasColumnType("bigint") + .HasColumnName("LONG_PROP_1"); + + b.Property("LongProperty2") + .HasColumnType("bigint") + .HasColumnName("LONG_PROP_2"); + + b.Property("StringProperty1") + .HasColumnType("text") + .HasColumnName("STR_PROP_1"); + + b.Property("StringProperty2") + .HasColumnType("text") + .HasColumnName("STR_PROP_2"); + + b.Property("StringProperty3") + .HasColumnType("text") + .HasColumnName("STR_PROP_3"); + + b.Property("TimeZoneId") + .HasColumnType("text") + .HasColumnName("TIME_ZONE_ID"); + + b.HasKey("SchedulerName", "TriggerName", "TriggerGroup"); + + b.ToTable("QRTZ_SIMPROP_TRIGGERS", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSimpleTrigger", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("SCHED_NAME"); + + b.Property("TriggerName") + .HasColumnType("text") + .HasColumnName("TRIGGER_NAME"); + + b.Property("TriggerGroup") + .HasColumnType("text") + .HasColumnName("TRIGGER_GROUP"); + + b.Property("RepeatCount") + .HasColumnType("bigint") + .HasColumnName("REPEAT_COUNT"); + + b.Property("RepeatInterval") + .HasColumnType("bigint") + .HasColumnName("REPEAT_INTERVAL"); + + b.Property("TimesTriggered") + .HasColumnType("bigint") + .HasColumnName("TIMES_TRIGGERED"); + + b.HasKey("SchedulerName", "TriggerName", "TriggerGroup"); + + b.ToTable("QRTZ_SIMPLE_TRIGGERS", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", b => + { + b.Property("SchedulerName") + .HasColumnType("text") + .HasColumnName("SCHED_NAME"); + + b.Property("TriggerName") + .HasColumnType("text") + .HasColumnName("TRIGGER_NAME"); + + b.Property("TriggerGroup") + .HasColumnType("text") + .HasColumnName("TRIGGER_GROUP"); + + b.Property("CalendarName") + .HasColumnType("text") + .HasColumnName("CALENDAR_NAME"); + + b.Property("Description") + .HasColumnType("text") + .HasColumnName("DESCRIPTION"); + + b.Property("EndTime") + .HasColumnType("bigint") + .HasColumnName("END_TIME"); + + b.Property("JobData") + .HasColumnType("bytea") + .HasColumnName("JOB_DATA"); + + b.Property("JobGroup") + .IsRequired() + .HasColumnType("text") + .HasColumnName("JOB_GROUP"); + + b.Property("JobName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("JOB_NAME"); + + b.Property("MisfireInstruction") + .HasColumnType("smallint") + .HasColumnName("MISFIRE_INSTR"); + + b.Property("NextFireTime") + .HasColumnType("bigint") + .HasColumnName("NEXT_FIRE_TIME"); + + b.Property("PreviousFireTime") + .HasColumnType("bigint") + .HasColumnName("PREV_FIRE_TIME"); + + b.Property("Priority") + .HasColumnType("integer") + .HasColumnName("PRIORITY"); + + b.Property("StartTime") + .HasColumnType("bigint") + .HasColumnName("START_TIME"); + + b.Property("TriggerState") + .IsRequired() + .HasColumnType("text") + .HasColumnName("TRIGGER_STATE"); + + b.Property("TriggerType") + .IsRequired() + .HasColumnType("text") + .HasColumnName("TRIGGER_TYPE"); + + b.HasKey("SchedulerName", "TriggerName", "TriggerGroup"); + + b.HasIndex("NextFireTime") + .HasDatabaseName("IDX_QRTZ_T_NEXT_FIRE_TIME"); + + b.HasIndex("TriggerState") + .HasDatabaseName("IDX_QRTZ_T_STATE"); + + b.HasIndex("NextFireTime", "TriggerState") + .HasDatabaseName("IDX_QRTZ_T_NFT_ST"); + + b.HasIndex("SchedulerName", "JobName", "JobGroup"); + + b.ToTable("QRTZ_TRIGGERS", (string)null); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzBlobTrigger", b => + { + b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", "Trigger") + .WithMany("BlobTriggers") + .HasForeignKey("SchedulerName", "TriggerName", "TriggerGroup") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Trigger"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzCronTrigger", b => + { + b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", "Trigger") + .WithMany("CronTriggers") + .HasForeignKey("SchedulerName", "TriggerName", "TriggerGroup") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Trigger"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSimplePropertyTrigger", b => + { + b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", "Trigger") + .WithMany("SimplePropertyTriggers") + .HasForeignKey("SchedulerName", "TriggerName", "TriggerGroup") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Trigger"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSimpleTrigger", b => + { + b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", "Trigger") + .WithMany("SimpleTriggers") + .HasForeignKey("SchedulerName", "TriggerName", "TriggerGroup") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Trigger"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", b => + { + b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzJobDetail", "JobDetail") + .WithMany("Triggers") + .HasForeignKey("SchedulerName", "JobName", "JobGroup") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("JobDetail"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzJobDetail", b => + { + b.Navigation("Triggers"); + }); + + modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", b => + { + b.Navigation("BlobTriggers"); + + b.Navigation("CronTriggers"); + + b.Navigation("SimplePropertyTriggers"); + + b.Navigation("SimpleTriggers"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/modules/Elsa.Quartz.EntityFrameworkCore.Sqlite/SqliteQuartzDbContext.cs b/src/modules/Elsa.Quartz.EntityFrameworkCore.Sqlite/SqliteQuartzDbContext.cs new file mode 100644 index 000000000..5c1c2a504 --- /dev/null +++ b/src/modules/Elsa.Quartz.EntityFrameworkCore.Sqlite/SqliteQuartzDbContext.cs @@ -0,0 +1,32 @@ +using AppAny.Quartz.EntityFrameworkCore.Migrations; +using AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite; +using Elsa.EntityFrameworkCore.Common.Abstractions; +using JetBrains.Annotations; +using Microsoft.EntityFrameworkCore; + +namespace Elsa.Quartz.EntityFrameworkCore.Sqlite; + +/// +/// Quartz DbContext for SQLite. +/// +[UsedImplicitly] +public class SqliteQuartzDbContext : DbContext +{ + /// + public SqliteQuartzDbContext(DbContextOptions options) : base(options) + { + } + + /// + protected override void OnModelCreating(ModelBuilder modelBuilder) => modelBuilder.AddQuartz(model => model.UseSqlite()); +} + +/// +/// Design-time factory for Quartz DbContext for SQLite. +/// +[UsedImplicitly] +public class SqliteQuartzDbContextFactory : DesignTimeDbContextFactoryBase +{ + /// + protected override void ConfigureBuilder(DbContextOptionsBuilder builder, string connectionString) => builder.UseSqlite(connectionString); +} \ No newline at end of file diff --git a/src/modules/Elsa.Quartz.EntityFrameworkCore.Sqlite/SqliteQuartzExtensions.cs b/src/modules/Elsa.Quartz.EntityFrameworkCore.Sqlite/SqliteQuartzExtensions.cs new file mode 100644 index 000000000..9121397a2 --- /dev/null +++ b/src/modules/Elsa.Quartz.EntityFrameworkCore.Sqlite/SqliteQuartzExtensions.cs @@ -0,0 +1,43 @@ +using Elsa.EntityFrameworkCore.Common; +using Elsa.Quartz.EntityFrameworkCore.Sqlite; +using Elsa.Quartz.Features; +using JetBrains.Annotations; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using Quartz; + +// ReSharper disable once CheckNamespace +namespace Elsa.EntityFrameworkCore.Extensions; + +/// +/// Provides extensions to configure EF Core to use SQLite. +/// +[PublicAPI] +public static class SqliteQuartzExtensions +{ + /// + /// Configures the to use the SQLite job store. + /// + public static QuartzFeature UseSqlite(this QuartzFeature feature, string connectionString = Constants.DefaultConnectionString) + { + feature.Services.AddDbContextFactory(options => + { + // Use SQLite migrations. + options.UseSqlite(connectionString, sqlite => { sqlite.MigrationsAssembly(typeof(SqliteQuartzDbContext).Assembly.GetName().Name); }); + }); + + feature.ConfigureQuartz += quartz => + { + quartz.UsePersistentStore(store => + { + store.UseNewtonsoftJsonSerializer(); + store.UseMicrosoftSQLite(connectionString); + }); + }; + + // Configure the Quartz hosted service to run migrations. + feature.Module.ConfigureHostedService>(-100); + + return feature; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Quartz/Features/QuartzFeature.cs b/src/modules/Elsa.Quartz/Features/QuartzFeature.cs index a1549559c..04e6f60c6 100644 --- a/src/modules/Elsa.Quartz/Features/QuartzFeature.cs +++ b/src/modules/Elsa.Quartz/Features/QuartzFeature.cs @@ -19,12 +19,12 @@ public class QuartzFeature : FeatureBase /// A delegate that can be used to configure Quartz.NET options. /// public Action? ConfigureQuartzOptions { get; set; } - + /// /// A delegate that can be used to configure Quartz.NET itself. /// public Action? ConfigureQuartz { get; set; } - + /// /// A delegate that can be used to configure Quartz.NET hosted service. /// @@ -33,7 +33,11 @@ public class QuartzFeature : FeatureBase /// public override void ConfigureHostedServices() { - Services.AddQuartzHostedService(ConfigureQuartzHostedService); + var type = Type.GetType("Quartz.QuartzHostedService, Quartz.Extensions.Hosting")!; + Module.ConfigureHostedService(type); + + if (ConfigureQuartzHostedService != null) + Services.Configure(ConfigureQuartzHostedService); } /// @@ -43,10 +47,7 @@ public class QuartzFeature : FeatureBase Services.Configure(ConfigureQuartzOptions); Services - .AddQuartz(configure => - { - ConfigureQuartzInternal(configure, ConfigureQuartz); - }); + .AddQuartz(configure => { ConfigureQuartzInternal(configure, ConfigureQuartz); }); } private static void ConfigureQuartzInternal(IServiceCollectionQuartzConfigurator quartz, Action? configureQuartz) diff --git a/src/modules/Elsa.Workflows.Management/Features/WorkflowManagementFeature.cs b/src/modules/Elsa.Workflows.Management/Features/WorkflowManagementFeature.cs index aca2cbc0a..72732adf5 100644 --- a/src/modules/Elsa.Workflows.Management/Features/WorkflowManagementFeature.cs +++ b/src/modules/Elsa.Workflows.Management/Features/WorkflowManagementFeature.cs @@ -58,9 +58,7 @@ public class WorkflowManagementFeature : FeatureBase new(typeof(object), PrimitivesCategory, "The root class for all object in the CLR System."), new(typeof(string), PrimitivesCategory, "Represents a static string of characters."), new(typeof(bool), PrimitivesCategory, "Represents a true or false value."), - new(typeof(int), PrimitivesCategory, "A 32 bit integer."), new(typeof(long), PrimitivesCategory, "A 64 bit integer."), - new(typeof(float), PrimitivesCategory, "A real number."), new(typeof(double), PrimitivesCategory, "A real number with double precision."), new(typeof(decimal), PrimitivesCategory, "A decimal number."), new(typeof(Guid), PrimitivesCategory, "Represents a Globally Unique Identifier."),