Add memory data store
This commit is contained in:
		
							
								
								
									
										97
									
								
								data/memory/memory.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										97
									
								
								data/memory/memory.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,97 @@ | ||||
| // Package memory is a in-memory data store | ||||
| package memory | ||||
|  | ||||
| import ( | ||||
| 	"sync" | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/micro/go-micro/data" | ||||
| 	"github.com/micro/go-micro/options" | ||||
| ) | ||||
|  | ||||
| type memoryData struct { | ||||
| 	options.Options | ||||
|  | ||||
| 	sync.RWMutex | ||||
| 	values map[string]*memoryRecord | ||||
| } | ||||
|  | ||||
| type memoryRecord struct { | ||||
| 	r *data.Record | ||||
| 	c time.Time | ||||
| } | ||||
|  | ||||
| func (m *memoryData) Dump() ([]*data.Record, error) { | ||||
| 	m.RLock() | ||||
| 	defer m.RUnlock() | ||||
|  | ||||
| 	var values []*data.Record | ||||
|  | ||||
| 	for _, v := range m.values { | ||||
| 		// get expiry | ||||
| 		d := v.r.Expiry | ||||
| 		t := time.Since(v.c) | ||||
|  | ||||
| 		// expired | ||||
| 		if d > time.Duration(0) && t > d { | ||||
| 			continue | ||||
| 		} | ||||
| 		values = append(values, v.r) | ||||
| 	} | ||||
|  | ||||
| 	return values, nil | ||||
| } | ||||
|  | ||||
| func (m *memoryData) Read(key string) (*data.Record, error) { | ||||
| 	m.RLock() | ||||
| 	defer m.RUnlock() | ||||
|  | ||||
| 	v, ok := m.values[key] | ||||
| 	if !ok { | ||||
| 		return nil, data.ErrNotFound | ||||
| 	} | ||||
|  | ||||
| 	// get expiry | ||||
| 	d := v.r.Expiry | ||||
| 	t := time.Since(v.c) | ||||
|  | ||||
| 	// expired | ||||
| 	if d > time.Duration(0) && t > d { | ||||
| 		return nil, data.ErrNotFound | ||||
| 	} | ||||
|  | ||||
| 	return v.r, nil | ||||
| } | ||||
|  | ||||
| func (m *memoryData) Write(r *data.Record) error { | ||||
| 	m.Lock() | ||||
| 	defer m.Unlock() | ||||
|  | ||||
| 	// set the record | ||||
| 	m.values[r.Key] = &memoryRecord{ | ||||
| 		r: r, | ||||
| 		c: time.Now(), | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *memoryData) Delete(key string) error { | ||||
| 	m.Lock() | ||||
| 	defer m.Unlock() | ||||
|  | ||||
| 	// delete the value | ||||
| 	delete(m.values, key) | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // NewData returns a new data.Data | ||||
| func NewData(opts ...options.Option) data.Data { | ||||
| 	options := options.NewOptions(opts...) | ||||
|  | ||||
| 	return &memoryData{ | ||||
| 		Options: options, | ||||
| 		values:  make(map[string]*memoryRecord), | ||||
| 	} | ||||
| } | ||||
		Reference in New Issue
	
	Block a user