Module: Sequel::Postgres::AdapterMethods

Included in:
Adapter
Defined in:
lib/sequel_core/adapters/shared/postgres.rb

Overview

Methods shared by adapter/connection instances.

Constant Summary collapse

SELECT_CURRVAL =
"SELECT currval('%s')".freeze
SELECT_CUSTOM_SEQUENCE =
<<-end_sql
  SELECT CASE  
      WHEN split_part(def.adsrc, '''', 2) ~ '.' THEN  
        substr(split_part(def.adsrc, '''', 2),  
               strpos(split_part(def.adsrc, '''', 2), '.')+1) 
      ELSE split_part(def.adsrc, '''', 2)  
    END
  FROM pg_class t
  JOIN pg_namespace  name ON (t.relnamespace = name.oid)
  JOIN pg_attribute  attr ON (t.oid = attrelid)
  JOIN pg_attrdef    def  ON (adrelid = attrelid AND adnum = attnum)
  JOIN pg_constraint cons ON (conrelid = adrelid AND adnum = conkey[1])
  WHERE t.oid = '%s'::regclass
    AND cons.contype = 'p'
    AND def.adsrc ~* 'nextval'
end_sql
SELECT_PK =
<<-end_sql
  SELECT pg_attribute.attname
  FROM pg_class, pg_attribute, pg_index
  WHERE pg_class.oid = pg_attribute.attrelid AND
    pg_class.oid = pg_index.indrelid AND
    pg_index.indkey[0] = pg_attribute.attnum AND
    pg_index.indisprimary = 't' AND
    pg_class.relname = '%s'
end_sql
SELECT_SERIAL_SEQUENCE =
<<-end_sql
  SELECT seq.relname
  FROM pg_class seq, pg_attribute attr, pg_depend dep,
    pg_namespace name, pg_constraint cons
  WHERE seq.oid = dep.objid
    AND seq.relnamespace  = name.oid
    AND seq.relkind = 'S'
    AND attr.attrelid = dep.refobjid
    AND attr.attnum = dep.refobjsubid
    AND attr.attrelid = cons.conrelid
    AND attr.attnum = cons.conkey[1]
    AND cons.contype = 'p'
    AND dep.refobjid = '%s'::regclass
end_sql

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#db=(value) ⇒ Object (writeonly)

Sets the attribute db

Parameters:

  • value

    the value to set the attribute db to.



9
10
11
# File 'lib/sequel_core/adapters/shared/postgres.rb', line 9

def db=(value)
  @db = value
end

#transaction_depthObject

Depth of the current transaction on this connection, used to implement multi-level transactions with savepoints.



54
55
56
# File 'lib/sequel_core/adapters/shared/postgres.rb', line 54

def transaction_depth
  @transaction_depth
end

Instance Method Details

#last_insert_id(sequence) ⇒ Object

Get the last inserted value for the given sequence.



57
58
59
60
61
62
63
64
# File 'lib/sequel_core/adapters/shared/postgres.rb', line 57

def last_insert_id(sequence)
  sql = SELECT_CURRVAL % sequence
  @db.log_info(sql)
  execute(sql) do |r|
    val = single_value(r)
    return val.to_i if val
  end
end

#primary_key(table) ⇒ Object

Get the primary key for the given table.



83
84
85
86
87
88
89
# File 'lib/sequel_core/adapters/shared/postgres.rb', line 83

def primary_key(table)
  sql = SELECT_PK % table
  @db.log_info(sql)
  execute(sql) do |r|
    return single_value(r)
  end
end

#sequence(table) ⇒ Object

Get the primary key and sequence for the given table.



67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/sequel_core/adapters/shared/postgres.rb', line 67

def sequence(table)
  sql = SELECT_SERIAL_SEQUENCE % table
  @db.log_info(sql)
  execute(sql) do |r|
    seq = single_value(r)
    return seq if seq
  end
  
  sql = SELECT_CUSTOM_SEQUENCE % table
  @db.log_info(sql)
  execute(sql) do |r|
    return single_value(r)
  end
end