From bdc13455011c9de2877813138a49d83fc52d3142 Mon Sep 17 00:00:00 2001 From: John Hurliman Date: Fri, 2 Oct 2009 13:08:15 -0700 Subject: [PATCH 01/29] * Removed even more unnecessary state variables from J2KImage * Fixed the incorrect "out of memory?" exception messages and replaced them with useful information * Cleaned up J2KImage and LLImageManager to conform to coding conventions --- .../Region/ClientStack/LindenUDP/J2KImage.cs | 276 ++++++++---------- .../ClientStack/LindenUDP/LLImageManager.cs | 46 +-- 2 files changed, 141 insertions(+), 181 deletions(-) diff --git a/OpenSim/Region/ClientStack/LindenUDP/J2KImage.cs b/OpenSim/Region/ClientStack/LindenUDP/J2KImage.cs index 5f549b5da1..0e3630c128 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/J2KImage.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/J2KImage.cs @@ -47,69 +47,26 @@ namespace OpenSim.Region.ClientStack.LindenUDP private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - public uint m_lastSequence; - public float m_requestedPriority; - public uint m_requestedPacketNumber; - public sbyte m_requestedDiscardLevel; - public UUID m_requestedUUID; - public IJ2KDecoder m_j2kDecodeModule; - public IAssetService m_assetCache; - public OpenJPEG.J2KLayerInfo[] m_layers; - public bool m_decoded; - public bool m_hasasset; - public C5.IPriorityQueueHandle m_priorityQueueHandle; + public uint LastSequence; + public float Priority; + public uint StartPacket; + public sbyte DiscardLevel; + public UUID TextureID; + public IJ2KDecoder J2KDecoder; + public IAssetService AssetService; + public OpenJPEG.J2KLayerInfo[] Layers; + public bool IsDecoded; + public bool HasAsset; + public C5.IPriorityQueueHandle PriorityQueueHandle; - private uint m_packetNumber; - private bool m_decoderequested; - private bool m_asset_requested; - private bool m_sentinfo; + private uint m_currentPacket; + private bool m_decodeRequested; + private bool m_assetRequested; + private bool m_sentInfo; private uint m_stopPacket; - private AssetBase m_asset; - private int m_assetDataLength; + private byte[] m_asset; private LLImageManager m_imageManager; - #region Properties - - public uint m_pPacketNumber - { - get { return m_packetNumber; } - } - public uint m_pStopPacketNumber - { - get { return m_stopPacket; } - } - - public byte[] Data - { - get - { - if (m_asset != null) - return m_asset.Data; - else - return null; - } - } - - public ushort TexturePacketCount() - { - if (!m_decoded) - return 0; - - try - { - return (ushort)(((m_assetDataLength - FIRST_PACKET_SIZE + IMAGE_PACKET_SIZE - 1) / IMAGE_PACKET_SIZE) + 1); - } - catch (Exception) - { - // If the asset is missing/destroyed/truncated, we will land - // here - // - return 0; - } - } - - #endregion Properties - public J2KImage(LLImageManager imageManager) { m_imageManager = imageManager; @@ -117,33 +74,32 @@ namespace OpenSim.Region.ClientStack.LindenUDP public bool SendPackets(LLClientView client, int maxpack) { - if (m_packetNumber <= m_stopPacket) + if (m_currentPacket <= m_stopPacket) { bool SendMore = true; - if (!m_sentinfo || (m_packetNumber == 0)) + if (!m_sentInfo || (m_currentPacket == 0)) { if (SendFirstPacket(client)) { SendMore = false; } - m_sentinfo = true; - m_packetNumber++; + m_sentInfo = true; + m_currentPacket++; } - // bool ignoreStop = false; - if (m_packetNumber < 2) + if (m_currentPacket < 2) { - m_packetNumber = 2; + m_currentPacket = 2; } int count = 0; - while (SendMore && count < maxpack && m_packetNumber <= m_stopPacket) + while (SendMore && count < maxpack && m_currentPacket <= m_stopPacket) { count++; SendMore = SendPacket(client); - m_packetNumber++; + m_currentPacket++; } - if (m_packetNumber > m_stopPacket) + if (m_currentPacket > m_stopPacket) return true; } @@ -156,68 +112,68 @@ namespace OpenSim.Region.ClientStack.LindenUDP //and assign the real discardLevel and packetNumber //assuming of course that the connected client might be bonkers - if (!m_hasasset) + if (!HasAsset) { - if (!m_asset_requested) + if (!m_assetRequested) { - m_asset_requested = true; - m_assetCache.Get(m_requestedUUID.ToString(), this, AssetReceived); + m_assetRequested = true; + AssetService.Get(TextureID.ToString(), this, AssetReceived); } } else { - if (!m_decoded) + if (!IsDecoded) { //We need to decode the requested image first - if (!m_decoderequested) + if (!m_decodeRequested) { //Request decode - m_decoderequested = true; + m_decodeRequested = true; // Do we have a jpeg decoder? - if (m_j2kDecodeModule != null) + if (J2KDecoder != null) { - if (Data == null) + if (m_asset == null) { - J2KDecodedCallback(m_requestedUUID, new OpenJPEG.J2KLayerInfo[0]); + J2KDecodedCallback(TextureID, new OpenJPEG.J2KLayerInfo[0]); } else { // Send it off to the jpeg decoder - m_j2kDecodeModule.BeginDecode(m_requestedUUID, Data, J2KDecodedCallback); + J2KDecoder.BeginDecode(TextureID, m_asset, J2KDecodedCallback); } } else { - J2KDecodedCallback(m_requestedUUID, new OpenJPEG.J2KLayerInfo[0]); + J2KDecodedCallback(TextureID, new OpenJPEG.J2KLayerInfo[0]); } } } else { // Check for missing image asset data - if (m_asset == null || m_asset.Data == null) + if (m_asset == null) { - // FIXME: - m_packetNumber = m_stopPacket; + m_log.Warn("[J2KIMAGE]: RunUpdate() called with missing asset data (no missing image texture?). Canceling texture transfer"); + m_currentPacket = m_stopPacket; return; } - if (m_requestedDiscardLevel >= 0 || m_stopPacket == 0) + if (DiscardLevel >= 0 || m_stopPacket == 0) { - int maxDiscardLevel = Math.Max(0, m_layers.Length - 1); + int maxDiscardLevel = Math.Max(0, Layers.Length - 1); // Treat initial texture downloads with a DiscardLevel of -1 a request for the highest DiscardLevel - if (m_requestedDiscardLevel < 0 && m_stopPacket == 0) - m_requestedDiscardLevel = (sbyte)maxDiscardLevel; + if (DiscardLevel < 0 && m_stopPacket == 0) + DiscardLevel = (sbyte)maxDiscardLevel; // Clamp at the highest discard level - m_requestedDiscardLevel = (sbyte)Math.Min(m_requestedDiscardLevel, maxDiscardLevel); + DiscardLevel = (sbyte)Math.Min(DiscardLevel, maxDiscardLevel); //Calculate the m_stopPacket - if (m_layers.Length > 0) + if (Layers.Length > 0) { - m_stopPacket = (uint)GetPacketForBytePosition(m_layers[(m_layers.Length - 1) - m_requestedDiscardLevel].End); + m_stopPacket = (uint)GetPacketForBytePosition(Layers[(Layers.Length - 1) - DiscardLevel].End); //I don't know why, but the viewer seems to expect the final packet if the file //is just one packet bigger. if (TexturePacketCount() == m_stopPacket + 1) @@ -230,7 +186,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP m_stopPacket = TexturePacketCount(); } - m_packetNumber = m_requestedPacketNumber; + m_currentPacket = StartPacket; } if (m_imageManager.Client.PacketHandler.GetQueueCount(ThrottleOutPacketType.Texture) == 0) @@ -242,20 +198,52 @@ namespace OpenSim.Region.ClientStack.LindenUDP } } + private bool SendFirstPacket(LLClientView client) + { + if (m_asset == null) + { + m_log.Warn("[J2KIMAGE]: Sending ImageNotInDatabase for texture " + TextureID); + client.SendImageNotFound(TextureID); + return true; + } + else if (m_asset.Length <= FIRST_PACKET_SIZE) + { + // We have less then one packet's worth of data + client.SendImageFirstPart(1, TextureID, (uint)m_asset.Length, m_asset, 2); + m_stopPacket = 0; + return true; + } + else + { + // This is going to be a multi-packet texture download + byte[] firstImageData = new byte[FIRST_PACKET_SIZE]; + + try { Buffer.BlockCopy(m_asset, 0, firstImageData, 0, FIRST_PACKET_SIZE); } + catch (Exception) + { + m_log.ErrorFormat("[J2KIMAGE]: Texture block copy for the first packet failed. textureid={0}, assetlength={1}", TextureID, m_asset.Length); + return true; + } + + client.SendImageFirstPart(TexturePacketCount(), TextureID, (uint)m_asset.Length, firstImageData, (byte)ImageCodec.J2C); + } + return false; + } + private bool SendPacket(LLClientView client) { bool complete = false; - int imagePacketSize = ((int)m_packetNumber == (TexturePacketCount())) ? LastPacketSize() : IMAGE_PACKET_SIZE; + int imagePacketSize = ((int)m_currentPacket == (TexturePacketCount())) ? LastPacketSize() : IMAGE_PACKET_SIZE; try { - if ((CurrentBytePosition() + IMAGE_PACKET_SIZE) > m_assetDataLength) + if ((CurrentBytePosition() + IMAGE_PACKET_SIZE) > m_asset.Length) { imagePacketSize = LastPacketSize(); complete = true; - if ((CurrentBytePosition() + imagePacketSize) > m_assetDataLength) + if ((CurrentBytePosition() + imagePacketSize) > m_asset.Length) { - imagePacketSize = m_assetDataLength - CurrentBytePosition(); + imagePacketSize = m_asset.Length - CurrentBytePosition(); complete = true; } } @@ -266,27 +254,21 @@ namespace OpenSim.Region.ClientStack.LindenUDP if (imagePacketSize > 0) { byte[] imageData = new byte[imagePacketSize]; - try - { - Buffer.BlockCopy(m_asset.Data, CurrentBytePosition(), imageData, 0, imagePacketSize); - } + int currentPosition = CurrentBytePosition(); + + try { Buffer.BlockCopy(m_asset, currentPosition, imageData, 0, imagePacketSize); } catch (Exception e) { - m_log.Error("Error copying texture block. Out of memory? imagePacketSize was " + imagePacketSize.ToString() + " on packet " + m_packetNumber.ToString() + " out of " + m_stopPacket.ToString() + ". Exception: " + e.ToString()); + m_log.ErrorFormat("[J2KIMAGE]: Texture block copy for the first packet failed. textureid={0}, assetlength={1}, currentposition={2}, imagepacketsize={3}, exception={4}", + TextureID, m_asset.Length, currentPosition, imagePacketSize, e.Message); return false; } //Send the packet - client.SendImageNextPart((ushort)(m_packetNumber - 1), m_requestedUUID, imageData); - } - if (complete) - { - return false; - } - else - { - return true; + client.SendImageNextPart((ushort)(m_currentPacket - 1), TextureID, imageData); } + + return !complete; } catch (Exception) { @@ -294,6 +276,20 @@ namespace OpenSim.Region.ClientStack.LindenUDP } } + private ushort TexturePacketCount() + { + if (!IsDecoded) + return 0; + + if (m_asset == null) + return 0; + + if (m_asset.Length <= FIRST_PACKET_SIZE) + return 1; + + return (ushort)(((m_asset.Length - FIRST_PACKET_SIZE + IMAGE_PACKET_SIZE - 1) / IMAGE_PACKET_SIZE) + 1); + } + private int GetPacketForBytePosition(int bytePosition) { return ((bytePosition - FIRST_PACKET_SIZE + IMAGE_PACKET_SIZE - 1) / IMAGE_PACKET_SIZE) + 1; @@ -301,9 +297,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP private int LastPacketSize() { - if (m_packetNumber == 1) - return m_assetDataLength; - int lastsize = (m_assetDataLength - FIRST_PACKET_SIZE) % IMAGE_PACKET_SIZE; + if (m_currentPacket == 1) + return m_asset.Length; + int lastsize = (m_asset.Length - FIRST_PACKET_SIZE) % IMAGE_PACKET_SIZE; //If the last packet size is zero, it's really cImagePacketSize, it sits on the boundary if (lastsize == 0) { @@ -314,12 +310,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP private int CurrentBytePosition() { - if (m_packetNumber == 0) + if (m_currentPacket == 0) return 0; - if (m_packetNumber == 1) + if (m_currentPacket == 1) return FIRST_PACKET_SIZE; - int result = FIRST_PACKET_SIZE + ((int)m_packetNumber - 2) * IMAGE_PACKET_SIZE; + int result = FIRST_PACKET_SIZE + ((int)m_currentPacket - 2) * IMAGE_PACKET_SIZE; if (result < 0) { result = FIRST_PACKET_SIZE; @@ -327,68 +323,32 @@ namespace OpenSim.Region.ClientStack.LindenUDP return result; } - private bool SendFirstPacket(LLClientView client) - { - // this means we don't have - if (Data == null) - { - client.SendImageNotFound(m_requestedUUID); - m_log.WarnFormat("[TEXTURE]: Got null Data element on a asset {0}.. and the missing image Data property is also null", m_requestedUUID); - return true; - } - // Do we have less then 1 packet's worth of data? - else if (m_assetDataLength <= FIRST_PACKET_SIZE) - { - // Send only 1 packet - client.SendImageFirstPart(1, m_requestedUUID, (uint)m_assetDataLength, m_asset.Data, 2); - m_stopPacket = 0; - return true; - } - else - { - byte[] firstImageData = new byte[FIRST_PACKET_SIZE]; - try - { - Buffer.BlockCopy(m_asset.Data, 0, firstImageData, 0, (int)FIRST_PACKET_SIZE); - client.SendImageFirstPart(TexturePacketCount(), m_requestedUUID, (uint)m_assetDataLength, firstImageData, 2); - } - catch (Exception) - { - m_log.Error("Texture block copy failed. Possibly out of memory?"); - return true; - } - } - return false; - } - private void J2KDecodedCallback(UUID AssetId, OpenJPEG.J2KLayerInfo[] layers) { - m_layers = layers; - m_decoded = true; + Layers = layers; + IsDecoded = true; RunUpdate(); } private void AssetDataCallback(UUID AssetID, AssetBase asset) { - m_hasasset = true; + HasAsset = true; if (asset == null || asset.Data == null) { if (m_imageManager.MissingImage != null) { - m_asset = m_imageManager.MissingImage; - m_assetDataLength = m_asset.Data.Length; + m_asset = m_imageManager.MissingImage.Data; } else { m_asset = null; - m_decoded = true; + IsDecoded = true; } } else { - m_asset = asset; - m_assetDataLength = m_asset.Data.Length; + m_asset = asset.Data; } RunUpdate(); diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLImageManager.cs b/OpenSim/Region/ClientStack/LindenUDP/LLImageManager.cs index a484fdf83d..d641b6cf46 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLImageManager.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLImageManager.cs @@ -45,7 +45,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP { public int Compare(J2KImage x, J2KImage y) { - return x.m_requestedPriority.CompareTo(y.m_requestedPriority); + return x.Priority.CompareTo(y.Priority); } } @@ -94,7 +94,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP // Do a linear search for this texture download lock (m_priorityQueue) - m_priorityQueue.Find(delegate(J2KImage img) { return img.m_requestedUUID == newRequest.RequestedAssetID; }, out imgrequest); + m_priorityQueue.Find(delegate(J2KImage img) { return img.TextureID == newRequest.RequestedAssetID; }, out imgrequest); if (imgrequest != null) { @@ -105,7 +105,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP try { lock (m_priorityQueue) - m_priorityQueue.Delete(imgrequest.m_priorityQueueHandle); + m_priorityQueue.Delete(imgrequest.PriorityQueueHandle); } catch (Exception) { } } @@ -116,29 +116,29 @@ namespace OpenSim.Region.ClientStack.LindenUDP //Check the packet sequence to make sure this isn't older than //one we've already received - if (newRequest.requestSequence > imgrequest.m_lastSequence) + if (newRequest.requestSequence > imgrequest.LastSequence) { //Update the sequence number of the last RequestImage packet - imgrequest.m_lastSequence = newRequest.requestSequence; + imgrequest.LastSequence = newRequest.requestSequence; //Update the requested discard level - imgrequest.m_requestedDiscardLevel = newRequest.DiscardLevel; + imgrequest.DiscardLevel = newRequest.DiscardLevel; //Update the requested packet number - imgrequest.m_requestedPacketNumber = newRequest.PacketNumber; + imgrequest.StartPacket = newRequest.PacketNumber; //Update the requested priority - imgrequest.m_requestedPriority = newRequest.Priority; + imgrequest.Priority = newRequest.Priority; try { lock (m_priorityQueue) - m_priorityQueue.Replace(imgrequest.m_priorityQueueHandle, imgrequest); + m_priorityQueue.Replace(imgrequest.PriorityQueueHandle, imgrequest); } catch (Exception) { - imgrequest.m_priorityQueueHandle = null; + imgrequest.PriorityQueueHandle = null; lock (m_priorityQueue) - m_priorityQueue.Add(ref imgrequest.m_priorityQueueHandle, imgrequest); + m_priorityQueue.Add(ref imgrequest.PriorityQueueHandle, imgrequest); } //Run an update @@ -161,29 +161,29 @@ namespace OpenSim.Region.ClientStack.LindenUDP imgrequest = new J2KImage(this); //Assign our decoder module - imgrequest.m_j2kDecodeModule = m_j2kDecodeModule; + imgrequest.J2KDecoder = m_j2kDecodeModule; //Assign our asset cache module - imgrequest.m_assetCache = m_assetCache; + imgrequest.AssetService = m_assetCache; //Assign the requested discard level - imgrequest.m_requestedDiscardLevel = newRequest.DiscardLevel; + imgrequest.DiscardLevel = newRequest.DiscardLevel; //Assign the requested packet number - imgrequest.m_requestedPacketNumber = newRequest.PacketNumber; + imgrequest.StartPacket = newRequest.PacketNumber; //Assign the requested priority - imgrequest.m_requestedPriority = newRequest.Priority; + imgrequest.Priority = newRequest.Priority; //Assign the asset uuid - imgrequest.m_requestedUUID = newRequest.RequestedAssetID; + imgrequest.TextureID = newRequest.RequestedAssetID; //Assign the requested priority - imgrequest.m_requestedPriority = newRequest.Priority; + imgrequest.Priority = newRequest.Priority; //Add this download to the priority queue lock (m_priorityQueue) - m_priorityQueue.Add(ref imgrequest.m_priorityQueueHandle, imgrequest); + m_priorityQueue.Add(ref imgrequest.PriorityQueueHandle, imgrequest); //Run an update imgrequest.RunUpdate(); @@ -249,12 +249,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP lock (m_priorityQueue) imagereq = m_priorityQueue.FindMax(); - if (imagereq.m_decoded == true) + if (imagereq.IsDecoded == true) { // we need to test this here now that we are dropping assets - if (!imagereq.m_hasasset) + if (!imagereq.HasAsset) { - m_log.WarnFormat("[LLIMAGE MANAGER]: Re-requesting the image asset {0}", imagereq.m_requestedUUID); + m_log.WarnFormat("[LLIMAGE MANAGER]: Re-requesting the image asset {0}", imagereq.TextureID); imagereq.RunUpdate(); continue; } @@ -268,7 +268,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP try { lock (m_priorityQueue) - m_priorityQueue.Delete(imagereq.m_priorityQueueHandle); + m_priorityQueue.Delete(imagereq.PriorityQueueHandle); } catch (Exception) { } } From e66321227e06ddc9d01eb2c47b00ea74ce3ec80c Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Fri, 2 Oct 2009 16:23:46 -0700 Subject: [PATCH 02/29] Close streams in MakeRequest. --- .../AsynchronousRestObjectRequester.cs | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/OpenSim/Framework/Servers/HttpServer/AsynchronousRestObjectRequester.cs b/OpenSim/Framework/Servers/HttpServer/AsynchronousRestObjectRequester.cs index fe69ad35d8..48e1370565 100644 --- a/OpenSim/Framework/Servers/HttpServer/AsynchronousRestObjectRequester.cs +++ b/OpenSim/Framework/Servers/HttpServer/AsynchronousRestObjectRequester.cs @@ -91,24 +91,31 @@ namespace OpenSim.Framework.Servers.HttpServer Stream requestStream = request.EndGetRequestStream(res); requestStream.Write(buffer.ToArray(), 0, length); + requestStream.Close(); request.BeginGetResponse(delegate(IAsyncResult ar) { response = request.EndGetResponse(ar); - + Stream respStream = null; try { - deserial = (TResponse) deserializer.Deserialize( - response.GetResponseStream()); + respStream = response.GetResponseStream(); + deserial = (TResponse)deserializer.Deserialize( + respStream); } catch (System.InvalidOperationException) { } + finally + { + respStream.Close(); + response.Close(); + } action(deserial); }, null); }, null); - + return; } @@ -119,14 +126,21 @@ namespace OpenSim.Framework.Servers.HttpServer // If the server returns a 404, this appears to trigger a System.Net.WebException even though that isn't // documented in MSDN response = request.EndGetResponse(res2); - + + Stream respStream = null; try { - deserial = (TResponse)deserializer.Deserialize(response.GetResponseStream()); + respStream = response.GetResponseStream(); + deserial = (TResponse)deserializer.Deserialize(respStream); } catch (System.InvalidOperationException) { } + finally + { + respStream.Close(); + response.Close(); + } } catch (WebException e) { From 332d3eb1bb4aecf67d56e64686db3e3851b848ea Mon Sep 17 00:00:00 2001 From: John Hurliman Date: Fri, 2 Oct 2009 16:53:35 -0700 Subject: [PATCH 03/29] * Removed code that is no longer used with Melanie's queue callback optimization * Moved all priority queue access to helper functions to improve reliability and readability * New version of CSJ2K.dll (from libomv source tree) that fixes a JPEG2000 comment decoding bug --- .../ClientStack/LindenUDP/LLImageManager.cs | 214 +++++++----------- bin/CSJ2K.dll | Bin 544768 -> 491520 bytes 2 files changed, 88 insertions(+), 126 deletions(-) diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLImageManager.cs b/OpenSim/Region/ClientStack/LindenUDP/LLImageManager.cs index d641b6cf46..facfb9d2ed 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLImageManager.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLImageManager.cs @@ -50,43 +50,38 @@ namespace OpenSim.Region.ClientStack.LindenUDP } private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - private bool m_shuttingdown = false; - private long m_lastloopprocessed = 0; - private AssetBase m_missingImage = null; - + private bool m_shuttingdown; + private long m_lastloopprocessed; + private AssetBase m_missingImage; private LLClientView m_client; //Client we're assigned to private IAssetService m_assetCache; //Asset Cache private IJ2KDecoder m_j2kDecodeModule; //Our J2K module private C5.IntervalHeap m_priorityQueue = new C5.IntervalHeap(10, new J2KImageComparer()); + private object m_syncRoot = new object(); + + public LLClientView Client { get { return m_client; } } + public AssetBase MissingImage { get { return m_missingImage; } } public LLImageManager(LLClientView client, IAssetService pAssetCache, IJ2KDecoder pJ2kDecodeModule) { m_client = client; m_assetCache = pAssetCache; + if (pAssetCache != null) m_missingImage = pAssetCache.Get("5748decc-f629-461c-9a36-a35a221fe21f"); - else - m_log.Error("[ClientView] - couldn't set missing image asset, falling back to missing image packet. This is known to crash the client"); + + if (m_missingImage == null) + m_log.Error("[ClientView] - Couldn't set missing image asset, falling back to missing image packet. This is known to crash the client"); m_j2kDecodeModule = pJ2kDecodeModule; } - public LLClientView Client - { - get { return m_client; } - } - - public AssetBase MissingImage - { - get { return m_missingImage; } - } - + /// + /// Handles an incoming texture request or update to an existing texture request + /// + /// public void EnqueueReq(TextureRequestArgs newRequest) { - //newRequest is the properties of our new texture fetch request. - //Basically, here is where we queue up "new" requests.. - // .. or modify existing requests to suit. - //Make sure we're not shutting down.. if (!m_shuttingdown) { @@ -125,21 +120,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP imgrequest.DiscardLevel = newRequest.DiscardLevel; //Update the requested packet number - imgrequest.StartPacket = newRequest.PacketNumber; + imgrequest.StartPacket = Math.Max(1, newRequest.PacketNumber); //Update the requested priority imgrequest.Priority = newRequest.Priority; - try - { - lock (m_priorityQueue) - m_priorityQueue.Replace(imgrequest.PriorityQueueHandle, imgrequest); - } - catch (Exception) - { - imgrequest.PriorityQueueHandle = null; - lock (m_priorityQueue) - m_priorityQueue.Add(ref imgrequest.PriorityQueueHandle, imgrequest); - } + UpdateImageInQueue(imgrequest); //Run an update imgrequest.RunUpdate(); @@ -159,31 +144,16 @@ namespace OpenSim.Region.ClientStack.LindenUDP // newRequest.RequestedAssetID, newRequest.DiscardLevel, newRequest.PacketNumber, newRequest.Priority); imgrequest = new J2KImage(this); - - //Assign our decoder module imgrequest.J2KDecoder = m_j2kDecodeModule; - - //Assign our asset cache module imgrequest.AssetService = m_assetCache; - - //Assign the requested discard level imgrequest.DiscardLevel = newRequest.DiscardLevel; - - //Assign the requested packet number - imgrequest.StartPacket = newRequest.PacketNumber; - - //Assign the requested priority + imgrequest.StartPacket = Math.Max(1, newRequest.PacketNumber); imgrequest.Priority = newRequest.Priority; - - //Assign the asset uuid imgrequest.TextureID = newRequest.RequestedAssetID; - - //Assign the requested priority imgrequest.Priority = newRequest.Priority; //Add this download to the priority queue - lock (m_priorityQueue) - m_priorityQueue.Add(ref imgrequest.PriorityQueueHandle, imgrequest); + AddImageToQueue(imgrequest); //Run an update imgrequest.RunUpdate(); @@ -194,105 +164,97 @@ namespace OpenSim.Region.ClientStack.LindenUDP public bool ProcessImageQueue(int count, int maxpack) { - lock (this) + J2KImage imagereq; + int numCollected = 0; + + lock (m_syncRoot) { - //count is the number of textures we want to process in one go. - //As part of this class re-write, that number will probably rise - //since we're processing in a more efficient manner. + m_lastloopprocessed = DateTime.Now.Ticks; - // this can happen during Close() - if (m_client == null) + // This can happen during Close() + if (m_client == null || m_client.PacketHandler == null || m_client.PacketHandler.PacketQueue == null) return false; - - int numCollected = 0; - - //Calculate our threshold - int threshold; - if (m_lastloopprocessed == 0) + + while ((imagereq = GetHighestPriorityImage()) != null) { - if (m_client.PacketHandler == null || m_client.PacketHandler.PacketQueue == null || m_client.PacketHandler.PacketQueue.TextureThrottle == null) - return false; - //This is decent for a semi fast machine, but we'll calculate it more accurately based on time below - threshold = m_client.PacketHandler.PacketQueue.TextureThrottle.Current / 6300; - m_lastloopprocessed = DateTime.Now.Ticks; - } - else - { - double throttleseconds = ((double)DateTime.Now.Ticks - (double)m_lastloopprocessed) / (double)TimeSpan.TicksPerSecond; - throttleseconds = throttleseconds * m_client.PacketHandler.PacketQueue.TextureThrottle.Current; - - //Average of 1000 bytes per packet - throttleseconds = throttleseconds / 1000; - - //Safe-zone multiplier of 2.0 - threshold = (int)(throttleseconds * 2.0); - m_lastloopprocessed = DateTime.Now.Ticks; - - } - - if (m_client.PacketHandler == null) - return false; - - if (m_client.PacketHandler.PacketQueue == null) - return false; - - if (threshold < 10) - threshold = 10; - - //Uncomment this to see what the texture stack is doing - //m_log.Debug("Queue: " + m_client.PacketHandler.PacketQueue.getQueueCount(ThrottleOutPacketType.Texture).ToString() + " Threshold: " + threshold.ToString() + " outstanding: " + m_outstandingtextures.ToString()); - if (true) //m_client.PacketHandler.PacketQueue.GetQueueCount(ThrottleOutPacketType.Texture) < threshold) - { - while (m_priorityQueue.Count > 0) + if (imagereq.IsDecoded == true) { - J2KImage imagereq = null; - lock (m_priorityQueue) - imagereq = m_priorityQueue.FindMax(); + ++numCollected; - if (imagereq.IsDecoded == true) + if (imagereq.SendPackets(m_client, maxpack)) { - // we need to test this here now that we are dropping assets - if (!imagereq.HasAsset) - { - m_log.WarnFormat("[LLIMAGE MANAGER]: Re-requesting the image asset {0}", imagereq.TextureID); - imagereq.RunUpdate(); - continue; - } - - ++numCollected; - - //SendPackets will send up to ten packets per cycle - if (imagereq.SendPackets(m_client, maxpack)) - { - // Send complete. Destroy any knowledge of this transfer - try - { - lock (m_priorityQueue) - m_priorityQueue.Delete(imagereq.PriorityQueueHandle); - } - catch (Exception) { } - } + // Send complete. Destroy any knowledge of this transfer + RemoveImageFromQueue(imagereq); } - - if (numCollected == count) - break; } - } - return m_priorityQueue.Count > 0; + if (numCollected == count) + break; + } } + + return m_priorityQueue.Count > 0; } //Faux destructor public void Close() { - m_shuttingdown = true; m_j2kDecodeModule = null; m_assetCache = null; m_client = null; } + #region Priority Queue Helpers + J2KImage GetHighestPriorityImage() + { + J2KImage image = null; + + if (m_priorityQueue.Count > 0) + { + try + { + lock (m_priorityQueue) + image = m_priorityQueue.FindMax(); + } + catch (Exception) { } + } + + return image; + } + + void AddImageToQueue(J2KImage image) + { + image.PriorityQueueHandle = null; + + lock (m_priorityQueue) + m_priorityQueue.Add(ref image.PriorityQueueHandle, image); + } + + void RemoveImageFromQueue(J2KImage image) + { + try + { + lock (m_priorityQueue) + m_priorityQueue.Delete(image.PriorityQueueHandle); + } + catch (Exception) { } + } + + void UpdateImageInQueue(J2KImage image) + { + lock (m_priorityQueue) + { + try { m_priorityQueue.Replace(image.PriorityQueueHandle, image); } + catch (Exception) + { + image.PriorityQueueHandle = null; + m_priorityQueue.Add(ref image.PriorityQueueHandle, image); + } + } + } + + #endregion Priority Queue Helpers } } diff --git a/bin/CSJ2K.dll b/bin/CSJ2K.dll index ff7e809398744e78ab7af5f7d391f98c35aa0e67..31e0d59d546a4fca4a597a57dd80a947ae57226f 100644 GIT binary patch literal 491520 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

4H80RKxR%yWsw!a3*)el)*_p|=odr_DU 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%0AZ^s97=`Hwl%VVV& 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
I^BcdDD{Qz}v#nTl#Hv29D tdvEg<{1fC6@S6xYkP$J9(Xg{N)A|0hi5YtiG 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 From 387e9f7a7faeb412054383080afc3507a1522746 Mon Sep 17 00:00:00 2001 From: John Hurliman Date: Fri, 2 Oct 2009 18:31:08 -0700 Subject: [PATCH 04/29] * Creates Util.UTF8 and switches some references of Encoding.UTF8 to Util.UTF8 (not all references were switched since not all OpenSim libraries reference OpenSim.Framework) * Shrinks the largest in-memory object, the LLRAW.HeightmapLookupValue struct (only used for exporting to LLRAW terrain files), to the minimum possible size. This seems to have the odd side effect of cutting the size of the two double[256,256] terrain objects in half. Possibly an alignment optimization? --- OpenSim/ApplicationPlugins/Rest/Inventory/Rest.cs | 4 ++-- OpenSim/ApplicationPlugins/Rest/RestXmlWriter.cs | 3 ++- OpenSim/Client/MXP/ClientStack/MXPClientView.cs | 2 +- OpenSim/Data/SQLite/SQLiteRegionData.cs | 14 +++++++++----- OpenSim/Framework/AssetLandmark.cs | 2 +- OpenSim/Framework/Capabilities/LLSD.cs | 4 ++-- .../Framework/Capabilities/LLSDStreamHandler.cs | 2 +- .../Framework/Communications/XMPP/XmppWriter.cs | 2 +- .../Configuration/HTTP/HTTPConfiguration.cs | 2 +- .../Framework/Servers/HttpServer/BaseHttpServer.cs | 2 +- OpenSim/Framework/Util.cs | 12 +++++++----- OpenSim/Region/Application/OpenSimBase.cs | 6 +++--- .../Region/ClientStack/LindenUDP/LLClientView.cs | 4 ++-- .../Agent/TextureSender/J2KDecoderModule.cs | 4 ++-- .../Scripting/HttpRequest/ScriptsHttpRequests.cs | 4 ++-- .../CoreModules/World/Terrain/FileLoaders/LLRAW.cs | 10 +++++----- OpenSim/Region/DataSnapshot/DataSnapshotManager.cs | 2 +- .../Region/Framework/Scenes/RegionStatsHandler.cs | 2 +- OpenSim/Region/Framework/Scenes/TerrainChannel.cs | 2 +- .../Server/IRCClientView.cs | 4 ++-- .../Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs | 4 ++-- .../World/TreePopulator/TreePopulatorModule.cs | 2 +- .../Shared/Api/Implementation/LSL_Api.cs | 2 +- .../Shared/Api/Implementation/OSSL_Api.cs | 2 +- OpenSim/Server/Base/ServerUtils.cs | 2 +- .../Server/Handlers/Neighbour/NeighbourHandlers.cs | 2 +- .../Server/Handlers/Simulation/AgentHandlers.cs | 2 +- 27 files changed, 55 insertions(+), 48 deletions(-) diff --git a/OpenSim/ApplicationPlugins/Rest/Inventory/Rest.cs b/OpenSim/ApplicationPlugins/Rest/Inventory/Rest.cs index 1e3539f6a3..7db705e958 100644 --- a/OpenSim/ApplicationPlugins/Rest/Inventory/Rest.cs +++ b/OpenSim/ApplicationPlugins/Rest/Inventory/Rest.cs @@ -163,7 +163,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory get { return Plugin.RequestId; } } - internal static Encoding Encoding = Encoding.UTF8; + internal static Encoding Encoding = Util.UTF8; /// /// Version control for REST implementation. This @@ -435,7 +435,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory try { byte[] encData_byte = new byte[str.Length]; - encData_byte = Encoding.UTF8.GetBytes(str); + encData_byte = Util.UTF8.GetBytes(str); return Convert.ToBase64String(encData_byte); } catch diff --git a/OpenSim/ApplicationPlugins/Rest/RestXmlWriter.cs b/OpenSim/ApplicationPlugins/Rest/RestXmlWriter.cs index 9abb0c882e..283fa2e134 100644 --- a/OpenSim/ApplicationPlugins/Rest/RestXmlWriter.cs +++ b/OpenSim/ApplicationPlugins/Rest/RestXmlWriter.cs @@ -45,7 +45,8 @@ namespace OpenSim.ApplicationPlugins.Rest { } - public RestXmlWriter(Stream stream) : this(stream, Encoding.UTF8) + public RestXmlWriter(Stream stream) + : this(stream, Encoding.UTF8) { } diff --git a/OpenSim/Client/MXP/ClientStack/MXPClientView.cs b/OpenSim/Client/MXP/ClientStack/MXPClientView.cs index 180f5e087f..603ef579d5 100644 --- a/OpenSim/Client/MXP/ClientStack/MXPClientView.cs +++ b/OpenSim/Client/MXP/ClientStack/MXPClientView.cs @@ -886,7 +886,7 @@ namespace OpenSim.Client.MXP.ClientStack chatActionEvent.ActionFragment.SourceObjectId = fromAgentID.Guid; chatActionEvent.ActionFragment.ObservationRadius = 180.0f; chatActionEvent.ActionFragment.ExtensionDialect = "TEXT"; - chatActionEvent.SetPayloadData(Encoding.UTF8.GetBytes(message)); + chatActionEvent.SetPayloadData(Util.UTF8.GetBytes(message)); Session.Send(chatActionEvent); } diff --git a/OpenSim/Data/SQLite/SQLiteRegionData.cs b/OpenSim/Data/SQLite/SQLiteRegionData.cs index ea076fe657..a3ae6ea3dc 100644 --- a/OpenSim/Data/SQLite/SQLiteRegionData.cs +++ b/OpenSim/Data/SQLite/SQLiteRegionData.cs @@ -581,13 +581,17 @@ namespace OpenSim.Data.SQLite if (row.Read()) { // TODO: put this into a function - MemoryStream str = new MemoryStream((byte[]) row["Heightfield"]); - BinaryReader br = new BinaryReader(str); - for (int x = 0; x < (int)Constants.RegionSize; x++) + using (MemoryStream str = new MemoryStream((byte[])row["Heightfield"])) { - for (int y = 0; y < (int)Constants.RegionSize; y++) + using (BinaryReader br = new BinaryReader(str)) { - terret[x, y] = br.ReadDouble(); + for (int x = 0; x < (int)Constants.RegionSize; x++) + { + for (int y = 0; y < (int)Constants.RegionSize; y++) + { + terret[x, y] = br.ReadDouble(); + } + } } } rev = (int) row["Revision"]; diff --git a/OpenSim/Framework/AssetLandmark.cs b/OpenSim/Framework/AssetLandmark.cs index 7c87c34b22..fd7a2cd184 100644 --- a/OpenSim/Framework/AssetLandmark.cs +++ b/OpenSim/Framework/AssetLandmark.cs @@ -49,7 +49,7 @@ namespace OpenSim.Framework private void InternData() { - string temp = Encoding.UTF8.GetString(Data).Trim(); + string temp = Util.UTF8.GetString(Data).Trim(); string[] parts = temp.Split('\n'); int.TryParse(parts[0].Substring(17, 1), out Version); UUID.TryParse(parts[1].Substring(10, 36), out RegionID); diff --git a/OpenSim/Framework/Capabilities/LLSD.cs b/OpenSim/Framework/Capabilities/LLSD.cs index 84f43c129d..eec9e615a9 100644 --- a/OpenSim/Framework/Capabilities/LLSD.cs +++ b/OpenSim/Framework/Capabilities/LLSD.cs @@ -112,7 +112,7 @@ namespace OpenSim.Framework.Capabilities writer.Close(); - return Encoding.UTF8.GetBytes(sw.ToString()); + return Util.UTF8.GetBytes(sw.ToString()); } /// @@ -329,7 +329,7 @@ namespace OpenSim.Framework.Capabilities reader.Read(); FromBase64Transform b64 = new FromBase64Transform(FromBase64TransformMode.IgnoreWhiteSpaces); - byte[] inp = Encoding.UTF8.GetBytes(reader.ReadString()); + byte[] inp = Util.UTF8.GetBytes(reader.ReadString()); ret = b64.TransformFinalBlock(inp, 0, inp.Length); break; } diff --git a/OpenSim/Framework/Capabilities/LLSDStreamHandler.cs b/OpenSim/Framework/Capabilities/LLSDStreamHandler.cs index df48b35d9e..7aaa99403b 100644 --- a/OpenSim/Framework/Capabilities/LLSDStreamHandler.cs +++ b/OpenSim/Framework/Capabilities/LLSDStreamHandler.cs @@ -47,7 +47,7 @@ namespace OpenSim.Framework.Capabilities public override byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse) { - //Encoding encoding = Encoding.UTF8; + //Encoding encoding = Util.UTF8; //StreamReader streamReader = new StreamReader(request, false); //string requestBody = streamReader.ReadToEnd(); diff --git a/OpenSim/Framework/Communications/XMPP/XmppWriter.cs b/OpenSim/Framework/Communications/XMPP/XmppWriter.cs index b52eda70b1..415d808c2f 100644 --- a/OpenSim/Framework/Communications/XMPP/XmppWriter.cs +++ b/OpenSim/Framework/Communications/XMPP/XmppWriter.cs @@ -38,7 +38,7 @@ namespace OpenSim.Framework.Communications.XMPP { } - public XMPPWriter(IOStream stream) : this(stream, Encoding.UTF8) + public XMPPWriter(IOStream stream) : this(stream, Util.UTF8) { } diff --git a/OpenSim/Framework/Configuration/HTTP/HTTPConfiguration.cs b/OpenSim/Framework/Configuration/HTTP/HTTPConfiguration.cs index 318d2c3eef..3dce578193 100644 --- a/OpenSim/Framework/Configuration/HTTP/HTTPConfiguration.cs +++ b/OpenSim/Framework/Configuration/HTTP/HTTPConfiguration.cs @@ -77,7 +77,7 @@ namespace OpenSim.Framework.Configuration.HTTP count = resStream.Read(buf, 0, buf.Length); if (count != 0) { - tempString = Encoding.UTF8.GetString(buf, 0, count); + tempString = Util.UTF8.GetString(buf, 0, count); sb.Append(tempString); } } while (count > 0); diff --git a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs index 771ae05437..f314d64d40 100644 --- a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs +++ b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs @@ -965,7 +965,7 @@ namespace OpenSim.Framework.Servers.HttpServer } // response.ContentType = "application/llsd+json"; - // return Encoding.UTF8.GetBytes(OSDParser.SerializeJsonString(llsdResponse)); + // return Util.UTF8.GetBytes(OSDParser.SerializeJsonString(llsdResponse)); response.ContentType = "application/llsd+xml"; return OSDParser.SerializeLLSDXmlBytes(llsdResponse); } diff --git a/OpenSim/Framework/Util.cs b/OpenSim/Framework/Util.cs index 58344f30c8..59159a88ad 100644 --- a/OpenSim/Framework/Util.cs +++ b/OpenSim/Framework/Util.cs @@ -69,7 +69,9 @@ namespace OpenSim.Framework public static readonly Regex UUIDPattern = new Regex("^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"); - + + public static Encoding UTF8 = Encoding.UTF8; + /// /// Well known UUID for the blank texture used in the Linden SL viewer version 1.20 (and hopefully onwards) /// @@ -432,7 +434,7 @@ namespace OpenSim.Framework output.Append(": "); } - output.Append(CleanString(Encoding.UTF8.GetString(bytes, 0, bytes.Length - 1))); + output.Append(CleanString(Util.UTF8.GetString(bytes, 0, bytes.Length - 1))); } else { @@ -793,7 +795,7 @@ namespace OpenSim.Framework public static string Compress(string text) { - byte[] buffer = Encoding.UTF8.GetBytes(text); + byte[] buffer = Util.UTF8.GetBytes(text); MemoryStream memory = new MemoryStream(); using (GZipStream compressor = new GZipStream(memory, CompressionMode.Compress, true)) { @@ -827,7 +829,7 @@ namespace OpenSim.Framework decompressor.Read(buffer, 0, buffer.Length); } - return Encoding.UTF8.GetString(buffer); + return Util.UTF8.GetString(buffer); } } @@ -1099,7 +1101,7 @@ namespace OpenSim.Framework { byte[] data = new byte[length]; stream.Read(data, 0, length); - string strdata = Encoding.UTF8.GetString(data); + string strdata = Util.UTF8.GetString(data); OSDMap args = null; OSD buffer; buffer = OSDParser.DeserializeJson(strdata); diff --git a/OpenSim/Region/Application/OpenSimBase.cs b/OpenSim/Region/Application/OpenSimBase.cs index 7bc0b77c4b..6b6cb85a5e 100644 --- a/OpenSim/Region/Application/OpenSimBase.cs +++ b/OpenSim/Region/Application/OpenSimBase.cs @@ -699,7 +699,7 @@ namespace OpenSim public byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse) { - return Encoding.UTF8.GetBytes("OK"); + return Util.UTF8.GetBytes("OK"); } public string ContentType @@ -736,7 +736,7 @@ namespace OpenSim public byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse) { - return Encoding.UTF8.GetBytes(m_opensim.StatReport(httpRequest)); + return Util.UTF8.GetBytes(m_opensim.StatReport(httpRequest)); } public string ContentType @@ -777,7 +777,7 @@ namespace OpenSim public byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse) { - return Encoding.UTF8.GetBytes(m_opensim.StatReport(httpRequest)); + return Util.UTF8.GetBytes(m_opensim.StatReport(httpRequest)); } public string ContentType diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index 43d29fdd05..3f90004b60 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs @@ -4748,7 +4748,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP { Hashtable mp = (Hashtable)simMapProfiles[iii]; mbReply.Data[iii] = new MapBlockReplyPacket.DataBlock(); - mbReply.Data[iii].Name = System.Text.Encoding.UTF8.GetBytes((string)mp["name"]); + mbReply.Data[iii].Name = Util.UTF8.GetBytes((string)mp["name"]); mbReply.Data[iii].Access = System.Convert.ToByte(mp["access"]); mbReply.Data[iii].Agents = System.Convert.ToByte(mp["agents"]); mbReply.Data[iii].MapImageID = new UUID((string)mp["map-image-id"]); @@ -7338,7 +7338,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP } #endregion - string mapName = Encoding.UTF8.GetString(map.NameData.Name, 0, + string mapName = Util.UTF8.GetString(map.NameData.Name, 0, map.NameData.Name.Length - 1); handlerMapNameRequest = OnMapNameRequest; if (handlerMapNameRequest != null) diff --git a/OpenSim/Region/CoreModules/Agent/TextureSender/J2KDecoderModule.cs b/OpenSim/Region/CoreModules/Agent/TextureSender/J2KDecoderModule.cs index a0f359b629..7456e8c04f 100644 --- a/OpenSim/Region/CoreModules/Agent/TextureSender/J2KDecoderModule.cs +++ b/OpenSim/Region/CoreModules/Agent/TextureSender/J2KDecoderModule.cs @@ -257,7 +257,7 @@ namespace OpenSim.Region.CoreModules.Agent.TextureSender stringResult.AppendFormat("{0}|{1}|{2}{3}", Layers[i].Start, Layers[i].End, Layers[i].End - Layers[i].Start, strEnd); } - layerDecodeAsset.Data = Encoding.UTF8.GetBytes(stringResult.ToString()); + layerDecodeAsset.Data = Util.UTF8.GetBytes(stringResult.ToString()); #endregion Serialize Layer Data @@ -280,7 +280,7 @@ namespace OpenSim.Region.CoreModules.Agent.TextureSender { #region Deserialize Layer Data - string readResult = Encoding.UTF8.GetString(layerDecodeAsset.Data); + string readResult = Util.UTF8.GetString(layerDecodeAsset.Data); string[] lines = readResult.Split(new char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries); if (lines.Length == 0) diff --git a/OpenSim/Region/CoreModules/Scripting/HttpRequest/ScriptsHttpRequests.cs b/OpenSim/Region/CoreModules/Scripting/HttpRequest/ScriptsHttpRequests.cs index 50d7c97ae4..45e724db18 100644 --- a/OpenSim/Region/CoreModules/Scripting/HttpRequest/ScriptsHttpRequests.cs +++ b/OpenSim/Region/CoreModules/Scripting/HttpRequest/ScriptsHttpRequests.cs @@ -367,7 +367,7 @@ namespace OpenSim.Region.CoreModules.Scripting.HttpRequest // Encode outbound data if (OutboundBody.Length > 0) { - byte[] data = Encoding.UTF8.GetBytes(OutboundBody); + byte[] data = Util.UTF8.GetBytes(OutboundBody); Request.ContentLength = data.Length; Stream bstream = Request.GetRequestStream(); @@ -390,7 +390,7 @@ namespace OpenSim.Region.CoreModules.Scripting.HttpRequest if (count != 0) { // translate from bytes to ASCII text - tempString = Encoding.UTF8.GetString(buf, 0, count); + tempString = Util.UTF8.GetString(buf, 0, count); // continue building the string sb.Append(tempString); diff --git a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/LLRAW.cs b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/LLRAW.cs index 3eb7cd20ef..a70ef13ed0 100644 --- a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/LLRAW.cs +++ b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/LLRAW.cs @@ -36,10 +36,10 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders { public struct HeightmapLookupValue : IComparable { - public int Index; - public double Value; + public ushort Index; + public float Value; - public HeightmapLookupValue(int index, double value) + public HeightmapLookupValue(ushort index, float value) { Index = index; Value = value; @@ -62,7 +62,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders { for (int j = 0; j < 256; j++) { - LookupHeightTable[i + (j * 256)] = new HeightmapLookupValue(i + (j * 256), ((double)i * ((double)j / 128.0d))); + LookupHeightTable[i + (j * 256)] = new HeightmapLookupValue((ushort)(i + (j * 256)), (float)((double)i * ((double)j / 128.0d))); } } Array.Sort(LookupHeightTable); @@ -196,7 +196,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders // The lookup table is pre-sorted, so we either find an exact match or // the next closest (smaller) match with a binary search - index = Array.BinarySearch(LookupHeightTable, new HeightmapLookupValue(0, t)); + index = Array.BinarySearch(LookupHeightTable, new HeightmapLookupValue(0, (float)t)); if (index < 0) index = ~index - 1; diff --git a/OpenSim/Region/DataSnapshot/DataSnapshotManager.cs b/OpenSim/Region/DataSnapshot/DataSnapshotManager.cs index 080bd5aea6..4df9094644 100644 --- a/OpenSim/Region/DataSnapshot/DataSnapshotManager.cs +++ b/OpenSim/Region/DataSnapshot/DataSnapshotManager.cs @@ -352,7 +352,7 @@ namespace OpenSim.Region.DataSnapshot m_log.WarnFormat("[DATASNAPSHOT]: Unable to decode reply from data service. Ignoring. {0}", e.StackTrace); } // This is not quite working, so... - // string responseStr = Encoding.UTF8.GetString(response); + // string responseStr = Util.UTF8.GetString(response); m_log.Info("[DATASNAPSHOT]: data service notified: " + url); } diff --git a/OpenSim/Region/Framework/Scenes/RegionStatsHandler.cs b/OpenSim/Region/Framework/Scenes/RegionStatsHandler.cs index 7c02f9ab6b..6055384fd6 100644 --- a/OpenSim/Region/Framework/Scenes/RegionStatsHandler.cs +++ b/OpenSim/Region/Framework/Scenes/RegionStatsHandler.cs @@ -73,7 +73,7 @@ namespace OpenSim.Region.Framework.Scenes public byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse) { - return Encoding.UTF8.GetBytes(Report()); + return Util.UTF8.GetBytes(Report()); } public string ContentType diff --git a/OpenSim/Region/Framework/Scenes/TerrainChannel.cs b/OpenSim/Region/Framework/Scenes/TerrainChannel.cs index 8209ff690a..ca6210d029 100644 --- a/OpenSim/Region/Framework/Scenes/TerrainChannel.cs +++ b/OpenSim/Region/Framework/Scenes/TerrainChannel.cs @@ -172,7 +172,7 @@ namespace OpenSim.Region.Framework.Scenes public string SaveToXmlString() { XmlWriterSettings settings = new XmlWriterSettings(); - settings.Encoding = Encoding.UTF8; + settings.Encoding = Util.UTF8; using (StringWriter sw = new StringWriter()) { using (XmlWriter writer = XmlWriter.Create(sw, settings)) diff --git a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs index 57f5d294c9..a31cbae362 100644 --- a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs +++ b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs @@ -81,7 +81,7 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server { m_log.Info("[IRCd] Sending >>> " + command); - byte[] buf = Encoding.UTF8.GetBytes(command + "\r\n"); + byte[] buf = Util.UTF8.GetBytes(command + "\r\n"); m_client.GetStream().BeginWrite(buf, 0, buf.Length, SendComplete, null); } @@ -109,7 +109,7 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server byte[] buf = new byte[8]; // RFC1459 defines max message size as 512. int count = m_client.GetStream().Read(buf, 0, buf.Length); - string line = Encoding.UTF8.GetString(buf, 0, count); + string line = Util.UTF8.GetString(buf, 0, count); strbuf += line; diff --git a/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs b/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs index 65c5274a57..f9dfc0d50f 100644 --- a/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs +++ b/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs @@ -527,7 +527,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice if (method == "POST") { - byte[] contentreq = Encoding.UTF8.GetBytes(body); + byte[] contentreq = Util.UTF8.GetBytes(body); forwardreq.ContentLength = contentreq.Length; Stream reqStream = forwardreq.GetRequestStream(); reqStream.Write(contentreq, 0, contentreq.Length); @@ -535,7 +535,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice } HttpWebResponse fwdrsp = (HttpWebResponse)forwardreq.GetResponse(); - Encoding encoding = Encoding.UTF8; + Encoding encoding = Util.UTF8; StreamReader fwdresponsestream = new StreamReader(fwdrsp.GetResponseStream(), encoding); fwdresponsestr = fwdresponsestream.ReadToEnd(); fwdresponsecontenttype = fwdrsp.ContentType; diff --git a/OpenSim/Region/OptionalModules/World/TreePopulator/TreePopulatorModule.cs b/OpenSim/Region/OptionalModules/World/TreePopulator/TreePopulatorModule.cs index d4bba1009d..b6021a96a7 100644 --- a/OpenSim/Region/OptionalModules/World/TreePopulator/TreePopulatorModule.cs +++ b/OpenSim/Region/OptionalModules/World/TreePopulator/TreePopulatorModule.cs @@ -539,7 +539,7 @@ namespace OpenSim.Region.OptionalModules.World.TreePopulator { XmlSerializer xs = new XmlSerializer(typeof(Copse)); - using (XmlTextWriter writer = new XmlTextWriter(fileName, System.Text.Encoding.UTF8)) + using (XmlTextWriter writer = new XmlTextWriter(fileName, Util.UTF8)) { writer.Formatting = Formatting.Indented; xs.Serialize(writer, obj); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index ba426782c8..264d585737 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -7064,7 +7064,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api try { byte[] encData_byte = new byte[str.Length]; - encData_byte = Encoding.UTF8.GetBytes(str); + encData_byte = Util.UTF8.GetBytes(str); string encodedData = Convert.ToBase64String(encData_byte); return encodedData; } diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 726b37a077..f80dd51983 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -1457,7 +1457,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api notecardData = "Linden text version 2\n{\nLLEmbeddedItems version 1\n{\ncount 0\n}\nText length " + textLength.ToString() + "\n" + notecardData + "}\n"; - asset.Data = Encoding.UTF8.GetBytes(notecardData); + asset.Data = Util.UTF8.GetBytes(notecardData); World.AssetService.Store(asset); // Create Task Entry diff --git a/OpenSim/Server/Base/ServerUtils.cs b/OpenSim/Server/Base/ServerUtils.cs index 0a36bbee14..6e8ead09bf 100644 --- a/OpenSim/Server/Base/ServerUtils.cs +++ b/OpenSim/Server/Base/ServerUtils.cs @@ -87,7 +87,7 @@ namespace OpenSim.Server.Base public static byte[] SerializeResult(XmlSerializer xs, object data) { MemoryStream ms = new MemoryStream(); - XmlTextWriter xw = new XmlTextWriter(ms, Encoding.UTF8); + XmlTextWriter xw = new XmlTextWriter(ms, Util.UTF8); xw.Formatting = Formatting.Indented; xs.Serialize(xw, data); xw.Flush(); diff --git a/OpenSim/Server/Handlers/Neighbour/NeighbourHandlers.cs b/OpenSim/Server/Handlers/Neighbour/NeighbourHandlers.cs index c0933a8607..7aedc1afab 100644 --- a/OpenSim/Server/Handlers/Neighbour/NeighbourHandlers.cs +++ b/OpenSim/Server/Handlers/Neighbour/NeighbourHandlers.cs @@ -156,7 +156,7 @@ namespace OpenSim.Server.Handlers.Neighbour httpResponse.StatusCode = (int)HttpStatusCode.OK; - return Encoding.UTF8.GetBytes(OSDParser.SerializeJsonString(resp)); + return Util.UTF8.GetBytes(OSDParser.SerializeJsonString(resp)); } } diff --git a/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs b/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs index 822edcbc0c..3da72c7bd7 100644 --- a/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs +++ b/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs @@ -161,7 +161,7 @@ namespace OpenSim.Server.Handlers.Simulation httpResponse.StatusCode = (int)HttpStatusCode.OK; - return Encoding.UTF8.GetBytes(OSDParser.SerializeJsonString(resp)); + return Util.UTF8.GetBytes(OSDParser.SerializeJsonString(resp)); } } From 006dfd6d9a31127b5aad55b16b7f85f29faff620 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Fri, 2 Oct 2009 20:35:15 -0700 Subject: [PATCH 05/29] Closing another stream. --- .../SynchronousRestObjectRequester.cs | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/OpenSim/Framework/Servers/HttpServer/SynchronousRestObjectRequester.cs b/OpenSim/Framework/Servers/HttpServer/SynchronousRestObjectRequester.cs index ec9bd4fce1..eab463cbd8 100644 --- a/OpenSim/Framework/Servers/HttpServer/SynchronousRestObjectRequester.cs +++ b/OpenSim/Framework/Servers/HttpServer/SynchronousRestObjectRequester.cs @@ -58,6 +58,7 @@ namespace OpenSim.Framework.Servers.HttpServer public static TResponse MakeRequest(string verb, string requestUrl, TRequest obj) { Type type = typeof (TRequest); + TResponse deserial = default(TResponse); WebRequest request = WebRequest.Create(requestUrl); request.Method = verb; @@ -81,19 +82,33 @@ namespace OpenSim.Framework.Servers.HttpServer int length = (int) buffer.Length; request.ContentLength = length; - Stream requestStream = request.GetRequestStream(); - requestStream.Write(buffer.ToArray(), 0, length); + Stream requestStream = null; + try + { + requestStream = request.GetRequestStream(); + requestStream.Write(buffer.ToArray(), 0, length); + } + catch (Exception) + { + return deserial; + } + finally + { + if (requestStream != null) + requestStream.Close(); + } } - TResponse deserial = default(TResponse); try { using (WebResponse resp = request.GetResponse()) { if (resp.ContentLength > 0) { + Stream respStream = resp.GetResponseStream(); XmlSerializer deserializer = new XmlSerializer(typeof(TResponse)); - deserial = (TResponse)deserializer.Deserialize(resp.GetResponseStream()); + deserial = (TResponse)deserializer.Deserialize(respStream); + respStream.Close(); } } } From b4d1cf0009777fa95760419c955eb20e1027badf Mon Sep 17 00:00:00 2001 From: Melanie Date: Sat, 3 Oct 2009 14:22:29 +0100 Subject: [PATCH 06/29] Small permissions tweak --- .../CoreModules/World/Permissions/PermissionsModule.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs index 040d0a33a0..89d74b5c51 100644 --- a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs +++ b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs @@ -576,9 +576,12 @@ namespace OpenSim.Region.CoreModules.World.Permissions return objectOwnerMask; } + if ((objectOwnerMask & PermissionMask.Transfer != 0) && task.saleType != 0) + objectEveryoneMask |= ObjectFlags.ObjectTransfer; + // Group permissions if ((task.GroupID != UUID.Zero) && IsGroupMember(task.GroupID, user, 0)) - return objectGroupMask; + return objectGroupMask | objectEveryoneMask; return objectEveryoneMask; } From 874e4231413b27f3f2eed67adca382b1918963cc Mon Sep 17 00:00:00 2001 From: Melanie Date: Sat, 3 Oct 2009 15:37:31 +0100 Subject: [PATCH 07/29] Fix my build break --- .../Region/CoreModules/World/Permissions/PermissionsModule.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs index 89d74b5c51..9622555af1 100644 --- a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs +++ b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs @@ -576,8 +576,8 @@ namespace OpenSim.Region.CoreModules.World.Permissions return objectOwnerMask; } - if ((objectOwnerMask & PermissionMask.Transfer != 0) && task.saleType != 0) - objectEveryoneMask |= ObjectFlags.ObjectTransfer; + if ((objectOwnerMask & (uint)PermissionMask.Transfer) != 0 && task.ObjectSaleType != 0) + objectEveryoneMask |= (uint)PrimFlags.ObjectTransfer; // Group permissions if ((task.GroupID != UUID.Zero) && IsGroupMember(task.GroupID, user, 0)) From 4843edfeb7a4af37125c9916350e5cd1a2e2ba7c Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sat, 3 Oct 2009 08:33:19 -0700 Subject: [PATCH 08/29] Closing more streams. --- .../SynchronousRestFormsRequester.cs | 31 ++++++++++++++++--- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/OpenSim/Framework/Servers/HttpServer/SynchronousRestFormsRequester.cs b/OpenSim/Framework/Servers/HttpServer/SynchronousRestFormsRequester.cs index a0d40089f7..85622a17eb 100644 --- a/OpenSim/Framework/Servers/HttpServer/SynchronousRestFormsRequester.cs +++ b/OpenSim/Framework/Servers/HttpServer/SynchronousRestFormsRequester.cs @@ -66,8 +66,20 @@ namespace OpenSim.Framework.Servers.HttpServer length = (int)obj.Length; request.ContentLength = length; - Stream requestStream = request.GetRequestStream(); - requestStream.Write(buffer.ToArray(), 0, length); + Stream requestStream = null; + try + { + requestStream = request.GetRequestStream(); + requestStream.Write(buffer.ToArray(), 0, length); + } + catch + { + } + finally + { + if (requestStream != null) + requestStream.Close(); + } } string respstring = String.Empty; @@ -78,9 +90,20 @@ namespace OpenSim.Framework.Servers.HttpServer { if (resp.ContentLength > 0) { - using (StreamReader reader = new StreamReader(resp.GetResponseStream())) + Stream respStream = null; + try { - respstring = reader.ReadToEnd(); + respStream = resp.GetResponseStream(); + using (StreamReader reader = new StreamReader(respStream)) + { + respstring = reader.ReadToEnd(); + } + } + catch { } + finally + { + if (respStream != null) + respStream.Close(); } } } From e1112ff879659bba3b51a22eee150d20d6090769 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sat, 3 Oct 2009 08:46:06 -0700 Subject: [PATCH 09/29] MOre streams closed. Corrected word in GridCommon.ini.example --- .../Servers/HttpServer/AsynchronousRestObjectRequester.cs | 1 + bin/config-include/GridCommon.ini.example | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/OpenSim/Framework/Servers/HttpServer/AsynchronousRestObjectRequester.cs b/OpenSim/Framework/Servers/HttpServer/AsynchronousRestObjectRequester.cs index e52ef9e04e..6c8d7cf756 100644 --- a/OpenSim/Framework/Servers/HttpServer/AsynchronousRestObjectRequester.cs +++ b/OpenSim/Framework/Servers/HttpServer/AsynchronousRestObjectRequester.cs @@ -82,6 +82,7 @@ namespace OpenSim.Framework.Servers.HttpServer serializer.Serialize(writer, obj); writer.Flush(); } + buffer.Close(); int length = (int) buffer.Length; request.ContentLength = length; diff --git a/bin/config-include/GridCommon.ini.example b/bin/config-include/GridCommon.ini.example index e9d3728677..6607a1a369 100644 --- a/bin/config-include/GridCommon.ini.example +++ b/bin/config-include/GridCommon.ini.example @@ -17,7 +17,7 @@ [GridService] ; - ; change this to your grid-wide inventory server + ; change this to your grid-wide grid server ; GridServerURI = "http://mygridserver.com:8001" From df7049008acd394fa514db584f56d0e3925a2d77 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sat, 3 Oct 2009 08:57:30 -0700 Subject: [PATCH 10/29] More streams closed. --- .../Servers/HttpServer/RestSessionService.cs | 19 +++++++++++++++++-- .../SynchronousRestFormsRequester.cs | 1 + 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/OpenSim/Framework/Servers/HttpServer/RestSessionService.cs b/OpenSim/Framework/Servers/HttpServer/RestSessionService.cs index 3f72c31af2..6c0aa46ce8 100644 --- a/OpenSim/Framework/Servers/HttpServer/RestSessionService.cs +++ b/OpenSim/Framework/Servers/HttpServer/RestSessionService.cs @@ -88,6 +88,7 @@ namespace OpenSim.Framework.Servers.HttpServer serializer.Serialize(writer, sobj); writer.Flush(); } + buffer.Close(); int length = (int)buffer.Length; request.ContentLength = length; @@ -99,8 +100,19 @@ namespace OpenSim.Framework.Servers.HttpServer using (WebResponse resp = request.GetResponse()) { XmlSerializer deserializer = new XmlSerializer(typeof(TResponse)); - deserial = (TResponse)deserializer.Deserialize(resp.GetResponseStream()); - resp.Close(); + Stream respStream = null; + try + { + respStream = resp.GetResponseStream(); + deserial = (TResponse)deserializer.Deserialize(respStream); + } + catch { } + finally + { + if (respStream != null) + respStream.Close(); + resp.Close(); + } } return deserial; } @@ -140,6 +152,7 @@ namespace OpenSim.Framework.Servers.HttpServer serializer.Serialize(writer, sobj); writer.Flush(); } + buffer.Close(); int length = (int)buffer.Length; request.ContentLength = length; @@ -165,6 +178,8 @@ namespace OpenSim.Framework.Servers.HttpServer // m_log.DebugFormat("[REST OBJECT POSTER RESPONSE]: Received {0}", reader.ReadToEnd()); deserial = (TResponse)deserializer.Deserialize(stream); + if (stream != null) + stream.Close(); if (deserial != null && ResponseCallback != null) { diff --git a/OpenSim/Framework/Servers/HttpServer/SynchronousRestFormsRequester.cs b/OpenSim/Framework/Servers/HttpServer/SynchronousRestFormsRequester.cs index 85622a17eb..e76d80e6c9 100644 --- a/OpenSim/Framework/Servers/HttpServer/SynchronousRestFormsRequester.cs +++ b/OpenSim/Framework/Servers/HttpServer/SynchronousRestFormsRequester.cs @@ -62,6 +62,7 @@ namespace OpenSim.Framework.Servers.HttpServer writer.Write(obj); writer.Flush(); } + buffer.Close(); length = (int)obj.Length; request.ContentLength = length; From b75b8877981dc1ed07f38f55e3152cf2770911df Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sat, 3 Oct 2009 11:55:52 -0700 Subject: [PATCH 11/29] Fixed interface between the Messaging server and the grid server. --- .../MessageRegionModule.cs | 71 ++++++++----------- prebuild.xml | 3 + 2 files changed, 32 insertions(+), 42 deletions(-) diff --git a/OpenSim/Grid/MessagingServer.Modules/MessageRegionModule.cs b/OpenSim/Grid/MessagingServer.Modules/MessageRegionModule.cs index 5651a175a7..dedf8768b1 100644 --- a/OpenSim/Grid/MessagingServer.Modules/MessageRegionModule.cs +++ b/OpenSim/Grid/MessagingServer.Modules/MessageRegionModule.cs @@ -39,6 +39,10 @@ using OpenSim.Data; using OpenSim.Framework; using OpenSim.Grid.Framework; using Timer = System.Timers.Timer; +using OpenSim.Services.Interfaces; +using OpenSim.Services.Connectors; +using GridRegion = OpenSim.Services.Interfaces.GridRegion; + namespace OpenSim.Grid.MessagingServer.Modules { @@ -52,6 +56,8 @@ namespace OpenSim.Grid.MessagingServer.Modules private IGridServiceCore m_messageCore; + private IGridService m_GridService; + // a dictionary of all current regions this server knows about private Dictionary m_regionInfoCache = new Dictionary(); @@ -59,6 +65,8 @@ namespace OpenSim.Grid.MessagingServer.Modules { m_cfg = config; m_messageCore = messageCore; + + m_GridService = new GridServicesConnector(m_cfg.GridServerURL); } public void Initialise() @@ -134,51 +142,30 @@ namespace OpenSim.Grid.MessagingServer.Modules /// public RegionProfileData RequestRegionInfo(ulong regionHandle) { - RegionProfileData regionProfile = null; - try - { - Hashtable requestData = new Hashtable(); - requestData["region_handle"] = regionHandle.ToString(); - requestData["authkey"] = m_cfg.GridSendKey; + uint x = 0, y = 0; + Utils.LongToUInts(regionHandle, out x, out y); + GridRegion region = m_GridService.GetRegionByPosition(UUID.Zero, (int)x, (int)y); - ArrayList SendParams = new ArrayList(); - SendParams.Add(requestData); + if (region != null) + return GridRegionToRegionProfile(region); - XmlRpcRequest GridReq = new XmlRpcRequest("simulator_data_request", SendParams); + else + return null; + } - XmlRpcResponse GridResp = GridReq.Send(m_cfg.GridServerURL, 3000); - - Hashtable responseData = (Hashtable)GridResp.Value; - - if (responseData.ContainsKey("error")) - { - m_log.Error("[GRID]: error received from grid server" + responseData["error"]); - return null; - } - - uint regX = Convert.ToUInt32((string)responseData["region_locx"]); - uint regY = Convert.ToUInt32((string)responseData["region_locy"]); - string internalIpStr = (string)responseData["sim_ip"]; - - regionProfile = new RegionProfileData(); - regionProfile.httpPort = (uint)Convert.ToInt32((string)responseData["http_port"]); - regionProfile.httpServerURI = "http://" + internalIpStr + ":" + regionProfile.httpPort + "/"; - regionProfile.regionHandle = Utils.UIntsToLong((regX * Constants.RegionSize), (regY * Constants.RegionSize)); - regionProfile.regionLocX = regX; - regionProfile.regionLocY = regY; - - regionProfile.remotingPort = Convert.ToUInt32((string)responseData["remoting_port"]); - regionProfile.UUID = new UUID((string)responseData["region_UUID"]); - regionProfile.regionName = (string)responseData["region_name"]; - } - catch (WebException) - { - m_log.Error("[GRID]: " + - "Region lookup failed for: " + regionHandle.ToString() + - " - Is the GridServer down?"); - } - - return regionProfile; + private RegionProfileData GridRegionToRegionProfile(GridRegion region) + { + RegionProfileData rprofile = new RegionProfileData(); + rprofile.httpPort = region.HttpPort; + rprofile.httpServerURI = region.ServerURI; + rprofile.regionLocX = (uint)(region.RegionLocX / Constants.RegionSize); + rprofile.regionLocY = (uint)(region.RegionLocY / Constants.RegionSize); + rprofile.RegionName = region.RegionName; + rprofile.ServerHttpPort = region.HttpPort; + rprofile.ServerIP = region.ExternalHostName; + rprofile.ServerPort = (uint)region.ExternalEndPoint.Port; + rprofile.Uuid = region.RegionID; + return rprofile; } public XmlRpcResponse RegionStartup(XmlRpcRequest request, IPEndPoint remoteClient) diff --git a/prebuild.xml b/prebuild.xml index 22ff3d7845..ccc79dee9f 100644 --- a/prebuild.xml +++ b/prebuild.xml @@ -980,10 +980,13 @@ + + + From b6920267f0e286a78f792c844ff30021044d7e9b Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sat, 3 Oct 2009 16:27:55 -0700 Subject: [PATCH 12/29] Close was being called to early on the Memory stream. --- .../Servers/HttpServer/AsynchronousRestObjectRequester.cs | 4 +++- OpenSim/Framework/Servers/HttpServer/RestSessionService.cs | 3 ++- .../Servers/HttpServer/SynchronousRestFormsRequester.cs | 3 ++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/OpenSim/Framework/Servers/HttpServer/AsynchronousRestObjectRequester.cs b/OpenSim/Framework/Servers/HttpServer/AsynchronousRestObjectRequester.cs index 6c8d7cf756..a459f1b370 100644 --- a/OpenSim/Framework/Servers/HttpServer/AsynchronousRestObjectRequester.cs +++ b/OpenSim/Framework/Servers/HttpServer/AsynchronousRestObjectRequester.cs @@ -82,7 +82,6 @@ namespace OpenSim.Framework.Servers.HttpServer serializer.Serialize(writer, obj); writer.Flush(); } - buffer.Close(); int length = (int) buffer.Length; request.ContentLength = length; @@ -109,13 +108,16 @@ namespace OpenSim.Framework.Servers.HttpServer } finally { + buffer.Close(); respStream.Close(); response.Close(); } action(deserial); + }, null); }, null); + return; } diff --git a/OpenSim/Framework/Servers/HttpServer/RestSessionService.cs b/OpenSim/Framework/Servers/HttpServer/RestSessionService.cs index 6c0aa46ce8..7ebb462539 100644 --- a/OpenSim/Framework/Servers/HttpServer/RestSessionService.cs +++ b/OpenSim/Framework/Servers/HttpServer/RestSessionService.cs @@ -88,14 +88,15 @@ namespace OpenSim.Framework.Servers.HttpServer serializer.Serialize(writer, sobj); writer.Flush(); } - buffer.Close(); int length = (int)buffer.Length; request.ContentLength = length; Stream requestStream = request.GetRequestStream(); requestStream.Write(buffer.ToArray(), 0, length); + buffer.Close(); requestStream.Close(); + TResponse deserial = default(TResponse); using (WebResponse resp = request.GetResponse()) { diff --git a/OpenSim/Framework/Servers/HttpServer/SynchronousRestFormsRequester.cs b/OpenSim/Framework/Servers/HttpServer/SynchronousRestFormsRequester.cs index e76d80e6c9..11df1039b2 100644 --- a/OpenSim/Framework/Servers/HttpServer/SynchronousRestFormsRequester.cs +++ b/OpenSim/Framework/Servers/HttpServer/SynchronousRestFormsRequester.cs @@ -62,7 +62,6 @@ namespace OpenSim.Framework.Servers.HttpServer writer.Write(obj); writer.Flush(); } - buffer.Close(); length = (int)obj.Length; request.ContentLength = length; @@ -80,6 +79,8 @@ namespace OpenSim.Framework.Servers.HttpServer { if (requestStream != null) requestStream.Close(); + buffer.Close(); + } } From 25e76979879c0ac95d2f23290bc1966fd6409447 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sat, 3 Oct 2009 16:33:10 -0700 Subject: [PATCH 13/29] Fixed build order for Linux. --- prebuild.xml | 144 +++++++++++++++++++++++++-------------------------- 1 file changed, 72 insertions(+), 72 deletions(-) diff --git a/prebuild.xml b/prebuild.xml index ccc79dee9f..f863ab64c6 100644 --- a/prebuild.xml +++ b/prebuild.xml @@ -957,78 +957,6 @@ - - - - ../../../bin/ - - - - - ../../../bin/ - - - - ../../../bin/ - - - - - - - - - - - - - - - - - - - - - - - - - - - - ../../../bin/ - - - - - ../../../bin/ - - - - ../../../bin/ - - - - - - - - - - - - - - - - - - - - - - @@ -1233,6 +1161,78 @@ + + + + ../../../bin/ + + + + + ../../../bin/ + + + + ../../../bin/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../bin/ + + + + + ../../../bin/ + + + + ../../../bin/ + + + + + + + + + + + + + + + + + + + + + + From b2cdee5a14bb7c474a2126cadeefcab442f0ac8b Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sat, 3 Oct 2009 19:08:56 -0700 Subject: [PATCH 14/29] Better error handling to diagnose login problems. --- OpenSim/Client/Linden/LLProxyLoginModule.cs | 186 ++++++++++-------- .../UserServer.Modules/UserLoginService.cs | 1 + 2 files changed, 105 insertions(+), 82 deletions(-) diff --git a/OpenSim/Client/Linden/LLProxyLoginModule.cs b/OpenSim/Client/Linden/LLProxyLoginModule.cs index ccd38d4c18..195feaf390 100644 --- a/OpenSim/Client/Linden/LLProxyLoginModule.cs +++ b/OpenSim/Client/Linden/LLProxyLoginModule.cs @@ -182,103 +182,125 @@ namespace OpenSim.Client.Linden /// public XmlRpcResponse ExpectUser(XmlRpcRequest request, IPEndPoint remoteClient) { - Hashtable requestData = (Hashtable)request.Params[0]; - AgentCircuitData agentData = new AgentCircuitData(); - agentData.SessionID = new UUID((string)requestData["session_id"]); - agentData.SecureSessionID = new UUID((string)requestData["secure_session_id"]); - agentData.firstname = (string)requestData["firstname"]; - agentData.lastname = (string)requestData["lastname"]; - agentData.AgentID = new UUID((string)requestData["agent_id"]); - agentData.circuitcode = Convert.ToUInt32(requestData["circuit_code"]); - agentData.CapsPath = (string)requestData["caps_path"]; - ulong regionHandle = Convert.ToUInt64((string)requestData["regionhandle"]); - - // Appearance - if (requestData["appearance"] != null) - agentData.Appearance = new AvatarAppearance((Hashtable)requestData["appearance"]); - - m_log.DebugFormat( - "[CLIENT]: Told by user service to prepare for a connection from {0} {1} {2}, circuit {3}", - agentData.firstname, agentData.lastname, agentData.AgentID, agentData.circuitcode); - - if (requestData.ContainsKey("child_agent") && requestData["child_agent"].Equals("1")) - { - //m_log.Debug("[CLIENT]: Child agent detected"); - agentData.child = true; - } - else - { - //m_log.Debug("[CLIENT]: Main agent detected"); - agentData.startpos = - new Vector3((float)Convert.ToDecimal((string)requestData["startpos_x"]), - (float)Convert.ToDecimal((string)requestData["startpos_y"]), - (float)Convert.ToDecimal((string)requestData["startpos_z"])); - agentData.child = false; - } - XmlRpcResponse resp = new XmlRpcResponse(); - if (!RegionLoginsEnabled) + try { - m_log.InfoFormat( - "[CLIENT]: Denying access for user {0} {1} because region login is currently disabled", - agentData.firstname, agentData.lastname); + ulong regionHandle = 0; + Hashtable requestData = (Hashtable)request.Params[0]; + AgentCircuitData agentData = new AgentCircuitData(); + if (requestData.ContainsKey("session_id")) + agentData.SessionID = new UUID((string)requestData["session_id"]); + if (requestData.ContainsKey("secure_session_id")) + agentData.SecureSessionID = new UUID((string)requestData["secure_session_id"]); + if (requestData.ContainsKey("firstname")) + agentData.firstname = (string)requestData["firstname"]; + if (requestData.ContainsKey("lastname")) + agentData.lastname = (string)requestData["lastname"]; + if (requestData.ContainsKey("agent_id")) + agentData.AgentID = new UUID((string)requestData["agent_id"]); + if (requestData.ContainsKey("circuit_code")) + agentData.circuitcode = Convert.ToUInt32(requestData["circuit_code"]); + if (requestData.ContainsKey("caps_path")) + agentData.CapsPath = (string)requestData["caps_path"]; + if (requestData.ContainsKey("regionhandle")) + regionHandle = Convert.ToUInt64((string)requestData["regionhandle"]); + else + m_log.Warn("[CLIENT]: request from login server did not contain regionhandle"); - Hashtable respdata = new Hashtable(); - respdata["success"] = "FALSE"; - respdata["reason"] = "region login currently disabled"; - resp.Value = respdata; - } - else - { - bool success = false; - string denyMess = ""; + // Appearance + if (requestData.ContainsKey("appearance")) + agentData.Appearance = new AvatarAppearance((Hashtable)requestData["appearance"]); - Scene scene; - if (TryGetRegion(regionHandle, out scene)) + m_log.DebugFormat( + "[CLIENT]: Told by user service to prepare for a connection from {0} {1} {2}, circuit {3}", + agentData.firstname, agentData.lastname, agentData.AgentID, agentData.circuitcode); + + if (requestData.ContainsKey("child_agent") && requestData["child_agent"].Equals("1")) { - if (scene.RegionInfo.EstateSettings.IsBanned(agentData.AgentID)) + //m_log.Debug("[CLIENT]: Child agent detected"); + agentData.child = true; + } + else + { + //m_log.Debug("[CLIENT]: Main agent detected"); + agentData.startpos = + new Vector3((float)Convert.ToDecimal((string)requestData["startpos_x"]), + (float)Convert.ToDecimal((string)requestData["startpos_y"]), + (float)Convert.ToDecimal((string)requestData["startpos_z"])); + agentData.child = false; + } + + if (!RegionLoginsEnabled) + { + m_log.InfoFormat( + "[CLIENT]: Denying access for user {0} {1} because region login is currently disabled", + agentData.firstname, agentData.lastname); + + Hashtable respdata = new Hashtable(); + respdata["success"] = "FALSE"; + respdata["reason"] = "region login currently disabled"; + resp.Value = respdata; + } + else + { + bool success = false; + string denyMess = ""; + + Scene scene; + if (TryGetRegion(regionHandle, out scene)) { - denyMess = "User is banned from this region"; - m_log.InfoFormat( - "[CLIENT]: Denying access for user {0} {1} because user is banned", - agentData.firstname, agentData.lastname); - } - else - { - string reason; - if (scene.NewUserConnection(agentData, out reason)) + if (scene.RegionInfo.EstateSettings.IsBanned(agentData.AgentID)) { - success = true; + denyMess = "User is banned from this region"; + m_log.InfoFormat( + "[CLIENT]: Denying access for user {0} {1} because user is banned", + agentData.firstname, agentData.lastname); } else { - denyMess = String.Format("Login refused by region: {0}", reason); - m_log.InfoFormat( - "[CLIENT]: Denying access for user {0} {1} because user connection was refused by the region", - agentData.firstname, agentData.lastname); + string reason; + if (scene.NewUserConnection(agentData, out reason)) + { + success = true; + } + else + { + denyMess = String.Format("Login refused by region: {0}", reason); + m_log.InfoFormat( + "[CLIENT]: Denying access for user {0} {1} because user connection was refused by the region", + agentData.firstname, agentData.lastname); + } } + + } + else + { + denyMess = "Region not found"; } + if (success) + { + Hashtable respdata = new Hashtable(); + respdata["success"] = "TRUE"; + resp.Value = respdata; + } + else + { + Hashtable respdata = new Hashtable(); + respdata["success"] = "FALSE"; + respdata["reason"] = denyMess; + resp.Value = respdata; + } } - else - { - denyMess = "Region not found"; - } - - if (success) - { - Hashtable respdata = new Hashtable(); - respdata["success"] = "TRUE"; - resp.Value = respdata; - } - else - { - Hashtable respdata = new Hashtable(); - respdata["success"] = "FALSE"; - respdata["reason"] = denyMess; - resp.Value = respdata; - } + } + catch (Exception e) + { + m_log.WarnFormat("[CLIENT]: Unable to receive user. Reason: {0}", e); + Hashtable respdata = new Hashtable(); + respdata["success"] = "FALSE"; + respdata["reason"] = "Exception occurred"; + resp.Value = respdata; } return resp; diff --git a/OpenSim/Grid/UserServer.Modules/UserLoginService.cs b/OpenSim/Grid/UserServer.Modules/UserLoginService.cs index 7d0e0de410..d46ff9b02d 100644 --- a/OpenSim/Grid/UserServer.Modules/UserLoginService.cs +++ b/OpenSim/Grid/UserServer.Modules/UserLoginService.cs @@ -317,6 +317,7 @@ namespace OpenSim.Grid.UserServer.Modules { m_log.DebugFormat("[LOGIN]: Appearance not for {0} {1}. Creating default.", user.FirstName, user.SurName); appearance = new AvatarAppearance(user.ID); + loginParams["appearance"] = appearance.ToHashTable(); } ArrayList SendParams = new ArrayList(); From 2d9c27a28f8c8f2cf3dff9a3bafc463be4090a9d Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sat, 3 Oct 2009 20:18:21 -0700 Subject: [PATCH 15/29] Slightly better message with status code for WebException. --- .../Servers/HttpServer/AsynchronousRestObjectRequester.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Framework/Servers/HttpServer/AsynchronousRestObjectRequester.cs b/OpenSim/Framework/Servers/HttpServer/AsynchronousRestObjectRequester.cs index a459f1b370..aa7036235c 100644 --- a/OpenSim/Framework/Servers/HttpServer/AsynchronousRestObjectRequester.cs +++ b/OpenSim/Framework/Servers/HttpServer/AsynchronousRestObjectRequester.cs @@ -165,7 +165,7 @@ namespace OpenSim.Framework.Servers.HttpServer } else { - m_log.ErrorFormat("[ASYNC REQUEST]: Request {0} {1} failed with exception {2}", verb, requestUrl, e); + m_log.ErrorFormat("[ASYNC REQUEST]: Request {0} {1} failed with status {2} and message {3}", verb, requestUrl, e.Status, e.Message); } } catch (Exception e) From 0cbd9eee2f1ed501bb2bc912c560934feb3edb26 Mon Sep 17 00:00:00 2001 From: dahlia Date: Sun, 4 Oct 2009 02:14:13 -0700 Subject: [PATCH 16/29] Exclude sculpt proxies from mesh caching --- OpenSim/Region/Physics/Meshing/Meshmerizer.cs | 29 +++++++++++++++---- 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/OpenSim/Region/Physics/Meshing/Meshmerizer.cs b/OpenSim/Region/Physics/Meshing/Meshmerizer.cs index d56ddc8973..ea6e10bd16 100644 --- a/OpenSim/Region/Physics/Meshing/Meshmerizer.cs +++ b/OpenSim/Region/Physics/Meshing/Meshmerizer.cs @@ -224,6 +224,14 @@ namespace OpenSim.Region.Physics.Meshing for (int i = 0; i < lodBytes.Length; i++) hash = djb2(hash, lodBytes[i]); + // include sculpt UUID + if (pbs.SculptEntry) + { + scaleBytes = pbs.SculptTexture.GetBytes(); + for (int i = 0; i < scaleBytes.Length; i++) + hash = djb2(hash, scaleBytes[i]); + } + return hash; } @@ -330,7 +338,7 @@ namespace OpenSim.Region.Physics.Meshing bool invert = ((primShape.SculptType & 64) != 0); sculptMesh = new PrimMesher.SculptMesh((Bitmap)idata, sculptType, (int)lod, false, mirror, invert); - + idata.Dispose(); sculptMesh.DumpRaw(baseDir, primName, "primMesh"); @@ -484,12 +492,18 @@ namespace OpenSim.Region.Physics.Meshing public IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, PhysicsVector size, float lod, bool isPhysical) { + Mesh mesh = null; + ulong key = 0; + // If this mesh has been created already, return it instead of creating another copy // For large regions with 100k+ prims and hundreds of copies of each, this can save a GB or more of memory - ulong key = GetMeshKey(primShape, size, lod); - Mesh mesh = null; - if (m_uniqueMeshes.TryGetValue(key, out mesh)) - return mesh; + + if (! primShape.SculptEntry) + { + key = GetMeshKey(primShape, size, lod); + if (m_uniqueMeshes.TryGetValue(key, out mesh)) + return mesh; + } if (size.X < 0.01f) size.X = 0.01f; if (size.Y < 0.01f) size.Y = 0.01f; @@ -512,7 +526,10 @@ namespace OpenSim.Region.Physics.Meshing // trim the vertex and triangle lists to free up memory mesh.TrimExcess(); } - m_uniqueMeshes.Add(key, mesh); + + if (!primShape.SculptEntry) + m_uniqueMeshes.Add(key, mesh); + return mesh; } } From efebc809ce1ecbce0e3619af5439805f91e14870 Mon Sep 17 00:00:00 2001 From: dahlia Date: Sun, 4 Oct 2009 02:54:36 -0700 Subject: [PATCH 17/29] disable physics actors for flexible prims --- OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index ea6bc9c319..801a7db3a5 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -1344,7 +1344,8 @@ if (m_shape != null) { bool RigidBody = isPhysical && !isPhantom; // The only time the physics scene shouldn't know about the prim is if it's phantom or an attachment, which is phantom by definition - if (!isPhantom && !IsAttachment) + // or flexible + if (!isPhantom && !IsAttachment && !(Shape.PathCurve == (byte) Extrusion.Flexible)) { PhysActor = m_parentGroup.Scene.PhysicsScene.AddPrimShape( Name, @@ -3426,8 +3427,8 @@ if (m_shape != null) { } } - - if (IsPhantom || IsAttachment) // note: this may have been changed above in the case of joints + + if (IsPhantom || IsAttachment || (Shape.PathCurve == (byte)Extrusion.Flexible)) // note: this may have been changed above in the case of joints { AddFlag(PrimFlags.Phantom); PhysicsActor pa = PhysActor; From 95ebb7794cd016485f3ce4e4449091955a6e9eaf Mon Sep 17 00:00:00 2001 From: dahlia Date: Sun, 4 Oct 2009 02:59:12 -0700 Subject: [PATCH 18/29] flexible extrusion shape defaults to linear --- OpenSim/Region/Physics/Meshing/Meshmerizer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/Physics/Meshing/Meshmerizer.cs b/OpenSim/Region/Physics/Meshing/Meshmerizer.cs index ea6e10bd16..0e29cccfa3 100644 --- a/OpenSim/Region/Physics/Meshing/Meshmerizer.cs +++ b/OpenSim/Region/Physics/Meshing/Meshmerizer.cs @@ -397,7 +397,7 @@ namespace OpenSim.Region.Physics.Meshing primMesh.pathCutBegin = pathBegin; primMesh.pathCutEnd = pathEnd; - if (primShape.PathCurve == (byte)Extrusion.Straight) + if (primShape.PathCurve == (byte)Extrusion.Straight || primShape.PathCurve == (byte) Extrusion.Flexible) { primMesh.twistBegin = primShape.PathTwistBegin * 18 / 10; primMesh.twistEnd = primShape.PathTwist * 18 / 10; From 366bfe17ae46ddfe7b942b5851a1625072b4852b Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sun, 4 Oct 2009 07:41:10 -0700 Subject: [PATCH 19/29] Trying to avoid the null pointer exception in J2KImage, RunUpdate. --- OpenSim/Region/ClientStack/LindenUDP/J2KImage.cs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/ClientStack/LindenUDP/J2KImage.cs b/OpenSim/Region/ClientStack/LindenUDP/J2KImage.cs index 0e3630c128..713d43ac55 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/J2KImage.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/J2KImage.cs @@ -158,9 +158,17 @@ namespace OpenSim.Region.ClientStack.LindenUDP m_currentPacket = m_stopPacket; return; } - + if (DiscardLevel >= 0 || m_stopPacket == 0) { + // This shouldn't happen, but if it does, we really can't proceed + if (Layers == null) + { + m_log.Warn("[J2KIMAGE]: RunUpdate() called with missing Layers. Canceling texture transfer"); + m_currentPacket = m_stopPacket; + return; + } + int maxDiscardLevel = Math.Max(0, Layers.Length - 1); // Treat initial texture downloads with a DiscardLevel of -1 a request for the highest DiscardLevel From f21f3727df3ec76a3f65cf6b889c48ff1326086e Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sun, 4 Oct 2009 09:20:01 -0700 Subject: [PATCH 20/29] Leaving the MemoryStreams unclosed. --- .../Servers/HttpServer/AsynchronousRestObjectRequester.cs | 3 ++- .../Servers/HttpServer/SynchronousRestFormsRequester.cs | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/OpenSim/Framework/Servers/HttpServer/AsynchronousRestObjectRequester.cs b/OpenSim/Framework/Servers/HttpServer/AsynchronousRestObjectRequester.cs index aa7036235c..03c12dd560 100644 --- a/OpenSim/Framework/Servers/HttpServer/AsynchronousRestObjectRequester.cs +++ b/OpenSim/Framework/Servers/HttpServer/AsynchronousRestObjectRequester.cs @@ -108,7 +108,8 @@ namespace OpenSim.Framework.Servers.HttpServer } finally { - buffer.Close(); + // Let's not close this + //buffer.Close(); respStream.Close(); response.Close(); } diff --git a/OpenSim/Framework/Servers/HttpServer/SynchronousRestFormsRequester.cs b/OpenSim/Framework/Servers/HttpServer/SynchronousRestFormsRequester.cs index 11df1039b2..8a490f7233 100644 --- a/OpenSim/Framework/Servers/HttpServer/SynchronousRestFormsRequester.cs +++ b/OpenSim/Framework/Servers/HttpServer/SynchronousRestFormsRequester.cs @@ -79,7 +79,8 @@ namespace OpenSim.Framework.Servers.HttpServer { if (requestStream != null) requestStream.Close(); - buffer.Close(); + // Let's not close this + //buffer.Close(); } } From b803d5ab9b6aae1316314efcbbb80e3f1ab6322a Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sun, 4 Oct 2009 09:44:04 -0700 Subject: [PATCH 21/29] Make sure to close the file streams on the FlotsamCache, even if something fails. --- .../CoreModules/Asset/FlotsamAssetCache.cs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs b/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs index 817e0d487d..1dc40bc38c 100644 --- a/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs +++ b/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs @@ -323,13 +323,13 @@ namespace Flotsam.RegionModules.AssetCache string filename = GetFileName(id); if (File.Exists(filename)) { + FileStream stream = null; try { - FileStream stream = File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.Read); + stream = File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.Read); BinaryFormatter bformatter = new BinaryFormatter(); asset = (AssetBase)bformatter.Deserialize(stream); - stream.Close(); UpdateMemoryCache(id, asset); @@ -349,6 +349,11 @@ namespace Flotsam.RegionModules.AssetCache { LogException(e); } + finally + { + if (stream != null) + stream.Close(); + } } @@ -493,6 +498,7 @@ namespace Flotsam.RegionModules.AssetCache private void WriteFileCache(string filename, AssetBase asset) { + Stream stream = null; try { // Make sure the target cache directory exists @@ -505,10 +511,9 @@ namespace Flotsam.RegionModules.AssetCache // Write file first to a temp name, so that it doesn't look // like it's already cached while it's still writing. string tempname = Path.Combine(directory, Path.GetRandomFileName()); - Stream stream = File.Open(tempname, FileMode.Create); + stream = File.Open(tempname, FileMode.Create); BinaryFormatter bformatter = new BinaryFormatter(); bformatter.Serialize(stream, asset); - stream.Close(); // Now that it's written, rename it so that it can be found. File.Move(tempname, filename); @@ -522,6 +527,9 @@ namespace Flotsam.RegionModules.AssetCache } finally { + if (stream != null) + stream.Close(); + // Even if the write fails with an exception, we need to make sure // that we release the lock on that file, otherwise it'll never get // cached From fe9cca64dea714583c09854a90f2c13fecb12d29 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sun, 4 Oct 2009 09:56:54 -0700 Subject: [PATCH 22/29] Stream needs to be closed before the file can be moved... --- OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs b/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs index 1dc40bc38c..c0bb70cafc 100644 --- a/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs +++ b/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs @@ -499,21 +499,22 @@ namespace Flotsam.RegionModules.AssetCache private void WriteFileCache(string filename, AssetBase asset) { Stream stream = null; + // Make sure the target cache directory exists + string directory = Path.GetDirectoryName(filename); + // Write file first to a temp name, so that it doesn't look + // like it's already cached while it's still writing. + string tempname = Path.Combine(directory, Path.GetRandomFileName()); try { - // Make sure the target cache directory exists - string directory = Path.GetDirectoryName(filename); if (!Directory.Exists(directory)) { Directory.CreateDirectory(directory); } - // Write file first to a temp name, so that it doesn't look - // like it's already cached while it's still writing. - string tempname = Path.Combine(directory, Path.GetRandomFileName()); stream = File.Open(tempname, FileMode.Create); BinaryFormatter bformatter = new BinaryFormatter(); bformatter.Serialize(stream, asset); + stream.Close(); // Now that it's written, rename it so that it can be found. File.Move(tempname, filename); From 30aac00f6bb24e0aed2e8a49907e0c4c573febfd Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sun, 4 Oct 2009 10:12:19 -0700 Subject: [PATCH 23/29] Closing more streams even if things fail. --- .../Communications/Clients/RegionClient.cs | 31 +++++++++++++++---- 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/OpenSim/Framework/Communications/Clients/RegionClient.cs b/OpenSim/Framework/Communications/Clients/RegionClient.cs index 3419ce2650..10be06912a 100644 --- a/OpenSim/Framework/Communications/Clients/RegionClient.cs +++ b/OpenSim/Framework/Communications/Clients/RegionClient.cs @@ -106,7 +106,6 @@ namespace OpenSim.Framework.Communications.Clients AgentCreateRequest.ContentLength = buffer.Length; //Count bytes to send os = AgentCreateRequest.GetRequestStream(); os.Write(buffer, 0, strBuffer.Length); //Send it - os.Close(); //m_log.InfoFormat("[REST COMMS]: Posted CreateChildAgent request to remote sim {0}", uri); } //catch (WebException ex) @@ -116,6 +115,11 @@ namespace OpenSim.Framework.Communications.Clients reason = "cannot contact remote region"; return false; } + finally + { + if (os != null) + os.Close(); + } // Let's wait for the response //m_log.Info("[REST COMMS]: Waiting for a reply after DoCreateChildAgentCall"); @@ -224,7 +228,6 @@ namespace OpenSim.Framework.Communications.Clients ChildUpdateRequest.ContentLength = buffer.Length; //Count bytes to send os = ChildUpdateRequest.GetRequestStream(); os.Write(buffer, 0, strBuffer.Length); //Send it - os.Close(); //m_log.InfoFormat("[REST COMMS]: Posted ChildAgentUpdate request to remote sim {0}", uri); } //catch (WebException ex) @@ -234,6 +237,11 @@ namespace OpenSim.Framework.Communications.Clients return false; } + finally + { + if (os != null) + os.Close(); + } // Let's wait for the response //m_log.Info("[REST COMMS]: Waiting for a reply after ChildAgentUpdate"); @@ -437,7 +445,6 @@ namespace OpenSim.Framework.Communications.Clients ObjectCreateRequest.ContentLength = buffer.Length; //Count bytes to send os = ObjectCreateRequest.GetRequestStream(); os.Write(buffer, 0, strBuffer.Length); //Send it - os.Close(); m_log.InfoFormat("[REST COMMS]: Posted ChildAgentUpdate request to remote sim {0}", uri); } //catch (WebException ex) @@ -447,6 +454,11 @@ namespace OpenSim.Framework.Communications.Clients return false; } + finally + { + if (os != null) + os.Close(); + } // Let's wait for the response //m_log.Info("[REST COMMS]: Waiting for a reply after DoCreateChildAgentCall"); @@ -512,7 +524,6 @@ namespace OpenSim.Framework.Communications.Clients ObjectCreateRequest.ContentLength = buffer.Length; //Count bytes to send os = ObjectCreateRequest.GetRequestStream(); os.Write(buffer, 0, strBuffer.Length); //Send it - os.Close(); //m_log.InfoFormat("[REST COMMS]: Posted CreateObject request to remote sim {0}", uri); } //catch (WebException ex) @@ -522,6 +533,11 @@ namespace OpenSim.Framework.Communications.Clients return false; } + finally + { + if (os != null) + os.Close(); + } // Let's wait for the response //m_log.Info("[REST COMMS]: Waiting for a reply after DoCreateChildAgentCall"); @@ -597,7 +613,6 @@ namespace OpenSim.Framework.Communications.Clients HelloNeighbourRequest.ContentLength = buffer.Length; //Count bytes to send os = HelloNeighbourRequest.GetRequestStream(); os.Write(buffer, 0, strBuffer.Length); //Send it - os.Close(); //m_log.InfoFormat("[REST COMMS]: Posted HelloNeighbour request to remote sim {0}", uri); } //catch (WebException ex) @@ -607,7 +622,11 @@ namespace OpenSim.Framework.Communications.Clients return false; } - + finally + { + if (os != null) + os.Close(); + } // Let's wait for the response //m_log.Info("[REST COMMS]: Waiting for a reply after DoHelloNeighbourCall"); From d93e0a05037495dcdabdffcc9b9f78747271da39 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sun, 4 Oct 2009 10:30:21 -0700 Subject: [PATCH 24/29] Guarding a line that is sometimes throwing a null pointer exception. --- OpenSim/Region/ClientStack/LindenUDP/J2KImage.cs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/OpenSim/Region/ClientStack/LindenUDP/J2KImage.cs b/OpenSim/Region/ClientStack/LindenUDP/J2KImage.cs index 713d43ac55..19ad0b497f 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/J2KImage.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/J2KImage.cs @@ -197,11 +197,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP m_currentPacket = StartPacket; } - if (m_imageManager.Client.PacketHandler.GetQueueCount(ThrottleOutPacketType.Texture) == 0) - { - //m_log.Debug("No textures queued, sending one packet to kickstart it"); - SendPacket(m_imageManager.Client); - } + if ((m_imageManager != null) && (m_imageManager.Client != null) && (m_imageManager.Client.PacketHandler != null)) + if (m_imageManager.Client.PacketHandler.GetQueueCount(ThrottleOutPacketType.Texture) == 0) + { + //m_log.Debug("No textures queued, sending one packet to kickstart it"); + SendPacket(m_imageManager.Client); + } } } } From 022526661be294e74714fcc7afdff5eaee7dc8b8 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sun, 4 Oct 2009 13:38:12 -0700 Subject: [PATCH 25/29] Just trying a few things. This one will reduce the number of async calls. --- OpenSim/Services/Connectors/Asset/AssetServiceConnector.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/OpenSim/Services/Connectors/Asset/AssetServiceConnector.cs b/OpenSim/Services/Connectors/Asset/AssetServiceConnector.cs index d16112db99..b1d41daf1e 100644 --- a/OpenSim/Services/Connectors/Asset/AssetServiceConnector.cs +++ b/OpenSim/Services/Connectors/Asset/AssetServiceConnector.cs @@ -183,7 +183,8 @@ namespace OpenSim.Services.Connectors } else { - Util.FireAndForget(delegate { handler(id, sender, asset); }); + //Util.FireAndForget(delegate { handler(id, sender, asset); }); + handler(id, sender, asset); } return true; From 29a4614529bbda02b9c690d2d1812be1d1e7bbae Mon Sep 17 00:00:00 2001 From: John Hurliman Date: Sun, 4 Oct 2009 13:57:51 -0700 Subject: [PATCH 26/29] * MySQL data tests now pass by fixing a bad fix for a bad cast on the asset Local member in MySQLAssetData * First pass at applying the using(){} pattern to IDisposable objects. Always use the using pattern on IDisposable objects whenever possible, do not manually call .Close() or .Dispose() unless there is no other way to write the code. This pass mostly covers OpenSim.Data.MySQL, and should have no functional change (tests still pass) --- .../VWoHTTP/ClientStack/VWHClientView.cs | 13 +- OpenSim/Data/MSSQL/AutoClosingSqlCommand.cs | 15 +- OpenSim/Data/MSSQL/MSSQLInventoryData.cs | 2 - OpenSim/Data/MSSQL/MSSQLManager.cs | 4 - OpenSim/Data/MSSQL/MSSQLMigration.cs | 1 - OpenSim/Data/Migration.cs | 79 +-- OpenSim/Data/MySQL/MySQLAssetData.cs | 102 ++-- OpenSim/Data/MySQL/MySQLAuthenticationData.cs | 56 +- OpenSim/Data/MySQL/MySQLEstateData.cs | 340 ++++++----- OpenSim/Data/MySQL/MySQLFramework.cs | 14 +- OpenSim/Data/MySQL/MySQLGridData.cs | 179 +++--- OpenSim/Data/MySQL/MySQLInventoryData.cs | 343 ++++++----- OpenSim/Data/MySQL/MySQLLegacyRegionData.cs | 547 ++++++++---------- OpenSim/Data/MySQL/MySQLManager.cs | 60 +- OpenSim/Data/MySQL/MySQLRegionData.cs | 238 ++++---- OpenSim/Data/MySQL/MySQLUserAccountData.cs | 139 +++-- OpenSim/Data/MySQL/MySQLUserData.cs | 362 ++++++------ OpenSim/Region/Application/Application.cs | 11 +- 18 files changed, 1193 insertions(+), 1312 deletions(-) diff --git a/OpenSim/Client/VWoHTTP/ClientStack/VWHClientView.cs b/OpenSim/Client/VWoHTTP/ClientStack/VWHClientView.cs index 8c9eb5fdd5..c649c5ab2a 100644 --- a/OpenSim/Client/VWoHTTP/ClientStack/VWHClientView.cs +++ b/OpenSim/Client/VWoHTTP/ClientStack/VWHClientView.cs @@ -95,16 +95,15 @@ namespace OpenSim.Client.VWoHTTP.ClientStack ManagedImage tmp; Image imgData; + byte[] jpegdata; OpenJPEG.DecodeToImage(asset.Data, out tmp, out imgData); - - MemoryStream ms = new MemoryStream(); - imgData.Save(ms, ImageFormat.Jpeg); - - byte[] jpegdata = ms.GetBuffer(); - - ms.Close(); + using (MemoryStream ms = new MemoryStream()) + { + imgData.Save(ms, ImageFormat.Jpeg); + jpegdata = ms.GetBuffer(); + } resp.ContentType = "image/jpeg"; resp.ContentLength = jpegdata.Length; diff --git a/OpenSim/Data/MSSQL/AutoClosingSqlCommand.cs b/OpenSim/Data/MSSQL/AutoClosingSqlCommand.cs index 93e48cd8ce..0e21880abd 100644 --- a/OpenSim/Data/MSSQL/AutoClosingSqlCommand.cs +++ b/OpenSim/Data/MSSQL/AutoClosingSqlCommand.cs @@ -197,20 +197,11 @@ namespace OpenSim.Data.MSSQL public void Dispose() { SqlConnection conn = realCommand.Connection; - try - { - realCommand.Dispose(); - } + try { realCommand.Dispose(); } finally { - try - { - conn.Close(); - } - finally - { - conn.Dispose(); - } + try { conn.Dispose(); } + finally { } } } diff --git a/OpenSim/Data/MSSQL/MSSQLInventoryData.cs b/OpenSim/Data/MSSQL/MSSQLInventoryData.cs index 1482184402..d49c2b304e 100644 --- a/OpenSim/Data/MSSQL/MSSQLInventoryData.cs +++ b/OpenSim/Data/MSSQL/MSSQLInventoryData.cs @@ -348,8 +348,6 @@ namespace OpenSim.Data.MSSQL //Delete the actual row DeleteOneFolder(folderID, connection); DeleteItemsInFolder(folderID, connection); - - connection.Close(); } } diff --git a/OpenSim/Data/MSSQL/MSSQLManager.cs b/OpenSim/Data/MSSQL/MSSQLManager.cs index 3d7a76882f..992ce023d6 100644 --- a/OpenSim/Data/MSSQL/MSSQLManager.cs +++ b/OpenSim/Data/MSSQL/MSSQLManager.cs @@ -340,8 +340,6 @@ namespace OpenSim.Data.MSSQL MSSQLMigration migration = new MSSQLMigration(connection, assem, migrationStore); migration.Update(); - - connection.Close(); } } @@ -385,9 +383,7 @@ namespace OpenSim.Data.MSSQL m_log.Error(e.ToString()); } } - tables.Close(); } - } /// diff --git a/OpenSim/Data/MSSQL/MSSQLMigration.cs b/OpenSim/Data/MSSQL/MSSQLMigration.cs index aea31c9eaa..549bcb33bb 100644 --- a/OpenSim/Data/MSSQL/MSSQLMigration.cs +++ b/OpenSim/Data/MSSQL/MSSQLMigration.cs @@ -56,7 +56,6 @@ namespace OpenSim.Data.MSSQL { version = Convert.ToInt32(reader["version"]); } - reader.Close(); } } catch diff --git a/OpenSim/Data/Migration.cs b/OpenSim/Data/Migration.cs index e51dc22d94..7a99d4a827 100644 --- a/OpenSim/Data/Migration.cs +++ b/OpenSim/Data/Migration.cs @@ -131,25 +131,26 @@ namespace OpenSim.Data m_log.InfoFormat("[MIGRATIONS] Upgrading {0} to latest revision.", _type); m_log.Info("[MIGRATIONS] NOTE: this may take a while, don't interupt this process!"); - DbCommand cmd = _conn.CreateCommand(); - foreach (KeyValuePair kvp in migrations) + using (DbCommand cmd = _conn.CreateCommand()) { - int newversion = kvp.Key; - cmd.CommandText = kvp.Value; - // we need to up the command timeout to infinite as we might be doing long migrations. - cmd.CommandTimeout = 0; - cmd.ExecuteNonQuery(); + foreach (KeyValuePair kvp in migrations) + { + int newversion = kvp.Key; + cmd.CommandText = kvp.Value; + // we need to up the command timeout to infinite as we might be doing long migrations. + cmd.CommandTimeout = 0; + cmd.ExecuteNonQuery(); - if (version == 0) - { - InsertVersion(_type, newversion); + if (version == 0) + { + InsertVersion(_type, newversion); + } + else + { + UpdateVersion(_type, newversion); + } + version = newversion; } - else - { - UpdateVersion(_type, newversion); - } - version = newversion; - cmd.Dispose(); } } @@ -189,43 +190,45 @@ namespace OpenSim.Data protected virtual int FindVersion(DbConnection conn, string type) { int version = 0; - DbCommand cmd = conn.CreateCommand(); - try + + using (DbCommand cmd = conn.CreateCommand()) { - cmd.CommandText = "select version from migrations where name='" + type +"' order by version desc"; - using (IDataReader reader = cmd.ExecuteReader()) + try { - if (reader.Read()) + cmd.CommandText = "select version from migrations where name='" + type + "' order by version desc"; + using (IDataReader reader = cmd.ExecuteReader()) { - version = Convert.ToInt32(reader["version"]); + if (reader.Read()) + version = Convert.ToInt32(reader["version"]); } - reader.Close(); + } + catch + { + // Something went wrong, so we're version 0 } } - catch - { - // Something went wrong, so we're version 0 - } - cmd.Dispose(); + return version; } private void InsertVersion(string type, int version) { - DbCommand cmd = _conn.CreateCommand(); - cmd.CommandText = "insert into migrations(name, version) values('" + type + "', " + version + ")"; - m_log.InfoFormat("[MIGRATIONS]: Creating {0} at version {1}", type, version); - cmd.ExecuteNonQuery(); - cmd.Dispose(); + using (DbCommand cmd = _conn.CreateCommand()) + { + cmd.CommandText = "insert into migrations(name, version) values('" + type + "', " + version + ")"; + m_log.InfoFormat("[MIGRATIONS]: Creating {0} at version {1}", type, version); + cmd.ExecuteNonQuery(); + } } private void UpdateVersion(string type, int version) { - DbCommand cmd = _conn.CreateCommand(); - cmd.CommandText = "update migrations set version=" + version + " where name='" + type + "'"; - m_log.InfoFormat("[MIGRATIONS]: Updating {0} to version {1}", type, version); - cmd.ExecuteNonQuery(); - cmd.Dispose(); + using (DbCommand cmd = _conn.CreateCommand()) + { + cmd.CommandText = "update migrations set version=" + version + " where name='" + type + "'"; + m_log.InfoFormat("[MIGRATIONS]: Updating {0} to version {1}", type, version); + cmd.ExecuteNonQuery(); + } } // private SortedList GetAllMigrations() diff --git a/OpenSim/Data/MySQL/MySQLAssetData.cs b/OpenSim/Data/MySQL/MySQLAssetData.cs index 0502b2b9a2..8f974400fa 100644 --- a/OpenSim/Data/MySQL/MySQLAssetData.cs +++ b/OpenSim/Data/MySQL/MySQLAssetData.cs @@ -142,46 +142,45 @@ namespace OpenSim.Data.MySQL { _dbConnection.CheckConnection(); - MySqlCommand cmd = - new MySqlCommand( - "SELECT name, description, assetType, local, temporary, data FROM assets WHERE id=?id", - _dbConnection.Connection); - cmd.Parameters.AddWithValue("?id", assetID.ToString()); + using (MySqlCommand cmd = new MySqlCommand( + "SELECT name, description, assetType, local, temporary, data FROM assets WHERE id=?id", + _dbConnection.Connection)) + { + cmd.Parameters.AddWithValue("?id", assetID.ToString()); - try - { - using (MySqlDataReader dbReader = cmd.ExecuteReader(CommandBehavior.SingleRow)) + try { - if (dbReader.Read()) + using (MySqlDataReader dbReader = cmd.ExecuteReader(CommandBehavior.SingleRow)) { - asset = new AssetBase(); - asset.Data = (byte[]) dbReader["data"]; - asset.Description = (string) dbReader["description"]; - asset.FullID = assetID; - try + if (dbReader.Read()) { - asset.Local = (bool)dbReader["local"]; + asset = new AssetBase(); + asset.Data = (byte[])dbReader["data"]; + asset.Description = (string)dbReader["description"]; + asset.FullID = assetID; + + string local = dbReader["local"].ToString(); + if (local.Equals("1") || local.Equals("true", StringComparison.InvariantCultureIgnoreCase)) + asset.Local = true; + else + asset.Local = false; + + asset.Name = (string)dbReader["name"]; + asset.Type = (sbyte)dbReader["assetType"]; + asset.Temporary = Convert.ToBoolean(dbReader["temporary"]); } - catch (InvalidCastException) - { - asset.Local = false; - } - asset.Name = (string) dbReader["name"]; - asset.Type = (sbyte) dbReader["assetType"]; - asset.Temporary = Convert.ToBoolean(dbReader["temporary"]); } - dbReader.Close(); - cmd.Dispose(); + + if (asset != null) + UpdateAccessTime(asset); + } + catch (Exception e) + { + m_log.ErrorFormat( + "[ASSETS DB]: MySql failure fetching asset {0}" + Environment.NewLine + e.ToString() + + Environment.NewLine + "Reconnecting", assetID); + _dbConnection.Reconnect(); } - if (asset != null) - UpdateAccessTime(asset); - } - catch (Exception e) - { - m_log.ErrorFormat( - "[ASSETS DB]: MySql failure fetching asset {0}" + Environment.NewLine + e.ToString() - + Environment.NewLine + "Reconnecting", assetID); - _dbConnection.Reconnect(); } } return asset; @@ -297,32 +296,27 @@ namespace OpenSim.Data.MySQL { _dbConnection.CheckConnection(); - MySqlCommand cmd = - new MySqlCommand( - "SELECT id FROM assets WHERE id=?id", - _dbConnection.Connection); - - cmd.Parameters.AddWithValue("?id", uuid.ToString()); - - try + using (MySqlCommand cmd = new MySqlCommand( + "SELECT id FROM assets WHERE id=?id", + _dbConnection.Connection)) { - using (MySqlDataReader dbReader = cmd.ExecuteReader(CommandBehavior.SingleRow)) + cmd.Parameters.AddWithValue("?id", uuid.ToString()); + + try { - if (dbReader.Read()) + using (MySqlDataReader dbReader = cmd.ExecuteReader(CommandBehavior.SingleRow)) { - assetExists = true; + if (dbReader.Read()) + assetExists = true; } - - dbReader.Close(); - cmd.Dispose(); } - } - catch (Exception e) - { - m_log.ErrorFormat( - "[ASSETS DB]: MySql failure fetching asset {0}" + Environment.NewLine + e.ToString() - + Environment.NewLine + "Attempting reconnection", uuid); - _dbConnection.Reconnect(); + catch (Exception e) + { + m_log.ErrorFormat( + "[ASSETS DB]: MySql failure fetching asset {0}" + Environment.NewLine + e.ToString() + + Environment.NewLine + "Attempting reconnection", uuid); + _dbConnection.Reconnect(); + } } } diff --git a/OpenSim/Data/MySQL/MySQLAuthenticationData.cs b/OpenSim/Data/MySQL/MySQLAuthenticationData.cs index e508b5285b..e96a123348 100644 --- a/OpenSim/Data/MySQL/MySQLAuthenticationData.cs +++ b/OpenSim/Data/MySQL/MySQLAuthenticationData.cs @@ -55,44 +55,38 @@ namespace OpenSim.Data.MySQL AuthenticationData ret = new AuthenticationData(); ret.Data = new Dictionary(); - MySqlCommand cmd = new MySqlCommand( - "select * from `"+m_Realm+"` where UUID = ?principalID" - ); - - cmd.Parameters.AddWithValue("?principalID", principalID.ToString()); - - IDataReader result = ExecuteReader(cmd); - - if (result.Read()) + using (MySqlCommand cmd = new MySqlCommand("select * from `" + m_Realm + "` where UUID = ?principalID")) { - ret.PrincipalID = principalID; + cmd.Parameters.AddWithValue("?principalID", principalID.ToString()); - if (m_ColumnNames == null) + using (IDataReader result = ExecuteReader(cmd)) { - m_ColumnNames = new List(); + if (result.Read()) + { + ret.PrincipalID = principalID; - DataTable schemaTable = result.GetSchemaTable(); - foreach (DataRow row in schemaTable.Rows) - m_ColumnNames.Add(row["ColumnName"].ToString()); + if (m_ColumnNames == null) + { + m_ColumnNames = new List(); + + DataTable schemaTable = result.GetSchemaTable(); + foreach (DataRow row in schemaTable.Rows) + m_ColumnNames.Add(row["ColumnName"].ToString()); + } + + foreach (string s in m_ColumnNames) + { + if (s == "UUID") + continue; + + ret.Data[s] = result[s].ToString(); + } + + return ret; + } } - - foreach (string s in m_ColumnNames) - { - if (s == "UUID") - continue; - - ret.Data[s] = result[s].ToString(); - } - - result.Close(); - CloseReaderCommand(cmd); - - return ret; } - result.Close(); - CloseReaderCommand(cmd); - return null; } diff --git a/OpenSim/Data/MySQL/MySQLEstateData.cs b/OpenSim/Data/MySQL/MySQLEstateData.cs index e8694fcd50..7166b29e8f 100644 --- a/OpenSim/Data/MySQL/MySQLEstateData.cs +++ b/OpenSim/Data/MySQL/MySQLEstateData.cs @@ -95,21 +95,17 @@ namespace OpenSim.Data.MySQL protected void GetWaitTimeout() { - MySqlCommand cmd = new MySqlCommand(m_waitTimeoutSelect, - m_connection); - - using (MySqlDataReader dbReader = - cmd.ExecuteReader(CommandBehavior.SingleRow)) + using (MySqlCommand cmd = new MySqlCommand(m_waitTimeoutSelect, m_connection)) { - if (dbReader.Read()) + using (MySqlDataReader dbReader = cmd.ExecuteReader(CommandBehavior.SingleRow)) { - m_waitTimeout - = Convert.ToInt32(dbReader["@@wait_timeout"]) * - TimeSpan.TicksPerSecond + m_waitTimeoutLeeway; + if (dbReader.Read()) + { + m_waitTimeout + = Convert.ToInt32(dbReader["@@wait_timeout"]) * + TimeSpan.TicksPerSecond + m_waitTimeoutLeeway; + } } - - dbReader.Close(); - cmd.Dispose(); } m_lastConnectionUse = DateTime.Now.Ticks; @@ -147,53 +143,122 @@ namespace OpenSim.Data.MySQL CheckConnection(); - MySqlCommand cmd = m_connection.CreateCommand(); + bool migration = true; - cmd.CommandText = sql; - cmd.Parameters.AddWithValue("?RegionID", regionID.ToString()); - - IDataReader r = cmd.ExecuteReader(); - - if (r.Read()) + using (MySqlCommand cmd = m_connection.CreateCommand()) { - foreach (string name in FieldList) - { - if (m_FieldMap[name].GetValue(es) is bool) - { - int v = Convert.ToInt32(r[name]); - if (v != 0) - m_FieldMap[name].SetValue(es, true); - else - m_FieldMap[name].SetValue(es, false); - } - else if (m_FieldMap[name].GetValue(es) is UUID) - { - UUID uuid = UUID.Zero; + cmd.CommandText = sql; + cmd.Parameters.AddWithValue("?RegionID", regionID.ToString()); - UUID.TryParse(r[name].ToString(), out uuid); - m_FieldMap[name].SetValue(es, uuid); - } - else + using (IDataReader r = cmd.ExecuteReader()) + { + if (r.Read()) { - m_FieldMap[name].SetValue(es, r[name]); + migration = false; + + foreach (string name in FieldList) + { + if (m_FieldMap[name].GetValue(es) is bool) + { + int v = Convert.ToInt32(r[name]); + if (v != 0) + m_FieldMap[name].SetValue(es, true); + else + m_FieldMap[name].SetValue(es, false); + } + else if (m_FieldMap[name].GetValue(es) is UUID) + { + UUID uuid = UUID.Zero; + + UUID.TryParse(r[name].ToString(), out uuid); + m_FieldMap[name].SetValue(es, uuid); + } + else + { + m_FieldMap[name].SetValue(es, r[name]); + } + } } } - r.Close(); } - else + + if (migration) { // Migration case - // - r.Close(); - List names = new List(FieldList); names.Remove("EstateID"); sql = "insert into estate_settings (" + String.Join(",", names.ToArray()) + ") values ( ?" + String.Join(", ?", names.ToArray()) + ")"; + using (MySqlCommand cmd = m_connection.CreateCommand()) + { + cmd.CommandText = sql; + cmd.Parameters.Clear(); + + foreach (string name in FieldList) + { + if (m_FieldMap[name].GetValue(es) is bool) + { + if ((bool)m_FieldMap[name].GetValue(es)) + cmd.Parameters.AddWithValue("?" + name, "1"); + else + cmd.Parameters.AddWithValue("?" + name, "0"); + } + else + { + cmd.Parameters.AddWithValue("?" + name, m_FieldMap[name].GetValue(es).ToString()); + } + } + + cmd.ExecuteNonQuery(); + + cmd.CommandText = "select LAST_INSERT_ID() as id"; + cmd.Parameters.Clear(); + + using (IDataReader r = cmd.ExecuteReader()) + { + r.Read(); + es.EstateID = Convert.ToUInt32(r["id"]); + } + + cmd.CommandText = "insert into estate_map values (?RegionID, ?EstateID)"; + cmd.Parameters.AddWithValue("?RegionID", regionID.ToString()); + cmd.Parameters.AddWithValue("?EstateID", es.EstateID.ToString()); + + // This will throw on dupe key + try { cmd.ExecuteNonQuery(); } + catch (Exception) { } + + // Munge and transfer the ban list + cmd.Parameters.Clear(); + cmd.CommandText = "insert into estateban select " + es.EstateID.ToString() + ", bannedUUID, bannedIp, bannedIpHostMask, '' from regionban where regionban.regionUUID = ?UUID"; + cmd.Parameters.AddWithValue("?UUID", regionID.ToString()); + + try { cmd.ExecuteNonQuery(); } + catch (Exception) { } + + es.Save(); + } + } + + LoadBanList(es); + + es.EstateManagers = LoadUUIDList(es.EstateID, "estate_managers"); + es.EstateAccess = LoadUUIDList(es.EstateID, "estate_users"); + es.EstateGroups = LoadUUIDList(es.EstateID, "estate_groups"); + return es; + } + + public void StoreEstateSettings(EstateSettings es) + { + string sql = "replace into estate_settings (" + String.Join(",", FieldList) + ") values ( ?" + String.Join(", ?", FieldList) + ")"; + + CheckConnection(); + + using (MySqlCommand cmd = m_connection.CreateCommand()) + { cmd.CommandText = sql; - cmd.Parameters.Clear(); foreach (string name in FieldList) { @@ -211,83 +276,8 @@ namespace OpenSim.Data.MySQL } cmd.ExecuteNonQuery(); - - cmd.CommandText = "select LAST_INSERT_ID() as id"; - cmd.Parameters.Clear(); - - r = cmd.ExecuteReader(); - - r.Read(); - - es.EstateID = Convert.ToUInt32(r["id"]); - - r.Close(); - - cmd.CommandText = "insert into estate_map values (?RegionID, ?EstateID)"; - cmd.Parameters.AddWithValue("?RegionID", regionID.ToString()); - cmd.Parameters.AddWithValue("?EstateID", es.EstateID.ToString()); - - // This will throw on dupe key - try - { - cmd.ExecuteNonQuery(); - } - catch (Exception) - { - } - - // Munge and transfer the ban list - // - cmd.Parameters.Clear(); - cmd.CommandText = "insert into estateban select " + es.EstateID.ToString() + ", bannedUUID, bannedIp, bannedIpHostMask, '' from regionban where regionban.regionUUID = ?UUID"; - cmd.Parameters.AddWithValue("?UUID", regionID.ToString()); - - try - { - cmd.ExecuteNonQuery(); - } - catch (Exception) - { - } - - es.Save(); } - LoadBanList(es); - - es.EstateManagers = LoadUUIDList(es.EstateID, "estate_managers"); - es.EstateAccess = LoadUUIDList(es.EstateID, "estate_users"); - es.EstateGroups = LoadUUIDList(es.EstateID, "estate_groups"); - return es; - } - - public void StoreEstateSettings(EstateSettings es) - { - string sql = "replace into estate_settings (" + String.Join(",", FieldList) + ") values ( ?" + String.Join(", ?", FieldList) + ")"; - - CheckConnection(); - - MySqlCommand cmd = m_connection.CreateCommand(); - - cmd.CommandText = sql; - - foreach (string name in FieldList) - { - if (m_FieldMap[name].GetValue(es) is bool) - { - if ((bool)m_FieldMap[name].GetValue(es)) - cmd.Parameters.AddWithValue("?" + name, "1"); - else - cmd.Parameters.AddWithValue("?" + name, "0"); - } - else - { - cmd.Parameters.AddWithValue("?" + name, m_FieldMap[name].GetValue(es).ToString()); - } - } - - cmd.ExecuteNonQuery(); - SaveBanList(es); SaveUUIDList(es.EstateID, "estate_managers", es.EstateManagers); SaveUUIDList(es.EstateID, "estate_users", es.EstateAccess); @@ -300,50 +290,52 @@ namespace OpenSim.Data.MySQL CheckConnection(); - MySqlCommand cmd = m_connection.CreateCommand(); - - cmd.CommandText = "select bannedUUID from estateban where EstateID = ?EstateID"; - cmd.Parameters.AddWithValue("?EstateID", es.EstateID); - - IDataReader r = cmd.ExecuteReader(); - - while (r.Read()) + using (MySqlCommand cmd = m_connection.CreateCommand()) { - EstateBan eb = new EstateBan(); + cmd.CommandText = "select bannedUUID from estateban where EstateID = ?EstateID"; + cmd.Parameters.AddWithValue("?EstateID", es.EstateID); - UUID uuid = new UUID(); - UUID.TryParse(r["bannedUUID"].ToString(), out uuid); + using (IDataReader r = cmd.ExecuteReader()) + { + while (r.Read()) + { + EstateBan eb = new EstateBan(); - eb.BannedUserID = uuid; - eb.BannedHostAddress = "0.0.0.0"; - eb.BannedHostIPMask = "0.0.0.0"; - es.AddBan(eb); + UUID uuid = new UUID(); + UUID.TryParse(r["bannedUUID"].ToString(), out uuid); + + eb.BannedUserID = uuid; + eb.BannedHostAddress = "0.0.0.0"; + eb.BannedHostIPMask = "0.0.0.0"; + es.AddBan(eb); + } + } } - r.Close(); } private void SaveBanList(EstateSettings es) { CheckConnection(); - MySqlCommand cmd = m_connection.CreateCommand(); - - cmd.CommandText = "delete from estateban where EstateID = ?EstateID"; - cmd.Parameters.AddWithValue("?EstateID", es.EstateID.ToString()); - - cmd.ExecuteNonQuery(); - - cmd.Parameters.Clear(); - - cmd.CommandText = "insert into estateban (EstateID, bannedUUID, bannedIp, bannedIpHostMask, bannedNameMask) values ( ?EstateID, ?bannedUUID, '', '', '' )"; - - foreach (EstateBan b in es.EstateBans) + using (MySqlCommand cmd = m_connection.CreateCommand()) { + cmd.CommandText = "delete from estateban where EstateID = ?EstateID"; cmd.Parameters.AddWithValue("?EstateID", es.EstateID.ToString()); - cmd.Parameters.AddWithValue("?bannedUUID", b.BannedUserID.ToString()); cmd.ExecuteNonQuery(); + cmd.Parameters.Clear(); + + cmd.CommandText = "insert into estateban (EstateID, bannedUUID, bannedIp, bannedIpHostMask, bannedNameMask) values ( ?EstateID, ?bannedUUID, '', '', '' )"; + + foreach (EstateBan b in es.EstateBans) + { + cmd.Parameters.AddWithValue("?EstateID", es.EstateID.ToString()); + cmd.Parameters.AddWithValue("?bannedUUID", b.BannedUserID.ToString()); + + cmd.ExecuteNonQuery(); + cmd.Parameters.Clear(); + } } } @@ -351,24 +343,25 @@ namespace OpenSim.Data.MySQL { CheckConnection(); - MySqlCommand cmd = m_connection.CreateCommand(); - - cmd.CommandText = "delete from " + table + " where EstateID = ?EstateID"; - cmd.Parameters.AddWithValue("?EstateID", EstateID.ToString()); - - cmd.ExecuteNonQuery(); - - cmd.Parameters.Clear(); - - cmd.CommandText = "insert into " + table + " (EstateID, uuid) values ( ?EstateID, ?uuid )"; - - foreach (UUID uuid in data) + using (MySqlCommand cmd = m_connection.CreateCommand()) { + cmd.CommandText = "delete from " + table + " where EstateID = ?EstateID"; cmd.Parameters.AddWithValue("?EstateID", EstateID.ToString()); - cmd.Parameters.AddWithValue("?uuid", uuid.ToString()); cmd.ExecuteNonQuery(); + cmd.Parameters.Clear(); + + cmd.CommandText = "insert into " + table + " (EstateID, uuid) values ( ?EstateID, ?uuid )"; + + foreach (UUID uuid in data) + { + cmd.Parameters.AddWithValue("?EstateID", EstateID.ToString()); + cmd.Parameters.AddWithValue("?uuid", uuid.ToString()); + + cmd.ExecuteNonQuery(); + cmd.Parameters.Clear(); + } } } @@ -378,23 +371,24 @@ namespace OpenSim.Data.MySQL CheckConnection(); - MySqlCommand cmd = m_connection.CreateCommand(); - - cmd.CommandText = "select uuid from " + table + " where EstateID = ?EstateID"; - cmd.Parameters.AddWithValue("?EstateID", EstateID); - - IDataReader r = cmd.ExecuteReader(); - - while (r.Read()) + using (MySqlCommand cmd = m_connection.CreateCommand()) { - // EstateBan eb = new EstateBan(); + cmd.CommandText = "select uuid from " + table + " where EstateID = ?EstateID"; + cmd.Parameters.AddWithValue("?EstateID", EstateID); - UUID uuid = new UUID(); - UUID.TryParse(r["uuid"].ToString(), out uuid); + using (IDataReader r = cmd.ExecuteReader()) + { + while (r.Read()) + { + // EstateBan eb = new EstateBan(); - uuids.Add(uuid); + UUID uuid = new UUID(); + UUID.TryParse(r["uuid"].ToString(), out uuid); + + uuids.Add(uuid); + } + } } - r.Close(); return uuids.ToArray(); } diff --git a/OpenSim/Data/MySQL/MySQLFramework.cs b/OpenSim/Data/MySQL/MySQLFramework.cs index 6c73249105..c756c9cf45 100644 --- a/OpenSim/Data/MySQL/MySQLFramework.cs +++ b/OpenSim/Data/MySQL/MySQLFramework.cs @@ -40,6 +40,8 @@ namespace OpenSim.Data.MySQL /// public class MySqlFramework { + private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); + protected MySqlConnection m_Connection; protected MySqlFramework(string connectionString) @@ -70,12 +72,11 @@ namespace OpenSim.Data.MySQL } catch (MySqlException e) { -Console.WriteLine(e.ToString()); + m_log.Error(e.Message, e); if (errorSeen) throw; // This is "Server has gone away" and "Server lost" - // if (e.Number == 2006 || e.Number == 2013) { errorSeen = true; @@ -94,7 +95,7 @@ Console.WriteLine(e.ToString()); } catch (Exception e) { -Console.WriteLine(e.ToString()); + m_log.Error(e.Message, e); return 0; } } @@ -112,12 +113,5 @@ Console.WriteLine(e.ToString()); return cmd.ExecuteReader(); } - - protected void CloseReaderCommand(MySqlCommand cmd) - { - cmd.Connection.Close(); - cmd.Connection.Dispose(); - cmd.Dispose(); - } } } diff --git a/OpenSim/Data/MySQL/MySQLGridData.cs b/OpenSim/Data/MySQL/MySQLGridData.cs index 1ec26090b1..38cb3b75b3 100644 --- a/OpenSim/Data/MySQL/MySQLGridData.cs +++ b/OpenSim/Data/MySQL/MySQLGridData.cs @@ -197,29 +197,27 @@ namespace OpenSim.Data.MySQL param["?xmax"] = xmax.ToString(); param["?ymax"] = ymax.ToString(); - IDbCommand result = - dbm.Manager.Query( + using (IDbCommand result = dbm.Manager.Query( "SELECT * FROM regions WHERE locX >= ?xmin AND locX <= ?xmax AND locY >= ?ymin AND locY <= ?ymax", - param); - IDataReader reader = result.ExecuteReader(); - - RegionProfileData row; - - List rows = new List(); - - while ((row = dbm.Manager.readSimRow(reader)) != null) + param)) { - rows.Add(row); - } - reader.Close(); - result.Dispose(); + using (IDataReader reader = result.ExecuteReader()) + { + RegionProfileData row; - return rows.ToArray(); + List rows = new List(); + + while ((row = dbm.Manager.readSimRow(reader)) != null) + rows.Add(row); + + return rows.ToArray(); + } + } } catch (Exception e) { dbm.Manager.Reconnect(); - m_log.Error(e.ToString()); + m_log.Error(e.Message, e); return null; } finally @@ -243,29 +241,27 @@ namespace OpenSim.Data.MySQL Dictionary param = new Dictionary(); param["?name"] = namePrefix + "%"; - IDbCommand result = - dbm.Manager.Query( - "SELECT * FROM regions WHERE regionName LIKE ?name", - param); - IDataReader reader = result.ExecuteReader(); - - RegionProfileData row; - - List rows = new List(); - - while (rows.Count < maxNum && (row = dbm.Manager.readSimRow(reader)) != null) + using (IDbCommand result = dbm.Manager.Query( + "SELECT * FROM regions WHERE regionName LIKE ?name", + param)) { - rows.Add(row); - } - reader.Close(); - result.Dispose(); + using (IDataReader reader = result.ExecuteReader()) + { + RegionProfileData row; - return rows; + List rows = new List(); + + while (rows.Count < maxNum && (row = dbm.Manager.readSimRow(reader)) != null) + rows.Add(row); + + return rows; + } + } } catch (Exception e) { dbm.Manager.Reconnect(); - m_log.Error(e.ToString()); + m_log.Error(e.Message, e); return null; } finally @@ -286,21 +282,21 @@ namespace OpenSim.Data.MySQL try { Dictionary param = new Dictionary(); - param["?handle"] = handle.ToString(); + param["?handle"] = handle.ToString(); - IDbCommand result = dbm.Manager.Query("SELECT * FROM regions WHERE regionHandle = ?handle", param); - IDataReader reader = result.ExecuteReader(); - - RegionProfileData row = dbm.Manager.readSimRow(reader); - reader.Close(); - result.Dispose(); - - return row; + using (IDbCommand result = dbm.Manager.Query("SELECT * FROM regions WHERE regionHandle = ?handle", param)) + { + using (IDataReader reader = result.ExecuteReader()) + { + RegionProfileData row = dbm.Manager.readSimRow(reader); + return row; + } } + } catch (Exception e) { dbm.Manager.Reconnect(); - m_log.Error(e.ToString()); + m_log.Error(e.Message, e); return null; } finally @@ -321,23 +317,24 @@ namespace OpenSim.Data.MySQL try { Dictionary param = new Dictionary(); - param["?uuid"] = uuid.ToString(); + param["?uuid"] = uuid.ToString(); - IDbCommand result = dbm.Manager.Query("SELECT * FROM regions WHERE uuid = ?uuid", param); - IDataReader reader = result.ExecuteReader(); - - RegionProfileData row = dbm.Manager.readSimRow(reader); - reader.Close(); - result.Dispose(); - - return row; + using (IDbCommand result = dbm.Manager.Query("SELECT * FROM regions WHERE uuid = ?uuid", param)) + { + using (IDataReader reader = result.ExecuteReader()) + { + RegionProfileData row = dbm.Manager.readSimRow(reader); + return row; + } } + } catch (Exception e) { dbm.Manager.Reconnect(); - m_log.Error(e.ToString()); + m_log.Error(e.Message, e); return null; - } finally + } + finally { dbm.Release(); } @@ -359,22 +356,21 @@ namespace OpenSim.Data.MySQL // Add % because this is a like query. param["?regionName"] = regionName + "%"; // Order by statement will return shorter matches first. Only returns one record or no record. - IDbCommand result = - dbm.Manager.Query( - "SELECT * FROM regions WHERE regionName like ?regionName order by LENGTH(regionName) asc LIMIT 1", - param); - IDataReader reader = result.ExecuteReader(); - - RegionProfileData row = dbm.Manager.readSimRow(reader); - reader.Close(); - result.Dispose(); - - return row; + using (IDbCommand result = dbm.Manager.Query( + "SELECT * FROM regions WHERE regionName like ?regionName order by LENGTH(regionName) asc LIMIT 1", + param)) + { + using (IDataReader reader = result.ExecuteReader()) + { + RegionProfileData row = dbm.Manager.readSimRow(reader); + return row; + } + } } catch (Exception e) { dbm.Manager.Reconnect(); - m_log.Error(e.ToString()); + m_log.Error(e.Message, e); return null; } finally @@ -382,6 +378,7 @@ namespace OpenSim.Data.MySQL dbm.Release(); } } + m_log.Error("[GRID DB]: Searched for a Region Name shorter then 3 characters"); return null; } @@ -394,12 +391,12 @@ namespace OpenSim.Data.MySQL override public DataResponse StoreProfile(RegionProfileData profile) { MySQLSuperManager dbm = GetLockedConnection(); - try { + try + { if (dbm.Manager.insertRegion(profile)) - { return DataResponse.RESPONSE_OK; - } - return DataResponse.RESPONSE_ERROR; + else + return DataResponse.RESPONSE_ERROR; } finally { @@ -417,14 +414,14 @@ namespace OpenSim.Data.MySQL { MySQLSuperManager dbm = GetLockedConnection(); - - try { + try + { if (dbm.Manager.deleteRegion(uuid)) - { return DataResponse.RESPONSE_OK; - } - return DataResponse.RESPONSE_ERROR; - } finally + else + return DataResponse.RESPONSE_ERROR; + } + finally { dbm.Release(); } @@ -482,26 +479,26 @@ namespace OpenSim.Data.MySQL try { Dictionary param = new Dictionary(); - param["?x"] = x.ToString(); - param["?y"] = y.ToString(); - IDbCommand result = - dbm.Manager.Query( - "SELECT * FROM reservations WHERE resXMin <= ?x AND resXMax >= ?x AND resYMin <= ?y AND resYMax >= ?y", - param); - IDataReader reader = result.ExecuteReader(); - - ReservationData row = dbm.Manager.readReservationRow(reader); - reader.Close(); - result.Dispose(); - - return row; + param["?x"] = x.ToString(); + param["?y"] = y.ToString(); + using (IDbCommand result = dbm.Manager.Query( + "SELECT * FROM reservations WHERE resXMin <= ?x AND resXMax >= ?x AND resYMin <= ?y AND resYMax >= ?y", + param)) + { + using (IDataReader reader = result.ExecuteReader()) + { + ReservationData row = dbm.Manager.readReservationRow(reader); + return row; + } + } } catch (Exception e) { dbm.Manager.Reconnect(); - m_log.Error(e.ToString()); + m_log.Error(e.Message, e); return null; - } finally + } + finally { dbm.Release(); } diff --git a/OpenSim/Data/MySQL/MySQLInventoryData.cs b/OpenSim/Data/MySQL/MySQLInventoryData.cs index 0eecf06642..598971d680 100644 --- a/OpenSim/Data/MySQL/MySQLInventoryData.cs +++ b/OpenSim/Data/MySQL/MySQLInventoryData.cs @@ -135,30 +135,30 @@ namespace OpenSim.Data.MySQL database.CheckConnection(); - MySqlCommand result = - new MySqlCommand("SELECT * FROM inventoryitems WHERE parentFolderID = ?uuid", - database.Connection); - result.Parameters.AddWithValue("?uuid", folderID.ToString()); - MySqlDataReader reader = result.ExecuteReader(); - - while (reader.Read()) + using (MySqlCommand result = new MySqlCommand("SELECT * FROM inventoryitems WHERE parentFolderID = ?uuid", + database.Connection)) { - // A null item (because something went wrong) breaks everything in the folder - InventoryItemBase item = readInventoryItem(reader); - if (item != null) - items.Add(item); + result.Parameters.AddWithValue("?uuid", folderID.ToString()); + + using (MySqlDataReader reader = result.ExecuteReader()) + { + while (reader.Read()) + { + // A null item (because something went wrong) breaks everything in the folder + InventoryItemBase item = readInventoryItem(reader); + if (item != null) + items.Add(item); + } + + return items; + } } - - reader.Close(); - result.Dispose(); - - return items; } } catch (Exception e) { database.Reconnect(); - m_log.Error(e.ToString()); + m_log.Error(e.Message, e); return null; } } @@ -176,29 +176,28 @@ namespace OpenSim.Data.MySQL { database.CheckConnection(); - MySqlCommand result = - new MySqlCommand( - "SELECT * FROM inventoryfolders WHERE parentFolderID = ?zero AND agentID = ?uuid", - database.Connection); - result.Parameters.AddWithValue("?uuid", user.ToString()); - result.Parameters.AddWithValue("?zero", UUID.Zero.ToString()); - MySqlDataReader reader = result.ExecuteReader(); + using (MySqlCommand result = new MySqlCommand( + "SELECT * FROM inventoryfolders WHERE parentFolderID = ?zero AND agentID = ?uuid", + database.Connection)) + { + result.Parameters.AddWithValue("?uuid", user.ToString()); + result.Parameters.AddWithValue("?zero", UUID.Zero.ToString()); - List items = new List(); - while (reader.Read()) - items.Add(readInventoryFolder(reader)); + using (MySqlDataReader reader = result.ExecuteReader()) + { + List items = new List(); + while (reader.Read()) + items.Add(readInventoryFolder(reader)); - - reader.Close(); - result.Dispose(); - - return items; + return items; + } + } } } catch (Exception e) { database.Reconnect(); - m_log.Error(e.ToString()); + m_log.Error(e.Message, e); return null; } } @@ -217,41 +216,38 @@ namespace OpenSim.Data.MySQL { database.CheckConnection(); - MySqlCommand result = - new MySqlCommand( - "SELECT * FROM inventoryfolders WHERE parentFolderID = ?zero AND agentID = ?uuid", - database.Connection); - result.Parameters.AddWithValue("?uuid", user.ToString()); - result.Parameters.AddWithValue("?zero", UUID.Zero.ToString()); - - MySqlDataReader reader = result.ExecuteReader(); - - List items = new List(); - while (reader.Read()) - items.Add(readInventoryFolder(reader)); - - InventoryFolderBase rootFolder = null; - - // There should only ever be one root folder for a user. However, if there's more - // than one we'll simply use the first one rather than failing. It would be even - // nicer to print some message to this effect, but this feels like it's too low a - // to put such a message out, and it's too minor right now to spare the time to - // suitably refactor. - if (items.Count > 0) + using (MySqlCommand result = new MySqlCommand( + "SELECT * FROM inventoryfolders WHERE parentFolderID = ?zero AND agentID = ?uuid", + database.Connection)) { - rootFolder = items[0]; + result.Parameters.AddWithValue("?uuid", user.ToString()); + result.Parameters.AddWithValue("?zero", UUID.Zero.ToString()); + + using (MySqlDataReader reader = result.ExecuteReader()) + { + List items = new List(); + while (reader.Read()) + items.Add(readInventoryFolder(reader)); + + InventoryFolderBase rootFolder = null; + + // There should only ever be one root folder for a user. However, if there's more + // than one we'll simply use the first one rather than failing. It would be even + // nicer to print some message to this effect, but this feels like it's too low a + // to put such a message out, and it's too minor right now to spare the time to + // suitably refactor. + if (items.Count > 0) + rootFolder = items[0]; + + return rootFolder; + } } - - reader.Close(); - result.Dispose(); - - return rootFolder; } } catch (Exception e) { database.Reconnect(); - m_log.Error(e.ToString()); + m_log.Error(e.Message, e); return null; } } @@ -271,27 +267,26 @@ namespace OpenSim.Data.MySQL { database.CheckConnection(); - MySqlCommand result = - new MySqlCommand("SELECT * FROM inventoryfolders WHERE parentFolderID = ?uuid", - database.Connection); - result.Parameters.AddWithValue("?uuid", parentID.ToString()); - MySqlDataReader reader = result.ExecuteReader(); + using (MySqlCommand result = new MySqlCommand("SELECT * FROM inventoryfolders WHERE parentFolderID = ?uuid", + database.Connection)) + { + result.Parameters.AddWithValue("?uuid", parentID.ToString()); + using (MySqlDataReader reader = result.ExecuteReader()) + { + List items = new List(); - List items = new List(); + while (reader.Read()) + items.Add(readInventoryFolder(reader)); - while (reader.Read()) - items.Add(readInventoryFolder(reader)); - - reader.Close(); - result.Dispose(); - - return items; + return items; + } + } } } catch (Exception e) { database.Reconnect(); - m_log.Error(e.ToString()); + m_log.Error(e.Message, e); return null; } } @@ -370,25 +365,25 @@ namespace OpenSim.Data.MySQL { database.CheckConnection(); - MySqlCommand result = - new MySqlCommand("SELECT * FROM inventoryitems WHERE inventoryID = ?uuid", database.Connection); - result.Parameters.AddWithValue("?uuid", itemID.ToString()); - MySqlDataReader reader = result.ExecuteReader(); + using (MySqlCommand result = new MySqlCommand("SELECT * FROM inventoryitems WHERE inventoryID = ?uuid", database.Connection)) + { + result.Parameters.AddWithValue("?uuid", itemID.ToString()); - InventoryItemBase item = null; - if (reader.Read()) - item = readInventoryItem(reader); + using (MySqlDataReader reader = result.ExecuteReader()) + { + InventoryItemBase item = null; + if (reader.Read()) + item = readInventoryItem(reader); - reader.Close(); - result.Dispose(); - - return item; + return item; + } + } } } catch (Exception e) { database.Reconnect(); - m_log.Error(e.ToString()); + m_log.Error(e.Message, e); } return null; } @@ -413,7 +408,7 @@ namespace OpenSim.Data.MySQL } catch (Exception e) { - m_log.Error(e.ToString()); + m_log.Error(e.Message, e); } return null; @@ -433,24 +428,25 @@ namespace OpenSim.Data.MySQL { database.CheckConnection(); - MySqlCommand result = - new MySqlCommand("SELECT * FROM inventoryfolders WHERE folderID = ?uuid", database.Connection); - result.Parameters.AddWithValue("?uuid", folderID.ToString()); - MySqlDataReader reader = result.ExecuteReader(); + using (MySqlCommand result = new MySqlCommand("SELECT * FROM inventoryfolders WHERE folderID = ?uuid", database.Connection)) + { + result.Parameters.AddWithValue("?uuid", folderID.ToString()); - InventoryFolderBase folder = null; - if (reader.Read()) - folder = readInventoryFolder(reader); - reader.Close(); - result.Dispose(); + using (MySqlDataReader reader = result.ExecuteReader()) + { + InventoryFolderBase folder = null; + if (reader.Read()) + folder = readInventoryFolder(reader); - return folder; + return folder; + } + } } } catch (Exception e) { database.Reconnect(); - m_log.Error(e.ToString()); + m_log.Error(e.Message, e); return null; } } @@ -698,69 +694,73 @@ namespace OpenSim.Data.MySQL try { List folders = new List(); - Dictionary> hashtable - = new Dictionary>(); ; + Dictionary> hashtable = new Dictionary>(); ; List parentFolder = new List(); + bool buildResultsFromHashTable = false; + lock (database) { - MySqlCommand result; - MySqlDataReader reader; - bool buildResultsFromHashTable = false; - database.CheckConnection(); /* Fetch the parent folder from the database to determine the agent ID, and if * we're querying the root of the inventory folder tree */ - result = new MySqlCommand("SELECT * FROM inventoryfolders WHERE folderID = ?uuid", - database.Connection); - result.Parameters.AddWithValue("?uuid", parentID.ToString()); - reader = result.ExecuteReader(); - while (reader.Read()) // Should be at most 1 result - parentFolder.Add(readInventoryFolder(reader)); - reader.Close(); - result.Dispose(); + using (MySqlCommand result = new MySqlCommand("SELECT * FROM inventoryfolders WHERE folderID = ?uuid", database.Connection)) + { + result.Parameters.AddWithValue("?uuid", parentID.ToString()); + + using (MySqlDataReader reader = result.ExecuteReader()) + { + // Should be at most 1 result + while (reader.Read()) + parentFolder.Add(readInventoryFolder(reader)); + } + } if (parentFolder.Count >= 1) // No result means parent folder does not exist { if (parentFolder[0].ParentID == UUID.Zero) // We are querying the root folder { /* Get all of the agent's folders from the database, put them in a list and return it */ - result = new MySqlCommand("SELECT * FROM inventoryfolders WHERE agentID = ?uuid", - database.Connection); - result.Parameters.AddWithValue("?uuid", parentFolder[0].Owner.ToString()); - reader = result.ExecuteReader(); - while (reader.Read()) + using (MySqlCommand result = new MySqlCommand("SELECT * FROM inventoryfolders WHERE agentID = ?uuid", database.Connection)) { - InventoryFolderBase curFolder = readInventoryFolder(reader); - if (curFolder.ID != parentID) // Do not need to add the root node of the tree to the list - folders.Add(curFolder); + result.Parameters.AddWithValue("?uuid", parentFolder[0].Owner.ToString()); + + using (MySqlDataReader reader = result.ExecuteReader()) + { + while (reader.Read()) + { + InventoryFolderBase curFolder = readInventoryFolder(reader); + if (curFolder.ID != parentID) // Do not need to add the root node of the tree to the list + folders.Add(curFolder); + } + } } - reader.Close(); - result.Dispose(); } // if we are querying the root folder else // else we are querying a subtree of the inventory folder tree { /* Get all of the agent's folders from the database, put them all in a hash table * indexed by their parent ID */ - result = new MySqlCommand("SELECT * FROM inventoryfolders WHERE agentID = ?uuid", - database.Connection); - result.Parameters.AddWithValue("?uuid", parentFolder[0].Owner.ToString()); - reader = result.ExecuteReader(); - while (reader.Read()) + using (MySqlCommand result = new MySqlCommand("SELECT * FROM inventoryfolders WHERE agentID = ?uuid", database.Connection)) { - InventoryFolderBase curFolder = readInventoryFolder(reader); - if (hashtable.ContainsKey(curFolder.ParentID)) // Current folder already has a sibling - hashtable[curFolder.ParentID].Add(curFolder); // append to sibling list - else // else current folder has no known (yet) siblings + result.Parameters.AddWithValue("?uuid", parentFolder[0].Owner.ToString()); + + using (MySqlDataReader reader = result.ExecuteReader()) { - List siblingList = new List(); - siblingList.Add(curFolder); - // Current folder has no known (yet) siblings - hashtable.Add(curFolder.ParentID, siblingList); + while (reader.Read()) + { + InventoryFolderBase curFolder = readInventoryFolder(reader); + if (hashtable.ContainsKey(curFolder.ParentID)) // Current folder already has a sibling + hashtable[curFolder.ParentID].Add(curFolder); // append to sibling list + else // else current folder has no known (yet) siblings + { + List siblingList = new List(); + siblingList.Add(curFolder); + // Current folder has no known (yet) siblings + hashtable.Add(curFolder.ParentID, siblingList); + } + } // while more items to read from the database } - } // while more items to read from the database - reader.Close(); - result.Dispose(); + } // Set flag so we know we need to build the results from the hash table after // we unlock the database @@ -781,12 +781,13 @@ namespace OpenSim.Data.MySQL folders.AddRange(hashtable[folders[i].ID]); } } // lock (database) + return folders; } catch (Exception e) { database.Reconnect(); - m_log.Error(e.ToString()); + m_log.Error(e.Message, e); return null; } } @@ -801,19 +802,18 @@ namespace OpenSim.Data.MySQL { database.CheckConnection(); - MySqlCommand cmd = - new MySqlCommand("DELETE FROM inventoryfolders WHERE folderID=?uuid", database.Connection); - cmd.Parameters.AddWithValue("?uuid", folderID.ToString()); - - lock (database) + using (MySqlCommand cmd = new MySqlCommand("DELETE FROM inventoryfolders WHERE folderID=?uuid", database.Connection)) { - cmd.ExecuteNonQuery(); + cmd.Parameters.AddWithValue("?uuid", folderID.ToString()); + + lock (database) + cmd.ExecuteNonQuery(); } } catch (MySqlException e) { database.Reconnect(); - m_log.Error(e.ToString()); + m_log.Error(e.Message, e); } } @@ -827,13 +827,12 @@ namespace OpenSim.Data.MySQL { database.CheckConnection(); - MySqlCommand cmd = - new MySqlCommand("DELETE FROM inventoryitems WHERE parentFolderID=?uuid", database.Connection); - cmd.Parameters.AddWithValue("?uuid", folderID.ToString()); - - lock (database) + using (MySqlCommand cmd = new MySqlCommand("DELETE FROM inventoryitems WHERE parentFolderID=?uuid", database.Connection)) { - cmd.ExecuteNonQuery(); + cmd.Parameters.AddWithValue("?uuid", folderID.ToString()); + + lock (database) + cmd.ExecuteNonQuery(); } } catch (MySqlException e) @@ -865,40 +864,38 @@ namespace OpenSim.Data.MySQL public List fetchActiveGestures(UUID avatarID) { - MySqlDataReader result = null; - MySqlCommand sqlCmd = null; lock (database) { try { database.CheckConnection(); - sqlCmd = new MySqlCommand( - "SELECT * FROM inventoryitems WHERE avatarId = ?uuid AND assetType = ?type and flags = 1", - database.Connection); - sqlCmd.Parameters.AddWithValue("?uuid", avatarID.ToString()); - sqlCmd.Parameters.AddWithValue("?type", (int)AssetType.Gesture); - result = sqlCmd.ExecuteReader(); - List list = new List(); - while (result.Read()) + using (MySqlCommand sqlCmd = new MySqlCommand( + "SELECT * FROM inventoryitems WHERE avatarId = ?uuid AND assetType = ?type and flags = 1", + database.Connection)) { - InventoryItemBase item = readInventoryItem(result); - if (item != null) - list.Add(item); + sqlCmd.Parameters.AddWithValue("?uuid", avatarID.ToString()); + sqlCmd.Parameters.AddWithValue("?type", (int)AssetType.Gesture); + + using (MySqlDataReader result = sqlCmd.ExecuteReader()) + { + List list = new List(); + while (result.Read()) + { + InventoryItemBase item = readInventoryItem(result); + if (item != null) + list.Add(item); + } + return list; + } } - return list; } catch (Exception e) { database.Reconnect(); - m_log.Error(e.ToString()); + m_log.Error(e.Message, e); return null; } - finally - { - if (result != null) result.Close(); - if (sqlCmd != null) sqlCmd.Dispose(); - } } } } diff --git a/OpenSim/Data/MySQL/MySQLLegacyRegionData.cs b/OpenSim/Data/MySQL/MySQLLegacyRegionData.cs index f25bfd7eb0..fe0914b29b 100644 --- a/OpenSim/Data/MySQL/MySQLLegacyRegionData.cs +++ b/OpenSim/Data/MySQL/MySQLLegacyRegionData.cs @@ -268,6 +268,8 @@ namespace OpenSim.Data.MySQL public void RemoveObject(UUID obj, UUID regionUUID) { + List uuids = new List(); + // Formerly, this used to check the region UUID. // That makes no sense, as we remove the contents of a prim // unconditionally, but the prim dependent on the region ID. @@ -278,43 +280,31 @@ namespace OpenSim.Data.MySQL // lock (m_Connection) { - MySqlCommand cmd = m_Connection.CreateCommand(); - - cmd.CommandText = "select UUID from prims where "+ - "SceneGroupID= ?UUID"; - - cmd.Parameters.AddWithValue("UUID", obj.ToString()); - - List uuids = new List(); - - IDataReader reader = ExecuteReader(cmd); - - try + using (MySqlCommand cmd = m_Connection.CreateCommand()) { - while (reader.Read()) + cmd.CommandText = "select UUID from prims where SceneGroupID= ?UUID"; + cmd.Parameters.AddWithValue("UUID", obj.ToString()); + + using (IDataReader reader = ExecuteReader(cmd)) { - uuids.Add(new UUID(reader["UUID"].ToString())); + while (reader.Read()) + uuids.Add(new UUID(reader["UUID"].ToString())); } - } - finally - { - reader.Close(); - } - // delete the main prims - cmd.CommandText = "delete from prims where SceneGroupID= ?UUID"; - ExecuteNonQuery(cmd); - cmd.Dispose(); - - // there is no way this should be < 1 unless there is - // a very corrupt database, but in that case be extra - // safe anyway. - if (uuids.Count > 0) - { - RemoveShapes(uuids); - RemoveItems(uuids); + // delete the main prims + cmd.CommandText = "delete from prims where SceneGroupID= ?UUID"; + ExecuteNonQuery(cmd); } } + + // there is no way this should be < 1 unless there is + // a very corrupt database, but in that case be extra + // safe anyway. + if (uuids.Count > 0) + { + RemoveShapes(uuids); + RemoveItems(uuids); + } } /// @@ -326,19 +316,16 @@ namespace OpenSim.Data.MySQL { lock (m_Connection) { - MySqlCommand cmd = m_Connection.CreateCommand(); + using (MySqlCommand cmd = m_Connection.CreateCommand()) + { + cmd.CommandText = "delete from primitems where PrimID = ?PrimID"; + cmd.Parameters.AddWithValue("PrimID", uuid.ToString()); - cmd.CommandText = "delete from primitems where " + - "PrimID = ?PrimID"; - - cmd.Parameters.AddWithValue("PrimID", uuid.ToString()); - - ExecuteNonQuery(cmd); - cmd.Dispose(); + ExecuteNonQuery(cmd); + } } } - /// /// Remove all persisted shapes for a list of prims /// The caller must acquire the necessrary synchronization locks @@ -349,28 +336,27 @@ namespace OpenSim.Data.MySQL lock (m_Connection) { string sql = "delete from primshapes where "; - MySqlCommand cmd = m_Connection.CreateCommand(); - - for (int i = 0; i < uuids.Count; i++) + + using (MySqlCommand cmd = m_Connection.CreateCommand()) { - if ((i + 1) == uuids.Count) - {// end of the list - sql += "(UUID = ?UUID" + i + ")"; - } - else + for (int i = 0; i < uuids.Count; i++) { - sql += "(UUID = ?UUID" + i + ") or "; + if ((i + 1) == uuids.Count) + {// end of the list + sql += "(UUID = ?UUID" + i + ")"; + } + else + { + sql += "(UUID = ?UUID" + i + ") or "; + } } - } - cmd.CommandText = sql; + cmd.CommandText = sql; - for (int i = 0; i < uuids.Count; i++) - { - cmd.Parameters.AddWithValue("UUID" + i, uuids[i].ToString()); - } + for (int i = 0; i < uuids.Count; i++) + cmd.Parameters.AddWithValue("UUID" + i, uuids[i].ToString()); - ExecuteNonQuery(cmd); - cmd.Dispose(); + ExecuteNonQuery(cmd); + } } } @@ -384,28 +370,28 @@ namespace OpenSim.Data.MySQL lock (m_Connection) { string sql = "delete from primitems where "; - MySqlCommand cmd = m_Connection.CreateCommand(); - - for (int i = 0; i < uuids.Count; i++) + + using (MySqlCommand cmd = m_Connection.CreateCommand()) { - if ((i + 1) == uuids.Count) - {// end of the list - sql += "(PrimID = ?PrimID" + i + ")"; - } - else + for (int i = 0; i < uuids.Count; i++) { - sql += "(PrimID = ?PrimID" + i + ") or "; + if ((i + 1) == uuids.Count) + { + // end of the list + sql += "(PrimID = ?PrimID" + i + ")"; + } + else + { + sql += "(PrimID = ?PrimID" + i + ") or "; + } } - } - cmd.CommandText = sql; + cmd.CommandText = sql; - for (int i = 0; i < uuids.Count; i++) - { - cmd.Parameters.AddWithValue("PrimID" + i, uuids[i].ToString()); - } + for (int i = 0; i < uuids.Count; i++) + cmd.Parameters.AddWithValue("PrimID" + i, uuids[i].ToString()); - ExecuteNonQuery(cmd); - cmd.Dispose(); + ExecuteNonQuery(cmd); + } } } @@ -418,77 +404,71 @@ namespace OpenSim.Data.MySQL lock (m_Connection) { - MySqlCommand cmd = m_Connection.CreateCommand(); - - cmd.CommandText = "select *, " + + using (MySqlCommand cmd = m_Connection.CreateCommand()) + { + cmd.CommandText = "select *, " + "case when prims.UUID = SceneGroupID " + "then 0 else 1 end as sort from prims " + - "left join primshapes on prims.UUID = primshapes.UUID "+ + "left join primshapes on prims.UUID = primshapes.UUID " + "where RegionUUID = ?RegionUUID " + "order by SceneGroupID asc, sort asc, LinkNumber asc"; - - cmd.Parameters.AddWithValue("RegionUUID", regionUUID.ToString()); - IDataReader reader = ExecuteReader(cmd); + cmd.Parameters.AddWithValue("RegionUUID", regionUUID.ToString()); - try - { - while (reader.Read()) + using (IDataReader reader = ExecuteReader(cmd)) { - SceneObjectPart prim = BuildPrim(reader); - if (reader["Shape"] is DBNull) - prim.Shape = PrimitiveBaseShape.Default; - else - prim.Shape = BuildShape(reader); - - prims[prim.UUID] = prim; - - UUID groupID = new UUID(reader["SceneGroupID"].ToString()); - - if (groupID != lastGroupID) // New SOG + while (reader.Read()) { - if (grp != null) - objects[grp.UUID] = grp; + SceneObjectPart prim = BuildPrim(reader); + if (reader["Shape"] is DBNull) + prim.Shape = PrimitiveBaseShape.Default; + else + prim.Shape = BuildShape(reader); - lastGroupID = groupID; - - // There sometimes exist OpenSim bugs that 'orphan groups' so that none of the prims are - // recorded as the root prim (for which the UUID must equal the persisted group UUID). In - // this case, force the UUID to be the same as the group UUID so that at least these can be - // deleted (we need to change the UUID so that any other prims in the linkset can also be - // deleted). - if (prim.UUID != groupID && groupID != UUID.Zero) + prims[prim.UUID] = prim; + + UUID groupID = new UUID(reader["SceneGroupID"].ToString()); + + if (groupID != lastGroupID) // New SOG { - m_log.WarnFormat( - "[REGION DB]: Found root prim {0} {1} at {2} where group was actually {3}. Forcing UUID to group UUID", - prim.Name, prim.UUID, prim.GroupPosition, groupID); - - prim.UUID = groupID; + if (grp != null) + objects[grp.UUID] = grp; + + lastGroupID = groupID; + + // There sometimes exist OpenSim bugs that 'orphan groups' so that none of the prims are + // recorded as the root prim (for which the UUID must equal the persisted group UUID). In + // this case, force the UUID to be the same as the group UUID so that at least these can be + // deleted (we need to change the UUID so that any other prims in the linkset can also be + // deleted). + if (prim.UUID != groupID && groupID != UUID.Zero) + { + m_log.WarnFormat( + "[REGION DB]: Found root prim {0} {1} at {2} where group was actually {3}. Forcing UUID to group UUID", + prim.Name, prim.UUID, prim.GroupPosition, groupID); + + prim.UUID = groupID; + } + + grp = new SceneObjectGroup(prim); } + else + { + // Black magic to preserve link numbers + // + int link = prim.LinkNum; - grp = new SceneObjectGroup(prim); - } - else - { - // Black magic to preserve link numbers - // - int link = prim.LinkNum; + grp.AddPart(prim); - grp.AddPart(prim); - - if (link != 0) - prim.LinkNum = link; + if (link != 0) + prim.LinkNum = link; + } } } - } - finally - { - reader.Close(); - } - if (grp != null) - objects[grp.UUID] = grp; - cmd.Dispose(); + if (grp != null) + objects[grp.UUID] = grp; + } } // Instead of attempting to LoadItems on every prim, @@ -498,34 +478,29 @@ namespace OpenSim.Data.MySQL List primsWithInventory = new List(); lock (m_Connection) { - MySqlCommand itemCmd = m_Connection.CreateCommand(); - itemCmd.CommandText = "select distinct primID from primitems"; - IDataReader itemReader = ExecuteReader(itemCmd); - try + using (MySqlCommand itemCmd = m_Connection.CreateCommand()) { - while (itemReader.Read()) + itemCmd.CommandText = "select distinct primID from primitems"; + using (IDataReader itemReader = ExecuteReader(itemCmd)) { - if (!(itemReader["primID"] is DBNull)) + while (itemReader.Read()) { - UUID primID = new UUID(itemReader["primID"].ToString()); - if (prims.ContainsKey(primID)) + if (!(itemReader["primID"] is DBNull)) { - primsWithInventory.Add(prims[primID]); + UUID primID = new UUID(itemReader["primID"].ToString()); + if (prims.ContainsKey(primID)) + { + primsWithInventory.Add(prims[primID]); + } } } } } - finally - { - itemReader.Close(); - } - itemCmd.Dispose(); } foreach (SceneObjectPart prim in primsWithInventory) - { LoadItems(prim); - } + m_log.DebugFormat("[REGION DB]: Loaded {0} objects using {1} prims", objects.Count, prims.Count); return new List(objects.Values); } @@ -538,34 +513,25 @@ namespace OpenSim.Data.MySQL { lock (m_Connection) { - MySqlCommand cmd = m_Connection.CreateCommand(); + List inventory = new List(); - cmd.CommandText = "select * from primitems where "+ - "PrimID = ?PrimID"; - - cmd.Parameters.AddWithValue("PrimID", prim.UUID.ToString()); - - IDataReader reader = ExecuteReader(cmd); - List inventory = - new List(); - - try + using (MySqlCommand cmd = m_Connection.CreateCommand()) { - while (reader.Read()) - { - TaskInventoryItem item = BuildItem(reader); + cmd.CommandText = "select * from primitems where PrimID = ?PrimID"; + cmd.Parameters.AddWithValue("PrimID", prim.UUID.ToString()); - item.ParentID = prim.UUID; // Values in database are - // often wrong - inventory.Add(item); + using (IDataReader reader = ExecuteReader(cmd)) + { + while (reader.Read()) + { + TaskInventoryItem item = BuildItem(reader); + + item.ParentID = prim.UUID; // Values in database are often wrong + inventory.Add(item); + } } } - finally - { - reader.Close(); - } - cmd.Dispose(); prim.Inventory.RestoreInventoryItems(inventory); } } @@ -576,23 +542,21 @@ namespace OpenSim.Data.MySQL lock (m_Connection) { - MySqlCommand cmd = m_Connection.CreateCommand(); + using (MySqlCommand cmd = m_Connection.CreateCommand()) + { + cmd.CommandText = "delete from terrain where RegionUUID = ?RegionUUID"; + cmd.Parameters.AddWithValue("RegionUUID", regionID.ToString()); - cmd.CommandText = "delete from terrain where " + - "RegionUUID = ?RegionUUID"; - cmd.Parameters.AddWithValue("RegionUUID", regionID.ToString()); + ExecuteNonQuery(cmd); - ExecuteNonQuery(cmd); - - cmd.CommandText = "insert into terrain (RegionUUID, " + + cmd.CommandText = "insert into terrain (RegionUUID, " + "Revision, Heightfield) values (?RegionUUID, " + "1, ?Heightfield)"; - cmd.Parameters.AddWithValue("Heightfield", - SerializeTerrain(ter)); - - ExecuteNonQuery(cmd); - cmd.Dispose(); + cmd.Parameters.AddWithValue("Heightfield", SerializeTerrain(ter)); + + ExecuteNonQuery(cmd); + } } } @@ -602,42 +566,40 @@ namespace OpenSim.Data.MySQL lock (m_Connection) { - MySqlCommand cmd = m_Connection.CreateCommand(); - cmd.CommandText = "select RegionUUID, Revision, Heightfield " + - "from terrain where RegionUUID = ?RegionUUID "+ - "order by Revision desc limit 1"; - cmd.Parameters.AddWithValue("RegionUUID", regionID.ToString()); - - IDataReader reader = ExecuteReader(cmd); - - try + using (MySqlCommand cmd = m_Connection.CreateCommand()) { - while (reader.Read()) + cmd.CommandText = "select RegionUUID, Revision, Heightfield " + + "from terrain where RegionUUID = ?RegionUUID " + + "order by Revision desc limit 1"; + cmd.Parameters.AddWithValue("RegionUUID", regionID.ToString()); + + using (IDataReader reader = ExecuteReader(cmd)) { - terrain = new double[(int)Constants.RegionSize, (int)Constants.RegionSize]; - terrain.Initialize(); - - MemoryStream mstr = new MemoryStream((byte[]) reader["Heightfield"]); - int rev = 0; - - BinaryReader br = new BinaryReader(mstr); - for (int x = 0; x < (int)Constants.RegionSize; x++) + while (reader.Read()) { - for (int y = 0; y < (int)Constants.RegionSize; y++) + int rev = Convert.ToInt32(reader["Revision"]); + + terrain = new double[(int)Constants.RegionSize, (int)Constants.RegionSize]; + terrain.Initialize(); + + using (MemoryStream mstr = new MemoryStream((byte[])reader["Heightfield"])) { - terrain[x, y] = br.ReadDouble(); + using (BinaryReader br = new BinaryReader(mstr)) + { + for (int x = 0; x < (int)Constants.RegionSize; x++) + { + for (int y = 0; y < (int)Constants.RegionSize; y++) + { + terrain[x, y] = br.ReadDouble(); + } + } + } + + m_log.InfoFormat("[REGION DB]: Loaded terrain revision r{0}", rev); } - rev = Convert.ToInt32(reader["Revision"]); } - m_log.InfoFormat("[REGION DB]: Loaded terrain " + - "revision r{0}", rev); } } - finally - { - reader.Close(); - } - cmd.Dispose(); } return terrain; @@ -647,14 +609,13 @@ namespace OpenSim.Data.MySQL { lock (m_Connection) { - MySqlCommand cmd = m_Connection.CreateCommand(); + using (MySqlCommand cmd = m_Connection.CreateCommand()) + { + cmd.CommandText = "delete from land where UUID = ?UUID"; + cmd.Parameters.AddWithValue("UUID", globalID.ToString()); - cmd.CommandText = "delete from land where UUID = ?UUID"; - - cmd.Parameters.AddWithValue("UUID", globalID.ToString()); - - ExecuteNonQuery(cmd); - cmd.Dispose(); + ExecuteNonQuery(cmd); + } } } @@ -662,9 +623,9 @@ namespace OpenSim.Data.MySQL { lock (m_Connection) { - MySqlCommand cmd = m_Connection.CreateCommand(); - - cmd.CommandText = "replace into land (UUID, RegionUUID, " + + using (MySqlCommand cmd = m_Connection.CreateCommand()) + { + cmd.CommandText = "replace into land (UUID, RegionUUID, " + "LocalLandID, Bitmap, Name, Description, " + "OwnerUUID, IsGroupOwned, Area, AuctionID, " + "Category, ClaimDate, ClaimPrice, GroupUUID, " + @@ -685,28 +646,26 @@ namespace OpenSim.Data.MySQL "?UserLookAtX, ?UserLookAtY, ?UserLookAtZ, " + "?AuthbuyerID, ?OtherCleanTime, ?Dwell)"; - FillLandCommand(cmd, parcel.LandData, parcel.RegionUUID); + FillLandCommand(cmd, parcel.LandData, parcel.RegionUUID); - ExecuteNonQuery(cmd); - - cmd.CommandText = "delete from landaccesslist where " + - "LandUUID = ?UUID"; - - ExecuteNonQuery(cmd); - - cmd.Parameters.Clear(); - cmd.CommandText = "insert into landaccesslist (LandUUID, " + - "AccessUUID, Flags) values (?LandUUID, ?AccessUUID, " + - "?Flags)"; - - foreach (ParcelManager.ParcelAccessEntry entry in - parcel.LandData.ParcelAccessList) - { - FillLandAccessCommand(cmd, entry, parcel.LandData.GlobalID); ExecuteNonQuery(cmd); + + cmd.CommandText = "delete from landaccesslist where LandUUID = ?UUID"; + + ExecuteNonQuery(cmd); + cmd.Parameters.Clear(); + cmd.CommandText = "insert into landaccesslist (LandUUID, " + + "AccessUUID, Flags) values (?LandUUID, ?AccessUUID, " + + "?Flags)"; + + foreach (ParcelManager.ParcelAccessEntry entry in parcel.LandData.ParcelAccessList) + { + FillLandAccessCommand(cmd, entry, parcel.LandData.GlobalID); + ExecuteNonQuery(cmd); + cmd.Parameters.Clear(); + } } - cmd.Dispose(); } } @@ -716,35 +675,28 @@ namespace OpenSim.Data.MySQL lock (m_Connection) { - MySqlCommand cmd = m_Connection.CreateCommand(); - - cmd.CommandText = "select * from regionsettings where " + - "regionUUID = ?RegionUUID"; - cmd.Parameters.AddWithValue("regionUUID", regionUUID); - - IDataReader reader = ExecuteReader(cmd); - - try + using (MySqlCommand cmd = m_Connection.CreateCommand()) { - if (reader.Read()) - { - rs = BuildRegionSettings(reader); - rs.OnSave += StoreRegionSettings; - } - else - { - rs = new RegionSettings(); - rs.RegionUUID = regionUUID; - rs.OnSave += StoreRegionSettings; + cmd.CommandText = "select * from regionsettings where regionUUID = ?RegionUUID"; + cmd.Parameters.AddWithValue("regionUUID", regionUUID); - StoreRegionSettings(rs); + using (IDataReader reader = ExecuteReader(cmd)) + { + if (reader.Read()) + { + rs = BuildRegionSettings(reader); + rs.OnSave += StoreRegionSettings; + } + else + { + rs = new RegionSettings(); + rs.RegionUUID = regionUUID; + rs.OnSave += StoreRegionSettings; + + StoreRegionSettings(rs); + } } } - finally - { - reader.Close(); - } - cmd.Dispose(); } return rs; @@ -754,9 +706,9 @@ namespace OpenSim.Data.MySQL { lock (m_Connection) { - MySqlCommand cmd = m_Connection.CreateCommand(); - - cmd.CommandText = "replace into regionsettings (regionUUID, " + + using (MySqlCommand cmd = m_Connection.CreateCommand()) + { + cmd.CommandText = "replace into regionsettings (regionUUID, " + "block_terraform, block_fly, allow_damage, " + "restrict_pushing, allow_land_resell, " + "allow_land_join_divide, block_show_in_search, " + @@ -766,8 +718,8 @@ namespace OpenSim.Data.MySQL "terrain_texture_2, terrain_texture_3, " + "terrain_texture_4, elevation_1_nw, " + "elevation_2_nw, elevation_1_ne, " + - "elevation_2_ne, elevation_1_se, "+ - "elevation_2_se, elevation_1_sw, "+ + "elevation_2_ne, elevation_1_se, " + + "elevation_2_se, elevation_1_sw, " + "elevation_2_sw, water_height, " + "terrain_raise_limit, terrain_lower_limit, " + "use_estate_sun, fixed_sun, sun_position, " + @@ -789,11 +741,10 @@ namespace OpenSim.Data.MySQL "?SunVectorX, ?SunVectorY, ?SunVectorZ, " + "?LoadedCreationDateTime, ?LoadedCreationID)"; - FillRegionSettingsCommand(cmd, rs); - - ExecuteNonQuery(cmd); - cmd.Dispose(); + FillRegionSettingsCommand(cmd, rs); + ExecuteNonQuery(cmd); + } } } @@ -803,52 +754,38 @@ namespace OpenSim.Data.MySQL lock (m_Connection) { - MySqlCommand cmd = m_Connection.CreateCommand(); - - cmd.CommandText = "select * from land where " + - "RegionUUID = ?RegionUUID"; - - cmd.Parameters.AddWithValue("RegionUUID", regionUUID.ToString()); - - IDataReader reader = ExecuteReader(cmd); - - try + using (MySqlCommand cmd = m_Connection.CreateCommand()) { - while (reader.Read()) - { - LandData newLand = BuildLandData(reader); - landData.Add(newLand); - } - } - finally - { - reader.Close(); - } + cmd.CommandText = "select * from land where RegionUUID = ?RegionUUID"; + cmd.Parameters.AddWithValue("RegionUUID", regionUUID.ToString()); - foreach (LandData land in landData) - { - cmd.Parameters.Clear(); - - cmd.CommandText = "select * from landaccesslist " + - "where LandUUID = ?LandUUID"; - - cmd.Parameters.AddWithValue("LandUUID", land.GlobalID.ToString()); - - reader = ExecuteReader(cmd); - - try + using (IDataReader reader = ExecuteReader(cmd)) { while (reader.Read()) { - land.ParcelAccessList.Add(BuildLandAccessData(reader)); + LandData newLand = BuildLandData(reader); + landData.Add(newLand); } } - finally + } + + using (MySqlCommand cmd = m_Connection.CreateCommand()) + { + foreach (LandData land in landData) { - reader.Close(); + cmd.Parameters.Clear(); + cmd.CommandText = "select * from landaccesslist where LandUUID = ?LandUUID"; + cmd.Parameters.AddWithValue("LandUUID", land.GlobalID.ToString()); + + using (IDataReader reader = ExecuteReader(cmd)) + { + while (reader.Read()) + { + land.ParcelAccessList.Add(BuildLandAccessData(reader)); + } + } } } - cmd.Dispose(); } return landData; diff --git a/OpenSim/Data/MySQL/MySQLManager.cs b/OpenSim/Data/MySQL/MySQLManager.cs index a6cce57819..a724a504a9 100644 --- a/OpenSim/Data/MySQL/MySQLManager.cs +++ b/OpenSim/Data/MySQL/MySQLManager.cs @@ -134,18 +134,16 @@ namespace OpenSim.Data.MySQL /// protected void GetWaitTimeout() { - MySqlCommand cmd = new MySqlCommand(m_waitTimeoutSelect, dbcon); - - using (MySqlDataReader dbReader = cmd.ExecuteReader(CommandBehavior.SingleRow)) + using (MySqlCommand cmd = new MySqlCommand(m_waitTimeoutSelect, dbcon)) { - if (dbReader.Read()) + using (MySqlDataReader dbReader = cmd.ExecuteReader(CommandBehavior.SingleRow)) { - m_waitTimeout - = Convert.ToInt32(dbReader["@@wait_timeout"]) * TimeSpan.TicksPerSecond + m_waitTimeoutLeeway; + if (dbReader.Read()) + { + m_waitTimeout + = Convert.ToInt32(dbReader["@@wait_timeout"]) * TimeSpan.TicksPerSecond + m_waitTimeoutLeeway; + } } - - dbReader.Close(); - cmd.Dispose(); } m_lastConnectionUse = DateTime.Now.Ticks; @@ -303,31 +301,31 @@ namespace OpenSim.Data.MySQL { CheckConnection(); - MySqlCommand tablesCmd = - new MySqlCommand( - "SELECT TABLE_NAME, TABLE_COMMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA=?dbname", - dbcon); - tablesCmd.Parameters.AddWithValue("?dbname", dbcon.Database); - - using (MySqlDataReader tables = tablesCmd.ExecuteReader()) + using (MySqlCommand tablesCmd = new MySqlCommand( + "SELECT TABLE_NAME, TABLE_COMMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA=?dbname", + dbcon)) { - while (tables.Read()) + tablesCmd.Parameters.AddWithValue("?dbname", dbcon.Database); + + using (MySqlDataReader tables = tablesCmd.ExecuteReader()) { - try + while (tables.Read()) { - string tableName = (string) tables["TABLE_NAME"]; - string comment = (string) tables["TABLE_COMMENT"]; - if (tableList.ContainsKey(tableName)) + try { - tableList[tableName] = comment; + string tableName = (string)tables["TABLE_NAME"]; + string comment = (string)tables["TABLE_COMMENT"]; + if (tableList.ContainsKey(tableName)) + { + tableList[tableName] = comment; + } + } + catch (Exception e) + { + m_log.Error(e.Message, e); } } - catch (Exception e) - { - m_log.Error(e.ToString()); - } } - tables.Close(); } } } @@ -346,19 +344,19 @@ namespace OpenSim.Data.MySQL { CheckConnection(); // Not sure if this one is necessary - MySqlCommand dbcommand = (MySqlCommand) dbcon.CreateCommand(); + MySqlCommand dbcommand = (MySqlCommand)dbcon.CreateCommand(); dbcommand.CommandText = sql; foreach (KeyValuePair param in parameters) { dbcommand.Parameters.AddWithValue(param.Key, param.Value); } - return (IDbCommand) dbcommand; + return (IDbCommand)dbcommand; } catch (Exception e) { // Return null if it fails. - m_log.Error("Failed during Query generation: " + e.ToString()); + m_log.Error("Failed during Query generation: " + e.Message, e); return null; } } @@ -694,8 +692,6 @@ namespace OpenSim.Data.MySQL ret.Add(attachpoint, item); } - r.Close(); - return ret; } diff --git a/OpenSim/Data/MySQL/MySQLRegionData.cs b/OpenSim/Data/MySQL/MySQLRegionData.cs index 06ef624b4a..04b24b6362 100644 --- a/OpenSim/Data/MySQL/MySQLRegionData.cs +++ b/OpenSim/Data/MySQL/MySQLRegionData.cs @@ -56,12 +56,13 @@ namespace OpenSim.Data.MySQL if (scopeID != UUID.Zero) command += " and ScopeID = ?scopeID"; - MySqlCommand cmd = new MySqlCommand(command); + using (MySqlCommand cmd = new MySqlCommand(command)) + { + cmd.Parameters.AddWithValue("?regionName", regionName); + cmd.Parameters.AddWithValue("?scopeID", scopeID.ToString()); - cmd.Parameters.AddWithValue("?regionName", regionName); - cmd.Parameters.AddWithValue("?scopeID", scopeID.ToString()); - - return RunCommand(cmd); + return RunCommand(cmd); + } } public RegionData Get(int posX, int posY, UUID scopeID) @@ -70,17 +71,18 @@ namespace OpenSim.Data.MySQL if (scopeID != UUID.Zero) command += " and ScopeID = ?scopeID"; - MySqlCommand cmd = new MySqlCommand(command); + using (MySqlCommand cmd = new MySqlCommand(command)) + { + cmd.Parameters.AddWithValue("?posX", posX.ToString()); + cmd.Parameters.AddWithValue("?posY", posY.ToString()); + cmd.Parameters.AddWithValue("?scopeID", scopeID.ToString()); - cmd.Parameters.AddWithValue("?posX", posX.ToString()); - cmd.Parameters.AddWithValue("?posY", posY.ToString()); - cmd.Parameters.AddWithValue("?scopeID", scopeID.ToString()); + List ret = RunCommand(cmd); + if (ret.Count == 0) + return null; - List ret = RunCommand(cmd); - if (ret.Count == 0) - return null; - - return ret[0]; + return ret[0]; + } } public RegionData Get(UUID regionID, UUID scopeID) @@ -89,16 +91,17 @@ namespace OpenSim.Data.MySQL if (scopeID != UUID.Zero) command += " and ScopeID = ?scopeID"; - MySqlCommand cmd = new MySqlCommand(command); + using (MySqlCommand cmd = new MySqlCommand(command)) + { + cmd.Parameters.AddWithValue("?regionID", regionID.ToString()); + cmd.Parameters.AddWithValue("?scopeID", scopeID.ToString()); - cmd.Parameters.AddWithValue("?regionID", regionID.ToString()); - cmd.Parameters.AddWithValue("?scopeID", scopeID.ToString()); + List ret = RunCommand(cmd); + if (ret.Count == 0) + return null; - List ret = RunCommand(cmd); - if (ret.Count == 0) - return null; - - return ret[0]; + return ret[0]; + } } public List Get(int startX, int startY, int endX, int endY, UUID scopeID) @@ -107,71 +110,70 @@ namespace OpenSim.Data.MySQL if (scopeID != UUID.Zero) command += " and ScopeID = ?scopeID"; - MySqlCommand cmd = new MySqlCommand(command); + using (MySqlCommand cmd = new MySqlCommand(command)) + { + cmd.Parameters.AddWithValue("?startX", startX.ToString()); + cmd.Parameters.AddWithValue("?startY", startY.ToString()); + cmd.Parameters.AddWithValue("?endX", endX.ToString()); + cmd.Parameters.AddWithValue("?endY", endY.ToString()); + cmd.Parameters.AddWithValue("?scopeID", scopeID.ToString()); - cmd.Parameters.AddWithValue("?startX", startX.ToString()); - cmd.Parameters.AddWithValue("?startY", startY.ToString()); - cmd.Parameters.AddWithValue("?endX", endX.ToString()); - cmd.Parameters.AddWithValue("?endY", endY.ToString()); - cmd.Parameters.AddWithValue("?scopeID", scopeID.ToString()); - - return RunCommand(cmd); + return RunCommand(cmd); + } } public List RunCommand(MySqlCommand cmd) { List retList = new List(); - IDataReader result = ExecuteReader(cmd); - - while (result.Read()) + using (IDataReader result = ExecuteReader(cmd)) { - RegionData ret = new RegionData(); - ret.Data = new Dictionary(); - - UUID regionID; - UUID.TryParse(result["uuid"].ToString(), out regionID); - ret.RegionID = regionID; - UUID scope; - UUID.TryParse(result["ScopeID"].ToString(), out scope); - ret.ScopeID = scope; - ret.RegionName = result["regionName"].ToString(); - ret.posX = Convert.ToInt32(result["locX"]); - ret.posY = Convert.ToInt32(result["locY"]); - ret.sizeX = Convert.ToInt32(result["sizeX"]); - ret.sizeY = Convert.ToInt32(result["sizeY"]); - - if (m_ColumnNames == null) + while (result.Read()) { - m_ColumnNames = new List(); + RegionData ret = new RegionData(); + ret.Data = new Dictionary(); - DataTable schemaTable = result.GetSchemaTable(); - foreach (DataRow row in schemaTable.Rows) - m_ColumnNames.Add(row["ColumnName"].ToString()); + UUID regionID; + UUID.TryParse(result["uuid"].ToString(), out regionID); + ret.RegionID = regionID; + UUID scope; + UUID.TryParse(result["ScopeID"].ToString(), out scope); + ret.ScopeID = scope; + ret.RegionName = result["regionName"].ToString(); + ret.posX = Convert.ToInt32(result["locX"]); + ret.posY = Convert.ToInt32(result["locY"]); + ret.sizeX = Convert.ToInt32(result["sizeX"]); + ret.sizeY = Convert.ToInt32(result["sizeY"]); + + if (m_ColumnNames == null) + { + m_ColumnNames = new List(); + + DataTable schemaTable = result.GetSchemaTable(); + foreach (DataRow row in schemaTable.Rows) + m_ColumnNames.Add(row["ColumnName"].ToString()); + } + + foreach (string s in m_ColumnNames) + { + if (s == "uuid") + continue; + if (s == "ScopeID") + continue; + if (s == "regionName") + continue; + if (s == "locX") + continue; + if (s == "locY") + continue; + + ret.Data[s] = result[s].ToString(); + } + + retList.Add(ret); } - - foreach (string s in m_ColumnNames) - { - if (s == "uuid") - continue; - if (s == "ScopeID") - continue; - if (s == "regionName") - continue; - if (s == "locX") - continue; - if (s == "locY") - continue; - - ret.Data[s] = result[s].ToString(); - } - - retList.Add(ret); } - result.Close(); - CloseReaderCommand(cmd); - return retList; } @@ -198,76 +200,72 @@ namespace OpenSim.Data.MySQL string[] fields = new List(data.Data.Keys).ToArray(); - MySqlCommand cmd = new MySqlCommand(); - - string update = "update `"+m_Realm+"` set locX=?posX, locY=?posY, sizeX=?sizeX, sizeY=?sizeY"; - foreach (string field in fields) + using (MySqlCommand cmd = new MySqlCommand()) { - update += ", "; - update += "`" + field + "` = ?"+field; + string update = "update `" + m_Realm + "` set locX=?posX, locY=?posY, sizeX=?sizeX, sizeY=?sizeY"; + foreach (string field in fields) + { + update += ", "; + update += "`" + field + "` = ?" + field; - cmd.Parameters.AddWithValue("?"+field, data.Data[field]); - } + cmd.Parameters.AddWithValue("?" + field, data.Data[field]); + } - update += " where uuid = ?regionID"; + update += " where uuid = ?regionID"; - if (data.ScopeID != UUID.Zero) - update += " and ScopeID = ?scopeID"; + if (data.ScopeID != UUID.Zero) + update += " and ScopeID = ?scopeID"; - cmd.CommandText = update; - cmd.Parameters.AddWithValue("?regionID", data.RegionID.ToString()); - cmd.Parameters.AddWithValue("?regionName", data.RegionName); - cmd.Parameters.AddWithValue("?scopeID", data.ScopeID.ToString()); - cmd.Parameters.AddWithValue("?posX", data.posX.ToString()); - cmd.Parameters.AddWithValue("?posY", data.posY.ToString()); - cmd.Parameters.AddWithValue("?sizeX", data.sizeX.ToString()); - cmd.Parameters.AddWithValue("?sizeY", data.sizeY.ToString()); - - if (ExecuteNonQuery(cmd) < 1) - { - string insert = "insert into `" + m_Realm + "` (`uuid`, `ScopeID`, `locX`, `locY`, `sizeX`, `sizeY`, `regionName`, `" + - String.Join("`, `", fields) + - "`) values ( ?regionID, ?scopeID, ?posX, ?posY, ?sizeX, ?sizeY, ?regionName, ?" + String.Join(", ?", fields) + ")"; - - cmd.CommandText = insert; + cmd.CommandText = update; + cmd.Parameters.AddWithValue("?regionID", data.RegionID.ToString()); + cmd.Parameters.AddWithValue("?regionName", data.RegionName); + cmd.Parameters.AddWithValue("?scopeID", data.ScopeID.ToString()); + cmd.Parameters.AddWithValue("?posX", data.posX.ToString()); + cmd.Parameters.AddWithValue("?posY", data.posY.ToString()); + cmd.Parameters.AddWithValue("?sizeX", data.sizeX.ToString()); + cmd.Parameters.AddWithValue("?sizeY", data.sizeY.ToString()); if (ExecuteNonQuery(cmd) < 1) { - cmd.Dispose(); - return false; + string insert = "insert into `" + m_Realm + "` (`uuid`, `ScopeID`, `locX`, `locY`, `sizeX`, `sizeY`, `regionName`, `" + + String.Join("`, `", fields) + + "`) values ( ?regionID, ?scopeID, ?posX, ?posY, ?sizeX, ?sizeY, ?regionName, ?" + String.Join(", ?", fields) + ")"; + + cmd.CommandText = insert; + + if (ExecuteNonQuery(cmd) < 1) + { + return false; + } } } - cmd.Dispose(); - return true; } public bool SetDataItem(UUID regionID, string item, string value) { - MySqlCommand cmd = new MySqlCommand("update `" + m_Realm + - "` set `" + item + "` = ?" + item + " where uuid = ?UUID"); + using (MySqlCommand cmd = new MySqlCommand("update `" + m_Realm + "` set `" + item + "` = ?" + item + " where uuid = ?UUID")) + { + cmd.Parameters.AddWithValue("?" + item, value); + cmd.Parameters.AddWithValue("?UUID", regionID.ToString()); - - cmd.Parameters.AddWithValue("?"+item, value); - cmd.Parameters.AddWithValue("?UUID", regionID.ToString()); - - if (ExecuteNonQuery(cmd) > 0) - return true; + if (ExecuteNonQuery(cmd) > 0) + return true; + } return false; } public bool Delete(UUID regionID) { - MySqlCommand cmd = new MySqlCommand("delete from `" + m_Realm + - "` where uuid = ?UUID"); + using (MySqlCommand cmd = new MySqlCommand("delete from `" + m_Realm + "` where uuid = ?UUID")) + { + cmd.Parameters.AddWithValue("?UUID", regionID.ToString()); - - cmd.Parameters.AddWithValue("?UUID", regionID.ToString()); - - if (ExecuteNonQuery(cmd) > 0) - return true; + if (ExecuteNonQuery(cmd) > 0) + return true; + } return false; } diff --git a/OpenSim/Data/MySQL/MySQLUserAccountData.cs b/OpenSim/Data/MySQL/MySQLUserAccountData.cs index d48144d2e8..c713a119d3 100644 --- a/OpenSim/Data/MySQL/MySQLUserAccountData.cs +++ b/OpenSim/Data/MySQL/MySQLUserAccountData.cs @@ -64,48 +64,44 @@ namespace OpenSim.Data.MySQL if (scopeID != UUID.Zero) command += " and ScopeID = ?scopeID"; - MySqlCommand cmd = new MySqlCommand(command); - - cmd.Parameters.AddWithValue("?principalID", principalID.ToString()); - cmd.Parameters.AddWithValue("?scopeID", scopeID.ToString()); - - IDataReader result = ExecuteReader(cmd); - - if (result.Read()) + using (MySqlCommand cmd = new MySqlCommand(command)) { - ret.PrincipalID = principalID; - UUID scope; - UUID.TryParse(result["ScopeID"].ToString(), out scope); - ret.ScopeID = scope; + cmd.Parameters.AddWithValue("?principalID", principalID.ToString()); + cmd.Parameters.AddWithValue("?scopeID", scopeID.ToString()); - if (m_ColumnNames == null) + using (IDataReader result = ExecuteReader(cmd)) { - m_ColumnNames = new List(); + if (result.Read()) + { + ret.PrincipalID = principalID; + UUID scope; + UUID.TryParse(result["ScopeID"].ToString(), out scope); + ret.ScopeID = scope; - DataTable schemaTable = result.GetSchemaTable(); - foreach (DataRow row in schemaTable.Rows) - m_ColumnNames.Add(row["ColumnName"].ToString()); + if (m_ColumnNames == null) + { + m_ColumnNames = new List(); + + DataTable schemaTable = result.GetSchemaTable(); + foreach (DataRow row in schemaTable.Rows) + m_ColumnNames.Add(row["ColumnName"].ToString()); + } + + foreach (string s in m_ColumnNames) + { + if (s == "UUID") + continue; + if (s == "ScopeID") + continue; + + ret.Data[s] = result[s].ToString(); + } + + return ret; + } } - - foreach (string s in m_ColumnNames) - { - if (s == "UUID") - continue; - if (s == "ScopeID") - continue; - - ret.Data[s] = result[s].ToString(); - } - - result.Close(); - CloseReaderCommand(cmd); - - return ret; } - result.Close(); - CloseReaderCommand(cmd); - return null; } @@ -118,61 +114,60 @@ namespace OpenSim.Data.MySQL string[] fields = new List(data.Data.Keys).ToArray(); - MySqlCommand cmd = new MySqlCommand(); - - string update = "update `"+m_Realm+"` set "; - bool first = true; - foreach (string field in fields) + using (MySqlCommand cmd = new MySqlCommand()) { - if (!first) - update += ", "; - update += "`" + field + "` = ?"+field; + string update = "update `" + m_Realm + "` set "; + bool first = true; + foreach (string field in fields) + { + if (!first) + update += ", "; + update += "`" + field + "` = ?" + field; - first = false; + first = false; - cmd.Parameters.AddWithValue("?"+field, data.Data[field]); - } + cmd.Parameters.AddWithValue("?" + field, data.Data[field]); + } - update += " where UUID = ?principalID"; + update += " where UUID = ?principalID"; - if (data.ScopeID != UUID.Zero) - update += " and ScopeID = ?scopeID"; + if (data.ScopeID != UUID.Zero) + update += " and ScopeID = ?scopeID"; - cmd.CommandText = update; - cmd.Parameters.AddWithValue("?principalID", data.PrincipalID.ToString()); - cmd.Parameters.AddWithValue("?scopeID", data.ScopeID.ToString()); - - if (ExecuteNonQuery(cmd) < 1) - { - string insert = "insert into `" + m_Realm + "` (`UUID`, `ScopeID`, `" + - String.Join("`, `", fields) + - "`) values (?principalID, ?scopeID, ?" + String.Join(", ?", fields) + ")"; - - cmd.CommandText = insert; + cmd.CommandText = update; + cmd.Parameters.AddWithValue("?principalID", data.PrincipalID.ToString()); + cmd.Parameters.AddWithValue("?scopeID", data.ScopeID.ToString()); if (ExecuteNonQuery(cmd) < 1) { - cmd.Dispose(); - return false; + string insert = "insert into `" + m_Realm + "` (`UUID`, `ScopeID`, `" + + String.Join("`, `", fields) + + "`) values (?principalID, ?scopeID, ?" + String.Join(", ?", fields) + ")"; + + cmd.CommandText = insert; + + if (ExecuteNonQuery(cmd) < 1) + { + cmd.Dispose(); + return false; + } } } - cmd.Dispose(); - return true; } public bool SetDataItem(UUID principalID, string item, string value) { - MySqlCommand cmd = new MySqlCommand("update `" + m_Realm + - "` set `" + item + "` = ?" + item + " where UUID = ?UUID"); + using (MySqlCommand cmd = new MySqlCommand("update `" + m_Realm + "` set `" + + item + "` = ?" + item + " where UUID = ?UUID")) + { + cmd.Parameters.AddWithValue("?" + item, value); + cmd.Parameters.AddWithValue("?UUID", principalID.ToString()); - - cmd.Parameters.AddWithValue("?"+item, value); - cmd.Parameters.AddWithValue("?UUID", principalID.ToString()); - - if (ExecuteNonQuery(cmd) > 0) - return true; + if (ExecuteNonQuery(cmd) > 0) + return true; + } return false; } diff --git a/OpenSim/Data/MySQL/MySQLUserData.cs b/OpenSim/Data/MySQL/MySQLUserData.cs index 04f872f249..bd46dfc00b 100644 --- a/OpenSim/Data/MySQL/MySQLUserData.cs +++ b/OpenSim/Data/MySQL/MySQLUserData.cs @@ -181,21 +181,20 @@ namespace OpenSim.Data.MySQL param["?first"] = user; param["?second"] = last; - IDbCommand result = - dbm.Manager.Query( - "SELECT * FROM " + m_usersTableName + " WHERE username = ?first AND lastname = ?second", param); - IDataReader reader = result.ExecuteReader(); - - UserProfileData row = dbm.Manager.readUserRow(reader); - - reader.Dispose(); - result.Dispose(); - return row; + using (IDbCommand result = dbm.Manager.Query( + "SELECT * FROM " + m_usersTableName + " WHERE username = ?first AND lastname = ?second", param)) + { + using (IDataReader reader = result.ExecuteReader()) + { + UserProfileData row = dbm.Manager.readUserRow(reader); + return row; + } + } } catch (Exception e) { dbm.Manager.Reconnect(); - m_log.Error(e.ToString()); + m_log.Error(e.Message, e); return null; } finally @@ -220,28 +219,30 @@ namespace OpenSim.Data.MySQL try { - IDbCommand adder = - dbm.Manager.Query( - "INSERT INTO `" + m_userFriendsTableName + "` " + - "(`ownerID`,`friendID`,`friendPerms`,`datetimestamp`) " + - "VALUES " + - "(?ownerID,?friendID,?friendPerms,?datetimestamp)", - param); - adder.ExecuteNonQuery(); + using (IDbCommand adder = dbm.Manager.Query( + "INSERT INTO `" + m_userFriendsTableName + "` " + + "(`ownerID`,`friendID`,`friendPerms`,`datetimestamp`) " + + "VALUES " + + "(?ownerID,?friendID,?friendPerms,?datetimestamp)", + param)) + { + adder.ExecuteNonQuery(); + } - adder = - dbm.Manager.Query( - "INSERT INTO `" + m_userFriendsTableName + "` " + - "(`ownerID`,`friendID`,`friendPerms`,`datetimestamp`) " + - "VALUES " + - "(?friendID,?ownerID,?friendPerms,?datetimestamp)", - param); - adder.ExecuteNonQuery(); + using (IDbCommand adder = dbm.Manager.Query( + "INSERT INTO `" + m_userFriendsTableName + "` " + + "(`ownerID`,`friendID`,`friendPerms`,`datetimestamp`) " + + "VALUES " + + "(?friendID,?ownerID,?friendPerms,?datetimestamp)", + param)) + { + adder.ExecuteNonQuery(); + } } catch (Exception e) { dbm.Manager.Reconnect(); - m_log.Error(e.ToString()); + m_log.Error(e.Message, e); return; } finally @@ -260,22 +261,24 @@ namespace OpenSim.Data.MySQL try { - IDbCommand updater = - dbm.Manager.Query( + using (IDbCommand updater = dbm.Manager.Query( "delete from " + m_userFriendsTableName + " where ownerID = ?ownerID and friendID = ?friendID", - param); - updater.ExecuteNonQuery(); + param)) + { + updater.ExecuteNonQuery(); + } - updater = - dbm.Manager.Query( + using (IDbCommand updater = dbm.Manager.Query( "delete from " + m_userFriendsTableName + " where ownerID = ?friendID and friendID = ?ownerID", - param); - updater.ExecuteNonQuery(); + param)) + { + updater.ExecuteNonQuery(); + } } catch (Exception e) { dbm.Manager.Reconnect(); - m_log.Error(e.ToString()); + m_log.Error(e.Message, e); return; } finally @@ -295,18 +298,19 @@ namespace OpenSim.Data.MySQL try { - IDbCommand updater = - dbm.Manager.Query( + using (IDbCommand updater = dbm.Manager.Query( "update " + m_userFriendsTableName + " SET friendPerms = ?friendPerms " + "where ownerID = ?ownerID and friendID = ?friendID", - param); - updater.ExecuteNonQuery(); + param)) + { + updater.ExecuteNonQuery(); + } } catch (Exception e) { dbm.Manager.Reconnect(); - m_log.Error(e.ToString()); + m_log.Error(e.Message, e); return; } finally @@ -327,34 +331,33 @@ namespace OpenSim.Data.MySQL try { //Left Join userfriends to itself - IDbCommand result = - dbm.Manager.Query( - "select a.ownerID,a.friendID,a.friendPerms,b.friendPerms as ownerperms from " + - m_userFriendsTableName + " as a, " + m_userFriendsTableName + " as b" + - " where a.ownerID = ?ownerID and b.ownerID = a.friendID and b.friendID = a.ownerID", - param); - IDataReader reader = result.ExecuteReader(); - - while (reader.Read()) + using (IDbCommand result = dbm.Manager.Query( + "select a.ownerID,a.friendID,a.friendPerms,b.friendPerms as ownerperms from " + + m_userFriendsTableName + " as a, " + m_userFriendsTableName + " as b" + + " where a.ownerID = ?ownerID and b.ownerID = a.friendID and b.friendID = a.ownerID", + param)) { - FriendListItem fli = new FriendListItem(); - fli.FriendListOwner = new UUID((string) reader["ownerID"]); - fli.Friend = new UUID((string) reader["friendID"]); - fli.FriendPerms = (uint) Convert.ToInt32(reader["friendPerms"]); + using (IDataReader reader = result.ExecuteReader()) + { + while (reader.Read()) + { + FriendListItem fli = new FriendListItem(); + fli.FriendListOwner = new UUID((string)reader["ownerID"]); + fli.Friend = new UUID((string)reader["friendID"]); + fli.FriendPerms = (uint)Convert.ToInt32(reader["friendPerms"]); - // This is not a real column in the database table, it's a joined column from the opposite record - fli.FriendListOwnerPerms = (uint) Convert.ToInt32(reader["ownerperms"]); + // This is not a real column in the database table, it's a joined column from the opposite record + fli.FriendListOwnerPerms = (uint)Convert.ToInt32(reader["ownerperms"]); - Lfli.Add(fli); + Lfli.Add(fli); + } + } } - - reader.Dispose(); - result.Dispose(); } catch (Exception e) { dbm.Manager.Reconnect(); - m_log.Error(e.ToString()); + m_log.Error(e.Message, e); return Lfli; } finally @@ -376,29 +379,29 @@ namespace OpenSim.Data.MySQL { Dictionary param = new Dictionary(); param["?uuid"] = uuid.ToString(); - IDbCommand result = - dbm.Manager.Query("select agentOnline,currentHandle from " + m_agentsTableName + - " where UUID = ?uuid", param); - IDataReader reader = result.ExecuteReader(); - while (reader.Read()) + using (IDbCommand result = dbm.Manager.Query("select agentOnline,currentHandle from " + m_agentsTableName + + " where UUID = ?uuid", param)) { - FriendRegionInfo fri = new FriendRegionInfo(); - fri.isOnline = (sbyte)reader["agentOnline"] != 0; - fri.regionHandle = (ulong)reader["currentHandle"]; + using (IDataReader reader = result.ExecuteReader()) + { + while (reader.Read()) + { + FriendRegionInfo fri = new FriendRegionInfo(); + fri.isOnline = (sbyte)reader["agentOnline"] != 0; + fri.regionHandle = (ulong)reader["currentHandle"]; - infos[uuid] = fri; + infos[uuid] = fri; + } + } } - - reader.Dispose(); - result.Dispose(); } } catch (Exception e) { m_log.Warn("[MYSQL]: Got exception on trying to find friends regions:", e); dbm.Manager.Reconnect(); - m_log.Error(e.ToString()); + m_log.Error(e.Message, e); } finally { @@ -427,28 +430,28 @@ namespace OpenSim.Data.MySQL try { - IDbCommand result = - dbm.Manager.Query( - "SELECT UUID,username,lastname FROM " + m_usersTableName + - " WHERE username like ?first AND lastname like ?second LIMIT 100", - param); - IDataReader reader = result.ExecuteReader(); - - while (reader.Read()) + using (IDbCommand result = dbm.Manager.Query( + "SELECT UUID,username,lastname FROM " + m_usersTableName + + " WHERE username like ?first AND lastname like ?second LIMIT 100", + param)) { - AvatarPickerAvatar user = new AvatarPickerAvatar(); - user.AvatarID = new UUID((string) reader["UUID"]); - user.firstName = (string) reader["username"]; - user.lastName = (string) reader["lastname"]; - returnlist.Add(user); + using (IDataReader reader = result.ExecuteReader()) + { + while (reader.Read()) + { + AvatarPickerAvatar user = new AvatarPickerAvatar(); + user.AvatarID = new UUID((string)reader["UUID"]); + user.firstName = (string)reader["username"]; + user.lastName = (string)reader["lastname"]; + returnlist.Add(user); + } + } } - reader.Dispose(); - result.Dispose(); } catch (Exception e) { dbm.Manager.Reconnect(); - m_log.Error(e.ToString()); + m_log.Error(e.Message, e); return returnlist; } finally @@ -465,28 +468,28 @@ namespace OpenSim.Data.MySQL Dictionary param = new Dictionary(); param["?first"] = objAlphaNumericPattern.Replace(querysplit[0], String.Empty) + "%"; - IDbCommand result = - dbm.Manager.Query( - "SELECT UUID,username,lastname FROM " + m_usersTableName + - " WHERE username like ?first OR lastname like ?first LIMIT 100", - param); - IDataReader reader = result.ExecuteReader(); - - while (reader.Read()) + using (IDbCommand result = dbm.Manager.Query( + "SELECT UUID,username,lastname FROM " + m_usersTableName + + " WHERE username like ?first OR lastname like ?first LIMIT 100", + param)) { - AvatarPickerAvatar user = new AvatarPickerAvatar(); - user.AvatarID = new UUID((string) reader["UUID"]); - user.firstName = (string) reader["username"]; - user.lastName = (string) reader["lastname"]; - returnlist.Add(user); + using (IDataReader reader = result.ExecuteReader()) + { + while (reader.Read()) + { + AvatarPickerAvatar user = new AvatarPickerAvatar(); + user.AvatarID = new UUID((string)reader["UUID"]); + user.firstName = (string)reader["username"]; + user.lastName = (string)reader["lastname"]; + returnlist.Add(user); + } + } } - reader.Dispose(); - result.Dispose(); } catch (Exception e) { dbm.Manager.Reconnect(); - m_log.Error(e.ToString()); + m_log.Error(e.Message, e); return returnlist; } finally @@ -510,20 +513,19 @@ namespace OpenSim.Data.MySQL Dictionary param = new Dictionary(); param["?uuid"] = uuid.ToString(); - IDbCommand result = dbm.Manager.Query("SELECT * FROM " + m_usersTableName + " WHERE UUID = ?uuid", param); - IDataReader reader = result.ExecuteReader(); - - UserProfileData row = dbm.Manager.readUserRow(reader); - - reader.Dispose(); - result.Dispose(); - - return row; + using (IDbCommand result = dbm.Manager.Query("SELECT * FROM " + m_usersTableName + " WHERE UUID = ?uuid", param)) + { + using (IDataReader reader = result.ExecuteReader()) + { + UserProfileData row = dbm.Manager.readUserRow(reader); + return row; + } + } } catch (Exception e) { dbm.Manager.Reconnect(); - m_log.Error(e.ToString()); + m_log.Error(e.Message, e); return null; } finally @@ -569,15 +571,15 @@ namespace OpenSim.Data.MySQL try { - dbm.Manager.ExecuteParameterizedSql( - "update " + m_usersTableName + " SET webLoginKey = ?webLoginKey " + - "where UUID = ?UUID", - param); + dbm.Manager.ExecuteParameterizedSql( + "update " + m_usersTableName + " SET webLoginKey = ?webLoginKey " + + "where UUID = ?UUID", + param); } catch (Exception e) { dbm.Manager.Reconnect(); - m_log.Error(e.ToString()); + m_log.Error(e.Message, e); return; } finally @@ -600,21 +602,19 @@ namespace OpenSim.Data.MySQL Dictionary param = new Dictionary(); param["?uuid"] = uuid.ToString(); - IDbCommand result = dbm.Manager.Query("SELECT * FROM " + m_agentsTableName + " WHERE UUID = ?uuid", - param); - IDataReader reader = result.ExecuteReader(); - - UserAgentData row = dbm.Manager.readAgentRow(reader); - - reader.Dispose(); - result.Dispose(); - - return row; + using (IDbCommand result = dbm.Manager.Query("SELECT * FROM " + m_agentsTableName + " WHERE UUID = ?uuid", param)) + { + using (IDataReader reader = result.ExecuteReader()) + { + UserAgentData row = dbm.Manager.readAgentRow(reader); + return row; + } + } } catch (Exception e) { dbm.Manager.Reconnect(); - m_log.Error(e.ToString()); + m_log.Error(e.Message, e); return null; } finally @@ -638,19 +638,20 @@ namespace OpenSim.Data.MySQL try { - dbm.Manager.insertUserRow(user.ID, user.FirstName, user.SurName, user.Email, user.PasswordHash, user.PasswordSalt, - user.HomeRegion, user.HomeRegionID, user.HomeLocation.X, user.HomeLocation.Y, - user.HomeLocation.Z, - user.HomeLookAt.X, user.HomeLookAt.Y, user.HomeLookAt.Z, user.Created, - user.LastLogin, user.UserInventoryURI, user.UserAssetURI, - user.CanDoMask, user.WantDoMask, - user.AboutText, user.FirstLifeAboutText, user.Image, - user.FirstLifeImage, user.WebLoginKey, user.UserFlags, user.GodLevel, user.CustomType, user.Partner); + dbm.Manager.insertUserRow( + user.ID, user.FirstName, user.SurName, user.Email, user.PasswordHash, user.PasswordSalt, + user.HomeRegion, user.HomeRegionID, user.HomeLocation.X, user.HomeLocation.Y, + user.HomeLocation.Z, + user.HomeLookAt.X, user.HomeLookAt.Y, user.HomeLookAt.Z, user.Created, + user.LastLogin, user.UserInventoryURI, user.UserAssetURI, + user.CanDoMask, user.WantDoMask, + user.AboutText, user.FirstLifeAboutText, user.Image, + user.FirstLifeImage, user.WebLoginKey, user.UserFlags, user.GodLevel, user.CustomType, user.Partner); } catch (Exception e) { dbm.Manager.Reconnect(); - m_log.Error(e.ToString()); + m_log.Error(e.Message, e); } finally { @@ -676,7 +677,7 @@ namespace OpenSim.Data.MySQL catch (Exception e) { dbm.Manager.Reconnect(); - m_log.Error(e.ToString()); + m_log.Error(e.Message, e); } finally { @@ -693,14 +694,15 @@ namespace OpenSim.Data.MySQL MySQLSuperManager dbm = GetLockedConnection("UpdateUserProfile"); try { - dbm.Manager.updateUserRow(user.ID, user.FirstName, user.SurName, user.Email, user.PasswordHash, user.PasswordSalt, - user.HomeRegion, user.HomeRegionID, user.HomeLocation.X, user.HomeLocation.Y, - user.HomeLocation.Z, user.HomeLookAt.X, - user.HomeLookAt.Y, user.HomeLookAt.Z, user.Created, user.LastLogin, - user.UserInventoryURI, - user.UserAssetURI, user.CanDoMask, user.WantDoMask, user.AboutText, - user.FirstLifeAboutText, user.Image, user.FirstLifeImage, user.WebLoginKey, - user.UserFlags, user.GodLevel, user.CustomType, user.Partner); + dbm.Manager.updateUserRow( + user.ID, user.FirstName, user.SurName, user.Email, user.PasswordHash, user.PasswordSalt, + user.HomeRegion, user.HomeRegionID, user.HomeLocation.X, user.HomeLocation.Y, + user.HomeLocation.Z, user.HomeLookAt.X, + user.HomeLookAt.Y, user.HomeLookAt.Z, user.Created, user.LastLogin, + user.UserInventoryURI, + user.UserAssetURI, user.CanDoMask, user.WantDoMask, user.AboutText, + user.FirstLifeAboutText, user.Image, user.FirstLifeImage, user.WebLoginKey, + user.UserFlags, user.GodLevel, user.CustomType, user.Partner); } finally { @@ -748,29 +750,29 @@ namespace OpenSim.Data.MySQL Dictionary param = new Dictionary(); param["?owner"] = user.ToString(); - IDbCommand result = dbm.Manager.Query( - "SELECT * FROM " + m_appearanceTableName + " WHERE owner = ?owner", param); - IDataReader reader = result.ExecuteReader(); - - AvatarAppearance appearance = dbm.Manager.readAppearanceRow(reader); - - reader.Dispose(); - result.Dispose(); - - if (null == appearance) + using (IDbCommand result = dbm.Manager.Query("SELECT * FROM " + m_appearanceTableName + " WHERE owner = ?owner", param)) { - m_log.WarnFormat("[USER DB] No appearance found for user {0}", user.ToString()); - return null; - } - - appearance.SetAttachments(GetUserAttachments(user)); + using (IDataReader reader = result.ExecuteReader()) + { + AvatarAppearance appearance = dbm.Manager.readAppearanceRow(reader); - return appearance; + if (appearance == null) + { + m_log.WarnFormat("[USER DB] No appearance found for user {0}", user.ToString()); + return null; + } + else + { + appearance.SetAttachments(GetUserAttachments(user)); + return appearance; + } + } + } } catch (Exception e) { dbm.Manager.Reconnect(); - m_log.Error(e.ToString()); + m_log.Error(e.Message, e); return null; } finally @@ -798,7 +800,7 @@ namespace OpenSim.Data.MySQL catch (Exception e) { dbm.Manager.Reconnect(); - m_log.Error(e.ToString()); + m_log.Error(e.Message, e); } finally { @@ -833,20 +835,20 @@ namespace OpenSim.Data.MySQL try { - IDbCommand result = dbm.Manager.Query( - "SELECT attachpoint, item, asset from " + m_attachmentsTableName + " WHERE UUID = ?uuid", param); - IDataReader reader = result.ExecuteReader(); - - Hashtable ret = dbm.Manager.readAttachments(reader); - - reader.Dispose(); - result.Dispose(); - return ret; + using (IDbCommand result = dbm.Manager.Query( + "SELECT attachpoint, item, asset from " + m_attachmentsTableName + " WHERE UUID = ?uuid", param)) + { + using (IDataReader reader = result.ExecuteReader()) + { + Hashtable ret = dbm.Manager.readAttachments(reader); + return ret; + } + } } catch (Exception e) { dbm.Manager.Reconnect(); - m_log.Error(e.ToString()); + m_log.Error(e.Message, e); return null; } finally @@ -905,7 +907,7 @@ namespace OpenSim.Data.MySQL catch (Exception e) { dbm.Manager.Reconnect(); - m_log.Error(e.ToString()); + m_log.Error(e.Message, e); return; } finally diff --git a/OpenSim/Region/Application/Application.cs b/OpenSim/Region/Application/Application.cs index 241af53da9..33b01e5976 100644 --- a/OpenSim/Region/Application/Application.cs +++ b/OpenSim/Region/Application/Application.cs @@ -205,13 +205,10 @@ namespace OpenSim Directory.CreateDirectory(m_crashDir); } string log = Util.GetUniqueFilename(ex.GetType() + ".txt"); - StreamWriter m_crashLog = - new StreamWriter( - Path.Combine(m_crashDir, log) - ); - - m_crashLog.WriteLine(msg); - m_crashLog.Close(); + using (StreamWriter m_crashLog = new StreamWriter(Path.Combine(m_crashDir, log))) + { + m_crashLog.WriteLine(msg); + } File.Copy("OpenSim.ini", Path.Combine(m_crashDir, log + "_OpenSim.ini"), true); } From 5b19d5a7b763a5ff5a7380f00c08fc30f4707588 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sun, 4 Oct 2009 14:05:58 -0700 Subject: [PATCH 27/29] Reduced locking. --- .../ClientStack/LindenUDP/LLImageManager.cs | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLImageManager.cs b/OpenSim/Region/ClientStack/LindenUDP/LLImageManager.cs index facfb9d2ed..2120d33d42 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLImageManager.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLImageManager.cs @@ -167,8 +167,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP J2KImage imagereq; int numCollected = 0; - lock (m_syncRoot) - { + //lock (m_syncRoot) + //{ m_lastloopprocessed = DateTime.Now.Ticks; // This can happen during Close() @@ -191,7 +191,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP if (numCollected == count) break; } - } + //} return m_priorityQueue.Count > 0; } @@ -211,16 +211,18 @@ namespace OpenSim.Region.ClientStack.LindenUDP { J2KImage image = null; - if (m_priorityQueue.Count > 0) + lock (m_priorityQueue) { - try - { - lock (m_priorityQueue) - image = m_priorityQueue.FindMax(); - } - catch (Exception) { } - } + if (m_priorityQueue.Count > 0) + { + try + { + image = m_priorityQueue.FindMax(); + } + catch (Exception) { } + } + } return image; } From 362e94a0229d0b450001b8b089a472b550b530f3 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sun, 4 Oct 2009 16:30:12 -0700 Subject: [PATCH 28/29] * KeepAlive set to false in expect_user and log_off. * Check for null SP in PermissionsModule. --- OpenSim/Client/Linden/LLProxyLoginModule.cs | 4 ++-- .../World/Permissions/PermissionsModule.cs | 13 +++++++++---- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/OpenSim/Client/Linden/LLProxyLoginModule.cs b/OpenSim/Client/Linden/LLProxyLoginModule.cs index 195feaf390..f9cb3a9337 100644 --- a/OpenSim/Client/Linden/LLProxyLoginModule.cs +++ b/OpenSim/Client/Linden/LLProxyLoginModule.cs @@ -148,8 +148,8 @@ namespace OpenSim.Client.Linden protected void AddHttpHandlers() { //we will add our handlers to the first scene we received, as all scenes share a http server. But will this ever change? - MainServer.Instance.AddXmlRPCHandler("expect_user", ExpectUser); - MainServer.Instance.AddXmlRPCHandler("logoff_user", LogOffUser); + MainServer.Instance.AddXmlRPCHandler("expect_user", ExpectUser, false); + MainServer.Instance.AddXmlRPCHandler("logoff_user", LogOffUser, false); } protected void AddScene(Scene scene) diff --git a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs index 9622555af1..901144a289 100644 --- a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs +++ b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs @@ -397,10 +397,15 @@ namespace OpenSim.Region.CoreModules.World.Permissions // with the powers requested (powers = 0 for no powers check) protected bool IsGroupMember(UUID groupID, UUID userID, ulong powers) { - IClientAPI client = m_scene.GetScenePresence(userID).ControllingClient; - - return ((groupID == client.ActiveGroupId) && (client.ActiveGroupPowers != 0) && - ((powers == 0) || ((client.ActiveGroupPowers & powers) == powers))); + ScenePresence sp = m_scene.GetScenePresence(userID); + if (sp != null) + { + IClientAPI client = sp.ControllingClient; + + return ((groupID == client.ActiveGroupId) && (client.ActiveGroupPowers != 0) && + ((powers == 0) || ((client.ActiveGroupPowers & powers) == powers))); + } + return false; } /// From a208f33c5dc4784f97dc3cd46cb56e79cc457f82 Mon Sep 17 00:00:00 2001 From: Melanie Date: Mon, 5 Oct 2009 00:23:47 +0100 Subject: [PATCH 29/29] Make the asset connector async Get overload return false if the asset retrieval was not synchronous. --- OpenSim/Services/Connectors/Asset/AssetServiceConnector.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OpenSim/Services/Connectors/Asset/AssetServiceConnector.cs b/OpenSim/Services/Connectors/Asset/AssetServiceConnector.cs index b1d41daf1e..6f7c90faa9 100644 --- a/OpenSim/Services/Connectors/Asset/AssetServiceConnector.cs +++ b/OpenSim/Services/Connectors/Asset/AssetServiceConnector.cs @@ -171,6 +171,8 @@ namespace OpenSim.Services.Connectors if (asset == null) { + bool result = false; + AsynchronousRestObjectRequester. MakeRequest("GET", uri, 0, delegate(AssetBase a) @@ -178,8 +180,10 @@ namespace OpenSim.Services.Connectors if (m_Cache != null) m_Cache.Cache(a); handler(id, sender, a); + result = true; }); + return result; } else {