· 9 years ago · Jun 11, 2017, 08:20 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("
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
62# Insert data
63# Зве: еÑли начать перебор Ñ 0, и Ñделать невключающий диапазон (... вмеÑто ..), то можно обойтиÑÑŒ без Ð²Ñ‹Ñ‡Ð¸Ñ‚Ð°Ð½Ð¸Ñ Ñ‡Ð°Ñа
64(0...hours).each do |h|
65 #t = t_start + ((h - 1) * 3600)
66 t = now - h * 3600
67
68 db.query("
69 INSERT INTO metrics (timestamp, metrics, value)
70 VALUES
71 ('#{t.strftime("%Y-%m-%d %H:%M")}', 'Mentioners', #{rand(1000)}),
72 ('#{t.strftime("%Y-%m-%d %H:%M")}', 'Followers', #{rand(1000)}),
73 ('#{t.strftime("%Y-%m-%d %H:%M")}', 'Readers', #{rand(1000)})
74 ")
75
76 # Зве: еÑли умножать не на целое 100, а на дробное 100.0, можно обойтиÑÑŒ без to_f
77 #puts "%.3f" % (h*100.0/hours)
78
79 # Зве: но на Ñамом деле, когда Ñкрипт выводит такое дикое количеÑтво Ñтрочек Ñо ÑтатуÑом выполнениÑ,
80 # Ñто как-то некруто; как и проценты Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ñ Ñ‚Ð¾Ñ‡Ð½Ð¾Ñтью до 3 знака.
81 # ДоÑтаточно чего-нибудь такого, Ñ Ñ‚Ð°Ðº мыÑлю:
82 if (h % 100).zero?
83 puts "%i of %i ready (%.1f%%)" % [h, hours, h*100.0/hours]
84 end
85end
86
87# Зве: Во-первых, без Ñтой Ñтрочки вообще можно обойтиÑÑŒ — поÑле Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ñкрипта он Ñам отконнектитÑÑ
88# Во-вторых, ÑтарайÑÑ Ð¸Ð·Ð±ÐµÐ³Ð°Ñ‚ÑŒ очевидных комментариев — Ñ Ð½Ð¸Ñ… никому никакой пользы :)
89#Disconnect from server
90#db.close if db