コード例 #1
0
        /// <summary>
        /// Generates SQL to delete tables and columns that are deleted since last version.
        /// </summary>
        /// <returns>The generated SQL in an SQLUpdateCommand.</returns>
        public SqlUpdateCommand[] GenerateSqlDeleteDiff()
        {
            // Ta bort databaskolumner som har tagits bort
            List <SqlUpdateCommand> updateCommands = new List <SqlUpdateCommand>();

            DatabaseSchema fromDatabase = new DatabaseSchema(DatabaseDefinition.GetDatabaseXmlDefinition(Version - 1));

            foreach (var fromTable in fromDatabase.Tables)
            {
                var toTable = GetTable(fromTable.TableName);

                if (toTable == null)
                {
                    updateCommands.Add(fromTable.GenerateSqlDropTableNoConstraints());
                }
                else
                {
                    // Kolla alla kolumner, om någon inte finns i den nya databasen ska den bort.
                    foreach (var fromField in fromTable.AllFields)
                    {
                        FieldSchema field = toTable.GetField(fromField.FieldName);

                        // Om fältet har tagits bort i den aktuella databasen, eller har omvandlats till ett vyfält i den nya, ska den bort från databasen.
                        if (field == null || field.IsViewField)
                        {
                            updateCommands.Add(fromField.GenerateSqlDropDefaultValueConstraint());
                            updateCommands.Add(fromField.GenerateSqlDropFieldNoKeys());
                        }
                    }
                }
            }

            return(updateCommands.ToArray());
        }
コード例 #2
0
        /// <summary>
        /// Generates SQL update commands (scripts) that update the database one step to a specified version.
        /// Database constraints must be removed before call to this function, and added again afterwards.
        /// </summary>
        /// <param name="currentVersion">Current version of the database.</param>
        /// <exception cref="InvalidOperationException">Thrown if the database version too high.</exception>
        private SqlUpdateCommand[] UpdateDatabaseOneVersionNoConstraints(int currentVersion)
        {
            int toVersion = currentVersion + 1;

            if (toVersion > DatabaseDefinition.DatabaseVersion)
            {
                throw new InvalidOperationException("Database cannot be updated to a version greater than " + DatabaseDefinition.DatabaseVersion + ".");
            }

            // Hämta aktuellt databasschema
            DatabaseSchema fromDatabase = new DatabaseSchema(DatabaseDefinition.GetDatabaseXmlDefinition(toVersion - 1));
            DatabaseSchema toDatabase   = new DatabaseSchema(DatabaseDefinition.GetDatabaseXmlDefinition(toVersion));

            List <SqlUpdateCommand> updateCommands = new List <SqlUpdateCommand>();

            // Add information about the update to the database
            updateCommands.Add(new SqlUpdateCommand("update EasyBaseSystems set UpdatingToVersion = " + toVersion));

            // Add update commands for new tables and columns
            updateCommands.Add(toDatabase.GenerateSqlCreateDiff());

            // Add developer update scripts/functions for the current database update
            SqlUpdateCommand databaseConversion = DatabaseConversions.ConvertDatabase(toVersion);

            if (databaseConversion != null)
            {
                updateCommands.Add(databaseConversion);
            }

            // Add update commands that deletes removed tables and columns
            updateCommands.AddRange(toDatabase.GenerateSqlDeleteDiff());

            return(updateCommands.ToArray());
        }
コード例 #3
0
        private SqlUpdateCommand[] CollectSqlUpdateDatabase(bool databaseContainsConstraints, int toDatabaseVersion)
        {
            var updateCommands = new List <SqlUpdateCommand>();
            int startVersion   = (int)Connection.GetScalar("select top 1 DatabaseVersion from EasyBaseSystems");

            if (toDatabaseVersion < startVersion)
            {
                throw new UpdatingDatabaseException("Du försöker att uppdatera databas med version " + startVersion + " till version " + toDatabaseVersion + ". Det är inte möjligt att nedgradera en databasversion på det sättet.");
            }

            var startDatabase = new DatabaseSchema(DatabaseDefinition.GetDatabaseXmlDefinition(startVersion));
            var endDatabase   = new DatabaseSchema(DatabaseDefinition.GetDatabaseXmlDefinition(toDatabaseVersion));

            if (databaseContainsConstraints)
            {
                updateCommands.AddRange(startDatabase.GenerateSqlDropConstraints());
                updateCommands.AddRange(endDatabase.GenerateSqlDropConstraints()); // Måste med eftersom uppdateringen kan krascha halvvägs
            }

            updateCommands.AddRange(GenerateSqlUpdateDatabaseToVersionNoConstraints(toDatabaseVersion));

            updateCommands.AddRange(endDatabase.GenerateSqlAddDatabaseConstraints());

            // Uppdatera vyer
            updateCommands.AddRange(endDatabase.GenerateSqlCreateAllViews());

            // Bekräfta den nya versionen i databasen
            updateCommands.Add(new SqlUpdateCommand("update EasyBaseSystems set DatabaseVersion = " + toDatabaseVersion));

            return(updateCommands.ToArray());
        }
コード例 #4
0
        /// <summary>
        /// Checks that the coded database and the current database schema match.
        /// </summary>
        /// <returns>true if the databases agree, otherwise false.</returns>
        public bool CheckDatabase()
        {
            var savedDatabase = new DatabaseSchema(DatabaseDefinition.GetDatabaseXmlDefinition(DatabaseDefinition.DatabaseVersion));
            var codedDatabase = new DatabaseSchema(GetDatabaseDefinitionXml());

            return(savedDatabase == codedDatabase);
        }
コード例 #5
0
        public void CreateBackup1(string fullPath)
        {
            // Current version of backup system
            int backupVersion = 1;

            string sql             = "select top 1 [DatabaseVersion] from [EasyBaseSystems]";
            int    databaseVersion = Convert.ToInt32(Connection.GetScalar(sql));

            if (databaseVersion != DatabaseDefinition.DatabaseVersion)
            {
                throw new DatabaseVersionException("Wrong database version. The database's version is " + databaseVersion + ", but the current version of the application is " + DatabaseDefinition.DatabaseVersion + ". Backup is not possible.");
            }

            DatabaseSchema savedDatabase = new DatabaseSchema(DatabaseDefinition.GetDatabaseXmlDefinition(DatabaseDefinition.DatabaseVersion));

            StreamWriter streamWriter = new StreamWriter(fullPath);

            streamWriter.Write("[" + backupVersion + ";" + DatabaseDefinition.DatabaseVersion + "]");

            foreach (TableSchema table in savedDatabase.Tables)
            {
                StringBuilder commaSeparatedFields = new StringBuilder();
                string        comma = "";
                foreach (FieldSchema field in table.DatabaseFields)
                {
                    commaSeparatedFields.Append(comma + "[" + field.FieldName + "]");
                    comma = ", ";
                }

                sql = "select " + commaSeparatedFields + " from [" + table.TableName + "]";
                DataTable dataTable = new DataTable();

                Connection.GetTable(dataTable, sql);

                streamWriter.Write("[" + table.TableName + ";" + dataTable.Rows.Count + "]");

                if (dataTable.Rows.Count > 0)
                {
                    foreach (FieldSchema field in table.DatabaseFields)
                    {
                        streamWriter.Write("[" + field.FieldName + "]");

                        foreach (DataRow dataRow in dataTable.Rows)
                        {
                            string data = field.SerializeData(dataRow[field.FieldName]);
                            streamWriter.Write(data);
                        }
                    }
                }
            }

            streamWriter.Flush();
            streamWriter.Close();
        }
コード例 #6
0
        private string[] GetUpdatedViewTables(int startVersion, int endVersion)
        {
            var viewTables = new List <string>();

            for (int version = startVersion + 1; version <= endVersion; version++)
            {
                var database = new DatabaseSchema(DatabaseDefinition.GetDatabaseXmlDefinition(version));
                viewTables.AddRange(database.GetTableViewDiff());
            }

            return(viewTables.ToArray());
        }
コード例 #7
0
        /// <summary>
        /// Skapar en databas.
        /// </summary>
        /// <param name="version">Vilken databasversion som ska skapas.</param>
        private void CreateDatabaseNoConstraints(int version)
        {
            DropAllTablesInDatabase();

            DatabaseSchema database = new DatabaseSchema(DatabaseDefinition.GetDatabaseXmlDefinition(version));

            //DatabaseSchema database = new DatabaseSchema(GetDatabaseDefinitionXml());

            string[] sqls = database.GenerateSqlCreateNoKeys(DatabaseDefinition.DatabaseVersion);

            foreach (string sql in sqls)
            {
                Connection.Execute(sql);
            }
        }
コード例 #8
0
        /// <summary>
        /// Gets all table views that are changed between last version and current version.
        /// </summary>
        /// <returns>All names of changed table views as a string array.</returns>
        public string[] GetTableViewDiff()
        {
            List <string>  viewTables   = new List <string>();
            DatabaseSchema fromDatabase = new DatabaseSchema(DatabaseDefinition.GetDatabaseXmlDefinition(Version - 1));

            foreach (var viewTable in ViewTables)
            {
                var fromTable = fromDatabase.GetTable(viewTable.TableName);

                if (fromTable == null)
                {
                    viewTables.Add(viewTable.TableName);
                }
                else
                {
                    foreach (var field in viewTable.AllFields)
                    {
                        if (fromTable.GetField(field.FieldName) == null)
                        {
                            viewTables.Add(viewTable.TableName);
                        }
                    }
                }
            }

            foreach (var viewTable in fromDatabase.ViewTables)
            {
                var toTable = GetTable(viewTable.TableName);

                if (toTable == null)
                {
                    viewTables.Add(viewTable.TableName);
                }
                else
                {
                    foreach (var field in viewTable.AllFields)
                    {
                        if (toTable.GetField(field.FieldName) == null)
                        {
                            viewTables.Add(viewTable.TableName);
                        }
                    }
                }
            }

            return(viewTables.ToArray());
        }
コード例 #9
0
        /// <summary>
        /// Bygger upp alla tabeller och vyer i en databas i enlighet med den senaste versionen. Databasen måste finnas innan den här funktionen används.
        /// </summary>
        public void BuildDatabase()
        {
            DropAllTablesInDatabase();

            DatabaseSchema database = new DatabaseSchema(DatabaseDefinition.GetDatabaseXmlDefinition(DatabaseDefinition.DatabaseVersion));

            string[] sqls = database.GenerateSqlCreate();

            foreach (string sql in sqls)
            {
                Connection.Execute(sql);
            }

            // Write the database table
            string startSql = "insert into EasyBaseSystems values (" + (int)EasyBase.Classes.EasyBaseSystemNo.CurrentApplicationNo + ", " + DatabaseDefinition.DatabaseVersion + ", " + DatabaseDefinition.DatabaseVersion + ")";

            Connection.Insert(startSql);

            InitDatabaseOnCreate();
        }
コード例 #10
0
        /// <summary>
        /// Generates SQL to create tables and columns that are added since last version.
        /// </summary>
        /// <returns>The generated SQL in an SqlUpdateCommand.</returns>
        public SqlUpdateCommand GenerateSqlCreateDiff()
        {
            List <string> sqls = new List <string>();

            DatabaseSchema fromDatabase = new DatabaseSchema(DatabaseDefinition.GetDatabaseXmlDefinition(Version - 1));

            // Loopa igenom alla tabeller i nya databasen
            foreach (var table in Tables)
            {
                var fromTable = fromDatabase.GetTable(table.TableName);

                if (fromTable == null)
                {
                    // Tabellen finns inte i gamla databasen, så den behöver skapas.

                    sqls.Add(table.GenerateSqlCreateTable());
                }
                else
                {
                    // Tabellen finns. Kolla igenom tabellen för att se om det har tillkommit några nya kolumner.

                    foreach (var field in table.AllFields)
                    {
                        var fromField = fromTable.GetField(field.FieldName);

                        if (fromField == null)
                        {
                            // Fältet fanns inte i den gamla databasen, så det behöver skapas.

                            sqls.AddRange(field.GenerateSqlCreateField());
                        }
                    }
                }
            }

            return(new SqlUpdateCommand(sqls.ToArray()));
        }
コード例 #11
0
        public void RestoreBackup(string fullPath, int toDatabaseVersion)
        {
            var reader = new StreamReader(fullPath);
            var header = new StringBuilder();

            int    backupVersion           = 0;
            int    databaseVersion         = 0;
            string databaseApplicationName = "";
            long   totalRowsInDB           = 0;

            try {
                // Read header
                char token = ' ';
                while (token != ']')
                {
                    token = (char)reader.Read();
                    if (token != '[' && token != ']')
                    {
                        header.Append(token);
                    }
                }

                string[] headerArray = header.ToString().Split(";".ToCharArray());
                backupVersion           = int.Parse(headerArray[0]);
                databaseVersion         = 0;
                databaseApplicationName = "";

                if (backupVersion == 1)
                {
                    databaseVersion = int.Parse(headerArray[1]);
                }
                else
                {
                    databaseApplicationName = headerArray[1];
                    databaseVersion         = int.Parse(headerArray[2]);
                    totalRowsInDB           = long.Parse(headerArray[3]);
                }
            }
            catch (Exception ex) {
                throw new BackupException("Backupfilens huvud har ett felaktigt format.", ex);
            }

            if (backupVersion >= 2)
            {
                if (databaseApplicationName != CurrentApplication.Name)
                {
                    throw new BackupException("Den aktuella backupen tillhör inte det här programmet. Backupen är en backup för programmet \"" + databaseApplicationName + "\".");
                }
            }

            // Create database
            var database = new DatabaseSchema(DatabaseDefinition.GetDatabaseXmlDefinition(databaseVersion));

            CreateDatabaseNoConstraints(databaseVersion);

            // Call function that reads all table contents from the backup file.
            switch (backupVersion)
            {
            case 1:
                RestoreBackup1(reader, database, backupVersion);
                break;

            case 2:
                RestoreBackup2(reader, database, backupVersion, totalRowsInDB);
                break;

            default:
                throw new NotImplementedException("Backup version " + backupVersion + " is not implemented.");
            }

            // Efter inläsning, uppdatera databasen till senaste versionen
            RunSqlUpdateCommands(CollectSqlUpdateDatabase(false, toDatabaseVersion));
        }