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

Commit a8aeb31

Browse files
committed
Add new AliasNamingStrategy and convenient SqlTable, SqlColumn and SqlValue methods for constructing custom sql
1 parent ed7558b commit a8aeb31

File tree

6 files changed

+87
-1
lines changed

6 files changed

+87
-1
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
using System.Collections.Generic;
2+
3+
namespace ServiceStack.OrmLite
4+
{
5+
public class AliasNamingStrategy : OrmLiteNamingStrategyBase
6+
{
7+
public Dictionary<string, string> TableAliases = new Dictionary<string, string>();
8+
public Dictionary<string, string> ColumnAliases = new Dictionary<string, string>();
9+
public INamingStrategy UseNamingStrategy { get; set; }
10+
11+
public override string GetTableName(string name)
12+
{
13+
string alias;
14+
return UseNamingStrategy != null
15+
? UseNamingStrategy.GetTableName(TableAliases.TryGetValue(name, out alias) ? alias : name)
16+
: base.GetTableName(TableAliases.TryGetValue(name, out alias) ? alias : name);
17+
}
18+
19+
public override string GetColumnName(string name)
20+
{
21+
string alias;
22+
return UseNamingStrategy != null
23+
? UseNamingStrategy.GetColumnName(ColumnAliases.TryGetValue(name, out alias) ? alias : name)
24+
: base.GetColumnName(ColumnAliases.TryGetValue(name, out alias) ? alias : name);
25+
}
26+
}
27+
}

src/ServiceStack.OrmLite/OrmLiteUtilExtensions.cs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,22 @@ public static string SqlFmt(this string sqlText, params object[] sqlParams)
153153
return string.Format(sqlText, escapedParams.ToArray());
154154
}
155155

156-
public static string[] IllegalSqlFragmentTokens = {
156+
public static string SqlColumn(this string columnName)
157+
{
158+
return OrmLiteConfig.DialectProvider.GetQuotedColumnName(columnName);
159+
}
160+
161+
public static string SqlTable(this string tableName)
162+
{
163+
return OrmLiteConfig.DialectProvider.GetQuotedTableName(tableName);
164+
}
165+
166+
public static string SqlValue(this object value)
167+
{
168+
return "{0}".SqlFmt(value);
169+
}
170+
171+
public static string[] IllegalSqlFragmentTokens = {
157172
"--", ";--", ";", "%", "/*", "*/", "@@", "@",
158173
"char", "nchar", "varchar", "nvarchar",
159174
"alter", "begin", "cast", "create", "cursor", "declare", "delete",

src/ServiceStack.OrmLite/ServiceStack.OrmLite.Signed.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@
110110
</Reference>
111111
</ItemGroup>
112112
<ItemGroup>
113+
<Compile Include="AliasNamingStrategy.cs" />
113114
<Compile Include="Expressions\SqlExpressionVisitor.cs" />
114115
<Compile Include="Expressions\ParameterRebinder.cs" />
115116
<Compile Include="Expressions\PredicateBuilder.cs" />

src/ServiceStack.OrmLite/ServiceStack.OrmLite.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@
104104
</Reference>
105105
</ItemGroup>
106106
<ItemGroup>
107+
<Compile Include="AliasNamingStrategy.cs" />
107108
<Compile Include="Expressions\SqlExpressionVisitor.cs" />
108109
<Compile Include="Expressions\ParameterRebinder.cs" />
109110
<Compile Include="Expressions\PredicateBuilder.cs" />

tests/ServiceStack.OrmLite.Tests/OrmLiteCreateTableWithNamingStrategyTest.cs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
using System;
22
using NUnit.Framework;
33
using ServiceStack.Common.Tests.Models;
4+
using ServiceStack.OrmLite.PostgreSQL;
5+
using ServiceStack.Text;
46

57
namespace ServiceStack.OrmLite.Tests
68
{
@@ -54,6 +56,45 @@ public void Can_create_TableWithNamigStrategy_table_nameUnderscoreCoumpound()
5456
OrmLiteConfig.DialectProvider.NamingStrategy= new OrmLiteNamingStrategyBase();
5557
}
5658

59+
[Test]
60+
public void Can_create_TableWithNamigStrategy_table_aliases()
61+
{
62+
var aliasNamingStrategy = new AliasNamingStrategy
63+
{
64+
TableAliases = { { "ModelWithOnlyStringFields", "TableAlias" } },
65+
ColumnAliases = { { "Name", "ColumnAlias" } },
66+
};
67+
OrmLiteConfig.DialectProvider.NamingStrategy = aliasNamingStrategy;
68+
69+
using (var db = OpenDbConnection())
70+
{
71+
db.CreateTable<ModelWithOnlyStringFields>(true);
72+
73+
var sql = db.GetLastSql();
74+
Assert.That(sql, Is.StringContaining("CREATE TABLE \"TableAlias\""));
75+
Assert.That(sql, Is.StringContaining("\"ColumnAlias\""));
76+
77+
var result = db.SqlList<ModelWithIdAndName>(
78+
"SELECT * FROM {0} WHERE {1} = {2}"
79+
.Fmt("ModelWithOnlyStringFields".SqlTable(),
80+
"Name".SqlColumn(),
81+
"foo".SqlValue()));
82+
83+
Assert.That(db.GetLastSql(), Is.EqualTo("SELECT * FROM \"TableAlias\" WHERE \"ColumnAlias\" = 'foo'"));
84+
85+
db.DropTable<ModelWithOnlyStringFields>();
86+
87+
aliasNamingStrategy.UseNamingStrategy = new PostgreSqlNamingStrategy();
88+
89+
db.CreateTable<ModelWithOnlyStringFields>(true);
90+
sql = db.GetLastSql();
91+
Assert.That(sql, Is.StringContaining("CREATE TABLE \"table_alias\""));
92+
Assert.That(sql, Is.StringContaining("\"column_alias\""));
93+
}
94+
95+
OrmLiteConfig.DialectProvider.NamingStrategy = new OrmLiteNamingStrategyBase();
96+
}
97+
5798
[Test]
5899
public void Can_get_data_from_TableWithNamigStrategy_with_GetById()
59100
{

tests/ServiceStack.OrmLite.Tests/SqlFormatTests.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,5 +72,6 @@ public void SqlParam_sanitizes_param_values()
7272
{
7373
Assert.That("' or Field LIKE '%".SqlParam(), Is.EqualTo("'' or Field LIKE ''%"));
7474
}
75+
7576
}
7677
}

0 commit comments

Comments
 (0)