1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
|
base = File.dirname(__FILE__)
$LOAD_PATH.unshift(File.expand_path(base))
$LOAD_PATH.unshift(File.expand_path(File.join(base, "..", "lib")))
require "active_ldap"
require "benchmark"
include ActiveLdap::GetTextSupport
argv = ARGV.dup
unless argv.include?("--config")
argv.unshift("--config", File.join(base, "config.yaml"))
end
argv, opts, options = ActiveLdap::Command.parse_options(argv) do |opts, options|
options.prefix = "ou=People"
opts.on("--prefix=PREFIX",
_("Specify prefix for benchmarking"),
_("(default: %s)") % options.prefix) do |prefix|
options.prefix = prefix
end
end
ActiveLdap::Base.setup_connection
config = ActiveLdap::Base.configuration
LDAP_PREFIX = options.prefix
LDAP_USER = config[:bind_dn]
LDAP_PASSWORD = config[:password]
N_USERS = 100
class ALUser < ActiveLdap::Base
ldap_mapping :dn_attribute => 'uid', :prefix => LDAP_PREFIX,
:classes => ['posixAccount', 'person']
end
def populate_base
ActiveLdap::Populate.ensure_base
if ActiveLdap::Base.search.empty?
raise "Can't populate #{ActiveLdap::Base.base}"
end
end
def populate_users
ou_class = Class.new(ActiveLdap::Base)
ou_class.ldap_mapping :dn_attribute => "ou",
:prefix => "",
:classes => ["top", "organizationalUnit"]
ou_class.new(LDAP_PREFIX.split(/=/)[1]).save!
N_USERS.times do |i|
name = i.to_s
user = ALUser.new(name)
user.uid_number = 100000 + i
user.gid_number = 100000 + i
user.cn = name
user.sn = name
user.home_directory = "/nonexistent"
user.save!
end
end
def populate
populate_base
populate_users
end
def main(do_populate)
if do_populate
puts(_("Populating..."))
dumped_data = ActiveLdap::Base.dump(:scope => :sub)
ActiveLdap::Base.delete_all(nil, :scope => :sub)
populate
puts
end
Benchmark.bmbm(20) do |x|
n = 100
GC.start
x.report("search 100 entries") do
n.times {ALUser.search}
end
GC.start
x.report("instantiate 1 entry") do
n.times {ALUser.first}
end
end
ensure
if do_populate
puts
puts(_("Cleaning..."))
ActiveLdap::Base.delete_all(nil, :scope => :sub)
ActiveLdap::Base.load(dumped_data)
end
end
main(LDAP_USER && LDAP_PASSWORD)
|