Skip to content

Commit d06c787

Browse files
authored
Merge pull request #1315 from mikependon/saphana-support
SAP HANA Support #1244
2 parents 55690f6 + 172e63c commit d06c787

16 files changed

Lines changed: 945 additions & 671 deletions

File tree

PACKAGES.md

Lines changed: 21 additions & 21 deletions
Large diffs are not rendered by default.

README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,14 +53,14 @@ RepoDB is evolving from an ORM into a broader data productivity platform, with D
5353
Choose your database and follow the quick-start guide:
5454

5555
- [ClickHouse](http://repodb.net/tutorial/get-started-clickhouse)
56-
- [Db2](http://repodb.net/tutorial/get-started-db2)
56+
- [DB2](http://repodb.net/tutorial/get-started-db2)
5757
- [EnterpriseDB](http://repodb.net/tutorial/get-started-enterprisedb)
5858
- [Firebird](http://repodb.net/tutorial/get-started-firebird)
5959
- [MariaDB](http://repodb.net/tutorial/get-started-mariadb)
6060
- [MySQL](http://repodb.net/tutorial/get-started-mysql)
6161
- [Oracle](http://repodb.net/tutorial/get-started-oracle)
6262
- [PostgreSQL](http://repodb.net/tutorial/get-started-postgresql)
63-
- [SAP Hana](http://repodb.net/tutorial/get-started-saphana)
63+
- [SAP HANA](http://repodb.net/tutorial/get-started-saphana)
6464
- [SQL Server](http://repodb.net/tutorial/get-started-sqlserver)
6565
- [SQLite](http://repodb.net/tutorial/get-started-sqlite)
6666
- [Vertica](http://repodb.net/tutorial/get-started-vertica)
@@ -92,15 +92,15 @@ Every supported database has a dedicated bulk-operations add-on (`BulkInsert`, `
9292
| DB Provider | Sync | Async | Class |
9393
|---|---|---|---|
9494
| [ClickHouse](https://www.nuget.org/packages/RepoDb.ClickHouse.BulkOperations) ||| [ClickHouseBulkCopy](https://github.com/mikependon/RepoDb/blob/master/src/Providers/RepoDb.ClickHouse.BulkOperations/RepoDb.ClickHouse.BulkOperations/ClickHouseBulkCopy.cs) |
95-
| [Db2](https://www.nuget.org/packages/RepoDb.Db2.BulkOperations) ||| [DB2BulkCopy](https://github.com/mikependon/RepoDb/blob/master/src/Providers/RepoDb.Db2.BulkOperations/RepoDb.Db2.BulkOperations/Base/WriteToServer.cs) Native (Sync) / [Db2BulkArrayBinder](https://github.com/mikependon/RepoDb/blob/master/src/Providers/RepoDb.Db2.BulkOperations/RepoDb.Db2.BulkOperations/Db2BulkArrayBinder.cs) (Async) |
95+
| [DB2](https://www.nuget.org/packages/RepoDb.Db2.BulkOperations) ||| [DB2BulkCopy](https://github.com/mikependon/RepoDb/blob/master/src/Providers/RepoDb.Db2.BulkOperations/RepoDb.Db2.BulkOperations/Base/WriteToServer.cs) Native (Sync) / [Db2BulkArrayBinder](https://github.com/mikependon/RepoDb/blob/master/src/Providers/RepoDb.Db2.BulkOperations/RepoDb.Db2.BulkOperations/Db2BulkArrayBinder.cs) (Async) |
9696
| [Firebird](https://www.nuget.org/packages/RepoDb.Firebird.BulkOperations) ||| [FirebirdCommandBatcher](https://github.com/mikependon/RepoDb/blob/master/src/Providers/RepoDb.Firebird.BulkOperations/RepoDb.Firebird.BulkOperations/FirebirdCommandBatcher.cs) (via **`FbBatchCommand`**) |
9797
| [MariaDB](https://www.nuget.org/packages/RepoDb.MariaDb.BulkOperations) ||| [MariaDbBulkCopy](https://github.com/mikependon/RepoDb/blob/master/src/Providers/RepoDb.MariaDb.BulkOperations/RepoDb.MariaDb.BulkOperations/MariaDbBulkCopy.cs) (via **[RepoDb.Connector.MariaDb](https://www.nuget.org/packages/RepoDb.Connector.MariaDb)**) |
9898
| [MariaDB Connector](https://www.nuget.org/packages/RepoDb.MariaDbConnector.BulkOperations) ||| [MariaDbBulkCopy](https://github.com/mikependon/RepoDB.Connectors/blob/main/src/RepoDb.Connector.MariaDbConnector/RepoDb.Connector.MariaDbConnector/Bulk/MariaDbBulkCopy.cs) (via **[RepoDb.Connector.MariaDbConnector](https://www.nuget.org/packages/RepoDb.Connector.MariaDbConnector)**) |
9999
| [MySQL](https://www.nuget.org/packages/RepoDb.MySql.BulkOperations) ||| [MySqlBulkCopy](https://github.com/mikependon/RepoDb/blob/master/src/Providers/RepoDb.MySql.BulkOperations/RepoDb.MySql.BulkOperations/MySqlBulkCopy.cs) (via [MySqlBulkLoader](https://www.nuget.org/packages/MySql.Data)) |
100100
| [MySQL Connector](https://www.nuget.org/packages/RepoDb.MySqlConnector.BulkOperations) ||| [MySqlConnectorBulkCopy](https://github.com/mikependon/RepoDb/blob/master/src/Providers/RepoDb.MySqlConnector.BulkOperations/RepoDb.MySqlConnector.BulkOperations/Base/WriteToServer.cs) Native |
101101
| [Oracle](https://www.nuget.org/packages/RepoDb.Oracle.BulkOperations) ||| [OracleBulkCopy](https://github.com/mikependon/RepoDb/blob/master/src/Providers/RepoDb.Oracle.BulkOperations/RepoDb.Oracle.BulkOperations/Base/WriteToServer.cs) Native |
102102
| [PostgreSQL](https://www.nuget.org/packages/RepoDb.PostgreSql.BulkOperations) ||| [NpgsqlBinaryImporter](https://github.com/mikependon/RepoDb/blob/master/src/Providers/RepoDb.PostgreSql.BulkOperations/RepoDb.PostgreSql.BulkOperations/Base/BinaryImport.cs) Native |
103-
| [SAP Hana](https://www.nuget.org/packages/RepoDb.SapHana.BulkOperations) ||| [SapHanaConnectionExtension](https://github.com/mikependon/RepoDb/blob/master/src/Providers/RepoDb.SapHana.BulkOperations/RepoDb.SapHana.BulkOperations/Base/WriteToServer.cs) (chunked parameterized `INSERT`) |
103+
| [SAP HANA](https://www.nuget.org/packages/RepoDb.SapHana.BulkOperations) ||| [SapHanaConnectionExtension](https://github.com/mikependon/RepoDb/blob/master/src/Providers/RepoDb.SapHana.BulkOperations/RepoDb.SapHana.BulkOperations/Base/WriteToServer.cs) (chunked parameterized `INSERT`) |
104104
| [SQL Server](https://www.nuget.org/packages/RepoDb.SqlServer.BulkOperations) ||| [SqlBulkCopy](https://github.com/mikependon/RepoDb/blob/master/src/Providers/RepoDb.SqlServer.BulkOperations/RepoDb.SqlServer.BulkOperations/Base/WriteToServer.cs) Native |
105105
| [Vertica](https://www.nuget.org/packages/RepoDb.Vertica.BulkOperations) ||| [VerticaBulkCopy](https://github.com/mikependon/RepoDb/blob/master/src/Providers/RepoDb.Vertica.BulkOperations/RepoDb.Vertica.BulkOperations/VerticaBulkCopy.cs) (via **`VerticaCopyStream`**) |
106106

src/Providers/RepoDb.Core/RepoDb/RepoDb.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,5 +66,6 @@
6666
<InternalsVisibleTo Include="RepoDb.ClickHouse.BulkOperations" />
6767
<InternalsVisibleTo Include="RepoDb.Firebird.BulkOperations" />
6868
<InternalsVisibleTo Include="RepoDb.Vertica.BulkOperations" />
69+
<InternalsVisibleTo Include="RepoDb.SapHana.BulkOperations" />
6970
</ItemGroup>
7071
</Project>

src/Providers/RepoDb.SapHana.BulkOperations/RepoDb.SapHana.BulkOperations.IntegrationTests/Helper.cs

Lines changed: 20 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
namespace RepoDb.SapHana.BulkOperations.IntegrationTests
2020
{
2121
/// <summary>
22-
/// A helper class for the integration testing.
22+
///
2323
/// </summary>
2424
public static class Helper
2525
{
@@ -32,12 +32,12 @@ static Helper()
3232
#region Properties
3333

3434
/// <summary>
35-
/// Gets the instance of <see cref="IStatementBuilder"/> object.
35+
///
3636
/// </summary>
3737
public static IStatementBuilder StatementBuilder { get; }
3838

3939
/// <summary>
40-
/// Gets the value of the Epoc date.
40+
///
4141
/// </summary>
4242
public static DateTime EpocDate { get; }
4343

@@ -46,23 +46,19 @@ static Helper()
4646
#region Methods
4747

4848
/// <summary>
49-
/// Returns the current UTC time truncated to microsecond precision - the maximum fractional-seconds
50-
/// precision a MySQL <c>DATETIME(6)</c> column (used for <c>ColumnDateTime2</c>/
51-
/// <c>ColumnDateTime2Mapped</c>) can store. <see cref="DateTime.UtcNow"/> carries tick (100ns)
52-
/// precision; without truncating here, the sub-microsecond remainder would be silently dropped by
53-
/// MySQL on write, and a direct <see cref="DateTime"/> equality assertion between the in-memory
54-
/// value and the value read back from the database would fail.
49+
///
5550
/// </summary>
51+
/// <returns></returns>
5652
private static DateTime UtcNowMicroseconds() =>
5753
new DateTime(DateTime.UtcNow.Ticks / 10 * 10, DateTimeKind.Utc);
5854

5955
/// <summary>
60-
/// Asserts the properties equality of 2 types.
56+
///
6157
/// </summary>
62-
/// <typeparam name="T1">The type of first object.</typeparam>
63-
/// <typeparam name="T2">The type of second object.</typeparam>
64-
/// <param name="t1">The instance of first object.</param>
65-
/// <param name="t2">The instance of second object.</param>
58+
/// <typeparam name="T1"></typeparam>
59+
/// <typeparam name="T2"></typeparam>
60+
/// <param name="t1"></param>
61+
/// <param name="t2"></param>
6662
public static void AssertPropertiesEquality<T1, T2>(T1 t1, T2 t2)
6763
{
6864
var propertiesOfType1 = typeof(T1).GetProperties();
@@ -101,11 +97,10 @@ public static void AssertPropertiesEquality<T1, T2>(T1 t1, T2 t2)
10197
}
10298

10399
/// <summary>
104-
/// Asserts the members equality of 2 object and <see cref="ExpandoObject"/>.
100+
///
105101
/// </summary>
106-
/// <typeparam name="T">The type of first object.</typeparam>
107-
/// <param name="obj">The instance of first object.</param>
108-
/// <param name="expandoObj">The instance of second object.</param>
102+
/// <param name="obj"></param>
103+
/// <param name="expandoObj"></param>
109104
public static void AssertMembersEquality(object obj, object expandoObj)
110105
{
111106
var dictionary = new ExpandoObject() as IDictionary<string, object>;
@@ -117,23 +112,21 @@ public static void AssertMembersEquality(object obj, object expandoObj)
117112
}
118113

119114
/// <summary>
120-
/// Asserts the members equality of 2 object and <see cref="ExpandoObject"/>.
115+
///
121116
/// </summary>
122-
/// <typeparam name="T">The type of first object.</typeparam>
123-
/// <param name="obj">The instance of first object.</param>
124-
/// <param name="expandoObj">The instance of second object.</param>
117+
/// <param name="obj"></param>
118+
/// <param name="expandoObj"></param>
125119
public static void AssertMembersEquality(object obj, ExpandoObject expandoObj)
126120
{
127121
var dictionary = expandoObj as IDictionary<string, object>;
128122
AssertMembersEquality(obj, dictionary);
129123
}
130124

131125
/// <summary>
132-
/// Asserts the members equality of 2 objects.
126+
///
133127
/// </summary>
134-
/// <typeparam name="T">The type of first object.</typeparam>
135-
/// <param name="obj">The instance of first object.</param>
136-
/// <param name="dictionary">The instance of second object.</param>
128+
/// <param name="obj"></param>
129+
/// <param name="dictionary"></param>
137130
public static void AssertMembersEquality(object obj, IDictionary<string, object> dictionary)
138131
{
139132
var properties = obj.GetType().GetProperties();
@@ -275,12 +268,7 @@ public static void UpdateBulkOperationIdentityTable(BulkOperationIdentityTable t
275268
#region BulkOperationNonIdentityTable
276269

277270
/// <summary>
278-
/// Creates test rows for <see cref="BulkOperationNonIdentityTable"/> - a non-identity counterpart
279-
/// of <see cref="BulkOperationIdentityTable"/> whose <c>Id</c> is a plain primary key. Unlike
280-
/// <see cref="CreateBulkOperationIdentityTables"/> (whose <c>hasId</c> value is ignored by an
281-
/// IDENTITY column on insert), the <c>Id</c> assigned here is guaranteed to be the value actually
282-
/// stored - useful for tests that need to build a separate object (anonymous, expando, etc.) that
283-
/// must match an already-inserted row by primary key.
271+
///
284272
/// </summary>
285273
/// <param name="count"></param>
286274
/// <param name="hasId"></param>

src/Providers/RepoDb.SapHana.BulkOperations/RepoDb.SapHana.BulkOperations.IntegrationTests/Models/BulkOperationIdentityTable.cs

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,6 @@
1010

1111
namespace RepoDb.SapHana.BulkOperations.IntegrationTests.Models
1212
{
13-
/// <summary>
14-
/// SapHana has no native BOOLEAN column usable for parameter binding (SapHanaDbType.Boolean is
15-
/// documented as "Not Available in ODP.NET, Managed Driver"), so the SqlServer suite's BIT column
16-
/// is represented here as a NUMBER(1,0)-backed <see cref="byte"/>? instead of bool?. RowGuid is
17-
/// stored as RAW(16) and round-tripped via <c>SapHanaGuidToByteArrayPropertyHandler</c> (registered
18-
/// per-property in Setup/Database.cs), the same pattern used by RepoDb.SapHana.IntegrationTests.
19-
/// </summary>
2013
public class BulkOperationIdentityTable
2114
{
2215
public long Id { get; set; }

src/Providers/RepoDb.SapHana.BulkOperations/RepoDb.SapHana.BulkOperations.IntegrationTests/Models/BulkOperationNonIdentityTable.cs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,6 @@
1010

1111
namespace RepoDb.SapHana.BulkOperations.IntegrationTests.Models
1212
{
13-
/// <summary>
14-
/// Same shape and columns as <see cref="BulkOperationIdentityTable"/>, except <see cref="Id"/> is a
15-
/// plain (non-identity) primary key - the caller's value is stored as-is, rather than being
16-
/// overridden by an SapHana-generated identity/sequence value. Used by tests that need to know a
17-
/// row's <see cref="Id"/> ahead of time (e.g. to build a separate object - anonymous, expando, etc. -
18-
/// that must match an already-inserted row by primary key), since an IDENTITY column's
19-
/// server-generated value can't be predicted or reused for that purpose.
20-
/// </summary>
2113
public class BulkOperationNonIdentityTable
2214
{
2315
public long Id { get; set; }

0 commit comments

Comments
 (0)