Module: PgHstore

Defined in:
lib/pg_hstore.rb

Constant Summary collapse

SINGLE_QUOTE =
"'"
E_SINGLE_QUOTE =
"E'"
DOUBLE_QUOTE =
'"'
HASHROCKET =
'=>'
COMMA =
','
SLASH =
'\\'
ESCAPED_CHAR =
/\\(.)/
ESCAPED_SINGLE_QUOTE =
'\\\''
ESCAPED_DOUBLE_QUOTE =
'\\"'
ESCAPED_SLASH =
'\\\\'
QUOTED_LITERAL =
/"[^"\\]*(?:\\.[^"\\]*)*"/
UNQUOTED_LITERAL =
/[^\s=,][^\s=,\\]*(?:\\.[^\s=,\\]*|=[^,>])*/
LITERAL =
/(#{QUOTED_LITERAL}|#{UNQUOTED_LITERAL})/
PAIR =
/#{LITERAL}\s*=>\s*#{LITERAL}/
NULL =
/\ANULL\z/i

Class Method Summary collapse

Class Method Details

.dump(hash, raw_string = false) ⇒ Object

Serialize a hash to be sent to PostgreSQL as an hstore value.

By default, returns a (Postgre)SQL string constant suitable for interpolating directly into a query. With raw_string = true, returns the plain string value suitable for use as a bind variable.



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/pg_hstore.rb', line 38

def PgHstore.dump(hash, raw_string = false)
  # Per http://www.postgresql.org/docs/9.2/static/hstore.html :
  #
  #   The text representation of an hstore, used for input and
  #   output, includes zero or more 'key => value' pairs separated
  #   by commas. [...] Whitespace between pairs or around the =>
  #   sign is ignored.  Double-quote keys and values [... see
  #   escape_nonnull_for_hstore ...]
  #
  #   A value (but not a key) can be an SQL NULL.  Double-quote the
  #   NULL to treat it as the ordinary string "NULL".
  hstore = hash.map do |k, v|
    hstore_k = escape_nonnull_for_hstore(k)
    hstore_v = (v.nil?) ? "NULL" : escape_nonnull_for_hstore(v)
    [hstore_k, hstore_v].join(HASHROCKET)
  end.join(COMMA)
  raw_string ? hstore : as_postgresql_string_constant(hstore)
end

.load(hstore, symbolize_keys = false) ⇒ Object Also known as: parse

STRING KEYS BY DEFAULT set symbolize_keys = true if you want symbol keys thanks to github.com/engageis/activerecord-postgres-hstore for regexps!



23
24
25
26
27
28
29
30
31
# File 'lib/pg_hstore.rb', line 23

def PgHstore.load(hstore, symbolize_keys = false)
  hstore.scan(PAIR).inject({}) do |memo, (k, v)|
    k = unescape unquote(k, DOUBLE_QUOTE)
    k = k.to_sym if symbolize_keys
    v = (v =~ NULL) ? nil : unescape(unquote(v, DOUBLE_QUOTE))
    memo[k] = v
    memo
  end
end