Created
January 13, 2018 11:46
-
-
Save marzdgzmn/e1f7797df4e429cc4b190a14b2e64b26 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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