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

Commit 22652f5

Browse files
Added some DDL methods
1 parent 226d90b commit 22652f5

File tree

6 files changed

+338
-16
lines changed

6 files changed

+338
-16
lines changed

src/ServiceStack.OrmLite.Firebird/FirebirdOrmLiteDialectProvider.cs

Lines changed: 44 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -334,15 +334,7 @@ public override string ToCreateTableStatement(Type tableType)
334334
if (fieldDef.ForeignKey == null) continue;
335335

336336
var refModelDef = GetModel(fieldDef.ForeignKey.ReferenceType);
337-
338-
var modelName= modelDef.IsInSchema
339-
? modelDef.Schema + "_" + NamingStrategy.GetTableName(modelDef.ModelName)
340-
: NamingStrategy.GetTableName(modelDef.ModelName);
341-
342-
var refModelName= refModelDef.IsInSchema
343-
? refModelDef.Schema + "_" + NamingStrategy.GetTableName(refModelDef.ModelName)
344-
: NamingStrategy.GetTableName(refModelDef.ModelName);
345-
337+
346338
sbConstraints.AppendFormat(", \n\n CONSTRAINT {0} FOREIGN KEY ({1}) REFERENCES {2} ({3})",
347339
GetQuotedName(fieldDef.ForeignKey.GetForeignKeyName(modelDef, refModelDef, NamingStrategy, fieldDef)),
348340
GetQuotedColumnName(fieldDef.FieldName),
@@ -734,6 +726,49 @@ public override bool DoesTableExist(IDbCommand dbCmd, string tableName)
734726
return result > 0;
735727
}
736728

729+
730+
#region DDL
731+
public override string ToAddColumnStatement(Type modelType, FieldDefinition fieldDef){
732+
733+
var column = GetColumnDefinition(fieldDef.FieldName,
734+
fieldDef.FieldType,
735+
fieldDef.IsPrimaryKey,
736+
fieldDef.AutoIncrement,
737+
fieldDef.IsNullable,
738+
fieldDef.FieldLength,
739+
fieldDef.Scale,
740+
fieldDef.DefaultValue);
741+
return string.Format("ALTER TABLE {0} ADD {1} ;",
742+
GetQuotedTableName(GetModel(modelType).ModelName),
743+
column);
744+
}
745+
746+
public override string ToAlterColumnStatement(Type modelType, FieldDefinition fieldDef)
747+
{
748+
749+
var column = GetColumnDefinition(fieldDef.FieldName,
750+
fieldDef.FieldType,
751+
fieldDef.IsPrimaryKey,
752+
fieldDef.AutoIncrement,
753+
fieldDef.IsNullable,
754+
fieldDef.FieldLength,
755+
fieldDef.Scale,
756+
fieldDef.DefaultValue);
757+
return string.Format("ALTER TABLE {0} ALTER {1} ;",
758+
GetQuotedTableName(GetModel(modelType).ModelName),
759+
column);
760+
}
761+
762+
public override string ToChangeColumnNameStatement(Type modelType,
763+
FieldDefinition fieldDef,
764+
string oldColumnName)
765+
{
766+
return string.Format("ALTER TABLE {0} ALTER {1} TO {2} ;",
767+
GetQuotedTableName(GetModel(modelType).ModelName),
768+
GetQuotedColumnName(oldColumnName),
769+
GetQuotedColumnName(fieldDef.FieldName));
770+
}
771+
#endregion DDL
737772
}
738773
}
739774

src/ServiceStack.OrmLite/IOrmLiteDialectProvider.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
using System;
1313
using System.Collections.Generic;
1414
using System.Data;
15+
using System.Linq.Expressions;
1516

1617
namespace ServiceStack.OrmLite
1718
{
@@ -114,5 +115,19 @@ string ToSelectFromProcedureStatement(object fromObjWithProperties,
114115
string GetColumnTypeDefinition(Type fieldType);
115116

116117
string GetDropForeignKeyConstraints(ModelDefinition modelDef);
118+
119+
#region DDL
120+
string ToAddColumnStatement (Type modelType, FieldDefinition fieldDef);
121+
string ToAlterColumnStatement(Type modelType, FieldDefinition fieldDef);
122+
string ToChangeColumnNameStatement(Type modelType, FieldDefinition fieldDef, string oldColumnName);
123+
string ToAddForeignKeyStatement<T,TForeign>(Expression<Func<T,object>> field,
124+
Expression<Func<TForeign,object>> foreignField,
125+
OnFkOption onUpdate,
126+
OnFkOption onDelete,
127+
string foreignKeyName=null);
128+
string ToCreateIndexStatement<T>(Expression<Func<T,object>> field,
129+
string indexName=null, bool unique=false);
130+
#endregion DDL
131+
117132
}
118133
}

src/ServiceStack.OrmLite/ModelDefinition.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
using System.Collections.Generic;
1414
using System.Linq;
1515
using ServiceStack.DataAnnotations;
16+
using System.Linq.Expressions;
1617

1718
namespace ServiceStack.OrmLite
1819
{
@@ -96,6 +97,29 @@ public FieldDefinition[] AllFieldDefinitionsArray
9697
}
9798

9899
public List<CompositeIndexAttribute> CompositeIndexes { get; set; }
100+
101+
102+
public FieldDefinition GetFieldDefinition<T>(Expression<Func<T,object>> field)
103+
{
104+
var fn = GetFieldName (field);
105+
return FieldDefinitions.First(f=>f.Name==fn );
106+
}
107+
108+
string GetFieldName<T>(Expression<Func<T,object>> field){
109+
110+
var lambda = (field as LambdaExpression);
111+
if( lambda.Body.NodeType==ExpressionType.MemberAccess)
112+
{
113+
var me = lambda.Body as MemberExpression;
114+
return me.Member.Name;
115+
}
116+
else
117+
{
118+
var operand = (lambda.Body as UnaryExpression).Operand ;
119+
return (operand as MemberExpression).Member.Name;
120+
}
121+
}
122+
99123
}
100124

101125

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
using System;
2+
using System.Data;
3+
using System.Linq.Expressions;
4+
5+
namespace ServiceStack.OrmLite
6+
{
7+
public enum OnFkOption{
8+
Cascade,
9+
SetNull,
10+
NoAction,
11+
Restrict
12+
}
13+
14+
public static class OrmLiteDDLExtensions
15+
{
16+
public static void AlterTable<T>(this IDbConnection dbConn, string command)
17+
{
18+
AlterTable(dbConn, typeof(T),command);
19+
}
20+
21+
public static void AlterTable(this IDbConnection dbConn, Type modelType, string command)
22+
{
23+
string sql = string.Format("ALTER TABLE {0} {1};",
24+
OrmLiteConfig.DialectProvider.GetQuotedTableName( modelType.GetModelDefinition()),
25+
command);
26+
dbConn.ExecuteSql(sql);
27+
}
28+
29+
public static void AddColumn<T>(this IDbConnection dbConn,
30+
Expression<Func<T,object>> field)
31+
{
32+
var modelDef = ModelDefinition<T>.Definition;
33+
var fieldDef = modelDef.GetFieldDefinition<T>(field);
34+
dbConn.AddColumn(typeof(T), fieldDef);
35+
}
36+
37+
38+
public static void AddColumn(this IDbConnection dbConn, Type modelType, FieldDefinition fieldDef)
39+
{
40+
var command = OrmLiteConfig.DialectProvider.ToAddColumnStatement(modelType, fieldDef);
41+
dbConn.ExecuteSql(command);
42+
}
43+
44+
45+
public static void AlterColumn<T>(this IDbConnection dbConn, Expression<Func<T,object>> field)
46+
{
47+
var modelDef = ModelDefinition<T>.Definition;
48+
var fieldDef = modelDef.GetFieldDefinition<T>(field);
49+
dbConn.AlterColumn(typeof(T), fieldDef);
50+
}
51+
52+
public static void AlterColumn(this IDbConnection dbConn, Type modelType, FieldDefinition fieldDef)
53+
{
54+
var command = OrmLiteConfig.DialectProvider.ToAlterColumnStatement(modelType, fieldDef);
55+
dbConn.ExecuteSql(command);
56+
}
57+
58+
59+
public static void ChangeColumnName<T>(this IDbConnection dbConn,
60+
Expression<Func<T,object>> field,
61+
string oldColumnName)
62+
{
63+
var modelDef = ModelDefinition<T>.Definition;
64+
var fieldDef = modelDef.GetFieldDefinition<T>(field);
65+
dbConn.ChangeColumnName(typeof(T), fieldDef, oldColumnName);
66+
}
67+
68+
public static void ChangeColumnName(this IDbConnection dbConn,
69+
Type modelType,
70+
FieldDefinition fieldDef,
71+
string oldColumnName)
72+
{
73+
var command = OrmLiteConfig.DialectProvider.ToChangeColumnNameStatement(modelType, fieldDef, oldColumnName);
74+
dbConn.ExecuteSql(command);
75+
}
76+
77+
public static void DropColumn<T>(this IDbConnection dbConn,string columnName)
78+
{
79+
dbConn.DropColumn(typeof(T), columnName);
80+
}
81+
82+
83+
public static void DropColumn(this IDbConnection dbConn,Type modelType, string columnName)
84+
{
85+
string command = string.Format("ALTER TABLE {0} DROP {1};",
86+
OrmLiteConfig.DialectProvider.GetQuotedTableName(modelType.GetModelDefinition().ModelName),
87+
OrmLiteConfig.DialectProvider.GetQuotedName(columnName));
88+
89+
dbConn.ExecuteSql(command);
90+
}
91+
92+
93+
94+
public static void AddForeignKey<T,TForeign>(this IDbConnection dbConn,
95+
Expression<Func<T,object>> field,
96+
Expression<Func<TForeign,object>> foreignField,
97+
OnFkOption onUpdate,
98+
OnFkOption onDelete,
99+
string foreignKeyName=null)
100+
{
101+
string command = OrmLiteConfig.DialectProvider.ToAddForeignKeyStatement(field,
102+
foreignField,
103+
onUpdate,
104+
onDelete,
105+
foreignKeyName);
106+
dbConn.ExecuteSql (command);
107+
}
108+
109+
110+
public static void DropForeignKey<T>(this IDbConnection dbConn,string foreignKeyName)
111+
{
112+
string command = string.Format("ALTER TABLE {0} DROP FOREIGN KEY {1};",
113+
OrmLiteConfig.DialectProvider.GetQuotedTableName(ModelDefinition<T>.Definition.ModelName),
114+
OrmLiteConfig.DialectProvider.GetQuotedName(foreignKeyName));
115+
dbConn.ExecuteSql(command);
116+
}
117+
118+
119+
public static void CreateIndex<T>(this IDbConnection dbConn,Expression<Func<T,object>> field,
120+
string indexName=null, bool unique=false)
121+
{
122+
var command = OrmLiteConfig.DialectProvider.ToCreateIndexStatement(field, indexName, unique);
123+
dbConn.ExecuteSql(command);
124+
}
125+
126+
127+
public static void DropIndex<T>(this IDbConnection dbConn, string indexName)
128+
{
129+
string command = string.Format("ALTER TABLE {0} DROP INDEX {1};",
130+
OrmLiteConfig.DialectProvider.GetQuotedTableName(ModelDefinition<T>.Definition.ModelName),
131+
OrmLiteConfig.DialectProvider.GetQuotedName(indexName));
132+
dbConn.ExecuteSql(command);
133+
}
134+
135+
}
136+
}

src/ServiceStack.OrmLite/OrmLiteDialectProviderBase.cs

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
using System.Diagnostics;
2020
using ServiceStack.Common;
2121
using System.IO;
22+
using System.Linq.Expressions;
2223

2324
namespace ServiceStack.OrmLite
2425
{
@@ -947,5 +948,115 @@ public static ModelDefinition GetModelDefinition(Type modelType)
947948
{
948949
return modelType.GetModelDefinition();
949950
}
951+
952+
#region DDL
953+
public virtual string ToAddColumnStatement(Type modelType, FieldDefinition fieldDef)
954+
{
955+
956+
var column = GetColumnDefinition(fieldDef.FieldName,
957+
fieldDef.FieldType,
958+
fieldDef.IsPrimaryKey,
959+
fieldDef.AutoIncrement,
960+
fieldDef.IsNullable,
961+
fieldDef.FieldLength,
962+
fieldDef.Scale,
963+
fieldDef.DefaultValue);
964+
return string.Format("ALTER TABLE {0} ADD COLUMN {1};",
965+
GetQuotedTableName(modelType.GetModelDefinition().ModelName),
966+
column);
967+
}
968+
969+
970+
public virtual string ToAlterColumnStatement(Type modelType, FieldDefinition fieldDef)
971+
{
972+
var column = GetColumnDefinition(fieldDef.FieldName,
973+
fieldDef.FieldType,
974+
fieldDef.IsPrimaryKey,
975+
fieldDef.AutoIncrement,
976+
fieldDef.IsNullable,
977+
fieldDef.FieldLength,
978+
fieldDef.Scale,
979+
fieldDef.DefaultValue);
980+
return string.Format("ALTER TABLE {0} MODIFY COLUMN {1};",
981+
GetQuotedTableName(modelType.GetModelDefinition().ModelName),
982+
column);
983+
}
984+
985+
public virtual string ToChangeColumnNameStatement(Type modelType,
986+
FieldDefinition fieldDef,
987+
string oldColumnName)
988+
{
989+
var column = GetColumnDefinition(fieldDef.FieldName,
990+
fieldDef.FieldType,
991+
fieldDef.IsPrimaryKey,
992+
fieldDef.AutoIncrement,
993+
fieldDef.IsNullable,
994+
fieldDef.FieldLength,
995+
fieldDef.Scale,
996+
fieldDef.DefaultValue);
997+
return string.Format("ALTER TABLE {0} CHANGE COLUMN {1} {2};",
998+
GetQuotedTableName(modelType.GetModelDefinition().ModelName),
999+
GetQuotedColumnName(oldColumnName),
1000+
column);
1001+
}
1002+
1003+
public virtual string ToAddForeignKeyStatement<T,TForeign>(Expression<Func<T,object>> field,
1004+
Expression<Func<TForeign,object>> foreignField,
1005+
OnFkOption onUpdate,
1006+
OnFkOption onDelete,
1007+
string foreignKeyName=null){
1008+
var sourceMD = ModelDefinition<T>.Definition;
1009+
var fieldName = sourceMD.GetFieldDefinition (field).FieldName;
1010+
1011+
var referenceMD=ModelDefinition<TForeign>.Definition;
1012+
var referenceFieldName= referenceMD.GetFieldDefinition(foreignField).FieldName;
1013+
1014+
string name = GetQuotedName(foreignKeyName.IsNullOrEmpty()?
1015+
"fk_"+sourceMD.ModelName+"_"+ fieldName+"_"+referenceFieldName:
1016+
foreignKeyName);
1017+
1018+
return string.Format("ALTER TABLE {0} ADD CONSTRAINT {1} FOREIGN KEY ({2}) REFERENCES {3} ({4}) ON UPDATE {5} ON DELETE {6};",
1019+
GetQuotedTableName(sourceMD.ModelName),
1020+
name,
1021+
GetQuotedColumnName(fieldName),
1022+
GetQuotedTableName(referenceMD.ModelName),
1023+
GetQuotedColumnName(referenceFieldName),
1024+
FkOptionToString(onUpdate),
1025+
FkOptionToString(onDelete));
1026+
}
1027+
1028+
public virtual string ToCreateIndexStatement<T>(Expression<Func<T,object>> field,
1029+
string indexName=null, bool unique=false)
1030+
{
1031+
1032+
var sourceMD = ModelDefinition<T>.Definition;
1033+
var fieldName = sourceMD.GetFieldDefinition (field).FieldName;
1034+
1035+
string name =GetQuotedName(indexName.IsNullOrEmpty()?
1036+
(unique?"uidx":"idx") +"_"+sourceMD.ModelName+"_"+fieldName:
1037+
indexName);
1038+
1039+
string command = string.Format("CREATE{0}INDEX {1} ON {2}({3});",
1040+
unique?" UNIQUE ": " ",
1041+
name,
1042+
GetQuotedTableName(sourceMD.ModelName),
1043+
GetQuotedColumnName(fieldName)
1044+
);
1045+
return command;
1046+
}
1047+
1048+
1049+
protected string FkOptionToString(OnFkOption option){
1050+
switch(option){
1051+
case OnFkOption.Cascade: return "CASCADE";
1052+
case OnFkOption.NoAction: return "NO ACTION";
1053+
case OnFkOption.Restrict: return "RESTRICT";
1054+
case OnFkOption.SetNull: return "SET NULL";
1055+
default: return "RESTRICT";
1056+
}
1057+
}
1058+
1059+
#endregion DDL
1060+
9501061
}
9511062
}

0 commit comments

Comments
 (0)