From 29af650bfb517a53f2f923351ba6a47f5c55ec7b Mon Sep 17 00:00:00 2001 From: Axel Marquez Date: Thu, 15 Feb 2024 17:51:58 -0600 Subject: [PATCH] Add BigIntTable --- ...asedSingleItemAuthorizationQuerySupport.cs | 36 +++++++++++++++++-- .../Structure/Ods/1006-AddSQLTypes-BigInt.sql | 9 +++++ 2 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 Application/EdFi.Ods.Standard/Standard/5.0.0/Artifacts/MsSql/Structure/Ods/1006-AddSQLTypes-BigInt.sql diff --git a/Application/EdFi.Ods.Api/Security/AuthorizationStrategies/Relationships/Filters/SqlServerViewBasedSingleItemAuthorizationQuerySupport.cs b/Application/EdFi.Ods.Api/Security/AuthorizationStrategies/Relationships/Filters/SqlServerViewBasedSingleItemAuthorizationQuerySupport.cs index e59b2d9432..a869ff3090 100644 --- a/Application/EdFi.Ods.Api/Security/AuthorizationStrategies/Relationships/Filters/SqlServerViewBasedSingleItemAuthorizationQuerySupport.cs +++ b/Application/EdFi.Ods.Api/Security/AuthorizationStrategies/Relationships/Filters/SqlServerViewBasedSingleItemAuthorizationQuerySupport.cs @@ -9,6 +9,12 @@ using Microsoft.Data.SqlClient; using EdFi.Ods.Common.Security.Authorization; using EdFi.Ods.Common.Security.Claims; +using EdFi.Ods.Common.Models; +using EdFi.Common; +using EdFi.Common.Extensions; +using EdFi.Ods.Common.Conventions; +using System; +using System.Collections.Generic; namespace EdFi.Ods.Api.Security.AuthorizationStrategies.Relationships.Filters; @@ -16,6 +22,30 @@ public class SqlServerViewBasedSingleItemAuthorizationQuerySupport : IViewBasedS { private const int SqlServerParameterCountThreshold = 2000; + private readonly Type _edOrgSystemType; + private readonly Dictionary _structuredTypeBySystemType = new() + { + {typeof(int), "dbo.IntTable"}, + {typeof(long), "dbo.BigIntTable"} + }; + + public SqlServerViewBasedSingleItemAuthorizationQuerySupport(IDomainModelProvider domainModelProvider) + { + Preconditions.ThrowIfNull(domainModelProvider, nameof(domainModelProvider)); + + var standardModelVersion = Version.Parse( + domainModelProvider + .GetDomainModel() + .Schemas + .Single(x => x.LogicalName.EqualsIgnoreCase(EdFiConventions.LogicalName)) + .Version + ); + + _edOrgSystemType = standardModelVersion.Major < 5 + ? typeof(int) + : typeof(long); + } + public string GetItemExistenceCheckSql(ViewBasedAuthorizationFilterDefinition filterDefinition, AuthorizationFilterContext filterContext) { if (filterContext.ClaimEndpointValues.Length < SqlServerParameterCountThreshold) @@ -47,16 +77,16 @@ public void ApplyClaimsParametersToCommand(DbCommand cmd, EdFiAuthorizationConte var sqlParameter = cmd.CreateParameter() as SqlParameter; DataTable dt = new(); - dt.Columns.Add("Id", typeof(int)); + dt.Columns.Add("Id", _edOrgSystemType); - foreach (int claimEdOrgId in claimEdOrgIds) + foreach (var claimEdOrgId in claimEdOrgIds) { dt.Rows.Add(claimEdOrgId); } sqlParameter!.ParameterName = "ClaimEducationOrganizationIds"; sqlParameter.SqlDbType = SqlDbType.Structured; - sqlParameter.TypeName = "dbo.IntTable"; + sqlParameter.TypeName = _structuredTypeBySystemType[_edOrgSystemType]; sqlParameter.Value = dt; cmd.Parameters.Add(sqlParameter); diff --git a/Application/EdFi.Ods.Standard/Standard/5.0.0/Artifacts/MsSql/Structure/Ods/1006-AddSQLTypes-BigInt.sql b/Application/EdFi.Ods.Standard/Standard/5.0.0/Artifacts/MsSql/Structure/Ods/1006-AddSQLTypes-BigInt.sql new file mode 100644 index 0000000000..a4d0dc9ba6 --- /dev/null +++ b/Application/EdFi.Ods.Standard/Standard/5.0.0/Artifacts/MsSql/Structure/Ods/1006-AddSQLTypes-BigInt.sql @@ -0,0 +1,9 @@ +-- SPDX-License-Identifier: Apache-2.0 +-- Licensed to the Ed-Fi Alliance under one or more agreements. +-- The Ed-Fi Alliance licenses this file to you under the Apache License, Version 2.0. +-- See the LICENSE and NOTICES files in the project root for more information. + +CREATE TYPE dbo.BigIntTable AS TABLE +( + Id BIGINT +)