diff --git a/T2/models.rb b/T2/models.rb index 23d507eae070b024e5e1ce7f6c84d8682c88fb3b..eabc3e3b2bea12e1056301bc9693afd3c5db3195 100644 --- a/T2/models.rb +++ b/T2/models.rb @@ -4,13 +4,14 @@ ActiveRecord::Base.establish_connection :adapter => "sqlite3", :database => "steamdb.sqlite3" class Game < ActiveRecord::Base; - has_one :price + has_one :price, dependent: :destroy belongs_to :developer - has_and_belongs_to_many :categories + has_many :category_games + has_many :categories, through: :category_games, dependent: :destroy end class Developer < ActiveRecord::Base; - has_many :games + has_many :games, dependent: :destroy end class Price < ActiveRecord::Base; @@ -18,5 +19,11 @@ class Price < ActiveRecord::Base; end class Category < ActiveRecord::Base; - has_and_belongs_to_many :games + has_many :category_games + has_many :games, through: :category_games, dependent: :destroy +end + +class CategoryGame < ActiveRecord::Base; + belongs_to :category + belongs_to :game end \ No newline at end of file diff --git a/T2/schema.rb b/T2/schema.rb index 50c94c6c80e6aa9e4387f55a43bac4612e5d5f9e..7383aa8cebd5a354a5923cdde921d5d1e519c5f4 100644 --- a/T2/schema.rb +++ b/T2/schema.rb @@ -28,7 +28,7 @@ ActiveRecord::Base.connection.create_table :categories do |t| t.text :description end -ActiveRecord::Base.connection.create_table :categories_games, id: false do |t| +ActiveRecord::Base.connection.create_table :category_games, id: false do |t| t.references :category t.references :game -end \ No newline at end of file +end diff --git a/T2/steamdb.rb b/T2/steamdb.rb index f0bb322b622bece58b52b6af2f9f5d59c11c93bf..7284e2ff4d1a3a025eaca76702f35c5dfebd05c1 100644 --- a/T2/steamdb.rb +++ b/T2/steamdb.rb @@ -1,359 +1,488 @@ require './models.rb' def is_a_string (string) - string.start_with?('"') && string.end_with?('"') ? true : false + string.start_with?('"') && string.end_with?('"') ? true : false end def is_a_integer (integer) - integer =~ /\A\d+\z/ ? true : false + integer =~ /\A\d+\z/ ? true : false end def insere(tabela, args) - error = false - case tabela - when "developers" - dev = Developer.new () - args.each do |x| - x = x.split("=") - case x[0] - when "name" - if is_a_string(x[1]) - dev.name = x[1].tr('"',''); - else - puts "Erro de SÃntaxe: Valor inválido para #{x[0]}!" - error = true - end - when "country" - if is_a_string(x[1]) - dev.country = x[1].tr('"','') - else - puts "Erro de SÃntaxe: Valor inválido para #{x[0]}!" - error = true - end - else - puts "Atributo #{x[0]} não encontrado." - error = true - end - next - end - if (!error) - dev.save - puts "Linha inserida na tabela #{tabela}." - end - when "games" - game = Game.new () - args.each do |x| - x = x.split("=") - case x[0] - when "name" - if is_a_string(x[1]) - game.name = x[1]; - else - puts "Erro de SÃntaxe: Valor inválido para #{x[0]}!" - error = true - end - when "description" - if is_a_string(x[1]) - game.description = x[1] - else - puts "Erro de SÃntaxe: Valor inválido para #{x[0]}!" - error = true - end - when "is_released" - if x[1] === "true" || x[1] === "false" - game.is_released = x[1] === "true" ? true : false - else - puts "Erro de SÃntaxe: Valor inválido para #{x[0]}!" - error = true - end - when "developer_id" - if is_a_integer(x[1]) - game.developer_id = x[1] - else - puts "Erro de SÃntaxe: Valor inválido para #{x[0]}!" - error = true - end - else - puts "Atributo #{x[0]} não encontrado." - error = true - end - next - end - if (!error) - game.save - puts "Linha inserida na tabela #{tabela}." - end - when "prices" - price = Price.new () - args.each do |x| - x = x.split("=") - case x[0] - when "price_us" - if is_a_integer(x[1]) - price.price_us = x[1] - else - puts "Erro de SÃntaxe: Valor inválido para #{x[0]}!" - error = true - end - when "price_br" - if is_a_integer(x[1]) - price.price_br = x[1] - else - puts "Erro de SÃntaxe: Valor inválido para #{x[0]}!" - error = true - end - when "price_ru" - if is_a_integer(x[1]) - price.price_ru = x[1] - else - puts "Erro de SÃntaxe: Valor inválido para #{x[0]}!" - error = true - end - when "game_id" - if is_a_integer(x[1]) - price.game_id = x[1] - else - puts "Erro de SÃntaxe: Valor inválido para #{x[0]}!" - error = true - end - else - puts "Atributo #{x[0]} não encontrado." - error = true - end - next - end - if (!error) - price.save - puts "Linha inserida na tabela #{tabela}." - end - when "categories" - category = Category.new () - args.each do |x| - x = x.split("=") - case x[0] - when "name" - if is_a_string(x[1]) - category.name = x[1]; - else - puts "Erro de SÃntaxe: Valor inválido para #{x[0]}!" - error = true - end - when "description" - if is_a_string(x[1]) - category.description = x[1] - else - puts "Erro de SÃntaxe: Valor inválido para #{x[0]}!" - error = true - end - else - puts "Atributo #{x[0]} não encontrado." - error = true - end - next - end - if (!error) - category.save - puts "Linha inserida na tabela #{tabela}." - end - when "categories_games" - category_game = CategoryGame.new () - args.each do |x| - x = x.split("=") - case x[0] - when "category_id" - if is_a_integer(x[1]) - category_game.category_id = x[1]; - else - puts "Erro de SÃntaxe: Valor inválido para #{x[0]}!" - error = true - end - when "game_id" - if is_a_integer(x[1]) - category_game.game_id = x[1] - else - puts "Erro de SÃntaxe: Valor inválido para #{x[0]}!" - error = true - end - else - puts "Atributo #{x[0]} não encontrado." - error = true - end - next - end - if (!error) - category_game.save - puts "Linha inserida na tabela #{tabela}." - end - else - puts "Tabela #{tabela} não encontrada." - end + error = false + case tabela + when "developers" + dev = Developer.new () + args.each do |x| + x = x.split("=") + case x[0] + when "name" + if is_a_string(x[1]) + dev.name = x[1].tr('"',''); + else + puts "Erro de SÃntaxe: Valor inválido para #{x[0]}!" + error = true + end + when "country" + if is_a_string(x[1]) + dev.country = x[1].tr('"','') + else + puts "Erro de SÃntaxe: Valor inválido para #{x[0]}!" + error = true + end + else + puts "Atributo #{x[0]} não encontrado." + error = true + end + next + end + if (!error) + dev.save + puts "Linha inserida na tabela #{tabela}." + end + when "games" + game = Game.new () + args.each do |x| + x = x.split("=") + case x[0] + when "name" + if is_a_string(x[1]) + game.name = x[1].tr('"','') + else + puts "Erro de SÃntaxe: Valor inválido para #{x[0]}!" + error = true + end + when "description" + if is_a_string(x[1]) + game.description = x[1].tr('"','') + else + puts "Erro de SÃntaxe: Valor inválido para #{x[0]}!" + error = true + end + when "is_released" + if x[1] === "true" || x[1] === "false" + game.is_released = x[1] === "true" ? true : false + else + puts "Erro de SÃntaxe: Valor inválido para #{x[0]}!" + error = true + end + when "developer_id" + if is_a_integer(x[1]) + game.developer_id = x[1] + else + puts "Erro de SÃntaxe: Valor inválido para #{x[0]}!" + error = true + end + else + puts "Atributo #{x[0]} não encontrado." + error = true + end + next + end + if (!error) + game.save + puts "Linha inserida na tabela #{tabela}." + end + when "prices" + price = Price.new () + args.each do |x| + x = x.split("=") + case x[0] + when "price_us" + if is_a_integer(x[1]) + price.price_us = x[1] + else + puts "Erro de SÃntaxe: Valor inválido para #{x[0]}!" + error = true + end + when "price_br" + if is_a_integer(x[1]) + price.price_br = x[1] + else + puts "Erro de SÃntaxe: Valor inválido para #{x[0]}!" + error = true + end + when "price_ru" + if is_a_integer(x[1]) + price.price_ru = x[1] + else + puts "Erro de SÃntaxe: Valor inválido para #{x[0]}!" + error = true + end + when "game_id" + if is_a_integer(x[1]) + price.game_id = x[1] + else + puts "Erro de SÃntaxe: Valor inválido para #{x[0]}!" + error = true + end + else + puts "Atributo #{x[0]} não encontrado." + error = true + end + next + end + if (!error) + price.save + puts "Linha inserida na tabela #{tabela}." + end + when "categories" + category = Category.new () + args.each do |x| + x = x.split("=") + case x[0] + when "name" + if is_a_string(x[1]) + category.name = x[1].tr('"','') + else + puts "Erro de SÃntaxe: Valor inválido para #{x[0]}!" + error = true + end + when "description" + if is_a_string(x[1]) + category.description = x[1].tr('"','') + else + puts "Erro de SÃntaxe: Valor inválido para #{x[0]}!" + error = true + end + else + puts "Atributo #{x[0]} não encontrado." + error = true + end + next + end + if (!error) + category.save + puts "Linha inserida na tabela #{tabela}." + end + when "category_games" + category_game = CategoryGame.new () + args.each do |x| + x = x.split("=") + case x[0] + when "category_id" + if is_a_integer(x[1]) + category_game.category_id = x[1]; + else + puts "Erro de SÃntaxe: Valor inválido para #{x[0]}!" + error = true + end + when "game_id" + if is_a_integer(x[1]) + category_game.game_id = x[1] + else + puts "Erro de SÃntaxe: Valor inválido para #{x[0]}!" + error = true + end + else + puts "Atributo #{x[0]} não encontrado." + error = true + end + next + end + if (!error) + category_game.save + puts "Linha inserida na tabela #{tabela}." + end + else + puts "Tabela #{tabela} não encontrada." + end end def exclui(tabela, args) - to_be_deleted = nil - error = false - case tabela - when "developers" - to_be_deleted = Developer.all - puts to_be_deleted - args.each do |x| - x = x.split("=") - case x[0] - when "name" - if is_a_string(x[1]) - to_be_deleted = to_be_deleted.select {|delete| delete.name == x[1].tr('"','')} - else - puts "Erro de SÃntaxe: Valor inválido para #{{x[0]}}" - error = true - end - when "country" - if is_a_string(x[1]) - to_be_deleted = to_be_deleted.select {|delete| delete.country == x[1].tr('"','')} - else - puts "Erro de SÃntaxe: Valor inválido para #{{x[0]}}" - error = true - end - else - puts "Atributo #{x[0]} não encontrado." - error = true - end - next - end - if to_be_deleted.length > 0 - to_be_deleted.each do |d| - d.delete - end - end - when "games" - to_be_deleted = Game.all - puts to_be_deleted - args.each do |x| - x = x.split("=") - case x[0] - when "name" - if is_a_string(x[1]) - to_be_deleted = to_be_deleted.select {|delete| delete.name == x[1].tr('"','')} - else - puts "Erro de SÃntaxe: Valor inválido para #{{x[0]}}" - error = true - end - when "description" - if is_a_string(x[1]) - to_be_deleted = to_be_deleted.select {|delete| delete.country == x[1].tr('"','')} - else - puts "Erro de SÃntaxe: Valor inválido para #{{x[0]}}" - error = true - end - when "is_released" - if x[1] === "true" || x[1] === "false" - to_be_deleted = to_be_deleted.select {|delete| (delete.is_released == (x[1] === "true" ? true : false))} - else - puts "Erro de SÃntaxe: Valor inválido para #{{x[0]}}" - error = true - end - when "description" - if is_a_integer(x[1]) - to_be_deleted = to_be_deleted.select {|delete| delete.developer_id == x[1]} - else - puts "Erro de SÃntaxe: Valor inválido para #{{x[0]}}" - error = true - end - else - puts "Atributo #{x[0]} não encontrado." - error = true - end - next - end - if to_be_deleted.length > 0 - to_be_deleted.each do |d| - d.delete - end - end - when "prices" - - when "categories" - - when "categories_games" - - else - puts "Tabela #{tabela} não encontrada." - end + to_be_deleted = nil + error = false + case tabela + when "developers" + to_be_deleted = Developer.all + args.each do |x| + x = x.split("=") + case x[0] + when "id" + if (is_a_integer(x[1])) + to_be_deleted = to_be_deleted.select {|delete| delete.id == x[1].to_i} + else + puts "Erro de SÃntaxe: Valor inválido para #{x[0]}" + error = true + end + when "name" + if is_a_string(x[1]) + to_be_deleted = to_be_deleted.select {|delete| delete.name == x[1].tr('"','')} + else + puts "Erro de SÃntaxe: Valor inválido para #{x[0]}" + error = true + end + when "country" + if is_a_string(x[1]) + to_be_deleted = to_be_deleted.select {|delete| delete.country == x[1].tr('"','')} + else + puts "Erro de SÃntaxe: Valor inválido para #{x[0]}" + error = true + end + else + puts "Atributo #{x[0]} não encontrado." + error = true + end + next + end + if to_be_deleted.length > 0 + to_be_deleted.each do |d| + d.destroy + end + end + when "games" + to_be_deleted = Game.all + args.each do |x| + x = x.split("=") + case x[0] + when "id" + if (is_a_integer(x[1])) + to_be_deleted = to_be_deleted.select {|delete| delete.id == x[1].to_i} + else + puts "Erro de SÃntaxe: Valor inválido para #{x[0]}" + error = true + end + when "name" + if is_a_string(x[1]) + to_be_deleted = to_be_deleted.select {|delete| delete.name == x[1].tr('"','')} + else + puts "Erro de SÃntaxe: Valor inválido para #{x[0]}" + error = true + end + when "description" + if is_a_string(x[1]) + to_be_deleted = to_be_deleted.select {|delete| delete.country == x[1].tr('"','')} + else + puts "Erro de SÃntaxe: Valor inválido para #{x[0]}" + error = true + end + when "is_released" + if x[1] === "true" || x[1] === "false" + to_be_deleted = to_be_deleted.select {|delete| (delete.is_released == (x[1] === "true" ? true : false))} + else + puts "Erro de SÃntaxe: Valor inválido para #{x[0]}" + error = true + end + when "developer_id" + if is_a_integer(x[1]) + to_be_deleted = to_be_deleted.select {|delete| delete.developer_id == x[1].to_i} + else + puts "Erro de SÃntaxe: Valor inválido para #{x[0]}" + error = true + end + else + puts "Atributo #{x[0]} não encontrado." + error = true + end + next + end + if to_be_deleted.length > 0 + to_be_deleted.each do |d| + d.destroy + end + end + when "prices" + to_be_deleted = Price.all + args.each do |x| + x = x.split("=") + case x[0] + when "id" + if (is_a_integer(x[1])) + to_be_deleted = to_be_deleted.select {|delete| delete.id == x[1].to_i} + else + puts "Erro de SÃntaxe: Valor inválido para #{x[0]}" + error = true + end + when "price_us" + if is_a_integer(x[1]) + to_be_deleted = to_be_deleted.select {|delete| delete.price_us == x[1].to_i} + else + puts "Erro de SÃntaxe: valor inválido para #{x[0]}" + error = true + end + when "price_br" + if is_a_integer(x[1]) + to_be_deleted = to_be_deleted.select {|delete| delete.price_br == x[1].to_i} + else + puts "Erro de SÃntaxe: valor inválido para #{x[0]}" + error = true + end + when "price_ru" + if is_a_integer(x[1]) + to_be_deleted = to_be_deleted.select {|delete| delete.price_ru == x[1].to_i} + else + puts "Erro de SÃntaxe: valor inválido para #{x[0]}" + error = true + end + when "game_id" + if is_a_integer(x[1]) + to_be_deleted = to_be_deleted.select {|delete| delete.game_id == x[1].to_i} + else + puts "Erro de SÃntaxe: valor inválido para #{x[0]}" + error = true + end + else + puts "Atributo #{x[0]} não encontrado." + error = true; + end + next + end + if to_be_deleted.length > 0 + to_be_deleted.each do |d| + d.destroy + end + end + when "categories" + to_be_deleted = Category.all + args.each do |x| + x = x.split("=") + case x[0] + when "id" + if (is_a_integer(x[1])) + to_be_deleted = to_be_deleted.select {|delete| delete.id == x[1].to_i} + else + puts "Erro de SÃntaxe: Valor inválido para #{x[0]}" + error = true + end + when "name" + if is_a_string(x[1]) + to_be_deleted = to_be_deleted.select {|delete| delete.name == x[1].tr('"','')} + else + puts "Erro de SÃntaxe: Valor inválido para #{x[0]}" + error = true + end + when "description" + if is_a_string(x[1]) + to_be_deleted = to_be_deleted.select {|delete| delete.name == x[1].tr('"','')} + else + puts "Erro de SÃntaxe: Valor inválido para #{x[0]}" + error = true + end + else + puts "Atributo #{x[0]} não encontrado." + error = true; + end + next + end + if to_be_deleted.length > 0 + to_be_deleted.each do |d| + d.destroy + end + end + when "category_games" + to_be_deleted = CategoryGame.all + args.each do |x| + x = x.split("=") + case x[0] + when "category_id" + if (is_a_integer(x[1])) + to_be_deleted = to_be_deleted.select {|delete| delete.category_id == x[1].to_i} + else + puts "Erro de SÃntaxe: Valor inválido para #{x[0]}" + error = true + end + when "game_id" + if (is_a_integer(x[1])) + to_be_deleted = to_be_deleted.select {|delete| delete.category_id == x[1].to_i} + else + puts "Erro de SÃntaxe: Valor inválido para #{x[0]}" + error = true + end + else + puts "Atributo #{x[0]} não encontrado." + error = true; + end + next + end + if to_be_deleted.length > 0 + to_be_deleted.each do |d| + d.destroy + end + end + else + puts "Tabela #{tabela} não encontrada." + end end def altera(tabela) - case tabela - when "developers" - #???????? como alterar? sintaxe do comando - when "games" + case tabela + when "developers" + #???????? como alterar? sintaxe do comando + when "games" - when "prices" + when "prices" - when "categories" + when "categories" - when "categories_games" + when "category_games" - else - puts "Tabela #{tabela} não encontrada." - end + else + puts "Tabela #{tabela} não encontrada." + end end def lista(tabela) - case tabela - when "developers" - lista = Developer.all - lista.each do |l| - puts "#{l.id}|#{l.name}|#{l.country}" - end - when "games" - lista = Game.all - lista.each do |l| - puts "#{l.id}|#{l.name}|#{l.description}|#{l.is_released}|#{l.developer_id}|#{l.price_id}" - end - when "prices" - lista = Price.all - lista.each do |l| - puts "#{l.id}|#{l.price_us}|#{l.price_br}|#{l.price_ru}|#{l.game_id}" - end - when "categories" - lista = Category.all - lista.each do |l| - puts "#{l.id}|#{l.name}|#{l.description}" - end - when "categories_games" - lista = CategoryGame.all - lista.each do |l| - puts "#{l.id}|#{l.category_id}|#{l.game_id}" - end - else - puts "Tabela #{tabela} não encontrada." - end - if (tabela) - puts "Tabela #{tabela} listada com sucesso!" - end + case tabela + when "developers" + lista = Developer.all + puts "id|name|country" + lista.each do |l| + puts "#{l.id}|#{l.name}|#{l.country}" + end + when "games" + lista = Game.all + puts "id|name|description|is_released|developer_id" + lista.each do |l| + puts "#{l.id}|#{l.name}|#{l.description}|#{l.is_released}|#{l.developer_id}" + end + when "prices" + lista = Price.all + puts "id|price_us|price_br|price_ru|game_id" + lista.each do |l| + puts "#{l.id}|#{l.price_us}|#{l.price_br}|#{l.price_ru}|#{l.game_id}" + end + when "categories" + lista = Category.all + puts "id|name|description" + lista.each do |l| + puts "#{l.id}|#{l.name}|#{l.description}" + end + when "category_games" + lista = CategoryGame.all + puts "category_id|game_id" + lista.each do |l| + puts "#{l.category_id}|#{l.game_id}" + end + else + puts "Tabela #{tabela} não encontrada." + end + if (tabela) + puts "Tabela #{tabela} listada com sucesso!" + end end puts "Olá! Seja bem vindo ao SteamDB!" while true do - args = gets.split(" ") + args = gets.split(" ") - case args[0] - when "insere" - insere(args[1],args[2..args.length-1]) - when "exclui" - exclui(args[1],args[2..args.length-1]) - when "altera" - altera(args[1],args[2..args.length-1]) - when "lista" - lista(args[1]) - when "sair" - exit() - else - puts "Comando não encontrado." - end + case args[0] + when "insere" + insere(args[1],args[2..args.length-1]) + when "exclui" + exclui(args[1],args[2..args.length-1]) + when "altera" + altera(args[1],args[2..args.length-1]) + when "lista" + lista(args[1]) + when "sair" + exit() + else + puts "Comando não encontrado." + end end # 1 x n = 1 usuário tendo vários jogos # 1 x 1 = 1 jogo só tem 1 tabela de preços (preços por paÃs) -# n x n = vários jogos tem várias categorias \ No newline at end of file +# n x n = vários jogos tem várias categorias