From 8aab10d28cc675e6299a1d12d86e36db003b12db Mon Sep 17 00:00:00 2001 From: Alexey Shchepin Date: Sat, 12 May 2007 18:09:38 +0000 Subject: [PATCH] * src/ejabberd_auth.erl: Added get_vh_registered_users_number/1 function * src/ejabberd_auth_odbc.erl: Likewise * src/odbc/odbc_queries.erl: Added users_number/1 function * src/ejabberd.cfg.example: Added an example for pgsql_users_number_estimate option SVN Revision: 766 --- ChangeLog | 7 +++++++ src/ejabberd.cfg.example | 4 ++++ src/ejabberd_auth.erl | 14 ++++++++++++++ src/ejabberd_auth_odbc.erl | 12 ++++++++++-- src/odbc/odbc_queries.erl | 15 +++++++++++++++ 5 files changed, 50 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index eca44b631..216974af4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2007-05-12 Alexey Shchepin + * src/ejabberd_auth.erl: Added get_vh_registered_users_number/1 + function + * src/ejabberd_auth_odbc.erl: Likewise + * src/odbc/odbc_queries.erl: Added users_number/1 function + * src/ejabberd.cfg.example: Added an example for + pgsql_users_number_estimate option + * src/ejabberd_auth_anonymous.erl: Added anonymous_purge_hook (thanks to Christophe Romain and Mickael Remond) * src/mod_offline.erl: Likewise diff --git a/src/ejabberd.cfg.example b/src/ejabberd.cfg.example index 654313355..00581047b 100644 --- a/src/ejabberd.cfg.example +++ b/src/ejabberd.cfg.example @@ -96,6 +96,10 @@ %{auth_method, odbc}. %{odbc_server, "DSN=ejabberd;UID=ejabberd;PWD=ejabberd"}. +% Uncomment this if you are using postgres, having a large DB, and need a +% faster but inexact replacement for "select count(*) from users" +%{pgsql_users_number_estimate, true}. + % Host name: {hosts, ["localhost"]}. diff --git a/src/ejabberd_auth.erl b/src/ejabberd_auth.erl index 4c34ae76a..6ecd054d1 100644 --- a/src/ejabberd_auth.erl +++ b/src/ejabberd_auth.erl @@ -22,6 +22,7 @@ try_register/3, dirty_get_registered_users/0, get_vh_registered_users/1, + get_vh_registered_users_number/1, get_password/2, get_password_s/2, is_user_exists/2, @@ -107,6 +108,19 @@ get_vh_registered_users(Server) -> M:get_vh_registered_users(Server) end, auth_modules(Server)). +get_vh_registered_users_number(Server) -> + lists:sum( + lists:map( + fun(M) -> + case erlang:function_exported( + M, get_vh_registered_users_number, 1) of + true -> + M:get_vh_registered_users_number(Server); + false -> + length(M:get_vh_registered_users(Server)) + end + end, auth_modules(Server))). + get_password(User, Server) -> lists:foldl( fun(M, false) -> diff --git a/src/ejabberd_auth_odbc.erl b/src/ejabberd_auth_odbc.erl index 60fce6d79..909a5d7a1 100644 --- a/src/ejabberd_auth_odbc.erl +++ b/src/ejabberd_auth_odbc.erl @@ -18,6 +18,7 @@ try_register/3, dirty_get_registered_users/0, get_vh_registered_users/1, + get_vh_registered_users_number/1, get_password/2, get_password_s/2, is_user_exists/2, @@ -28,8 +29,6 @@ -include("ejabberd.hrl"). --record(passwd, {user, password}). - %%%---------------------------------------------------------------------- %%% API %%%---------------------------------------------------------------------- @@ -123,6 +122,15 @@ get_vh_registered_users(Server) -> [] end. +get_vh_registered_users_number(Server) -> + LServer = jlib:nameprep(Server), + case catch odbc_queries:users_number(LServer) of + {selected, [_], [{Res}]} -> + list_to_integer(Res); + _ -> + 0 + end. + get_password(User, Server) -> case jlib:nodeprep(User) of error -> diff --git a/src/odbc/odbc_queries.erl b/src/odbc/odbc_queries.erl index f42a62a80..614e1d6ec 100644 --- a/src/odbc/odbc_queries.erl +++ b/src/odbc/odbc_queries.erl @@ -15,6 +15,7 @@ del_user/2, del_user_return_password/3, list_users/1, + users_number/1, add_spool_sql/2, add_spool/2, get_and_del_spool_msg_t/2, @@ -109,6 +110,20 @@ list_users(LServer) -> LServer, "select username from users"). +users_number(LServer) -> + case ejabberd_config:get_local_option( + {pgsql_users_number_estimate, LServer}) of + true -> + ejabberd_odbc:sql_query( + LServer, + "select reltuples from pg_class " + "where oid = 'users'::regclass::oid"); + _ -> + ejabberd_odbc:sql_query( + LServer, + "select count(*) from users") + end. + add_spool_sql(Username, XML) -> ["insert into spool(username, xml) " "values ('", Username, "', '",