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

Commit 9191edd

Browse files
committed
Add GetSchemaTable/Async + GetTableColumns/Async + db scripts
1 parent 2e0ffe7 commit 9191edd

File tree

8 files changed

+179
-1
lines changed

8 files changed

+179
-1
lines changed

src/ServiceStack.OrmLite/Async/ReadExpressionCommandExtensionsAsync.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,19 @@ internal static Task<List<T>> Select<T>(this IDbCommand dbCmd, Expression<Func<T
204204
return dbCmd.ExprConvertToListAsync<T>(sql, q.Params, q.OnlyFields, token);
205205
}
206206

207+
208+
internal static async Task<DataTable> GetSchemaTableAsync(this IDbCommand dbCmd, string sql, CancellationToken token)
209+
{
210+
using (var reader = await dbCmd.ExecReaderAsync(sql, token))
211+
{
212+
return reader.GetSchemaTable();
213+
}
214+
}
215+
216+
public static Task<ColumnSchema[]> GetTableColumnsAsync(this IDbCommand dbCmd, Type table, CancellationToken token) =>
217+
dbCmd.GetTableColumnsAsync($"SELECT * FROM {dbCmd.GetDialectProvider().GetQuotedTableName(table.GetModelDefinition())}", token);
218+
219+
public static async Task<ColumnSchema[]> GetTableColumnsAsync(this IDbCommand dbCmd, string sql, CancellationToken token) => (await dbCmd.GetSchemaTableAsync(sql, token)).ToColumnSchemas();
207220
}
208221
}
209222
#endif
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
using System;
2+
3+
namespace ServiceStack.OrmLite
4+
{
5+
public class ColumnSchema
6+
{
7+
public string ColumnName { get; set; }
8+
public int ColumnOrdinal { get; set; }
9+
public int ColumnSize { get; set; }
10+
public int NumericPrecision { get; set; }
11+
public int NumericScale { get; set; }
12+
public bool IsUnique { get; set; }
13+
public bool IsKey { get; set; }
14+
public string BaseServerName { get; set; }
15+
public string BaseCatalogName { get; set; }
16+
public string BaseColumnName { get; set; }
17+
public string BaseSchemaName { get; set; }
18+
public string BaseTableName { get; set; }
19+
public Type DataType { get; set; }
20+
public bool AllowDBNull { get; set; }
21+
public int ProviderType { get; set; }
22+
public bool IsAliased { get; set; }
23+
public bool IsExpression { get; set; }
24+
public bool IsAutoIncrement { get; set; }
25+
public bool IsRowVersion { get; set; }
26+
public bool IsHidden { get; set; }
27+
public bool IsLong { get; set; }
28+
public bool IsReadOnly { get; set; }
29+
public Type ProviderSpecificDataType { get; set; }
30+
public object DefaultValue { get; set; }
31+
public string DataTypeName { get; set; }
32+
public string CollationType { get; set; }
33+
}
34+
35+
}

src/ServiceStack.OrmLite/DbScripts.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Data;
4+
using System.Linq;
45
using ServiceStack.Data;
56
using ServiceStack.Script;
67

@@ -146,6 +147,17 @@ public List<KeyValuePair<string, long>> dbTableNamesWithRowCounts(ScriptScopeCon
146147
schema: args.TryGetValue("schema", out var oSchema) ? oSchema as string : null),
147148
scope, options);
148149

150+
public string[] dbColumnNames(ScriptScopeContext scope, string tableName) => dbColumnNames(scope, tableName, null);
151+
public string[] dbColumnNames(ScriptScopeContext scope, string tableName, object options) =>
152+
dbColumns(scope, tableName, options).Select(x => x.ColumnName).ToArray();
153+
154+
public ColumnSchema[] dbColumns(ScriptScopeContext scope, string tableName) => dbColumns(scope, tableName, null);
155+
public ColumnSchema[] dbColumns(ScriptScopeContext scope, string tableName, object options) =>
156+
exec(db => db.GetTableColumns($"SELECT * FROM {sqlQuote(tableName)}"), scope, options);
157+
158+
public ColumnSchema[] dbDesc(ScriptScopeContext scope, string sql) => dbDesc(scope, sql, null);
159+
public ColumnSchema[] dbDesc(ScriptScopeContext scope, string sql, object options) => exec(db => db.GetTableColumns(sql), scope, options);
160+
149161
public string sqlQuote(string name) => OrmLiteConfig.DialectProvider.GetQuotedName(name);
150162
public string sqlConcat(IEnumerable<object> values) => OrmLiteConfig.DialectProvider.SqlConcat(values);
151163
public string sqlCurrency(string fieldOrValue) => OrmLiteConfig.DialectProvider.SqlCurrency(fieldOrValue);

src/ServiceStack.OrmLite/DbScriptsAsync.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Data;
4+
using System.Linq;
45
using System.Threading.Tasks;
56
using ServiceStack.Data;
67
using ServiceStack.Script;
@@ -149,6 +150,17 @@ public Task<object> dbTableNamesWithRowCounts(ScriptScopeContext scope, Dictiona
149150
schema: args.TryGetValue("schema", out var oSchema) ? oSchema as string : null),
150151
scope, options);
151152

153+
public Task<object> dbColumnNames(ScriptScopeContext scope, string tableName) => dbColumnNames(scope, tableName, null);
154+
public Task<object> dbColumnNames(ScriptScopeContext scope, string tableName, object options) =>
155+
exec(async db => (await db.GetTableColumnsAsync($"SELECT * FROM {sqlQuote(tableName)}")).Select(x => x.ColumnName).ToArray(), scope, options);
156+
157+
public Task<object> dbColumns(ScriptScopeContext scope, string tableName) => dbColumns(scope, tableName, null);
158+
public Task<object> dbColumns(ScriptScopeContext scope, string tableName, object options) =>
159+
exec(db => db.GetTableColumnsAsync($"SELECT * FROM {sqlQuote(tableName)}"), scope, options);
160+
161+
public Task<object> dbDesc(ScriptScopeContext scope, string sql) => dbDesc(scope, sql, null);
162+
public Task<object> dbDesc(ScriptScopeContext scope, string sql, object options) => exec(db => db.GetTableColumnsAsync(sql), scope, options);
163+
152164
public string sqlQuote(string name) => OrmLiteConfig.DialectProvider.GetQuotedName(name);
153165
public string sqlConcat(IEnumerable<object> values) => OrmLiteConfig.DialectProvider.SqlConcat(values);
154166
public string sqlCurrency(string fieldOrValue) => OrmLiteConfig.DialectProvider.SqlCurrency(fieldOrValue);

src/ServiceStack.OrmLite/Expressions/ReadExpressionCommandExtensions.cs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,37 @@ internal static List<T> LoadSelect<T>(this IDbCommand dbCmd, Expression<Func<T,
229229
var expr = dbCmd.GetDialectProvider().SqlExpression<T>().Where(predicate);
230230
return dbCmd.LoadListWithReferences<T, T>(expr, include);
231231
}
232+
233+
internal static DataTable GetSchemaTable(this IDbCommand dbCmd, string sql)
234+
{
235+
using (var reader = dbCmd.ExecReader(sql))
236+
{
237+
return reader.GetSchemaTable();
238+
}
239+
}
240+
241+
public static ColumnSchema[] GetTableColumns(this IDbCommand dbCmd, Type table) =>
242+
dbCmd.GetTableColumns($"SELECT * FROM {dbCmd.GetDialectProvider().GetQuotedTableName(table.GetModelDefinition())}");
243+
244+
public static ColumnSchema[] GetTableColumns(this IDbCommand dbCmd, string sql) => dbCmd.GetSchemaTable(sql).ToColumnSchemas();
245+
246+
internal static ColumnSchema[] ToColumnSchemas(this DataTable dt)
247+
{
248+
var ret = new List<ColumnSchema>();
249+
foreach (DataRow row in dt.Rows)
250+
{
251+
var obj = new Dictionary<string, object>();
252+
foreach (DataColumn column in dt.Columns)
253+
{
254+
obj[column.ColumnName] = row[column.Ordinal];
255+
}
256+
257+
var to = obj.FromObjectDictionary<ColumnSchema>();
258+
ret.Add(to);
259+
}
260+
261+
return ret.ToArray();
262+
}
232263
}
233264
}
234265

src/ServiceStack.OrmLite/OrmLiteReadExpressionsApi.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,5 +414,26 @@ public static List<Into> LoadSelect<Into, From>(this IDbConnection dbConn, SqlEx
414414
{
415415
return dbConn.Exec(dbCmd => dbCmd.LoadSelect<Into, From>(expression, include.GetFieldNames()));
416416
}
417+
418+
/// <summary>
419+
/// Return ADO.NET reader.GetSchemaTable() in a DataTable
420+
/// </summary>
421+
/// <param name="dbConn"></param>
422+
/// <param name="sql"></param>
423+
/// <returns></returns>
424+
public static DataTable GetSchemaTable(this IDbConnection dbConn, string sql) => dbConn.Exec(dbCmd => dbCmd.GetSchemaTable(sql));
425+
426+
/// <summary>
427+
/// Get Table Column Schemas for specified table
428+
/// </summary>
429+
public static ColumnSchema[] GetTableColumns<T>(this IDbConnection dbConn) => dbConn.Exec(dbCmd => dbCmd.GetTableColumns(typeof(T)));
430+
/// <summary>
431+
/// Get Table Column Schemas for specified table
432+
/// </summary>
433+
public static ColumnSchema[] GetTableColumns(this IDbConnection dbConn, Type type) => dbConn.Exec(dbCmd => dbCmd.GetTableColumns(type));
434+
/// <summary>
435+
/// Get Table Column Schemas for result-set return from specified sql
436+
/// </summary>
437+
public static ColumnSchema[] GetTableColumns(this IDbConnection dbConn, string sql) => dbConn.Exec(dbCmd => dbCmd.GetTableColumns(sql));
417438
}
418439
}

src/ServiceStack.OrmLite/OrmLiteReadExpressionsApiAsync.cs

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,32 @@ public static Task<TKey> ScalarAsync<T, TKey>(this IDbConnection dbConn,
180180
public static Task<List<Into>> LoadSelectAsync<Into, From>(this IDbConnection dbConn, SqlExpression<From> expression, string[] include = null, CancellationToken token = default(CancellationToken))
181181
{
182182
return dbConn.Exec(dbCmd => dbCmd.LoadSelectAsync<Into, From>(expression, include, token));
183-
}
183+
}
184+
185+
/// <summary>
186+
/// Return ADO.NET reader.GetSchemaTable() in a DataTable
187+
/// </summary>
188+
/// <param name="dbConn"></param>
189+
/// <param name="sql"></param>
190+
/// <returns></returns>
191+
public static Task<DataTable> GetSchemaTableAsync(this IDbConnection dbConn, string sql, CancellationToken token=default) =>
192+
dbConn.Exec(dbCmd => dbCmd.GetSchemaTableAsync(sql, token));
193+
194+
/// <summary>
195+
/// Get Table Column Schemas for specified table
196+
/// </summary>
197+
public static Task<ColumnSchema[]> GetTableColumnsAsync<T>(this IDbConnection dbConn, CancellationToken token=default) =>
198+
dbConn.Exec(dbCmd => dbCmd.GetTableColumnsAsync(typeof(T), token));
199+
/// <summary>
200+
/// Get Table Column Schemas for specified table
201+
/// </summary>
202+
public static Task<ColumnSchema[]> GetTableColumnsAsync(this IDbConnection dbConn, Type type, CancellationToken token=default) =>
203+
dbConn.Exec(dbCmd => dbCmd.GetTableColumnsAsync(type, token));
204+
/// <summary>
205+
/// Get Table Column Schemas for result-set return from specified sql
206+
/// </summary>
207+
public static Task<ColumnSchema[]> GetTableColumnsAsync(this IDbConnection dbConn, string sql, CancellationToken token=default) =>
208+
dbConn.Exec(dbCmd => dbCmd.GetTableColumnsAsync(sql, token));
184209
}
185210

186211
}

tests/ServiceStack.OrmLite.Tests/SchemaTests.cs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
using System;
2+
using System.Threading.Tasks;
23
using NUnit.Framework;
34
using ServiceStack.DataAnnotations;
5+
using ServiceStack.OrmLite.Tests.Shared;
6+
using ServiceStack.Text;
47

58
namespace ServiceStack.OrmLite.Tests
69
{
@@ -136,5 +139,31 @@ public void Can_drop_and_add_column()
136139
catch (Exception) { }
137140
}
138141
}
142+
143+
[Test]
144+
public void Can_get_Schema_Table()
145+
{
146+
using (var db = OpenDbConnection())
147+
{
148+
db.CreateTableIfNotExists<Person>();
149+
150+
var columnSchemas = db.GetTableColumns<Person>();
151+
152+
columnSchemas.Each(x => x.PrintDump());
153+
}
154+
}
155+
156+
[Test]
157+
public async Task Can_get_Schema_Table_Async()
158+
{
159+
using (var db = OpenDbConnection())
160+
{
161+
db.CreateTableIfNotExists<Person>();
162+
163+
var columnSchemas = await db.GetTableColumnsAsync<Person>();
164+
165+
columnSchemas.Each(x => x.PrintDump());
166+
}
167+
}
139168
}
140169
}

0 commit comments

Comments
 (0)