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