using Microsoft.AspNetCore.Mvc; using Sarand.Net.Standard.Base.App; using Sarand.Net.Standard.Base.Bus; using Sarand.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.Dbas; using Sarand.Net.Standard.Base.Helpers; using Sarand.Net.Standard.Base.Procs; using Sarand.Net.Standard.Base.Utils; using Sarand.Net.Standard.Dbas.Data; using Sarand.Net.Standard.Dbas.Proc; using Saxonite.Net.Core.Web.Admin.Models; using Saxonite.Net.Standard.Base.App; using Saxonite.Net.Standard.Base.Bus; using Saxonite.Net.Standard.Dbas.App; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Threading.Tasks; namespace Saxonite.Net.Core.Web.Admin.Controllers { //======================================================================= // System - Ajax - Database controller //======================================================================= partial class SystemController : SaDbProcess_CompareDatabaseSchemas.IProcessNotifier { //------------------------------------------------------------------- // Database data. public class DatabaseTableData { public String SchemaName { get; set; } public String TableName { get; set; } public String QualifiedName { get; set; } public int RowCount { get; set; } public int ColumnCount { get; set; } public int IndexCount { get; set; } } //------------------------------------------------------------------- // Get Database Table List ajax request. //------------------------------------------------------------------- public class AjaxResponse_DatabaseTableList : AjaxResponse_Data { public List Tables { get; } = new List(); } //------------------------------------------------------------------- [HttpPost] [Route("System/Ajax/GetDatabaseTables")] public IActionResult Ajax_GetDatabaseTables(Model_Sport model) { String fn = GetType().Name + ".Ajax_GetDatabaseTables"; String messageTitle = Localiser["system.caption.database"]; AjaxResponse_DatabaseTableList responseData = new AjaxResponse_DatabaseTableList(); // Validate session. if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData); // Core Database connection. ISacsDatabase db = SaxGlobals.App.GetCoreDatabase(SessionContext); // Database table row counts. Dictionary tableRowCounts = new Dictionary(StringComparer.OrdinalIgnoreCase); String query = "SELECT QUOTENAME(SCHEMA_NAME(sOBJ.schema_id)) + '.' + QUOTENAME(sOBJ.name) AS[TableName], SUM(sPTN.Rows) AS[RowCount] " + "FROM sys.objects AS sOBJ " + "INNER JOIN sys.partitions AS sPTN ON sOBJ.object_id = sPTN.object_id " + "WHERE sOBJ.type = 'U' AND sOBJ.is_ms_shipped = 0x0 AND index_id< 2 /*Index Id: 0:Heap,1:Clustered*/ " + "GROUP BY sOBJ.schema_id, sOBJ.name"; using (DbResultSet dbResultSet = DbResultSet_DataReader.ExecuteQuery(db, query)) { while (dbResultSet != null && dbResultSet.NextRecord()) { tableRowCounts.Add(dbResultSet.GetRecordValues().GetValue("TableName").ToString(), (int)dbResultSet.GetRecordValues().GetValue("RowCount").AsLong()); } } // Core database tables. List tableDfns = db.GetTableDfns(); foreach (DbDfnTable tableDfn in tableDfns.OrderBy(item => item.Name)) { DatabaseTableData tableData = new DatabaseTableData(); tableData.SchemaName = tableDfn.Schema; tableData.TableName = tableDfn.Name; tableData.QualifiedName = tableDfn.QualifiedName; tableData.ColumnCount = tableDfn.ColumnCount; tableData.IndexCount = tableDfn.IndexCount; // Row count. tableData.RowCount = tableRowCounts.GetValueOrDefault(tableDfn.QuotedQualifiedName, 0); responseData.Tables.Add(tableData); } // Complete response. responseData.Success = true; return Json(responseData); } //------------------------------------------------------------------- // Validate Database Schema ajax request. //------------------------------------------------------------------- public class DbSchemaItemResponseData { public int Id { get; set; } public String TableName { get; set; } public String ColumnName { get; set; } public int ColumnPosition { get; set; } public String IndexName { get; set; } public String Comment { get; set; } } public class AjaxResponse_ValidateDatabaseSchema : AjaxResponse_Data { public List Items { get; } = new List(); } //------------------------------------------------------------------- [HttpPost] [Route("System/Ajax/ValidateDatabaseSchema")] public IActionResult Ajax_ValidateDatabaseSchema(Model_Sport model) { String fn = GetType().Name + ".Ajax_GetDatabaseTables"; String messageTitle = Localiser["system.caption.database"]; AjaxResponse_ValidateDatabaseSchema responseData = new AjaxResponse_ValidateDatabaseSchema(); // Validate session. if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData); // Core Database connection. ISacsDatabase db = SaxGlobals.App.GetCoreDatabase(SessionContext); // Retrieve XML database schema definition. var assembly = typeof(SaxSystem_Dbas).GetTypeInfo().Assembly; String xmlSchema = SacsResourceHelper.GetManifestResourceAsText(assembly, "", "SaxDbDfn_Core.xml"); if (StringUtil.IsEmpty(xmlSchema)) return Json(responseData.SetMessage(messageTitle, "Failed to extract XML schema definition.")); // Extract schema from XML definition. SaDbProcess_ConvertDbSchema.Config cfgSchemaConvert = new SaDbProcess_ConvertDbSchema.Config(); SaDbProcess_ConvertDbSchema procSchemaConvert = new SaDbProcess_ConvertDbSchema(cfgSchemaConvert); List tables = procSchemaConvert.ConvertXmlToTables(xmlSchema); if (procSchemaConvert.HasProcessError()) return Json(responseData.SetMessage(messageTitle, "Failed to convert XML schema: " + procSchemaConvert.GetProcessError())); SaDbProcess_CompareDatabaseSchemas.Config cfgSchemaCompare = new SaDbProcess_CompareDatabaseSchemas.Config(tables, db); cfgSchemaCompare.HideIdenticalObjects = true; SaDbProcess_CompareDatabaseSchemas procSchemaCompare = new SaDbProcess_CompareDatabaseSchemas(cfgSchemaCompare); procSchemaCompare.ProcessNotifier = this; procSchemaCompare.RunProcess(); List schemaComparisonItems = procSchemaCompare.GetSchemaComparisonItems(); foreach (SaDbProcess_CompareDatabaseSchemas.SchemaComparisonItem schemaComparisonItem in schemaComparisonItems) { DbSchemaItemResponseData item = new DbSchemaItemResponseData() { Id = schemaComparisonItem.Id, TableName = schemaComparisonItem.TableName, ColumnName = schemaComparisonItem.ColumnName, ColumnPosition = schemaComparisonItem.ColumnPosition, IndexName = schemaComparisonItem.IndexName, Comment = schemaComparisonItem.Comment }; responseData.Items.Add(item); } // Complete response. responseData.Success = true; return Json(responseData); } public void OnStartProcess() { } public void SetProgressInfo(List progressInfo) { } public void OnEndProcess() { } public void OnSchemaComparisonItemAdded(SaDbProcess_CompareDatabaseSchemas proc) { } //------------------------------------------------------------------- } //======================================================================= }