gitee.com/zhongguo168a/gocodes@v0.0.0-20230609140523-e1828349603f/datax/versionx/cachez-source.go (about)

     1  package versionx
     2  
     3  import (
     4  	"gitee.com/zhongguo168a/gocodes/datax"
     5  	"gitee.com/zhongguo168a/gocodes/datax/mapx"
     6  )
     7  
     8  func NewSource() *Source {
     9  	return &Source{
    10  		enableVersion: false,
    11  		origin:        datax.M{},
    12  		versions:      map[string]int{},
    13  	}
    14  }
    15  
    16  func NewSourceWith(origin datax.M) *Source {
    17  	return &Source{
    18  		enableVersion: false,
    19  		origin:        origin,
    20  		versions:      map[string]int{},
    21  	}
    22  }
    23  
    24  type Source struct {
    25  	// 数据
    26  	origin datax.M
    27  	// 版本信息
    28  	versions map[string]int
    29  	// 最后的版本号
    30  	lastVersion int
    31  	// 开启版本记录
    32  	enableVersion bool
    33  	//
    34  	removed bool
    35  	//
    36  	onChange func(path, field string, val interface{})
    37  }
    38  
    39  func (s *Source) RefReset(val map[string]interface{}) {
    40  	s.origin = val
    41  	s.versions = map[string]int{}
    42  	s.lastVersion = 0
    43  	s.removed = false
    44  }
    45  
    46  func (s *Source) WithVersion() *Source {
    47  	s.enableVersion = true
    48  	s.versions = map[string]int{}
    49  	return s
    50  }
    51  
    52  func (s *Source) RefIsRemove() bool {
    53  	return s.removed
    54  }
    55  
    56  func (s *Source) Clone() (r *Source) {
    57  	r = &Source{}
    58  	r.origin = mapx.CloneMap(s.origin)
    59  	if s.enableVersion {
    60  		r.versions = map[string]int{}
    61  		for key, val := range s.versions {
    62  			r.versions[key] = val
    63  		}
    64  		r.lastVersion = s.lastVersion
    65  	}
    66  
    67  	return
    68  }
    69  
    70  func (s *Source) Dispose() {
    71  	s.origin = nil
    72  	s.versions = nil
    73  }
    74  
    75  func (s *Source) RefRemove() {
    76  	s.removed = true
    77  }
    78  
    79  // 实例最后更新的版本号
    80  func (s *Source) RefLastVersion() int {
    81  	return s.lastVersion
    82  }
    83  
    84  // 实例的版本信息
    85  func (s *Source) RefVersions() (r map[string]int) {
    86  	r = s.versions
    87  	return
    88  }
    89  
    90  // 版本更新完成
    91  func (s *Source) RefVersionComplete() {
    92  	s.lastVersion++
    93  }
    94  
    95  // 重置版本号, 所有字段都发生变化
    96  func (s *Source) KeyVersionReset() {
    97  	s.lastVersion = -1
    98  }
    99  
   100  // 增加字段的版本
   101  func (s *Source) KeyVersionNew(parents []string, path string) {
   102  	for _, val := range parents {
   103  		s.versions[val] = s.lastVersion + 1
   104  	}
   105  	s.versions[path] = s.lastVersion + 1
   106  }