| File: SqlQueries.cs | Web Access |
| Project: src\aspnetcore\src\Tools\dotnet-sql-cache\src\dotnet-sql-cache.csproj (dotnet-sql-cache) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System; using System.Globalization; namespace Microsoft.Extensions.Caching.SqlConfig.Tools; internal sealed class SqlQueries { private const string CreateTableFormat = "CREATE TABLE {0}(" + // Maximum size of primary key column is 900 bytes (898 bytes from key + 2 additional bytes used by the // Sql Server). In the case where the key is greater than 898 bytes, then it gets truncated. // - Add collation to the key column to make it case-sensitive "Id nvarchar(449) COLLATE SQL_Latin1_General_CP1_CS_AS NOT NULL, " + "Value varbinary(MAX) NOT NULL, " + "ExpiresAtTime datetimeoffset NOT NULL, " + "SlidingExpirationInSeconds bigint NULL," + "AbsoluteExpiration datetimeoffset NULL, " + "PRIMARY KEY (Id))"; private const string CreateNonClusteredIndexOnExpirationTimeFormat = "CREATE NONCLUSTERED INDEX Index_ExpiresAtTime ON {0}(ExpiresAtTime)"; private const string TableInfoFormat = "SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE " + "FROM INFORMATION_SCHEMA.TABLES " + "WHERE TABLE_SCHEMA = '{0}' " + "AND TABLE_NAME = '{1}'"; public SqlQueries(string schemaName, string tableName) { ArgumentException.ThrowIfNullOrEmpty(schemaName); ArgumentException.ThrowIfNullOrEmpty(tableName); var tableNameWithSchema = string.Format( CultureInfo.InvariantCulture, "{0}.{1}", DelimitIdentifier(schemaName), DelimitIdentifier(tableName)); CreateTable = string.Format(CultureInfo.InvariantCulture, CreateTableFormat, tableNameWithSchema); CreateNonClusteredIndexOnExpirationTime = string.Format( CultureInfo.InvariantCulture, CreateNonClusteredIndexOnExpirationTimeFormat, tableNameWithSchema); TableInfo = string.Format(CultureInfo.InvariantCulture, TableInfoFormat, EscapeLiteral(schemaName), EscapeLiteral(tableName)); } public string CreateTable { get; } public string CreateNonClusteredIndexOnExpirationTime { get; } public string TableInfo { get; } // From EF's SqlServerQuerySqlGenerator private static string DelimitIdentifier(string identifier) { return "[" + identifier.Replace("]", "]]") + "]"; } private static string EscapeLiteral(string literal) { return literal.Replace("'", "''"); } }