public void T03_SegmentLayerGetRecordApplicationOrder()
{
// Assure that when records are written more than once, the updates are applied in the correct
// order so we see the proper current data value
LayerManager db = new LayerManager(InitMode.NEW_REGION, "c:\\BENDtst\\6");
{
String[] keys = { "test-1", "test-2", "test-3" };
String[] values = { "a-first", "b-first", "c-first" };
LayerWriteGroup txn = db.newWriteGroup();
for (int i = 0; i < keys.Length; i++) {
txn.setValueParsed(keys[i], values[i]);
}
txn.finish();
db.flushWorkingSegment();
// assure the records we wrote are NOT in the working segment, but ARE in the next layer
for (int i = 0; i < keys.Length; i++) {
RecordKey key = new RecordKey();
key.appendKeyPart(keys[i]);
// look directly in the working segment, they should be **MISSING*
{
RecordUpdate update;
GetStatus status =
db.workingSegment.getRecordUpdate(key, out update);
Assert.AreEqual(GetStatus.MISSING, status, "working segment should be clear");
}
// assure the global query interface finds it
{
RecordData data;
GetStatus status = db.getRecord(key, out data);
Assert.AreEqual(GetStatus.PRESENT, status, "records should be found in layers");
Assert.AreEqual(values[i], data.ReadDataAsString(), "LayerManager.getRecord()");
}
}
}
// now write the same keys again with different values into the working segment
{
String[] keys = { "test-1", "test-2", "test-3" };
String[] values = { "a-second", "b-second", "c-second" };
System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
LayerWriteGroup txn = db.newWriteGroup();
for (int i = 0; i < keys.Length; i++) {
txn.setValueParsed(keys[i], values[i]);
}
txn.finish();
// assure that both the workingsegment and layermanager see the NEW VALUES
for (int i = 0; i < keys.Length; i++) {
RecordKey key = new RecordKey();
key.appendKeyPart(keys[i]);
// look directly in the working segment, they should be the NEW VALUES
{
RecordUpdate update;
GetStatus status =
db.workingSegment.getRecordUpdate(key, out update);
Assert.AreEqual(GetStatus.PRESENT, status, "working segment should have NEW VALUES");
Assert.AreEqual(values[i], enc.GetString(update.data), "SegmentBuilder.getRecordUpdate should see NEW VALUES");
}
// assure the global query interface finds the NEW VALUES
{
RecordData data;
GetStatus status = db.getRecord(key, out data);
Assert.AreEqual(GetStatus.PRESENT, status, "LayerManager should see NEW VALUES");
Assert.AreEqual(values[i], data.ReadDataAsString(), "LayerManager.getRecord() should see NEW VALUES");
}
}
// now flush the working segment (so we have two on-disk layers)
db.flushWorkingSegment();
// assure we still see the NEW VALUES, but that the working segment is empty
for (int i = 0; i < keys.Length; i++) {
RecordKey key = new RecordKey();
key.appendKeyPart(keys[i]);
// look directly in the working segment, they should MISSING
{
RecordUpdate update;
GetStatus status =
db.workingSegment.getRecordUpdate(key, out update);
Assert.AreEqual(GetStatus.MISSING, status, "working segment should have NO values");
}
// assure the global query interface finds the NEW VALUES
{
RecordData data;
GetStatus status = db.getRecord(key, out data);
Assert.AreEqual(GetStatus.PRESENT, status, "LayerManager should see NEW VALUES");
Assert.AreEqual(values[i], data.ReadDataAsString(), "LayerManager.getRecord() should see NEW VALUES");
}
}
}
db.Dispose();
}