diff --git a/Oqtane.Database.SqlServer/SqlServerDatabase.cs b/Oqtane.Database.SqlServer/SqlServerDatabase.cs index fef0b752..11384e17 100644 --- a/Oqtane.Database.SqlServer/SqlServerDatabase.cs +++ b/Oqtane.Database.SqlServer/SqlServerDatabase.cs @@ -32,6 +32,21 @@ namespace Oqtane.Database.SqlServer return table.Column(name: name, nullable: false).Annotation("SqlServer:Identity", "1, 1"); } + public override void AlterStringColumn(MigrationBuilder builder, string name, string table, int length, bool nullable, bool unicode, string index) + { + var elements = index.Split(':', StringSplitOptions.RemoveEmptyEntries); + if (elements.Length != 0) + { + builder.DropIndex(elements[0], table); + } + builder.AlterColumn(name, table, maxLength: length, nullable: nullable, unicode: unicode); + if (elements.Length != 0) + { + var columns = elements[1].Split(','); + builder.CreateIndex(elements[0], table, columns, null, bool.Parse(elements[2]), null); + } + } + public override int ExecuteNonQuery(string connectionString, string query) { var conn = new SqlConnection(FormatConnectionString(connectionString)); diff --git a/Oqtane.Database.Sqlite/SqliteDatabase.cs b/Oqtane.Database.Sqlite/SqliteDatabase.cs index 803bfc69..df150c2c 100644 --- a/Oqtane.Database.Sqlite/SqliteDatabase.cs +++ b/Oqtane.Database.Sqlite/SqliteDatabase.cs @@ -35,7 +35,7 @@ namespace Oqtane.Database.Sqlite // not implemented as SQLite does not support dropping columns } - public override void AlterStringColumn(MigrationBuilder builder, string name, string table, int length, bool nullable, bool unicode) + public override void AlterStringColumn(MigrationBuilder builder, string name, string table, int length, bool nullable, bool unicode, string index) { // not implemented as SQLite does not support altering columns } diff --git a/Oqtane.Server/Databases/DatabaseBase.cs b/Oqtane.Server/Databases/DatabaseBase.cs index 6a515a2a..a9b91eaf 100644 --- a/Oqtane.Server/Databases/DatabaseBase.cs +++ b/Oqtane.Server/Databases/DatabaseBase.cs @@ -81,7 +81,7 @@ namespace Oqtane.Databases builder.DropColumn(name, table); } - public virtual void AlterStringColumn(MigrationBuilder builder, string name, string table, int length, bool nullable, bool unicode) + public virtual void AlterStringColumn(MigrationBuilder builder, string name, string table, int length, bool nullable, bool unicode, string index) { builder.AlterColumn(RewriteName(name), RewriteName(table), maxLength: length, nullable: nullable, unicode: unicode); } diff --git a/Oqtane.Server/Databases/Interfaces/IDatabase.cs b/Oqtane.Server/Databases/Interfaces/IDatabase.cs index e85a3bd0..303fbc0f 100644 --- a/Oqtane.Server/Databases/Interfaces/IDatabase.cs +++ b/Oqtane.Server/Databases/Interfaces/IDatabase.cs @@ -34,7 +34,7 @@ namespace Oqtane.Databases.Interfaces public void DropColumn(MigrationBuilder builder, string name, string table); - public void AlterStringColumn(MigrationBuilder builder, string name, string table, int length, bool nullable, bool unicode); + public void AlterStringColumn(MigrationBuilder builder, string name, string table, int length, bool nullable, bool unicode, string index); public DbContextOptionsBuilder UseDatabase(DbContextOptionsBuilder optionsBuilder, string connectionString); } diff --git a/Oqtane.Server/Migrations/EntityBuilders/AspNetUserLoginsEntityBuilder.cs b/Oqtane.Server/Migrations/EntityBuilders/AspNetUserLoginsEntityBuilder.cs index 8b176436..25fad634 100644 --- a/Oqtane.Server/Migrations/EntityBuilders/AspNetUserLoginsEntityBuilder.cs +++ b/Oqtane.Server/Migrations/EntityBuilders/AspNetUserLoginsEntityBuilder.cs @@ -23,8 +23,8 @@ namespace Oqtane.Migrations.EntityBuilders protected override AspNetUserLoginsEntityBuilder BuildTable(ColumnsBuilder table) { - LoginProvider = AddStringColumn(table, "LoginProvider", 450); - ProviderKey = AddStringColumn(table, "ProviderKey", 450); + LoginProvider = AddStringColumn(table, "LoginProvider", 128); + ProviderKey = AddStringColumn(table, "ProviderKey", 128); ProviderDisplayName = AddMaxStringColumn(table, "ProviderDisplayName", true); UserId = AddStringColumn(table, "UserId", 450); return this; diff --git a/Oqtane.Server/Migrations/EntityBuilders/BaseEntityBuilder.cs b/Oqtane.Server/Migrations/EntityBuilders/BaseEntityBuilder.cs index 5c1d0e28..1bde5b0a 100644 --- a/Oqtane.Server/Migrations/EntityBuilders/BaseEntityBuilder.cs +++ b/Oqtane.Server/Migrations/EntityBuilders/BaseEntityBuilder.cs @@ -187,9 +187,20 @@ namespace Oqtane.Migrations.EntityBuilders return table.Column(name: RewriteName(name), nullable: nullable, precision: precision, scale: scale, defaultValue: defaultValue); } - public void AlterStringColumn(string name, int length, bool nullable = false, bool unicode = true) + public void AlterStringColumn(string name, int length, bool nullable = false, bool unicode = true, string index = "") { - ActiveDatabase.AlterStringColumn(_migrationBuilder, RewriteName(name), RewriteName(EntityTableName), length, nullable, unicode); + if (index != "") + { + // indexes are in the form IndexName:Column1,Column2:Unique + var elements = index.Split(':'); + index = RewriteName(elements[0]) + ":"; + foreach (var column in elements[1].Split(',')) + { + index += RewriteName(column) + ","; + } + index = index.Substring(0, index.Length - 1) + ":" + elements[2]; + } + ActiveDatabase.AlterStringColumn(_migrationBuilder, RewriteName(name), RewriteName(EntityTableName), length, nullable, unicode, index); } public void DropColumn(string name) diff --git a/Oqtane.Server/Migrations/Tenant/02010001_ChangeFolderNameAndPathColumnsSize.cs b/Oqtane.Server/Migrations/Tenant/02010001_ChangeFolderNameAndPathColumnsSize.cs index 17d10d07..6723b51f 100644 --- a/Oqtane.Server/Migrations/Tenant/02010001_ChangeFolderNameAndPathColumnsSize.cs +++ b/Oqtane.Server/Migrations/Tenant/02010001_ChangeFolderNameAndPathColumnsSize.cs @@ -17,21 +17,15 @@ namespace Oqtane.Migrations.Tenant protected override void Up(MigrationBuilder migrationBuilder) { var folderEntityBuilder = new FolderEntityBuilder(migrationBuilder, ActiveDatabase); - // Drop the index is needed because the Path is already associated with IX_Folder - folderEntityBuilder.DropIndex("IX_Folder"); folderEntityBuilder.AlterStringColumn("Name", 256); - folderEntityBuilder.AlterStringColumn("Path", 512); - folderEntityBuilder.AddIndex("IX_Folder", new[] { "SiteId", "Path" }, true); + folderEntityBuilder.AlterStringColumn("Path", 512, false, true, "IX_Folder:SiteId,Path:true"); } protected override void Down(MigrationBuilder migrationBuilder) { var folderEntityBuilder = new FolderEntityBuilder(migrationBuilder, ActiveDatabase); - // Drop the index is needed because the Path is already associated with IX_Folder - folderEntityBuilder.DropIndex("IX_Folder"); - folderEntityBuilder.AlterStringColumn("Path", 50); folderEntityBuilder.AlterStringColumn("Name", 50); - folderEntityBuilder.AddIndex("IX_Folder", new[] { "SiteId", "Path" }, true); + folderEntityBuilder.AlterStringColumn("Path", 50, false, true, "IX_Folder:SiteId,Path:true"); } } } diff --git a/Oqtane.Server/Migrations/Tenant/03000101_ChangeFileNameColumnsSize.cs b/Oqtane.Server/Migrations/Tenant/03000101_ChangeFileNameColumnsSize.cs index 4363b013..ecf4e4d6 100644 --- a/Oqtane.Server/Migrations/Tenant/03000101_ChangeFileNameColumnsSize.cs +++ b/Oqtane.Server/Migrations/Tenant/03000101_ChangeFileNameColumnsSize.cs @@ -17,19 +17,13 @@ namespace Oqtane.Migrations.Tenant protected override void Up(MigrationBuilder migrationBuilder) { var fileEntityBuilder = new FileEntityBuilder(migrationBuilder, ActiveDatabase); - // Drop the index is needed because the Name is already associated with IX_File - fileEntityBuilder.DropIndex("IX_File"); - fileEntityBuilder.AlterStringColumn("Name", 256); - fileEntityBuilder.AddIndex("IX_File", new[] { "FolderId", "Name" }, true); + fileEntityBuilder.AlterStringColumn("Name", 256, false, true, "IX_File:FolderId,Name:true"); } protected override void Down(MigrationBuilder migrationBuilder) { var fileEntityBuilder = new FileEntityBuilder(migrationBuilder, ActiveDatabase); - // Drop the index is needed because the Name is already associated with IX_File - fileEntityBuilder.DropIndex("IX_File"); - fileEntityBuilder.AlterStringColumn("Name", 50); - fileEntityBuilder.AddIndex("IX_File", new[] { "FolderId", "Name" }, true); + fileEntityBuilder.AlterStringColumn("Name", 50, false, true, "IX_File:FolderId,Name:true"); } } } diff --git a/Oqtane.Server/Migrations/Tenant/03010001_ExpandVisitorAndUrlMappingUrls.cs b/Oqtane.Server/Migrations/Tenant/03010001_ExpandVisitorAndUrlMappingUrls.cs index 754a5b7a..5ee21120 100644 --- a/Oqtane.Server/Migrations/Tenant/03010001_ExpandVisitorAndUrlMappingUrls.cs +++ b/Oqtane.Server/Migrations/Tenant/03010001_ExpandVisitorAndUrlMappingUrls.cs @@ -20,11 +20,9 @@ namespace Oqtane.Migrations.Tenant visitorEntityBuilder.AlterStringColumn("Url", 2048); var urlMappingEntityBuilder = new UrlMappingEntityBuilder(migrationBuilder, ActiveDatabase); - // Drop the index is needed because the Url is already associated with IX_UrlMapping - urlMappingEntityBuilder.DropIndex("IX_UrlMapping"); - urlMappingEntityBuilder.AlterStringColumn("Url", 2048); urlMappingEntityBuilder.AlterStringColumn("MappedUrl", 2048); - urlMappingEntityBuilder.AddIndex("IX_UrlMapping", new[] { "SiteId", "Url" }, true); + // Url is an index column and MySQL only supports indexes of 3072 bytes (this index will be 750X4+4=3004 bytes) + urlMappingEntityBuilder.AlterStringColumn("Url", 750, false, true, "IX_UrlMapping:SiteId,Url:true"); } protected override void Down(MigrationBuilder migrationBuilder) @@ -33,11 +31,8 @@ namespace Oqtane.Migrations.Tenant visitorEntityBuilder.AlterStringColumn("Url", 500); var urlMappingEntityBuilder = new UrlMappingEntityBuilder(migrationBuilder, ActiveDatabase); - // Drop the index is needed because the Url is already associated with IX_UrlMapping - urlMappingEntityBuilder.DropIndex("IX_UrlMapping"); - urlMappingEntityBuilder.AlterStringColumn("Url", 500); urlMappingEntityBuilder.AlterStringColumn("MappedUrl", 500); - urlMappingEntityBuilder.AddIndex("IX_UrlMapping", new[] { "SiteId", "Url" }, true); + urlMappingEntityBuilder.AlterStringColumn("Url", 500, false, true, "IX_UrlMapping:SiteId,Url:true"); } } } diff --git a/Oqtane.Server/Repository/UrlMappingRepository.cs b/Oqtane.Server/Repository/UrlMappingRepository.cs index debb3a2f..375c555b 100644 --- a/Oqtane.Server/Repository/UrlMappingRepository.cs +++ b/Oqtane.Server/Repository/UrlMappingRepository.cs @@ -62,6 +62,7 @@ namespace Oqtane.Repository public UrlMapping GetUrlMapping(int siteId, string url) { + url = (url.Length > 750) ? url.Substring(0, 750) : url; var urlMapping = _db.UrlMapping.Where(item => item.SiteId == siteId && item.Url == url).FirstOrDefault(); if (urlMapping == null) { diff --git a/Oqtane.Server/wwwroot/Packages/Oqtane.Database.MySQL.nupkg.bak b/Oqtane.Server/wwwroot/Packages/Oqtane.Database.MySQL.nupkg.bak index 27f6229f..c345491a 100644 Binary files a/Oqtane.Server/wwwroot/Packages/Oqtane.Database.MySQL.nupkg.bak and b/Oqtane.Server/wwwroot/Packages/Oqtane.Database.MySQL.nupkg.bak differ diff --git a/Oqtane.Server/wwwroot/Packages/Oqtane.Database.PostgreSQL.nupkg.bak b/Oqtane.Server/wwwroot/Packages/Oqtane.Database.PostgreSQL.nupkg.bak index 36d89a51..9440bbed 100644 Binary files a/Oqtane.Server/wwwroot/Packages/Oqtane.Database.PostgreSQL.nupkg.bak and b/Oqtane.Server/wwwroot/Packages/Oqtane.Database.PostgreSQL.nupkg.bak differ diff --git a/Oqtane.Server/wwwroot/Packages/Oqtane.Database.SqlServer.nupkg.bak b/Oqtane.Server/wwwroot/Packages/Oqtane.Database.SqlServer.nupkg.bak index fb1f5299..1e0d539d 100644 Binary files a/Oqtane.Server/wwwroot/Packages/Oqtane.Database.SqlServer.nupkg.bak and b/Oqtane.Server/wwwroot/Packages/Oqtane.Database.SqlServer.nupkg.bak differ diff --git a/Oqtane.Server/wwwroot/Packages/Oqtane.Database.Sqlite.nupkg.bak b/Oqtane.Server/wwwroot/Packages/Oqtane.Database.Sqlite.nupkg.bak index ea4fa461..cbe39e9b 100644 Binary files a/Oqtane.Server/wwwroot/Packages/Oqtane.Database.Sqlite.nupkg.bak and b/Oqtane.Server/wwwroot/Packages/Oqtane.Database.Sqlite.nupkg.bak differ