Advertisement
Guest User

Untitled

a guest
Jun 11th, 2017
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 4.04 KB | None | 0 0
  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.  
  5. require 'rubygems'
  6. require 'mysql'
  7.  
  8.  
  9. # Зве:
  10. # Читаем параметры. Этот код написан так с двумя целями:
  11. # 1. объяснить тому, кто читает скрипт, что значит каждый параметр
  12. # 2. сделать минимальную проверку параметров (здесь это нужно)
  13.  
  14. puts "Usage: ruby fill_database.rb dbname user password hours_to_fill"
  15.  
  16. dbname = ARGV[0] or raise(ArgumentError, "Database name empty")
  17. user = ARGV[1] or raise(ArgumentError, "User name empty")
  18. password = ARGV[2] or raise(ArgumentError, "Password empty")
  19. hours = ARGV[3].to_i
  20. hours.zero? and raise(ArgumentError, "Number of hours to fill is zero")
  21.  
  22.  
  23. # Connect to the MySQL server
  24.  
  25. db = Mysql.new('localhost', user, password)
  26.  
  27. # Зве: проверка результата на empty? более наглядна
  28. #db.query("CREATE DATABASE #{ARGV[0]}") if db.list_dbs(ARGV[0]) != [ARGV[0]]
  29. db.query("CREATE DATABASE #{dbname}") if db.list_dbs(dbname).empty?
  30.  
  31. db.real_connect('localhost', ARGV[1], ARGV[2], ARGV[0])
  32.  
  33. # Create tables
  34.  
  35. db.query("DROP TABLE IF EXISTS metrics")
  36.  
  37. db.query("
  38. CREATE 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)
  54. t_start = Time.now - hours * 3600
  55. # Но на самом деле t_start нам вообще не нужен, достаточно текущего времени :)
  56.  
  57. # Suppresses automatic result set generation
  58. db.query_with_result = false
  59.  
  60. now = 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
  85. end
  86.  
  87. # Зве: Во-первых, без этой строчки вообще можно обойтись — после выполнения скрипта он сам отконнектится
  88. # Во-вторых, старайся избегать очевидных комментариев — с них никому никакой пользы :)
  89. #Disconnect from server
  90. #db.close if db
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement