Class: Qreport::Connection::Query

Inherits:
Object
  • Object
show all
Defined in:
lib/qreport/connection/query.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#cmd_statusObject

Returns the value of attribute cmd_status.



8
9
10
# File 'lib/qreport/connection/query.rb', line 8

def cmd_status
  @cmd_status
end

#cmd_status_rawObject

Returns the value of attribute cmd_status_raw.



8
9
10
# File 'lib/qreport/connection/query.rb', line 8

def cmd_status_raw
  @cmd_status_raw
end

#cmd_tuplesObject

Returns the value of attribute cmd_tuples.



8
9
10
# File 'lib/qreport/connection/query.rb', line 8

def cmd_tuples
  @cmd_tuples
end

#columnsObject

Returns the value of attribute columns.



11
12
13
# File 'lib/qreport/connection/query.rb', line 11

def columns
  @columns
end

#connObject

Returns the value of attribute conn.



6
7
8
# File 'lib/qreport/connection/query.rb', line 6

def conn
  @conn
end

#errorObject

Returns the value of attribute error.



8
9
10
# File 'lib/qreport/connection/query.rb', line 8

def error
  @error
end

#fieldsObject

Returns the value of attribute fields.



9
10
11
# File 'lib/qreport/connection/query.rb', line 9

def fields
  @fields
end

#fmodsObject

Returns the value of attribute fmods.



9
10
11
# File 'lib/qreport/connection/query.rb', line 9

def fmods
  @fmods
end

#ftypesObject

Returns the value of attribute ftypes.



9
10
11
# File 'lib/qreport/connection/query.rb', line 9

def ftypes
  @ftypes
end

#nfieldsObject

Returns the value of attribute nfields.



9
10
11
# File 'lib/qreport/connection/query.rb', line 9

def nfields
  @nfields
end

#optionsObject

Returns the value of attribute options.



6
7
8
# File 'lib/qreport/connection/query.rb', line 6

def options
  @options
end

#rowsObject

Returns the value of attribute rows.



11
12
13
# File 'lib/qreport/connection/query.rb', line 11

def rows
  @rows
end

#sqlObject

Returns the value of attribute sql.



6
7
8
# File 'lib/qreport/connection/query.rb', line 6

def sql
  @sql
end

#sql_preparedObject

Returns the value of attribute sql_prepared.



7
8
9
# File 'lib/qreport/connection/query.rb', line 7

def sql_prepared
  @sql_prepared
end

#type_namesObject

Returns the value of attribute type_names.



10
11
12
# File 'lib/qreport/connection/query.rb', line 10

def type_names
  @type_names
end

Instance Method Details

#extract_results!(result) ⇒ Object



88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/qreport/connection/query.rb', line 88

def extract_results! result
  error = result.error_message
  error = nil if error.empty?
  @error = error
  @cmd_status_raw = result.cmd_status
  @cmd_tuples = result.cmd_tuples
  @nfields = result.nfields
  @ntuples = result.ntuples
  @fields = result.fields
  @ftypes = (0 ... nfields).map{|i| result.ftype(i) }
  @fmods  = (0 ... nfields).map{|i| result.fmod(i) }
  @rows = result.to_a
  type_names
  rows
  self
ensure
  result.clear
  @conn = nil
end

#prepare_sql(sql) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/qreport/connection/query.rb', line 33

def prepare_sql sql
  sql = sql.sub(/[\s\n]*;[\s\n]*\Z/, '')
  if options.key?(:limit)
    sql = conn.with_limit sql, options[:limit]
  end
  if arguments = options[:arguments]
    if values = arguments[:names_and_values]
      n = conn.safe_sql(values.keys * ', ')
      v = conn.safe_sql(values.keys.map{|k| ":#{k}"} * ', ')
      sql = sql_replace_arguments(sql,
                        :NAMES  => n,
                        :VALUES => v,
                        :NAMES_AND_VALUES => conn.safe_sql("( #{n} ) VALUES ( #{v} )"),
                        :SET_VALUES => conn.safe_sql(values.keys.map{|k| "#{conn.escape_identifier(k)} = :#{k}"} * ', '))
      arguments = arguments.merge(values)
    end
    sql = sql_replace_arguments(sql, arguments)
  end
  sql
end

#run!Object



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/qreport/connection/query.rb', line 13

def run!
  @error = nil
  @fields = @ftypes = @mods = EMPTY_Array
  @nfields = 0
  sql = @sql_prepared = prepare_sql self.sql
  if conn.verbose || options[:verbose]
    out = conn.verbose_stream
    out.puts "\n-- =================================================================== --"
    out.puts sql
    out.puts "-- ==== --"
  end
  return self if options[:dry_run]
  if result = conn.run_query!(sql, self, options)
    extract_results! result
  end
  self
ensure
  @conn = nil
end

#sql_replace_arguments(sql, arguments) ⇒ Object



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/qreport/connection/query.rb', line 54

def sql_replace_arguments sql, arguments
  sql = sql.gsub(/(:(\w+)\b([?]?))/) do | m |
    name = $2.to_sym
    optional = ! $3.empty?
    if arguments.key?(name) || optional
      val = arguments[name]
      unless optional && val.nil?
        val = conn.escape_value(val)
      end
      conn.verbose_stream.puts "  #{name} => #{val}" if options[:verbose_arguments]
      val
    else
      $1
    end
  end
  sql = sql_replace_match sql
end

#sql_replace_match(sql) ⇒ Object



72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/qreport/connection/query.rb', line 72

def sql_replace_match sql
  sql = sql.gsub(/:~\s*\{\{([^\}]+?)\}\}\s*\{\{([^\}]+?)\}\}/) do | m |
    expr = $1
    val = $2
    case expr
    when /\A\s*BETWEEN\b/
      "(#{val} #{expr})"
    when "NULL"
      "(#{val} IS NULL)"
    else
      "(#{val} = #{expr})"
    end
  end
  sql
end