コード例 #1
0
        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("}");
            }
        }
コード例 #2
0
        /// <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);
                }
            }
        }
コード例 #3
0
        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);
            }
        }
コード例 #4
0
        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("}");
            }
        }
コード例 #5
0
        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
            }
        }
コード例 #6
0
        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);
            }
        }
コード例 #7
0
        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
            }
        }
コード例 #8
0
        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;
            }
        }
コード例 #9
0
        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;
                    }
                }
            }
        }
コード例 #10
0
        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("}");
            }
        }
コード例 #11
0
        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("}");
                }
            }
        }
コード例 #12
0
        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));
            }
        }
コード例 #13
0
        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);
                }
            }
        }