Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit 697f6b1

Browse files
committed
Updated SqlServer2014 Dialect with FileTable logic and field def changes.
1 parent 4937785 commit 697f6b1

File tree

1 file changed

+116
-48
lines changed

1 file changed

+116
-48
lines changed

src/ServiceStack.OrmLite.SqlServer/SqlServer2014OrmLiteDialectProvider.cs

Lines changed: 116 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
using System;
2-
using System.Data;
3-
using System.Text;
42
using ServiceStack.Text;
53
using ServiceStack.DataAnnotations;
64

@@ -10,72 +8,142 @@ public class SqlServer2014OrmLiteDialectProvider : SqlServer2012OrmLiteDialectPr
108
{
119
public new static SqlServer2014OrmLiteDialectProvider Instance = new SqlServer2014OrmLiteDialectProvider();
1210

13-
public override string ToCreateTableStatement(Type tableType)
11+
public override string GetColumnDefinition(FieldDefinition fieldDef)
1412
{
15-
var sbColumns = StringBuilderCache.Allocate();
16-
var sbConstraints = StringBuilderCacheAlt.Allocate();
17-
var sbMemOptimized = StringBuilderCacheAlt.Allocate();
13+
// https://msdn.microsoft.com/en-us/library/ms182776.aspx
14+
if (fieldDef.IsRowVersion)
15+
return $"{fieldDef.FieldName} rowversion NOT NULL";
1816

19-
var isMemoryTable = tableType.HasAttribute<SqlServerMemoryOptimizedAttribute>();
17+
var fieldDefinition = fieldDef.CustomFieldDefinition ??
18+
GetColumnTypeDefinition(fieldDef.ColumnType, fieldDef.FieldLength, fieldDef.Scale);
2019

21-
var modelDef = OrmLiteUtils.GetModelDefinition(tableType);
22-
foreach (var fieldDef in modelDef.FieldDefinitions)
20+
var sql = StringBuilderCache.Allocate();
21+
sql.Append($"{GetQuotedColumnName(fieldDef.FieldName)} {fieldDefinition}");
22+
23+
if (fieldDef.IsPrimaryKey)
2324
{
24-
if (fieldDef.CustomSelect != null)
25-
continue;
25+
var isMemoryTable = fieldDef.PropertyInfo.DeclaringType.FirstAttribute<SqlServerMemoryOptimizedAttribute>() != null;
2626

27-
var columnDefinition = GetColumnDefinition(fieldDef);
28-
if (columnDefinition == null)
29-
continue;
27+
if (isMemoryTable)
28+
{
29+
sql.Append(fieldDef.IsNullable ? " NULL" : " NOT NULL");
30+
sql.Append(" PRIMARY KEY NONCLUSTERED");
3031

31-
var collationAttribs = fieldDef.PropertyInfo.GetAttributes<SqlServerCollateAttribute>();
32-
if (collationAttribs.Count > 0)
32+
var bucketCount = fieldDef.PropertyInfo.FirstAttribute<SqlServerBucketCountAttribute>()?.Count;
33+
if (bucketCount.HasValue)
34+
{
35+
sql.Append($" HASH WITH (BUCKET_COUNT = {bucketCount.Value})");
36+
}
37+
}
38+
else
3339
{
34-
columnDefinition += $" COLLATE {collationAttribs[0].Collation}";
40+
sql.Append(" PRIMARY KEY");
3541
}
3642

37-
if (isMemoryTable && fieldDef.IsPrimaryKey)
43+
if (fieldDef.AutoIncrement)
3844
{
39-
columnDefinition = columnDefinition.Replace("PRIMARY KEY", "PRIMARY KEY NONCLUSTERED");
40-
41-
var bucketCountAtribs = fieldDef.PropertyInfo.GetAttributes<SqlServerBucketCountAttribute>();
42-
if (bucketCountAtribs.Count > 0)
43-
{
44-
columnDefinition += $" HASH WITH (BUCKET_COUNT={bucketCountAtribs[0].Count})";
45-
}
45+
sql.Append(" ").Append(AutoIncrementDefinition);
4646
}
47+
}
48+
else
49+
{
50+
sql.Append(fieldDef.IsNullable ? " NULL" : " NOT NULL");
51+
}
4752

48-
if (sbColumns.Length != 0)
49-
sbColumns.Append(", \n ");
53+
// https://msdn.microsoft.com/en-us/library/ms184391.aspx
54+
var collation = fieldDef.PropertyInfo.FirstAttribute<SqlServerCollateAttribute>()?.Collation;
55+
if (!string.IsNullOrEmpty(collation))
56+
{
57+
sql.Append($" COLLATE {collation}");
58+
}
5059

51-
sbColumns.Append(columnDefinition);
60+
var defaultValue = GetDefaultValue(fieldDef);
61+
if (!string.IsNullOrEmpty(defaultValue))
62+
{
63+
sql.AppendFormat(DefaultValueFormat, defaultValue);
64+
}
5265

53-
if (fieldDef.ForeignKey == null || OrmLiteConfig.SkipForeignKeys)
54-
continue;
66+
return StringBuilderCache.ReturnAndFree(sql);
67+
}
5568

56-
var refModelDef = OrmLiteUtils.GetModelDefinition(fieldDef.ForeignKey.ReferenceType);
57-
sbConstraints.Append(
58-
$", \n\n CONSTRAINT {GetQuotedName(fieldDef.ForeignKey.GetForeignKeyName(modelDef, refModelDef, NamingStrategy, fieldDef))} " +
59-
$"FOREIGN KEY ({GetQuotedColumnName(fieldDef.FieldName)}) " +
60-
$"REFERENCES {GetQuotedTableName(refModelDef)} ({GetQuotedColumnName(refModelDef.PrimaryKey.FieldName)})");
69+
public override string ToCreateTableStatement(Type tableType)
70+
{
71+
var sbColumns = StringBuilderCache.Allocate();
72+
var sbConstraints = StringBuilderCacheAlt.Allocate();
73+
var sbTableOptions = StringBuilderCacheAlt.Allocate();
6174

62-
sbConstraints.Append(GetForeignKeyOnDeleteClause(fieldDef.ForeignKey));
63-
sbConstraints.Append(GetForeignKeyOnUpdateClause(fieldDef.ForeignKey));
64-
}
75+
var fileTableAttrib = tableType.FirstAttribute<SqlServerFileTableAttribute>();
76+
var memoryTableAttrib = tableType.FirstAttribute<SqlServerMemoryOptimizedAttribute>();
6577

66-
if (isMemoryTable)
78+
var modelDef = GetModel(tableType);
79+
80+
if (fileTableAttrib == null)
6781
{
68-
var attrib = tableType.FirstAttribute<SqlServerMemoryOptimizedAttribute>();
69-
sbMemOptimized.Append(" WITH (MEMORY_OPTIMIZED=ON");
70-
if (attrib.Durability == SqlServerDurability.SchemaOnly)
71-
sbMemOptimized.Append(", DURABILITY=SCHEMA_ONLY");
72-
else if (attrib.Durability == SqlServerDurability.SchemaAndData)
73-
sbMemOptimized.Append(", DURABILITY=SCHEMA_AND_DATA");
74-
sbMemOptimized.Append(")");
82+
foreach (var fieldDef in modelDef.FieldDefinitions)
83+
{
84+
if (fieldDef.CustomSelect != null)
85+
continue;
86+
87+
var columnDefinition = GetColumnDefinition(fieldDef);
88+
if (columnDefinition == null)
89+
continue;
90+
91+
if (sbColumns.Length != 0)
92+
sbColumns.Append(", \n ");
93+
94+
sbColumns.Append(columnDefinition);
95+
96+
if (fieldDef.ForeignKey == null || OrmLiteConfig.SkipForeignKeys)
97+
continue;
98+
99+
var refModelDef = OrmLiteUtils.GetModelDefinition(fieldDef.ForeignKey.ReferenceType);
100+
sbConstraints.Append(
101+
$", \n\n CONSTRAINT {GetQuotedName(fieldDef.ForeignKey.GetForeignKeyName(modelDef, refModelDef, NamingStrategy, fieldDef))} " +
102+
$"FOREIGN KEY ({GetQuotedColumnName(fieldDef.FieldName)}) " +
103+
$"REFERENCES {GetQuotedTableName(refModelDef)} ({GetQuotedColumnName(refModelDef.PrimaryKey.FieldName)})");
104+
105+
sbConstraints.Append(GetForeignKeyOnDeleteClause(fieldDef.ForeignKey));
106+
sbConstraints.Append(GetForeignKeyOnUpdateClause(fieldDef.ForeignKey));
107+
}
108+
109+
if (memoryTableAttrib != null)
110+
{
111+
var attrib = tableType.FirstAttribute<SqlServerMemoryOptimizedAttribute>();
112+
sbTableOptions.Append(" WITH (MEMORY_OPTIMIZED = ON");
113+
if (attrib.Durability == SqlServerDurability.SchemaOnly)
114+
sbTableOptions.Append(", DURABILITY = SCHEMA_ONLY");
115+
else if (attrib.Durability == SqlServerDurability.SchemaAndData)
116+
sbTableOptions.Append(", DURABILITY = SCHEMA_AND_DATA");
117+
sbTableOptions.Append(")");
118+
}
119+
}
120+
else
121+
{
122+
var hasFileTableDir = !string.IsNullOrEmpty(fileTableAttrib.FileTableDirectory);
123+
var hasFileTableCollateFileName = !string.IsNullOrEmpty(fileTableAttrib.FileTableCollateFileName);
124+
125+
if (hasFileTableDir || hasFileTableCollateFileName)
126+
{
127+
sbTableOptions.Append(" WITH (");
128+
129+
if (hasFileTableDir)
130+
{
131+
sbTableOptions.Append($" FILETABLE_DIRECTORY = N'{fileTableAttrib.FileTableDirectory}'\n");
132+
}
133+
134+
if (hasFileTableCollateFileName)
135+
{
136+
if (hasFileTableDir) sbTableOptions.Append(" ,");
137+
sbTableOptions.Append($" FILETABLE_COLLATE_FILENAME = {fileTableAttrib.FileTableCollateFileName ?? "database_default" }\n");
138+
}
139+
sbTableOptions.Append(")");
140+
}
75141
}
76142

77-
var sql = $"CREATE TABLE {GetQuotedTableName(modelDef)} " +
78-
$"\n(\n {StringBuilderCache.ReturnAndFree(sbColumns)}{StringBuilderCacheAlt.ReturnAndFree(sbConstraints)} \n){StringBuilderCache.ReturnAndFree(sbMemOptimized)}; \n";
143+
var sql = $"CREATE TABLE {GetQuotedTableName(modelDef)} ";
144+
sql += (fileTableAttrib != null)
145+
? $"\n AS FILETABLE{StringBuilderCache.ReturnAndFree(sbTableOptions)};"
146+
: $"\n(\n {StringBuilderCache.ReturnAndFree(sbColumns)}{StringBuilderCacheAlt.ReturnAndFree(sbConstraints)} \n){StringBuilderCache.ReturnAndFree(sbTableOptions)}; \n";
79147

80148
return sql;
81149
}

0 commit comments

Comments
 (0)