Skip to content

Commit 900521b

Browse files
authored
Centralize open/closing of DB (#78)
Signed-off-by: Phil Dibowitz <phil@ipom.com>
1 parent cc604de commit 900521b

File tree

1 file changed

+48
-57
lines changed

1 file changed

+48
-57
lines changed

bin/meeting_stats

Lines changed: 48 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -131,13 +131,11 @@ def migrate_db(db)
131131
end
132132

133133
# Rename a team in the database
134-
def rename_team(db_file, config)
135-
db = SQLite3::Database.new(db_file)
134+
def rename_team(db, config)
136135
teams = db.execute('SELECT name FROM teams ORDER BY name').flatten
137136

138137
if teams.empty?
139138
log.info('No teams found in database.')
140-
db.close
141139
return
142140
end
143141

@@ -157,7 +155,6 @@ def rename_team(db_file, config)
157155

158156
unless matched_team
159157
log.error("Team '#{old_name}' not found in database.")
160-
db.close
161158
return
162159
end
163160

@@ -166,13 +163,11 @@ def rename_team(db_file, config)
166163

167164
if new_name.empty?
168165
log.error('New team name cannot be empty.')
169-
db.close
170166
return
171167
end
172168

173169
if teams.any? { |t| t.downcase == new_name.downcase }
174170
log.error("Team '#{new_name}' already exists.")
175-
db.close
176171
return
177172
end
178173

@@ -185,8 +180,6 @@ def rename_team(db_file, config)
185180
)
186181
log.info("Renamed team '#{matched_team}' to '#{new_name}'")
187182
end
188-
189-
db.close
190183
end
191184

192185
# Get last Thursday from a given date (or today)
@@ -249,9 +242,7 @@ def prompt_team_or_q(teams)
249242
return false if response.nil?
250243

251244
response = response.strip
252-
return false if %w{f finish}.include?(response.downcase)
253-
254-
exit(0) if response.downcase == 'abort'
245+
return false if %w{f finish abort}.include?(response.downcase)
255246

256247
# Check if it's an exact match for a known team (case-insensitive)
257248
matched_team = teams.find { |t| t.downcase == response.downcase }
@@ -373,7 +364,7 @@ def get_or_create_team_id(db, team_name)
373364
end
374365

375366
# Insert meeting data into the database
376-
def record_meeting_data(meeting_date, team_data, config)
367+
def record_meeting_data(db, meeting_date, team_data, config)
377368
if config.dryrun
378369
log.info('DRYRUN: Would record the following rows:')
379370
team_data.each do |row|
@@ -382,7 +373,6 @@ def record_meeting_data(meeting_date, team_data, config)
382373
return
383374
end
384375

385-
db = SQLite3::Database.new(config.db_file)
386376
team_data.each do |row|
387377
team_name = row.first
388378
team_id = get_or_create_team_id(db, team_name)
@@ -401,7 +391,6 @@ def record_meeting_data(meeting_date, team_data, config)
401391
[meeting_date.to_s, team_id] + row[1..-1],
402392
)
403393
end
404-
db.close
405394
log.info("Data recorded for #{meeting_date}.")
406395
end
407396

@@ -430,8 +419,7 @@ def format_build_status(status)
430419
end
431420

432421
# Generate Markdown table
433-
def generate_md_page(db_file)
434-
db = SQLite3::Database.new(db_file)
422+
def generate_md_page(db)
435423
meeting_dates = db.execute(
436424
'SELECT DISTINCT meeting_date FROM meeting_stats ' +
437425
'ORDER BY meeting_date DESC',
@@ -467,19 +455,16 @@ def generate_md_page(db_file)
467455
end
468456
md << ''
469457
end
470-
db.close
471458
md.join("\n")
472459
end
473460

474-
def summary(db_file)
475-
db = SQLite3::Database.new(db_file)
461+
def summary(db)
476462
data = db.execute(
477463
'SELECT ms.meeting_date, t.name, ms.present, ms.build_status' +
478464
' FROM meeting_stats ms' +
479465
' JOIN teams t ON ms.team_id = t.id' +
480466
' ORDER BY ms.meeting_date ASC',
481467
)
482-
db.close
483468

484469
# TODO: de-dupe this with generate_plots
485470
dates = data.map(&:first).uniq.reverse
@@ -501,15 +486,13 @@ def summary(db_file)
501486
end
502487
end
503488

504-
def generate_plots(db_file, img_dir)
505-
db = SQLite3::Database.new(db_file)
489+
def generate_plots(db, img_dir)
506490
data = db.execute(
507491
'SELECT ms.meeting_date, t.name, ms.present, ms.build_status' +
508492
' FROM meeting_stats ms' +
509493
' JOIN teams t ON ms.team_id = t.id' +
510494
' ORDER BY ms.meeting_date ASC',
511495
)
512-
db.close
513496

514497
dates = data.map(&:first).uniq
515498
attendance_percentages = []
@@ -648,40 +631,48 @@ log.debug("Full config: #{config.to_hash}")
648631

649632
db = initialize_db(config.db_file)
650633

651-
# Check and migrate database if needed
652-
migrate_db(db) if needs_migration?(db)
653-
654-
db.close
655-
656-
meeting_date = config.date || get_last_thursday
657-
658-
case config.mode
659-
when 'record'
660-
team_data = collect_team_data(meeting_date)
661-
record_meeting_data(meeting_date, team_data, config)
662-
when 'generate'
663-
if config.dryrun
664-
log.info('DRYRUN: Would update plots')
665-
log.info("DRYRUN: Would update #{config.output} with:")
666-
log.info(generate_md_page(config.db_file))
667-
else
668-
log.info('Updating plots...')
669-
generate_plots(config.db_file, config.image_dir)
670-
log.info("Generating #{config.output}")
671-
File.write(config.output, generate_md_page(config.db_file))
672-
end
673-
when 'generate_plot'
674-
if config.dryrun
675-
log.info('DRYRUN: Would update plots')
634+
begin
635+
# Check and migrate database if needed
636+
migrate_db(db) if needs_migration?(db)
637+
638+
meeting_date = config.date || get_last_thursday
639+
640+
case config.mode
641+
when 'record'
642+
team_data = collect_team_data(meeting_date)
643+
record_meeting_data(db, meeting_date, team_data, config)
644+
when 'generate'
645+
if config.dryrun
646+
log.info('DRYRUN: Would update plots')
647+
log.info("DRYRUN: Would update #{config.output} with:")
648+
log.info(generate_md_page(db))
649+
else
650+
log.info('Updating plots...')
651+
generate_plots(db, config.image_dir)
652+
log.info("Generating #{config.output}")
653+
File.write(config.output, generate_md_page(db))
654+
end
655+
when 'generate_plot'
656+
if config.dryrun
657+
log.info('DRYRUN: Would update plots')
658+
else
659+
generate_plots(db, config.image_dir)
660+
log.info('Plots generated: attendance.png and build_status.png')
661+
end
662+
when 'summary'
663+
summary(db)
664+
when 'rename_team'
665+
rename_team(db, config)
676666
else
677-
generate_plots(config.db_file, config.image_dir)
678-
log.info('Plots generated: attendance.png and build_status.png')
667+
log.info('Invalid mode. Use --mode record, generate, generate_plot, ' +
668+
'summary, or rename_team.')
679669
end
680-
when 'summary'
681-
summary(config.db_file)
682-
when 'rename_team'
683-
rename_team(config.db_file, config)
684-
else
685-
log.info('Invalid mode. Use --mode record, generate, generate_plot, ' +
686-
'summary, or rename_team.')
670+
rescue Interrupt
671+
log.info("\nInterrupted by user, cleaning up...")
672+
rescue StandardError => e
673+
log.error("Error: #{e.message}")
674+
log.debug(e.backtrace.join("\n"))
675+
raise
676+
ensure
677+
db.close if db
687678
end

0 commit comments

Comments
 (0)