Skip to content

Instantly share code, notes, and snippets.

@marzdgzmn
Created January 13, 2018 11:46
Show Gist options
  • Save marzdgzmn/e1f7797df4e429cc4b190a14b2e64b26 to your computer and use it in GitHub Desktop.
Save marzdgzmn/e1f7797df4e429cc4b190a14b2e64b26 to your computer and use it in GitHub Desktop.
require 'sqlite3'
require 'singleton'
require_relative 'app_config'
class MirrorDatabase
include Singleton
include RiseMirrorApp
SYNC_STATUS_SYNCING = 'Syncing'.freeze
SYNC_STATUS_SUCCESSFUL = 'Successful'.freeze
SYNC_STATUS_FAILED = 'Failed'.freeze
SYNC_STATUS_STOP = 'Stop'.freeze
DATABASE_FILE = "#{RiseMirrorApp::DATA_DIR}/mirror.db".freeze
UPSERT = 'INSERT OR REPLACE INTO mirror '.freeze
def initialize()
RiseMirrorApp::Log.debug "Initializing MirrorDatabase"
unless File.exist?(DATABASE_FILE)
MirrorFileUtils.create_file(DATABASE_FILE)
initialize_db
end
@db = SQLite3::Database.open(DATABASE_FILE)
end
def initialize_db
SQLite3::Database.new(DATABASE_FILE) do |db|
db.execute "CREATE TABLE IF NOT EXISTS mirror(
mirror TEXT PRIMARY KEY,
last_successful_sync TEXT,
start_sync TEXT,
end_sync TEXT,
status INTEGER);"
db.execute "CREATE TABLE IF NOT EXISTS stats(
mirror TEXT,
start_sync TEXT,
number_of_files INTEGER,
number_of_files_transferred INTEGER,
total_file_size INTEGER,
total_transferred_file_size INTEGER,
download_speed INTEGER,
FOREIGN KEY(mirror) REFERENCES mirror(mirror));"
end
end
# def open_db
# if !defined?(@db) || @db.nil? || @db.closed?
# @db = SQLite3::Database.open(@db_file)
# @db.results_as_hash = true
# end
# at_exit { @db.close unless @db.closed? }
# end
def update_sync_start_status(mirror, start_sync_time)
begin
@db.execute "#{UPSERT} (mirror, last_successful_sync, start_sync, status)
VALUES ('#{mirror}',
(SELECT last_successful_sync FROM Mirror WHERE mirror = '#{mirror}'),
'#{start_sync_time}', '#{SYNC_STATUS_SYNCING}');"
rescue SQLite3::Exception => e
log "Database Exception occurred: #{e}"
log_error e
end
end
def update_sync_result_status(mirror, end_sync_time, result)
begin
last_successful_sync = if result == SYNC_STATUS_FAILED || result == SYNC_STATUS_STOP
@db.get_first_value("SELECT last_successful_sync FROM Mirror WHERE mirror = ?", mirror) #somehow this query returns an array of hash e.g. { "#{column_name}" => "#value", 0=>#{value} }
else
end_sync_time.to_s
end
start_sync = @db.get_first_value "SELECT start_sync FROM mirror WHERE mirror = ?", mirror
pst = @db.prepare "INSERT OR REPLACE into mirror (mirror, last_successful_sync, start_sync, end_sync, status)
VALUES (?,?,?,?,?)"
pst.bind_params(mirror, last_successful_sync, start_sync, end_sync_time.to_s, result)
pst.execute
rescue SQLite3::Exception => e
log "Database Exception occurred: #{e}"
log_error e
ensure
pst.close
end
end
# def save_sync_stats(mirror, number_of_files, number_of_files_transferred,
# total_file_size, total_transferred_file_size, download_speed)
# execute do
# @db.execute "INSERT INTO stats (mirror, start_sync, number_of_files, number_of_files_transferred,
# total_file_size, total_transferred_file_size, download_speed)
# VALUES ('#{mirror}',
# (SELECT start_sync FROM mirror WHERE mirror = '#{mirror}'),
# #{number_of_files},
# #{number_of_files_transferred},
# #{total_file_size},
# #{total_transferred_file_size},
# #{download_speed});"
# end
# end
def close
@db.close unless @db.closed?
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment