Esempio n. 1
0
        /// <summary>
        /// Installer method for sensenet that uses an embedded resource as the install package.
        /// Do not use this method directly from your code. Use a higher level
        /// installer method instead.
        /// </summary>
        /// <param name="assembly">The assembly that contains the embedded package.</param>
        /// <param name="packageName">Name of the package, including folder prefixes inside the assembly.</param>
        public Installer InstallSenseNet(Assembly assembly, string packageName)
        {
            // switch off indexing so that the first repo start does not require a working index
            var origIndexingValue = RepositoryBuilder.StartIndexingEngine;

            RepositoryBuilder.StartIndexingEngine(false);

            Logger.PackageName = packageName;
            Logger.Create(LogLevel.Default, null, _logger);
            Logger.LogMessage("Accessing sensenet database...");

            // Make sure that the database exists and contains the schema
            // necessary for importing initial content items.
            var dbExists = Providers.Instance.DataStore
                           .IsDatabaseReadyAsync(CancellationToken.None).GetAwaiter().GetResult();

            if (!dbExists)
            {
                Logger.LogMessage("Installing database...");
                var timer = Stopwatch.StartNew();

                Providers.Instance.DataStore
                .InstallDatabaseAsync(RepositoryBuilder.InitialData, CancellationToken.None).GetAwaiter().GetResult();

                Logger.LogMessage("Database installed.");

                // install custom security entries if provided
                if (RepositoryBuilder.InitialData?.Permissions?.Count > 0)
                {
                    using (Repository.Start(RepositoryBuilder))
                    {
                        Logger.LogMessage("Installing default security structure...");

                        SecurityHandler.SecurityInstaller.InstallDefaultSecurityStructure(RepositoryBuilder.InitialData);
                    }
                }

                // prepare package: extract it to the file system
                var packageFolder = UnpackEmbeddedPackage(assembly, packageName);

                ExecutePackage(packageFolder);

                timer.Stop();

                Logger.LogMessage($"Database install finished. Elapsed time: {timer.Elapsed}");
            }
            else
            {
                // If the database already exists, we assume that it also contains
                // all the necessary content items.
                Logger.LogMessage("Database already exists.");
            }

            // Reset the original indexing setting so that subsequent packages use the
            // same value as intended by the caller.
            RepositoryBuilder.StartIndexingEngine(origIndexingValue);

            return(this);
        }