private void generateServerSideConsoleProjectCode(DevelopmentInstallation installation, ServerSideConsoleProject project) { var projectGeneratedCodeFolderPath = EwlStatics.CombinePaths(installation.GeneralLogic.Path, project.Name, "Generated Code"); Directory.CreateDirectory(projectGeneratedCodeFolderPath); var isuFilePath = EwlStatics.CombinePaths(projectGeneratedCodeFolderPath, "ISU.cs"); IoMethods.DeleteFile(isuFilePath); using (TextWriter writer = new StreamWriter(isuFilePath)) { writer.WriteLine("using System;"); writer.WriteLine("using System.Reflection;"); writer.WriteLine("using System.Runtime.InteropServices;"); writer.WriteLine("using System.Threading;"); writer.WriteLine("using EnterpriseWebLibrary;"); writer.WriteLine("using EnterpriseWebLibrary.DataAccess;"); writer.WriteLine(); writeAssemblyInfo(writer, installation, project.Name); writer.WriteLine(); writer.WriteLine("namespace " + project.NamespaceAndAssemblyName + " {"); writer.WriteLine("internal static partial class Program {"); writer.WriteLine("[ MTAThread ]"); writer.WriteLine("private static int Main( string[] args ) {"); writer.WriteLine("SystemInitializer globalInitializer = null;"); writer.WriteLine("initGlobalInitializer( ref globalInitializer );"); writer.WriteLine("var dataAccessState = new ThreadLocal<DataAccessState>( () => new DataAccessState() );"); writer.WriteLine( "GlobalInitializationOps.InitStatics( globalInitializer, \"" + project.Name + "\", false, mainDataAccessStateGetter: () => dataAccessState.Value );"); writer.WriteLine("try {"); writer.WriteLine("return GlobalInitializationOps.ExecuteAppWithStandardExceptionHandling( () => ewlMain( args ) );"); writer.WriteLine("}"); writer.WriteLine("finally {"); writer.WriteLine("GlobalInitializationOps.CleanUpStatics();"); writer.WriteLine("}"); writer.WriteLine("}"); writer.WriteLine("static partial void initGlobalInitializer( ref SystemInitializer globalInitializer );"); writer.WriteLine("static partial void ewlMain( string[] args );"); writer.WriteLine("}"); writer.WriteLine("}"); } }
/// <summary> /// Deletes all (but one - the last file is never deleted) *.zip files in the given folder that are old, but keeps increasingly sparse archive packages alive. /// </summary> private void deleteOldFiles(string folderPath, bool keepHistoricalArchive) { if (!Directory.Exists(folderPath)) { return; } var files = IoMethods.GetFilePathsInFolder(folderPath, "*.zip"); // Never delete the last (most recent) file. It makes it really inconvenient for developers if this happens. foreach (var fileName in files.Skip(1)) { var creationTime = File.GetCreationTime(fileName); // We will delete everything more than 2 months old, keep saturday backups between 1 week and 2 months old, and keep everything less than 4 days old. if (!keepHistoricalArchive || creationTime < DateTime.Now.AddMonths(-2) || (creationTime < DateTime.Now.AddDays(-4) && creationTime.DayOfWeek != DayOfWeek.Saturday)) { IoMethods.DeleteFile(fileName); } } }
private void deleteAndReCreateFromFile(DBConnection cn, string filePath, bool keepDbInStandbyMode) { // NOTE: Instead of catching exceptions, figure out if the database exists by querying. try { // Gets rid of existing connections. This doesn't need to be executed against the master database, but it's convenient because it saves us from needing // a second database connection. executeLongRunningCommand(cn, "ALTER DATABASE " + info.Database + " SET SINGLE_USER WITH ROLLBACK IMMEDIATE"); executeLongRunningCommand(cn, "DROP DATABASE " + info.Database); } catch (Exception) { // The database did not exist. That's fine. } Directory.CreateDirectory(sqlServerFilesFolderPath); try { IoMethods.CopyFile(filePath, backupFilePath); try { // WITH MOVE is required so that multiple instances of the same system's database (RsisDev and RsisTesting, for example) can exist on the same machine // without their physical files colliding. var restoreCommand = "RESTORE DATABASE " + info.Database + " FROM DISK = '" + backupFilePath + "'" + " WITH MOVE '" + dataLogicalFileName + "' TO '" + StandardLibraryMethods.CombinePaths(sqlServerFilesFolderPath, info.Database + ".mdf") + "', MOVE '" + logLogicalFileName + "' TO '" + StandardLibraryMethods.CombinePaths(sqlServerFilesFolderPath, info.Database + ".ldf") + "'"; if (keepDbInStandbyMode) { restoreCommand += ", STANDBY = '" + getStandbyFilePath() + "'"; } executeLongRunningCommand(cn, restoreCommand); } catch (Exception e) { throw new UserCorrectableException("Failed to create database from file. Please try the operation again after obtaining a new database file.", e); } } finally { IoMethods.DeleteFile(backupFilePath); } }
private static void createStaticFileLogicTemplate(string folderPath, string itemNamespace, string className) { var templateFilePath = EwlStatics.CombinePaths(folderPath, className + DataAccess.DataAccessStatics.CSharpTemplateFileExtension); IoMethods.DeleteFile(templateFilePath); // If a real file exists, don’t create a template. if (File.Exists(EwlStatics.CombinePaths(folderPath, className + ".cs"))) { return; } using (var writer = new StreamWriter(templateFilePath, false, Encoding.UTF8)) { writer.WriteLine("namespace {0} {{".FormatWith(itemNamespace)); writer.WriteLine(" partial class {0} {{".FormatWith(className)); writer.WriteLine( " // IMPORTANT: Change extension from \"{0}\" to \".cs\" before including in project and editing.".FormatWith( DataAccess.DataAccessStatics.CSharpTemplateFileExtension)); writer.WriteLine(" }"); writer.WriteLine("}"); } }
internal static void WritePartialClass(DBConnection cn, string libraryBasePath, string namespaceDeclaration, IDatabase database, string tableName) { var folderPath = Utility.CombinePaths(libraryBasePath, "DataAccess", "TableRetrieval"); var templateFilePath = Utility.CombinePaths(folderPath, GetClassName(cn, tableName) + DataAccessStatics.CSharpTemplateFileExtension); IoMethods.DeleteFile(templateFilePath); // If a real file exists, don't create a template. if (File.Exists(Utility.CombinePaths(folderPath, GetClassName(cn, tableName) + ".cs"))) { return; } using (var writer = IoMethods.GetTextWriterForWrite(templateFilePath)) { writer.WriteLine(namespaceDeclaration); writer.WriteLine(" partial class "+ GetClassName(cn, tableName) + " {"); writer.WriteLine( " // IMPORTANT: Change extension from \"{0}\" to \".cs\" before including in project and editing.".FormatWith( DataAccessStatics.CSharpTemplateFileExtension)); writer.WriteLine(" }"); // class writer.WriteLine("}"); // namespace } }
private void generateWebConfigAndCodeForWebProject(DevelopmentInstallation installation, WebProject project) { var application = installation.ExistingInstallationLogic.RuntimeConfiguration.WebApplications.Single(i => i.Name == project.name); // This must be done before web meta logic generation, which can be affected by the contents of Web.config files. WebConfigStatics.GenerateWebConfig(application, project); var webProjectGeneratedCodeFolderPath = EwlStatics.CombinePaths(application.Path, "Generated Code"); Directory.CreateDirectory(webProjectGeneratedCodeFolderPath); var webProjectIsuFilePath = EwlStatics.CombinePaths(webProjectGeneratedCodeFolderPath, "ISU.cs"); IoMethods.DeleteFile(webProjectIsuFilePath); using (TextWriter writer = new StreamWriter(webProjectIsuFilePath)) { writer.WriteLine("using System;"); writer.WriteLine("using System.Collections.Generic;"); writer.WriteLine("using System.Collections.ObjectModel;"); writer.WriteLine("using System.Globalization;"); writer.WriteLine("using System.Linq;"); writer.WriteLine("using System.Reflection;"); writer.WriteLine("using System.Runtime.InteropServices;"); writer.WriteLine("using System.Web;"); writer.WriteLine("using System.Web.UI;"); writer.WriteLine("using System.Web.UI.WebControls;"); writer.WriteLine("using EnterpriseWebLibrary;"); writer.WriteLine("using EnterpriseWebLibrary.DataAccess;"); writer.WriteLine("using EnterpriseWebLibrary.EnterpriseWebFramework;"); writer.WriteLine("using EnterpriseWebLibrary.EnterpriseWebFramework.Controls;"); writer.WriteLine("using NodaTime;"); writer.WriteLine("using Tewl.InputValidation;"); writer.WriteLine("using Tewl.Tools;"); writer.WriteLine(); writeAssemblyInfo(writer, installation, project.name); writer.WriteLine(); CodeGeneration.WebMetaLogic.WebMetaLogicStatics.Generate(writer, application.Path, project); } }
internal static void WritePartialClass( DBConnection cn, string libraryBasePath, string namespaceDeclaration, Database database, string tableName, bool isRevisionHistoryTable) { // We do not create templates for direct modification classes. var folderPath = StandardLibraryMethods.CombinePaths( libraryBasePath, "DataAccess", database.SecondaryDatabaseName + "Modification" ); var templateFilePath = StandardLibraryMethods.CombinePaths( folderPath, GetClassName( cn, tableName, isRevisionHistoryTable, isRevisionHistoryTable ) + DataAccessStatics.CSharpTemplateFileExtension ); IoMethods.DeleteFile( templateFilePath ); // If a real file exists, don't create a template. if( File.Exists( StandardLibraryMethods.CombinePaths( folderPath, GetClassName( cn, tableName, isRevisionHistoryTable, isRevisionHistoryTable ) + ".cs" ) ) ) return; using( var templateWriter = IoMethods.GetTextWriterForWrite( templateFilePath ) ) { templateWriter.WriteLine( namespaceDeclaration ); templateWriter.WriteLine( " partial class " + GetClassName( cn, tableName, isRevisionHistoryTable, isRevisionHistoryTable ) + " {" ); templateWriter.WriteLine( " // IMPORTANT: Change extension from \"{0}\" to \".cs\" before including in project and editing.".FormatWith( DataAccessStatics.CSharpTemplateFileExtension ) ); templateWriter.WriteLine( " }" ); // class templateWriter.WriteLine( "}" ); // namespace } }
void Database.DeleteAndReCreateFromFile(string filePath) { executeDbMethodWithSpecifiedDatabaseInfo( new OracleInfo( (info as DatabaseInfo).SecondaryDatabaseName, info.DataSource, "sys", ConfigurationLogic.OracleSysPassword, info.SupportsConnectionPooling, info.SupportsLinguisticIndexes), cn => { executeLongRunningCommand(cn, "CREATE OR REPLACE DIRECTORY " + dataPumpOracleDirectoryName + " AS '" + dataPumpFolderPath + "'"); deleteAndReCreateUser(cn); }); try { IoMethods.ExecuteWithTempFolder( tempFolderPath => { var folderPath = EwlStatics.CombinePaths(tempFolderPath, "Database File"); ZipOps.UnZipFileAsFolder(filePath, folderPath); try { IoMethods.CopyFile(EwlStatics.CombinePaths(folderPath, databaseFileDumpFileName), getDumpFilePath()); executeMethodWithDbExceptionHandling( delegate { try { EwlStatics.RunProgram( "impdp", getLogonString() + " DIRECTORY=" + dataPumpOracleDirectoryName + " DUMPFILE=\"\"\"" + getDumpFileName() + "\"\"\" NOLOGFILE=y REMAP_SCHEMA=" + File.ReadAllText(EwlStatics.CombinePaths(folderPath, databaseFileSchemaNameFileName)) + ":" + info.UserAndSchema, "", true); } catch (Exception e) { throwUserCorrectableExceptionIfNecessary(e); if (e is FileNotFoundException) { throw new UserCorrectableException("The schema name file was not found, probably because of a corrupt database file in the data package.", e); } // Secondary databases such as RLE cause procedure compilation errors when imported, and since we have no way of // distinguishing these from legitimate import problems, we have no choice but to ignore all exceptions. if ((info as DatabaseInfo).SecondaryDatabaseName.Length == 0) { throw DataAccessMethods.CreateDbConnectionException(info, "re-creating (from file)", e); } } }); } finally { IoMethods.DeleteFile(getDumpFilePath()); } }); } catch { // We don't want to leave a partial user/schema on the machine since it may confuse future ISU operations. executeDbMethodWithSpecifiedDatabaseInfo( new OracleInfo( (info as DatabaseInfo).SecondaryDatabaseName, info.DataSource, "sys", ConfigurationLogic.OracleSysPassword, info.SupportsConnectionPooling, info.SupportsLinguisticIndexes), deleteUser); throw; } }
private void updateMercurialIgnoreFile(DevelopmentInstallation installation) { var filePath = EwlStatics.CombinePaths(installation.GeneralLogic.Path, ".hgignore"); var lines = File.Exists(filePath) ? File.ReadAllLines(filePath) : new string[0]; IoMethods.DeleteFile(filePath); using (TextWriter writer = new StreamWriter(filePath)) { const string regionBegin = "# EWL-REGION"; const string regionEnd = "# END-EWL-REGION"; writer.WriteLine(regionBegin); writer.WriteLine("syntax: glob"); writer.WriteLine(); writer.WriteLine(".vs/{0}/v15/.suo".FormatWith(installation.ExistingInstallationLogic.RuntimeConfiguration.SystemName)); writer.WriteLine(".vs/{0}/v15/sqlite3/storage.ide".FormatWith(installation.ExistingInstallationLogic.RuntimeConfiguration.SystemName)); writer.WriteLine("packages/"); writer.WriteLine(installation.ExistingInstallationLogic.RuntimeConfiguration.SystemName + ".sln.DotSettings.user"); writer.WriteLine("Error Log.txt"); writer.WriteLine("*.csproj.user"); writer.WriteLine("*" + CodeGeneration.DataAccess.DataAccessStatics.CSharpTemplateFileExtension); writer.WriteLine(); writer.WriteLine("Solution Files/bin/"); writer.WriteLine("Solution Files/obj/"); writer.WriteLine(); writer.WriteLine("Library/bin/"); writer.WriteLine("Library/obj/"); writer.WriteLine("Library/Generated Code/"); foreach (var asposeLicenseFileName in asposeLicenseFileNames) { writer.WriteLine("Library/" + InstallationFileStatics.FilesFolderName + "/" + asposeLicenseFileName); } foreach (var webProject in installation.DevelopmentInstallationLogic.DevelopmentConfiguration.webProjects ?? new WebProject[0]) { writer.WriteLine(); writer.WriteLine(webProject.name + "/bin/"); writer.WriteLine(webProject.name + "/obj/"); writer.WriteLine(webProject.name + "/" + StaticFileHandler.EwfFolderName + "/"); writer.WriteLine(webProject.name + "/" + AppStatics.StandardLibraryFilesFileName); writer.WriteLine(webProject.name + "/Generated Code/"); } foreach (var service in installation.ExistingInstallationLogic.RuntimeConfiguration.WindowsServices) { writer.WriteLine(); writer.WriteLine(service.Name + "/bin/"); writer.WriteLine(service.Name + "/obj/"); writer.WriteLine(service.Name + "/Generated Code/"); } foreach (var project in installation.DevelopmentInstallationLogic.DevelopmentConfiguration.ServerSideConsoleProjectsNonNullable) { writer.WriteLine(); writer.WriteLine(project.Name + "/bin/"); writer.WriteLine(project.Name + "/obj/"); writer.WriteLine(project.Name + "/Generated Code/"); } if (installation.DevelopmentInstallationLogic.DevelopmentConfiguration.clientSideAppProject != null) { writer.WriteLine(); writer.WriteLine(installation.DevelopmentInstallationLogic.DevelopmentConfiguration.clientSideAppProject.name + "/bin/"); writer.WriteLine(installation.DevelopmentInstallationLogic.DevelopmentConfiguration.clientSideAppProject.name + "/obj/"); writer.WriteLine(installation.DevelopmentInstallationLogic.DevelopmentConfiguration.clientSideAppProject.name + "/Generated Code/"); } writer.WriteLine(); writer.WriteLine(regionEnd); var skipping = false; foreach (var line in lines) { if (line == regionBegin) { skipping = true; } if (!skipping) { writer.WriteLine(line); } if (line == regionEnd) { skipping = false; } } } }
private void generateWindowsServiceCode(DevelopmentInstallation installation, WindowsService service) { var serviceProjectGeneratedCodeFolderPath = EwlStatics.CombinePaths(installation.GeneralLogic.Path, service.Name, "Generated Code"); Directory.CreateDirectory(serviceProjectGeneratedCodeFolderPath); var isuFilePath = EwlStatics.CombinePaths(serviceProjectGeneratedCodeFolderPath, "ISU.cs"); IoMethods.DeleteFile(isuFilePath); using (TextWriter writer = new StreamWriter(isuFilePath)) { writer.WriteLine("using System;"); writer.WriteLine("using System.ComponentModel;"); writer.WriteLine("using System.Reflection;"); writer.WriteLine("using System.Runtime.InteropServices;"); writer.WriteLine("using System.ServiceProcess;"); writer.WriteLine("using System.Threading;"); writer.WriteLine("using EnterpriseWebLibrary;"); writer.WriteLine("using EnterpriseWebLibrary.DataAccess;"); writer.WriteLine("using EnterpriseWebLibrary.WindowsServiceFramework;"); writer.WriteLine(); writeAssemblyInfo(writer, installation, service.Name); writer.WriteLine(); writer.WriteLine("namespace " + service.NamespaceAndAssemblyName + " {"); writer.WriteLine("internal static partial class Program {"); writer.WriteLine("[ MTAThread ]"); writer.WriteLine("private static void Main() {"); writer.WriteLine("InitStatics();"); writer.WriteLine("try {"); writer.WriteLine( "TelemetryStatics.ExecuteBlockWithStandardExceptionHandling( () => ServiceBase.Run( new ServiceBaseAdapter( new " + service.Name.EnglishToPascal() + "() ) ) );"); writer.WriteLine("}"); writer.WriteLine("finally {"); writer.WriteLine("GlobalInitializationOps.CleanUpStatics();"); writer.WriteLine("}"); writer.WriteLine("}"); writer.WriteLine("internal static void InitStatics() {"); writer.WriteLine("SystemInitializer globalInitializer = null;"); writer.WriteLine("initGlobalInitializer( ref globalInitializer );"); writer.WriteLine("var dataAccessState = new ThreadLocal<DataAccessState>( () => new DataAccessState() );"); writer.WriteLine( "GlobalInitializationOps.InitStatics( globalInitializer, \"" + service.Name + "\" + \" Executable\", false, mainDataAccessStateGetter: () => dataAccessState.Value );"); writer.WriteLine("}"); writer.WriteLine("static partial void initGlobalInitializer( ref SystemInitializer globalInitializer );"); writer.WriteLine("}"); writer.WriteLine("[ RunInstaller( true ) ]"); writer.WriteLine("public class Installer: System.Configuration.Install.Installer {"); writer.WriteLine("public Installer() {"); writer.WriteLine("Program.InitStatics();"); writer.WriteLine("try {"); writer.WriteLine("var code = GlobalInitializationOps.ExecuteAppWithStandardExceptionHandling( delegate {"); writer.WriteLine("Installers.Add( WindowsServiceMethods.CreateServiceProcessInstaller() );"); writer.WriteLine("Installers.Add( WindowsServiceMethods.CreateServiceInstaller( new " + service.Name.EnglishToPascal() + "() ) );"); writer.WriteLine("} );"); writer.WriteLine("if( code != 0 )"); writer.WriteLine( "throw new ApplicationException( \"Service installer objects could not be created. More information should be available in a separate error email from the service executable.\" );"); writer.WriteLine("}"); writer.WriteLine("finally {"); writer.WriteLine("GlobalInitializationOps.CleanUpStatics();"); writer.WriteLine("}"); writer.WriteLine("}"); writer.WriteLine("}"); writer.WriteLine("internal partial class " + service.Name.EnglishToPascal() + ": WindowsServiceBase {"); writer.WriteLine("internal " + service.Name.EnglishToPascal() + "() {}"); writer.WriteLine("string WindowsServiceBase.Name { get { return \"" + service.Name + "\"; } }"); writer.WriteLine("}"); writer.WriteLine("}"); } }
private void generateLibraryCode(DevelopmentInstallation installation) { var libraryGeneratedCodeFolderPath = EwlStatics.CombinePaths(installation.DevelopmentInstallationLogic.LibraryPath, "Generated Code"); Directory.CreateDirectory(libraryGeneratedCodeFolderPath); var isuFilePath = EwlStatics.CombinePaths(libraryGeneratedCodeFolderPath, "ISU.cs"); IoMethods.DeleteFile(isuFilePath); using (TextWriter writer = new StreamWriter(isuFilePath)) { // Don't add "using System" here. It will create a huge number of ReSharper warnings in the generated code file. writer.WriteLine("using System.Collections.Generic;"); writer.WriteLine("using System.Data;"); // Necessary for stored procedure logic writer.WriteLine("using System.Data.Common;"); writer.WriteLine("using System.Diagnostics;"); // Necessary for ServerSideConsoleAppStatics writer.WriteLine("using System.Linq;"); writer.WriteLine("using System.Reflection;"); writer.WriteLine("using System.Runtime.InteropServices;"); writer.WriteLine("using System.Web.UI;"); writer.WriteLine("using System.Web.UI.WebControls;"); writer.WriteLine("using EnterpriseWebLibrary;"); writer.WriteLine("using EnterpriseWebLibrary.Caching;"); writer.WriteLine("using EnterpriseWebLibrary.Collections;"); // Necessary for row constants writer.WriteLine("using EnterpriseWebLibrary.Configuration;"); writer.WriteLine("using EnterpriseWebLibrary.DataAccess;"); writer.WriteLine("using EnterpriseWebLibrary.DataAccess.CommandWriting;"); writer.WriteLine("using EnterpriseWebLibrary.DataAccess.CommandWriting.Commands;"); writer.WriteLine("using EnterpriseWebLibrary.DataAccess.CommandWriting.InlineConditionAbstraction;"); writer.WriteLine("using EnterpriseWebLibrary.DataAccess.CommandWriting.InlineConditionAbstraction.Conditions;"); writer.WriteLine("using EnterpriseWebLibrary.DataAccess.RetrievalCaching;"); writer.WriteLine("using EnterpriseWebLibrary.DataAccess.RevisionHistory;"); writer.WriteLine("using EnterpriseWebLibrary.DataAccess.StandardModification;"); writer.WriteLine("using EnterpriseWebLibrary.Email;"); writer.WriteLine("using EnterpriseWebLibrary.EnterpriseWebFramework;"); writer.WriteLine("using EnterpriseWebLibrary.EnterpriseWebFramework.Controls;"); writer.WriteLine("using EnterpriseWebLibrary.InputValidation;"); writer.WriteLine(); writeAssemblyInfo(writer, installation, "Library"); writer.WriteLine(); var recognizedInstallation = installation as RecognizedDevelopmentInstallation; if (ConfigurationLogic.SystemProviderExists && !installation.DevelopmentInstallationLogic.SystemIsEwl && (recognizedInstallation == null || !recognizedInstallation.SystemIsEwlCacheCoordinator)) { generateGeneralProvider(writer, installation); } if (installation.ExistingInstallationLogic.RuntimeConfiguration.WebApplications.Any()) { writer.WriteLine(); writer.WriteLine("namespace " + installation.DevelopmentInstallationLogic.DevelopmentConfiguration.LibraryNamespaceAndAssemblyName + " {"); writer.WriteLine("public static class WebApplicationNames {"); foreach (var i in installation.ExistingInstallationLogic.RuntimeConfiguration.WebApplications) { writer.WriteLine("public const string {0} = \"{1}\";".FormatWith(EwlStatics.GetCSharpIdentifier(i.Name.EnglishToPascal()), i.Name)); } writer.WriteLine("}"); writer.WriteLine("}"); } writer.WriteLine(); TypedCssClassStatics.Generate( installation.GeneralLogic.Path, installation.DevelopmentInstallationLogic.DevelopmentConfiguration.LibraryNamespaceAndAssemblyName, writer); writer.WriteLine(); generateServerSideConsoleAppStatics(writer, installation); generateDataAccessCode(writer, installation); var emailTemplateFolderPath = EwlStatics.CombinePaths( InstallationFileStatics.GetGeneralFilesFolderPath(installation.GeneralLogic.Path, true), InstallationFileStatics.FilesFolderName, EmailTemplate.TemplateFolderName); if (Directory.Exists(emailTemplateFolderPath)) { writer.WriteLine(); writer.WriteLine("namespace " + installation.DevelopmentInstallationLogic.DevelopmentConfiguration.LibraryNamespaceAndAssemblyName + " {"); writer.WriteLine("public static class EmailTemplates {"); foreach (var i in IoMethods.GetFileNamesInFolder(emailTemplateFolderPath, searchPattern: "*.html")) { writer.WriteLine( "public static readonly EmailTemplateName {0} = new EmailTemplateName( \"{1}\" );".FormatWith( EwlStatics.GetCSharpIdentifier(Path.GetFileNameWithoutExtension(i).EnglishToPascal()), i)); } writer.WriteLine("}"); writer.WriteLine("}"); } } }
private void deleteAndReCreateFromFile(DBConnection cn, string filePath) { // NOTE: Instead of catching exceptions, figure out if the database exists by querying. try { // Gets rid of existing connections. These don't need to be executed against the master database, but it's convenient because it saves us from needing // a second database connection. executeLongRunningCommand(cn, "ALTER DATABASE {0} SET AUTO_UPDATE_STATISTICS_ASYNC OFF".FormatWith(info.Database)); executeLongRunningCommand(cn, "ALTER DATABASE {0} SET SINGLE_USER WITH ROLLBACK IMMEDIATE".FormatWith(info.Database)); executeLongRunningCommand(cn, "DROP DATABASE " + info.Database); } catch (Exception) { // The database did not exist. That's fine. } var sqlServerFilesFolderPath = EwlStatics.CombinePaths(ConfigurationStatics.EwlFolderPath, "SQL Server Databases"); Directory.CreateDirectory(sqlServerFilesFolderPath); var dataFilePath = EwlStatics.CombinePaths(sqlServerFilesFolderPath, info.Database + ".mdf"); var logFilePath = EwlStatics.CombinePaths(sqlServerFilesFolderPath, info.Database + ".ldf"); if (filePath.Any()) { try { IoMethods.CopyFile(filePath, backupFilePath); try { // WITH MOVE is required so that multiple instances of the same system's database (RsisDev and RsisTesting, for example) can exist on the same machine // without their physical files colliding. executeLongRunningCommand( cn, "RESTORE DATABASE " + info.Database + " FROM DISK = '" + backupFilePath + "'" + " WITH MOVE '" + dataLogicalFileName + "' TO '" + dataFilePath + "', MOVE '" + logLogicalFileName + "' TO '" + logFilePath + "'"); } catch (Exception e) { throw new UserCorrectableException("Failed to create database from file. Please try the operation again after obtaining a new database file.", e); } } finally { IoMethods.DeleteFile(backupFilePath); } } else { executeLongRunningCommand( cn, @"CREATE DATABASE {0} ON ( NAME = {1}, FILENAME = '{2}', SIZE = 100MB, FILEGROWTH = 15% ) LOG ON ( NAME = {3}, FILENAME = '{4}', SIZE = 10MB, MAXSIZE = 1000MB, FILEGROWTH = 100MB )".FormatWith(info.Database, dataLogicalFileName, dataFilePath, logLogicalFileName, logFilePath)); } }
private void packageWebApps(DevelopmentInstallation installation, string serverSideLogicFolderPath) { // NOTE: When packaging web apps, try to find a way to exclude data files. Apparently web deployment projects include these in their output even though // they aren't part of the source web projects. NOTE ON NOTE: We don't use WDPs anymore, so maybe we can eliminate this note. foreach (var webProject in installation.DevelopmentInstallationLogic.DevelopmentConfiguration.webProjects ?? new WebProject[0]) { var webAppPath = EwlStatics.CombinePaths(serverSideLogicFolderPath, webProject.name); // Pre-compile the web project. try { TewlContrib.ProcessTools.RunProgram( EwlStatics.CombinePaths(RuntimeEnvironment.GetRuntimeDirectory(), "aspnet_compiler"), "-v \"/" + webProject.name + ".csproj\" -p \"" + EwlStatics.CombinePaths(installation.GeneralLogic.Path, webProject.name) + "\" " + (webProject.IsUpdateableWhenInstalledSpecified && webProject.IsUpdateableWhenInstalled ? "-u " : "") + "-f \"" + webAppPath + "\"", "", true); } catch (Exception e) { throw new UserCorrectableException("ASP.NET pre-compilation failed for web project " + webProject.name + ".", e); } try { TewlContrib.ProcessTools.RunProgram( EwlStatics.CombinePaths(AppStatics.DotNetToolsFolderPath, "aspnet_merge"), "\"" + webAppPath + "\" -o " + webProject.NamespaceAndAssemblyName + ".Package -a -copyattrs", "", true); } catch (Exception e) { throw new UserCorrectableException("ASP.NET Merge Tool failed for web project " + webProject.name + ".", e); } // Delete files and folders that aren't necessary for installed installations. IoMethods.DeleteFolder(EwlStatics.CombinePaths(webAppPath, "Generated Code")); IoMethods.DeleteFolder(EwlStatics.CombinePaths(webAppPath, "obj")); IoMethods.DeleteFile(EwlStatics.CombinePaths(webAppPath, webProject.name + ".csproj")); IoMethods.DeleteFile(EwlStatics.CombinePaths(webAppPath, webProject.name + ".csproj.user")); IoMethods.DeleteFile(EwlStatics.CombinePaths(webAppPath, webProject.name + ".csproj.vspscc")); var webConfigPath = EwlStatics.CombinePaths(webAppPath, WebApplication.WebConfigFileName); File.WriteAllText(webConfigPath, File.ReadAllText(webConfigPath).Replace("debug=\"true\"", "debug=\"false\"")); } if (installation.DevelopmentInstallationLogic.SystemIsEwl) { IoMethods.CopyFolder( EwlStatics.CombinePaths(installation.GeneralLogic.Path, EwlStatics.CoreProjectName, StaticFile.FrameworkStaticFilesSourceFolderPath), EwlStatics.CombinePaths(serverSideLogicFolderPath, InstallationFileStatics.WebFrameworkStaticFilesFolderName), false); IoMethods.DeleteFolder( EwlStatics.CombinePaths( serverSideLogicFolderPath, InstallationFileStatics.WebFrameworkStaticFilesFolderName, AppStatics.StaticFileLogicFolderName)); } else { var frameworkStaticFilesFolderPath = EwlStatics.CombinePaths( installation.GeneralLogic.Path, InstallationFileStatics.WebFrameworkStaticFilesFolderName); if (Directory.Exists(frameworkStaticFilesFolderPath)) { IoMethods.CopyFolder( frameworkStaticFilesFolderPath, EwlStatics.CombinePaths(serverSideLogicFolderPath, InstallationFileStatics.WebFrameworkStaticFilesFolderName), false); } } }