NETRAVE/lib/utils/database_manager.rb
VetheonGames b3dbd0f07c Refactor and enhance database connection and data validation
- Refactored the entry-point to bypass first run setup if valid configuration information already exists.
- Enhanced data validation before inserting into the database.
- Ensured correct data placement in the appropriate tables and columns in the database.
- Added logging for database connection attempts and results.
- Fixed a bug in the speed conversion from Gbps to Mbps.
2023-06-29 18:27:08 -06:00

114 lines
3.8 KiB
Ruby

# frozen_string_literal: true
require 'sequel'
require 'mysql2'
require_relative 'system_information_gather'
require_relative '../utils/utilities'
# database manager
class DatabaseManager
include Utilities
def initialize(logger)
@db = nil
@loggman = logger
end
def test_db_connection(username, password, database) # rubocop:disable Metrics/MethodLength
@loggman.log_info('Attempting to connect to the database...')
display_alert('Attempting to connect to the database...', :info)
# Create the connection string
connection_string = "mysql2://#{username}:#{password}@localhost/#{database}"
@db = Sequel.connect(connection_string)
# Try a simple query to test the connection
@db.run 'SELECT 1'
@loggman.log_info('Successfully connected to the database.')
display_alert('Successfully connected to the database.', :info)
true
rescue Sequel::DatabaseConnectionError => e
@loggman.log_error("Failed to connect to the database: #{e.message}")
display_alert('Failed to connect to the database!', :error)
false
end
def create_system_info_table # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
if @db.nil?
# Attempt to establish a connection
username = ENV['DB_USERNAME']
password = decrypt_string_chacha20(ENV['DB_PASSWORD'], ENV['DB_SECRET_KEY'])
database = ENV['DB_DATABASE']
if test_db_connection(username, password, database)
@loggman.log_info('Successfully connected to the database.')
display_alert('Successfully connected to the Database1', :info)
else
# If the connection attempt fails, log an error and return
@loggman.log_error('Failed to connect to the database.')
return
end
end
if @db.nil?
@loggman.log_error('@db is still nil after attempting to connect to the database.')
return
end
@db.create_table? :system_info do
primary_key :id
Integer :uplink_speed
Integer :downlink_speed
Integer :total_bandwidth
end
end
def store_system_info(system_info) # rubocop:disable Metrics/MethodLength
# Check if the system_info already exists in the database
@loggman.log_info('Checking if info exists in the Database...')
existing_system_info = @db[:system_info].where(uplink_speed: system_info[:uplink_speed],
downlink_speed: system_info[:downlink_speed],
total_bandwidth: system_info[:total_bandwidth]).first
if existing_system_info
# If it exists, update it
@loggman.log_info('Info already exists. Updating instead of adding more data to the table...')
@db[:system_info].where(id: existing_system_info[:id]).update(system_info)
else
# If it doesn't exist, insert it
@loggman.log_info('Info does not exist already, inserting it...')
@db[:system_info].insert(system_info)
end
end
def create_services_table
@db.create_table? :services do
primary_key :id
String :service_name
TrueClass :status, default: true
end
end
def store_services(services) # rubocop:disable Metrics/MethodLength
services.each do |service|
# Check if the service already exists in the database
@loggman.log_info('Checking if info exists in the Database...')
existing_service = @db[:services].where(service_name: service).first
if existing_service
# If it exists, update it
@loggman.log_info('Info already exists, updating instead of adding more data to the table...')
@db[:services].where(id: existing_service[:id]).update(service_name: service, status: true)
else
# If it doesn't exist, insert it
@loggman.log_info('Info does not exist already, inserting it...')
@db[:services].insert(service_name: service, status: true)
end
end
end
end