class Blufin::YmlSqlTemplateWriter
Public Class Methods
new(site, schema_data)
click to toggle source
@return void
# File lib/core/yml_writers/yml_sql_template_writer.rb, line 6 def initialize(site, schema_data) @schema_data = schema_data raise RuntimeError, 'Could not find valid @schema_data.' if @schema_data.nil? || !@schema_data.is_a?(Hash) @site = Blufin::SiteResolver::validate_site(site) @site_name = Blufin::SiteResolver::get_site_name(@site) @site_path = Blufin::SiteResolver::get_site_location(@site) @site_domain = Blufin::SiteResolver::get_site_domain(@site) @site_location = "#{Blufin::SiteResolver::get_site_location(@site)}/" @yml_enum_scanner = Blufin::ScannerJavaEnums.new(@site) # Wipe out all previous files. Blufin::YmlSchemaValidator::VALID_SCHEMAS_GENERATE.each do |schema| path_to_wipe_out = "#{get_template_path(schema)}/#{schema}" if Blufin::Files::path_exists(path_to_wipe_out) if Blufin::Files::get_files_in_dir(path_to_wipe_out).any? Blufin::Terminal::command('rm *', path_to_wipe_out, false, false) end end end end
Public Instance Methods
get_data_path(schema)
click to toggle source
@return Array
# File lib/core/yml_writers/yml_sql_template_writer.rb, line 208 def get_data_path(schema) if schema == Blufin::YmlSchemaValidator::CONFIG || schema == Blufin::YmlSchemaValidator::MOCK path_to_blufin_ruby = Blufin::Config::get_path('Paths', 'BlufinRuby') return nil if path_to_blufin_ruby.nil? "#{path_to_blufin_ruby}/#{App::Opt::BLUFIN}#{App::Opt::OPT_PATH_SQL}/data" else "#{get_base_path(@site)}/#{Blufin::Site::PATH_TO_SQL_DATA}" end end
get_structure_files(schema)
click to toggle source
@return Array
# File lib/core/yml_writers/yml_sql_template_writer.rb, line 220 def get_structure_files(schema) if schema == Blufin::YmlSchemaValidator::CONFIG path_to_blufin_ruby = Blufin::Config::get_path('Paths', 'BlufinRuby') return nil if path_to_blufin_ruby.nil? structure_file = "#{path_to_blufin_ruby}/#{App::Opt::BLUFIN}#{App::Opt::OPT_PATH_SQL}/structure/#{App::MySQL::CONFIG_FILENAME_STRUCTURE}" foreign_key_file = "#{path_to_blufin_ruby}/#{App::Opt::BLUFIN}#{App::Opt::OPT_PATH_SQL}/structure/#{App::MySQL::CONFIG_FILENAME_STRUCTURE_FKS}" elsif schema == Blufin::YmlSchemaValidator::MOCK path_to_blufin_ruby = Blufin::Config::get_path('Paths', 'BlufinRuby') return nil if path_to_blufin_ruby.nil? structure_file = "#{path_to_blufin_ruby}/#{App::Opt::BLUFIN}#{App::Opt::OPT_PATH_SQL}/structure/#{App::MySQL::MOCK_FILENAME_STRUCTURE}" foreign_key_file = "#{path_to_blufin_ruby}/#{App::Opt::BLUFIN}#{App::Opt::OPT_PATH_SQL}/structure/#{App::MySQL::MOCK_FILENAME_STRUCTURE_FKS}" else structure_file = "#{get_base_path(@site)}/#{Blufin::Site::PATH_TO_SQL_STRUCTURE}/#{Blufin::SiteResolver::get_site_name(@site)}-#{schema}.sql" foreign_key_file = "#{get_base_path(@site)}/#{Blufin::Site::PATH_TO_SQL_STRUCTURE}/#{Blufin::SiteResolver::get_site_name(@site)}-fks-#{schema}.sql" end [structure_file, foreign_key_file] end
get_template_path(schema)
click to toggle source
@return Array
# File lib/core/yml_writers/yml_sql_template_writer.rb, line 197 def get_template_path(schema) if schema == Blufin::YmlSchemaValidator::CONFIG || schema == Blufin::YmlSchemaValidator::MOCK path_to_blufin_ruby = Blufin::Config::get_path('Paths', 'BlufinRuby') return nil if path_to_blufin_ruby.nil? "#{path_to_blufin_ruby}/#{App::Opt::BLUFIN}#{App::Opt::OPT_PATH_SQL}/templates" else "#{get_base_path(@site)}/#{Blufin::Site::PATH_TO_SQL_TEMPLATES}" end end
write()
click to toggle source
@return void
# File lib/core/yml_writers/yml_sql_template_writer.rb, line 33 def write valid_sql_data_files = [] @schema_data.each do |schema, schema_data| # This filters out the "mock" schema used for testing. next if schema == Blufin::YmlSchemaValidator::MOCK schema_data.each do |table, table_data| if table_data.length > 0 @mock_data = [] @column_names = [] fkey_ref_last = '' template_path = get_template_path(schema) data_path = get_data_path(schema) # Skip if user doesn't have the PATH_TO_RUBY config value. next if template_path.nil? || data_path.nil? if schema == Blufin::YmlSchemaValidator::CONFIG site_schema = App::MySQL::CONFIG_SCHEMA elsif schema == Blufin::YmlSchemaValidator::MOCK site_schema = App::MySQL::MOCK_SCHEMA else site_schema = "#{@site_name}-#{schema}" end table_data.each do |column_name, column_data| # Skip Placeholders next if column_name =~ /\A(#{Blufin::YmlSchemaValidator::VALID_SCHEMAS_REGEX})\.[a-z_]+\[\]\z/ || column_name =~ /\A(#{Blufin::YmlSchemaValidator::VALID_SCHEMAS_REGEX})\.[a-z_]+\z/ @type = column_data[Blufin::YmlSchemaValidator::TYPE] # Skip Transient Objects. next if [Blufin::ScannerJavaEmbeddedObjects::OBJECT].include?(@type) # Create FKEY LINK tables entry templates if column_name =~ /\A[a-z_.]+\[#{Blufin::YmlSchemaValidator::LINK}\]/ target_table = column_name.dup.gsub("[#{Blufin::YmlSchemaValidator::LINK}]", '').split('.') table_name = "#{table}_to_#{target_table[1]}_link" fk_link_lines = [] fk_link_lines << "INSERT IGNORE INTO `#{site_schema}`.#{table_name} (" fk_link_lines << " `#{table}_id`," fk_link_lines << " `#{target_table[1]}_id`" fk_link_lines << ') VALUES (' fk_link_lines << " '0'," fk_link_lines << " '0'" fk_link_lines << ');' # Write template file. full_file_path = "#{template_path}/#{schema}/template-#{table_name.gsub('_', '-')}.sql" Blufin::Files.write_file(full_file_path, fk_link_lines) # Write data file. sql_data_path = "#{data_path}/#{schema}/" sql_data_file = "data-#{table_name.gsub('_', '-')}.sql" sql_data_file_final = "#{sql_data_path}#{sql_data_file}" Blufin::Files.write_file(sql_data_file_final, ['']) unless Blufin::Files::file_exists(sql_data_file_final) Blufin::Terminal::command("git add #{sql_data_file_final}", get_base_path(@site), false, false) if schema != Blufin::YmlSchemaValidator::CONFIG && schema != Blufin::YmlSchemaValidator::MOCK valid_sql_data_files << sql_data_file_final next end fkey_ref = column_data[Blufin::YmlSchemaValidator::FKEY].nil? ? ',' : ", -- FK: #{column_data[Blufin::YmlSchemaValidator::FKEY]}" fkey_ref_last = fkey_ref.dup fkey_ref_last[0] = '' if @type == Blufin::YmlSchemaValidator::TYPE_BOOLEAN @mock_data << " 0#{fkey_ref}" elsif @type == Blufin::YmlSchemaValidator::TYPE_DATE # MUST BE BEFORE DATETIME TYPES @mock_data << " '#{Blufin::DateTimeUtils::now('%Y-%m-%d')}'#{fkey_ref}" elsif Blufin::YmlSchemaValidator::DATETIME_TYPES.include?(@type) @mock_data << " '#{Blufin::DateTimeUtils::now('%Y-%m-%d %H:%I:%S')}'#{fkey_ref}" elsif @type =~ Blufin::YmlSchemaValidator::REGEX_DECIMAL @mock_data << " 0.00#{fkey_ref}" elsif Blufin::YmlSchemaValidator::INT_TYPES.include?(@type) || @type == Blufin::YmlSchemaValidator::TYPE_INT_TINY || @type == Blufin::YmlSchemaValidator::TYPE_INT_SMALL || @type == Blufin::YmlSchemaValidator::TYPE_INT_BIG @mock_data << " 0#{fkey_ref}" elsif @type == Blufin::YmlSchemaValidator::TYPE_INT_BIG @mock_data << " 0#{fkey_ref}" elsif Blufin::YmlSchemaValidator::TEXT_TYPES.include?(@type) @mock_data << " '#{column_name.upcase}'#{fkey_ref}" elsif @type =~ Blufin::YmlSchemaValidator::REGEX_ENUM @mock_data << " '#{Blufin::YmlCommon::enum_value_extractor(@type, @site).join('|')}'#{fkey_ref}" elsif @type =~ Blufin::YmlSchemaValidator::REGEX_ENUM_CUSTOM @mock_data << " '#{@yml_enum_scanner.get_enum_custom_values_for(Blufin::YmlCommon::enum_name_extractor(@type)).join('|')}'#{fkey_ref}" elsif @type =~ Blufin::YmlSchemaValidator::REGEX_ENUM_SYSTEM @mock_data << " '#{@yml_enum_scanner.get_enum_system_values_for(Blufin::YmlCommon::enum_name_extractor(@type)).join('|')}'#{fkey_ref}" elsif @type =~ Blufin::YmlSchemaValidator::REGEX_VARCHAR @mock_data << " '#{column_name.upcase}'#{fkey_ref}" else raise RuntimeError, "Unrecognized type: #{@type}" end @column_names << " `#{column_name}`#{fkey_ref}" end # Remove the last comma (',') from SQL insert statements -- @mock_data if @mock_data[@mock_data.length - 1] =~ /,\s--\sFK/ @mock_data[@mock_data.length - 1].gsub!(/,\s--\sFK/, ' -- FK') else @mock_data[@mock_data.length - 1] = @mock_data[@mock_data.length - 1][0...-1] end # Remove the last comma (',') from SQL insert statements -- @@column_names if @column_names[@column_names.length - 1] =~ /,\s--\sFK/ @column_names[@column_names.length - 1].gsub!(/,\s--\sFK/, ' -- FK') else @column_names[@column_names.length - 1] = @column_names[@column_names.length - 1][0...-1] end @final_lines = [] @final_lines << "INSERT IGNORE INTO `#{site_schema}`.#{table} (" @final_lines.push(*@column_names) @final_lines << ') VALUES (' @final_lines.push(*@mock_data) @final_lines << ');' full_file_path = "#{template_path}/#{schema}/template-#{table.gsub('_', '-')}.sql" Blufin::Files.write_file(full_file_path, @final_lines).gsub(@site_location, '') # Create Data file if it doesn't exist. sql_data_path = "#{data_path}/#{schema}/" sql_data_file = "data-#{table.gsub('_', '-')}.sql" sql_data_file_final = "#{sql_data_path}#{sql_data_file}" Blufin::YmlCommon::validate_file_and_contents(@site, sql_data_file_final, [], [], nil, schema != Blufin::YmlSchemaValidator::CONFIG) && schema != Blufin::YmlSchemaValidator::MOCK valid_sql_data_files << sql_data_file_final end end end data_path_config = get_data_path(Blufin::YmlSchemaValidator::CONFIG) data_path_mock = get_data_path(Blufin::YmlSchemaValidator::MOCK) # Check for ROGUE file(s). all_data_files = [] all_data_files = all_data_files + Blufin::Files::get_files_in_dir(get_data_path(Blufin::YmlSchemaValidator::APP)) all_data_files = all_data_files + Blufin::Files::get_files_in_dir(get_data_path(Blufin::YmlSchemaValidator::COMMON)) all_data_files = all_data_files + Blufin::Files::get_files_in_dir(data_path_config) unless data_path_config.nil? all_data_files = all_data_files + Blufin::Files::get_files_in_dir(data_path_mock) unless data_path_mock.nil? all_data_files.uniq! all_data_files.each do |existing_data_file| Blufin::Terminal::output("Found rogue file: #{Blufin::Terminal::format_directory(existing_data_file)}", Blufin::Terminal::MSG_WARNING) unless valid_sql_data_files.include?(existing_data_file) end end