Commit d93b0991 authored by David Chell's avatar David Chell

Added FeatureSupport Class to handle variations int DBMS features, used this...

Added FeatureSupport Class to handle variations int DBMS features, used this to implement native array parameters for Postgresql.
parent 71258e75
...@@ -1146,50 +1146,60 @@ public static void PackListParameters(IDbCommand command, string namePrefix, obj ...@@ -1146,50 +1146,60 @@ public static void PackListParameters(IDbCommand command, string namePrefix, obj
if (list != null) if (list != null)
{ {
bool isString = value is IEnumerable<string>; if (FeatureSupport.Get(command.Connection).Arrays)
bool isDbString = value is IEnumerable<DbString>; {
foreach (var item in list) var arrayParm = command.CreateParameter();
{ arrayParm.Value = list;
count++; arrayParm.ParameterName = namePrefix;
var listParam = command.CreateParameter(); command.Parameters.Add(arrayParm);
listParam.ParameterName = namePrefix + count; }
listParam.Value = item ?? DBNull.Value; else
if (isString) {
{ bool isString = value is IEnumerable<string>;
listParam.Size = 4000; bool isDbString = value is IEnumerable<DbString>;
if (item != null && ((string)item).Length > 4000) foreach (var item in list)
{ {
listParam.Size = -1; count++;
} var listParam = command.CreateParameter();
} listParam.ParameterName = namePrefix + count;
if (isDbString && item as DbString != null) listParam.Value = item ?? DBNull.Value;
{ if (isString)
var str = item as DbString; {
str.AddParameter(command, listParam.ParameterName); listParam.Size = 4000;
} if (item != null && ((string) item).Length > 4000)
else {
{ listParam.Size = -1;
command.Parameters.Add(listParam); }
} }
} if (isDbString && item as DbString != null)
{
if (count == 0) var str = item as DbString;
{ str.AddParameter(command, listParam.ParameterName);
command.CommandText = Regex.Replace(command.CommandText, @"[?@:]" + Regex.Escape(namePrefix), "(SELECT NULL WHERE 1 = 0)"); }
} else
else {
{ command.Parameters.Add(listParam);
command.CommandText = Regex.Replace(command.CommandText, @"[?@:]" + Regex.Escape(namePrefix), match => }
{ }
var grp = match.Value;
var sb = new StringBuilder("(").Append(grp).Append(1); if (count == 0)
for (int i = 2; i <= count; i++) {
{ command.CommandText = Regex.Replace(command.CommandText, @"[?@:]" + Regex.Escape(namePrefix), "(SELECT NULL WHERE 1 = 0)");
sb.Append(',').Append(grp).Append(i); }
} else
return sb.Append(')').ToString(); {
}); command.CommandText = Regex.Replace(command.CommandText, @"[?@:]" + Regex.Escape(namePrefix), match =>
} {
var grp = match.Value;
var sb = new StringBuilder("(").Append(grp).Append(1);
for (int i = 2; i <= count; i++)
{
sb.Append(',').Append(grp).Append(i);
}
return sb.Append(')').ToString();
});
}
}
} }
} }
...@@ -2184,4 +2194,34 @@ public void AddParameter(IDbCommand command, string name) ...@@ -2184,4 +2194,34 @@ public void AddParameter(IDbCommand command, string name)
command.Parameters.Add(param); command.Parameters.Add(param);
} }
} }
/// <summary>
/// Handles variances in features per DBMS
/// </summary>
public class FeatureSupport
{
/// <summary>
/// Dictionary of supported features index by connection type name
/// </summary>
private static readonly Dictionary<string, FeatureSupport> FeatureList = new Dictionary<string, FeatureSupport>() {
{"sqlserverconnection", new FeatureSupport { Arrays = false}},
{"npgsqlconnection", new FeatureSupport {Arrays = true}}
};
/// <summary>
/// Gets the featureset based on the passed connection
/// </summary>
public static FeatureSupport Get(IDbConnection connection)
{
string name = connection.GetType().Name.ToLower();
FeatureSupport features;
return FeatureList.TryGetValue(name, out features) ? features : FeatureList.Values.First();
}
/// <summary>
/// True if the db supports array columns e.g. Postgresql
/// </summary>
public bool Arrays { get; set; }
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment