Put the Time field into persist.Var. persist.TVar is no longer needed,
History() now returns []Var.
This commit is contained in:
		
							parent
							
								
									384de4d02c
								
							
						
					
					
						commit
						ee4657a0ed
					
				| 
						 | 
				
			
			@ -29,7 +29,7 @@ func (v *Var_N) Get(ts ...time.Time) _T {
 | 
			
		|||
	return ptr.Get(ts...).(_T)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (v *Var_N) History() ([]persist.TVar, error) {
 | 
			
		||||
func (v *Var_N) History() ([]persist.Var, error) {
 | 
			
		||||
	ptr := (*persist.Var)(unsafe.Pointer(v))
 | 
			
		||||
	return ptr.History()
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										31
									
								
								persist.go
									
									
									
									
									
								
							
							
						
						
									
										31
									
								
								persist.go
									
									
									
									
									
								
							| 
						 | 
				
			
			@ -23,6 +23,7 @@ import (
 | 
			
		|||
 | 
			
		||||
type Var struct {
 | 
			
		||||
	X interface{}
 | 
			
		||||
	Time time.Time
 | 
			
		||||
	name string
 | 
			
		||||
	opt Option
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -109,10 +110,11 @@ func (p *Var) Save(sync ...bool) {
 | 
			
		|||
func (p *Var) Load(ts ...time.Time) error {
 | 
			
		||||
	var err error
 | 
			
		||||
	var v []byte
 | 
			
		||||
	var t time.Time
 | 
			
		||||
	if len(ts) == 0 {
 | 
			
		||||
		v, err = retrieve(p.name,lastCheckpoint)
 | 
			
		||||
		v, t, err = retrieve(p.name,lastCheckpoint)
 | 
			
		||||
	} else {
 | 
			
		||||
		v, err = retrieve(p.name,ts[0])
 | 
			
		||||
		v, t, err = retrieve(p.name,ts[0])
 | 
			
		||||
	}
 | 
			
		||||
	if err == nil {
 | 
			
		||||
		var p2 Var
 | 
			
		||||
| 
						 | 
				
			
			@ -125,6 +127,7 @@ func (p *Var) Load(ts ...time.Time) error {
 | 
			
		|||
			fmt.Println("Load(): ",err)
 | 
			
		||||
		} else {
 | 
			
		||||
			p.X = p2.X
 | 
			
		||||
			p.Time = t
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		fmt.Println("Load(",p.name,"): type =",reflect.TypeOf(p.X))
 | 
			
		||||
| 
						 | 
				
			
			@ -354,13 +357,8 @@ func writer() {
 | 
			
		|||
	wg.Done()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type TVar struct {
 | 
			
		||||
	Time time.Time
 | 
			
		||||
	Value Var
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p *Var) History() ([]TVar, error) {
 | 
			
		||||
	ret := make([]TVar,0)
 | 
			
		||||
func (p *Var) History() ([]Var, error) {
 | 
			
		||||
	ret := make([]Var,0)
 | 
			
		||||
	wmux.Lock()
 | 
			
		||||
	err := db.View(func(tx *bolt.Tx) error {
 | 
			
		||||
		b := tx.Bucket([]byte(p.name))
 | 
			
		||||
| 
						 | 
				
			
			@ -381,7 +379,8 @@ func (p *Var) History() ([]TVar, error) {
 | 
			
		|||
			}
 | 
			
		||||
			p3 := *p
 | 
			
		||||
			p3.X = p2.X
 | 
			
		||||
			ret = append(ret,TVar{t,p3})
 | 
			
		||||
			p3.Time = t
 | 
			
		||||
			ret = append(ret,p3)
 | 
			
		||||
		}
 | 
			
		||||
		return nil
 | 
			
		||||
	})
 | 
			
		||||
| 
						 | 
				
			
			@ -391,8 +390,9 @@ func (p *Var) History() ([]TVar, error) {
 | 
			
		|||
 | 
			
		||||
// retrieve a variable from the database. If ts is provided, return the first version
 | 
			
		||||
// that is not after ts[0].
 | 
			
		||||
func retrieve(name string, ts ...time.Time) ([]byte, error) {
 | 
			
		||||
func retrieve(name string, ts ...time.Time) ([]byte, time.Time, error) {
 | 
			
		||||
	var ret []byte
 | 
			
		||||
	var t time.Time
 | 
			
		||||
	err := db.View(func(tx *bolt.Tx) error {
 | 
			
		||||
		b := tx.Bucket([]byte(name))
 | 
			
		||||
		if b == nil {
 | 
			
		||||
| 
						 | 
				
			
			@ -400,11 +400,14 @@ func retrieve(name string, ts ...time.Time) ([]byte, error) {
 | 
			
		|||
		}
 | 
			
		||||
		c := b.Cursor()
 | 
			
		||||
		if len(ts) == 0 {
 | 
			
		||||
			_, ret = c.Last()
 | 
			
		||||
			var k []byte
 | 
			
		||||
			k, ret = c.Last()
 | 
			
		||||
			t = tdecode(k)
 | 
			
		||||
		} else {
 | 
			
		||||
			var k []byte
 | 
			
		||||
			for k, ret = c.Last(); ret != nil; k, ret = c.Prev() {
 | 
			
		||||
				if ts[0].After(tdecode(k)) {
 | 
			
		||||
				t = tdecode(k)
 | 
			
		||||
				if ts[0].After(t) {
 | 
			
		||||
					return nil
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
| 
						 | 
				
			
			@ -412,7 +415,7 @@ func retrieve(name string, ts ...time.Time) ([]byte, error) {
 | 
			
		|||
		}
 | 
			
		||||
		return nil
 | 
			
		||||
	})
 | 
			
		||||
	return ret, err
 | 
			
		||||
	return ret, t, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func tidyThread() {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue
	
	Block a user