Skip to content
This repository was archived by the owner on Apr 15, 2025. It is now read-only.

Commit 7c13a54

Browse files
committed
Create and Drop Database support.
Does not work for Oracle and Sqlite. Closes #53
1 parent b4f08de commit 7c13a54

File tree

10 files changed

+171
-12
lines changed

10 files changed

+171
-12
lines changed

‎DataCore.Database.Oracle/OracleTranslator.cs

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
using System;
2-
using System.Collections.Generic;
1+
using System.Collections.Generic;
32
using System.Data;
43
using System.Linq;
54
using System.Text;
@@ -8,6 +7,26 @@ namespace DataCore.Database.Oracle
87
{
98
public class OracleTranslator : Translator
109
{
10+
public override string GetCreateDatabaseQuery(string name)
11+
{
12+
return "SELECT 1 FROM DUAL";
13+
}
14+
15+
public override string GetCreateDatabaseIfNotExistsQuery(string name)
16+
{
17+
return "SELECT 1 FROM DUAL";
18+
}
19+
20+
public override string GetDropDatabaseQuery(string name)
21+
{
22+
return "SELECT 1 FROM DUAL";
23+
}
24+
25+
public override string GetDropDatabaseIfExistsQuery(string name)
26+
{
27+
return "SELECT 1 FROM DUAL";
28+
}
29+
1130
public override void Top<T>(Query<T> query, int count)
1231
{
1332
query.Where("ROWNUM <= " + count);

‎DataCore.Database.Postgres/PostgresTranslator.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,12 @@ namespace DataCore.Database.Postgres
44
{
55
public class PostgresTranslator : Translator
66
{
7+
public override string GetCreateDatabaseIfNotExistsQuery(string name)
8+
{
9+
return string.Concat("DO $do$ BEGIN IF EXISTS(SELECT 1 FROM pg_database WHERE datname = '", name,
10+
"') THEN CREATE DATABASE ", name, "; END IF; END $do$ ");
11+
}
12+
713
public override void Paginate<T>(Query<T> query, int recordsPerPage, int currentPage)
814
{
915
query.SqlEnd = string.Concat("LIMIT ", recordsPerPage, " OFFSET ", (currentPage - 1) * recordsPerPage);

‎DataCore.Database.SqlServer/SqlServerTranslator.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,16 @@ namespace DataCore.Database.SqlServer
77
{
88
public class SqlServerTranslator : Translator
99
{
10+
public override string GetCreateDatabaseIfNotExistsQuery(string name)
11+
{
12+
return string.Concat("IF NOT EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'", name, "') CREATE DATABASE ", name);
13+
}
14+
15+
public override string GetDropDatabaseIfExistsQuery(string name)
16+
{
17+
return string.Concat("IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'", name, "') DROP DATABASE ", name);
18+
}
19+
1020
public override void Top<T>(Query<T> query, int count)
1121
{
1222
query.SqlSelectFormat = string.Concat("TOP (", count, ") {0}");

‎DataCore.Database.Sqlite/SqliteTranslator.cs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,38 @@ protected override string GetSelectTableName(string tableName)
77
return tableName;
88
}
99

10+
/// <summary>
11+
/// SQLite does NOT support this method.
12+
/// </summary>
13+
public override string GetCreateDatabaseQuery(string name)
14+
{
15+
return "SELECT 1";
16+
}
17+
18+
/// <summary>
19+
/// SQLite does NOT support this method.
20+
/// </summary>
21+
public override string GetCreateDatabaseIfNotExistsQuery(string name)
22+
{
23+
return "SELECT 1";
24+
}
25+
26+
/// <summary>
27+
/// SQLite does NOT support this method.
28+
/// </summary>
29+
public override string GetDropDatabaseQuery(string name)
30+
{
31+
return "SELECT 1";
32+
}
33+
34+
/// <summary>
35+
/// SQLite does NOT support this method.
36+
/// </summary>
37+
public override string GetDropDatabaseIfExistsQuery(string name)
38+
{
39+
return "SELECT 1";
40+
}
41+
1042
/// <summary>
1143
/// SQLite does NOT support this method.
1244
/// </summary>

‎DataCore.Database/Database.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,34 @@ public void DeleteById<T>(params object[] ids)
155155
Execute(query, parameters);
156156
}
157157

158+
public int CreateDatabase(string name)
159+
{
160+
var query = Translator.GetCreateDatabaseQuery(name);
161+
162+
return Execute(query);
163+
}
164+
165+
public int CreateDatabaseIfNotExists(string name)
166+
{
167+
var query = Translator.GetCreateDatabaseIfNotExistsQuery(name);
168+
169+
return Execute(query);
170+
}
171+
172+
public int DropDatabase(string name)
173+
{
174+
var query = Translator.GetDropDatabaseQuery(name);
175+
176+
return Execute(query);
177+
}
178+
179+
public int DropDatabaseIfExists(string name)
180+
{
181+
var query = Translator.GetDropDatabaseIfExistsQuery(name);
182+
183+
return Execute(query);
184+
}
185+
158186
public int CreateTable<T>(bool createReferences = false)
159187
{
160188
return CreateTable(typeof(T), createReferences);

‎DataCore.Database/IDatabase.cs

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,14 @@ public interface IDatabase
88
{
99
ITranslator Translator { get; }
1010

11-
void Delete<T>(Expression<Func<T, bool>> whereClause);
12-
void DeleteById<T>(object id);
13-
void DeleteById<T>(params object[] ids);
14-
11+
int Execute(string query);
12+
IEnumerable<T> Execute<T>(string query);
13+
14+
int CreateDatabase(string name);
15+
int CreateDatabaseIfNotExists(string name);
16+
int DropDatabase(string name);
17+
int DropDatabaseIfExists(string name);
18+
1519
int CreateTable<T>(bool createReferences = false);
1620
int CreateTable(Type table, bool createReferences = false);
1721
int CreateTables(params Type[] tables);
@@ -48,20 +52,28 @@ public interface IDatabase
4852
int DropForeignKey<T>(string indexName);
4953
int DropForeignKeyIfExists<T>(string indexName);
5054

51-
int Execute(string query);
52-
IEnumerable<T> Execute<T>(string query);
55+
void Insert<T>(T obj);
56+
57+
void Update<T>(T obj, Expression<Func<T, dynamic>> whereClause);
58+
void UpdateOnly<T>(T obj, Expression<Func<T, dynamic>> onlyFields, Expression<Func<T, dynamic>> whereClause);
59+
60+
void Delete<T>(Expression<Func<T, bool>> whereClause);
61+
void DeleteById<T>(object id);
62+
void DeleteById<T>(params object[] ids);
63+
64+
Query<T> From<T>();
65+
5366
bool Exists<T>(Query<T> query);
5467
bool Exists<T>(Expression<Func<T, bool>> clause);
55-
Query<T> From<T>();
56-
void Insert<T>(T obj);
68+
5769
IEnumerable<T> Select<T>(Query<T> query);
5870
IEnumerable<TOther> Select<TOther>(IQuery query);
5971
IEnumerable<T> Select<T>(Expression<Func<T, bool>> clause);
72+
6073
T SelectSingle<T>(Query<T> query);
6174
T SelectSingle<T>(Expression<Func<T, bool>> clause);
75+
6276
T SelectById<T>(object id);
6377
IEnumerable<T> SelectById<T>(params object[] ids);
64-
void Update<T>(T obj, Expression<Func<T, dynamic>> whereClause);
65-
void UpdateOnly<T>(T obj, Expression<Func<T, dynamic>> onlyFields, Expression<Func<T, dynamic>> whereClause);
6678
}
6779
}

‎DataCore.Test/DatabaseCheckedTest.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,20 @@ namespace DataCore.Test
88
[TestFixture]
99
public class DatabaseCheckedTest
1010
{
11+
[Test, TestCaseSource(typeof(SqlTestDataFactory), nameof(SqlTestDataFactory.TestCases))]
12+
public void CanCreateAndDropDatabase(TestHelper.DatabaseType dbType, string connectionString)
13+
{
14+
using (var connection = TestHelper.GetConnectionFor(dbType, connectionString))
15+
{
16+
var db = TestHelper.GetDatabaseFor(dbType, connection);
17+
18+
db.DropDatabaseIfExists("test_db");
19+
db.CreateDatabaseIfNotExists("test_db");
20+
db.CreateDatabaseIfNotExists("test_db");
21+
db.DropDatabaseIfExists("test_db");
22+
}
23+
}
24+
1125
[Test, TestCaseSource(typeof(SqlTestDataFactory), nameof(SqlTestDataFactory.TestCases))]
1226
public void CanCreateTable(TestHelper.DatabaseType dbType, string connectionString)
1327
{

‎DataCore.Test/DatabaseTest.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,19 @@ namespace DataCore.Test
88
[TestFixture]
99
public class DatabaseTest
1010
{
11+
[Test, TestCaseSource(typeof(SqlTestDataFactory), nameof(SqlTestDataFactory.TestCases))]
12+
public void CanCreateAndDropDatabase(TestHelper.DatabaseType dbType, string connectionString)
13+
{
14+
using (var connection = TestHelper.GetConnectionFor(dbType, connectionString))
15+
{
16+
var db = TestHelper.GetDatabaseFor(dbType, connection);
17+
18+
db.DropDatabaseIfExists("test_db");
19+
db.CreateDatabase("test_db");
20+
db.DropDatabase("test_db");
21+
}
22+
}
23+
1124
[Test, TestCaseSource(typeof(SqlTestDataFactory), nameof(SqlTestDataFactory.TestCases))]
1225
public void CanCreateTable(TestHelper.DatabaseType dbType, string connectionString)
1326
{

‎DataCore/ITranslator.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@ namespace DataCore
55
{
66
public interface ITranslator
77
{
8+
string GetCreateDatabaseQuery(string name);
9+
string GetCreateDatabaseIfNotExistsQuery(string name);
10+
string GetDropDatabaseQuery(string name);
11+
string GetDropDatabaseIfExistsQuery(string name);
12+
813
void Top<T>(Query<T> query, int count);
914
void Count<T>(Query<T> query);
1015
void Paginate<T>(Query<T> query, int recordsPerPage, int currentPage);

‎DataCore/Translator.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,26 @@ namespace DataCore
99
{
1010
public class Translator : ITranslator
1111
{
12+
public virtual string GetCreateDatabaseQuery(string name)
13+
{
14+
return string.Concat("CREATE DATABASE ", name);
15+
}
16+
17+
public virtual string GetCreateDatabaseIfNotExistsQuery(string name)
18+
{
19+
return string.Concat("CREATE DATABASE IF NOT EXISTS ", name);
20+
}
21+
22+
public virtual string GetDropDatabaseQuery(string name)
23+
{
24+
return string.Concat("DROP DATABASE ", name);
25+
}
26+
27+
public virtual string GetDropDatabaseIfExistsQuery(string name)
28+
{
29+
return string.Concat("DROP DATABASE IF EXISTS ", name);
30+
}
31+
1232
public virtual void Top<T>(Query<T> query, int count)
1333
{
1434
query.SqlEnd = string.Concat("LIMIT ", count);

0 commit comments

Comments
 (0)