ferencd@0: require 'utils' ferencd@0: require 'gs_logger' ferencd@0: ferencd@0: # ferencd@0: # This class is responsible for handling all database related requests ferencd@0: # ferencd@0: ferencd@0: class Database ferencd@0: ferencd@0: private_class_method :new ferencd@0: ferencd@0: def Database.initialize ferencd@0: ferencd@0: @@conn = PG::Connection.new(:dbname => 'mazedb', :user => 'mazedb', :password => 's321851gper') ferencd@0: ferencd@0: @@conn.prepare('ins_prep_stmt', 'insert into games (level_id, level_number,level_type) values ($1,$2,$3)') ferencd@0: @@conn.prepare('sel_for_game_id_prep_stmt', 'select * from games where level_id=$1') ferencd@0: @@conn.prepare('sel_level_no_prep_stmt', 'select level_number from games where level_id=$1') ferencd@0: @@conn.prepare('upd_prep_stmt', 'update games set level_number=$1 where level_id=$2') ferencd@0: ferencd@0: $LOG.info 'Database initialized' ferencd@0: rescue => ex ferencd@0: $LOG.fatal "Exception caught while preparing the statements: #{ex.class.to_s}\n" ferencd@0: exit 1 ferencd@0: end ferencd@0: ferencd@0: # ferencd@0: # Inserts a game ID into the database ferencd@0: # ferencd@0: def Database.insert_game_id_to_db(game_id, lev_no, gam_type) ferencd@0: @@conn.exec_prepared 'ins_prep_stmt', ["#{game_id}", lev_no, gam_type] ferencd@0: rescue => ex ferencd@0: $LOG.error "Exception caught: #{ex.class.to_s}\n" ferencd@0: raise ferencd@0: end ferencd@0: ferencd@0: # ferencd@0: # Creates a valid game ID by assuring no duplicates in the database ferencd@0: # ferencd@0: def Database.create_valid_game_id (game_type) ferencd@0: game_id = game_type + Utils.random_string(8) ferencd@0: # Create a unique ID for the current level ferencd@0: loop do ferencd@0: begin ferencd@0: res = @@conn.exec_prepared 'sel_for_game_id_prep_stmt', ["#{game_id}"] ferencd@0: rescue => ex ferencd@0: $LOG.error "Exception caught: #{ex.class.to_s}\n" ferencd@0: raise ferencd@0: end ferencd@0: ferencd@0: break if res.cmd_tuples == 0 ferencd@0: res.clear ferencd@0: game_id = 'S' + Utils.random_string(8) ferencd@0: ferencd@0: end ferencd@0: game_id ferencd@0: end ferencd@0: ferencd@0: # ferencd@0: # Returns the level to which this gid is associated ferencd@0: # ferencd@0: def Database.get_db_level_for_gid(gid) ferencd@0: level_no = 1 ferencd@0: loop do ferencd@0: begin ferencd@0: res = @@conn.exec_prepared 'sel_level_no_prep_stmt', ["#{gid}"] ferencd@0: rescue => ex ferencd@0: $LOG.error "Exception caught: #{ex.class.to_s}\n" ferencd@0: raise ferencd@0: end ferencd@0: return -1 if res.cmd_tuples == 0 ferencd@0: level_no = res[0] ferencd@0: res.clear ferencd@0: break ferencd@0: end ferencd@0: level_no['level_number'].to_i ferencd@0: end ferencd@0: ferencd@0: # ferencd@0: # Updates the level number for the given game ID to reflect th current state ferencd@0: # ferencd@0: def Database.update_level_number_for_gid(level_number, gid) ferencd@0: loop do ferencd@0: begin ferencd@0: res = @@conn.exec_prepared 'upd_prep_stmt', [level_number, "#{gid}"] ferencd@0: rescue => ex ferencd@0: $LOG.error "Exception caught: #{ex.class.to_s}\n" ferencd@0: raise ferencd@0: end ferencd@0: break if res.cmd_tuples == 0 ferencd@0: res.clear ferencd@0: break ferencd@0: end ferencd@0: end ferencd@0: ferencd@0: end