1
1
using System ;
2
- using System . Data ;
3
- using System . Text ;
4
2
using ServiceStack . Text ;
5
3
using ServiceStack . DataAnnotations ;
6
4
@@ -10,72 +8,142 @@ public class SqlServer2014OrmLiteDialectProvider : SqlServer2012OrmLiteDialectPr
10
8
{
11
9
public new static SqlServer2014OrmLiteDialectProvider Instance = new SqlServer2014OrmLiteDialectProvider ( ) ;
12
10
13
- public override string ToCreateTableStatement ( Type tableType )
11
+ public override string GetColumnDefinition ( FieldDefinition fieldDef )
14
12
{
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" ;
18
16
19
- var isMemoryTable = tableType . HasAttribute < SqlServerMemoryOptimizedAttribute > ( ) ;
17
+ var fieldDefinition = fieldDef . CustomFieldDefinition ??
18
+ GetColumnTypeDefinition ( fieldDef . ColumnType , fieldDef . FieldLength , fieldDef . Scale ) ;
20
19
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 )
23
24
{
24
- if ( fieldDef . CustomSelect != null )
25
- continue ;
25
+ var isMemoryTable = fieldDef . PropertyInfo . DeclaringType . FirstAttribute < SqlServerMemoryOptimizedAttribute > ( ) != null ;
26
26
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" ) ;
30
31
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
33
39
{
34
- columnDefinition += $ " COLLATE { collationAttribs [ 0 ] . Collation } " ;
40
+ sql . Append ( " PRIMARY KEY" ) ;
35
41
}
36
42
37
- if ( isMemoryTable && fieldDef . IsPrimaryKey )
43
+ if ( fieldDef . AutoIncrement )
38
44
{
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 ) ;
46
46
}
47
+ }
48
+ else
49
+ {
50
+ sql . Append ( fieldDef . IsNullable ? " NULL" : " NOT NULL" ) ;
51
+ }
47
52
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
+ }
50
59
51
- sbColumns . Append ( columnDefinition ) ;
60
+ var defaultValue = GetDefaultValue ( fieldDef ) ;
61
+ if ( ! string . IsNullOrEmpty ( defaultValue ) )
62
+ {
63
+ sql . AppendFormat ( DefaultValueFormat , defaultValue ) ;
64
+ }
52
65
53
- if ( fieldDef . ForeignKey == null || OrmLiteConfig . SkipForeignKeys )
54
- continue ;
66
+ return StringBuilderCache . ReturnAndFree ( sql ) ;
67
+ }
55
68
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 ( ) ;
61
74
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 > ( ) ;
65
77
66
- if ( isMemoryTable )
78
+ var modelDef = GetModel ( tableType ) ;
79
+
80
+ if ( fileTableAttrib == null )
67
81
{
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
+ }
75
141
}
76
142
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 ";
79
147
80
148
return sql ;
81
149
}
0 commit comments