/* Private methods */ void Commit( CommitStage c ) { SysString.Commit( c ); SysBinary.Commit( c ); SysStringIndex.Commit( c ); SysBinaryIndex.Commit( c ); foreach( G.KeyValuePair<string,Schema> p in SchemaDict ) foreach( G.KeyValuePair<string,TableExpression> q in p.Value.TableDict ) q.Value.Commit( c ); }
/* Private methods */ void RollbackOrCommit() { if ( Rollback ) { Log.Reset(); foreach( G.KeyValuePair<string,Schema> p in SchemaDict ) foreach( G.KeyValuePair<string,TableExpression> q in p.Value.TableDict ) q.Value.Rollback(); Rollback = false; } else { // Save indexes to underlying buffered streams ( can add more Log entries ). SysStringIndex.PrepareToCommit(); SysBinaryIndex.PrepareToCommit(); foreach( G.KeyValuePair<string,Schema> p in SchemaDict ) foreach( G.KeyValuePair<string,TableExpression> q in p.Value.TableDict ) q.Value.PrepareToCommit(); if ( Log.Commit() ) { SysString.Flush(); SysStringIndex.Commit(); SysBinary.Flush(); SysBinaryIndex.Commit(); foreach( G.KeyValuePair<string,Schema> p in SchemaDict ) foreach( G.KeyValuePair<string,TableExpression> q in p.Value.TableDict ) q.Value.Commit(); foreach ( long fileId in DeletedFiles ) { var f = new IO.FileInfo( Name + fileId ); f.Delete(); } Log.Reset(); } } DeletedFiles.Clear(); }
public long EncodeBinary( byte [] data ) { if ( data.Length == 0 ) return 0; // See if it is in SysBinaryIndex var start = new BinaryStart( data ); foreach( IndexFileRecord ixr in SysBinaryIndex.From( start.Compare, false ) ) { if ( Util.Compare( (byte[])(ixr.Col[0]._O), data ) == 0 ) return ixr.Col[0].L; break; } // Save to file. long sid = SysBinary.Length; SysBinary.Position = sid; SysBinaryWriter.WriteBytes( data ); // Insert into the index IndexFileRecord r = new IndexFileRecord( 1 ); r.Col[ 0 ].L = sid + 1; r.Col[ 0 ]._O = data; SysBinaryIndex.Insert( ref r ); return sid + 1; // + 1 because zero means the encoding has not yet been done. }