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.Dbas.Data; using Saxonite.Net.Core.Web.Admin.Models; using Saxonite.Net.Standard.Base.App; using Saxonite.Net.Standard.Base.Bus; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace Saxonite.Net.Core.Web.Admin.Controllers { //======================================================================= // System - Ajax - Database controller //======================================================================= partial class SystemController { //------------------------------------------------------------------- // 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); } //------------------------------------------------------------------- } //======================================================================= }