Class: Wbem::Conversion
- Inherits:
-
Object
- Object
- Wbem::Conversion
- Defined in:
- lib/wbem/conversion.rb
Class Method Summary collapse
-
.cimdatetime_to_ruby(str) ⇒ Object
Convert CIM DateTime string representation (see DSP0004, 2.2.1) to Ruby Time (timestamp) or Float (interval, as seconds with fraction) 00000000001111111111222222 01234567890123456789012345 East: yyyymmddhhmmss.mmmmmm+utc -> Time (utc = offset in minutes) West: yyyymmddhhmmss.mmmmmm-utc -> Time 2011-11-01T00:00:00Z Interval: ddddddddhhmmss.mmmmmm:000 -> Float (interval in seconds, with fraction).
-
.from_ruby(type, value) ⇒ Object
generic type conversion Ruby -> CIM.
-
.ruby_to_cimdatetime(val) ⇒ Object
Convert Ruby value to CIM DateTime string representation (see DSP0004, 2.2.1) 00000000001111111111222222 01234567890123456789012345 East: yyyymmddhhmmss.mmmmmm+utc -> Time (utc = offset in minutes, mmmmmm is the microsecond within the second West: yyyymmddhhmmss.mmmmmm-utc -> Time Interval: ddddddddhhmmss.mmmmmm:000 -> Float (interval in seconds, with fraction).
-
.to_ruby(type, value) ⇒ Object
generic type conversion CIM -> Ruby.
Class Method Details
.cimdatetime_to_ruby(str) ⇒ Object
Convert CIM DateTime string representation (see DSP0004, 2.2.1) to Ruby Time (timestamp) or Float (interval, as seconds with fraction)
00000000001111111111222222
01234567890123456789012345
East: yyyymmddhhmmss.mmmmmm+utc -> Time (utc = offset in minutes) West: yyyymmddhhmmss.mmmmmm-utc -> Time
2011-11-01T00:00:00Z
Interval: ddddddddhhmmss.mmmmmm:000 -> Float (interval in seconds, with fraction)
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
# File 'lib/wbem/conversion.rb', line 19 def self.cimdatetime_to_ruby str # puts "Cmpi.cimdatetime_to_ruby(#{str})" case str[21,1] when '+', '-' # create Time from yyyymmddhhmmss and utc t = Time.new(str[0,4].to_i, str[4,2].to_i, str[6,2].to_i, str[8,2].to_i, str[10,2].to_i, str[12,2].to_i, str[22,3].to_i * ((str[21,1]=='+')?60:-60)) off = str[15,6].to_i / 1000 # Add fractional part return t + off when ':' # time offset off = str[0,8].to_i * 24 * 60 * 60 off += str[8,2].to_i * 60 * 60 + str[10,2].to_i * 60 + str[12,2].to_i off += str[15,6].to_i / 1000 return off when nil # 2011-11-01T00:00:00Z t = Time.new(str[0,4].to_i, str[5,2].to_i, str[8,2].to_i, str[11,2].to_i, str[14,2].to_i, str[17,2].to_i, (str[19,1] == 'Z')?0:0) else begin require 'date' DateTime.parse str rescue raise ::TypeError.new("Invalid CIM DateTime '#{str}'") end end end |
.from_ruby(type, value) ⇒ Object
generic type conversion Ruby -> CIM
149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 |
# File 'lib/wbem/conversion.rb', line 149 def self.from_ruby type, value case type when :null,:void "" when :boolean (value)?'true':'false' when :char16 value.to_s when :string value.to_s when :uint8,:sint8,:uint16,:sint16,:uint32,:sint32,:uint64,:sint64 value.to_i.to_s when :real32,:real64 value.to_f.to_s when :dateTime Wbem::Conversion.ruby_to_cimdatetime value # when :class # when :reference # when :array else raise "Unhandled type in from_ruby #{type.inspect}" end end |
.ruby_to_cimdatetime(val) ⇒ Object
Convert Ruby value to CIM DateTime string representation (see DSP0004, 2.2.1)
00000000001111111111222222
01234567890123456789012345
East: yyyymmddhhmmss.mmmmmm+utc -> Time (utc = offset in minutes, mmmmmm is the microsecond within the second West: yyyymmddhhmmss.mmmmmm-utc -> Time Interval: ddddddddhhmmss.mmmmmm:000 -> Float (interval in seconds, with fraction)
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 92 93 94 |
# File 'lib/wbem/conversion.rb', line 55 def self.ruby_to_cimdatetime val require 'date' # puts "Cmpi.ruby_to_cimdatetime(#{val}[#{val.class}])" t = nil case val when Time s = val.strftime "%Y%m%d%H%M%S.%6N" utc = val.utc_offset # offset in seconds if utc < 0 s << "-" utc = -utc else s << "+" end val = s + ("%03d" % (utc/60)) when Numeric if val < 0 # treat it as seconds before epoch val = self.ruby_to_cimdatetime( Time.at(val) ) else # treat as interval in microseconds secs = (val / 1000000).to_i usecs = (val % 1000000).to_i days = secs / (24 * 60 * 60) secs = secs % (24 * 60 * 60) # seconds within the day hours = (secs / (60 * 60)).to_i secs = secs % (60 * 60) mins = (secs / 60).to_i secs = secs % 60 val = "%08d%02d%02d%02d.%06d:000" % [ days, hours, mins, secs, usecs ] end when /^\d{14}\.\d{6}[-+:]\d{3}$/ # fallthru when String val = self.ruby_to_cimdatetime val.to_f # retry as Numeric else val = self.ruby_to_cimdatetime val.to_s # retry as string end val end |
.to_ruby(type, value) ⇒ Object
generic type conversion CIM -> Ruby
99 100 101 102 103 104 105 106 107 108 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 134 135 136 137 138 139 140 141 142 143 144 145 |
# File 'lib/wbem/conversion.rb', line 99 def self.to_ruby type, value text = case value when Openwsman::XmlNode value.text when String value else value.to_s end case type when :null,:void nil when :boolean text == 'true' when :char16 text.to_i when :string text when :uint8,:sint8,:uint16,:sint16,:uint32,:sint32,:uint64,:sint64 text.to_i when :real32,:real64 text.to_f when :dateTime Wbem::Conversion.cimdatetime_to_ruby text when :class # puts "to_ruby :class, #{value.to_xml}" uri = value.ResourceURI if uri # assume ResourceURI and SelectorSet # puts "to_ruby :class uri #{uri.text}" epr = Openwsman::EndPointReference.new(uri.text) value.SelectorSet.each do |s| k = s.attr("Name").value v = s.text epr.add_selector(k, v) end epr else # try EndpointReference Openwsman::EndPointReference.new(value.to_xml) end # when :class # when :reference # when :array else raise "Unhandled type in to_ruby #{type.inspect}" end end |