Class: Csv2Psql::Generator

Inherits:
Object
  • Object
show all
Defined in:
lib/csv2psql/generator/generator.rb

Overview

SQL Code generator

Constant Summary collapse

BASE_DIR =
File.join(File.dirname(__FILE__), '..')
TEMPLATE_DIR =
File.join(BASE_DIR, 'templates')
CREATE_TABLE_TEMPLATE =
File.join(TEMPLATE_DIR, 'create_table.sql.erb')
DROP_TABLE_TEMPLATE =
File.join(TEMPLATE_DIR, 'drop_table.sql.erb')
HEADER_TEMPLATE =
File.join(TEMPLATE_DIR, 'header.sql.erb')
TRUNCATE_TABLE_TEMPLATE =
File.join(TEMPLATE_DIR, 'truncate_table.sql.erb')
DEFAULT_OPTIONS =
{
  'create-table' => false,
  'drop-table' => false,
  'truncate-table' => false,
  table: 'my_table'
}
TABLE_FUNCTIONS =
{
  'drop-table' => :drop_table,
  'create-table' => :create_table,
  'truncate-table' => :truncate_table
}

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(output) ⇒ Generator

Returns a new instance of Generator.



46
47
48
# File 'lib/csv2psql/generator/generator.rb', line 46

def initialize(output)
  @output = output
end

Instance Attribute Details

#outputObject (readonly)

Returns the value of attribute output.



33
34
35
# File 'lib/csv2psql/generator/generator.rb', line 33

def output
  @output
end

Class Method Details

.sanitize_header(header_column) ⇒ Object



36
37
38
# File 'lib/csv2psql/generator/generator.rb', line 36

def sanitize_header(header_column)
  header_column.downcase.gsub(/[^0-9a-z]/i, '_')
end

.sanitize_value(value) ⇒ Object



40
41
42
43
# File 'lib/csv2psql/generator/generator.rb', line 40

def sanitize_value(value)
  value ||= ''
  value.gsub("'", "''")
end

Instance Method Details

#create_erb_context(path, row, opts = {}) ⇒ Object



50
51
52
53
54
55
56
57
58
59
# File 'lib/csv2psql/generator/generator.rb', line 50

def create_erb_context(path, row, opts = {})
  header = get_header(row, opts)
  columns = get_columns(row, opts, header)
  {
    path: path,
    header: header,
    columns: columns,
    table: opts[:table] || DEFAULT_OPTIONS[:table]
  }
end

#create_header(path, row, opts = {}) ⇒ Object



61
62
63
64
65
# File 'lib/csv2psql/generator/generator.rb', line 61

def create_header(path, row, opts = {})
  ctx = create_erb_context(path, row, opts)
  erb = ErbHelper.new
  erb.process(HEADER_TEMPLATE, ctx)
end

#create_sql_script(path, row, opts = {}) ⇒ Object



73
74
75
76
77
78
79
80
81
# File 'lib/csv2psql/generator/generator.rb', line 73

def create_sql_script(path, row, opts = {})
  output.write create_header(path, row, opts)

  TABLE_FUNCTIONS.each do |k, v|
    t = DEFAULT_OPTIONS[k]
    t = opts[k] unless opts[k].nil?
    output.write send(v, path, row, opts) if t
  end
end

#create_table(path, row, opts = {}) ⇒ Object



67
68
69
70
71
# File 'lib/csv2psql/generator/generator.rb', line 67

def create_table(path, row, opts = {})
  ctx = create_erb_context(path, row, opts)
  erb = ErbHelper.new
  erb.process(CREATE_TABLE_TEMPLATE, ctx)
end

#drop_table(path, row, opts = {}) ⇒ Object



83
84
85
86
87
# File 'lib/csv2psql/generator/generator.rb', line 83

def drop_table(path, row, opts = {})
  ctx = create_erb_context(path, row, opts)
  erb = ErbHelper.new
  erb.process(DROP_TABLE_TEMPLATE, ctx)
end

#format_row(row, opts = {}) ⇒ Object



89
90
91
92
93
94
95
96
# File 'lib/csv2psql/generator/generator.rb', line 89

def format_row(row, opts = {})
  table = opts[:table] || DEFAULT_OPTIONS[:table]

  header = get_header(row, opts)
  columns = get_columns(row, opts, header).join(', ')
  values = get_values(row, opts, header).join(', ')
  "INSERT INTO #{table}(#{columns}) VALUES(#{values});"
end

#get_columns(row, opts = {}, header = get_header(row, opts)) ⇒ Object



102
103
104
105
106
107
108
109
110
# File 'lib/csv2psql/generator/generator.rb', line 102

def get_columns(row, opts = {}, header = get_header(row, opts))
  if opts[:header]
    header.map { |h| Generator.sanitize_header(h) }
  else
    row.map.with_index do |_item, i|
      "col_#{i}"
    end
  end
end

#get_header(row, opts = {}) ⇒ Object



98
99
100
# File 'lib/csv2psql/generator/generator.rb', line 98

def get_header(row, opts = {})
  CsvHelper.get_header(row, opts)
end

#get_values(row, opts = {}, header = get_header(row, opts)) ⇒ Object



112
113
114
115
116
117
118
# File 'lib/csv2psql/generator/generator.rb', line 112

def get_values(row, opts = {}, header = get_header(row, opts))
  header.map do |h|
    value = row[h]
    sanitized_value = Generator.sanitize_value(value)
    "'#{sanitized_value}'"
  end
end

#truncate_table(path, row, opts = {}) ⇒ Object



120
121
122
123
124
# File 'lib/csv2psql/generator/generator.rb', line 120

def truncate_table(path, row, opts = {})
  ctx = create_erb_context(path, row, opts)
  erb = ErbHelper.new
  erb.process(TRUNCATE_TABLE_TEMPLATE, ctx)
end