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

Commit e8ef245

Browse files
committed
Add missing Schema Async APIs
1 parent be4c493 commit e8ef245

File tree

7 files changed

+209
-27
lines changed

7 files changed

+209
-27
lines changed

src/ServiceStack.OrmLite.MySql/MySqlDialectProviderBase.cs

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -417,24 +417,46 @@ public override string ToTableNamesWithRowCountsStatement(bool live, string sche
417417

418418
public override bool DoesTableExist(IDbCommand dbCmd, string tableName, string schema = null)
419419
{
420-
var sql = "SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = {0} AND TABLE_SCHEMA = {1}"
421-
.SqlFmt(GetTableName(tableName, schema).StripDbQuotes(), dbCmd.Connection.Database);
420+
var sql = "SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = {0} AND TABLE_SCHEMA = {1}"
421+
.SqlFmt(GetTableName(tableName, schema).StripDbQuotes(), dbCmd.Connection.Database);
422422

423-
var result = dbCmd.ExecLongScalar(sql);
423+
var result = dbCmd.ExecLongScalar(sql);
424424

425-
return result > 0;
425+
return result > 0;
426+
}
427+
428+
public override async Task<bool> DoesTableExistAsync(IDbCommand dbCmd, string tableName, string schema = null, CancellationToken token=default)
429+
{
430+
var sql = "SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = {0} AND TABLE_SCHEMA = {1}"
431+
.SqlFmt(GetTableName(tableName, schema).StripDbQuotes(), dbCmd.Connection.Database);
432+
433+
var result = await dbCmd.ExecLongScalarAsync(sql, token);
434+
435+
return result > 0;
426436
}
427437

428438
public override bool DoesColumnExist(IDbConnection db, string columnName, string tableName, string schema = null)
429439
{
430-
tableName = GetTableName(tableName, schema);
431-
var sql = "SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS"
432-
+ " WHERE TABLE_NAME = @tableName AND COLUMN_NAME = @columnName AND TABLE_SCHEMA = @schema"
433-
.SqlFmt(GetTableName(tableName, schema).StripDbQuotes(), columnName);
440+
tableName = GetTableName(tableName, schema);
441+
var sql = "SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS"
442+
+ " WHERE TABLE_NAME = @tableName AND COLUMN_NAME = @columnName AND TABLE_SCHEMA = @schema"
443+
.SqlFmt(GetTableName(tableName, schema).StripDbQuotes(), columnName);
444+
445+
var result = db.SqlScalar<long>(sql, new { tableName, columnName, schema = db.Database });
446+
447+
return result > 0;
448+
}
449+
450+
public override async Task<bool> DoesColumnExistAsync(IDbConnection db, string columnName, string tableName, string schema = null, CancellationToken token=default)
451+
{
452+
tableName = GetTableName(tableName, schema);
453+
var sql = "SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS"
454+
+ " WHERE TABLE_NAME = @tableName AND COLUMN_NAME = @columnName AND TABLE_SCHEMA = @schema"
455+
.SqlFmt(GetTableName(tableName, schema).StripDbQuotes(), columnName);
434456

435-
var result = db.SqlScalar<long>(sql, new { tableName, columnName, schema = db.Database });
457+
var result = await db.SqlScalarAsync<long>(sql, new { tableName, columnName, schema = db.Database }, token);
436458

437-
return result > 0;
459+
return result > 0;
438460
}
439461

440462
public override string ToCreateTableStatement(Type tableType)

src/ServiceStack.OrmLite.PostgreSQL/PostgreSQLDialectProvider.cs

Lines changed: 46 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -411,6 +411,20 @@ public override string ToTableNamesWithRowCountsStatement(bool live, string sche
411411
}
412412

413413
public override bool DoesTableExist(IDbCommand dbCmd, string tableName, string schema = null)
414+
{
415+
var sql = DoesTableExistSql(dbCmd, tableName, schema);
416+
var result = dbCmd.ExecLongScalar(sql);
417+
return result > 0;
418+
}
419+
420+
public override async Task<bool> DoesTableExistAsync(IDbCommand dbCmd, string tableName, string schema = null, CancellationToken token=default)
421+
{
422+
var sql = DoesTableExistSql(dbCmd, tableName, schema);
423+
var result = await dbCmd.ExecLongScalarAsync(sql, token);
424+
return result > 0;
425+
}
426+
427+
private string DoesTableExistSql(IDbCommand dbCmd, string tableName, string schema)
414428
{
415429
var sql = !Normalize || ReservedWords.Contains(tableName)
416430
? "SELECT COUNT(*) FROM pg_class WHERE relname = {0} AND relkind = 'r'".SqlFmt(tableName)
@@ -424,39 +438,62 @@ public override bool DoesTableExist(IDbCommand dbCmd, string tableName, string s
424438
schema = builder.SearchPath;
425439
if (schema == null)
426440
schema = "public";
427-
441+
428442
// If a search path (schema) is specified, and there is only one, then assume the CREATE TABLE directive should apply to that schema.
429443
if (!string.IsNullOrEmpty(schema) && !schema.Contains(","))
430444
{
431445
sql = !Normalize || ReservedWords.Contains(schema)
432-
? "SELECT COUNT(*) FROM pg_class JOIN pg_catalog.pg_namespace n ON n.oid = pg_class.relnamespace WHERE relname = {0} AND relkind = 'r' AND nspname = {1}".SqlFmt(tableName, schema)
433-
: "SELECT COUNT(*) FROM pg_class JOIN pg_catalog.pg_namespace n ON n.oid = pg_class.relnamespace WHERE lower(relname) = {0} AND relkind = 'r' AND lower(nspname) = {1}".SqlFmt(tableName.ToLower(), schema.ToLower());
446+
? "SELECT COUNT(*) FROM pg_class JOIN pg_catalog.pg_namespace n ON n.oid = pg_class.relnamespace WHERE relname = {0} AND relkind = 'r' AND nspname = {1}"
447+
.SqlFmt(tableName, schema)
448+
: "SELECT COUNT(*) FROM pg_class JOIN pg_catalog.pg_namespace n ON n.oid = pg_class.relnamespace WHERE lower(relname) = {0} AND relkind = 'r' AND lower(nspname) = {1}"
449+
.SqlFmt(tableName.ToLower(), schema.ToLower());
434450
}
435451
}
436452

437-
var result = dbCmd.ExecLongScalar(sql);
438-
439-
return result > 0;
453+
return sql;
440454
}
441-
455+
442456
public override bool DoesSchemaExist(IDbCommand dbCmd, string schemaName)
443457
{
444458
dbCmd.CommandText = $"SELECT EXISTS(SELECT 1 FROM pg_namespace WHERE nspname = '{GetSchemaName(schemaName).SqlParam()}');";
445459
var query = dbCmd.ExecuteScalar();
446460
return query as bool? ?? false;
447461
}
448462

463+
public override async Task<bool> DoesSchemaExistAsync(IDbCommand dbCmd, string schemaName, CancellationToken token = default)
464+
{
465+
dbCmd.CommandText = $"SELECT EXISTS(SELECT 1 FROM pg_namespace WHERE nspname = '{GetSchemaName(schemaName).SqlParam()}');";
466+
var query = await dbCmd.ScalarAsync();
467+
return query as bool? ?? false;
468+
}
469+
449470
public override string ToCreateSchemaStatement(string schemaName)
450471
{
451472
var sql = $"CREATE SCHEMA {GetSchemaName(schemaName)}";
452473
return sql;
453474
}
454475

455476
public override bool DoesColumnExist(IDbConnection db, string columnName, string tableName, string schema = null)
477+
{
478+
var sql = DoesColumnExistSql(columnName, tableName, ref schema);
479+
var result = db.SqlScalar<long>(sql, new { tableName, columnName, schema });
480+
return result > 0;
481+
}
482+
483+
public override async Task<bool> DoesColumnExistAsync(IDbConnection db, string columnName, string tableName, string schema = null,
484+
CancellationToken token = default)
485+
{
486+
var sql = DoesColumnExistSql(columnName, tableName, ref schema);
487+
var result = await db.SqlScalarAsync<long>(sql, new { tableName, columnName, schema }, token);
488+
return result > 0;
489+
}
490+
491+
private string DoesColumnExistSql(string columnName, string tableName, ref string schema)
456492
{
457493
var sql = !Normalize || ReservedWords.Contains(tableName)
458494
? "SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @tableName".SqlFmt(tableName)
459-
: "SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE lower(TABLE_NAME) = @tableName".SqlFmt(tableName.ToLower());
495+
: "SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE lower(TABLE_NAME) = @tableName".SqlFmt(
496+
tableName.ToLower());
460497

461498
sql += !Normalize || ReservedWords.Contains(columnName)
462499
? " AND COLUMN_NAME = @columnName".SqlFmt(columnName)
@@ -472,9 +509,7 @@ public override bool DoesColumnExist(IDbConnection db, string columnName, string
472509
schema = schema.ToLower();
473510
}
474511

475-
var result = db.SqlScalar<long>(sql, new { tableName, columnName, schema });
476-
477-
return result > 0;
512+
return sql;
478513
}
479514

480515
public override string ToExecuteProcedureStatement(object objWithProperties)

src/ServiceStack.OrmLite.SqlServer/SqlServer2012OrmLiteDialectProvider.cs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
using System.Data;
44
using System.Linq;
55
using System.Text;
6+
using System.Threading;
7+
using System.Threading.Tasks;
68
using ServiceStack.DataAnnotations;
79
using ServiceStack.Text;
810

@@ -17,8 +19,17 @@ public override bool DoesSequenceExist(IDbCommand dbCmd, string sequenceName)
1719
var sql = "SELECT CASE WHEN EXISTS (SELECT 1 FROM sys.sequences WHERE object_id=object_id({0})) THEN 1 ELSE 0 END"
1820
.SqlFmt(this, sequenceName);
1921

20-
dbCmd.CommandText = sql;
21-
var result = dbCmd.ExecLongScalar();
22+
var result = dbCmd.ExecLongScalar(sql);
23+
24+
return result == 1;
25+
}
26+
27+
public override async Task<bool> DoesSequenceExistAsync(IDbCommand dbCmd, string sequenceName, CancellationToken token = default)
28+
{
29+
var sql = "SELECT CASE WHEN EXISTS (SELECT 1 FROM sys.sequences WHERE object_id=object_id({0})) THEN 1 ELSE 0 END"
30+
.SqlFmt(this, sequenceName);
31+
32+
var result = await dbCmd.ExecLongScalarAsync(sql, token);
2233

2334
return result == 1;
2435
}

src/ServiceStack.OrmLite.SqlServer/SqlServerOrmLiteDialectProvider.cs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,13 @@ public override bool DoesSchemaExist(IDbCommand dbCmd, string schemaName)
131131
return result > 0;
132132
}
133133

134+
public override async Task<bool> DoesSchemaExistAsync(IDbCommand dbCmd, string schemaName, CancellationToken token = default)
135+
{
136+
var sql = $"SELECT count(*) FROM sys.schemas WHERE name = '{schemaName.SqlParam()}'";
137+
var result = await dbCmd.ExecLongScalarAsync(sql, token);
138+
return result > 0;
139+
}
140+
134141
public override string ToCreateSchemaStatement(string schemaName)
135142
{
136143
var sql = $"CREATE SCHEMA [{GetSchemaName(schemaName)}]";
@@ -152,6 +159,21 @@ public override bool DoesTableExist(IDbCommand dbCmd, string tableName, string s
152159
return result > 0;
153160
}
154161

162+
public override async Task<bool> DoesTableExistAsync(IDbCommand dbCmd, string tableName, string schema = null, CancellationToken token = default)
163+
{
164+
var sql = "SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = {0}"
165+
.SqlFmt(this, tableName);
166+
167+
if (schema != null)
168+
sql += " AND TABLE_SCHEMA = {0}".SqlFmt(this, schema);
169+
else
170+
sql += " AND TABLE_SCHEMA <> 'Security'";
171+
172+
var result = await dbCmd.ExecLongScalarAsync(sql, token);
173+
174+
return result > 0;
175+
}
176+
155177
public override bool DoesColumnExist(IDbConnection db, string columnName, string tableName, string schema = null)
156178
{
157179
var sql = "SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @tableName AND COLUMN_NAME = @columnName"
@@ -165,6 +187,20 @@ public override bool DoesColumnExist(IDbConnection db, string columnName, string
165187
return result > 0;
166188
}
167189

190+
public override async Task<bool> DoesColumnExistAsync(IDbConnection db, string columnName, string tableName, string schema = null,
191+
CancellationToken token = default)
192+
{
193+
var sql = "SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @tableName AND COLUMN_NAME = @columnName"
194+
.SqlFmt(this, tableName, columnName);
195+
196+
if (schema != null)
197+
sql += " AND TABLE_SCHEMA = @schema";
198+
199+
var result = await db.SqlScalarAsync<long>(sql, new { tableName, columnName, schema }, token: token);
200+
201+
return result > 0;
202+
}
203+
168204
public override string GetForeignKeyOnDeleteClause(ForeignKeyConstraint foreignKey)
169205
{
170206
return "RESTRICT" == (foreignKey.OnDelete ?? "").ToUpper()

src/ServiceStack.OrmLite/IOrmLiteDialectProvider.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,12 +180,18 @@ string ToSelectFromProcedureStatement(object fromObjWithProperties,
180180
string ToCreateSequenceStatement(Type tableType, string sequenceName);
181181

182182
List<string> SequenceList(Type tableType);
183+
Task<List<string>> SequenceListAsync(Type tableType, CancellationToken token=default);
183184

184185
bool DoesSchemaExist(IDbCommand dbCmd, string schema);
186+
Task<bool> DoesSchemaExistAsync(IDbCommand dbCmd, string schema, CancellationToken token=default);
185187
bool DoesTableExist(IDbConnection db, string tableName, string schema = null);
188+
Task<bool> DoesTableExistAsync(IDbConnection db, string tableName, string schema = null, CancellationToken token=default);
186189
bool DoesTableExist(IDbCommand dbCmd, string tableName, string schema = null);
190+
Task<bool> DoesTableExistAsync(IDbCommand dbCmd, string tableName, string schema = null, CancellationToken token=default);
187191
bool DoesColumnExist(IDbConnection db, string columnName, string tableName, string schema = null);
192+
Task<bool> DoesColumnExistAsync(IDbConnection db, string columnName, string tableName, string schema = null, CancellationToken token=default);
188193
bool DoesSequenceExist(IDbCommand dbCmd, string sequenceName);
194+
Task<bool> DoesSequenceExistAsync(IDbCommand dbCmd, string sequenceName, CancellationToken token=default);
189195

190196
void DropColumn(IDbConnection db, Type modelType, string columnName);
191197

src/ServiceStack.OrmLite/OrmLiteDialectProviderBase.cs

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1260,6 +1260,11 @@ public virtual string ResolveFragment(string sql)
12601260

12611261
public abstract bool DoesSchemaExist(IDbCommand dbCmd, string schemaName);
12621262

1263+
public virtual Task<bool> DoesSchemaExistAsync(IDbCommand dbCmd, string schema, CancellationToken token = default)
1264+
{
1265+
return DoesSchemaExist(dbCmd, schema).InTask();
1266+
}
1267+
12631268
public virtual string ToCreateTableStatement(Type tableType)
12641269
{
12651270
var sbColumns = StringBuilderCache.Allocate();
@@ -1406,21 +1411,41 @@ public virtual bool DoesTableExist(IDbConnection db, string tableName, string sc
14061411
return db.Exec(dbCmd => DoesTableExist(dbCmd, tableName, schema));
14071412
}
14081413

1414+
public virtual async Task<bool> DoesTableExistAsync(IDbConnection db, string tableName, string schema = null, CancellationToken token = default)
1415+
{
1416+
return await db.Exec(async dbCmd => await DoesTableExistAsync(dbCmd, tableName, schema, token));
1417+
}
1418+
14091419
public virtual bool DoesTableExist(IDbCommand dbCmd, string tableName, string schema = null)
14101420
{
14111421
throw new NotImplementedException();
14121422
}
14131423

1424+
public virtual Task<bool> DoesTableExistAsync(IDbCommand dbCmd, string tableName, string schema = null, CancellationToken token = default)
1425+
{
1426+
return DoesTableExist(dbCmd, tableName, schema).InTask();
1427+
}
1428+
14141429
public virtual bool DoesColumnExist(IDbConnection db, string columnName, string tableName, string schema = null)
14151430
{
14161431
throw new NotImplementedException();
14171432
}
14181433

1434+
public virtual Task<bool> DoesColumnExistAsync(IDbConnection db, string columnName, string tableName, string schema = null, CancellationToken token = default)
1435+
{
1436+
return DoesColumnExist(db, columnName, tableName, schema).InTask();
1437+
}
1438+
14191439
public virtual bool DoesSequenceExist(IDbCommand dbCmd, string sequenceName)
14201440
{
14211441
throw new NotImplementedException();
14221442
}
14231443

1444+
public virtual Task<bool> DoesSequenceExistAsync(IDbCommand dbCmd, string sequenceName, CancellationToken token = default)
1445+
{
1446+
return DoesSequenceExist(dbCmd, sequenceName).InTask();
1447+
}
1448+
14241449
protected virtual string GetIndexName(bool isUnique, string modelName, string fieldName)
14251450
{
14261451
return $"{(isUnique ? "u" : "")}idx_{modelName}_{fieldName}".ToLower();
@@ -1461,10 +1486,9 @@ public virtual string ToCreateSequenceStatement(Type tableType, string sequenceN
14611486
return "";
14621487
}
14631488

1464-
public virtual List<string> SequenceList(Type tableType)
1465-
{
1466-
return new List<string>();
1467-
}
1489+
public virtual List<string> SequenceList(Type tableType) => new List<string>();
1490+
1491+
public virtual Task<List<string>> SequenceListAsync(Type tableType, CancellationToken token = default) => new List<string>().InTask();
14681492

14691493
// TODO : make abstract ??
14701494
public virtual string ToExistStatement(Type fromTableType,

0 commit comments

Comments
 (0)