示例#1
0
        /// <summary>
        /// Raises the button start diff clicked event.
        /// </summary>
        /// <param name="sender">The sender.</param>
        /// <param name="e">Event arguments.</param>
        protected void OnButtonStartDiffClicked(object sender, EventArgs e)
        {
            string dir = this.entryFolder.Text;
            string tableDir = dir + "/" + AppSettings.TableDir;
            string procedureDir = dir + "/" + AppSettings.ProcedureDir;

            this.SaveConfiguration();

            this.Sql = new SqlServerAccess(entryHost.Text, entryUser.Text, entryPassword.Text, entryDatabase.Text);
            this.listDBTables = this.Sql.GetTables();
            this.listDBProcedures = this.Sql.GetStoredProcedure();

            int id = 0;

            // Prepare the file list
            this.listFileTables = new SchemaCollection();
            foreach (string file in Directory.GetFiles(tableDir))
            {
                id++;
                string tableName = file.Replace("\\", "/").Substring(tableDir.Length + 1);
                tableName = tableName.Replace(".Table.sql", string.Empty);
                this.listFileTables.Add(new SchemaData { Name = tableName, ObjectID = id, Type = SchemaDataType.Table, FilePath = file, Data = File.ReadAllText(file).Replace("\r\n", "\n") });
            }

            this.listFileProcedures = new SchemaCollection();
            foreach (string file in Directory.GetFiles(procedureDir))
            {
                id++;
                string procedureName = file.Replace("\\", "/").Substring(procedureDir.Length + 1);
                procedureName = procedureName.Replace(".StoredProcedure.sql", string.Empty);
                this.listFileProcedures.Add(new SchemaData { Name = procedureName, ObjectID = id, Type = SchemaDataType.StoredProcedure, FilePath = file, Data = File.ReadAllText(file) });
            }

            if (!Directory.Exists(dir))
            {
                GtkLogService.Instance.Write(string.Concat("Failed to get directory ", dir));
                return;
            }

            if (!Directory.Exists(tableDir))
            {
                GtkLogService.Instance.Write(string.Concat("Failed to get table directory ", tableDir));
                return;
            }

            SchemaCollection modifiedDBTables = new SchemaCollection();
            SchemaCollection modifiedDBProcedure = new SchemaCollection();
            SchemaCollection modifiedFileTables = new SchemaCollection();
            SchemaCollection modifiedFileProcedure = new SchemaCollection();

            // Add status to the list
            foreach (SchemaData table in this.listFileTables)
            {
                if (!this.listDBTables.ContainsName(table))
                {
                    table.Status = SchemaDataStatus.Added;
                    continue;
                }

                if (this.listDBTables.IsModified(table))
                {
                    table.Status = SchemaDataStatus.Modified;
                }
            }

            foreach (SchemaData table in this.listDBTables)
            {
                if (!this.listFileTables.ContainsName(table))
                {
                    table.Status = SchemaDataStatus.Added;
                    continue;
                }

                if (this.listFileTables.IsModified(table))
                {
                    table.Status = SchemaDataStatus.Modified;
                    modifiedDBTables.Add(table);
                }
            }

            // SP list
            foreach (SchemaData sp in this.listFileProcedures)
            {
                if (!this.listDBProcedures.ContainsName(sp))
                {
                    sp.Status = SchemaDataStatus.Added;
                    continue;
                }

                if (this.listDBProcedures.IsModified(sp))
                {
                    sp.Status = SchemaDataStatus.Modified;
                }
            }

            foreach (SchemaData sp in this.listDBProcedures)
            {
                if (!this.listFileProcedures.ContainsName(sp))
                {
                    sp.Status = SchemaDataStatus.Added;
                    continue;
                }

                if (this.listFileProcedures.IsModified(sp))
                {
                    sp.Status = SchemaDataStatus.Modified;
                    modifiedDBProcedure.Add(sp);
                }
            }

            SchemaCollection cache = this.ReadSyncLog();

            // Get list for conflicted data
            foreach (SchemaData table in modifiedDBTables)
            {
                if (cache.ContainsName(table) && cache[table.Name].ModifyDate.ToString("s") != table.ModifyDate.ToString("s"))
                {
                    table.Status = SchemaDataStatus.Conflicted;

                    if (this.listFileTables.ContainsName(table))
                    {
                        this.listFileTables[table.Name].Status = SchemaDataStatus.Conflicted;
                    }
                }
            }

            foreach (SchemaData sp in modifiedDBProcedure)
            {
                if (cache.ContainsName(sp) && cache[sp.Name].ModifyDate.ToString("s") != sp.ModifyDate.ToString("s"))
                {
                    sp.Status = SchemaDataStatus.Conflicted;

                    if (this.listFileProcedures.ContainsName(sp))
                    {
                        this.listFileProcedures[sp.Name].Status = SchemaDataStatus.Conflicted;
                    }
                }
            }

            // Reset the combined file and database variables
            this.combinedFile = new SchemaCollection();
            this.combinedDB = new SchemaCollection();

            this.combinedFile.AppendCollection(this.listFileTables);
            this.combinedFile.AppendCollection(this.listFileProcedures);
            this.combinedDB.AppendCollection(this.listDBTables);
            this.combinedDB.AppendCollection(this.listDBProcedures);

            this.ShowProcessedList();
        }
        /// <summary>
        /// Reads the log.
        /// </summary>
        /// <returns>The log.</returns>
        /// <param name="path">The path.</param>
        public SchemaCollection ReadLog(string path)
        {
            SchemaCollection collection = new SchemaCollection();
            foreach (string line in System.IO.File.ReadAllLines(path + "/" + this.baseFileName + "_" + this.databaseName.ToString()))
            {
                string[] split = line.Split(';');
                SchemaData schema = new SchemaData();
                schema.Name = split[1];
                schema.Type = (SchemaDataType)Enum.Parse(typeof(SchemaDataType), split[0]);
                schema.ModifyDate = DateTime.Parse(split[2]);
                collection.Add(schema);
            }

            return collection;
        }