Class: Ruote::HashStorage

Inherits:
Object
  • Object
show all
Includes:
MonitorMixin, StorageBase
Defined in:
lib/ruote/storage/hash_storage.rb

Overview

An in-memory storage.

Instance Attribute Summary (collapse)

Instance Method Summary (collapse)

Methods included from StorageBase

#clear, #context, #context=, #copy_to, #delete_schedule, #empty?, #expression_wfids, #find_root_expression, #get_configuration, #get_engine_variable, #get_msgs, #get_schedules, #get_trackers, #put_engine_variable, #put_msg, #put_schedule, #reserve

Constructor Details

- (HashStorage) initialize(options = {})

A new instance of HashStorage



42
43
44
45
46
47
48
49
50
51
52
# File 'lib/ruote/storage/hash_storage.rb', line 42

def initialize(options={})

  super()
    # since were including MonitorMixin, this super() is necessary

  @options = options

  purge!

  put(options.merge('type' => 'configurations', '_id' => 'engine'))
end

Instance Attribute Details

- (Object) h (readonly)

Returns the value of attribute h



40
41
42
# File 'lib/ruote/storage/hash_storage.rb', line 40

def h
  @h
end

Instance Method Details

- (Object) add_type(type)



180
181
182
183
# File 'lib/ruote/storage/hash_storage.rb', line 180

def add_type(type)

  @h[type] = {}
end

- (Object) delete(doc)

Raises:

  • (ArgumentError)


100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# File 'lib/ruote/storage/hash_storage.rb', line 100

def delete(doc)

  drev = doc['_rev']

  raise ArgumentError.new("can't delete doc without _rev") unless drev

  synchronize do

    prev = get(doc['type'], doc['_id'])

    return true if prev.nil?

    doc['_rev'] ||= 0

    return prev if prev['_rev'] != drev

    @h[doc['type']].delete(doc['_id'])

    nil # success
  end
end

- (Object) dump(type)



190
191
192
193
194
195
196
197
198
199
200
201
# File 'lib/ruote/storage/hash_storage.rb', line 190

def dump(type)

  s = "=== #{type} ===\n"

  @h[type].inject(s) do |s1, (k, v)|
    s1 << "\n"
    s1 << "#{k} :\n"
    v.keys.sort.inject(s1) do |s2, k1|
      s2 << "  #{k1} => #{v[k1].inspect}\n"
    end
  end
end

- (Object) get(type, key)



93
94
95
96
97
98
# File 'lib/ruote/storage/hash_storage.rb', line 93

def get(type, key)

  synchronize do
    Ruote.fulldup(@h[type][key])
  end
end

- (Object) get_many(type, key = nil, opts = {})



122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
# File 'lib/ruote/storage/hash_storage.rb', line 122

def get_many(type, key=nil, opts={})

  # NOTE : no dup here for now

  synchronize do

    keys = key ?
      Array(key).map { |k| k.is_a?(String) ? "!#{k}" : k } : nil

    docs = keys ?
      @h[type].values.select { |doc|
        Ruote::StorageBase.key_match?(keys, doc)
      } :
      @h[type].values

    docs = docs.sort_by { |d| d['_id'] }

    return docs.size if opts[:count]

    docs = docs.reverse if opts[:descending]

    skip = opts[:skip] || 0
    limit = opts[:limit] || docs.size

    docs[skip, limit]
  end
end

- (Object) ids(type)

Returns a sorted list of all the ids for a given type.



152
153
154
155
# File 'lib/ruote/storage/hash_storage.rb', line 152

def ids(type)

  @h[type].keys.sort
end

- (Object) purge!

Purges the storage completely.



159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
# File 'lib/ruote/storage/hash_storage.rb', line 159

def purge!

  @h = %w[

    variables

    msgs
    expressions
    errors
    schedules
    configurations
    workitems

  ].inject({}) { |h, k|
    h[k] = {}
    h
  }

  @h['configurations']['engine'] = @options
end

- (Object) purge_type!(type)



185
186
187
188
# File 'lib/ruote/storage/hash_storage.rb', line 185

def purge_type!(type)

  @h[type] = {}
end

- (Object) put(doc, opts = {})



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/ruote/storage/hash_storage.rb', line 54

def put(doc, opts={})

  i = @h.size

  synchronize do

    pre = get(doc['type'], doc['_id'])

    if pre && pre['_rev'] != doc['_rev']
      return pre
    end

    if pre.nil? && doc['_rev']
      return true
    end

    doc = if opts[:update_rev]
      doc['_rev'] = pre ? pre['_rev'] : -1
      doc
    else
      doc.merge('_rev' => doc['_rev'] || -1)
    end

    doc['put_at'] = Ruote.now_to_utc_s
    doc['_rev'] = doc['_rev'] + 1

    @h[doc['type']][doc['_id']] = Rufus::Json.dup(doc)

    nil
  end

rescue => e
  puts "=" * 80
  File.open('doc.json', 'wb') do |f|
    f.puts Rufus::Json.pretty_encode(doc)
  end
  raise e
end