196 lines
7.7 KiB
C#
196 lines
7.7 KiB
C#
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.
|
|
private 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.
|
|
//-------------------------------------------------------------------
|
|
private class AjaxResponse_DatabaseTableList : AjaxResponse_Data
|
|
{
|
|
// Construction.
|
|
public AjaxResponse_DatabaseTableList(SaxModel_Admin model) : base(model) { }
|
|
// Table list.
|
|
public List<DatabaseTableData> Tables { get; } = new List<DatabaseTableData>();
|
|
}
|
|
//-------------------------------------------------------------------
|
|
[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(model);
|
|
|
|
// Validate session.
|
|
if (!ValidUserSession)
|
|
return GetAjaxResult_InvalidSession(responseData);
|
|
|
|
// Core Database connection.
|
|
ISacsDatabase db = SaxGlobals.App.GetCoreDatabase(SessionContext);
|
|
|
|
// Database table row counts.
|
|
Dictionary<String, int> tableRowCounts = new Dictionary<string, int>(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<DbDfnTable> 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.
|
|
//-------------------------------------------------------------------
|
|
private 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; }
|
|
}
|
|
private class AjaxResponse_ValidateDatabaseSchema : AjaxResponse_Data
|
|
{
|
|
// Construction.
|
|
public AjaxResponse_ValidateDatabaseSchema(SaxModel_Admin model) : base(model) { }
|
|
// Schema validation list.
|
|
public List<DbSchemaItemResponseData> Items { get; } = new List<DbSchemaItemResponseData>();
|
|
}
|
|
//-------------------------------------------------------------------
|
|
[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(model);
|
|
|
|
// 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<DbDfnTable> 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;
|
|
cfgSchemaCompare.IgnorePosition = true;
|
|
SaDbProcess_CompareDatabaseSchemas procSchemaCompare = new SaDbProcess_CompareDatabaseSchemas(cfgSchemaCompare);
|
|
procSchemaCompare.ProcessNotifier = this;
|
|
procSchemaCompare.RunProcess();
|
|
|
|
List<SaDbProcess_CompareDatabaseSchemas.SchemaComparisonItem> 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<string> progressInfo)
|
|
{
|
|
}
|
|
public void OnEndProcess()
|
|
{
|
|
}
|
|
public void OnSchemaComparisonItemAdded(SaDbProcess_CompareDatabaseSchemas proc)
|
|
{
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
}
|
|
//=======================================================================
|
|
}
|