· 9 years ago · Jun 11, 2017, 08:22 AM
1# ruby fill_database.rb dbname user pass hours
2# ruby fill_database.rb ARGV[0] ARGV[1] ARGV[2] ARGV[3]
3# ruby fill_database.rb 'test' 'root' 'шакуувщь' 43800
4
5require 'rubygems'
6require 'mysql'
7
8
9# Зве:
10# Читаем параметры. Ðтот код напиÑан так Ñ Ð´Ð²ÑƒÐ¼Ñ Ñ†ÐµÐ»Ñми:
11# 1. объÑÑнить тому, кто читает Ñкрипт, что значит каждый параметр
12# 2. Ñделать минимальную проверку параметров (здеÑÑŒ Ñто нужно)
13
14puts "Usage: ruby fill_database.rb dbname user password hours_to_fill"
15
16dbname = ARGV[0] or raise(ArgumentError, "Database name empty")
17user = ARGV[1] or raise(ArgumentError, "User name empty")
18password = ARGV[2] or raise(ArgumentError, "Password empty")
19hours = ARGV[3].to_i
20hours.zero? and raise(ArgumentError, "Number of hours to fill is zero")
21
22
23# Connect to the MySQL server
24
25db = Mysql.new('localhost', user, password)
26
27# Зве: проверка результата на empty? более наглÑдна
28#db.query("CREATE DATABASE #{ARGV[0]}") if db.list_dbs(ARGV[0]) != [ARGV[0]]
29db.query("CREATE DATABASE #{dbname}") if db.list_dbs(dbname).empty?
30
31db.real_connect('localhost', ARGV[1], ARGV[2], ARGV[0])
32
33# Create tables
34
35db.query("DROP TABLE IF EXISTS metrics")
36
37db.query(%Q{
38CREATE TABLE metrics
39(
40 id INT NOT NULL AUTO_INCREMENT,
41 timestamp DATETIME NULL ,
42 metrics VARCHAR(15) NULL ,
43 value INT NULL ,
44 PRIMARY KEY (id)
45)
46})
47
48# Calculates first timestamp
49# t_start = Time.new — Зве: в Руби нет никакой необходимоÑти инициализировать переменные заранее
50
51# Зве: Ð·Ñ€Ñ ÑƒÑложнÑешь, приходитÑÑ Ð´Ð¾Ð»Ð³Ð¾ вчитыватьÑÑ, чтобы понÑть, что ты вÑего лишь пыталÑÑ
52# получить целое чиÑло чаÑов. Ð’ поÑтановке задачи ничего про Ñто не было :)
53# t_start = t_start - (t_start.min * 60) - t_start.sec - ((ARGV[3].to_i - 1) * 3600)
54t_start = Time.now - hours * 3600
55# Ðо на Ñамом деле t_start нам вообще не нужен, доÑтаточно текущего времени :)
56
57# Suppresses automatic result set generation
58db.query_with_result = false
59
60now = Time.now
61
62METRICS = ['Mentioners', 'Followers', 'Readers', # real metrics
63
64'Engagement', 'Participation rate', 'Ratio of comments per post', 'Share of voice',
65'Participation level', 'Interactions rate per member', 'Mention frequency per user']
66
67# Insert data
68# Зве: еÑли начать перебор Ñ 0, и Ñделать невключающий диапазон (... вмеÑто ..), то можно обойтиÑÑŒ без Ð²Ñ‹Ñ‡Ð¸Ñ‚Ð°Ð½Ð¸Ñ Ñ‡Ð°Ñа
69(0...hours).each do |h|
70 #t = t_start + ((h - 1) * 3600)
71 t = now - h * 3600
72
73 metrics_insertion = METRICS.map{|name|
74 "('%s', '%s', %i)" % [t.strftime("%Y-%m-%d %H:%M"), name, rand(1000)]
75 }.join(', ')
76
77 db.query(%Q{
78 INSERT INTO metrics (timestamp, metrics, value)
79 VALUES #{metrics_insertion}
80 })
81
82 # Зве: еÑли умножать не на целое 100, а на дробное 100.0, можно обойтиÑÑŒ без to_f
83 #puts "%.3f" % (h*100.0/hours)
84
85 # Зве: но на Ñамом деле, когда Ñкрипт выводит такое дикое количеÑтво Ñтрочек Ñо ÑтатуÑом выполнениÑ,
86 # Ñто как-то некруто; как и проценты Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ñ Ñ‚Ð¾Ñ‡Ð½Ð¾Ñтью до 3 знака.
87 # ДоÑтаточно чего-нибудь такого, Ñ Ñ‚Ð°Ðº мыÑлю:
88 if (h % 100).zero?
89 puts "%i of %i ready (%.1f%%)" % [h, hours, h*100.0/hours]
90 end
91end
92
93# Зве: Во-первых, без Ñтой Ñтрочки вообще можно обойтиÑÑŒ — поÑле Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ñкрипта он Ñам отконнектитÑÑ
94# Во-вторых, ÑтарайÑÑ Ð¸Ð·Ð±ÐµÐ³Ð°Ñ‚ÑŒ очевидных комментариев — Ñ Ð½Ð¸Ñ… никому никакой пользы :)
95#Disconnect from server
96#db.close if db