Exemple #1
0
 public void ScheduleUpdate(ObjectInventoryUpdateInfo objinfo)
 {
     foreach (IAgent a in Agents)
     {
         a.ScheduleUpdate(objinfo, ID);
     }
     foreach (ISceneListener l in SceneListeners)
     {
         l.ScheduleUpdate(objinfo, ID);
     }
 }
Exemple #2
0
 protected override void OnUpdate(ObjectInventoryUpdateInfo info)
 {
     if (info.IsRemoved)
     {
         m_PrimItemUpdates.Remove(new PrimKey(info));
         m_PrimItemDeletions[new PrimKey(info)] = true;
     }
     else
     {
         m_PrimItemUpdates[new PrimKey(info)] = info;
     }
 }
            protected override void OnUpdate(ObjectInventoryUpdateInfo info)
            {
                string key = GenItemKey(info.PartID, info.ItemID);

                if (info.IsRemoved)
                {
                    m_PrimItems.Remove(key);
                }
                else
                {
                    m_PrimItems[key] = GenerateUpdateObjectPartInventoryItem(info.PartID, info.Item);
                }
            }
Exemple #4
0
 private void ProcessPrimItemUpdates(NpgsqlConnection conn)
 {
     foreach (PrimKey k in m_PrimItemUpdates.Keys.ToArray())
     {
         ObjectInventoryUpdateInfo update = m_PrimItemUpdates[k];
         if (!update.IsRemoved)
         {
             Dictionary <string, object> data = GenerateUpdateObjectPartInventoryItem(update.PartID, update.Item);
             data["RegionID"] = m_RegionID;
             conn.ReplaceInto("primitems", data, m_PrimItemKeys, m_EnableOnConflict);
         }
         m_PrimItemUpdates.Remove(k);
     }
 }
Exemple #5
0
 protected override void OnUpdate(ObjectUpdateInfo info)
 {
     if (info.IsKilled)
     {
         if (info.Part.ObjectGroup.RootPart == info.Part)
         {
             m_GroupUpdates.Remove(info.ID);
             m_GroupDeletions[info.ID] = true;
         }
         m_PrimUpdates.Remove(info.ID);
         m_PrimDeletions[info.ID] = true;
     }
     else
     {
         bool havePrimSerial = m_PrimSerials.Contains(info.ID);
         if (havePrimSerial && m_PrimSerials[info.ID] == info.Part.SerialNumber)
         {
             /* ignore update */
         }
         else
         {
             if (!havePrimSerial)
             {
                 foreach (ObjectPartInventoryItem item in info.Part.Inventory.Values)
                 {
                     ObjectInventoryUpdateInfo invinfo = item.UpdateInfo;
                     m_PrimItemUpdates[new PrimKey(invinfo)] = invinfo;
                 }
             }
             if (info.Part.ObjectGroup.RootPart != info.Part)
             {
                 m_GroupDeletions[info.ID] = true;
             }
             Dictionary <string, object> data = GenerateUpdateObjectPart(info.Part);
             data["RegionID"] = m_RegionID;
             m_PrimDeletions.Remove(info.ID);
             m_PrimUpdates[info.ID] = data;
             ObjectGroup grp = info.Part.ObjectGroup;
             m_GroupDeletions.Remove(grp.ID);
             m_GroupUpdates[grp.ID] = GenerateUpdateObjectGroup(grp);
         }
     }
 }
Exemple #6
0
 public void ScheduleUpdate(ObjectInventoryUpdateInfo info, UUID fromSceneID)
 {
     /* intentionally left empty */
 }
Exemple #7
0
 public PrimKey(ObjectInventoryUpdateInfo info)
 {
     PartID = info.PartID;
     ItemID = info.ItemID;
 }
Exemple #8
0
            private void ProcessPrimItemUpdates(MySqlConnection conn)
            {
                var  replaceInto1       = new StringBuilder();
                var  replaceInto2       = new StringBuilder();
                bool replaceInto1Inited = false;
                var  processedItems     = new List <PrimKey>();

                foreach (PrimKey k in m_PrimItemUpdates.Keys.ToArray())
                {
                    ObjectInventoryUpdateInfo update = m_PrimItemUpdates[k];
                    if (update.IsRemoved)
                    {
                        /* do not save removed data */
                        m_PrimItemUpdates.Remove(k);
                        continue;
                    }
                    Dictionary <string, object> data = GenerateUpdateObjectPartInventoryItem(update.PartID, update.Item);
                    data["RegionID"] = m_RegionID;

                    if (!replaceInto1Inited)
                    {
                        replaceInto1Inited = true;
                        replaceInto1.Append("REPLACE INTO primitems (");
                        replaceInto1.Append(MySQLUtilities.GenerateFieldNames(data));
                    }

                    if (replaceInto2.Length == 0)
                    {
                        replaceInto2.Append(") VALUES (");
                    }
                    else
                    {
                        replaceInto2.Append("),(");
                    }
                    processedItems.Add(k);
                    replaceInto2.Append(MySQLUtilities.GenerateValues(data));

                    if (processedItems.Count == 255)
                    {
                        var replaceInto = new StringBuilder();
                        replaceInto.Append(replaceInto1);
                        replaceInto.Append(replaceInto2);
                        replaceInto.Append(")");
                        using (var cmd = new MySqlCommand(replaceInto.ToString(), conn))
                        {
                            cmd.ExecuteNonQuery();
                        }
                        foreach (PrimKey r in processedItems)
                        {
                            m_PrimItemUpdates.Remove(r);
                            Interlocked.Increment(ref m_ProcessedPrims);
                        }
                        replaceInto2.Clear();
                        processedItems.Clear();
                    }
                }

                if (processedItems.Count > 0)
                {
                    var replaceInto = new StringBuilder();
                    replaceInto.Append(replaceInto1);
                    replaceInto.Append(replaceInto2);
                    replaceInto.Append(")");
                    using (var cmd = new MySqlCommand(replaceInto.ToString(), conn))
                    {
                        cmd.ExecuteNonQuery();
                    }
                    foreach (PrimKey r in processedItems)
                    {
                        m_PrimItemUpdates.Remove(r);
                        Interlocked.Increment(ref m_ProcessedPrims);
                    }
                }
            }
Exemple #9
0
 public void ScheduleUpdate(ObjectInventoryUpdateInfo info, UUID fromSceneID)
 {
     m_StorageMainRequestQueue.Enqueue(info);
 }
Exemple #10
0
            private void StorageMainThread()
            {
                Thread.CurrentThread.Name = "Storage Main Thread: " + m_RegionID.ToString();
                OnStart();
                int nummessagespending = 0;

                m_Log.InfoFormat("Object storage thread for region {0} started", m_RegionID);

                while (!m_StopStorageThread || m_StorageMainRequestQueue.Count != 0 || HasPendingData)
                {
                    IUpdateInfo req;
                    try
                    {
                        req = m_StorageMainRequestQueue.Dequeue(1000);
                    }
                    catch
                    {
                        try
                        {
                            OnIdle();
                            nummessagespending = 0;
                        }
                        catch (Exception e)
                        {
                            m_Log.Error("Exception encountered at OnIdle", e);
                        }
                        continue;
                    }

                    if (nummessagespending > 2000)
                    {
                        try
                        {
                            OnIdle();
                            nummessagespending = 0;
                        }
                        catch (Exception e)
                        {
                            m_Log.Error("Exception encountered at OnIdle", e);
                        }
                    }

                    ObjectUpdateInfo oInfo = req as ObjectUpdateInfo;
                    if (oInfo != null)
                    {
                        try
                        {
                            OnUpdate(oInfo);
                            ++nummessagespending;
                        }
                        catch (Exception e)
                        {
                            m_Log.Error("Inventory item storage encountered exception at " + m_RegionID.ToString(), e);
                        }
                        continue;
                    }

                    ObjectInventoryUpdateInfo iInfo = req as ObjectInventoryUpdateInfo;
                    if (iInfo != null)
                    {
                        try
                        {
                            OnUpdate(iInfo);
                            ++nummessagespending;
                        }
                        catch (Exception e)
                        {
                            m_Log.Error("Inventory storage encountered exception at " + m_RegionID.ToString(), e);
                        }
                    }
                }

                try
                {
                    OnIdle();
                }
                catch (Exception e)
                {
                    m_Log.Error("OnIdle threw an exception after leaving loop", e);
                }

                OnStop();
            }
Exemple #11
0
 protected abstract void OnUpdate(ObjectInventoryUpdateInfo info);