X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/5fac70d2a11be1f48ba3f2005a8df18b4db6b620..a095f18afd3ffdc695ebe984a0ad0c74d61fd834:/projects/stargazer/users_impl.cpp?ds=inline
diff --git a/projects/stargazer/users_impl.cpp b/projects/stargazer/users_impl.cpp
index d2c9d7cc..5ad112b9 100644
--- a/projects/stargazer/users_impl.cpp
+++ b/projects/stargazer/users_impl.cpp
@@ -40,9 +40,9 @@
#include <string>
#include <vector>
-#include "settings.h"
+#include "stg/settings.h"
+#include "stg/common.h"
#include "users_impl.h"
-#include "common.h"
#include "stg_timer.h"
using namespace std;
@@ -52,8 +52,9 @@ extern const volatile time_t stgTime;
//#define USERS_DEBUG 1
//-----------------------------------------------------------------------------
-USERS_IMPL::USERS_IMPL(SETTINGS * s, STORE * st, TARIFFS * t, const ADMIN * sa)
- : users(),
+USERS_IMPL::USERS_IMPL(SETTINGS_IMPL * s, STORE * st, TARIFFS * t, const ADMIN * sa)
+ : USERS(),
+ users(),
usersToDelete(),
userIPNotifiersBefore(),
userIPNotifiersAfter(),
@@ -71,7 +72,9 @@ USERS_IMPL::USERS_IMPL(SETTINGS * s, STORE * st, TARIFFS * t, const ADMIN * sa)
handle(0),
searchDescriptors(),
onAddNotifiers(),
- onDelNotifiers()
+ onDelNotifiers(),
+ onAddNotifiersImpl(),
+ onDelNotifiersImpl()
{
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
@@ -179,12 +182,24 @@ users.push_front(u);
AddUserIntoIndexes(users.begin());
SetUserNotifiers(users.begin());
-// õ×ÅÄÏÍÌÑÅÍ ×ÓÅÈ ÖÅÌÁÀÝÉÈ, ÞÔÏ ÄÏÂÁ×ÌÅÎ ÎÏ×ÙÊ ÐÏÌØÚÏ×ÁÔÅÌØ
-set<NOTIFIER_BASE<USER_PTR> *>::iterator ni = onAddNotifiers.begin();
-while (ni != onAddNotifiers.end())
{
- (*ni)->Notify(&users.front());
- ++ni;
+ // Fire all "on add" notifiers
+ set<NOTIFIER_BASE<USER_PTR> *>::iterator ni = onAddNotifiers.begin();
+ while (ni != onAddNotifiers.end())
+ {
+ (*ni)->Notify(&users.front());
+ ++ni;
+ }
+ }
+
+ {
+ // Fire all "on add" implementation notifiers
+ set<NOTIFIER_BASE<USER_IMPL_PTR> *>::iterator ni = onAddNotifiersImpl.begin();
+ while (ni != onAddNotifiersImpl.end())
+ {
+ (*ni)->Notify(&users.front());
+ ++ni;
+ }
}
return 0;
@@ -215,11 +230,22 @@ if (!priv->userAddDel)
}
}
-set<NOTIFIER_BASE<USER_PTR> *>::iterator ni = onDelNotifiers.begin();
-while (ni != onDelNotifiers.end())
{
- (*ni)->Notify(&(*u));
- ++ni;
+ set<NOTIFIER_BASE<USER_PTR> *>::iterator ni = onDelNotifiers.begin();
+ while (ni != onDelNotifiers.end())
+ {
+ (*ni)->Notify(&(*u));
+ ++ni;
+ }
+ }
+
+ {
+ set<NOTIFIER_BASE<USER_IMPL_PTR> *>::iterator ni = onDelNotifiersImpl.begin();
+ while (ni != onDelNotifiersImpl.end())
+ {
+ (*ni)->Notify(&(*u));
+ ++ni;
+ }
}
{
@@ -249,7 +275,7 @@ usersList.clear();
if (store->GetUsersList(&usersList) < 0)
{
WriteServLog(store->GetStrError().c_str());
- exit(1);
+ return -1;
}
user_iter ui;
@@ -433,7 +459,7 @@ if (t1.tm_mday == dayResetTraff)
{
printfd(__FILE__, "ResetTraff\n");
for_each(users.begin(), users.end(), mem_fun_ref(&USER_IMPL::ProcessNewMonth));
- for_each(users.begin(), users.end(), mem_fun_ref(&USER_IMPL::SetPrepaidTraff));
+ //for_each(users.begin(), users.end(), mem_fun_ref(&USER_IMPL::SetPrepaidTraff));
}
}
//-----------------------------------------------------------------------------
@@ -467,13 +493,13 @@ if (!isRunning)
nonstop = false;
//5 seconds to thread stops itself
-unsigned i;
-for (i = 0; i < 25 * (users.size() / 50 + 1); i++)
+struct timespec ts = {0, 200000000};
+for (size_t i = 0; i < 25 * (users.size() / 50 + 1); i++)
{
if (!isRunning)
break;
- usleep(200000);
+ nanosleep(&ts, NULL);
}
//after 5 seconds waiting thread still running. now kill it
@@ -500,7 +526,7 @@ for (list<USER_IMPL>::iterator it = users.begin();
it->WriteDetailStat(true);
for_each(users.begin(), users.end(), mem_fun_ref(&USER_IMPL::WriteStat));
-for_each(users.begin(), users.end(), mem_fun_ref(&USER_IMPL::WriteConf));
+//for_each(users.begin(), users.end(), mem_fun_ref(&USER_IMPL::WriteConf));
printfd(__FILE__, "USERS::Stop()\n");
return 0;
@@ -535,11 +561,6 @@ while (iter != usersToDelete.end())
return;
}
//-----------------------------------------------------------------------------
-int USERS_IMPL::GetUserNum() const
-{
-return users.size();
-}
-//-----------------------------------------------------------------------------
void USERS_IMPL::AddToIPIdx(user_iter user)
{
printfd(__FILE__, "USERS: Add IP Idx\n");
@@ -578,6 +599,15 @@ ipIndex.erase(it);
}
//-----------------------------------------------------------------------------
int USERS_IMPL::FindByIPIdx(uint32_t ip, USER_PTR * usr) const
+{
+ USER_IMPL * ptr = NULL;
+ if (FindByIPIdx(ip, &ptr))
+ return -1;
+ *usr = ptr;
+ return 0;
+}
+//-----------------------------------------------------------------------------
+int USERS_IMPL::FindByIPIdx(uint32_t ip, USER_IMPL ** usr) const
{
STG_LOCKER lock(&mutex, __FILE__, __LINE__);
@@ -613,7 +643,6 @@ onAddNotifiers.insert(n);
void USERS_IMPL::DelNotifierUserAdd(NOTIFIER_BASE<USER_PTR> * n)
{
STG_LOCKER lock(&mutex, __FILE__, __LINE__);
-//printfd(__FILE__, "DelNotifierUserAdd\n");
onAddNotifiers.erase(n);
}
//-----------------------------------------------------------------------------
@@ -629,6 +658,30 @@ STG_LOCKER lock(&mutex, __FILE__, __LINE__);
onDelNotifiers.erase(n);
}
//-----------------------------------------------------------------------------
+void USERS_IMPL::AddNotifierUserAdd(NOTIFIER_BASE<USER_IMPL_PTR> * n)
+{
+STG_LOCKER lock(&mutex, __FILE__, __LINE__);
+onAddNotifiersImpl.insert(n);
+}
+//-----------------------------------------------------------------------------
+void USERS_IMPL::DelNotifierUserAdd(NOTIFIER_BASE<USER_IMPL_PTR> * n)
+{
+STG_LOCKER lock(&mutex, __FILE__, __LINE__);
+onAddNotifiersImpl.erase(n);
+}
+//-----------------------------------------------------------------------------
+void USERS_IMPL::AddNotifierUserDel(NOTIFIER_BASE<USER_IMPL_PTR> * n)
+{
+STG_LOCKER lock(&mutex, __FILE__, __LINE__);
+onDelNotifiersImpl.insert(n);
+}
+//-----------------------------------------------------------------------------
+void USERS_IMPL::DelNotifierUserDel(NOTIFIER_BASE<USER_IMPL_PTR> * n)
+{
+STG_LOCKER lock(&mutex, __FILE__, __LINE__);
+onDelNotifiersImpl.erase(n);
+}
+//-----------------------------------------------------------------------------
int USERS_IMPL::OpenSearch()
{
STG_LOCKER lock(&mutex, __FILE__, __LINE__);
@@ -638,6 +691,15 @@ return handle;
}
//-----------------------------------------------------------------------------
int USERS_IMPL::SearchNext(int h, USER_PTR * user)
+{
+ USER_IMPL * ptr = NULL;
+ if (SearchNext(h, &ptr))
+ return -1;
+ *user = ptr;
+ return 0;
+}
+//-----------------------------------------------------------------------------
+int USERS_IMPL::SearchNext(int h, USER_IMPL ** user)
{
STG_LOCKER lock(&mutex, __FILE__, __LINE__);