public ActionResult Track(ChangeTrackingDetails data)
        {
            ViewBag.ChangeTrackingEnabled = true;

            if (!data.ShowChangesFromRevision.HasValue)
            {
                if (!DatabaseContext.CheckIfTrackingEnabled(data.DatabaseServer, data.DatabaseName, User.Identity.Name).HasValue)
                {
                    // then this must come directly from Database Actions menu and I disable part of view
                    ViewBag.ChangeTrackingEnabled = false;
                }
            }
            else
            {
                List<string> sqlStatementList = new List<string>();

                var tableList = Session[String.Format("TrackingTables{0}{1}", data.DatabaseServer, data.DatabaseName)];
                if(tableList != null)
                {
                    if(String.Compare((string)tableList, data.ListOfTablesToCompare, false) == 0)
                    {

                        sqlStatementList = Session[String.Format("TrackingStatements{0}{1}", data.DatabaseServer, data.DatabaseName)] as List<string>;

                        if (sqlStatementList == null)
                        {
                            sqlStatementList = DatabaseContext.GetTablesForDataTrack(data.DatabaseServer, data.DatabaseName, data.ListOfTablesToCompare, User.Identity.Name);

                            Session[String.Format("TrackingTables{0}{1}", data.DatabaseServer, data.DatabaseName)] = data.ListOfTablesToCompare;
                            Session[String.Format("TrackingStatements{0}{1}", data.DatabaseServer, data.DatabaseName)] = sqlStatementList;
                        }

                    }else
                    {
                        Session.Remove(String.Format("TrackingStatements{0}{1}", data.DatabaseServer, data.DatabaseName));
                        Session.Remove(String.Format("TrackingTables{0}{1}", data.DatabaseServer, data.DatabaseName));

                        sqlStatementList = DatabaseContext.GetTablesForDataTrack(data.DatabaseServer, data.DatabaseName, data.ListOfTablesToCompare, User.Identity.Name);

                        Session[String.Format("TrackingTables{0}{1}", data.DatabaseServer, data.DatabaseName)] = data.ListOfTablesToCompare;
                        Session[String.Format("TrackingStatements{0}{1}", data.DatabaseServer, data.DatabaseName)] = sqlStatementList;
                    }

                }
                else
                {
                    sqlStatementList = DatabaseContext.GetTablesForDataTrack(data.DatabaseServer, data.DatabaseName, data.ListOfTablesToCompare, User.Identity.Name);

                    Session[String.Format("TrackingTables{0}{1}", data.DatabaseServer, data.DatabaseName)] = data.ListOfTablesToCompare;
                    Session[String.Format("TrackingStatements{0}{1}", data.DatabaseServer, data.DatabaseName)] = sqlStatementList;
                }


                string logMessage;
                data.TrackDataChangesReslut = DatabaseContext.TrackDataChanges(data.DatabaseServer, data.DatabaseName, User.Identity.Name, sqlStatementList, data.ShowChangesFromRevision, out logMessage);
                data.TrackDataChangesLog = logMessage;
            }

            return View(data);
        }
        public ActionResult GetTrackData(ChangeTrackingDetails data)
        {

            List<string> sqlStatementList = new List<string>();

            var tableList = Session[String.Format("TrackingTables{0}{1}", data.DatabaseServer, data.DatabaseName)];
            if (tableList != null)
            {
                if (String.Compare((string)tableList, data.ListOfTablesToCompare, false) == 0)
                {

                    sqlStatementList = Session[String.Format("TrackingStatements{0}{1}", data.DatabaseServer, data.DatabaseName)] as List<string>;

                    if (sqlStatementList == null)
                    {
                        sqlStatementList = DatabaseContext.GetTablesForDataTrack(data.DatabaseServer, data.DatabaseName, data.ListOfTablesToCompare, User.Identity.Name);

                        Session[String.Format("TrackingTables{0}{1}", data.DatabaseServer, data.DatabaseName)] = data.ListOfTablesToCompare;
                        Session[String.Format("TrackingStatements{0}{1}", data.DatabaseServer, data.DatabaseName)] = sqlStatementList;
                    }

                }
                else
                {
                    Session.Remove(String.Format("TrackingStatements{0}{1}", data.DatabaseServer, data.DatabaseName));
                    Session.Remove(String.Format("TrackingTables{0}{1}", data.DatabaseServer, data.DatabaseName));

                    sqlStatementList = DatabaseContext.GetTablesForDataTrack(data.DatabaseServer, data.DatabaseName, data.ListOfTablesToCompare, User.Identity.Name);

                    Session[String.Format("TrackingTables{0}{1}", data.DatabaseServer, data.DatabaseName)] = data.ListOfTablesToCompare;
                    Session[String.Format("TrackingStatements{0}{1}", data.DatabaseServer, data.DatabaseName)] = sqlStatementList;
                }

            }
            else
            {
                sqlStatementList = DatabaseContext.GetTablesForDataTrack(data.DatabaseServer, data.DatabaseName, data.ListOfTablesToCompare, User.Identity.Name);

                Session[String.Format("TrackingTables{0}{1}", data.DatabaseServer, data.DatabaseName)] = data.ListOfTablesToCompare;
                Session[String.Format("TrackingStatements{0}{1}", data.DatabaseServer, data.DatabaseName)] = sqlStatementList;
            }


            string logMessage;
                data.TrackDataChangesReslut = DatabaseContext.TrackDataChanges(data.DatabaseServer, data.DatabaseName, User.Identity.Name, sqlStatementList, data.ShowChangesFromRevision, out logMessage);
                data.TrackDataChangesLog = logMessage;
            

            return PartialView("_TrackData", data);
        }