# frozen_string_literal: true
module ActiveRecord
module ConnectionAdapters
module PostgreSQL
module ColumnMethods
extend ActiveSupport::Concern
# Defines the primary key field.
# Use of the native PostgreSQL UUID type is supported, and can be used
# by defining your tables as such:
#
# create_table :stuffs, id: :uuid do |t|
# t.string :content
# t.timestamps
# end
#
# By default, this will use the gen_random_uuid() function from the
# +pgcrypto+ extension. As that extension is only available in
# PostgreSQL 9.4+, for earlier versions an explicit default can be set
# to use uuid_generate_v4() from the +uuid-ossp+ extension instead:
#
# create_table :stuffs, id: false do |t|
# t.primary_key :id, :uuid, default: "uuid_generate_v4()"
# t.uuid :foo_id
# t.timestamps
# end
#
# To enable the appropriate extension, which is a requirement, use
# the +enable_extension+ method in your migrations.
#
# To use a UUID primary key without any of the extensions, set the
# +:default+ option to +nil+:
#
# create_table :stuffs, id: false do |t|
# t.primary_key :id, :uuid, default: nil
# t.uuid :foo_id
# t.timestamps
# end
#
# You may also pass a custom stored procedure that returns a UUID or use a
# different UUID generation function from another library.
#
# Note that setting the UUID primary key default value to +nil+ will
# require you to assure that you always provide a UUID value before saving
# a record (as primary keys cannot be +nil+). This might be done via the
# +SecureRandom.uuid+ method and a +before_save+ callback, for instance.
def primary_key(name, type = :primary_key, **options)
if type == :uuid
options[:default] = options.fetch(:default, "gen_random_uuid()")
end
super
end
##
# :method: bigserial
# :call-seq: bigserial(*names, **options)
##
# :method: bit
# :call-seq: bit(*names, **options)
##
# :method: bit_varying
# :call-seq: bit_varying(*names, **options)
##
# :method: cidr
# :call-seq: cidr(*names, **options)
##
# :method: citext
# :call-seq: citext(*names, **options)
##
# :method: daterange
# :call-seq: daterange(*names, **options)
##
# :method: hstore
# :call-seq: hstore(*names, **options)
##
# :method: inet
# :call-seq: inet(*names, **options)
##
# :method: interval
# :call-seq: interval(*names, **options)
##
# :method: int4range
# :call-seq: int4range(*names, **options)
##
# :method: int8range
# :call-seq: int8range(*names, **options)
##
# :method: jsonb
# :call-seq: jsonb(*names, **options)
##
# :method: ltree
# :call-seq: ltree(*names, **options)
##
# :method: macaddr
# :call-seq: macaddr(*names, **options)
##
# :method: money
# :call-seq: money(*names, **options)
##
# :method: numrange
# :call-seq: numrange(*names, **options)
##
# :method: oid
# :call-seq: oid(*names, **options)
##
# :method: point
# :call-seq: point(*names, **options)
##
# :method: line
# :call-seq: line(*names, **options)
##
# :method: lseg
# :call-seq: lseg(*names, **options)
##
# :method: box
# :call-seq: box(*names, **options)
##
# :method: path
# :call-seq: path(*names, **options)
##
# :method: polygon
# :call-seq: polygon(*names, **options)
##
# :method: circle
# :call-seq: circle(*names, **options)
##
# :method: serial
# :call-seq: serial(*names, **options)
##
# :method: tsrange
# :call-seq: tsrange(*names, **options)
##
# :method: tstzrange
# :call-seq: tstzrange(*names, **options)
##
# :method: tsvector
# :call-seq: tsvector(*names, **options)
##
# :method: uuid
# :call-seq: uuid(*names, **options)
##
# :method: xml
# :call-seq: xml(*names, **options)
included do
define_column_methods :bigserial, :bit, :bit_varying, :cidr, :citext, :daterange,
:hstore, :inet, :interval, :int4range, :int8range, :jsonb, :ltree, :macaddr,
:money, :numrange, :oid, :point, :line, :lseg, :box, :path, :polygon, :circle,
:serial, :tsrange, :tstzrange, :tsvector, :uuid, :xml
end
end
class TableDefinition < ActiveRecord::ConnectionAdapters::TableDefinition
include ColumnMethods
attr_reader :unlogged
def initialize(*, **)
super
@unlogged = ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.create_unlogged_tables
end
private
def integer_like_primary_key_type(type, options)
if type == :bigint || options[:limit] == 8
:bigserial
else
:serial
end
end
end
class Table < ActiveRecord::ConnectionAdapters::Table
include ColumnMethods
end
class AlterTable < ActiveRecord::ConnectionAdapters::AlterTable
attr_reader :constraint_validations
def initialize(td)
super
@constraint_validations = []
end
def validate_constraint(name)
@constraint_validations << name
end
end
end
end
end