]> git.stg.codes - stg.git/blobdiff - projects/stargazer/user.cpp
Реалізовано внутрішню чергу повідомлень і її синхронізацію з базою
[stg.git] / projects / stargazer / user.cpp
index 48b8094c2c8e4af01535aea52c7d52df05646fb2..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;
 }
 //-----------------------------------------------------------------------------
@@ -1156,6 +1172,7 @@ if (SendMessage(*msg) == 0)
             WriteServLog("%s", store->GetStrError().c_str());
             return -1;
             }
+        messages.push_back(*msg);
         }
     }
 else
@@ -1168,6 +1185,7 @@ else
         WriteServLog("%s", store->GetStrError().c_str());
         return -1;
         }
+    messages.push_back(*msg);
     }
 return 0;
 }
@@ -1198,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))
     {
@@ -1243,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;
 }
 //-----------------------------------------------------------------------------