module Sequel::Postgres::EnumDatabaseMethods

Methods enabling Database object integration with enum types.

Public Class Methods

extended(db) click to toggle source

Parse the available enum values when loading this extension into your database.

# File lib/sequel/extensions/pg_enum.rb, line 65
def self.extended(db)
  db.send(:parse_enum_labels)
end

Public Instance Methods

add_enum_value(enum, value, opts=OPTS) click to toggle source

Run the SQL to add the given value to the existing enum type. Options:

:after

Add the new value after this existing value.

:before

Add the new value before this existing value.

:if_not_exists

Do not raise an error if the value already exists in the enum.

# File lib/sequel/extensions/pg_enum.rb, line 74
def add_enum_value(enum, value, opts=OPTS)
  sql = String.new
  sql << "ALTER TYPE #{quote_schema_table(enum)} ADD VALUE#{' IF NOT EXISTS' if opts[:if_not_exists]} #{literal(value.to_s)}"
  if v = opts[:before]
    sql << " BEFORE #{literal(v.to_s)}"
  elsif v = opts[:after]
    sql << " AFTER #{literal(v.to_s)}"
  end
  run sql
  parse_enum_labels
  nil
end
create_enum(enum, values) click to toggle source

Run the SQL to create an enum type with the given name and values.

# File lib/sequel/extensions/pg_enum.rb, line 88
def create_enum(enum, values)
  sql = "CREATE TYPE #{quote_schema_table(enum)} AS ENUM (#{values.map{|v| literal(v.to_s)}.join(', ')})"
  run sql
  parse_enum_labels
  nil
end
drop_enum(enum, opts=OPTS) click to toggle source

Run the SQL to drop the enum type with the given name. Options:

:if_exists

Do not raise an error if the enum type does not exist

:cascade

Also drop other objects that depend on the enum type

# File lib/sequel/extensions/pg_enum.rb, line 99
def drop_enum(enum, opts=OPTS)
  sql = "DROP TYPE#{' IF EXISTS' if opts[:if_exists]} #{quote_schema_table(enum)}#{' CASCADE' if opts[:cascade]}"
  run sql
  parse_enum_labels
  nil
end

Private Instance Methods

parse_enum_labels() click to toggle source

Parse the pg_enum table to get enum values, and the pg_type table to get names and array oids for enums.

# File lib/sequel/extensions/pg_enum.rb, line 111
def parse_enum_labels
  @enum_labels = metadata_dataset.from(:pg_enum).
    order(:enumtypid, :enumsortorder).
    select_hash_groups(Sequel.cast(:enumtypid, Integer).as(:v), :enumlabel).freeze
  @enum_labels.each_value(&:freeze)

  if respond_to?(:register_array_type)
    array_types = metadata_dataset.
      from(:pg_type).
      where(:oid=>@enum_labels.keys).
      exclude(:typarray=>0).
      select_map([:typname, Sequel.cast(:typarray, Integer).as(:v)])

    existing_oids = conversion_procs.keys
    array_types.each do |name, oid|
      next if existing_oids.include?(oid)
      register_array_type(name, :oid=>oid)
    end
  end
end
schema_parse_table(*) click to toggle source

For schema entries that are enums, set the type to :enum and add a :enum_values entry with the enum values.

Calls superclass method
# File lib/sequel/extensions/pg_enum.rb, line 134
def schema_parse_table(*)
  super.each do |_, s|
    if values = @enum_labels[s[:oid]]
      s[:type] = :enum
      s[:enum_values] = values
    end
  end
end
typecast_value_enum(value) click to toggle source

Typecast the given value to a string.

# File lib/sequel/extensions/pg_enum.rb, line 144
def typecast_value_enum(value)
  value.to_s
end