public void ScheduleUpdate(ObjectInventoryUpdateInfo objinfo) { foreach (IAgent a in Agents) { a.ScheduleUpdate(objinfo, ID); } foreach (ISceneListener l in SceneListeners) { l.ScheduleUpdate(objinfo, ID); } }
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); } }
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); } }
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); } } }
public void ScheduleUpdate(ObjectInventoryUpdateInfo info, UUID fromSceneID) { /* intentionally left empty */ }
public PrimKey(ObjectInventoryUpdateInfo info) { PartID = info.PartID; ItemID = info.ItemID; }
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); } } }
public void ScheduleUpdate(ObjectInventoryUpdateInfo info, UUID fromSceneID) { m_StorageMainRequestQueue.Enqueue(info); }
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(); }
protected abstract void OnUpdate(ObjectInventoryUpdateInfo info);