Module: ActiveRecord::ConnectionAdapters::PostgreSQL::DatabaseStatements
- Included in:
- ActiveRecord::ConnectionAdapters::PostgreSQLAdapter
- Defined in:
- lib/active_record/connection_adapters/postgresql/database_statements.rb
Constant Summary collapse
- MONEY_COLUMN_TYPE_OID =
          The internal PostgreSQL identifier of the money data type. 
- 790
- BYTEA_COLUMN_TYPE_OID =
          The internal PostgreSQL identifier of the BYTEA data type. 
- 17
Instance Method Summary collapse
- 
  
    
      #begin_db_transaction  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Begins a transaction. 
- #begin_isolated_db_transaction(isolation) ⇒ Object
- 
  
    
      #commit_db_transaction  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Commits a transaction. 
- #exec_delete(sql, name = 'SQL', binds = []) ⇒ Object (also: #exec_update)
- #exec_insert(sql, name, binds, pk = nil, sequence_name = nil) ⇒ Object
- #exec_query(sql, name = 'SQL', binds = [], prepare: false) ⇒ Object
- 
  
    
      #exec_rollback_db_transaction  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Aborts a transaction. 
- 
  
    
      #execute(sql, name = nil)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Executes an SQL statement, returning a PGresult object on success or raising a PGError exception otherwise. 
- #explain(arel, binds = []) ⇒ Object
- 
  
    
      #query(sql, name = nil)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Queries the database and returns the results in an Array-like object. 
- 
  
    
      #result_as_array(res)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    create a 2D array representing the result set. 
- 
  
    
      #select_rows(sql, name = nil, binds = [])  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Executes a SELECT query and returns an array of rows. 
- #select_value(arel, name = nil, binds = []) ⇒ Object
- #select_values(arel, name = nil, binds = []) ⇒ Object
- 
  
    
      #sql_for_insert(sql, pk, id_value, sequence_name, binds)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    :nodoc:. 
Instance Method Details
#begin_db_transaction ⇒ Object
Begins a transaction.
| 151 152 153 | # File 'lib/active_record/connection_adapters/postgresql/database_statements.rb', line 151 def begin_db_transaction execute "BEGIN" end | 
#begin_isolated_db_transaction(isolation) ⇒ Object
| 155 156 157 158 | # File 'lib/active_record/connection_adapters/postgresql/database_statements.rb', line 155 def begin_isolated_db_transaction(isolation) begin_db_transaction execute "SET TRANSACTION ISOLATION LEVEL #{transaction_isolation_levels.fetch(isolation)}" end | 
#commit_db_transaction ⇒ Object
Commits a transaction.
| 161 162 163 | # File 'lib/active_record/connection_adapters/postgresql/database_statements.rb', line 161 def commit_db_transaction execute "COMMIT" end | 
#exec_delete(sql, name = 'SQL', binds = []) ⇒ Object Also known as: exec_update
| 115 116 117 | # File 'lib/active_record/connection_adapters/postgresql/database_statements.rb', line 115 def exec_delete(sql, name = 'SQL', binds = []) execute_and_clear(sql, name, binds) {|result| result.cmd_tuples } end | 
#exec_insert(sql, name, binds, pk = nil, sequence_name = nil) ⇒ Object
| 136 137 138 139 140 141 142 143 144 145 146 147 148 | # File 'lib/active_record/connection_adapters/postgresql/database_statements.rb', line 136 def exec_insert(sql, name, binds, pk = nil, sequence_name = nil) val = exec_query(sql, name, binds) if !use_insert_returning? && pk unless sequence_name table_ref = extract_table_ref_from_insert_sql(sql) sequence_name = default_sequence_name(table_ref, pk) return val unless sequence_name end last_insert_id_result(sequence_name) else val end end | 
#exec_query(sql, name = 'SQL', binds = [], prepare: false) ⇒ Object
| 102 103 104 105 106 107 108 109 110 111 112 113 | # File 'lib/active_record/connection_adapters/postgresql/database_statements.rb', line 102 def exec_query(sql, name = 'SQL', binds = [], prepare: false) execute_and_clear(sql, name, binds, prepare: prepare) do |result| types = {} fields = result.fields fields.each_with_index do |fname, i| ftype = result.ftype i fmod = result.fmod i types[fname] = get_oid_type(ftype, fmod, fname) end ActiveRecord::Result.new(fields, result.values, types) end end | 
#exec_rollback_db_transaction ⇒ Object
Aborts a transaction.
| 166 167 168 | # File 'lib/active_record/connection_adapters/postgresql/database_statements.rb', line 166 def exec_rollback_db_transaction execute "ROLLBACK" end | 
#execute(sql, name = nil) ⇒ Object
Executes an SQL statement, returning a PGresult object on success or raising a PGError exception otherwise. Note: the PGresult object is manually memory managed; if you don’t need it specifically, you many want consider the exec_query wrapper.
| 96 97 98 99 100 | # File 'lib/active_record/connection_adapters/postgresql/database_statements.rb', line 96 def execute(sql, name = nil) log(sql, name) do @connection.async_exec(sql) end end | 
#explain(arel, binds = []) ⇒ Object
| 5 6 7 8 | # File 'lib/active_record/connection_adapters/postgresql/database_statements.rb', line 5 def explain(arel, binds = []) sql = "EXPLAIN #{to_sql(arel, binds)}" PostgreSQL::ExplainPrettyPrinter.new.pp(exec_query(sql, 'EXPLAIN', binds)) end | 
#query(sql, name = nil) ⇒ Object
Queries the database and returns the results in an Array-like object
| 86 87 88 89 90 | # File 'lib/active_record/connection_adapters/postgresql/database_statements.rb', line 86 def query(sql, name = nil) #:nodoc: log(sql, name) do result_as_array @connection.async_exec(sql) end end | 
#result_as_array(res) ⇒ Object
create a 2D array representing the result set
| 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | # File 'lib/active_record/connection_adapters/postgresql/database_statements.rb', line 44 def result_as_array(res) #:nodoc: # check if we have any binary column and if they need escaping ftypes = Array.new(res.nfields) do |i| [i, res.ftype(i)] end rows = res.values return rows unless ftypes.any? { |_, x| x == BYTEA_COLUMN_TYPE_OID || x == MONEY_COLUMN_TYPE_OID } typehash = ftypes.group_by { |_, type| type } binaries = typehash[BYTEA_COLUMN_TYPE_OID] || [] monies = typehash[MONEY_COLUMN_TYPE_OID] || [] rows.each do |row| # unescape string passed BYTEA field (OID == 17) binaries.each do |index, _| row[index] = unescape_bytea(row[index]) end # If this is a money type column and there are any currency symbols, # then strip them off. Indeed it would be prettier to do this in # PostgreSQLColumn.string_to_decimal but would break form input # fields that call value_before_type_cast. monies.each do |index, _| data = row[index] # Because money output is formatted according to the locale, there are two # cases to consider (note the decimal separators): # (1) $12,345,678.12 # (2) $12.345.678,12 case data when /^-?\D+[\d,]+\.\d{2}$/ # (1) data.gsub!(/[^-\d.]/, '') when /^-?\D+[\d.]+,\d{2}$/ # (2) data.gsub!(/[^-\d,]/, '').sub!(/,/, '.') end end end end | 
#select_rows(sql, name = nil, binds = []) ⇒ Object
Executes a SELECT query and returns an array of rows. Each row is an array of field values.
| 32 33 34 35 36 | # File 'lib/active_record/connection_adapters/postgresql/database_statements.rb', line 32 def select_rows(sql, name = nil, binds = []) execute_and_clear(sql, name, binds) do |result| result.values end end | 
#select_value(arel, name = nil, binds = []) ⇒ Object
| 10 11 12 13 14 15 16 | # File 'lib/active_record/connection_adapters/postgresql/database_statements.rb', line 10 def select_value(arel, name = nil, binds = []) arel, binds = binds_from_relation arel, binds sql = to_sql(arel, binds) execute_and_clear(sql, name, binds) do |result| result.getvalue(0, 0) if result.ntuples > 0 && result.nfields > 0 end end | 
#select_values(arel, name = nil, binds = []) ⇒ Object
| 18 19 20 21 22 23 24 25 26 27 28 | # File 'lib/active_record/connection_adapters/postgresql/database_statements.rb', line 18 def select_values(arel, name = nil, binds = []) arel, binds = binds_from_relation arel, binds sql = to_sql(arel, binds) execute_and_clear(sql, name, binds) do |result| if result.nfields > 0 result.column_values(0) else [] end end end | 
#sql_for_insert(sql, pk, id_value, sequence_name, binds) ⇒ Object
:nodoc:
| 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 | # File 'lib/active_record/connection_adapters/postgresql/database_statements.rb', line 120 def sql_for_insert(sql, pk, id_value, sequence_name, binds) # :nodoc: if pk.nil? # Extract the table from the insert sql. Yuck. table_ref = extract_table_ref_from_insert_sql(sql) pk = primary_key(table_ref) if table_ref end pk = suppress_composite_primary_key(pk) if pk && use_insert_returning? sql = "#{sql} RETURNING #{quote_column_name(pk)}" end super end |