示例#1
0
  /* 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.
  }