]> git.stg.codes - stg.git/blobdiff - projects/stargazer/user.cpp
Реалізовано внутрішню чергу повідомлень і її синхронізацію з базою
[stg.git] / projects / stargazer / user.cpp
index 989d11b5e6d7c5edc29aaf569a6a3808cbd2c140..93fd66dc63a3cc4de3c154e8e40520e7c917d896 100644 (file)
@@ -115,7 +115,6 @@ ips = StrToIPS("*");
 deleted = false;
 lastWriteStat = stgTime + random() % settings->GetStatWritePeriod();
 lastWriteDeatiledStat = stgTime;
-lastSwapDeatiledStat = stgTime;
 
 property.tariffName.AddBeforeNotifier(&tariffNotifier);
 property.passive.AddBeforeNotifier(&passiveNotifier);
@@ -197,7 +196,6 @@ deleted = u.deleted;
 
 lastWriteStat = u.lastWriteStat;
 lastWriteDeatiledStat = u.lastWriteDeatiledStat;
-lastSwapDeatiledStat = u.lastSwapDeatiledStat;
 
 settings = u.settings;
 
@@ -257,6 +255,24 @@ if (tariff == NULL)
     return -1;
     }
 
+std::vector<STG_MSG_HDR> hdrsList;
+
+if (store->GetMessageHdrs(&hdrsList, login))
+    {
+    printfd(__FILE__, "Error GetMessageHdrs %s\n", store->GetStrError().c_str());
+    return -1;
+    }
+
+std::vector<STG_MSG_HDR>::const_iterator it;
+for (it = hdrsList.begin(); it != hdrsList.end(); ++it)
+    {
+    STG_MSG msg;
+    if (store->GetMessage(it->id, &msg, login) == 0)
+        {
+        messages.push_back(msg);
+        }
+    }
+
 return 0;
 }
 //-----------------------------------------------------------------------------
@@ -940,22 +956,18 @@ Run();
 //-----------------------------------------------------------------------------
 int USER::WriteDetailStat(bool hard)
 {
-printfd(__FILE__, "USER::WriteDetailedStat() - queue size = %d\n", traffStatQueue.size());
+printfd(__FILE__, "USER::WriteDetailedStat() - saved size = %d\n", traffStatSaved.second.size());
 
-if (!traffStatQueue.empty())
+if (!traffStatSaved.second.empty())
     {
-    std::list<std::pair<time_t, TRAFF_STAT> >::iterator it;
-    for (it = traffStatQueue.begin(); it != traffStatQueue.end(); ++it)
+    if (store->WriteDetailedStat(traffStatSaved.second, traffStatSaved.first, login))
         {
-        if (store->WriteDetailedStat(it->second, it->first, login))
-            {
-            printfd(__FILE__, "USER::WriteDetailStat() - failed to write detail stat from queue\n");
-            WriteServLog("Cannot write detail stat from queue (of size %d recs) for user %s.", traffStatQueue.size(), login.c_str());
-            WriteServLog("%s", store->GetStrError().c_str());
-            return -1;
-            }
-        traffStatQueue.erase(it++);
+        printfd(__FILE__, "USER::WriteDetailStat() - failed to write detail stat from queue\n");
+        WriteServLog("Cannot write detail stat from queue (of size %d recs) for user %s.", traffStatSaved.second.size(), login.c_str());
+        WriteServLog("%s", store->GetStrError().c_str());
+        return -1;
         }
+    traffStatSaved.second.erase(traffStatSaved.second.begin(), traffStatSaved.second.end());
     }
 
 TRAFF_STAT ts;
@@ -977,8 +989,11 @@ if (ts.size() && !disabledDetailStat)
         if (!hard)
             {
             printfd(__FILE__, "USER::WriteDetailStat() - pushing detail stat to queue\n");
-            traffStatQueue.push_back(std::make_pair(lastWriteDeatiledStat, ts));
+            STG_LOCKER lock(&mutex, __FILE__, __LINE__);
+            traffStatSaved.second.swap(ts);
+            traffStatSaved.first = lastWriteDeatiledStat;
             }
+        return -1;
         }
     }
 lastWriteDeatiledStat = stgTime;
@@ -1157,6 +1172,7 @@ if (SendMessage(*msg) == 0)
             WriteServLog("%s", store->GetStrError().c_str());
             return -1;
             }
+        messages.push_back(*msg);
         }
     }
 else
@@ -1169,6 +1185,7 @@ else
         WriteServLog("%s", store->GetStrError().c_str());
         return -1;
         }
+    messages.push_back(*msg);
     }
 return 0;
 }
@@ -1199,7 +1216,7 @@ int USER::ScanMessage()
 {
 STG_LOCKER lock(&mutex, __FILE__, __LINE__);
 
-vector<STG_MSG_HDR> hdrsList;
+/*vector<STG_MSG_HDR> hdrsList;
 
 if (store->GetMessageHdrs(&hdrsList, login))
     {
@@ -1244,7 +1261,38 @@ for (unsigned i = 0; i < hdrsList.size(); i++)
             WriteServLog("%s", store->GetStrError().c_str());
             }
         }
+    }*/
+
+std::list<STG_MSG>::iterator it(messages.begin());
+while (it != messages.end())
+    {
+    if (SendMessage(*it))
+        {
+        break;
+        }
+    it->header.repeat--;
+    if (it->header.repeat < 0)
+        {
+        printfd(__FILE__, "DelMessage\n");
+        store->DelMessage(it->id, login);
+        messages.erase(it++);
+        }
+    else
+        {
+        #ifndef DEBUG
+        //TODO: gcc v. 4.x generate ICE on x86_64
+        it->header.lastSendTime = time(NULL);
+        #else
+        it->header.lastSendTime = stgTime;
+        #endif
+        if (store->EditMessage(*it, login))
+            {
+            printfd(__FILE__, "EditMessage Error %s\n", store->GetStrError().c_str());
+            }
+        ++it;
+        }
     }
+
 return 0;
 }
 //-----------------------------------------------------------------------------