lib/baza/revision.rb in baza-0.0.19 vs lib/baza/revision.rb in baza-0.0.20

- old
+ new

@@ -1,6 +1,6 @@ -#This class takes a database-schema from a hash and runs it against the database. It then checks that the database matches the given schema. +# This class takes a database-schema from a hash and runs it against the database. It then checks that the database matches the given schema. # #===Examples # db = Baza::Db.new(type: :sqlite3, path: "test_db.sqlite3") # schema = { # "tables" => { @@ -29,52 +29,52 @@ end INIT_DB_ALLOWED_ARGS = [:db, :schema, :tables_cache, :debug] INIT_DB_SCHEMA_ALLOWED_ARGS = [:tables] INIT_DB_TABLE_ALLOWED_ARGS = [:columns, :indexes, :rows, :renames] - #This initializes a database-structure and content based on a schema-hash. + # This initializes a database-structure and content based on a schema-hash. #===Examples # dbrev = Baza::Revision.new # dbrev.init_db("db" => db_obj, "schema" => schema_hash) def init_db(args) - args.each do |key, val| + args.each do |key, _val| raise "Invalid key: '#{key}' (#{key.class.name})." unless INIT_DB_ALLOWED_ARGS.include?(key) end schema = args[:schema] db = args[:db] raise "No 'db' was given." unless db - schema.each do |key, val| + schema.each do |key, _val| raise "Invalid key for schema: '#{key}' (#{key.class.name})." unless INIT_DB_SCHEMA_ALLOWED_ARGS.include?(key) end - #Check for normal bugs and raise apropiate error. + # Check for normal bugs and raise apropiate error. raise "'schema' argument was not a Hash: '#{schema.class.name}'." unless schema.is_a?(Hash) - raise "No tables given." unless schema.has_key?(:tables) + raise "No tables given." unless schema.key?(:tables) - #Cache tables to avoid constant reloading. + # Cache tables to avoid constant reloading. if !args.key?(:tables_cache) || args[:tables_cache] puts "Caching tables-list." if args[:debug] tables = db.tables.list else puts "Skipping tables-cache." if args[:debug] end schema[:tables].each do |table_name, table_data| - table_data.each do |key, val| + table_data.each do |key, _val| raise "Invalid key: '#{key}' (#{key.class.name})." unless INIT_DB_TABLE_ALLOWED_ARGS.include?(key) end begin begin table_name = table_name.to_sym puts "Getting table-object for table: '#{table_name}'." if args[:debug] table_obj = db.tables[table_name] - #Cache indexes- and column-objects to avoid constant reloading. + # Cache indexes- and column-objects to avoid constant reloading. cols = table_obj.columns indexes = table_obj.indexes if table_data[:columns] first_col = true @@ -84,24 +84,24 @@ col_obj = table_obj.column(col_name) col_str = "#{table_name}.#{col_obj.name}" type = col_data[:type].to_sym dochange = false - if !first_col and !col_data[:after] - #Try to find out the previous column - if so we can set "after" which makes the column being created in the right order as defined. - if !col_data.has_key?(:after) + if !first_col && !col_data[:after] + # Try to find out the previous column - if so we can set "after" which makes the column being created in the right order as defined. + unless col_data.key?(:after) prev_no = table_data[:columns].index(col_data) - if prev_no != nil and prev_no != 0 - prev_no = prev_no - 1 + if prev_no.nil? && prev_no != 0 + prev_no -= 1 prev_col_data = table_data[:columns][prev_no] col_data[:after] = prev_col_data[:name] end end actual_after = nil set_next = false - cols.each do |col_name, col_iter| + cols.each do |_col_name, col_iter| if col_iter.name == col_obj.name break else actual_after = col_iter.name end @@ -111,53 +111,53 @@ print "Changing '#{col_str}' after from '#{actual_after}' to '#{col_data[:after]}'.\n" if args[:debug] dochange = true end end - #BUGFIX: When using SQLite3 the primary-column or a autoincr-column may never change type from int... This will break it! - if db.opts[:type] == "sqlite3" and col_obj.type.to_s == "int" and (col_data[:primarykey] or col_data[:autoincr]) and db.int_types.index(col_data[:type].to_s) + # BUGFIX: When using SQLite3 the primary-column or a autoincr-column may never change type from int... This will break it! + if db.opts[:type] == "sqlite3" && col_obj.type.to_s == "int" && (col_data[:primarykey] || col_data[:autoincr]) && db.int_types.index(col_data[:type].to_s) type = :int end - if type and col_obj.type.to_s != type + if type && col_obj.type.to_s != type print "Type mismatch on #{col_str}: #{col_data[:type]}, #{col_obj.type}\n" if args[:debug] dochange = true end - if col_data.has_key?(:primarykey) and col_obj.primarykey? != col_data[:primarykey] + if col_data.key?(:primarykey) && col_obj.primarykey? != col_data[:primarykey] print "Primary-key mismatch for #{col_str}: #{col_data[:primarykey]}, #{col_obj.primarykey?}\n" if args[:debug] dochange = true end - if col_data.has_key?(:autoincr) and col_obj.autoincr? != col_data[:autoincr] + if col_data.key?(:autoincr) && col_obj.autoincr? != col_data[:autoincr] print "Auto-increment mismatch for #{col_str}: #{col_data[:autoincr]}, #{col_obj.autoincr?}\n" if args[:debug] dochange = true end - if col_data.has_key?(:maxlength) and col_obj.maxlength.to_s != col_data[:maxlength].to_s + if col_data.key?(:maxlength) && col_obj.maxlength.to_s != col_data[:maxlength].to_s print "Maxlength mismatch on #{col_str}: #{col_data[:maxlength]}, #{col_obj.maxlength}\n" if args[:debug] dochange = true end - if col_data.has_key?(:null) and col_obj.null?.to_s != col_data[:null].to_s + if col_data.key?(:null) && col_obj.null?.to_s != col_data[:null].to_s print "Null mismatch on #{col_str}: #{col_data[:null]}, #{col_obj.null?}\n" if args[:debug] dochange = true end - if col_data.has_key?(:default) and col_obj.default.to_s != col_data[:default].to_s + if col_data.key?(:default) && col_obj.default.to_s != col_data[:default].to_s print "Default mismatch on #{col_str}: #{col_data[:default]}, #{col_obj.default}\n" if args[:debug] dochange = true end - if col_data.has_key?(:comment) and col_obj.respond_to?(:comment) and col_obj.comment.to_s != col_data[:comment].to_s + if col_data.key?(:comment) && col_obj.respond_to?(:comment) && col_obj.comment.to_s != col_data[:comment].to_s print "Comment mismatch on #{col_str}: #{col_data[:comment]}, #{col_obj.comment}\n" if args[:debug] dochange = true end - if col_data.is_a?(Hash) and col_data[:on_before_alter] - callback_data = col_data[:on_before_alter].call(:db => db, :table => table_obj, :col => col_obj, :col_data => col_data) - if callback_data and callback_data[:action] + if col_data.is_a?(Hash) && col_data[:on_before_alter] + callback_data = col_data[:on_before_alter].call(db: db, table: table_obj, col: col_obj, col_data: col_data) + if callback_data && callback_data[:action] if callback_data[:action] == :retry raise Baza::Errors::Retry end end end @@ -166,44 +166,44 @@ col_data_change = col_data.clone col_data_change.delete(:renames) col_obj.change(col_data_change) - #Change has been made - update cache. + # Change has been made - update cache. cols = table_obj.columns end first_col = false - rescue Errno::ENOENT => e + rescue Baza::Errors::ColumnNotFound => e print "Column not found: #{table_obj.name}.#{col_data[:name]}.\n" if args[:debug] - if col_data.has_key?(:renames) - raise "'renames' was not an array for column '#{table_obj.name}.#{col_data[:name]}'." if !col_data[:renames].is_a?(Array) + if col_data.key?(:renames) + raise "'renames' was not an array for column '#{table_obj.name}.#{col_data[:name]}'." unless col_data[:renames].is_a?(Array) rename_found = false - col_data[:renames].each do |col_name| + col_data[:renames].each do |col_name_rename| begin - col_rename = table_obj.column(col_name) - rescue Errno::ENOENT => e + col_rename = table_obj.column(col_name_rename) + rescue Baza::Errors::ColumnNotFound next end - print "Rename #{table_obj.name}.#{col_name} to #{table_obj.name}.#{col_data[:name]}\n" if args[:debug] - if col_data.is_a?(Hash) and col_data[:on_before_rename] - col_data[:on_before_rename].call(:db => db, :table => table_obj, :col => col_rename, :col_data => col_data) + print "Rename #{table_obj.name}.#{col_name_rename} to #{table_obj.name}.#{col_data[:name]}\n" if args[:debug] + if col_data.is_a?(Hash) && col_data[:on_before_rename] + col_data[:on_before_rename].call(db: db, table: table_obj, col: col_rename, col_data: col_data) end col_data_change = col_data.clone col_data_change.delete(:renames) col_rename.change(col_data_change) - #Change has been made - update cache. + # Change has been made - update cache. cols = table_obj.columns - if col_data.is_a?(Hash) and col_data[:on_after_rename] - col_data[:on_after_rename].call(:db => db, :table => table_obj, :col => col_rename, :col_data => col_data) + if col_data.is_a?(Hash) && col_data[:on_after_rename] + col_data[:on_after_rename].call(db: db, table: table_obj, col: col_rename, col_data: col_data) end rename_found = true break end @@ -217,145 +217,145 @@ col_data_create = col_data col_data_create.delete(:renames) col_obj = table_obj.create_columns([col_data]) - #Change has been made - update cache. + # Change has been made - update cache. cols = table_obj.columns - oncreated.call(:db => db, :table => table_obj) if oncreated + oncreated.call(db: db, table: table_obj) if oncreated end end end if table_data[:columns_remove] table_data[:columns_remove].each do |column_name, column_data| begin col_obj = table_obj.column(column_name) - rescue Errno::ENOENT => e + rescue Baza::Errors::ColumnNotFound => e next end - column_data[:callback].call if column_data.is_a?(Hash) and column_data[:callback] + column_data[:callback].call if column_data.is_a?(Hash) && column_data[:callback] col_obj.drop end end if table_data[:indexes] table_data[:indexes].each do |index_data| - if index_data.is_a?(String) or index_data.is_a?(Symbol) - index_data = {:name => index_data, :columns => [index_data]} + if index_data.is_a?(String) || index_data.is_a?(Symbol) + index_data = {name: index_data, columns: [index_data]} end begin index_obj = table_obj.index(index_data[:name]) rewrite_index = false - rewrite_index = true if index_data.key?(:unique) and index_data[:unique] != index_obj.unique? + rewrite_index = true if index_data.key?(:unique) && index_data[:unique] != index_obj.unique? if rewrite_index index_obj.drop table_obj.create_indexes([index_data]) end - rescue Errno::ENOENT => e + rescue Baza::Errors::IndexNotFound => e table_obj.create_indexes([index_data]) end end end if table_data[:indexes_remove] table_data[:indexes_remove].each do |index_name, index_data| begin index_obj = table_obj.index(index_name) - rescue Errno::ENOENT => e + rescue Baza::Errors::IndexNotFound => e next end - if index_data.is_a?(Hash) and index_data[:callback] + if index_data.is_a?(Hash) && index_data[:callback] index_data[:callback].call if index_data[:callback] end index_obj.drop end end - rows_init(:db => db, :table => table_obj, :rows => table_data[:rows]) if table_data and table_data[:rows] - rescue Errno::ENOENT => e + rows_init(db: db, table: table_obj, rows: table_data[:rows]) if table_data && table_data[:rows] + rescue Baza::Errors::TableNotFound => e puts "Table did not exist: '#{table_name}'." if args[:debug] if table_data.key?(:renames) table_data[:renames].each do |table_name_rename| begin puts "Renaming table: '#{table_name_rename}' to '#{table_name}'." if args[:debug] table_rename = db.tables[table_name_rename.to_sym] table_rename.rename(table_name) raise Baza::Errors::Retry - rescue Errno::ENOENT + rescue Baza::Errors::TableNotFound next end end end - if !table_data.key?(:columns) + unless table_data.key?(:columns) puts "Notice: Skipping creation of '#{table_name}' because no columns were given in hash." if args[:debug] next end if table_data[:on_create] - table_data[:on_create].call(:db => db, :table_name => table_name, :table_data => table_data) + table_data[:on_create].call(db: db, table_name: table_name, table_data: table_data) end table_data_create = table_data.clone table_data_create.delete(:rows) puts "Creating table: '#{table_name}'." if args[:debug] db.tables.create(table_name, table_data_create) table_obj = db.tables[table_name.to_sym] if table_data[:on_create_after] - table_data[:on_create_after].call(:db => db, :table_name => table_name, :table_data => table_data) + table_data[:on_create_after].call(db: db, table_name: table_name, table_data: table_data) end - rows_init(:db => db, :table => table_obj, :rows => table_data[:rows]) if table_data[:rows] + rows_init(db: db, table: table_obj, rows: table_data[:rows]) if table_data[:rows] end rescue Baza::Errors::Retry retry end end if schema[:tables_remove] schema[:tables_remove].each do |table_name, table_data| begin table_obj = db.tables[table_name.to_sym] - table_data[:callback].call(:db => db, :table => table_obj) if table_data.is_a?(Hash) and table_data[:callback] + table_data[:callback].call(db: db, table: table_obj) if table_data.is_a?(Hash) && table_data[:callback] table_obj.drop - rescue Errno::ENOENT => e + rescue Baza::Errors::TableNotFound => e next end end end - #Free cache. + # Free cache. tables.clear if tables tables = nil end - private +private ROWS_INIT_ALLOWED_ARGS = [:db, :table, :rows] - #This method checks if certain rows are present in a table based on a hash. + # This method checks if certain rows are present in a table based on a hash. def rows_init(args) - args.each do |key, val| + args.each do |key, _val| raise "Invalid key: '#{key}' (#{key.class.name})." unless ROWS_INIT_ALLOWED_ARGS.include?(key) end db = args[:db] table = args[:table] - raise "No db given." if !db - raise "No table given." if !table + raise "No db given." unless db + raise "No table given." unless table args[:rows].each do |row_data| if row_data[:find_by] find_by = row_data[:find_by] elsif row_data[:data] @@ -366,11 +366,11 @@ rows_found = 0 args[:db].select(table.name, find_by) do |d_rows| rows_found += 1 - if Knj::ArrayExt.hash_diff?(Knj::ArrayExt.hash_sym(row_data[:data]), Knj::ArrayExt.hash_sym(d_rows), {"h2_to_h1" => false}) + if Knj::ArrayExt.hash_diff?(Knj::ArrayExt.hash_sym(row_data[:data]), Knj::ArrayExt.hash_sym(d_rows), "h2_to_h1" => false) print "Data was not right - updating row: #{JSON.generate(row_data[:data])}\n" if args[:debug] args[:db].update(table.name, row_data[:data], d_rows) end end @@ -378,6 +378,6 @@ print "Inserting row: #{JSON.generate(row_data[:data])}\n" if args[:debug] table.insert(row_data[:data]) end end end -end \ No newline at end of file +end