Sha256: 73da3c38ebbb5f5d8f34b504f2fad03d6e4000f898e330b53d738283a671b166
Contents?: true
Size: 1.76 KB
Versions: 1
Compression:
Stored size: 1.76 KB
Contents
# frozen_string_literal: true module Ridgepole class DSLParser def initialize(options = {}) @options = options end def parse(dsl, opts = {}) definition, execute = Context.eval(dsl, opts) check_definition(definition) [definition, execute] end private def check_definition(definition) definition.each do |table_name, attrs| check_orphan_index(table_name, attrs) check_orphan_foreign_key(table_name, attrs) check_foreign_key_without_index(table_name, attrs) end end def check_orphan_index(table_name, attrs) raise "Table `#{table_name}` to create the index is not defined: #{attrs[:indices].keys.join(',')}" if attrs[:indices] && !(attrs[:definition]) end def check_orphan_foreign_key(table_name, attrs) raise "Table `#{table_name}` to create the foreign key is not defined: #{attrs[:foreign_keys].keys.join(',')}" if attrs[:foreign_keys] && !(attrs[:definition]) end def check_foreign_key_without_index(table_name, attrs) return unless attrs[:foreign_keys] return unless attrs[:options][:options]&.include?('ENGINE=InnoDB') attrs[:foreign_keys].each do |_, foreign_key_attrs| fk_index = foreign_key_attrs[:options][:column] || "#{foreign_key_attrs[:to_table].singularize}_id" next if attrs[:indices]&.any? { |_k, v| v[:column_name].first == fk_index } next if attrs[:options][:primary_key] == fk_index Ridgepole::Logger.instance.warn(<<-MSG) [WARNING] Table `#{table_name}` has a foreign key on `#{fk_index}` column, but doesn't have any indexes on the column. Although an index will be added automatically by InnoDB, please add an index explicitly before the next operation. MSG end end end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
ridgepole-0.8.9 | lib/ridgepole/dsl_parser.rb |