Merge pull request #20025 from kamipo/dont_use_exec_query_for_performance

Use `select_value` for avoid `ActiveRecord::Result` instance creating
This commit is contained in:
Matthew Draper 2015-05-05 17:15:12 +09:30
commit 6b9e0dc662
2 changed files with 17 additions and 22 deletions

@ -70,7 +70,7 @@ def drop_database(name) #:nodoc:
# Returns the list of all tables in the schema search path or a specified schema.
def tables(name = nil)
query(<<-SQL, 'SCHEMA').map { |row| row[0] }
select_values(<<-SQL, 'SCHEMA')
SELECT tablename
FROM pg_tables
WHERE schemaname = ANY (current_schemas(false))
@ -84,7 +84,7 @@ def table_exists?(name)
name = Utils.extract_schema_qualified_name(name.to_s)
return false unless name.identifier
exec_query(<<-SQL, 'SCHEMA').rows.first[0].to_i > 0
select_value(<<-SQL, 'SCHEMA').to_i > 0
SELECT COUNT(*)
FROM pg_class c
LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
@ -100,7 +100,7 @@ def drop_table(table_name, options = {}) # :nodoc:
# Returns true if schema exists.
def schema_exists?(name)
exec_query(<<-SQL, 'SCHEMA').rows.first[0].to_i > 0
select_value(<<-SQL, 'SCHEMA').to_i > 0
SELECT COUNT(*)
FROM pg_namespace
WHERE nspname = '#{name}'
@ -109,7 +109,7 @@ def schema_exists?(name)
# Verifies existence of an index with a given name.
def index_name_exists?(table_name, index_name, default)
exec_query(<<-SQL, 'SCHEMA').rows.first[0].to_i > 0
select_value(<<-SQL, 'SCHEMA').to_i > 0
SELECT COUNT(*)
FROM pg_class t
INNER JOIN pg_index d ON t.oid = d.indrelid
@ -182,17 +182,17 @@ def new_column(name, default, sql_type_metadata = nil, null = true, default_func
# Returns the current database name.
def current_database
query('select current_database()', 'SCHEMA')[0][0]
select_value('select current_database()', 'SCHEMA')
end
# Returns the current schema name.
def current_schema
query('SELECT current_schema', 'SCHEMA')[0][0]
select_value('SELECT current_schema', 'SCHEMA')
end
# Returns the current database encoding format.
def encoding
query(<<-end_sql, 'SCHEMA')[0][0]
select_value(<<-end_sql, 'SCHEMA')
SELECT pg_encoding_to_char(pg_database.encoding) FROM pg_database
WHERE pg_database.datname LIKE '#{current_database}'
end_sql
@ -200,21 +200,21 @@ def encoding
# Returns the current database collation.
def collation
query(<<-end_sql, 'SCHEMA')[0][0]
select_value(<<-end_sql, 'SCHEMA')
SELECT pg_database.datcollate FROM pg_database WHERE pg_database.datname LIKE '#{current_database}'
end_sql
end
# Returns the current database ctype.
def ctype
query(<<-end_sql, 'SCHEMA')[0][0]
select_value(<<-end_sql, 'SCHEMA')
SELECT pg_database.datctype FROM pg_database WHERE pg_database.datname LIKE '#{current_database}'
end_sql
end
# Returns an array of schema names.
def schema_names
query(<<-SQL, 'SCHEMA').flatten
select_values(<<-SQL, 'SCHEMA')
SELECT nspname
FROM pg_namespace
WHERE nspname !~ '^pg_.*'
@ -247,12 +247,12 @@ def schema_search_path=(schema_csv)
# Returns the active schema search path.
def schema_search_path
@schema_search_path ||= query('SHOW search_path', 'SCHEMA')[0][0]
@schema_search_path ||= select_value('SHOW search_path', 'SCHEMA')
end
# Returns the current client message level.
def client_min_messages
query('SHOW client_min_messages', 'SCHEMA')[0][0]
select_value('SHOW client_min_messages', 'SCHEMA')
end
# Set the client message level.
@ -270,10 +270,7 @@ def default_sequence_name(table_name, pk = nil) #:nodoc:
end
def serial_sequence(table, column)
result = exec_query(<<-eosql, 'SCHEMA')
SELECT pg_get_serial_sequence('#{table}', '#{column}')
eosql
result.rows.first.first
select_value("SELECT pg_get_serial_sequence('#{table}', '#{column}')", 'SCHEMA')
end
# Sets the sequence of a table's primary key to the specified value.
@ -284,9 +281,7 @@ def set_pk_sequence!(table, value) #:nodoc:
if sequence
quoted_sequence = quote_table_name(sequence)
select_value <<-end_sql, 'SCHEMA'
SELECT setval('#{quoted_sequence}', #{value})
end_sql
select_value("SELECT setval('#{quoted_sequence}', #{value})", 'SCHEMA')
else
@logger.warn "#{table} has primary key #{pk} with no default sequence" if @logger
end
@ -309,7 +304,7 @@ def reset_pk_sequence!(table, pk = nil, sequence = nil) #:nodoc:
if pk && sequence
quoted_sequence = quote_table_name(sequence)
select_value <<-end_sql, 'SCHEMA'
select_value(<<-end_sql, 'SCHEMA')
SELECT setval('#{quoted_sequence}', (SELECT COALESCE(MAX(#{quote_column_name pk})+(SELECT increment_by FROM #{quoted_sequence}), (SELECT min_value FROM #{quoted_sequence})) FROM #{quote_table_name(table)}), false)
end_sql
end
@ -371,7 +366,7 @@ def pk_and_sequence_for(table) #:nodoc:
# Returns just a table's primary key
def primary_key(table)
pks = exec_query(<<-end_sql, 'SCHEMA').rows
pks = query(<<-end_sql, 'SCHEMA')
SELECT attr.attname
FROM pg_attribute attr
INNER JOIN pg_constraint cons ON attr.attrelid = cons.conrelid AND attr.attnum = any(cons.conkey)

@ -770,7 +770,7 @@ def last_insert_id_result(sequence_name) #:nodoc:
# - format_type includes the column size constraint, e.g. varchar(50)
# - ::regclass is a function that gives the id for a table name
def column_definitions(table_name) # :nodoc:
exec_query(<<-end_sql, 'SCHEMA').rows
query(<<-end_sql, 'SCHEMA')
SELECT a.attname, format_type(a.atttypid, a.atttypmod),
pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod,
(SELECT c.collname FROM pg_collation c, pg_type t