Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # ruby fill_database.rb dbname user pass hours
- # ruby fill_database.rb ARGV[0] ARGV[1] ARGV[2] ARGV[3]
- # ruby fill_database.rb 'test' 'root' 'шакуувщь' 43800
- require 'rubygems'
- require 'mysql'
- # Зве:
- # Читаем параметры. Этот код написан так с двумя целями:
- # 1. объяснить тому, кто читает скрипт, что значит каждый параметр
- # 2. сделать минимальную проверку параметров (здесь это нужно)
- puts "Usage: ruby fill_database.rb dbname user password hours_to_fill"
- dbname = ARGV[0] or raise(ArgumentError, "Database name empty")
- user = ARGV[1] or raise(ArgumentError, "User name empty")
- password = ARGV[2] or raise(ArgumentError, "Password empty")
- hours = ARGV[3].to_i
- hours.zero? and raise(ArgumentError, "Number of hours to fill is zero")
- # Connect to the MySQL server
- db = Mysql.new('localhost', user, password)
- # Зве: проверка результата на empty? более наглядна
- #db.query("CREATE DATABASE #{ARGV[0]}") if db.list_dbs(ARGV[0]) != [ARGV[0]]
- db.query("CREATE DATABASE #{dbname}") if db.list_dbs(dbname).empty?
- db.real_connect('localhost', ARGV[1], ARGV[2], ARGV[0])
- # Create tables
- db.query("DROP TABLE IF EXISTS metrics")
- db.query("
- CREATE TABLE metrics
- (
- id INT NOT NULL AUTO_INCREMENT,
- timestamp DATETIME NULL ,
- metrics VARCHAR(15) NULL ,
- value INT NULL ,
- PRIMARY KEY (id)
- )
- ")
- # Calculates first timestamp
- # t_start = Time.new — Зве: в Руби нет никакой необходимости инициализировать переменные заранее
- # Зве: зря усложняешь, приходится долго вчитываться, чтобы понять, что ты всего лишь пытался
- # получить целое число часов. В постановке задачи ничего про это не было :)
- # t_start = t_start - (t_start.min * 60) - t_start.sec - ((ARGV[3].to_i - 1) * 3600)
- t_start = Time.now - hours * 3600
- # Но на самом деле t_start нам вообще не нужен, достаточно текущего времени :)
- # Suppresses automatic result set generation
- db.query_with_result = false
- now = Time.now
- # Insert data
- # Зве: если начать перебор с 0, и сделать невключающий диапазон (... вместо ..), то можно обойтись без вычитания часа
- (0...hours).each do |h|
- #t = t_start + ((h - 1) * 3600)
- t = now - h * 3600
- db.query("
- INSERT INTO metrics (timestamp, metrics, value)
- VALUES
- ('#{t.strftime("%Y-%m-%d %H:%M")}', 'Mentioners', #{rand(1000)}),
- ('#{t.strftime("%Y-%m-%d %H:%M")}', 'Followers', #{rand(1000)}),
- ('#{t.strftime("%Y-%m-%d %H:%M")}', 'Readers', #{rand(1000)})
- ")
- # Зве: если умножать не на целое 100, а на дробное 100.0, можно обойтись без to_f
- #puts "%.3f" % (h*100.0/hours)
- # Зве: но на самом деле, когда скрипт выводит такое дикое количество строчек со статусом выполнения,
- # это как-то некруто; как и проценты выполнения с точностью до 3 знака.
- # Достаточно чего-нибудь такого, я так мыслю:
- if (h % 100).zero?
- puts "%i of %i ready (%.1f%%)" % [h, hours, h*100.0/hours]
- end
- end
- # Зве: Во-первых, без этой строчки вообще можно обойтись — после выполнения скрипта он сам отконнектится
- # Во-вторых, старайся избегать очевидных комментариев — с них никому никакой пользы :)
- #Disconnect from server
- #db.close if db
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement