view database.rb @ 0:1eef88068f9f tip

initial commit of maze game source
author ferencd
date Sun, 15 Sep 2019 11:46:47 +0200
parents
children
line wrap: on
line source
require 'utils'
require 'gs_logger'

#
# This class is responsible for handling all database related requests
#

class Database

  private_class_method :new

  def Database.initialize

    @@conn = PG::Connection.new(:dbname => 'mazedb', :user => 'mazedb', :password => 's321851gper')

    @@conn.prepare('ins_prep_stmt', 'insert into games (level_id, level_number,level_type) values ($1,$2,$3)')
    @@conn.prepare('sel_for_game_id_prep_stmt', 'select * from games where level_id=$1')
    @@conn.prepare('sel_level_no_prep_stmt', 'select level_number from games where level_id=$1')
    @@conn.prepare('upd_prep_stmt', 'update games set level_number=$1 where level_id=$2')

    $LOG.info 'Database initialized'
  rescue => ex
    $LOG.fatal "Exception caught while preparing the statements: #{ex.class.to_s}\n"
    exit 1
  end

  #
  # Inserts a game ID into the database
  #
  def Database.insert_game_id_to_db(game_id, lev_no, gam_type)
    @@conn.exec_prepared 'ins_prep_stmt', ["#{game_id}", lev_no, gam_type]
  rescue => ex
    $LOG.error "Exception caught: #{ex.class.to_s}\n"
    raise
  end

  #
  # Creates a valid game ID by assuring no duplicates in the database
  #
  def Database.create_valid_game_id (game_type)
    game_id = game_type + Utils.random_string(8)
    # Create a unique ID for the current level
    loop do
      begin
        res = @@conn.exec_prepared 'sel_for_game_id_prep_stmt', ["#{game_id}"]
      rescue => ex
        $LOG.error "Exception caught: #{ex.class.to_s}\n"
        raise
      end

      break if res.cmd_tuples == 0
      res.clear
      game_id = 'S' + Utils.random_string(8)

    end
    game_id
  end

  #
  # Returns the level to which this gid is associated
  #
  def Database.get_db_level_for_gid(gid)
    level_no = 1
    loop do
      begin
        res = @@conn.exec_prepared 'sel_level_no_prep_stmt', ["#{gid}"]
      rescue => ex
        $LOG.error "Exception caught: #{ex.class.to_s}\n"
        raise
      end
      return -1 if res.cmd_tuples == 0
      level_no = res[0]
      res.clear
      break
    end
    level_no['level_number'].to_i
  end

  #
  # Updates the level number for the given game ID to reflect th current state
  #
  def Database.update_level_number_for_gid(level_number, gid)
    loop do
      begin
        res = @@conn.exec_prepared 'upd_prep_stmt', [level_number, "#{gid}"]
      rescue => ex
        $LOG.error "Exception caught: #{ex.class.to_s}\n"
        raise
      end
      break if res.cmd_tuples == 0
      res.clear
      break
    end
  end

end