boot.rb 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. # frozen_string_literal: true
  2. require "bundler/setup"
  3. require "time"
  4. MAX_PK = 10_000
  5. QUERY_RANGE = (1..MAX_PK).freeze
  6. ALL_IDS = QUERY_RANGE.to_a
  7. QUERIES_MIN = 1
  8. QUERIES_MAX = 500
  9. SEQUEL_NO_ASSOCIATIONS = true
  10. SERVER_STRING =
  11. if defined?(PhusionPassenger)
  12. [
  13. PhusionPassenger::SharedConstants::SERVER_TOKEN_NAME,
  14. PhusionPassenger::VERSION_STRING
  15. ].join("/").freeze
  16. elsif defined?(Puma)
  17. Puma::Const::PUMA_SERVER_STRING
  18. elsif defined?(Unicorn)
  19. Unicorn::HttpParser::DEFAULTS["SERVER_SOFTWARE"]
  20. end
  21. Bundler.require(:default) # Load core modules
  22. CONTENT_TYPE = 'Content-Type'
  23. JSON_TYPE = 'application/json'
  24. HTML_TYPE = 'text/html; charset=utf-8'
  25. PLAINTEXT_TYPE = 'text/plain'
  26. DATE_HEADER = 'Date'
  27. SERVER_HEADER = 'Server'
  28. def connect(dbtype)
  29. Bundler.require(dbtype) # Load database-specific modules
  30. adapters = {
  31. mysql: {
  32. mri: "mysql2"
  33. },
  34. postgresql: {
  35. mri: "postgres"
  36. }
  37. }
  38. opts = {}
  39. # Determine threading/thread pool size and timeout
  40. if defined?(Puma) &&
  41. (threads = Puma.cli_config.options.fetch(:max_threads)) > 1
  42. opts[:max_connections] = (2 * Math.log(threads)).floor
  43. opts[:pool_timeout] = 10
  44. else
  45. Sequel.single_threaded = true
  46. end
  47. Sequel.connect "%{adapter}://%{host}/%{database}?user=%{user}&password=%{password}" %
  48. {
  49. adapter:
  50. adapters.fetch(dbtype).fetch(:mri),
  51. host: "tfb-database",
  52. database: "hello_world",
  53. user: "benchmarkdbuser",
  54. password: "benchmarkdbpass"
  55. },
  56. opts
  57. end
  58. DB = connect ENV.fetch("DBTYPE").to_sym
  59. # Define ORM models
  60. class World < Sequel.Model(:World)
  61. def_column_alias(:randomnumber, :randomNumber) if DB.database_type == :mysql
  62. def self.batch_update(worlds)
  63. if DB.database_type == :mysql
  64. worlds.map(&:save_changes)
  65. else
  66. ids = []
  67. sql = String.new("UPDATE world SET randomnumber = CASE id ")
  68. worlds.each do |world|
  69. sql << "when #{world.id} then #{world.randomnumber} "
  70. ids << world.id
  71. end
  72. sql << "ELSE randomnumber END WHERE id IN ( #{ids.join(',')})"
  73. DB.run(sql)
  74. end
  75. end
  76. end
  77. class Fortune < Sequel.Model(:Fortune)
  78. # Allow setting id to zero (0) per benchmark requirements
  79. unrestrict_primary_key
  80. end
  81. [World, Fortune].each(&:freeze)
  82. DB.freeze