From f55aa63024acbf32815504d5c3105c639dc7846a Mon Sep 17 00:00:00 2001 From: nathanbaker Date: Thu, 29 Jun 2017 12:02:25 +1000 Subject: [PATCH 1/6] Create TeradataProvider.cs Adding support for Teradata --- PetaPoco/Providers/TeradataProvider.cs | 53 ++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 PetaPoco/Providers/TeradataProvider.cs diff --git a/PetaPoco/Providers/TeradataProvider.cs b/PetaPoco/Providers/TeradataProvider.cs new file mode 100644 index 00000000..f8afd6be --- /dev/null +++ b/PetaPoco/Providers/TeradataProvider.cs @@ -0,0 +1,53 @@ +using System; +using System.Data; +using System.Data.Common; +using PetaPoco.Core; +using PetaPoco.Internal; +using PetaPoco.Utilities; + +namespace PetaPoco.Providers +{ + public class TeradataDatabaseProvider : DatabaseProvider + { + public override DbProviderFactory GetFactory() + { + return DbProviderFactories.GetFactory("Teradata.Client.Provider"); + } + + private static readonly Regex simpleRegexOrderBy = new Regex(@"\bORDER\s+BY\s+", RegexOptions.RightToLeft | RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.Singleline | RegexOptions.Compiled); + + public override string BuildPageQuery(long skip, long take, SQLParts parts, ref object[] args) + { + var helper = (PagingHelper)PagingUtility; + // when the query does not contain an "order by", it is very slow + if (simpleRegexOrderBy.IsMatch(parts.SqlSelectRemoved)) + { + parts.SqlSelectRemoved = helper.RegexOrderBy.Replace(parts.SqlSelectRemoved, "", 1); + } + if (helper.RegexDistinct.IsMatch(parts.SqlSelectRemoved)) + { + parts.SqlSelectRemoved = "peta_inner.* FROM (SELECT " + parts.SqlSelectRemoved + ") peta_inner"; + } + var sqlPage = string.Format("SELECT * FROM (SELECT ROW_NUMBER() OVER ({0}) peta_rn, {1}) peta_paged WHERE peta_rn > @{2} AND peta_rn <= @{3}", parts.SqlOrderBy ?? "ORDER BY (SELECT NULL)", parts.SqlSelectRemoved, args.Length, args.Length + 1); + args = args.Concat(new object[] { skip, skip + take }).ToArray(); + return sqlPage; + } + + public override object ExecuteInsert(Database db, System.Data.IDbCommand cmd, string primaryKeyName) + { + return db.ExecuteScalarHelper(cmd); + } + + public override string GetExistsSql() + { + return "IF EXISTS (SELECT 1 FROM {0} WHERE {1}) SELECT 1 ELSE SELECT 0"; + } + + public override string GetInsertOutputClause(string primaryKeyName) + { + return String.Format(" OUTPUT INSERTED.[{0}]", primaryKeyName); + } + } + + +} From ea3f221334fabc222195bb7ad99349392f018155 Mon Sep 17 00:00:00 2001 From: nathanbaker Date: Thu, 29 Jun 2017 15:26:40 +1000 Subject: [PATCH 2/6] Update DatabaseProvider.cs changes to resolve teradata provider --- PetaPoco/Core/DatabaseProvider.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/PetaPoco/Core/DatabaseProvider.cs b/PetaPoco/Core/DatabaseProvider.cs index ef175143..de9bc221 100644 --- a/PetaPoco/Core/DatabaseProvider.cs +++ b/PetaPoco/Core/DatabaseProvider.cs @@ -209,6 +209,8 @@ internal static IProvider Resolve(Type type, bool allowDefault, string connectio return Singleton.Instance; if (typeName.StartsWith("FbConnection") || typeName.EndsWith("FirebirdClientFactory")) return Singleton.Instance; + if (typeName.StartsWith("Teradata")) + return Singleton.Instance; if (typeName.IndexOf("OleDb", StringComparison.InvariantCultureIgnoreCase) >= 0 && (connectionString.IndexOf("Jet.OLEDB", StringComparison.InvariantCultureIgnoreCase) > 0 || connectionString.IndexOf("ACE.OLEDB", StringComparison.InvariantCultureIgnoreCase) > 0)) { @@ -248,6 +250,8 @@ internal static IProvider Resolve(string providerName, bool allowDefault, string if (providerName.IndexOf("Firebird", StringComparison.InvariantCultureIgnoreCase) >= 0 || providerName.IndexOf("FbConnection", StringComparison.InvariantCultureIgnoreCase) >= 0) return Singleton.Instance; + if (providerName.IndexOf("Teradata", StringComparison.InvariantCultureIgnoreCase) >= 0) + return Singleton.Instance; if (providerName.IndexOf("OleDb", StringComparison.InvariantCultureIgnoreCase) >= 0 && (connectionString.IndexOf("Jet.OLEDB", StringComparison.InvariantCultureIgnoreCase) > 0 || connectionString.IndexOf("ACE.OLEDB", StringComparison.InvariantCultureIgnoreCase) > 0)) { @@ -280,4 +284,4 @@ internal static DbProviderFactory Unwrap(DbProviderFactory factory) return unwrapped == null ? factory : Unwrap(unwrapped); } } -} \ No newline at end of file +} From 7254fc7845a8d4a557c4b8b6910914615ce0e3e8 Mon Sep 17 00:00:00 2001 From: nathanbaker Date: Thu, 29 Jun 2017 15:37:53 +1000 Subject: [PATCH 3/6] Update PetaPoco.csproj added reference to TeradataProvider.cs to project file --- PetaPoco/PetaPoco.csproj | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/PetaPoco/PetaPoco.csproj b/PetaPoco/PetaPoco.csproj index a5455363..c91071a7 100644 --- a/PetaPoco/PetaPoco.csproj +++ b/PetaPoco/PetaPoco.csproj @@ -79,6 +79,7 @@ + @@ -134,4 +135,4 @@ --> - \ No newline at end of file + From 6d3416fe9c5ea4d2df9c3cc61f316731a9631b91 Mon Sep 17 00:00:00 2001 From: nathanbaker Date: Thu, 29 Jun 2017 15:40:40 +1000 Subject: [PATCH 4/6] Update TeradataProvider.cs added regex reference --- PetaPoco/Providers/TeradataProvider.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/PetaPoco/Providers/TeradataProvider.cs b/PetaPoco/Providers/TeradataProvider.cs index f8afd6be..5e8f721c 100644 --- a/PetaPoco/Providers/TeradataProvider.cs +++ b/PetaPoco/Providers/TeradataProvider.cs @@ -4,6 +4,7 @@ using PetaPoco.Core; using PetaPoco.Internal; using PetaPoco.Utilities; +using System.Text.RegularExpressions; namespace PetaPoco.Providers { From a03bb1eb68b785f2ac3c841840f858a955925f63 Mon Sep 17 00:00:00 2001 From: nathanbaker Date: Thu, 29 Jun 2017 15:42:43 +1000 Subject: [PATCH 5/6] Update TeradataProvider.cs added collection libraries --- PetaPoco/Providers/TeradataProvider.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/PetaPoco/Providers/TeradataProvider.cs b/PetaPoco/Providers/TeradataProvider.cs index 5e8f721c..7f7ce335 100644 --- a/PetaPoco/Providers/TeradataProvider.cs +++ b/PetaPoco/Providers/TeradataProvider.cs @@ -5,6 +5,8 @@ using PetaPoco.Internal; using PetaPoco.Utilities; using System.Text.RegularExpressions; +using System.Collections; +using System.Collections.Generic; namespace PetaPoco.Providers { From 9158bdd34f68fb615970094dfa39d230c1d9eec5 Mon Sep 17 00:00:00 2001 From: nathanbaker Date: Thu, 29 Jun 2017 15:46:36 +1000 Subject: [PATCH 6/6] Update TeradataProvider.cs added linq reference --- PetaPoco/Providers/TeradataProvider.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/PetaPoco/Providers/TeradataProvider.cs b/PetaPoco/Providers/TeradataProvider.cs index 7f7ce335..48e5f66e 100644 --- a/PetaPoco/Providers/TeradataProvider.cs +++ b/PetaPoco/Providers/TeradataProvider.cs @@ -5,8 +5,7 @@ using PetaPoco.Internal; using PetaPoco.Utilities; using System.Text.RegularExpressions; -using System.Collections; -using System.Collections.Generic; +using System.Linq; namespace PetaPoco.Providers {