blob: d7fa09296b7a37c3aaa75e86c67b7c00ce898e1d [file] [log] [blame]
khenaidoobf6e7bb2018-08-14 22:27:29 -04001/*
2 * Copyright 2018-present Open Networking Foundation
3
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7
8 * http://www.apache.org/licenses/LICENSE-2.0
9
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Stephane Barbariedc5022d2018-11-19 15:21:44 -050016
Stephane Barbarie4a2564d2018-07-26 11:02:58 -040017package model
18
Stephane Barbarie933b09b2019-01-09 11:12:09 -050019import (
20 "github.com/opencord/voltha-go/common/log"
21 "sync"
22)
Stephane Barbariedc5022d2018-11-19 15:21:44 -050023
Stephane Barbarie4a2564d2018-07-26 11:02:58 -040024// TODO: implement weak references or something equivalent
25// TODO: missing proper logging
26
Stephane Barbariedc5022d2018-11-19 15:21:44 -050027// Branch structure is used to classify a collection of transaction based revisions
Stephane Barbarie4a2564d2018-07-26 11:02:58 -040028type Branch struct {
Stephane Barbariedc5022d2018-11-19 15:21:44 -050029 sync.RWMutex
Stephane Barbarie06c4a742018-10-01 11:09:32 -040030 Node *node
Stephane Barbarie4a2564d2018-07-26 11:02:58 -040031 Txid string
Stephane Barbarieec0919b2018-09-05 14:14:29 -040032 Origin Revision
33 Revisions map[string]Revision
34 Latest Revision
Stephane Barbarie4a2564d2018-07-26 11:02:58 -040035}
36
Stephane Barbariedc5022d2018-11-19 15:21:44 -050037// NewBranch creates a new instance of the Branch structure
Stephane Barbarie06c4a742018-10-01 11:09:32 -040038func NewBranch(node *node, txid string, origin Revision, autoPrune bool) *Branch {
Stephane Barbariedc5022d2018-11-19 15:21:44 -050039 b := &Branch{}
40 b.Node = node
41 b.Txid = txid
42 b.Origin = origin
43 b.Revisions = make(map[string]Revision)
44 b.Latest = origin
Stephane Barbarie4a2564d2018-07-26 11:02:58 -040045
Stephane Barbariedc5022d2018-11-19 15:21:44 -050046 return b
Stephane Barbarie4a2564d2018-07-26 11:02:58 -040047}
48
Stephane Barbariedc5022d2018-11-19 15:21:44 -050049// SetLatest assigns the latest revision for this branch
50func (b *Branch) SetLatest(latest Revision) {
51 b.Lock()
52 defer b.Unlock()
53
Stephane Barbarie933b09b2019-01-09 11:12:09 -050054 if b.Latest != nil {
55 log.Debugf("Switching latest from <%s> to <%s>", b.Latest.GetHash(), latest.GetHash())
56 b.Latest.Drop(b.Txid, false)
57 } else {
58 log.Debugf("Switching latest from <NIL> to <%s>", latest.GetHash())
59 }
60
61
Stephane Barbariedc5022d2018-11-19 15:21:44 -050062 b.Latest = latest
Stephane Barbarie4a2564d2018-07-26 11:02:58 -040063}
Stephane Barbariedc5022d2018-11-19 15:21:44 -050064
65// GetLatest retrieves the latest revision of the branch
66func (b *Branch) GetLatest() Revision {
67 b.Lock()
68 defer b.Unlock()
69
70 return b.Latest
Stephane Barbarie4a2564d2018-07-26 11:02:58 -040071}
Stephane Barbariedc5022d2018-11-19 15:21:44 -050072
73// GetOrigin retrieves the original revision of the branch
74func (b *Branch) GetOrigin() Revision {
75 b.Lock()
76 defer b.Unlock()
77
78 return b.Origin
79}
80
81// AddRevision inserts a new revision to the branch
82func (b *Branch) AddRevision(revision Revision) {
83 if revision != nil && b.GetRevision(revision.GetHash()) == nil {
84 b.SetRevision(revision.GetHash(), revision)
85 }
86}
87
88// GetRevision pulls a revision entry at the specified hash
89func (b *Branch) GetRevision(hash string) Revision {
90 b.Lock()
91 defer b.Unlock()
92
93 if revision, ok := b.Revisions[hash]; !ok {
94 return revision
95 }
96
97 return nil
98}
99
100// SetRevision updates a revision entry at the specified hash
101func (b *Branch) SetRevision(hash string, revision Revision) {
102 b.Lock()
103 defer b.Unlock()
104
105 b.Revisions[hash] = revision
Stephane Barbarie4a2564d2018-07-26 11:02:58 -0400106}