diff --git a/src/Orchard.Web/Modules/Orchard.MultiTenancy/Services/TenantService.cs b/src/Orchard.Web/Modules/Orchard.MultiTenancy/Services/TenantService.cs index 4eb7c26da..60edac908 100644 --- a/src/Orchard.Web/Modules/Orchard.MultiTenancy/Services/TenantService.cs +++ b/src/Orchard.Web/Modules/Orchard.MultiTenancy/Services/TenantService.cs @@ -7,6 +7,7 @@ using Orchard.Environment.Extensions; using Orchard.Environment.ShellBuilders; using Orchard.Data.Migration.Interpreters; using Orchard.Data.Migration.Schema; +using Orchard.Data.Providers; using Orchard.Data; using Orchard.Logging; @@ -104,14 +105,37 @@ namespace Orchard.MultiTenancy.Services { } private IEnumerable GetTenantDatabaseTableNames(IWorkContextScope environment) { - var sessionFactoryHolder = environment.Resolve(); - var configuration = sessionFactoryHolder.GetConfiguration(); + var shellSettings = environment.Resolve(); + var sqlStatementProviders = environment.Resolve>(); + var transactionManager = environment.Resolve(); + var session = transactionManager.GetSession(); + var tenants = GetTenants().Where(x => x.Name != shellSettings.Name); - var result = - from mapping in configuration.ClassMappings - select mapping.Table.Name; + string command = null; + IEnumerable result = null; - return result.ToArray(); + foreach (var sqlStatementProvider in sqlStatementProviders) { + if (!String.Equals(sqlStatementProvider.DataProvider, shellSettings.DataProvider)) { + continue; + } + + command = sqlStatementProvider.GetStatement("table_names") ?? command; + } + + if (command != null) { + var tableNames = session.CreateSQLQuery(command).List(); + + if (string.IsNullOrWhiteSpace(shellSettings.DataTablePrefix)) { + // If current tenant doesn't has table prefix, then exclude all tables which have prefixes for other tenants + result = tableNames.Where(table => !tenants.Any(tenant => table.StartsWith(tenant.DataTablePrefix + "_"))); + } + else { + // If current tenant has table prefix, then filter tables which have the right prefix + result = tableNames.Where(table => table.StartsWith(shellSettings.DataTablePrefix + "_")); + } + } + + return (result ?? Enumerable.Empty()).OrderBy(x => x).ToList(); } private void DropTenantDatabaseTables(IWorkContextScope environment) { diff --git a/src/Orchard/Data/Providers/MySqlStatementProvider.cs b/src/Orchard/Data/Providers/MySqlStatementProvider.cs index ea91c1c1c..aad73b6a1 100644 --- a/src/Orchard/Data/Providers/MySqlStatementProvider.cs +++ b/src/Orchard/Data/Providers/MySqlStatementProvider.cs @@ -8,6 +8,8 @@ switch (command) { case "random": return "rand()"; + case "table_names": + return "select table_name from information_schema.tables where table_schema = DATABASE() and table_type='BASE TABLE'"; } return null; diff --git a/src/Orchard/Data/Providers/PostgreSqlStatementProvider.cs b/src/Orchard/Data/Providers/PostgreSqlStatementProvider.cs index a5db68af6..77a7f9f2f 100644 --- a/src/Orchard/Data/Providers/PostgreSqlStatementProvider.cs +++ b/src/Orchard/Data/Providers/PostgreSqlStatementProvider.cs @@ -8,6 +8,8 @@ switch (command) { case "random": return "random()"; + case "table_names": + return "select table_name from information_schema.tables where table_schema = 'public' and table_type = 'BASE TABLE'"; } return null; diff --git a/src/Orchard/Data/Providers/SqlCeStatementProvider.cs b/src/Orchard/Data/Providers/SqlCeStatementProvider.cs index faed62e11..215c69dd8 100644 --- a/src/Orchard/Data/Providers/SqlCeStatementProvider.cs +++ b/src/Orchard/Data/Providers/SqlCeStatementProvider.cs @@ -8,6 +8,8 @@ switch (command) { case "random": return "newid()"; + case "table_names": + return "select table_name from information_schema.tables"; } return null; diff --git a/src/Orchard/Data/Providers/SqlServerStatementProvider.cs b/src/Orchard/Data/Providers/SqlServerStatementProvider.cs index 1fb6c6d03..dffe2ffe2 100644 --- a/src/Orchard/Data/Providers/SqlServerStatementProvider.cs +++ b/src/Orchard/Data/Providers/SqlServerStatementProvider.cs @@ -8,6 +8,8 @@ switch (command) { case "random": return "newid()"; + case "table_names": + return "select name from sys.tables"; } return null;