public override int Update(ITransaction transaction, ClassMapping mapping, DaoCriteria crit, IDictionary<string, object> propValues)
{
// Since the update might change one of the id fields, we can't just overwrite the
// table with new values (since that might be an add). Instead create a temp table,
// put in everything that doesn't match, then put in everything that does after
// modifying it.
DaoCriteria inverseCrit = new DaoCriteria();
foreach (IExpression expr in crit.Expressions)
{
inverseCrit.Expressions.Add(expr.Invert());
}
IDictionary<string, MemoryObject> table = GetTable(mapping);
int retVal = 0;
lock (table)
{
IDictionary<string, MemoryObject> tempTable = new Dictionary<string, MemoryObject>();
// First the unchanged records.
MemoryDataReader reader = new MemoryDataReader(this, mapping, inverseCrit,
table.Values.GetEnumerator());
while (reader.Read())
{
MemoryObject unchanged = reader.GetCurrentObject();
tempTable[unchanged.GetKey()] = unchanged;
}
// Now the changed ones.
reader = new MemoryDataReader(this, mapping, crit, table.Values.GetEnumerator());
while (reader.Read())
{
MemoryObject changed = reader.GetCurrentObject();
// Set the changed values.
foreach (KeyValuePair<string, object> kvp in propValues)
{
changed.ColValues[kvp.Key] = kvp.Value;
}
tempTable[changed.GetKey()] = changed;
retVal++;
}
// Now replace the real table contents with the temp ones.
table.Clear();
foreach (KeyValuePair<string, MemoryObject> kvp in tempTable)
{
table.Add(kvp);
}
}
return retVal;
}