private bool DoWriteTest()
{
// follow tree from each starting node.
bool success = true;
// collection writeable variables that don't change during the test.
List<TestVariable> variables = new List<TestVariable>();
for (int ii = 0; ii < WriteableVariables.Count; ii++)
{
TestVariable test = new TestVariable();
test.Variable = WriteableVariables[ii];
test.DataType = TypeInfo.GetBuiltInType(WriteableVariables[ii].DataType, Session.TypeTree);
test.Values = new List<DataValue>();
variables.Add(test);
}
Log("Starting WriteTest for {0} Nodes", variables.Count);
double increment = MaxProgress/(10*variables.Count);
double position = 0;
WriteValueCollection nodesToWrite = new WriteValueCollection();
for (int ii = 0; success && ii < 10; ii++)
{
int nodes = 0;
int operations = 0;
foreach (TestVariable variable in variables)
{
variable.Values.Clear();
nodes++;
AddWriteValues(variable, nodesToWrite);
// process batch.
if (nodesToWrite.Count > BlockSize/2)
{
operations += nodesToWrite.Count;
if (!Write(nodesToWrite))
{
success = false;
break;
}
if (nodes > (10*variables.Count)/5)
{
Log("Wrote {0} attribute values for {1} nodes.", operations, nodes);
nodes = 0;
operations = 0;
}
nodesToWrite.Clear();
}
position += increment;
ReportProgress(position);
}
// process final batch.
if (success)
{
if (nodesToWrite.Count > 0)
{
operations += nodesToWrite.Count;
if (!Write(nodesToWrite))
{
success = false;
}
else
{
Log("Wrote {0} attribute values for {1} nodes.", operations, nodes);
}
nodesToWrite.Clear();
}
}
}
return success;
}