Commit 726af71d authored by Sam's avatar Sam

Merge pull request #25 from greygeek/d93b0991

Update object's key(s) after insert and array parameter support.
parents f97241e5 d93b0991
...@@ -486,7 +486,15 @@ public int Insert(IDbConnection connection, IDbTransaction transaction, int? com ...@@ -486,7 +486,15 @@ public int Insert(IDbConnection connection, IDbTransaction transaction, int? com
//NOTE: would prefer to use IDENT_CURRENT('tablename') or IDENT_SCOPE but these are not available on SQLCE //NOTE: would prefer to use IDENT_CURRENT('tablename') or IDENT_SCOPE but these are not available on SQLCE
var r = connection.Query("select @@IDENTITY id", transaction: transaction, commandTimeout: commandTimeout); var r = connection.Query("select @@IDENTITY id", transaction: transaction, commandTimeout: commandTimeout);
return (int)r.First().id; int id = 0;
foreach (var p in keyProperties)
{
var value = ((IDictionary<string, object>)r.First())[p.Name.ToLower()];
p.SetValue(entityToInsert, value, null);
if (id == 0)
id = Convert.ToInt32(value);
}
return id;
} }
} }
...@@ -497,15 +505,22 @@ public int Insert(IDbConnection connection, IDbTransaction transaction, int? com ...@@ -497,15 +505,22 @@ public int Insert(IDbConnection connection, IDbTransaction transaction, int? com
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
sb.AppendFormat("insert into {0} ({1}) values ({2})", tableName, columnList, parameterList); sb.AppendFormat("insert into {0} ({1}) values ({2})", tableName, columnList, parameterList);
sb.Append(" RETURNING "); // If no primary key then safe to assume a join table with not too much data to return
bool first = true; if (!keyProperties.Any())
foreach(var property in keyProperties) sb.Append(" RETURNING *");
else
{ {
if (!first) sb.Append(" RETURNING ");
sb.Append(", "); bool first = true;
first = false; foreach (var property in keyProperties)
sb.Append(property.Name); {
if (!first)
sb.Append(", ");
first = false;
sb.Append(property.Name);
}
} }
var results = connection.Query(sb.ToString(), entityToInsert, transaction: transaction, commandTimeout: commandTimeout); var results = connection.Query(sb.ToString(), entityToInsert, transaction: transaction, commandTimeout: commandTimeout);
// Return the key by assinging the corresponding property in the object - by product is that it supports compound primary keys // Return the key by assinging the corresponding property in the object - by product is that it supports compound primary keys
......
...@@ -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();
});
}
}
} }
} }
...@@ -2202,4 +2212,34 @@ public void AddParameter(IDbCommand command, string name) ...@@ -2202,4 +2212,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