Class: Newman::Recorder

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/newman/recorder.rb

Instance Method Summary collapse

Constructor Details

#initialize(column, store) ⇒ Recorder

To initialize a ‘Newman::Recorder` object, a `column` key and `store` object must be provided, i.e.

store     = Newman::Store.new("sample.store")
recorder  = Newman::Recorder.new(:subscribers, store)

However, in most cases you should not instantiate a ‘Newman::Recorder` directly, and instead should make use of `Newman::Store#[]` which is syntactic sugar for the same operation.

The first time a particular ‘column` key is referenced, two mapping is created for the column in the underlying data store: one which keeps track of the autoincrementing ids, and one that keeps track of the data stored within the column. It’s fine to treat these mappings as implementation details, but we treat them as part of Newman’s external interface because backwards-incompatible changes to them will result in possible data store corruption.



37
38
39
40
41
42
43
44
45
# File 'lib/newman/recorder.rb', line 37

def initialize(column, store)
  self.column = column
  self.store  = store

  store.write do |data|
    data[:identifiers][column] ||= 0
    data[:columns][column]     ||= {}
  end
end

Instance Method Details

#create(contents) ⇒ Object

‘Newman::Recorder#create` store an arbitrary Ruby object in the data store and returns a `Newman::Record` object which has fields for the `column` key, record `id`, and record `contents`. This method automatically generates new ids, starting with `id=1` for the first record and then incrementing sequentially.



69
70
71
72
73
74
75
76
77
# File 'lib/newman/recorder.rb', line 69

def create(contents)
  store.write do |data| 
    id = (data[:identifiers][column] += 1)
    
    data[:columns][column][id] = contents 

    Record.new(column, id, contents)
  end
end

#destroy(id) ⇒ Object

‘Newman::Recorder#destroy` looks up a record by `id` and then removes it from the data store. This method returns `true` whether or not a record was actually destroyed, which is a somewhat useless behavior and may need to be fixed in a future version of Newman. Patches welcome!



111
112
113
114
115
116
117
# File 'lib/newman/recorder.rb', line 111

def destroy(id)
  store.write do |data|
    data[:columns][column].delete(id)
  end

  true
end

#eachObject

‘Newman::Recorder#each` iterates over all records stored in the column, yielding a `Newman::Record` object for each one. Because `Enumerable` is mixed into `Newman::Recorder`, all enumerable methods that get called on a recorder object end up making calls to this method.



53
54
55
56
57
58
59
# File 'lib/newman/recorder.rb', line 53

def each
  store.read do |data|
    data[:columns][column].each do |id, contents| 
      yield(Record.new(column, id, contents)) 
    end
  end
end

#read(id) ⇒ Object

‘Newman::Recorder#read` looks up a record by `id` and returns a `Newman::Record` object.



84
85
86
87
88
# File 'lib/newman/recorder.rb', line 84

def read(id)
  store.read do |data|
    Record.new(column, id, data[:columns][column][id])
  end
end

#update(id) ⇒ Object

‘Newman::Recorder#update` looks up a record by `id` and yields its contents. The record contents are then replaced with the return value of the provided block.



96
97
98
99
100
101
102
# File 'lib/newman/recorder.rb', line 96

def update(id)
  store.write do |data|
    data[:columns][column][id] = yield(data[:columns][column][id])

    Record.new(column, id, data[:columns][column][id])
  end
end