Module: Freezer::Serialization::HStore

Defined in:
lib/freezer/hstore_serialization.rb,
lib/freezer/serialization/hstore.rb

Constant Summary collapse

SERIALIZABLE_TYPES =
[
  :primary_key, :string, :text, :integer, :float, :decimal,
  :datetime,:timestamp, :time, :date, :boolean
].freeze

Class Method Summary collapse

Class Method Details

.deserialize(klass, attributes, silent = false) ⇒ Object

Raises:

  • (ArgumentError)


30
31
32
33
34
35
36
37
38
39
40
# File 'lib/freezer/hstore_serialization.rb', line 30

def deserialize(klass, attributes, silent = false)
  attributes = attributes.dup
  sv = attributes.delete(':sv')
  raise ArgumentError, "Unknown serialization format #{sv.to_s}" unless sv == '1'
  attributes = attributes.inject({}) do |hash,(key,value)|
    real_key, type = deserialize_key(key)
    hash[real_key] = deserialize_value(type, value)
    hash
  end
  FrozenRecordFactory.build(klass, attributes, silent)
end

.deserialize_key(serialized) ⇒ Object



46
47
48
49
# File 'lib/freezer/hstore_serialization.rb', line 46

def deserialize_key(serialized)
  m = serialized.match(/(.*):([^:]+)\z/)
  [m[1].gsub('::',':'), m[2].to_sym]
end

.deserialize_value(type, value) ⇒ Object

Raises:

  • (ArgumentError)


57
58
59
60
61
62
# File 'lib/freezer/hstore_serialization.rb', line 57

def deserialize_value(type, value)
  raise ArgumentError, "Do not know how to deserialize #{type.to_s}" unless SERIALIZABLE_TYPES.include? type
  return nil if value.nil?
  # For now, we will let AR handle the casting for us
  value.to_s
end

.serialize(record) ⇒ Object

TODO give each version its own module or something



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/freezer/hstore_serialization.rb', line 14

def serialize(record)
  # Start with the serialization format version string
  hstore = {':sv'=>'1'}

  columns = record.class.columns
  attributes = record.attributes

  columns.each do |column|
    key = serialize_key(column.name, column.type)
    value = serialize_value(column.type, attributes[column.name])
    hstore[key] = value
  end

  hstore
end

.serialize_key(key, type) ⇒ Object



42
43
44
# File 'lib/freezer/hstore_serialization.rb', line 42

def serialize_key(key, type)
  "#{key.gsub(':','::')}:#{type}"
end

.serialize_value(type, value) ⇒ Object

Raises:

  • (ArgumentError)


51
52
53
54
55
# File 'lib/freezer/hstore_serialization.rb', line 51

def serialize_value(type, value)
  raise ArgumentError, "Do not know how to serialize #{type.to_s}" unless SERIALIZABLE_TYPES.include? type
  return nil if value.nil?
  value.to_s
end