· 8 years ago · Jan 23, 2018, 09:12 PM
1require 'sqlite3'
2require 'singleton'
3require_relative 'app_config'
4
5class MirrorDatabase
6 include Singleton
7 include RiseMirrorApp
8
9 SYNC_STATUS_SYNCING = 'Syncing'.freeze
10 SYNC_STATUS_SUCCESSFUL = 'Successful'.freeze
11 SYNC_STATUS_FAILED = 'Failed'.freeze
12 SYNC_STATUS_STOP = 'Stop'.freeze
13
14 DATABASE_FILE = "#{RiseMirrorApp::DATA_DIR}/mirror.db".freeze
15
16 UPSERT = 'INSERT OR REPLACE INTO mirror '.freeze
17
18 def initialize()
19 RiseMirrorApp::Log.debug "Initializing MirrorDatabase"
20 unless File.exist?(DATABASE_FILE)
21 MirrorFileUtils.create_file(DATABASE_FILE)
22 initialize_db
23 end
24 @db = SQLite3::Database.open(DATABASE_FILE)
25 end
26
27 def initialize_db
28 SQLite3::Database.new(DATABASE_FILE) do |db|
29 db.execute "CREATE TABLE IF NOT EXISTS mirror(
30 mirror TEXT PRIMARY KEY,
31 last_successful_sync TEXT,
32 start_sync TEXT,
33 end_sync TEXT,
34 status INTEGER);"
35 db.execute "CREATE TABLE IF NOT EXISTS stats(
36 mirror TEXT,
37 start_sync TEXT,
38 number_of_files INTEGER,
39 number_of_files_transferred INTEGER,
40 total_file_size INTEGER,
41 total_transferred_file_size INTEGER,
42 download_speed INTEGER,
43 FOREIGN KEY(mirror) REFERENCES mirror(mirror));"
44 end
45 end
46
47 # def open_db
48 # if !defined?(@db) || @db.nil? || @db.closed?
49 # @db = SQLite3::Database.open(@db_file)
50 # @db.results_as_hash = true
51 # end
52 # at_exit { @db.close unless @db.closed? }
53 # end
54
55 def update_sync_start_status(mirror, start_sync_time)
56 begin
57 @db.execute "#{UPSERT} (mirror, last_successful_sync, start_sync, status)
58 VALUES ('#{mirror}',
59 (SELECT last_successful_sync FROM Mirror WHERE mirror = '#{mirror}'),
60 '#{start_sync_time}', '#{SYNC_STATUS_SYNCING}');"
61 rescue SQLite3::Exception => e
62 log "Database Exception occurred: #{e}"
63 log_error e
64 end
65 end
66
67 def update_sync_result_status(mirror, end_sync_time, result)
68 begin
69
70 last_successful_sync = if result == SYNC_STATUS_FAILED || result == SYNC_STATUS_STOP
71 @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} }
72 else
73 end_sync_time.to_s
74 end
75 start_sync = @db.get_first_value "SELECT start_sync FROM mirror WHERE mirror = ?", mirror
76 pst = @db.prepare "INSERT OR REPLACE into mirror (mirror, last_successful_sync, start_sync, end_sync, status)
77 VALUES (?,?,?,?,?)"
78 pst.bind_params(mirror, last_successful_sync, start_sync, end_sync_time.to_s, result)
79 pst.execute
80 rescue SQLite3::Exception => e
81 log "Database Exception occurred: #{e}"
82 log_error e
83 ensure
84 pst.close
85 end
86 end
87
88 # def save_sync_stats(mirror, number_of_files, number_of_files_transferred,
89 # total_file_size, total_transferred_file_size, download_speed)
90 # execute do
91 # @db.execute "INSERT INTO stats (mirror, start_sync, number_of_files, number_of_files_transferred,
92 # total_file_size, total_transferred_file_size, download_speed)
93 # VALUES ('#{mirror}',
94 # (SELECT start_sync FROM mirror WHERE mirror = '#{mirror}'),
95 # #{number_of_files},
96 # #{number_of_files_transferred},
97 # #{total_file_size},
98 # #{total_transferred_file_size},
99 # #{download_speed});"
100 # end
101 # end
102
103 def close
104 @db.close unless @db.closed?
105 end
106
107end