module ThinpXML
Constants
- DEVICE_FIELDS
- Device
- MAPPING_FIELDS
- Mapping
- Metadata
- SUPERBLOCK_FIELDS
- Superblock
- THINP_TOOLS_VERSION
- UNIFORM_REGEX
Public Class Methods
field_names(flds)
click to toggle source
# File lib/thinp_xml/thinp/metadata.rb, line 22 def self.field_names(flds) flds.map {|p| p[0]} end
tools_are_installed()
click to toggle source
# File lib/thinp_xml.rb, line 4 def self.tools_are_installed true end
Public Instance Methods
compare_devs(md_dev1, md_dev2)
click to toggle source
returns 3 arrays of mappings: unique to first arg, common, unique to second arg
# File lib/thinp_xml/thinp/utils.rb, line 85 def compare_devs(md_dev1, md_dev2) m1 = md_dev1.mappings m2 = md_dev2.mappings left = Array.new center = Array.new right = Array.new expand_mappings(m1, m2).each do |pair| if pair[0].data_begin == pair[1].data_begin && pair[0].time == pair[1].time # mappings are the same center << pair[0] else left << pair[0] right << pair[1] end end [left, center, right].each {|a| a.reject {|e| e.data_begin == nil}} [left, center, right] end
compare_thins(md1, md2, dev_id)
click to toggle source
# File lib/thinp_xml/thinp/utils.rb, line 108 def compare_thins(md1, md2, dev_id) compare_devs(get_device(md1, dev_id), get_device(md2, dev_id)) end
expand_mappings(left, right)
click to toggle source
Turns 2 lists of mappings, into a list of pairs of mappings. These pairs cover identical regions. nil is used for the data_begin if that region isn't mapped.
# File lib/thinp_xml/thinp/utils.rb, line 17 def expand_mappings(left, right) pairs = Array.new i1 = 0 i2 = 0 m1 = left[i1] m2 = right[i2] # look away now ... loop do if !m1 && !m2 return pairs elsif !m1 pairs << [Mapping.new(m2.origin_begin, nil, m2.length, m2.time), m2] m2 = nil elsif !m2 pairs << [m1, Mapping.new(m1.origin_begin, nil, m1.length, m1.time)] m1 = nil elsif m1.origin_begin < m2.origin_begin if m1.origin_begin + m1.length <= m2.origin_begin pairs << [Mapping.new(m1.origin_begin, m1.data_begin, m1.length, m1.time), Mapping.new(m1.origin_begin, nil, m1.length, m1.time)] i1 += 1 m1 = left[i1] else len = m2.origin_begin - m1.origin_begin pairs << [Mapping.new(m1.origin_begin, m1.data_begin, len, m1.time), Mapping.new(m1.origin_begin, nil, len, m1.time)] m1 = Mapping.new(m1.origin_begin + len, m1.data_begin + len, m1.length - len, m1.time) end elsif m2.origin_begin < m1.origin_begin if m2.origin_begin + m2.length <= m1.origin_begin pairs << [Mapping.new(m2.origin_begin, nil, m2.length, m2.time), Mapping.new(m2.origin_begin, m2.data_begin, m2.length, m2.time)] i2 += 1 m2 = right[i2] else len = m1.origin_begin - m2.origin_begin pairs << [Mapping.new(m2.origin_begin, nil, len, m2.time), Mapping.new(m2.origin_begin, m2.data_begin, len, m2.time)] m2 = Mapping.new(m2.origin_begin + len, m2.data_begin + len, m2.length - len, m2.time) end else len = [m1.length, m2.length].min pairs << [Mapping.new(m1.origin_begin, m1.data_begin, len, m1.time), Mapping.new(m1.origin_begin, m2.data_begin, len, m2.time)] if m1.length < m2.length i1 += 1 m1 = left[i1] m2 = Mapping.new(m2.origin_begin + len, m2.data_begin + len, m2.length - len, m2.time) elsif m2.length < m1.length i2 += 1 m1 = Mapping.new(m1.origin_begin + len, m1.data_begin + len, m1.length - len, m1.time) m2 = right[i2] else i1 += 1 i2 += 1 m1 = left[i1] m2 = right[i2] end end end end
get_device(md, dev_id)
click to toggle source
# File lib/thinp_xml/thinp/utils.rb, line 6 def get_device(md, dev_id) md.devices.each do |dev| if dev.dev_id == dev_id return dev end end end
parse_distribution(str)
click to toggle source
# File lib/thinp_xml/distribution.rb, line 40 def parse_distribution(str) m = UNIFORM_REGEX.match(str) if m ThinpXML::UniformDistribution.new(m[1].to_i, m[2].to_i) else ConstDistribution.new(Integer(str)) end end
read_xml(io)
click to toggle source
# File lib/thinp_xml/thinp/parse.rb, line 52 def read_xml(io) l = ParseDetail::Listener.new REXML::Document.parse_stream(io, l) l.metadata end
write_xml(metadata, io)
click to toggle source
# File lib/thinp_xml/thinp/emit.rb, line 33 def write_xml(metadata, io) e = EmitterDetail::ThinpEmitter.new(io) e.emit_superblock(metadata.superblock) do metadata.devices.each do |dev| e.emit_device(dev) do dev.mappings.each do |m| e.emit_mapping(m) end end end end end