github.com/walkingsparrow/docker@v1.4.2-0.20151218153551-b708a2249bfa/layer/ro_layer.go (about)

     1  package layer
     2  
     3  import "io"
     4  
     5  type roLayer struct {
     6  	chainID    ChainID
     7  	diffID     DiffID
     8  	parent     *roLayer
     9  	cacheID    string
    10  	size       int64
    11  	layerStore *layerStore
    12  
    13  	referenceCount int
    14  	references     map[Layer]struct{}
    15  }
    16  
    17  func (rl *roLayer) TarStream() (io.ReadCloser, error) {
    18  	r, err := rl.layerStore.store.TarSplitReader(rl.chainID)
    19  	if err != nil {
    20  		return nil, err
    21  	}
    22  
    23  	return rl.layerStore.assembleTar(rl.cacheID, r, nil)
    24  }
    25  
    26  func (rl *roLayer) ChainID() ChainID {
    27  	return rl.chainID
    28  }
    29  
    30  func (rl *roLayer) DiffID() DiffID {
    31  	return rl.diffID
    32  }
    33  
    34  func (rl *roLayer) Parent() Layer {
    35  	if rl.parent == nil {
    36  		return nil
    37  	}
    38  	return rl.parent
    39  }
    40  
    41  func (rl *roLayer) Size() (size int64, err error) {
    42  	if rl.parent != nil {
    43  		size, err = rl.parent.Size()
    44  		if err != nil {
    45  			return
    46  		}
    47  	}
    48  
    49  	return size + rl.size, nil
    50  }
    51  
    52  func (rl *roLayer) DiffSize() (size int64, err error) {
    53  	return rl.size, nil
    54  }
    55  
    56  func (rl *roLayer) Metadata() (map[string]string, error) {
    57  	return rl.layerStore.driver.GetMetadata(rl.cacheID)
    58  }
    59  
    60  type referencedCacheLayer struct {
    61  	*roLayer
    62  }
    63  
    64  func (rl *roLayer) getReference() Layer {
    65  	ref := &referencedCacheLayer{
    66  		roLayer: rl,
    67  	}
    68  	rl.references[ref] = struct{}{}
    69  
    70  	return ref
    71  }
    72  
    73  func (rl *roLayer) hasReference(ref Layer) bool {
    74  	_, ok := rl.references[ref]
    75  	return ok
    76  }
    77  
    78  func (rl *roLayer) hasReferences() bool {
    79  	return len(rl.references) > 0
    80  }
    81  
    82  func (rl *roLayer) deleteReference(ref Layer) {
    83  	delete(rl.references, ref)
    84  }
    85  
    86  func (rl *roLayer) depth() int {
    87  	if rl.parent == nil {
    88  		return 1
    89  	}
    90  	return rl.parent.depth() + 1
    91  }
    92  
    93  func storeLayer(tx MetadataTransaction, layer *roLayer) error {
    94  	if err := tx.SetDiffID(layer.diffID); err != nil {
    95  		return err
    96  	}
    97  	if err := tx.SetSize(layer.size); err != nil {
    98  		return err
    99  	}
   100  	if err := tx.SetCacheID(layer.cacheID); err != nil {
   101  		return err
   102  	}
   103  	if layer.parent != nil {
   104  		if err := tx.SetParent(layer.parent.chainID); err != nil {
   105  			return err
   106  		}
   107  	}
   108  
   109  	return nil
   110  }