Skip to content

Commit 20f792c

Browse files
committed
Merge branch 'develop'
2 parents 39b570d + 03014be commit 20f792c

21 files changed

+132
-42
lines changed

src/SimpleStack.Orm.MySQL/ColumnsInformationSchema.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,6 @@ internal class InformationSchema
2020
public string COLUMN_TYPE { get; set; }
2121
public string COLUMN_KEY { get; set; }
2222
public string EXTRA { get; set; }
23+
public string GENERATION_EXPRESSION { get; set; }
2324
}
2425
}

src/SimpleStack.Orm.MySQL/MySqlDialectProvider.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,8 @@ FROM INFORMATION_SCHEMA.STATISTICS
129129
Length = c.CHARACTER_MAXIMUM_LENGTH,
130130
DbType = c.COLUMN_TYPE == "tinyint(1)" ? DbType.Boolean : ci,
131131
Precision = c.NUMERIC_PRECISION,
132-
Scale = c.NUMERIC_SCALE
132+
Scale = c.NUMERIC_SCALE,
133+
ComputedExpression = c.GENERATION_EXPRESSION
133134
};
134135
}
135136
}

src/SimpleStack.Orm.MySQL/SimpleStack.Orm.MySQL.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
<Version>1.2.0-beta95</Version>
1717
<AssemblyVersion>1.2.0.0</AssemblyVersion>
1818
<FileVersion>1.2.0.0</FileVersion>
19-
<PackageVersion>1.2.2</PackageVersion>
19+
<PackageVersion>1.2.3</PackageVersion>
2020
<PackageProjectUrl>https://simplestack.org/</PackageProjectUrl>
2121
<RepositoryUrl>https://github.com/SimpleStack/simplestack.orm</RepositoryUrl>
2222
<RepositoryType>git</RepositoryType>

src/SimpleStack.Orm.MySQLConnector/MySqlConnectorDialectProvider.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,8 @@ FROM INFORMATION_SCHEMA.STATISTICS
130130
Length = c.CHARACTER_MAXIMUM_LENGTH,
131131
DbType = c.COLUMN_TYPE == "tinyint(1)" ? DbType.Boolean : ci,
132132
Precision = c.NUMERIC_PRECISION,
133-
Scale = c.NUMERIC_SCALE
133+
Scale = c.NUMERIC_SCALE,
134+
ComputedExpression = c.GENERATION_EXPRESSION
134135
};
135136
}
136137

src/SimpleStack.Orm.MySQLConnector/SimpleStack.Orm.MySQLConnector.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
<Version>1.2.0-beta95</Version>
1515
<AssemblyVersion>1.2.0.0</AssemblyVersion>
1616
<FileVersion>1.2.0.0</FileVersion>
17-
<PackageVersion>1.2.2</PackageVersion>
17+
<PackageVersion>1.2.3</PackageVersion>
1818
<TargetFramework>netstandard2.0</TargetFramework>
1919
<PackageProjectUrl>https://simplestack.org/</PackageProjectUrl>
2020
<RepositoryUrl>https://github.com/SimpleStack/simplestack.orm</RepositoryUrl>

src/SimpleStack.Orm.PostgreSQL/PostgreSQLDialectProvider.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,8 @@ FROM pg_index i
213213
Nullable = c.is_nullable == "YES",
214214
Precision = c.numeric_precision,
215215
Scale = c.numeric_scale,
216-
DbType = GetDbType(c)
216+
DbType = GetDbType(c),
217+
ComputedExpression = c.generation_expression
217218
};
218219
}
219220
}

src/SimpleStack.Orm.PostgreSQL/SimpleStack.Orm.PostgreSQL.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
<Version>1.2.0-beta95</Version>
1616
<AssemblyVersion>1.2.1.0</AssemblyVersion>
1717
<FileVersion>1.2.1.0</FileVersion>
18-
<PackageVersion>1.2.2</PackageVersion>
18+
<PackageVersion>1.2.3</PackageVersion>
1919
<PackageProjectUrl>https://simplestack.org/</PackageProjectUrl>
2020
<RepositoryUrl>https://github.com/SimpleStack/simplestack.orm</RepositoryUrl>
2121
</PropertyGroup>

src/SimpleStack.Orm.SDSQLite/SimpleStack.Orm.SDSQLite.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
<Version>1.2.0-beta95</Version>
1616
<AssemblyVersion>1.2.0.0</AssemblyVersion>
1717
<FileVersion>1.2.0.0</FileVersion>
18-
<PackageVersion>1.2.2</PackageVersion>
18+
<PackageVersion>1.2.3</PackageVersion>
1919
<RootNamespace>SimpleStack.Orm.SDSQlite</RootNamespace>
2020
<PackageProjectUrl>https://simplestack.org/</PackageProjectUrl>
2121
<RepositoryUrl>https://github.com/SimpleStack/simplestack.orm</RepositoryUrl>

src/SimpleStack.Orm.SDSQLite/SqliteDialectProvider.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ public override string GetDatePartFunction(string name, string quotedColName)
122122
public override IEnumerable<IColumnDefinition> GetTableColumnDefinitions(IDbConnection connection,
123123
string tableName, string schemaName = null)
124124
{
125-
var sqlQuery = $"pragma table_info('{tableName}')";
125+
var sqlQuery = $"pragma table_xinfo('{tableName}')";
126126
foreach (var c in connection.Query(sqlQuery))
127127
{
128128
Match m = PrecisionAndScaleRegex.Match(c.type);

src/SimpleStack.Orm.SQLServer/SimpleStack.Orm.SQLServer.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
<Version>1.2.0-beta95</Version>
1515
<AssemblyVersion>1.2.0.0</AssemblyVersion>
1616
<FileVersion>1.2.0.0</FileVersion>
17-
<PackageVersion>1.2.2</PackageVersion>
17+
<PackageVersion>1.2.3</PackageVersion>
1818
<TargetFramework>netstandard2.0</TargetFramework>
1919
<PackageProjectUrl>https://simplestack.org/</PackageProjectUrl>
2020
<RepositoryUrl>https://github.com/SimpleStack/simplestack.orm</RepositoryUrl>

src/SimpleStack.Orm.SQLServer/SqlServerOrmLiteDialectProvider.cs

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -237,43 +237,49 @@ public override string GetStringFunction(string functionName, string quotedColum
237237
}
238238

239239
public override IEnumerable<IColumnDefinition> GetTableColumnDefinitions(IDbConnection connection, string tableName, string schemaName = null)
240-
{
241-
string sqlQuery = @"SELECT *, OBJECTPROPERTY(OBJECT_ID(CONSTRAINT_SCHEMA + '.' + QUOTENAME(CONSTRAINT_NAME)), 'IsPrimaryKey') as IS_PRIMARY_KEY,
242-
OBJECTPROPERTY(OBJECT_ID(CONSTRAINT_SCHEMA + '.' + QUOTENAME(CONSTRAINT_NAME)), 'IsIndexed') as IS_UNIQUE
243-
FROM INFORMATION_SCHEMA.COLUMNS
244-
LEFT JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE ON INFORMATION_SCHEMA.KEY_COLUMN_USAGE.TABLE_NAME = INFORMATION_SCHEMA.COLUMNS.TABLE_NAME
245-
AND INFORMATION_SCHEMA.KEY_COLUMN_USAGE.TABLE_CATALOG = INFORMATION_SCHEMA.COLUMNS.TABLE_CATALOG
246-
AND INFORMATION_SCHEMA.KEY_COLUMN_USAGE.TABLE_SCHEMA = INFORMATION_SCHEMA.COLUMNS.TABLE_SCHEMA
247-
AND INFORMATION_SCHEMA.KEY_COLUMN_USAGE.COLUMN_NAME = INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME
248-
AND (OBJECTPROPERTY(OBJECT_ID(CONSTRAINT_SCHEMA + '.' + QUOTENAME(CONSTRAINT_NAME)), 'IsPrimaryKey') = 1)
249-
WHERE INFORMATION_SCHEMA.COLUMNS.TABLE_NAME = @TableName ";
250-
251-
string uniqueQuery = @"SELECT COL_NAME(ic.object_id,ic.column_id) AS column_name , is_unique
240+
{
241+
string fullTableName = string.IsNullOrEmpty(schemaName) ? tableName : $"{schemaName}.{tableName}";
242+
243+
string sqlQuery = @"SELECT c.name COLUMN_NAME,
244+
t.name DATA_TYPE,
245+
dc.definition COLUMN_DEFAULT,
246+
c.max_length CHARACTER_MAXIMUM_LENGTH,
247+
c.is_nullable IS_NULLABLE,
248+
c.[precision] NUMERIC_PRECISION,
249+
c.[scale] NUMERIC_SCALE,
250+
cl.definition COMPUTED_DEFINITION
251+
FROM sys.columns c
252+
LEFT JOIN sys.computed_columns cl ON cl.column_id = c.column_id
253+
LEFT JOIN sys.default_constraints dc ON dc.object_id = c.default_object_id
254+
INNER JOIN sys.types t ON t.user_type_id = c.user_type_id
255+
where c.object_id = OBJECT_ID(@TableName);";
256+
257+
string uniqueQuery = @"SELECT COL_NAME(ic.object_id,ic.column_id) AS COLUMN_NAME , is_unique IS_UNIQUE, is_primary_key IS_PRIMARYKEY
252258
FROM sys.indexes AS i
253259
INNER JOIN sys.index_columns AS ic
254260
ON i.object_id = ic.object_id AND i.index_id = ic.index_id
255261
WHERE i.object_id = OBJECT_ID(@TableName)
256-
AND is_unique = 1;";
257-
var uniqueCols = connection.Query(uniqueQuery, new {TableName = tableName, SchemaName = schemaName}).ToArray();
258-
if (!string.IsNullOrWhiteSpace(schemaName))
259-
{
260-
sqlQuery +=" AND INFORMATION_SCHEMA.COLUMNS.TABLE_SCHEMA = @SchemaName";
261-
}
262+
AND is_unique = 1";
263+
264+
var indexes = connection.Query(uniqueQuery, new {TableName = fullTableName}).ToArray();
262265

263-
foreach (var c in connection.Query(sqlQuery, new {TableName = tableName, SchemaName = schemaName}))
266+
foreach (var c in connection.Query(sqlQuery, new {TableName = fullTableName}))
264267
{
268+
var i = indexes.FirstOrDefault(x => x.COLUMN_NAME == c.COLUMN_NAME);
269+
265270
yield return new ColumnDefinition
266271
{
267272
Name = c.COLUMN_NAME,
268273
Definition = c.DATA_TYPE,
269274
DefaultValue = c.COLUMN_DEFAULT,
270-
PrimaryKey = c.IS_PRIMARY_KEY == 1,
271-
Unique = uniqueCols.Any(x => x.column_name == c.COLUMN_NAME),
272-
Length = c.CHARACTER_MAXIMUM_LENGTH,
273-
Nullable = c.IS_NULLABLE == "YES",
275+
PrimaryKey = i != null && i.IS_PRIMARY_KEY ?? false,
276+
Unique = i != null && i.IS_UNIQUE ?? false,
277+
Length = (c.DATA_TYPE == "nvarchar" || c.DATA_TYPE == "ntext" || c.DATA_TYPE == "nchar") ? c.CHARACTER_MAXIMUM_LENGTH / 2 : c.CHARACTER_MAXIMUM_LENGTH,
278+
Nullable = c.IS_NULLABLE,
274279
Precision = c.NUMERIC_PRECISION,
275280
Scale = c.NUMERIC_SCALE,
276-
DbType = GetDbType(c.DATA_TYPE)
281+
DbType = GetDbType(c.DATA_TYPE),
282+
ComputedExpression = c.COMPUTED_DEFINITION
277283
};
278284
}
279285
}

src/SimpleStack.Orm.SQLite/SimpleStack.Orm.SQLite.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
<Version>1.2.0-beta95</Version>
1616
<AssemblyVersion>1.2.0.0</AssemblyVersion>
1717
<FileVersion>1.2.0.0</FileVersion>
18-
<PackageVersion>1.2.2</PackageVersion>
18+
<PackageVersion>1.2.3</PackageVersion>
1919
<PackageProjectUrl>https://simplestack.org/</PackageProjectUrl>
2020
<RepositoryUrl>https://github.com/SimpleStack/simplestack.orm</RepositoryUrl>
2121
</PropertyGroup>

src/SimpleStack.Orm.SQLite/SqliteDialectProvider.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ public override string GetDatePartFunction(string name, string quotedColName)
123123
public override IEnumerable<IColumnDefinition> GetTableColumnDefinitions(IDbConnection connection,
124124
string tableName, string schemaName = null)
125125
{
126-
var sqlQuery = $"pragma table_info('{tableName}')";
126+
var sqlQuery = $"pragma table_xinfo('{tableName}')";
127127
foreach (var c in connection.Query(sqlQuery))
128128
{
129129
Match m = PrecisionAndScaleRegex.Match(c.type);

src/SimpleStack.Orm/ColumnDefinition.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,11 @@ public interface IColumnDefinition
5353
/// Column default value
5454
/// </summary>
5555
string DefaultValue { get; }
56+
57+
/// <summary>
58+
/// Computed Column Expression
59+
/// </summary>
60+
string ComputedExpression { get; }
5661
}
5762

5863
public class ColumnType
@@ -83,5 +88,8 @@ public class ColumnDefinition : ColumnType, IColumnDefinition
8388

8489
/// <inheritdoc />
8590
public string DefaultValue { get; set; }
91+
92+
/// <inheritdoc />
93+
public string ComputedExpression { get; set; }
8694
}
8795
}

src/SimpleStack.Orm/Expressions/Statements/Typed/TypedInsertStatement.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@ public TypedInsertStatement<T> Values(T values, IEnumerable<string> onlyFields)
4949

5050
foreach (var fieldDef in fields)
5151
{
52-
var v = fieldDef.GetValue(values);
53-
if (fieldDef.DefaultValue == null || v != null)
52+
var v = fieldDef.GetValue(values) ?? fieldDef.DefaultValue;
53+
if (v != null)
5454
{
5555
var pname = _dialectProvider.GetParameterName(Statement.Parameters.Count);
5656
Statement.Parameters.Add(pname, v);

src/SimpleStack.Orm/OrmConnectionAsync.cs

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -434,6 +434,23 @@ public async Task CreateTableAsync<T>(bool dropIfExists)
434434
var tableType = typeof(T);
435435
await CreateTableAsync(dropIfExists, tableType);
436436
}
437+
438+
/// <summary>
439+
/// Create a table based on the give Type
440+
/// </summary>
441+
/// <param name="tableType"></param>
442+
/// <param name="dropIfExists">True to drop the table if it already exists</param>
443+
/// <returns></returns>
444+
/// <exception cref="OrmException"></exception>
445+
public async Task CreateTableAsync(Type tableType, bool dropIfExists)
446+
{
447+
if (!dropIfExists && await TableExistsAsync(tableType))
448+
{
449+
throw new OrmException("Table already exists");
450+
}
451+
452+
await CreateTableAsync(dropIfExists, tableType);
453+
}
437454

438455
/// <summary>
439456
/// Create a table corresponding to the specified type if it didn't exists
@@ -445,7 +462,17 @@ public async Task CreateTableIfNotExistsAsync<T>()
445462
var tableType = typeof(T);
446463
await CreateTableAsync(false, tableType);
447464
}
448-
465+
466+
/// <summary>
467+
/// Create a table corresponding to the specified type if it didn't exists
468+
/// </summary>
469+
/// <param name="tableType"></param>
470+
/// <returns></returns>
471+
public async Task CreateTableIfNotExistsAsync(Type tableType)
472+
{
473+
await CreateTableAsync(false, tableType);
474+
}
475+
449476
/// <summary>
450477
/// Create a schema if no exists
451478
/// </summary>
@@ -479,6 +506,20 @@ public async Task<bool> TableExistsAsync<T>()
479506
tableModelDef.Alias ?? tableModelDef.ModelName,
480507
tableModelDef.Schema));
481508
}
509+
510+
/// <summary>
511+
/// Execute a query to detect if a table already exists
512+
/// </summary>
513+
/// <typeparam name="T"></typeparam>
514+
/// <returns></returns>
515+
public async Task<bool> TableExistsAsync(Type tableType)
516+
{
517+
var tableModelDef = tableType.GetModelDefinition();
518+
return await Task.Run(() =>
519+
DialectProvider.DoesTableExist(this,
520+
tableModelDef.Alias ?? tableModelDef.ModelName,
521+
tableModelDef.Schema));
522+
}
482523

483524
/// <summary>
484525
/// Execute a query to detect if a table already exists
@@ -508,6 +549,22 @@ public async Task<bool> DropTableIfExistsAsync<T>()
508549
return false;
509550
}
510551

552+
/// <summary>
553+
/// Drop a table if it exists
554+
/// </summary>
555+
/// <param name="tableType"></param>
556+
/// <returns>True if table did exists and has been dropped</returns>
557+
public async Task<bool> DropTableIfExistsAsync(Type tableType)
558+
{
559+
if (await TableExistsAsync(tableType))
560+
{
561+
var tableModelDef = tableType.GetModelDefinition();
562+
await DropTableAsync(tableModelDef);
563+
}
564+
565+
return false;
566+
}
567+
511568
/// <summary>
512569
/// Return list of tables and/or view that exists in the database
513570
/// </summary>

src/SimpleStack.Orm/OrmConnectionSync.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,11 +258,21 @@ public void CreateTableIfNotExists<T>()
258258
{
259259
CreateTableIfNotExistsAsync<T>().Wait();
260260
}
261+
262+
public void CreateTableIfNotExists(Type tableType)
263+
{
264+
CreateTableIfNotExistsAsync(tableType).Wait();
265+
}
261266

262267
public bool TableExists<T>()
263268
{
264269
return TableExistsAsync<T>().Result;
265270
}
271+
272+
public bool TableExists(Type tableType)
273+
{
274+
return TableExistsAsync(tableType).Result;
275+
}
266276

267277
public bool TableExists(string tableName, string schemaName = null)
268278
{
@@ -283,6 +293,11 @@ public bool DropTableIfExists<T>()
283293
{
284294
return DropTableIfExistsAsync<T>().Result;
285295
}
296+
297+
public bool DropTableIfExists(Type tableType)
298+
{
299+
return DropTableIfExistsAsync(tableType).Result;
300+
}
286301

287302
public IEnumerable<ITableDefinition> GetTables(string schemaName = null, bool includeViews = false)
288303
{

src/SimpleStack.Orm/SimpleStack.Orm.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
<GeneratePackageOnBuild>False</GeneratePackageOnBuild>
1515
<AssemblyVersion>1.2.1.0</AssemblyVersion>
1616
<FileVersion>1.2.1.0</FileVersion>
17-
<PackageVersion>1.2.2</PackageVersion>
17+
<PackageVersion>1.2.3</PackageVersion>
1818
<TargetFramework>netstandard2.0</TargetFramework>
1919
<PackageProjectUrl>https://simplestack.org/</PackageProjectUrl>
2020
<RepositoryUrl>https://github.com/SimpleStack/simplestack.orm</RepositoryUrl>

test/SimpleStack.Orm.Tests/SimpleStack.Orm.Tests.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFramework>netcoreapp2.0</TargetFramework>
4+
<TargetFramework>netcoreapp3.1</TargetFramework>
55
<AssemblyName>SimpleStack.Orm.Tests</AssemblyName>
66
<PackageId>SimpleStack.Orm.Tests</PackageId>
77
<GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>

test/SimpleStack.Orm.Tests/packages.config

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<packages>
33
<package id="Dapper" version="1.50.2" targetFramework="net45" />
4-
<package id="log4net" version="2.0.5" targetFramework="net45" />
4+
<package id="log4net" version="2.0.10" targetFramework="net45" />
55
<package id="Newtonsoft.Json" version="9.0.1" targetFramework="net45" />
66
<package id="Npgsql" version="3.1.6" targetFramework="net45" />
77
<package id="NServiceKit.Text" version="1.0.10" targetFramework="net45" />

test/SimpleStack.Orm.xUnit/SimpleStack.Orm.xUnit.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFramework>netcoreapp2.2</TargetFramework>
4+
<TargetFramework>netcoreapp3.1</TargetFramework>
55

66
<IsPackable>false</IsPackable>
77
</PropertyGroup>

0 commit comments

Comments
 (0)