|
ferencd@0
|
1 require 'utils'
|
|
ferencd@0
|
2 require 'gs_logger'
|
|
ferencd@0
|
3
|
|
ferencd@0
|
4 #
|
|
ferencd@0
|
5 # This class is responsible for handling all database related requests
|
|
ferencd@0
|
6 #
|
|
ferencd@0
|
7
|
|
ferencd@0
|
8 class Database
|
|
ferencd@0
|
9
|
|
ferencd@0
|
10 private_class_method :new
|
|
ferencd@0
|
11
|
|
ferencd@0
|
12 def Database.initialize
|
|
ferencd@0
|
13
|
|
ferencd@0
|
14 @@conn = PG::Connection.new(:dbname => 'mazedb', :user => 'mazedb', :password => 's321851gper')
|
|
ferencd@0
|
15
|
|
ferencd@0
|
16 @@conn.prepare('ins_prep_stmt', 'insert into games (level_id, level_number,level_type) values ($1,$2,$3)')
|
|
ferencd@0
|
17 @@conn.prepare('sel_for_game_id_prep_stmt', 'select * from games where level_id=$1')
|
|
ferencd@0
|
18 @@conn.prepare('sel_level_no_prep_stmt', 'select level_number from games where level_id=$1')
|
|
ferencd@0
|
19 @@conn.prepare('upd_prep_stmt', 'update games set level_number=$1 where level_id=$2')
|
|
ferencd@0
|
20
|
|
ferencd@0
|
21 $LOG.info 'Database initialized'
|
|
ferencd@0
|
22 rescue => ex
|
|
ferencd@0
|
23 $LOG.fatal "Exception caught while preparing the statements: #{ex.class.to_s}\n"
|
|
ferencd@0
|
24 exit 1
|
|
ferencd@0
|
25 end
|
|
ferencd@0
|
26
|
|
ferencd@0
|
27 #
|
|
ferencd@0
|
28 # Inserts a game ID into the database
|
|
ferencd@0
|
29 #
|
|
ferencd@0
|
30 def Database.insert_game_id_to_db(game_id, lev_no, gam_type)
|
|
ferencd@0
|
31 @@conn.exec_prepared 'ins_prep_stmt', ["#{game_id}", lev_no, gam_type]
|
|
ferencd@0
|
32 rescue => ex
|
|
ferencd@0
|
33 $LOG.error "Exception caught: #{ex.class.to_s}\n"
|
|
ferencd@0
|
34 raise
|
|
ferencd@0
|
35 end
|
|
ferencd@0
|
36
|
|
ferencd@0
|
37 #
|
|
ferencd@0
|
38 # Creates a valid game ID by assuring no duplicates in the database
|
|
ferencd@0
|
39 #
|
|
ferencd@0
|
40 def Database.create_valid_game_id (game_type)
|
|
ferencd@0
|
41 game_id = game_type + Utils.random_string(8)
|
|
ferencd@0
|
42 # Create a unique ID for the current level
|
|
ferencd@0
|
43 loop do
|
|
ferencd@0
|
44 begin
|
|
ferencd@0
|
45 res = @@conn.exec_prepared 'sel_for_game_id_prep_stmt', ["#{game_id}"]
|
|
ferencd@0
|
46 rescue => ex
|
|
ferencd@0
|
47 $LOG.error "Exception caught: #{ex.class.to_s}\n"
|
|
ferencd@0
|
48 raise
|
|
ferencd@0
|
49 end
|
|
ferencd@0
|
50
|
|
ferencd@0
|
51 break if res.cmd_tuples == 0
|
|
ferencd@0
|
52 res.clear
|
|
ferencd@0
|
53 game_id = 'S' + Utils.random_string(8)
|
|
ferencd@0
|
54
|
|
ferencd@0
|
55 end
|
|
ferencd@0
|
56 game_id
|
|
ferencd@0
|
57 end
|
|
ferencd@0
|
58
|
|
ferencd@0
|
59 #
|
|
ferencd@0
|
60 # Returns the level to which this gid is associated
|
|
ferencd@0
|
61 #
|
|
ferencd@0
|
62 def Database.get_db_level_for_gid(gid)
|
|
ferencd@0
|
63 level_no = 1
|
|
ferencd@0
|
64 loop do
|
|
ferencd@0
|
65 begin
|
|
ferencd@0
|
66 res = @@conn.exec_prepared 'sel_level_no_prep_stmt', ["#{gid}"]
|
|
ferencd@0
|
67 rescue => ex
|
|
ferencd@0
|
68 $LOG.error "Exception caught: #{ex.class.to_s}\n"
|
|
ferencd@0
|
69 raise
|
|
ferencd@0
|
70 end
|
|
ferencd@0
|
71 return -1 if res.cmd_tuples == 0
|
|
ferencd@0
|
72 level_no = res[0]
|
|
ferencd@0
|
73 res.clear
|
|
ferencd@0
|
74 break
|
|
ferencd@0
|
75 end
|
|
ferencd@0
|
76 level_no['level_number'].to_i
|
|
ferencd@0
|
77 end
|
|
ferencd@0
|
78
|
|
ferencd@0
|
79 #
|
|
ferencd@0
|
80 # Updates the level number for the given game ID to reflect th current state
|
|
ferencd@0
|
81 #
|
|
ferencd@0
|
82 def Database.update_level_number_for_gid(level_number, gid)
|
|
ferencd@0
|
83 loop do
|
|
ferencd@0
|
84 begin
|
|
ferencd@0
|
85 res = @@conn.exec_prepared 'upd_prep_stmt', [level_number, "#{gid}"]
|
|
ferencd@0
|
86 rescue => ex
|
|
ferencd@0
|
87 $LOG.error "Exception caught: #{ex.class.to_s}\n"
|
|
ferencd@0
|
88 raise
|
|
ferencd@0
|
89 end
|
|
ferencd@0
|
90 break if res.cmd_tuples == 0
|
|
ferencd@0
|
91 res.clear
|
|
ferencd@0
|
92 break
|
|
ferencd@0
|
93 end
|
|
ferencd@0
|
94 end
|
|
ferencd@0
|
95
|
|
ferencd@0
|
96 end
|