Class: SeapigObject
- Inherits:
-
Hash
- Object
- Hash
- SeapigObject
- Defined in:
- lib/seapig/client.rb
Direct Known Subclasses
Instance Attribute Summary collapse
-
#destroyed ⇒ Object
Returns the value of attribute destroyed.
-
#object_id ⇒ Object
Returns the value of attribute object_id.
-
#onproduce_proc ⇒ Object
Returns the value of attribute onproduce_proc.
-
#parent ⇒ Object
Returns the value of attribute parent.
-
#stall ⇒ Object
Returns the value of attribute stall.
-
#valid ⇒ Object
Returns the value of attribute valid.
-
#version ⇒ Object
Returns the value of attribute version.
Instance Method Summary collapse
- #changed(new_version = nil) ⇒ Object
-
#initialize(server, object_id, parent = nil) ⇒ SeapigObject
constructor
A new instance of SeapigObject.
- #matches?(id) ⇒ Boolean
- #onchange(&block) ⇒ Object
- #onproduce(&block) ⇒ Object
- #patch(message) ⇒ Object
- #sanitized ⇒ Object
- #set(data, version) ⇒ Object
- #upload(old_version, old_object, object_id) ⇒ Object
Constructor Details
#initialize(server, object_id, parent = nil) ⇒ SeapigObject
Returns a new instance of SeapigObject.
172 173 174 175 176 177 178 179 180 181 182 183 |
# File 'lib/seapig/client.rb', line 172 def initialize(server, object_id, parent = nil) @server = server @object_id = object_id @version = 0 @onchange_proc = nil @onproduce_proc = nil @valid = false @shadow = JSON.load(JSON.dump(self)) @stall = false @parent = parent @destroyed = false end |
Instance Attribute Details
#destroyed ⇒ Object
Returns the value of attribute destroyed.
164 165 166 |
# File 'lib/seapig/client.rb', line 164 def destroyed @destroyed end |
#object_id ⇒ Object
Returns the value of attribute object_id.
164 165 166 |
# File 'lib/seapig/client.rb', line 164 def object_id @object_id end |
#onproduce_proc ⇒ Object
Returns the value of attribute onproduce_proc.
164 165 166 |
# File 'lib/seapig/client.rb', line 164 def onproduce_proc @onproduce_proc end |
#parent ⇒ Object
Returns the value of attribute parent.
164 165 166 |
# File 'lib/seapig/client.rb', line 164 def parent @parent end |
#stall ⇒ Object
Returns the value of attribute stall.
164 165 166 |
# File 'lib/seapig/client.rb', line 164 def stall @stall end |
#valid ⇒ Object
Returns the value of attribute valid.
164 165 166 |
# File 'lib/seapig/client.rb', line 164 def valid @valid end |
#version ⇒ Object
Returns the value of attribute version.
164 165 166 |
# File 'lib/seapig/client.rb', line 164 def version @version end |
Instance Method Details
#changed(new_version = nil) ⇒ Object
228 229 230 231 232 233 234 |
# File 'lib/seapig/client.rb', line 228 def changed(new_version=nil) old_version = @version old_object = @shadow @version = (new_version or (Time.new.to_f*1000000).to_i) @shadow = sanitized upload(old_version, old_object, @object_id) end |
#matches?(id) ⇒ Boolean
167 168 169 |
# File 'lib/seapig/client.rb', line 167 def matches?(id) id =~ Regexp.new(Regexp.escape(@object_id).gsub('\*','.*?')) end |
#onchange(&block) ⇒ Object
186 187 188 |
# File 'lib/seapig/client.rb', line 186 def onchange(&block) @onchange_proc = block end |
#onproduce(&block) ⇒ Object
191 192 193 |
# File 'lib/seapig/client.rb', line 191 def onproduce(&block) @onproduce_proc = block end |
#patch(message) ⇒ Object
196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 |
# File 'lib/seapig/client.rb', line 196 def patch() if (not ['old_version']) or (['old_version'] == 0) or (['value']) self.clear elsif not @version == ['old_version'] p @version, puts "Seapig lost some updates, this should never happen" exit 2 end if ['value'] self.merge!(['value']) else Hana::Patch.new(['patch']).apply(self) end @version = ['new_version'] @valid = true @onchange_proc.call(self) if @onchange_proc end |
#sanitized ⇒ Object
237 238 239 |
# File 'lib/seapig/client.rb', line 237 def sanitized JSON.load(JSON.dump(self)) end |
#set(data, version) ⇒ Object
215 216 217 218 219 220 221 222 223 224 225 |
# File 'lib/seapig/client.rb', line 215 def set(data, version) if data @stall = false self.clear self.merge!(data) @shadow = sanitized else @stall = true end @version = version end |
#upload(old_version, old_object, object_id) ⇒ Object
242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 |
# File 'lib/seapig/client.rb', line 242 def upload(old_version, old_object, object_id) = { id: object_id, action: 'object-patch', old_version: old_version, new_version: @version, } if old_version == 0 or @stall .merge!(value: (if @stall then false else @shadow end)) else diff = JsonDiff.generate(old_object, @shadow) value = @shadow if JSON.dump(diff.size) < JSON.dump(value.size) #can we afford this? .merge!(patch: diff) else .merge!(old_version: 0, value: @shadow) end end @server.socket.send JSON.dump() end |