Class: Ruote::HashStorage

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

Overview

An in-memory storage.

Useful for testing or for transient engines.

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from StorageBase

#clear, #context, #context=, #copy_to, #delete_schedule, #dump, #empty?, #expression_wfids, #find_expressions, #find_root_expression, #find_root_expressions, #get_configuration, #get_engine_variable, #get_msgs, #get_schedules, #get_trackers, #put_engine_variable, #put_msg, #put_schedule, #remove_process, #replace_engine_configuration, #reserve, #worker

Constructor Details

#initialize(options = {}) ⇒ HashStorage

Returns a new instance of HashStorage


45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/ruote/storage/hash_storage.rb', line 45

def initialize(options={})

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

  @options = options

  purge!
    # which initializes @h

  replace_engine_configuration(options)
end

Instance Attribute Details

#hObject (readonly)

Returns the value of attribute h


43
44
45
# File 'lib/ruote/storage/hash_storage.rb', line 43

def h
  @h
end

Instance Method Details

#add_type(type) ⇒ Object


207
208
209
210
# File 'lib/ruote/storage/hash_storage.rb', line 207

def add_type(type)

  @h[type] = {}
end

#delete(doc) ⇒ Object

Raises:

  • (ArgumentError)

109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# File 'lib/ruote/storage/hash_storage.rb', line 109

def delete(doc)

  raise ArgumentError.new(
    "document is missing key 'type' and/or '_id', cannot locate it"
  ) if doc['type'] == nil || doc['_id'] == nil

  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

#get(type, key) ⇒ Object


102
103
104
105
106
107
# File 'lib/ruote/storage/hash_storage.rb', line 102

def get(type, key)

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

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


135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
# File 'lib/ruote/storage/hash_storage.rb', line 135

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

  # NOTE : no dup here for now

  synchronize do

    docs = if key
      keys = Array(key).map { |k| k.is_a?(String) ? "!#{k}" : k }
      @h[type].values.select { |doc| key_match?(type, keys, doc) }
    else
      @h[type].values
    end

    return docs.size if opts[:count]

    docs = docs.sort_by { |d| d['_id'] }
    docs = docs.reverse if opts[:descending]

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

    docs[skip, limit]
  end
end

#ids(type) ⇒ Object

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


162
163
164
165
# File 'lib/ruote/storage/hash_storage.rb', line 162

def ids(type)

  @h[type].keys.sort
end

#purge!Object

Purges the storage completely.


187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
# File 'lib/ruote/storage/hash_storage.rb', line 187

def purge!

  @h = %w[

    variables

    msgs
    expressions
    errors
    schedules
    configurations
    workitems

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

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

#purge_type!(type) ⇒ Object


212
213
214
215
# File 'lib/ruote/storage/hash_storage.rb', line 212

def purge_type!(type)

  @h[type] = {}
end

#put(doc, opts = {}) ⇒ Object

Raises:

  • (ArgumentError)

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
92
93
94
95
96
97
98
99
100
# File 'lib/ruote/storage/hash_storage.rb', line 58

def put(doc, opts={})

  raise ArgumentError.new(
    "document is missing key 'type' and/or '_id', cannot store it"
  ) if doc['type'] == nil || doc['_id'] == nil

  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

    #puts caller unless doc.is_a?(Hash)

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

    doc['put_at'] = Ruote.now_to_utc_s
    doc['_rev'] = doc['_rev'] + 1
    #doc = Ruote.keys_to_s(doc)

    @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

#shutdownObject

Shuts this storage down.


219
220
221
222
# File 'lib/ruote/storage/hash_storage.rb', line 219

def shutdown

  # nothing to do
end