From bf5c81d77e492cd6df5517ecab32cd64168b01c2 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 12 May 2010 15:59:48 -0700 Subject: [PATCH 01/46] * Initial commit of the slimupdates2 rewrite. This pass maintains the original behavior of avatar update sending and has a simplified set of IClientAPI methods for sending avatar/prim updates --- .../Client/MXP/ClientStack/MXPClientView.cs | 47 +- .../ClientStack/SirikataClientView.cs | 26 +- .../VWoHTTP/ClientStack/VWHClientView.cs | 16 +- OpenSim/Framework/IClientAPI.cs | 258 ++----- OpenSim/Framework/ISceneEntity.cs | 37 + OpenSim/Framework/Lazy.cs | 236 +++++++ .../ClientStack/LindenUDP/LLClientView.cs | 637 +++++++++--------- .../ClientStack/LindenUDP/LLUDPServer.cs | 18 +- .../Examples/SimpleModule/MyNpcCharacter.cs | 14 +- .../Framework/Scenes/SceneObjectPart.cs | 36 +- .../Region/Framework/Scenes/ScenePresence.cs | 29 +- .../Server/IRCClientView.cs | 34 +- .../OptionalModules/World/NPC/NPCAvatar.cs | 14 +- OpenSim/Tests/Common/Mock/TestClient.cs | 14 +- 14 files changed, 712 insertions(+), 704 deletions(-) create mode 100644 OpenSim/Framework/ISceneEntity.cs create mode 100644 OpenSim/Framework/Lazy.cs diff --git a/OpenSim/Client/MXP/ClientStack/MXPClientView.cs b/OpenSim/Client/MXP/ClientStack/MXPClientView.cs index 1d6d4c1d03..a62d8974a9 100644 --- a/OpenSim/Client/MXP/ClientStack/MXPClientView.cs +++ b/OpenSim/Client/MXP/ClientStack/MXPClientView.cs @@ -1026,23 +1026,6 @@ namespace OpenSim.Client.MXP.ClientStack // Need to translate to MXP somehow } - public void SendAvatarData(SendAvatarData data) - { - //ScenePresence presence=((Scene)this.Scene).GetScenePresence(avatarID); - UUID ownerID = data.AvatarID; - MXPSendAvatarData(data.FirstName + " " + data.LastName, ownerID, UUID.Zero, data.AvatarID, data.AvatarLocalID, data.Position, data.Rotation); - } - - public void SendAvatarTerseUpdate(SendAvatarTerseData data) - { - MovementEventMessage me = new MovementEventMessage(); - me.ObjectIndex = data.LocalID; - me.Location = ToOmVector(data.Position); - me.Orientation = ToOmQuaternion(data.Rotation); - - Session.Send(me); - } - public void SendCoarseLocationUpdate(List users, List CoarseLocations) { // Minimap function, not used. @@ -1058,23 +1041,31 @@ namespace OpenSim.Client.MXP.ClientStack // Need to translate to MXP somehow } - public void SendPrimitiveToClient(SendPrimitiveData data) + public void SendAvatarDataImmediate(ISceneEntity avatar) { - MXPSendPrimitive(data.localID, data.ownerID, data.acc, data.rvel, data.primShape, data.pos, data.objectID, data.vel, - data.rotation, (uint)data.flags, data.text, data.color, data.parentID, data.particleSystem, data.clickAction, - data.material, data.textureanim); + //ScenePresence presence=((Scene)this.Scene).GetScenePresence(avatarID); + ScenePresence presence = (ScenePresence)avatar; + UUID ownerID = presence.UUID; + MXPSendAvatarData(presence.Firstname + " " + presence.Lastname, ownerID, UUID.Zero, presence.UUID, presence.LocalId, presence.AbsolutePosition, presence.Rotation); } - public void SendPrimTerseUpdate(SendPrimitiveTerseData data) + public void SendPrimUpdate(ISceneEntity entity, PrimUpdateFlags updateFlags) { - MovementEventMessage me = new MovementEventMessage(); - me.ObjectIndex = data.LocalID; - me.Location = ToOmVector(data.Position); - me.Orientation = ToOmQuaternion(data.Rotation); - Session.Send(me); + //MovementEventMessage me = new MovementEventMessage(); + //me.ObjectIndex = data.LocalID; + //me.Location = ToOmVector(data.Position); + //me.Orientation = ToOmQuaternion(data.Rotation); + + //MXPSendPrimitive(data.localID, data.ownerID, data.acc, data.rvel, data.primShape, data.pos, data.objectID, data.vel, + // data.rotation, (uint)data.flags, data.text, data.color, data.parentID, data.particleSystem, data.clickAction, + // data.material, data.textureanim); + + //Session.Send(me); + + throw new System.NotImplementedException(); } - public void ReprioritizeUpdates(StateUpdateTypes type, UpdatePriorityHandler handler) + public void ReprioritizeUpdates(UpdatePriorityHandler handler) { } diff --git a/OpenSim/Client/Sirikata/ClientStack/SirikataClientView.cs b/OpenSim/Client/Sirikata/ClientStack/SirikataClientView.cs index 43c64e9584..d1f098892b 100644 --- a/OpenSim/Client/Sirikata/ClientStack/SirikataClientView.cs +++ b/OpenSim/Client/Sirikata/ClientStack/SirikataClientView.cs @@ -584,16 +584,6 @@ namespace OpenSim.Client.Sirikata.ClientStack throw new System.NotImplementedException(); } - public void SendAvatarData(SendAvatarData data) - { - throw new System.NotImplementedException(); - } - - public void SendAvatarTerseUpdate(SendAvatarTerseData data) - { - throw new System.NotImplementedException(); - } - public void SendCoarseLocationUpdate(List users, List CoarseLocations) { throw new System.NotImplementedException(); @@ -609,22 +599,17 @@ namespace OpenSim.Client.Sirikata.ClientStack throw new System.NotImplementedException(); } - public void SendPrimitiveToClient(SendPrimitiveData data) + public void SendAvatarDataImmediate(ISceneEntity avatar) { throw new System.NotImplementedException(); } - public void SendPrimTerseUpdate(SendPrimitiveTerseData data) + public void SendPrimUpdate(ISceneEntity entity, PrimUpdateFlags updateFlags) { throw new System.NotImplementedException(); } - public void ReprioritizeUpdates(StateUpdateTypes type, UpdatePriorityHandler handler) - { - throw new System.NotImplementedException(); - } - - public void SendInventoryFolderDetails(UUID ownerID, UUID folderID, List items, List folders, int version, bool fetchFolders, bool fetchItems) + public void ReprioritizeUpdates(UpdatePriorityHandler handler) { throw new System.NotImplementedException(); } @@ -634,6 +619,11 @@ namespace OpenSim.Client.Sirikata.ClientStack throw new System.NotImplementedException(); } + public void SendInventoryFolderDetails(UUID ownerID, UUID folderID, List items, List folders, int version, bool fetchFolders, bool fetchItems) + { + throw new System.NotImplementedException(); + } + public void SendInventoryItemDetails(UUID ownerID, InventoryItemBase item) { throw new System.NotImplementedException(); diff --git a/OpenSim/Client/VWoHTTP/ClientStack/VWHClientView.cs b/OpenSim/Client/VWoHTTP/ClientStack/VWHClientView.cs index 864b4f16f3..c0da3263c2 100644 --- a/OpenSim/Client/VWoHTTP/ClientStack/VWHClientView.cs +++ b/OpenSim/Client/VWoHTTP/ClientStack/VWHClientView.cs @@ -590,16 +590,6 @@ namespace OpenSim.Client.VWoHTTP.ClientStack throw new System.NotImplementedException(); } - public void SendAvatarData(SendAvatarData data) - { - throw new System.NotImplementedException(); - } - - public void SendAvatarTerseUpdate(SendAvatarTerseData data) - { - throw new System.NotImplementedException(); - } - public void SendCoarseLocationUpdate(List users, List CoarseLocations) { throw new System.NotImplementedException(); @@ -615,17 +605,17 @@ namespace OpenSim.Client.VWoHTTP.ClientStack throw new System.NotImplementedException(); } - public void SendPrimitiveToClient(SendPrimitiveData data) + public void SendAvatarDataImmediate(ISceneEntity avatar) { throw new System.NotImplementedException(); } - public void SendPrimTerseUpdate(SendPrimitiveTerseData data) + public void SendPrimUpdate(ISceneEntity entity, PrimUpdateFlags updateFlags) { throw new System.NotImplementedException(); } - public void ReprioritizeUpdates(StateUpdateTypes type, UpdatePriorityHandler handler) + public void ReprioritizeUpdates(UpdatePriorityHandler handler) { throw new System.NotImplementedException(); } diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs index 01daeb1402..00681cf80d 100644 --- a/OpenSim/Framework/IClientAPI.cs +++ b/OpenSim/Framework/IClientAPI.cs @@ -571,207 +571,6 @@ namespace OpenSim.Framework public float dwell; } - public struct SendAvatarData - { - public readonly ulong RegionHandle; - public readonly string FirstName; - public readonly string LastName; - public readonly string GroupTitle; - public readonly UUID AvatarID; - public readonly uint AvatarLocalID; - public readonly Vector3 Position; - public readonly byte[] TextureEntry; - public readonly uint ParentID; - public readonly Quaternion Rotation; - - public SendAvatarData(ulong regionHandle, string firstName, string lastName, string groupTitle, UUID avatarID, - uint avatarLocalID, Vector3 position, byte[] textureEntry, uint parentID, Quaternion rotation) - { - RegionHandle = regionHandle; - FirstName = firstName; - LastName = lastName; - GroupTitle = groupTitle; - AvatarID = avatarID; - AvatarLocalID = avatarLocalID; - Position = position; - TextureEntry = textureEntry; - ParentID = parentID; - Rotation = rotation; - } - } - - public struct SendAvatarTerseData - { - public readonly ulong RegionHandle; - public readonly ushort TimeDilation; - public readonly uint LocalID; - public readonly Vector3 Position; - public readonly Vector3 Velocity; - public readonly Vector3 Acceleration; - public readonly Quaternion Rotation; - public readonly Vector4 CollisionPlane; - public readonly UUID AgentID; - public readonly byte[] TextureEntry; - public readonly double Priority; - - public SendAvatarTerseData(ulong regionHandle, ushort timeDilation, uint localID, Vector3 position, Vector3 velocity, - Vector3 acceleration, Quaternion rotation, Vector4 collisionPlane, UUID agentid, byte[] textureEntry, double priority) - { - RegionHandle = regionHandle; - TimeDilation = timeDilation; - LocalID = localID; - Position = position; - Velocity = velocity; - Acceleration = acceleration; - Rotation = rotation; - CollisionPlane = collisionPlane; - AgentID = agentid; - TextureEntry = textureEntry; - Priority = priority; - } - } - - public struct SendPrimitiveTerseData - { - public readonly ulong RegionHandle; - public readonly ushort TimeDilation; - public readonly uint LocalID; - public readonly Vector3 Position; - public readonly Quaternion Rotation; - public readonly Vector3 Velocity; - public readonly Vector3 Acceleration; - public readonly Vector3 AngularVelocity; - public readonly UUID AssetID; - public readonly UUID OwnerID; - public readonly int AttachPoint; - public readonly byte[] TextureEntry; - public readonly double Priority; - - public SendPrimitiveTerseData(ulong regionHandle, ushort timeDilation, uint localID, Vector3 position, - Quaternion rotation, Vector3 velocity, Vector3 acceleration, Vector3 rotationalvelocity, - UUID assetID, UUID ownerID, int attachPoint, byte[] textureEntry, double priority) - { - RegionHandle = regionHandle; - TimeDilation = timeDilation; - LocalID = localID; - Position = position; - Rotation = rotation; - Velocity = velocity; - Acceleration = acceleration; - AngularVelocity = rotationalvelocity; - AssetID = assetID; - OwnerID = ownerID; - AttachPoint = attachPoint; - TextureEntry = textureEntry; - Priority = priority; - } - } - - public struct SendPrimitiveData - { - private ulong m_regionHandle; - private ushort m_timeDilation; - private uint m_localID; - private PrimitiveBaseShape m_primShape; - private Vector3 m_pos; - private Vector3 m_vel; - private Vector3 m_acc; - private Quaternion m_rotation; - private Vector3 m_rvel; - private PrimFlags m_flags; - private UUID m_objectID; - private UUID m_ownerID; - private string m_text; - private byte[] m_color; - private uint m_parentID; - private byte[] m_particleSystem; - private byte m_clickAction; - private byte m_material; - private byte[] m_textureanim; - private bool m_attachment; - private uint m_AttachPoint; - private UUID m_AssetId; - private UUID m_SoundId; - private double m_SoundVolume; - private byte m_SoundFlags; - private double m_SoundRadius; - private double m_priority; - - public SendPrimitiveData(ulong regionHandle, ushort timeDilation, uint localID, PrimitiveBaseShape primShape, - Vector3 pos, Vector3 vel, Vector3 acc, Quaternion rotation, Vector3 rvel, - uint flags, UUID objectID, UUID ownerID, string text, byte[] color, - uint parentID, byte[] particleSystem, byte clickAction, byte material, double priority) : - this(regionHandle, timeDilation, localID, primShape, pos, vel, acc, rotation, rvel, flags, objectID, - ownerID, text, color, parentID, particleSystem, clickAction, material, new byte[0], false, 0, UUID.Zero, - UUID.Zero, 0, 0, 0, priority) { } - - public SendPrimitiveData(ulong regionHandle, ushort timeDilation, uint localID, PrimitiveBaseShape primShape, - Vector3 pos, Vector3 vel, Vector3 acc, Quaternion rotation, Vector3 rvel, - uint flags, - UUID objectID, UUID ownerID, string text, byte[] color, uint parentID, - byte[] particleSystem, - byte clickAction, byte material, byte[] textureanim, bool attachment, - uint AttachPoint, UUID AssetId, UUID SoundId, double SoundVolume, byte SoundFlags, - double SoundRadius, double priority) - { - this.m_regionHandle = regionHandle; - this.m_timeDilation = timeDilation; - this.m_localID = localID; - this.m_primShape = primShape; - this.m_pos = pos; - this.m_vel = vel; - this.m_acc = acc; - this.m_rotation = rotation; - this.m_rvel = rvel; - this.m_flags = (PrimFlags)flags; - this.m_objectID = objectID; - this.m_ownerID = ownerID; - this.m_text = text; - this.m_color = color; - this.m_parentID = parentID; - this.m_particleSystem = particleSystem; - this.m_clickAction = clickAction; - this.m_material = material; - this.m_textureanim = textureanim; - this.m_attachment = attachment; - this.m_AttachPoint = AttachPoint; - this.m_AssetId = AssetId; - this.m_SoundId = SoundId; - this.m_SoundVolume = SoundVolume; - this.m_SoundFlags = SoundFlags; - this.m_SoundRadius = SoundRadius; - this.m_priority = priority; - } - - public ulong regionHandle { get { return this.m_regionHandle; } } - public ushort timeDilation { get { return this.m_timeDilation; } } - public uint localID { get { return this.m_localID; } } - public PrimitiveBaseShape primShape { get { return this.m_primShape; } } - public Vector3 pos { get { return this.m_pos; } } - public Vector3 vel { get { return this.m_vel; } } - public Vector3 acc { get { return this.m_acc; } } - public Quaternion rotation { get { return this.m_rotation; } } - public Vector3 rvel { get { return this.m_rvel; } } - public PrimFlags flags { get { return this.m_flags; } } - public UUID objectID { get { return this.m_objectID; } } - public UUID ownerID { get { return this.m_ownerID; } } - public string text { get { return this.m_text; } } - public byte[] color { get { return this.m_color; } } - public uint parentID { get { return this.m_parentID; } } - public byte[] particleSystem { get { return this.m_particleSystem; } } - public byte clickAction { get { return this.m_clickAction; } } - public byte material { get { return this.m_material; } } - public byte[] textureanim { get { return this.m_textureanim; } } - public bool attachment { get { return this.m_attachment; } } - public uint AttachPoint { get { return this.m_AttachPoint; } } - public UUID AssetId { get { return this.m_AssetId; } } - public UUID SoundId { get { return this.m_SoundId; } } - public double SoundVolume { get { return this.m_SoundVolume; } } - public byte SoundFlags { get { return this.m_SoundFlags; } } - public double SoundRadius { get { return this.m_SoundRadius; } } - public double priority { get { return this.m_priority; } } - } - public struct UpdatePriorityData { private double m_priority; private uint m_localID; @@ -785,14 +584,46 @@ namespace OpenSim.Framework public uint localID { get { return this.m_localID; } } } + /// + /// Specifies the fields that have been changed when sending a prim or + /// avatar update + /// [Flags] - public enum StateUpdateTypes + public enum PrimUpdateFlags : uint { None = 0, - AvatarTerse = 1, - PrimitiveTerse = AvatarTerse << 1, - PrimitiveFull = PrimitiveTerse << 1, - All = AvatarTerse | PrimitiveTerse | PrimitiveFull, + AttachmentPoint = 1 << 0, + Material = 1 << 1, + ClickAction = 1 << 2, + Scale = 1 << 3, + ParentID = 1 << 4, + PrimFlags = 1 << 5, + PrimData = 1 << 6, + MediaURL = 1 << 7, + ScratchPad = 1 << 8, + Textures = 1 << 9, + TextureAnim = 1 << 10, + NameValue = 1 << 11, + Position = 1 << 12, + Rotation = 1 << 13, + Velocity = 1 << 14, + Acceleration = 1 << 15, + AngularVelocity = 1 << 16, + CollisionPlane = 1 << 17, + Text = 1 << 18, + Particles = 1 << 19, + ExtraData = 1 << 20, + Sound = 1 << 21, + Joint = 1 << 22, + FullUpdate = UInt32.MaxValue + } + + public static class PrimUpdateFlagsExtensions + { + public static bool HasFlag(this PrimUpdateFlags updateFlags, PrimUpdateFlags flag) + { + return (updateFlags & flag) == flag; + } } public interface IClientAPI @@ -1186,27 +1017,20 @@ namespace OpenSim.Framework void SendMoneyBalance(UUID transaction, bool success, byte[] description, int balance); void SendPayPrice(UUID objectID, int[] payPrice); - void SendAvatarData(SendAvatarData data); - - void SendAvatarTerseUpdate(SendAvatarTerseData data); - void SendCoarseLocationUpdate(List users, List CoarseLocations); void AttachObject(uint localID, Quaternion rotation, byte attachPoint, UUID ownerID); void SetChildAgentThrottle(byte[] throttle); - void SendPrimitiveToClient(SendPrimitiveData data); - - void SendPrimTerseUpdate(SendPrimitiveTerseData data); - - void ReprioritizeUpdates(StateUpdateTypes type, UpdatePriorityHandler handler); + void SendAvatarDataImmediate(ISceneEntity avatar); + void SendPrimUpdate(ISceneEntity entity, PrimUpdateFlags updateFlags); + void ReprioritizeUpdates(UpdatePriorityHandler handler); + void FlushPrimUpdates(); void SendInventoryFolderDetails(UUID ownerID, UUID folderID, List items, List folders, int version, bool fetchFolders, bool fetchItems); - void FlushPrimUpdates(); - void SendInventoryItemDetails(UUID ownerID, InventoryItemBase item); /// diff --git a/OpenSim/Framework/ISceneEntity.cs b/OpenSim/Framework/ISceneEntity.cs new file mode 100644 index 0000000000..fa3c514667 --- /dev/null +++ b/OpenSim/Framework/ISceneEntity.cs @@ -0,0 +1,37 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using OpenMetaverse; + +namespace OpenSim.Framework +{ + public interface ISceneEntity + { + UUID UUID { get; } + uint LocalId { get; } + } +} diff --git a/OpenSim/Framework/Lazy.cs b/OpenSim/Framework/Lazy.cs new file mode 100644 index 0000000000..8a417ac64b --- /dev/null +++ b/OpenSim/Framework/Lazy.cs @@ -0,0 +1,236 @@ +// +// Lazy.cs +// +// Authors: +// Zoltan Varga (vargaz@gmail.com) +// Marek Safar (marek.safar@gmail.com) +// +// Copyright (C) 2009 Novell +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using System; +using System.Runtime.Serialization; +using System.Runtime.InteropServices; +using System.Security.Permissions; +using System.Threading; +using System.Diagnostics; + +namespace OpenSim.Framework +{ + public enum LazyThreadSafetyMode + { + None, + PublicationOnly, + ExecutionAndPublication + } + + [SerializableAttribute] + [ComVisibleAttribute(false)] + [HostProtectionAttribute(SecurityAction.LinkDemand, Synchronization = true, ExternalThreading = true)] + public class Lazy + { + T value; + bool inited; + LazyThreadSafetyMode mode; + Func factory; + object monitor; + Exception exception; + + public Lazy() + : this(LazyThreadSafetyMode.ExecutionAndPublication) + { + } + + public Lazy(Func valueFactory) + : this(valueFactory, LazyThreadSafetyMode.ExecutionAndPublication) + { + } + + public Lazy(bool isThreadSafe) + : this(() => Activator.CreateInstance(), isThreadSafe ? LazyThreadSafetyMode.ExecutionAndPublication : LazyThreadSafetyMode.None) + { + } + + public Lazy(Func valueFactory, bool isThreadSafe) + : this(valueFactory, isThreadSafe ? LazyThreadSafetyMode.ExecutionAndPublication : LazyThreadSafetyMode.None) + { + } + + public Lazy(LazyThreadSafetyMode mode) + : this(() => Activator.CreateInstance(), mode) + { + } + + public Lazy(Func valueFactory, LazyThreadSafetyMode mode) + { + if (valueFactory == null) + throw new ArgumentNullException("valueFactory"); + this.factory = valueFactory; + if (mode != LazyThreadSafetyMode.None) + monitor = new object(); + this.mode = mode; + } + + // Don't trigger expensive initialization + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + public T Value + { + get + { + if (inited) + return value; + if (exception != null) + throw exception; + + return InitValue(); + } + } + + T InitValue() + { + switch (mode) + { + case LazyThreadSafetyMode.None: + { + var init_factory = factory; + if (init_factory == null) + throw exception = new InvalidOperationException("The initialization function tries to access Value on this instance"); + try + { + factory = null; + T v = init_factory(); + value = v; + Thread.MemoryBarrier(); + inited = true; + } + catch (Exception ex) + { + exception = ex; + throw; + } + break; + } + case LazyThreadSafetyMode.PublicationOnly: + { + var init_factory = factory; + T v; + + //exceptions are ignored + if (init_factory != null) + v = init_factory(); + else + v = default(T); + + lock (monitor) + { + if (inited) + return value; + value = v; + Thread.MemoryBarrier(); + inited = true; + factory = null; + } + break; + } + case LazyThreadSafetyMode.ExecutionAndPublication: + { + lock (monitor) + { + if (inited) + return value; + + if (factory == null) + throw exception = new InvalidOperationException("The initialization function tries to access Value on this instance"); + + var init_factory = factory; + try + { + factory = null; + T v = init_factory(); + value = v; + Thread.MemoryBarrier(); + inited = true; + } + catch (Exception ex) + { + exception = ex; + throw; + } + } + break; + } + default: + throw new InvalidOperationException("Invalid LazyThreadSafetyMode " + mode); + } + + if (monitor == null) + { + value = factory(); + inited = true; + } + else + { + lock (monitor) + { + if (inited) + return value; + + if (factory == null) + throw new InvalidOperationException("The initialization function tries to access Value on this instance"); + + var init_factory = factory; + try + { + factory = null; + T v = init_factory(); + value = v; + Thread.MemoryBarrier(); + inited = true; + } + catch + { + factory = init_factory; + throw; + } + } + } + + return value; + } + + public bool IsValueCreated + { + get + { + return inited; + } + } + + public override string ToString() + { + if (inited) + return value.ToString(); + else + return "Value is not created"; + } + } +} diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index 1f3582cfba..6154da4728 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs @@ -50,43 +50,17 @@ using Nini.Config; namespace OpenSim.Region.ClientStack.LindenUDP { - #region Enums - - /// - /// Specifies the fields that have been changed when sending a prim or - /// avatar update - /// - [Flags] - public enum PrimUpdateFlags : uint + public class EntityUpdate { - None = 0, - AttachmentPoint = 1 << 0, - Material = 1 << 1, - ClickAction = 1 << 2, - Scale = 1 << 3, - ParentID = 1 << 4, - PrimFlags = 1 << 5, - PrimData = 1 << 6, - MediaURL = 1 << 7, - ScratchPad = 1 << 8, - Textures = 1 << 9, - TextureAnim = 1 << 10, - NameValue = 1 << 11, - Position = 1 << 12, - Rotation = 1 << 13, - Velocity = 1 << 14, - Acceleration = 1 << 15, - AngularVelocity = 1 << 16, - CollisionPlane = 1 << 17, - Text = 1 << 18, - Particles = 1 << 19, - ExtraData = 1 << 20, - Sound = 1 << 21, - Joint = 1 << 22, - FullUpdate = UInt32.MaxValue - } + public ISceneEntity Entity; + public PrimUpdateFlags Flags; - #endregion Enums + public EntityUpdate(ISceneEntity entity, PrimUpdateFlags flags) + { + Entity = entity; + Flags = flags; + } + } public delegate bool PacketMethod(IClientAPI simClient, Packet packet); @@ -350,9 +324,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP private readonly IGroupsModule m_GroupsModule; private int m_cachedTextureSerial; - protected PriorityQueue m_avatarTerseUpdates; - private PriorityQueue m_primTerseUpdates; - private PriorityQueue m_primFullUpdates; + private PriorityQueue m_entityUpdates; /// /// List used in construction of data blocks for an object update packet. This is to stop us having to @@ -463,9 +435,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP m_scene = scene; - m_avatarTerseUpdates = new PriorityQueue(); - m_primTerseUpdates = new PriorityQueue(); - m_primFullUpdates = new PriorityQueue(m_scene.Entities.Count); + m_entityUpdates = new PriorityQueue(m_scene.Entities.Count); m_fullUpdateDataBlocksBuilder = new List(); m_killRecord = new HashSet(); @@ -1519,7 +1489,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP kill.Header.Reliable = true; kill.Header.Zerocoded = true; - lock (m_primFullUpdates.SyncRoot) + lock (m_entityUpdates.SyncRoot) { m_killRecord.Add(localID); OutPacket(kill, ThrottleOutPacketType.State); @@ -3419,71 +3389,24 @@ namespace OpenSim.Region.ClientStack.LindenUDP /// /// Send an ObjectUpdate packet with information about an avatar /// - public void SendAvatarData(SendAvatarData data) + public void SendAvatarDataImmediate(ISceneEntity avatar) { + ScenePresence presence = avatar as ScenePresence; + if (presence == null) + return; + ObjectUpdatePacket objupdate = (ObjectUpdatePacket)PacketPool.Instance.GetPacket(PacketType.ObjectUpdate); objupdate.Header.Zerocoded = true; - objupdate.RegionData.RegionHandle = data.RegionHandle; + objupdate.RegionData.RegionHandle = presence.RegionHandle; objupdate.RegionData.TimeDilation = ushort.MaxValue; objupdate.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1]; - objupdate.ObjectData[0] = CreateAvatarUpdateBlock(data); + objupdate.ObjectData[0] = CreateAvatarUpdateBlock(presence); OutPacket(objupdate, ThrottleOutPacketType.Task); } - /// - /// Send a terse positional/rotation/velocity update about an avatar - /// to the client. This avatar can be that of the client itself. - /// - public virtual void SendAvatarTerseUpdate(SendAvatarTerseData data) - { - if (data.Priority == double.NaN) - { - m_log.Error("[LLClientView] SendAvatarTerseUpdate received a NaN priority, dropping update"); - return; - } - - Quaternion rotation = data.Rotation; - if (rotation.W == 0.0f && rotation.X == 0.0f && rotation.Y == 0.0f && rotation.Z == 0.0f) - rotation = Quaternion.Identity; - - ImprovedTerseObjectUpdatePacket.ObjectDataBlock terseBlock = CreateImprovedTerseBlock(data); - - lock (m_avatarTerseUpdates.SyncRoot) - m_avatarTerseUpdates.Enqueue(data.Priority, terseBlock, data.LocalID); - - // If we received an update about our own avatar, process the avatar update priority queue immediately - if (data.AgentID == m_agentId) - ProcessAvatarTerseUpdates(); - } - - protected void ProcessAvatarTerseUpdates() - { - ImprovedTerseObjectUpdatePacket terse = (ImprovedTerseObjectUpdatePacket)PacketPool.Instance.GetPacket(PacketType.ImprovedTerseObjectUpdate); - terse.Header.Reliable = false; - terse.Header.Zerocoded = true; - - //terse.RegionData = new ImprovedTerseObjectUpdatePacket.RegionDataBlock(); - terse.RegionData.RegionHandle = Scene.RegionInfo.RegionHandle; - terse.RegionData.TimeDilation = (ushort)(Scene.TimeDilation * ushort.MaxValue); - - lock (m_avatarTerseUpdates.SyncRoot) - { - int count = Math.Min(m_avatarTerseUpdates.Count, m_udpServer.AvatarTerseUpdatesPerPacket); - if (count == 0) - return; - - terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[count]; - for (int i = 0; i < count; i++) - terse.ObjectData[i] = m_avatarTerseUpdates.Dequeue(); - } - - // HACK: Using the task category until the tiered reprioritization code is in - OutPacket(terse, ThrottleOutPacketType.Task); - } - public void SendCoarseLocationUpdate(List users, List CoarseLocations) { if (!IsActive) return; // We don't need to update inactive clients. @@ -3528,172 +3451,188 @@ namespace OpenSim.Region.ClientStack.LindenUDP #region Primitive Packet/Data Sending Methods - public void SendPrimitiveToClient(SendPrimitiveData data) + /// + /// Generate one of the object update packets based on PrimUpdateFlags + /// and broadcast the packet to clients + /// + public void SendPrimUpdate(ISceneEntity entity, PrimUpdateFlags updateFlags) { -// string text = data.text; -// if (text.IndexOf("\n") >= 0) -// text = text.Remove(text.IndexOf("\n")); -// m_log.DebugFormat( -// "[CLIENT]: Placing request to send full info about prim {0} text {1} to client {2}", -// data.localID, text, Name); - - if (data.priority == double.NaN) - { - m_log.Error("[LLClientView] SendPrimitiveToClient received a NaN priority, dropping update"); - return; - } + double priority; - Quaternion rotation = data.rotation; - if (rotation.W == 0.0f && rotation.X == 0.0f && rotation.Y == 0.0f && rotation.Z == 0.0f) - rotation = Quaternion.Identity; + if (entity is SceneObjectPart) + priority = ((SceneObjectPart)entity).ParentGroup.GetUpdatePriority(this); + else if (entity is ScenePresence) + priority = ((ScenePresence)entity).GetUpdatePriority(this); + else + priority = 0.0d; - if (data.AttachPoint > 30 && data.ownerID != AgentId) // Someone else's HUD - return; - if (data.primShape.State != 0 && data.parentID == 0 && data.primShape.PCode == 9) - return; - - ObjectUpdatePacket.ObjectDataBlock objectData = CreatePrimUpdateBlock(data); - - lock (m_primFullUpdates.SyncRoot) - m_primFullUpdates.Enqueue(data.priority, objectData, data.localID); + lock (m_entityUpdates.SyncRoot) + m_entityUpdates.Enqueue(priority, new EntityUpdate(entity, updateFlags), entity.LocalId); } - void ProcessPrimFullUpdates() + private void ProcessEntityUpdates(int maxUpdates) { - ObjectUpdatePacket outPacket = (ObjectUpdatePacket)PacketPool.Instance.GetPacket(PacketType.ObjectUpdate); - outPacket.Header.Zerocoded = true; + Lazy> objectUpdateBlocks = new Lazy>(); + Lazy> compressedUpdateBlocks = new Lazy>(); + Lazy> terseUpdateBlocks = new Lazy>(); - outPacket.RegionData.RegionHandle = Scene.RegionInfo.RegionHandle; - outPacket.RegionData.TimeDilation = (ushort)(Scene.TimeDilation * ushort.MaxValue); + int updatesThisCall = 0; - lock (m_primFullUpdates.SyncRoot) + lock (m_entityUpdates.SyncRoot) { - int count = Math.Min(m_primFullUpdates.Count, m_udpServer.PrimFullUpdatesPerPacket); - if (count == 0) - return; - - m_fullUpdateDataBlocksBuilder.Clear(); - - for (int i = 0; i < count; i++) + EntityUpdate update; + while (m_entityUpdates.TryDequeue(out update)) { - ObjectUpdatePacket.ObjectDataBlock block = m_primFullUpdates.Dequeue(); + #region UpdateFlags to packet type conversion - if (!m_killRecord.Contains(block.ID)) + PrimUpdateFlags updateFlags = update.Flags; + + bool canUseCompressed = true; + bool canUseImproved = true; + + // Compressed object updates only make sense for LL primitives + if (!(update.Entity is SceneObjectPart)) + canUseCompressed = false; + + if (updateFlags.HasFlag(PrimUpdateFlags.FullUpdate)) { - m_fullUpdateDataBlocksBuilder.Add(block); - -// string text = Util.FieldToString(outPacket.ObjectData[i].Text); -// if (text.IndexOf("\n") >= 0) -// text = text.Remove(text.IndexOf("\n")); -// m_log.DebugFormat( -// "[CLIENT]: Sending full info about prim {0} text {1} to client {2}", -// outPacket.ObjectData[i].ID, text, Name); + canUseCompressed = false; + canUseImproved = false; } -// else -// { -// m_log.WarnFormat( -// "[CLIENT]: Preventing full update for {0} after kill to {1}", block.ID, Name); -// } + else + { + if (updateFlags.HasFlag(PrimUpdateFlags.Velocity) || + updateFlags.HasFlag(PrimUpdateFlags.Acceleration) || + updateFlags.HasFlag(PrimUpdateFlags.CollisionPlane) || + updateFlags.HasFlag(PrimUpdateFlags.Joint)) + { + canUseCompressed = false; + } + + if (updateFlags.HasFlag(PrimUpdateFlags.PrimFlags) || + updateFlags.HasFlag(PrimUpdateFlags.ParentID) || + updateFlags.HasFlag(PrimUpdateFlags.Scale) || + updateFlags.HasFlag(PrimUpdateFlags.PrimData) || + updateFlags.HasFlag(PrimUpdateFlags.Text) || + updateFlags.HasFlag(PrimUpdateFlags.NameValue) || + updateFlags.HasFlag(PrimUpdateFlags.ExtraData) || + updateFlags.HasFlag(PrimUpdateFlags.TextureAnim) || + updateFlags.HasFlag(PrimUpdateFlags.Sound) || + updateFlags.HasFlag(PrimUpdateFlags.Particles) || + updateFlags.HasFlag(PrimUpdateFlags.Material) || + updateFlags.HasFlag(PrimUpdateFlags.ClickAction) || + updateFlags.HasFlag(PrimUpdateFlags.MediaURL) || + updateFlags.HasFlag(PrimUpdateFlags.Joint)) + { + canUseImproved = false; + } + } + + #endregion UpdateFlags to packet type conversion + + #region Block Construction + + // TODO: Remove this once we can build compressed updates + canUseCompressed = false; + + if (!canUseImproved && !canUseCompressed) + { + if (update.Entity is ScenePresence) + objectUpdateBlocks.Value.Add(CreateAvatarUpdateBlock((ScenePresence)update.Entity)); + else + objectUpdateBlocks.Value.Add(CreatePrimUpdateBlock((SceneObjectPart)update.Entity, this.m_agentId)); + } + else if (!canUseImproved) + { + compressedUpdateBlocks.Value.Add(CreateCompressedUpdateBlock((SceneObjectPart)update.Entity, updateFlags)); + } + else + { + terseUpdateBlocks.Value.Add(CreateImprovedTerseBlock(update.Entity, updateFlags.HasFlag(PrimUpdateFlags.Textures))); + } + + #endregion Block Construction + + ++updatesThisCall; + if (maxUpdates > 0 && updatesThisCall >= maxUpdates) + break; } - - outPacket.ObjectData = m_fullUpdateDataBlocksBuilder.ToArray(); - - OutPacket(outPacket, ThrottleOutPacketType.State); - } - } - - public void SendPrimTerseUpdate(SendPrimitiveTerseData data) - { - if (data.Priority == double.NaN) - { - m_log.Error("[LLClientView] SendPrimTerseUpdate received a NaN priority, dropping update"); - return; } - Quaternion rotation = data.Rotation; - if (rotation.W == 0.0f && rotation.X == 0.0f && rotation.Y == 0.0f && rotation.Z == 0.0f) - rotation = Quaternion.Identity; + #region Packet Sending - if (data.AttachPoint > 30 && data.OwnerID != AgentId) // Someone else's HUD - return; + const float TIME_DILATION = 1.0f; + ushort timeDilation = Utils.FloatToUInt16(TIME_DILATION, 0.0f, 1.0f); - ImprovedTerseObjectUpdatePacket.ObjectDataBlock objectData = CreateImprovedTerseBlock(data); - - lock (m_primTerseUpdates.SyncRoot) - m_primTerseUpdates.Enqueue(data.Priority, objectData, data.LocalID); - } - - void ProcessPrimTerseUpdates() - { - ImprovedTerseObjectUpdatePacket outPacket = (ImprovedTerseObjectUpdatePacket)PacketPool.Instance.GetPacket(PacketType.ImprovedTerseObjectUpdate); - outPacket.Header.Reliable = false; - outPacket.Header.Zerocoded = true; - - outPacket.RegionData.RegionHandle = Scene.RegionInfo.RegionHandle; - outPacket.RegionData.TimeDilation = (ushort)(Scene.TimeDilation * ushort.MaxValue); - - lock (m_primTerseUpdates.SyncRoot) + if (objectUpdateBlocks.IsValueCreated) { - int count = Math.Min(m_primTerseUpdates.Count, m_udpServer.PrimTerseUpdatesPerPacket); - if (count == 0) - return; + List blocks = objectUpdateBlocks.Value; - outPacket.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[count]; - for (int i = 0; i < count; i++) - outPacket.ObjectData[i] = m_primTerseUpdates.Dequeue(); + ObjectUpdatePacket packet = (ObjectUpdatePacket)PacketPool.Instance.GetPacket(PacketType.ObjectUpdate); + packet.RegionData.RegionHandle = m_scene.RegionInfo.RegionHandle; + packet.RegionData.TimeDilation = timeDilation; + packet.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[blocks.Count]; + + for (int i = 0; i < blocks.Count; i++) + packet.ObjectData[i] = blocks[i]; + + OutPacket(packet, ThrottleOutPacketType.Task, true); } - OutPacket(outPacket, ThrottleOutPacketType.State); + if (compressedUpdateBlocks.IsValueCreated) + { + List blocks = compressedUpdateBlocks.Value; + + ObjectUpdateCompressedPacket packet = (ObjectUpdateCompressedPacket)PacketPool.Instance.GetPacket(PacketType.ObjectUpdateCompressed); + packet.RegionData.RegionHandle = m_scene.RegionInfo.RegionHandle; + packet.RegionData.TimeDilation = timeDilation; + packet.ObjectData = new ObjectUpdateCompressedPacket.ObjectDataBlock[blocks.Count]; + + for (int i = 0; i < blocks.Count; i++) + packet.ObjectData[i] = blocks[i]; + + OutPacket(packet, ThrottleOutPacketType.Task, true); + } + + if (terseUpdateBlocks.IsValueCreated) + { + List blocks = terseUpdateBlocks.Value; + + ImprovedTerseObjectUpdatePacket packet = new ImprovedTerseObjectUpdatePacket(); + packet.RegionData.RegionHandle = m_scene.RegionInfo.RegionHandle; + packet.RegionData.TimeDilation = timeDilation; + packet.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[blocks.Count]; + + for (int i = 0; i < blocks.Count; i++) + packet.ObjectData[i] = blocks[i]; + + OutPacket(packet, ThrottleOutPacketType.Task, true); + } + + #endregion Packet Sending } - public void ReprioritizeUpdates(StateUpdateTypes type, UpdatePriorityHandler handler) + public void ReprioritizeUpdates(UpdatePriorityHandler handler) { - PriorityQueue.UpdatePriorityHandler terse_update_priority_handler = - delegate(ref double priority, uint local_id) - { - priority = handler(new UpdatePriorityData(priority, local_id)); - return priority != double.NaN; - }; - PriorityQueue.UpdatePriorityHandler update_priority_handler = + //m_log.Debug("[CLIENT]: Reprioritizing prim updates for " + m_firstName + " " + m_lastName); + + PriorityQueue.UpdatePriorityHandler update_priority_handler = delegate(ref double priority, uint local_id) { priority = handler(new UpdatePriorityData(priority, local_id)); return priority != double.NaN; }; - if ((type & StateUpdateTypes.AvatarTerse) != 0) - { - lock (m_avatarTerseUpdates.SyncRoot) - m_avatarTerseUpdates.Reprioritize(terse_update_priority_handler); - } - - if ((type & StateUpdateTypes.PrimitiveFull) != 0) - { - lock (m_primFullUpdates.SyncRoot) - m_primFullUpdates.Reprioritize(update_priority_handler); - } - - if ((type & StateUpdateTypes.PrimitiveTerse) != 0) - { - lock (m_primTerseUpdates.SyncRoot) - m_primTerseUpdates.Reprioritize(terse_update_priority_handler); - } + lock (m_entityUpdates.SyncRoot) + m_entityUpdates.Reprioritize(update_priority_handler); } public void FlushPrimUpdates() { - while (m_primFullUpdates.Count > 0) - { - ProcessPrimFullUpdates(); - } - while (m_primTerseUpdates.Count > 0) - { - ProcessPrimTerseUpdates(); - } - while (m_avatarTerseUpdates.Count > 0) - { - ProcessAvatarTerseUpdates(); - } + m_log.Debug("[CLIENT]: Flushing prim updates to " + m_firstName + " " + m_lastName); + + while (m_entityUpdates.Count > 0) + ProcessEntityUpdates(-1); } #endregion Primitive Packet/Data Sending Methods @@ -3726,26 +3665,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP { if ((categories & ThrottleOutPacketTypeFlags.Task) != 0) { - lock (m_avatarTerseUpdates.SyncRoot) - { - if (m_avatarTerseUpdates.Count > 0) - ProcessAvatarTerseUpdates(); - } - } - - if ((categories & ThrottleOutPacketTypeFlags.State) != 0) - { - lock (m_primFullUpdates.SyncRoot) - { - if (m_primFullUpdates.Count > 0) - ProcessPrimFullUpdates(); - } - - lock (m_primTerseUpdates.SyncRoot) - { - if (m_primTerseUpdates.Count > 0) - ProcessPrimTerseUpdates(); - } + if (m_entityUpdates.Count > 0) + ProcessEntityUpdates(m_udpServer.PrimUpdatesPerCallback); } if ((categories & ThrottleOutPacketTypeFlags.Texture) != 0) @@ -4403,22 +4324,51 @@ namespace OpenSim.Region.ClientStack.LindenUDP #region Helper Methods - protected ImprovedTerseObjectUpdatePacket.ObjectDataBlock CreateImprovedTerseBlock(SendAvatarTerseData data) + protected ImprovedTerseObjectUpdatePacket.ObjectDataBlock CreateImprovedTerseBlock(ISceneEntity entity, bool sendTexture) { - return CreateImprovedTerseBlock(true, data.LocalID, 0, data.CollisionPlane, data.Position, data.Velocity, - data.Acceleration, data.Rotation, Vector3.Zero, data.TextureEntry); - } + #region ScenePresence/SOP Handling - protected ImprovedTerseObjectUpdatePacket.ObjectDataBlock CreateImprovedTerseBlock(SendPrimitiveTerseData data) - { - return CreateImprovedTerseBlock(false, data.LocalID, data.AttachPoint, Vector4.Zero, data.Position, data.Velocity, - data.Acceleration, data.Rotation, data.AngularVelocity, data.TextureEntry); - } + bool avatar = (entity is ScenePresence); + uint localID = entity.LocalId; + uint attachPoint; + Vector4 collisionPlane; + Vector3 position, velocity, acceleration, angularVelocity; + Quaternion rotation; + byte[] textureEntry; + + if (entity is ScenePresence) + { + ScenePresence presence = (ScenePresence)entity; + + attachPoint = 0; + collisionPlane = presence.CollisionPlane; + position = presence.OffsetPosition; + velocity = presence.Velocity; + acceleration = Vector3.Zero; + angularVelocity = Vector3.Zero; + rotation = presence.Rotation; + + if (sendTexture) + textureEntry = presence.Appearance.Texture.GetBytes(); + else + textureEntry = null; + } + else + { + SceneObjectPart part = (SceneObjectPart)entity; + + attachPoint = part.AttachmentPoint; + collisionPlane = Vector4.Zero; + position = part.RelativePosition; + velocity = part.Velocity; + acceleration = part.Acceleration; + angularVelocity = part.AngularVelocity; + rotation = part.RotationOffset; + textureEntry = part.Shape.TextureEntry; + } + + #endregion ScenePresence/SOP Handling - protected ImprovedTerseObjectUpdatePacket.ObjectDataBlock CreateImprovedTerseBlock(bool avatar, uint localID, int attachPoint, - Vector4 collisionPlane, Vector3 position, Vector3 velocity, Vector3 acceleration, Quaternion rotation, - Vector3 angularVelocity, byte[] textureEntry) - { int pos = 0; byte[] data = new byte[(avatar ? 60 : 44)]; @@ -4490,12 +4440,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP return block; } - protected ObjectUpdatePacket.ObjectDataBlock CreateAvatarUpdateBlock(SendAvatarData data) + protected ObjectUpdatePacket.ObjectDataBlock CreateAvatarUpdateBlock(ScenePresence data) { byte[] objectData = new byte[76]; - Vector4.UnitW.ToBytes(objectData, 0); // TODO: Collision plane support - data.Position.ToBytes(objectData, 16); + data.CollisionPlane.ToBytes(objectData, 0); + data.OffsetPosition.ToBytes(objectData, 16); //data.Velocity.ToBytes(objectData, 28); //data.Acceleration.ToBytes(objectData, 40); data.Rotation.ToBytes(objectData, 52); @@ -4505,12 +4455,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP update.Data = Utils.EmptyBytes; update.ExtraParams = new byte[1]; - update.FullID = data.AvatarID; - update.ID = data.AvatarLocalID; + update.FullID = data.UUID; + update.ID = data.LocalId; update.Material = (byte)Material.Flesh; update.MediaURL = Utils.EmptyBytes; - update.NameValue = Utils.StringToBytes("FirstName STRING RW SV " + data.FirstName + "\nLastName STRING RW SV " + - data.LastName + "\nTitle STRING RW SV " + data.GroupTitle); + update.NameValue = Utils.StringToBytes("FirstName STRING RW SV " + data.Firstname + "\nLastName STRING RW SV " + + data.Lastname + "\nTitle STRING RW SV " + data.Grouptitle); update.ObjectData = objectData; update.ParentID = data.ParentID; update.PathCurve = 16; @@ -4519,102 +4469,116 @@ namespace OpenSim.Region.ClientStack.LindenUDP update.PCode = (byte)PCode.Avatar; update.ProfileCurve = 1; update.PSBlock = Utils.EmptyBytes; - update.Scale = new Vector3(0.45f,0.6f,1.9f); + update.Scale = new Vector3(0.45f, 0.6f, 1.9f); update.Text = Utils.EmptyBytes; update.TextColor = new byte[4]; update.TextureAnim = Utils.EmptyBytes; - update.TextureEntry = data.TextureEntry ?? Utils.EmptyBytes; - update.UpdateFlags = (uint)(PrimFlags.Physics | PrimFlags.ObjectModify | PrimFlags.ObjectCopy | PrimFlags.ObjectAnyOwner | PrimFlags.ObjectYouOwner | PrimFlags.ObjectMove | PrimFlags.InventoryEmpty | PrimFlags.ObjectTransfer | PrimFlags.ObjectOwnerModify);//61 + (9 << 8) + (130 << 16) + (16 << 24); // TODO: Replace these numbers with PrimFlags + update.TextureEntry = (data.Appearance.Texture != null) ? data.Appearance.Texture.GetBytes() : Utils.EmptyBytes; + update.UpdateFlags = (uint)( + PrimFlags.Physics | PrimFlags.ObjectModify | PrimFlags.ObjectCopy | PrimFlags.ObjectAnyOwner | + PrimFlags.ObjectYouOwner | PrimFlags.ObjectMove | PrimFlags.InventoryEmpty | PrimFlags.ObjectTransfer | + PrimFlags.ObjectOwnerModify); return update; } - protected ObjectUpdatePacket.ObjectDataBlock CreatePrimUpdateBlock(SendPrimitiveData data) + protected ObjectUpdatePacket.ObjectDataBlock CreatePrimUpdateBlock(SceneObjectPart data, UUID recipientID) { byte[] objectData = new byte[60]; - data.pos.ToBytes(objectData, 0); - data.vel.ToBytes(objectData, 12); - data.acc.ToBytes(objectData, 24); - data.rotation.ToBytes(objectData, 36); - data.rvel.ToBytes(objectData, 48); + data.RelativePosition.ToBytes(objectData, 0); + data.Velocity.ToBytes(objectData, 12); + data.Acceleration.ToBytes(objectData, 24); + data.RotationOffset.ToBytes(objectData, 36); + data.AngularVelocity.ToBytes(objectData, 48); ObjectUpdatePacket.ObjectDataBlock update = new ObjectUpdatePacket.ObjectDataBlock(); - update.ClickAction = (byte)data.clickAction; + update.ClickAction = (byte)data.ClickAction; update.CRC = 0; - update.ExtraParams = data.primShape.ExtraParams ?? Utils.EmptyBytes; - update.FullID = data.objectID; - update.ID = data.localID; + update.ExtraParams = data.Shape.ExtraParams ?? Utils.EmptyBytes; + update.FullID = data.UUID; + update.ID = data.LocalId; //update.JointAxisOrAnchor = Vector3.Zero; // These are deprecated //update.JointPivot = Vector3.Zero; //update.JointType = 0; - update.Material = data.material; + update.Material = data.Material; update.MediaURL = Utils.EmptyBytes; // FIXME: Support this in OpenSim - if (data.attachment) + if (data.IsAttachment) { - update.NameValue = Util.StringToBytes256("AttachItemID STRING RW SV " + data.AssetId); - update.State = (byte)((data.AttachPoint % 16) * 16 + (data.AttachPoint / 16)); + update.NameValue = Util.StringToBytes256("AttachItemID STRING RW SV " + data.FromItemID); + update.State = (byte)((data.AttachmentPoint % 16) * 16 + (data.AttachmentPoint / 16)); } else { update.NameValue = Utils.EmptyBytes; - update.State = data.primShape.State; + update.State = data.Shape.State; } - update.ObjectData = objectData; - update.ParentID = data.parentID; - update.PathBegin = data.primShape.PathBegin; - update.PathCurve = data.primShape.PathCurve; - update.PathEnd = data.primShape.PathEnd; - update.PathRadiusOffset = data.primShape.PathRadiusOffset; - update.PathRevolutions = data.primShape.PathRevolutions; - update.PathScaleX = data.primShape.PathScaleX; - update.PathScaleY = data.primShape.PathScaleY; - update.PathShearX = data.primShape.PathShearX; - update.PathShearY = data.primShape.PathShearY; - update.PathSkew = data.primShape.PathSkew; - update.PathTaperX = data.primShape.PathTaperX; - update.PathTaperY = data.primShape.PathTaperY; - update.PathTwist = data.primShape.PathTwist; - update.PathTwistBegin = data.primShape.PathTwistBegin; - update.PCode = data.primShape.PCode; - update.ProfileBegin = data.primShape.ProfileBegin; - update.ProfileCurve = data.primShape.ProfileCurve; - update.ProfileEnd = data.primShape.ProfileEnd; - update.ProfileHollow = data.primShape.ProfileHollow; - update.PSBlock = data.particleSystem ?? Utils.EmptyBytes; - update.TextColor = data.color ?? Color4.Black.GetBytes(true); - update.TextureAnim = data.textureanim ?? Utils.EmptyBytes; - update.TextureEntry = data.primShape.TextureEntry ?? Utils.EmptyBytes; - update.Scale = data.primShape.Scale; - update.Text = Util.StringToBytes256(data.text); - update.UpdateFlags = (uint)data.flags; - if (data.SoundId != UUID.Zero) + update.ObjectData = objectData; + update.ParentID = data.ParentID; + update.PathBegin = data.Shape.PathBegin; + update.PathCurve = data.Shape.PathCurve; + update.PathEnd = data.Shape.PathEnd; + update.PathRadiusOffset = data.Shape.PathRadiusOffset; + update.PathRevolutions = data.Shape.PathRevolutions; + update.PathScaleX = data.Shape.PathScaleX; + update.PathScaleY = data.Shape.PathScaleY; + update.PathShearX = data.Shape.PathShearX; + update.PathShearY = data.Shape.PathShearY; + update.PathSkew = data.Shape.PathSkew; + update.PathTaperX = data.Shape.PathTaperX; + update.PathTaperY = data.Shape.PathTaperY; + update.PathTwist = data.Shape.PathTwist; + update.PathTwistBegin = data.Shape.PathTwistBegin; + update.PCode = data.Shape.PCode; + update.ProfileBegin = data.Shape.ProfileBegin; + update.ProfileCurve = data.Shape.ProfileCurve; + update.ProfileEnd = data.Shape.ProfileEnd; + update.ProfileHollow = data.Shape.ProfileHollow; + update.PSBlock = data.ParticleSystem ?? Utils.EmptyBytes; + update.TextColor = data.GetTextColor().GetBytes(false); + update.TextureAnim = data.TextureAnimation ?? Utils.EmptyBytes; + update.TextureEntry = data.Shape.TextureEntry ?? Utils.EmptyBytes; + update.Scale = data.Shape.Scale; + update.Text = Util.StringToBytes256(data.Text); + + #region PrimFlags + + PrimFlags flags = (PrimFlags)m_scene.Permissions.GenerateClientFlags(recipientID, data.UUID); + + // Don't send the CreateSelected flag to everyone + flags &= ~PrimFlags.CreateSelected; + + if (recipientID == data.OwnerID) { - update.Sound = data.SoundId; - update.OwnerID = data.ownerID; - update.Gain = (float)data.SoundVolume; + if ((data.Flags & PrimFlags.CreateSelected) != 0) + { + // Only send this flag once, then unset it + flags |= PrimFlags.CreateSelected; + data.Flags &= ~PrimFlags.CreateSelected; + } + } + + update.UpdateFlags = (uint)flags; + + #endregion PrimFlags + + if (data.Sound != UUID.Zero) + { + update.Sound = data.Sound; + update.OwnerID = data.OwnerID; + update.Gain = (float)data.SoundGain; update.Radius = (float)data.SoundRadius; update.Flags = data.SoundFlags; } - switch ((PCode)data.primShape.PCode) + switch ((PCode)data.Shape.PCode) { case PCode.Grass: case PCode.Tree: case PCode.NewTree: - update.Data = new byte[] { data.primShape.State }; + update.Data = new byte[] { data.Shape.State }; break; default: - // TODO: Support ScratchPad - //if (prim.ScratchPad != null) - //{ - // update.Data = new byte[prim.ScratchPad.Length]; - // Buffer.BlockCopy(prim.ScratchPad, 0, update.Data, 0, update.Data.Length); - //} - //else - //{ - // update.Data = Utils.EmptyBytes; - //} update.Data = Utils.EmptyBytes; break; } @@ -4622,6 +4586,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP return update; } + protected ObjectUpdateCompressedPacket.ObjectDataBlock CreateCompressedUpdateBlock(SceneObjectPart part, PrimUpdateFlags updateFlags) + { + // TODO: Implement this + return null; + } + public void SendNameReply(UUID profileId, string firstname, string lastname) { UUIDNameReplyPacket packet = (UUIDNameReplyPacket)PacketPool.Instance.GetPacket(PacketType.UUIDNameReply); @@ -11644,7 +11614,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP throw new InvalidOperationException(string.Format("The {0} is empty", this.GetType().ToString())); } - internal TValue Dequeue() + internal bool TryDequeue(out TValue value) { for (int i = 0; i < m_heaps.Length; ++i) { @@ -11652,10 +11622,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP { MinHeapItem item = m_heaps[i].RemoveMin(); m_lookupTable.Remove(item.LocalID); - return item.Value; + value = item.Value; + return true; } } - throw new InvalidOperationException(string.Format("The {0} is empty", this.GetType().ToString())); + + value = default(TValue); + return false; } internal void Reprioritize(UpdatePriorityHandler handler) diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs index 41e41e47a7..1b81105248 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs @@ -99,15 +99,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP /// The measured resolution of Environment.TickCount public readonly float TickCountResolution; - /// Number of terse prim updates to put on the queue each time the + /// Number of prim updates to put on the queue each time the /// OnQueueEmpty event is triggered for updates - public readonly int PrimTerseUpdatesPerPacket; - /// Number of terse avatar updates to put on the queue each time the - /// OnQueueEmpty event is triggered for updates - public readonly int AvatarTerseUpdatesPerPacket; - /// Number of full prim updates to put on the queue each time the - /// OnQueueEmpty event is triggered for updates - public readonly int PrimFullUpdatesPerPacket; + public readonly int PrimUpdatesPerCallback; /// Number of texture packets to put on the queue each time the /// OnQueueEmpty event is triggered for textures public readonly int TextureSendLimit; @@ -191,9 +185,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP m_recvBufferSize = config.GetInt("client_socket_rcvbuf_size", 0); sceneThrottleBps = config.GetInt("scene_throttle_max_bps", 0); - PrimTerseUpdatesPerPacket = config.GetInt("PrimTerseUpdatesPerPacket", 25); - AvatarTerseUpdatesPerPacket = config.GetInt("AvatarTerseUpdatesPerPacket", 10); - PrimFullUpdatesPerPacket = config.GetInt("PrimFullUpdatesPerPacket", 100); + PrimUpdatesPerCallback = config.GetInt("PrimUpdatesPerCallback", 100); TextureSendLimit = config.GetInt("TextureSendLimit", 20); m_defaultRTO = config.GetInt("DefaultRTO", 0); @@ -201,9 +193,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP } else { - PrimTerseUpdatesPerPacket = 25; - AvatarTerseUpdatesPerPacket = 10; - PrimFullUpdatesPerPacket = 100; + PrimUpdatesPerCallback = 100; TextureSendLimit = 20; } diff --git a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs index 09611af887..aac47d19a3 100644 --- a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs +++ b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs @@ -528,14 +528,6 @@ namespace OpenSim.Region.Examples.SimpleModule { } - public virtual void SendAvatarData(SendAvatarData data) - { - } - - public virtual void SendAvatarTerseUpdate(SendAvatarTerseData data) - { - } - public virtual void SendCoarseLocationUpdate(List users, List CoarseLocations) { } @@ -548,15 +540,15 @@ namespace OpenSim.Region.Examples.SimpleModule { } - public virtual void SendPrimitiveToClient(SendPrimitiveData data) + public void SendAvatarDataImmediate(ISceneEntity avatar) { } - public virtual void SendPrimTerseUpdate(SendPrimitiveTerseData data) + public void SendPrimUpdate(ISceneEntity entity, PrimUpdateFlags updateFlags) { } - public virtual void ReprioritizeUpdates(StateUpdateTypes type, UpdatePriorityHandler handler) + public void ReprioritizeUpdates(UpdatePriorityHandler handler) { } diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 46eadee1c3..71c8018717 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -104,7 +104,7 @@ namespace OpenSim.Region.Framework.Scenes #endregion Enumerations - public class SceneObjectPart : IScriptHost + public class SceneObjectPart : IScriptHost, ISceneEntity { /// /// Denote all sides of the prim @@ -712,6 +712,24 @@ namespace OpenSim.Region.Framework.Scenes } } + public Vector3 RelativePosition + { + get + { + if (IsRoot) + { + if (IsAttachment) + return AttachedPos; + else + return AbsolutePosition; + } + else + { + return OffsetPosition; + } + } + } + public Quaternion RotationOffset { get @@ -973,7 +991,6 @@ namespace OpenSim.Region.Framework.Scenes get { return AggregateScriptEvents; } } - public Quaternion SitTargetOrientation { get { return m_sitTargetOrientation; } @@ -2925,11 +2942,7 @@ namespace OpenSim.Region.Framework.Scenes //if (LocalId != ParentGroup.RootPart.LocalId) //isattachment = ParentGroup.RootPart.IsAttachment; - byte[] color = new byte[] {m_color.R, m_color.G, m_color.B, m_color.A}; - remoteClient.SendPrimitiveToClient(new SendPrimitiveData(m_regionHandle, m_parentGroup.GetTimeDilation(), LocalId, m_shape, - lPos, Velocity, Acceleration, RotationOffset, AngularVelocity, clientFlags, m_uuid, _ownerID, - m_text, color, _parentID, m_particleSystem, m_clickAction, (byte)m_material, m_TextureAnimation, IsAttachment, - AttachmentPoint,FromItemID, Sound, SoundGain, SoundFlags, SoundRadius, ParentGroup.GetUpdatePriority(remoteClient))); + remoteClient.SendPrimUpdate(this, PrimUpdateFlags.FullUpdate); } /// @@ -4640,11 +4653,7 @@ namespace OpenSim.Region.Framework.Scenes // Causes this thread to dig into the Client Thread Data. // Remember your locking here! - remoteClient.SendPrimTerseUpdate(new SendPrimitiveTerseData(m_regionHandle, - m_parentGroup.GetTimeDilation(), LocalId, lPos, - RotationOffset, Velocity, Acceleration, - AngularVelocity, FromItemID, - OwnerID, (int)AttachmentPoint, null, ParentGroup.GetUpdatePriority(remoteClient))); + remoteClient.SendPrimUpdate(this, PrimUpdateFlags.Position | PrimUpdateFlags.Rotation | PrimUpdateFlags.Velocity | PrimUpdateFlags.Acceleration | PrimUpdateFlags.AngularVelocity); } public void AddScriptLPS(int count) @@ -4694,7 +4703,8 @@ namespace OpenSim.Region.Framework.Scenes public Color4 GetTextColor() { - return new Color4((byte)Color.R, (byte)Color.G, (byte)Color.B, (byte)(0xFF - Color.A)); + Color color = Color; + return new Color4(color.R, color.G, color.B, (byte)(0xFF - color.A)); } } } diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 30eafd7c65..ee0eb07265 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -67,7 +67,7 @@ namespace OpenSim.Region.Framework.Scenes public delegate void SendCourseLocationsMethod(UUID scene, ScenePresence presence); - public class ScenePresence : EntityBase + public class ScenePresence : EntityBase, ISceneEntity { // ~ScenePresence() // { @@ -478,6 +478,12 @@ namespace OpenSim.Region.Framework.Scenes } } + public Vector3 OffsetPosition + { + get { return m_pos; } + set { m_pos = value; } + } + /// /// Current velocity of the avatar. /// @@ -1036,8 +1042,9 @@ namespace OpenSim.Region.Framework.Scenes AbsolutePosition = AbsolutePosition + new Vector3(0f, 0f, (1.56f / 6f)); } - ControllingClient.SendAvatarTerseUpdate(new SendAvatarTerseData(m_rootRegionHandle, (ushort)(m_scene.TimeDilation * ushort.MaxValue), LocalId, - AbsolutePosition, Velocity, Vector3.Zero, m_bodyRot, new Vector4(0,0,1,AbsolutePosition.Z - 0.5f), m_uuid, null, GetUpdatePriority(ControllingClient))); + ControllingClient.SendPrimUpdate(this, PrimUpdateFlags.Position); + //ControllingClient.SendAvatarTerseUpdate(new SendAvatarTerseData(m_rootRegionHandle, (ushort)(m_scene.TimeDilation * ushort.MaxValue), LocalId, + // AbsolutePosition, Velocity, Vector3.Zero, m_bodyRot, new Vector4(0,0,1,AbsolutePosition.Z - 0.5f), m_uuid, null, GetUpdatePriority(ControllingClient))); } public void AddNeighbourRegion(ulong regionHandle, string cap) @@ -2360,8 +2367,7 @@ namespace OpenSim.Region.Framework.Scenes //m_log.DebugFormat("[SCENEPRESENCE]: TerseUpdate: Pos={0} Rot={1} Vel={2}", m_pos, m_bodyRot, m_velocity); - remoteClient.SendAvatarTerseUpdate(new SendAvatarTerseData(m_rootRegionHandle, (ushort)(m_scene.TimeDilation * ushort.MaxValue), LocalId, - pos, velocity, Vector3.Zero, m_bodyRot, CollisionPlane, m_uuid, null, GetUpdatePriority(remoteClient))); + remoteClient.SendPrimUpdate(this, PrimUpdateFlags.Position | PrimUpdateFlags.Rotation | PrimUpdateFlags.Velocity | PrimUpdateFlags.Acceleration | PrimUpdateFlags.AngularVelocity); m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS)); m_scene.StatsReporter.AddAgentUpdates(1); @@ -2457,9 +2463,7 @@ namespace OpenSim.Region.Framework.Scenes Vector3 pos = m_pos; pos.Z += m_appearance.HipOffset; - remoteAvatar.m_controllingClient.SendAvatarData(new SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_grouptitle, m_uuid, - LocalId, pos, m_appearance.Texture.GetBytes(), - m_parentID, m_bodyRot)); + remoteAvatar.m_controllingClient.SendAvatarDataImmediate(this); m_scene.StatsReporter.AddAgentUpdates(1); } @@ -2527,8 +2531,7 @@ namespace OpenSim.Region.Framework.Scenes Vector3 pos = m_pos; pos.Z += m_appearance.HipOffset; - m_controllingClient.SendAvatarData(new SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_grouptitle, m_uuid, LocalId, - pos, m_appearance.Texture.GetBytes(), m_parentID, m_bodyRot)); + m_controllingClient.SendAvatarDataImmediate(this); SendInitialFullUpdateToAllClients(); SendAppearanceToAllOtherAgents(); @@ -2638,9 +2641,7 @@ namespace OpenSim.Region.Framework.Scenes Vector3 pos = m_pos; pos.Z += m_appearance.HipOffset; - m_controllingClient.SendAvatarData(new SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_grouptitle, m_uuid, LocalId, - pos, m_appearance.Texture.GetBytes(), m_parentID, m_bodyRot)); - + m_controllingClient.SendAvatarDataImmediate(this); } public void SetWearable(int wearableId, AvatarWearable wearable) @@ -3906,7 +3907,7 @@ namespace OpenSim.Region.Framework.Scenes private void Reprioritize(object sender, ElapsedEventArgs e) { - m_controllingClient.ReprioritizeUpdates(StateUpdateTypes.All, UpdatePriority); + m_controllingClient.ReprioritizeUpdates(UpdatePriority); lock (m_reprioritization_timer) { diff --git a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs index 69e78b36ca..84faac0e00 100644 --- a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs +++ b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs @@ -1045,16 +1045,6 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server } - public void SendAvatarData(SendAvatarData data) - { - - } - - public void SendAvatarTerseUpdate(SendAvatarTerseData data) - { - - } - public void SendCoarseLocationUpdate(List users, List CoarseLocations) { @@ -1065,22 +1055,22 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server } - public void SetChildAgentThrottle(byte[] throttle) + public void SendAvatarDataImmediate(ISceneEntity avatar) { - + } - public void SendPrimitiveToClient(SendPrimitiveData data) + public void SendPrimUpdate(ISceneEntity entity, PrimUpdateFlags updateFlags) { - + } - public void SendPrimTerseUpdate(SendPrimitiveTerseData data) + public void ReprioritizeUpdates(UpdatePriorityHandler handler) { - + } - public void ReprioritizeUpdates(StateUpdateTypes type, UpdatePriorityHandler handler) + public void FlushPrimUpdates() { } @@ -1090,11 +1080,6 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server } - public void FlushPrimUpdates() - { - - } - public void SendInventoryItemDetails(UUID ownerID, InventoryItemBase item) { @@ -1420,6 +1405,11 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server } + public virtual void SetChildAgentThrottle(byte[] throttle) + { + + } + public byte[] GetThrottlesPacked(float multiplier) { return new byte[0]; diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs index 6360c9918d..906669187c 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs @@ -618,14 +618,6 @@ namespace OpenSim.Region.OptionalModules.World.NPC { } - public virtual void SendAvatarData(SendAvatarData data) - { - } - - public virtual void SendAvatarTerseUpdate(SendAvatarTerseData data) - { - } - public virtual void SendCoarseLocationUpdate(List users, List CoarseLocations) { } @@ -638,15 +630,15 @@ namespace OpenSim.Region.OptionalModules.World.NPC { } - public virtual void SendPrimitiveToClient(SendPrimitiveData data) + public void SendAvatarDataImmediate(ISceneEntity avatar) { } - public virtual void SendPrimTerseUpdate(SendPrimitiveTerseData data) + public void SendPrimUpdate(ISceneEntity entity, PrimUpdateFlags updateFlags) { } - public virtual void ReprioritizeUpdates(StateUpdateTypes type, UpdatePriorityHandler handler) + public void ReprioritizeUpdates(UpdatePriorityHandler handler) { } diff --git a/OpenSim/Tests/Common/Mock/TestClient.cs b/OpenSim/Tests/Common/Mock/TestClient.cs index b07a0727a3..edb76428b4 100644 --- a/OpenSim/Tests/Common/Mock/TestClient.cs +++ b/OpenSim/Tests/Common/Mock/TestClient.cs @@ -621,14 +621,6 @@ namespace OpenSim.Tests.Common.Mock { } - public virtual void SendAvatarData(SendAvatarData data) - { - } - - public virtual void SendAvatarTerseUpdate(SendAvatarTerseData data) - { - } - public virtual void SendCoarseLocationUpdate(List users, List CoarseLocations) { } @@ -641,15 +633,15 @@ namespace OpenSim.Tests.Common.Mock { } - public virtual void SendPrimitiveToClient(SendPrimitiveData data) + public void SendAvatarDataImmediate(ISceneEntity avatar) { } - public virtual void SendPrimTerseUpdate(SendPrimitiveTerseData data) + public void SendPrimUpdate(ISceneEntity entity, PrimUpdateFlags updateFlags) { } - public virtual void ReprioritizeUpdates(StateUpdateTypes type, UpdatePriorityHandler handler) + public void ReprioritizeUpdates(UpdatePriorityHandler handler) { } From 5d8638ed882681bdfac6c79015089bcaaedfc3ab Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 12 May 2010 16:05:48 -0700 Subject: [PATCH 02/46] Minor tweak in ProcessEntityUpdates (mostly just confirming the git push is working) --- OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index 6154da4728..11dca8db89 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs @@ -3476,13 +3476,16 @@ namespace OpenSim.Region.ClientStack.LindenUDP Lazy> compressedUpdateBlocks = new Lazy>(); Lazy> terseUpdateBlocks = new Lazy>(); + if (maxUpdates <= 0) maxUpdates = Int32.MaxValue; int updatesThisCall = 0; lock (m_entityUpdates.SyncRoot) { EntityUpdate update; - while (m_entityUpdates.TryDequeue(out update)) + while (updatesThisCall < maxUpdates && m_entityUpdates.TryDequeue(out update)) { + ++updatesThisCall; + #region UpdateFlags to packet type conversion PrimUpdateFlags updateFlags = update.Flags; @@ -3552,10 +3555,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP } #endregion Block Construction - - ++updatesThisCall; - if (maxUpdates > 0 && updatesThisCall >= maxUpdates) - break; } } From 4c740e1717f8071d48e34c584728fddcf05afdb2 Mon Sep 17 00:00:00 2001 From: OpenSim Master Date: Thu, 29 Apr 2010 11:57:30 -0700 Subject: [PATCH 03/46] Implements three new OSSL functions for parcel management: osParcelJoin joins parcels in an area, osParcelSubdivide splits parcels in an area, osParcelSetDetails sets parcel name, description, owner and group owner. Join and Subdivide methods in LandChannel are exposed. --- .../CoreModules/World/Land/LandChannel.cs | 16 ++++ .../World/Land/LandManagementModule.cs | 10 +++ .../Framework/Interfaces/ILandChannel.cs | 3 + .../RegionCombinerLargeLandChannel.cs | 10 +++ .../Shared/Api/Implementation/OSSL_Api.cs | 82 +++++++++++++++++++ .../Shared/Api/Interface/IOSSL_Api.cs | 4 + .../Shared/Api/Runtime/OSSL_Stub.cs | 15 ++++ OpenSim/Tests/Common/Mock/TestLandChannel.cs | 4 + 8 files changed, 144 insertions(+) diff --git a/OpenSim/Region/CoreModules/World/Land/LandChannel.cs b/OpenSim/Region/CoreModules/World/Land/LandChannel.cs index 1fbc733704..1ad4db2404 100644 --- a/OpenSim/Region/CoreModules/World/Land/LandChannel.cs +++ b/OpenSim/Region/CoreModules/World/Land/LandChannel.cs @@ -154,6 +154,22 @@ namespace OpenSim.Region.CoreModules.World.Land m_landManagementModule.UpdateLandObject(localID, data); } } + + public void Join(int start_x, int start_y, int end_x, int end_y, UUID attempting_user_id) + { + if (m_landManagementModule != null) + { + m_landManagementModule.Join(start_x, start_y, end_x, end_y, attempting_user_id); + } + } + + public void Subdivide(int start_x, int start_y, int end_x, int end_y, UUID attempting_user_id) + { + if (m_landManagementModule != null) + { + m_landManagementModule.Subdivide(start_x, start_y, end_x, end_y, attempting_user_id); + } + } public void ReturnObjectsInParcel(int localID, uint returnType, UUID[] agentIDs, UUID[] taskIDs, IClientAPI remoteClient) { diff --git a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs index 139e6ff13d..4ccd0f03cb 100644 --- a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs @@ -948,6 +948,16 @@ namespace OpenSim.Region.CoreModules.World.Land masterLandObject.SendLandUpdateToAvatarsOverMe(); } + public void Join(int start_x, int start_y, int end_x, int end_y, UUID attempting_user_id) + { + join(start_x, start_y, end_x, end_y, attempting_user_id); + } + + public void Subdivide(int start_x, int start_y, int end_x, int end_y, UUID attempting_user_id) + { + subdivide(start_x, start_y, end_x, end_y, attempting_user_id); + } + #endregion #region Parcel Updating diff --git a/OpenSim/Region/Framework/Interfaces/ILandChannel.cs b/OpenSim/Region/Framework/Interfaces/ILandChannel.cs index f71e31dcfa..20b8ab6b6d 100644 --- a/OpenSim/Region/Framework/Interfaces/ILandChannel.cs +++ b/OpenSim/Region/Framework/Interfaces/ILandChannel.cs @@ -76,5 +76,8 @@ namespace OpenSim.Region.Framework.Interfaces void setParcelObjectMaxOverride(overrideParcelMaxPrimCountDelegate overrideDel); void setSimulatorObjectMaxOverride(overrideSimulatorMaxPrimCountDelegate overrideDel); void SetParcelOtherCleanTime(IClientAPI remoteClient, int localID, int otherCleanTime); + + void Join(int start_x, int start_y, int end_x, int end_y, UUID attempting_user_id); + void Subdivide(int start_x, int start_y, int end_x, int end_y, UUID attempting_user_id); } } diff --git a/OpenSim/Region/RegionCombinerModule/RegionCombinerLargeLandChannel.cs b/OpenSim/Region/RegionCombinerModule/RegionCombinerLargeLandChannel.cs index 9da818a7eb..33ff707e9f 100644 --- a/OpenSim/Region/RegionCombinerModule/RegionCombinerLargeLandChannel.cs +++ b/OpenSim/Region/RegionCombinerModule/RegionCombinerLargeLandChannel.cs @@ -140,6 +140,16 @@ public class RegionCombinerLargeLandChannel : ILandChannel RootRegionLandChannel.UpdateLandObject(localID, data); } + public void Join(int start_x, int start_y, int end_x, int end_y, UUID attempting_user_id) + { + RootRegionLandChannel.Join(start_x, start_y, end_x, end_y, attempting_user_id); + } + + public void Subdivide(int start_x, int start_y, int end_x, int end_y, UUID attempting_user_id) + { + RootRegionLandChannel.Subdivide(start_x, start_y, end_x, end_y, attempting_user_id); + } + public void ReturnObjectsInParcel(int localID, uint returnType, UUID[] agentIDs, UUID[] taskIDs, IClientAPI remoteClient) { RootRegionLandChannel.ReturnObjectsInParcel(localID, returnType, agentIDs, taskIDs, remoteClient); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 7e68cc749c..15469db94f 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -1129,7 +1129,89 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return 0.0f; } + // Routines for creating and managing parcels programmatically + public void osParcelJoin(LSL_Vector pos1, LSL_Vector pos2) + { + CheckThreatLevel(ThreatLevel.High, "osParcelJoin"); + m_host.AddScriptLPS(1); + int startx = (int)(pos1.x < pos2.x ? pos1.x : pos2.x); + int starty = (int)(pos1.y < pos2.y ? pos1.y : pos2.y); + int endx = (int)(pos1.x > pos2.x ? pos1.x : pos2.x); + int endy = (int)(pos1.y > pos2.y ? pos1.y : pos2.y); + + World.LandChannel.Join(startx,starty,endx,endy,m_host.OwnerID); + } + + public void osParcelSubdivide(LSL_Vector pos1, LSL_Vector pos2) + { + CheckThreatLevel(ThreatLevel.High, "osParcelSubdivide"); + m_host.AddScriptLPS(1); + + int startx = (int)(pos1.x < pos2.x ? pos1.x : pos2.x); + int starty = (int)(pos1.y < pos2.y ? pos1.y : pos2.y); + int endx = (int)(pos1.x > pos2.x ? pos1.x : pos2.x); + int endy = (int)(pos1.y > pos2.y ? pos1.y : pos2.y); + + World.LandChannel.Subdivide(startx,starty,endx,endy,m_host.OwnerID); + } + + public void osParcelSetDetails(LSL_Vector pos, LSL_List rules) + { + CheckThreatLevel(ThreatLevel.High, "osParcelSetDetails"); + m_host.AddScriptLPS(1); + + // Get a reference to the land data and make sure the owner of the script + // can modify it + + ILandObject startLandObject = World.LandChannel.GetLandObject((int)pos.x, (int)pos.y); + if (startLandObject == null) + { + OSSLShoutError("There is no land at that location"); + return; + } + + if (! World.Permissions.CanEditParcel(m_host.OwnerID, startLandObject)) + { + OSSLShoutError("You do not have permission to modify the parcel"); + return; + } + + // Create a new land data object we can modify + LandData newLand = startLandObject.LandData.Copy(); + UUID uuid; + + // Process the rules, not sure what the impact would be of changing owner or group + for (int idx = 0; idx < rules.Length; ) + { + int code = rules.GetLSLIntegerItem(idx++); + string arg = rules.GetLSLStringItem(idx++); + switch (code) + { + case 0: + newLand.Name = arg; + break; + + case 1: + newLand.Description = arg; + break; + + case 2: + CheckThreatLevel(ThreatLevel.VeryHigh, "osParcelSetDetails"); + if (UUID.TryParse(arg , out uuid)) + newLand.OwnerID = uuid; + break; + + case 3: + CheckThreatLevel(ThreatLevel.VeryHigh, "osParcelSetDetails"); + if (UUID.TryParse(arg , out uuid)) + newLand.GroupID = uuid; + break; + } + } + + World.LandChannel.UpdateLandObject(newLand.LocalID,newLand); + } public double osList2Double(LSL_Types.list src, int index) { diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs index 60b8050cd1..7a8f469746 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs @@ -123,6 +123,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces void osWindParamSet(string plugin, string param, float value); float osWindParamGet(string plugin, string param); + // Parcel commands + void osParcelJoin(vector pos1, vector pos2); + void osParcelSubdivide(vector pos1, vector pos2); + void osParcelSetDetails(vector pos, LSL_List rules); string osGetScriptEngineName(); string osGetSimulatorVersion(); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs index 3870af3213..fd9309aefc 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs @@ -106,6 +106,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase // return m_OSSL_Functions.osWindParamGet(plugin, param); // } + public void osParcelJoin(vector pos1, vector pos2) + { + m_OSSL_Functions.osParcelJoin(pos1,pos2); + } + + public void osParcelSubdivide(vector pos1, vector pos2) + { + m_OSSL_Functions.osParcelSubdivide(pos1, pos2); + } + + public void osParcelSetDetails(vector pos, LSL_List rules) + { + m_OSSL_Functions.osParcelSetDetails(pos,rules); + } + public double osList2Double(LSL_Types.list src, int index) { return m_OSSL_Functions.osList2Double(src, index); diff --git a/OpenSim/Tests/Common/Mock/TestLandChannel.cs b/OpenSim/Tests/Common/Mock/TestLandChannel.cs index be28c270df..159764cff8 100644 --- a/OpenSim/Tests/Common/Mock/TestLandChannel.cs +++ b/OpenSim/Tests/Common/Mock/TestLandChannel.cs @@ -85,5 +85,9 @@ namespace OpenSim.Tests.Common.Mock public void setParcelObjectMaxOverride(overrideParcelMaxPrimCountDelegate overrideDel) {} public void setSimulatorObjectMaxOverride(overrideSimulatorMaxPrimCountDelegate overrideDel) {} public void SetParcelOtherCleanTime(IClientAPI remoteClient, int localID, int otherCleanTime) {} + + public void Join(int start_x, int start_y, int end_x, int end_y, UUID attempting_user_id) {} + public void Subdivide(int start_x, int start_y, int end_x, int end_y, UUID attempting_user_id) {} + } } From 36bcab5f075089f18a5c80f3f988c1e6605c16e5 Mon Sep 17 00:00:00 2001 From: Dan Lake Date: Tue, 4 May 2010 16:49:46 -0700 Subject: [PATCH 04/46] Refactor scene presence list for lockless iteration. Lock contention will now only be for simultaneous add/removes of scene presences from the scene. --- OpenSim/Region/Framework/Scenes/SceneGraph.cs | 114 ++++++++---------- 1 file changed, 53 insertions(+), 61 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index ce11267196..ef13c9834a 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs @@ -68,8 +68,9 @@ namespace OpenSim.Region.Framework.Scenes #region Fields - protected Dictionary m_scenePresences = new Dictionary(); - protected ScenePresence[] m_scenePresenceArray = new ScenePresence[0]; + protected object m_presenceLock = new object(); + protected Dictionary m_scenePresenceMap = new Dictionary(); + protected List m_scenePresenceArray = new List(); // SceneObjects is not currently populated or used. //public Dictionary SceneObjects; @@ -132,10 +133,12 @@ namespace OpenSim.Region.Framework.Scenes protected internal void Close() { - lock (m_scenePresences) + lock (m_presenceLock) { - m_scenePresences.Clear(); - m_scenePresenceArray = new ScenePresence[0]; + Dictionary newmap = new Dictionary(); + List newlist = new List(); + m_scenePresenceMap = newmap; + m_scenePresenceArray = newlist; } lock (m_dictionary_lock) @@ -518,34 +521,29 @@ namespace OpenSim.Region.Framework.Scenes Entities[presence.UUID] = presence; - lock (m_scenePresences) + lock (m_presenceLock) { - if (!m_scenePresences.ContainsKey(presence.UUID)) - { - m_scenePresences.Add(presence.UUID, presence); + Dictionary newmap = new Dictionary(m_scenePresenceMap); + List newlist = new List(m_scenePresenceArray); - // Create a new array of ScenePresence references - int oldLength = m_scenePresenceArray.Length; - ScenePresence[] newArray = new ScenePresence[oldLength + 1]; - Array.Copy(m_scenePresenceArray, newArray, oldLength); - newArray[oldLength] = presence; - m_scenePresenceArray = newArray; + if (!newmap.ContainsKey(presence.UUID)) + { + newmap.Add(presence.UUID, presence); + newlist.Add(presence); } else { - m_scenePresences[presence.UUID] = presence; - - // Do a linear search through the array of ScenePresence references - // and update the modified entry - for (int i = 0; i < m_scenePresenceArray.Length; i++) - { - if (m_scenePresenceArray[i].UUID == presence.UUID) - { - m_scenePresenceArray[i] = presence; - break; - } - } + // Remember the old presene reference from the dictionary + ScenePresence oldref = newmap[presence.UUID]; + // Replace the presence reference in the dictionary with the new value + newmap[presence.UUID] = presence; + // Find the index in the list where the old ref was stored and update the reference + newlist[newlist.IndexOf(oldref)] = presence; } + + // Swap out the dictionary and list with new references + m_scenePresenceMap = newmap; + m_scenePresenceArray = newlist; } } @@ -561,25 +559,21 @@ namespace OpenSim.Region.Framework.Scenes agentID); } - lock (m_scenePresences) + lock (m_presenceLock) { - if (m_scenePresences.Remove(agentID)) + Dictionary newmap = new Dictionary(m_scenePresenceMap); + List newlist = new List(m_scenePresenceArray); + + // Remember the old presene reference from the dictionary + ScenePresence oldref = newmap[agentID]; + // Remove the presence reference from the dictionary + if (newmap.Remove(agentID)) { - // Copy all of the elements from the previous array - // into the new array except the removed element - int oldLength = m_scenePresenceArray.Length; - ScenePresence[] newArray = new ScenePresence[oldLength - 1]; - int j = 0; - for (int i = 0; i < m_scenePresenceArray.Length; i++) - { - ScenePresence presence = m_scenePresenceArray[i]; - if (presence.UUID != agentID) - { - newArray[j] = presence; - ++j; - } - } - m_scenePresenceArray = newArray; + // Find the index in the list where the old ref was stored and remove the reference + newlist.RemoveAt(newlist.IndexOf(oldref)); + // Swap out the dictionary and list with new references + m_scenePresenceMap = newmap; + m_scenePresenceArray = newlist; } else { @@ -698,7 +692,7 @@ namespace OpenSim.Region.Framework.Scenes } /// - /// Request a copy of m_scenePresences in this World + /// Get a reference to the scene presence list. Changes to the list will be done in a copy /// There is no guarantee that presences will remain in the scene after the list is returned. /// This list should remain private to SceneGraph. Callers wishing to iterate should instead /// pass a delegate to ForEachScenePresence. @@ -706,8 +700,7 @@ namespace OpenSim.Region.Framework.Scenes /// private List GetScenePresences() { - lock (m_scenePresences) - return new List(m_scenePresenceArray); + return m_scenePresenceArray; } /// @@ -717,12 +710,10 @@ namespace OpenSim.Region.Framework.Scenes /// null if the presence was not found protected internal ScenePresence GetScenePresence(UUID agentID) { - ScenePresence sp; - lock (m_scenePresences) - { - m_scenePresences.TryGetValue(agentID, out sp); - } - return sp; + Dictionary presences = m_scenePresenceMap; + ScenePresence presence; + presences.TryGetValue(agentID, out presence); + return presence; } /// @@ -733,7 +724,8 @@ namespace OpenSim.Region.Framework.Scenes /// null if the presence was not found protected internal ScenePresence GetScenePresence(string firstName, string lastName) { - foreach (ScenePresence presence in GetScenePresences()) + List presences = GetScenePresences(); + foreach (ScenePresence presence in presences) { if (presence.Firstname == firstName && presence.Lastname == lastName) return presence; @@ -748,7 +740,8 @@ namespace OpenSim.Region.Framework.Scenes /// null if the presence was not found protected internal ScenePresence GetScenePresence(uint localID) { - foreach (ScenePresence presence in GetScenePresences()) + List presences = GetScenePresences(); + foreach (ScenePresence presence in presences) if (presence.LocalId == localID) return presence; return null; @@ -756,10 +749,8 @@ namespace OpenSim.Region.Framework.Scenes protected internal bool TryGetScenePresence(UUID agentID, out ScenePresence avatar) { - lock (m_scenePresences) - { - m_scenePresences.TryGetValue(agentID, out avatar); - } + Dictionary presences = m_scenePresenceMap; + presences.TryGetValue(agentID, out avatar); return (avatar != null); } @@ -1036,8 +1027,9 @@ namespace OpenSim.Region.Framework.Scenes }); Parallel.ForEach(GetScenePresences(), protectedAction); */ - // For now, perform actiona serially - foreach (ScenePresence sp in GetScenePresences()) + // For now, perform actions serially + List presences = GetScenePresences(); + foreach (ScenePresence sp in presences) { try { From 8b6a295874124f70146ae79f01281f2067068a82 Mon Sep 17 00:00:00 2001 From: AlexRa Date: Sun, 16 May 2010 16:22:38 +0300 Subject: [PATCH 05/46] Migration.cs supports single-file migration history format Scans for migration resources in either old-style "scattered" (one file per version) or new-style "integrated" format (single file "Resources/{StoreName}.migrations[.nnn]") with ":VERSION nnn" sections). In the new-style migrations it also recognizes ':GO' separators for parts of the SQL script that must be sent to the server separately. The old-style migrations are loaded each in one piece and don't support the ':GO' feature. Status: TESTED and works fine in all modes! --- OpenSim/Data/Migration.cs | 347 ++++++++++++++++++++++++++------------ 1 file changed, 238 insertions(+), 109 deletions(-) diff --git a/OpenSim/Data/Migration.cs b/OpenSim/Data/Migration.cs index 06defe4e36..7980c35ba0 100644 --- a/OpenSim/Data/Migration.cs +++ b/OpenSim/Data/Migration.cs @@ -70,61 +70,111 @@ namespace OpenSim.Data public class Migration { - private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + protected static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - private string _type; - private DbConnection _conn; - // private string _subtype; - private Assembly _assem; - private Regex _match; + protected string _type; + protected DbConnection _conn; + protected Assembly _assem; - private static readonly string _migrations_create = "create table migrations(name varchar(100), version int)"; - // private static readonly string _migrations_init = "insert into migrations values('migrations', 1)"; - // private static readonly string _migrations_find = "select version from migrations where name='migrations'"; + private Regex _match_old; + private Regex _match_new; - - public Migration(DbConnection conn, Assembly assem, string type) - { - _type = type; - _conn = conn; - _assem = assem; - _match = new Regex(@"\.(\d\d\d)_" + _type + @"\.sql"); - Initialize(); + /// Have the parameterless constructor just so we can specify it as a generic parameter with the new() constraint. + /// Currently this is only used in the tests. A Migration instance created this way must be then + /// initialized with Initialize(). Regular creation should be through the parameterized constructors. + /// + public Migration() + { } public Migration(DbConnection conn, Assembly assem, string subtype, string type) + { + Initialize(conn, assem, type, subtype); + } + + public Migration(DbConnection conn, Assembly assem, string type) + { + Initialize(conn, assem, type, ""); + } + + /// Must be called after creating with the parameterless constructor. + /// NOTE that the Migration class now doesn't access database in any way during initialization. + /// Specifically, it won't check if the [migrations] table exists. Such checks are done later: + /// automatically on Update(), or you can explicitly call InitMigrationsTable(). + /// + /// + /// + /// + /// + public void Initialize (DbConnection conn, Assembly assem, string type, string subtype) { _type = type; _conn = conn; _assem = assem; - _match = new Regex(subtype + @"\.(\d\d\d)_" + _type + @"\.sql"); - Initialize(); + _match_old = new Regex(subtype + @"\.(\d\d\d)_" + _type + @"\.sql"); + string s = String.IsNullOrEmpty(subtype) ? _type : _type + @"\." + subtype; + _match_new = new Regex(@"\." + s + @"\.migrations(?:\.(?\d+)$|.*)"); } - private void Initialize() + public void InitMigrationsTable() { - // clever, eh, we figure out which migrations version we are - int migration_version = FindVersion(_conn, "migrations"); - - if (migration_version > 0) - return; - - // If not, create the migration tables - using (DbCommand cmd = _conn.CreateCommand()) + // NOTE: normally when the [migrations] table is created, the version record for 'migrations' is + // added immediately. However, if for some reason the table is there but empty, we want to handle that as well. + int ver = FindVersion(_conn, "migrations"); + if (ver <= 0) // -1 = no table, 0 = no version record { - cmd.CommandText = _migrations_create; - cmd.ExecuteNonQuery(); + if( ver < 0 ) + ExecuteScript("create table migrations(name varchar(100), version int)"); + InsertVersion("migrations", 1); } - - InsertVersion("migrations", 1); } + /// Executes a script, possibly in a database-specific way. + /// It can be redefined for a specific DBMS, if necessary. Specifically, + /// to avoid problems with proc definitions in MySQL, we must use + /// MySqlScript class instead of just DbCommand. We don't want to bring + /// MySQL references here, so instead define a MySQLMigration class + /// in OpenSim.Data.MySQL + /// + /// + /// Array of strings, one-per-batch (often just one) + protected virtual void ExecuteScript(DbConnection conn, string[] script) + { + using (DbCommand cmd = conn.CreateCommand()) + { + cmd.CommandTimeout = 0; + foreach (string sql in script) + { + cmd.CommandText = sql; + cmd.ExecuteNonQuery(); + } + } + } + + protected void ExecuteScript(DbConnection conn, string sql) + { + ExecuteScript(conn, new string[]{sql}); + } + + protected void ExecuteScript(string sql) + { + ExecuteScript(_conn, sql); + } + + protected void ExecuteScript(string[] script) + { + ExecuteScript(_conn, script); + } + + + public void Update() { - int version = 0; - version = FindVersion(_conn, _type); + InitMigrationsTable(); - SortedList migrations = GetMigrationsAfter(version); + int version = FindVersion(_conn, _type); + + SortedList migrations = GetMigrationsAfter(version); if (migrations.Count < 1) return; @@ -132,57 +182,41 @@ namespace OpenSim.Data m_log.InfoFormat("[MIGRATIONS] Upgrading {0} to latest revision {1}.", _type, migrations.Keys[migrations.Count - 1]); m_log.Info("[MIGRATIONS] NOTE: this may take a while, don't interupt this process!"); - using (DbCommand cmd = _conn.CreateCommand()) + foreach (KeyValuePair kvp in migrations) { - 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; - try - { - cmd.ExecuteNonQuery(); - } - catch (Exception e) - { - m_log.DebugFormat("[MIGRATIONS] Cmd was {0}", cmd.CommandText); - m_log.DebugFormat("[MIGRATIONS]: An error has occurred in the migration {0}.\n This may mean you could see errors trying to run OpenSim. If you see database related errors, you will need to fix the issue manually. Continuing.", e.Message); - cmd.CommandText = "ROLLBACK;"; - cmd.ExecuteNonQuery(); - } + int newversion = kvp.Key; + // we need to up the command timeout to infinite as we might be doing long migrations. - if (version == 0) - { - InsertVersion(_type, newversion); - } - else - { - UpdateVersion(_type, newversion); - } - version = newversion; + /* [AlexRa 01-May-10]: We can't always just run any SQL in a single batch (= ExecuteNonQuery()). Things like + * stored proc definitions might have to be sent to the server each in a separate batch. + * This is certainly so for MS SQL; not sure how the MySQL connector sorts out the mess + * with 'delimiter @@'/'delimiter ;' around procs. So each "script" this code executes now is not + * a single string, but an array of strings, executed separately. + */ + try + { + ExecuteScript(kvp.Value); } + catch (Exception e) + { + m_log.DebugFormat("[MIGRATIONS] Cmd was {0}", kvp.Value.ToString()); + m_log.DebugFormat("[MIGRATIONS]: An error has occurred in the migration {0}.\n This may mean you could see errors trying to run OpenSim. If you see database related errors, you will need to fix the issue manually. Migration aborted.", e.Message); + ExecuteScript("ROLLBACK;"); + return; + } + + if (version == 0) + { + InsertVersion(_type, newversion); + } + else + { + UpdateVersion(_type, newversion); + } + version = newversion; } } - // private int MaxVersion() - // { - // int max = 0; - // string[] names = _assem.GetManifestResourceNames(); - - // foreach (string s in names) - // { - // Match m = _match.Match(s); - // if (m.Success) - // { - // int MigrationVersion = int.Parse(m.Groups[1].ToString()); - // if (MigrationVersion > max) - // max = MigrationVersion; - // } - // } - // return max; - // } - public int Version { get { return FindVersion(_conn, _type); } @@ -206,7 +240,7 @@ namespace OpenSim.Data try { cmd.CommandText = "select version from migrations where name='" + type + "' order by version desc"; - using (IDataReader reader = cmd.ExecuteReader()) + using (DbDataReader reader = cmd.ExecuteReader()) { if (reader.Read()) { @@ -217,7 +251,8 @@ namespace OpenSim.Data } catch { - // Something went wrong, so we're version 0 + // Something went wrong (probably no table), so we're at version -1 + version = -1; } } return version; @@ -225,57 +260,151 @@ namespace OpenSim.Data private void InsertVersion(string type, int version) { - 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(); - } + m_log.InfoFormat("[MIGRATIONS]: Creating {0} at version {1}", type, version); + ExecuteScript("insert into migrations(name, version) values('" + type + "', " + version + ")"); } private void UpdateVersion(string type, int version) { - 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(); - } + m_log.InfoFormat("[MIGRATIONS]: Updating {0} to version {1}", type, version); + ExecuteScript("update migrations set version=" + version + " where name='" + type + "'"); } - // private SortedList GetAllMigrations() - // { - // return GetMigrationsAfter(0); - // } + private delegate void FlushProc(); - private SortedList GetMigrationsAfter(int after) + /// Scans for migration resources in either old-style "scattered" (one file per version) + /// or new-style "integrated" format (single file with ":VERSION nnn" sections). + /// In the new-style migrations it also recognizes ':GO' separators for parts of the SQL script + /// that must be sent to the server separately. The old-style migrations are loaded each in one piece + /// and don't support the ':GO' feature. + /// + /// The version we are currently at. Scan for any higher versions + /// A list of string arrays, representing the scripts. + private SortedList GetMigrationsAfter(int after) { - string[] names = _assem.GetManifestResourceNames(); - SortedList migrations = new SortedList(); - // because life is funny if we don't - Array.Sort(names); + SortedList migrations = new SortedList(); + string[] names = _assem.GetManifestResourceNames(); + if( names.Length == 0 ) // should never happen + return migrations; + + Array.Sort(names); // we want all the migrations ordered + + int nLastVerFound = 0; + Match m = null; + string sFile = Array.FindLast(names, nm => { m = _match_new.Match(nm); return m.Success; }); // ; nm.StartsWith(sPrefix, StringComparison.InvariantCultureIgnoreCase + + if( (m != null) && !String.IsNullOrEmpty(sFile) ) + { + /* The filename should be '.migrations[.NNN]' where NNN + * is the last version number defined in the file. If the '.NNN' part is recognized, the code can skip + * the file without looking inside if we have a higher version already. Without the suffix we read + * the file anyway and use the version numbers inside. Any unrecognized suffix (such as '.sql') + * is valid but ignored. + * + * NOTE that we expect only one 'merged' migration file. If there are several, we take the last one. + * If you are numbering them, leave only the latest one in the project or at least make sure they numbered + * to come up in the correct order (e.g. 'SomeStore.migrations.001' rather than 'SomeStore.migrations.1') + */ + + if (m.Groups.Count > 1 && int.TryParse(m.Groups[1].Value, out nLastVerFound)) + { + if( nLastVerFound <= after ) + goto scan_old_style; + } + + System.Text.StringBuilder sb = new System.Text.StringBuilder(4096); + int nVersion = -1; + + List script = new List(); + + FlushProc flush = delegate() + { + if (sb.Length > 0) // last SQL stmt to script list + { + script.Add(sb.ToString()); + sb.Length = 0; + } + + if ( (nVersion > 0) && (nVersion > after) && (script.Count > 0) && !migrations.ContainsKey(nVersion)) // script to the versioned script list + { + migrations[nVersion] = script.ToArray(); + } + script.Clear(); + }; + + using (Stream resource = _assem.GetManifestResourceStream(sFile)) + using (StreamReader resourceReader = new StreamReader(resource)) + { + int nLineNo = 0; + while (!resourceReader.EndOfStream) + { + string sLine = resourceReader.ReadLine(); + nLineNo++; + + if( String.IsNullOrEmpty(sLine) || sLine.StartsWith("#") ) // ignore a comment or empty line + continue; + + if (sLine.Trim().Equals(":GO", StringComparison.InvariantCultureIgnoreCase)) + { + if (sb.Length == 0) continue; + if (nVersion > after) + script.Add(sb.ToString()); + sb.Length = 0; + continue; + } + + if (sLine.StartsWith(":VERSION ", StringComparison.InvariantCultureIgnoreCase)) // ":VERSION nnn" + { + flush(); + + int n = sLine.IndexOf('#'); // Comment is allowed in version sections, ignored + if (n >= 0) + sLine = sLine.Substring(0, n); + + if (!int.TryParse(sLine.Substring(9).Trim(), out nVersion)) + { + m_log.ErrorFormat("[MIGRATIONS]: invalid version marker at {0}: line {1}. Migration failed!", sFile, nLineNo); + break; + } + } + else + { + sb.AppendLine(sLine); + } + } + flush(); + + // If there are scattered migration files as well, only look for those with higher version numbers. + if (after < nVersion) + after = nVersion; + } + } + +scan_old_style: + // scan "old style" migration pieces anyway, ignore any versions already filled from the single file foreach (string s in names) { - Match m = _match.Match(s); + m = _match_old.Match(s); if (m.Success) { int version = int.Parse(m.Groups[1].ToString()); - if (version > after) + if ( (version > after) && !migrations.ContainsKey(version) ) { using (Stream resource = _assem.GetManifestResourceStream(s)) { using (StreamReader resourceReader = new StreamReader(resource)) { - string resourceString = resourceReader.ReadToEnd(); - migrations.Add(version, resourceString); + string sql = resourceReader.ReadToEnd(); + migrations.Add(version, new string[]{sql}); } } } } } - - if (migrations.Count < 1) { + + if (migrations.Count < 1) + { m_log.InfoFormat("[MIGRATIONS]: {0} up to date, no migrations to apply", _type); } return migrations; From a49716dc2f9a6beed410e1d5811f33acf63ed72f Mon Sep 17 00:00:00 2001 From: AlexRa Date: Sun, 16 May 2010 16:24:50 +0300 Subject: [PATCH 06/46] Embedded MySql.Data.dll updated to 6.2.3.0. This is necessary to correct a known problem with the DELIMITER command in previous versions of the client library. --- bin/MySql.Data.dll | Bin 294912 -> 335872 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/bin/MySql.Data.dll b/bin/MySql.Data.dll index a94dd3def8deda655b3e0a9304dfb05e135bd398..7aa95ec345a5d23b2cb6a7da21c534328e65da90 100644 GIT binary patch literal 335872 zcmeFa37jNFl|P=HnUz;nb$51kXLa|?bT!8`NgX}Y-5kS!%zz+r35aMnh{FsZ(gG=2 z;4x)!dBY3}3?74kwxX-6>+xGxU9a`TTf}Qs9AWWTkM&&F^_uyAzb`WD=$UR@o&Wmz z{r@yfWyFi?#fuj&UPQczIQ`sLXojX~CjRZ&qiOHMmwy}Ocln>|5Zqh(=U(j}-7g&Q zzMj**aKMwEacO=0S#fkpy!rC+3pZbJMRe8pmW#*ZtFIWp^osEl&NzGg^5~+AC-Zsl z;3VraPt>&2dJOHZFMj0Iw6q5`{eWzbqiMeYR^tl#G%KUrzvHw2`OH&a_P*bK{rw+!{P*8-`QJ_ce$NFx(MNAt`Gb=`{<`f?|EF_m|6&~V zq^F)bbHS_MQ#x+V9nI5>lj;vV|AcRQR~&xO4{N*Ma>UN#KXzpE9R2n$9CiE0iqClH zp|iH0{Nk(5zH0L;&bs(>kGXvFQ;xdg%ZD0kbv2&{l6p9)X`XI`nAcl+G4%O~do=A? zAu0_gexDWEbOvEjeOB>PUxReb0#+3g=OCQrF}(q*nB@a?qbUvmFlko+aR7iU6+j#S zAbSN62LM(I5C;HW3J?bX*%TlS05GXnd58l5tSl&iH~`3}0C51&n*ziEKwk0l<15Xci(5{vZA2c0Id$# z@h>Gh;b}$zGpg9}iXIj*3}4NTPll(GiBA<6V{8MGJ<(%W8$BEap!C$ql5$mxcDz|4 z60Rajwe9Fw#1E!`<%F&g)&cpin+>4 zEB=$@!!SpMNk&d_mR#G)ZTjn0Z0l)edU!y)nA5E|-wHu74C*Q--!6t>Zbvb0aW?OE zwK+n`OO)!Y5_nJ)*5#LM`jf$_;L}QudpZ!^> zgCw!35(g@6VXdppgA*ZI{U9F{%%G4l8$Z%DliwfnYZ;ACqnNzWxEG&-X*9mTukG7L z=9U8HQ-Keq+B;AyXaHGsQ`>|1Ci z%QYMSF63KXoGoN-8OQd4w#he3rA=Ed$ouBlY{B$RYx)MgL7d!cFeaGRj!m;8=Vo2K zL7eU4?2hoM8O=iUHe{}ldUoWT+DcSR;ttR5XhN`?`btHNum5S!9;ej5sXC!MrM^u~ z$afN<6&J&dsSm5TZUdbJy=DP9YWc_A9dVw>pF0aC^z>!*yz4xkusb?MRT-@`FODG2M{ z@ZWp(JWAFwhQcn&>J5%7_a`JxiS_K?f>`FNsR0aS5Pul+W($^|0o5~q4Ob~HR$Mr_ zzZgXylTKCKZ^P1l9N|j4_ZwDLxvy47jw>?RhKmT768QvX1|9_7tH>rg}T#U+Gk}@YFA}^*Uy1ezT@XN+{Tduj=4fFKD~3n z)H%cAm^!_i(y6bPbnk^&&4Juxi;mVvecf@^eF$Z=f>MVw96lCvN8cGnGy1*w?e%lR z$a3Ay9Vqo8I(d+xy}|U)6E6_W`#E>&>G(mC1oJhlQt#ZD!nYf*zTX3;o=*>E|lwJtG$a zVzUt2x7hL!&VFuWi*zQ;^f=?|wK12YBI$mQ4GQ#*ukn z=}%?Bdj65HUY%dR`HvhdT0Fn6PSB#$5_LP*h_DAM zlzR|i4kCQ+1$vFtnW3E(k!2w z1_dg}RA4N|GA0*gnXuej>ZeH9d*;ymjB7++KoYOw z7-sY(x(0ewd@IDFf@P}&Tmv>VtX;BAd?WfOV;ZZYcjIf#M*jyNG#}TAuZJjd5U1pA zCsnvY5yY`2#%HUXB1>r{B7kJi@&cNB{%+q za(O7`4Ah94K`_1>_}v8sGIb1(|4BhcQpcz?4C1U9XQRNea{NDlF&wMLvG730*f`g^ z;V8M|KUc17kXyF^rqiQSLFBv}=MB)_*%_hrJU1@EXFEH#5t9V;7=Qw`BC6t?4S+K` zok6Nf9zXHr0EDNr%~XWvsR+g(mWuCyI|1JVXZ+r_9~_O0Z{<>}O7{l6_kXb~N8UWWkp-qCbBtl2so&&&O zlKQp|_d8l{Jp$1^H#!r)vRG{0eCdXBFe58JIo+LV9?!0BHla00KbEiXGx`+w;r#n< zPy4UlU}$s}a@!`rC&K03_mni;3eN`M9{RIbu3^r0^aMk*nkO)KLNU z&+WnbleIb!kDd&;5g~Vk5)ldj%NmR>#wUr7g%Y^S3%CUpN{4%&KGL!2ldDItse5FY% z+Jelp_Rvf={0evaeh%TfRkv(wP6h!QA$vI|1QEOtjN#?6$om&1EO2?)voJ~FtXpPR zdbANauJLp~6FwcT+7EPuEmd;C(p}8OtU9EkRsOx+U=@uiy;x41GhkF!*X)E1CNKt) z2AOFj2uKm36lg)dMSqaLRxdsUQS}CYt9kVmT+tWeFF+hLCERQR6}ACnqqG5}i&d4o%(@q%UVbYEh63!L zV-QC(JYI({gb=WxYFp9eEXoToM?S>&{OnGy%0*WISSn8T>AoEZx*Ymyy?z!AnDw*1 zck`vwU&g4f?+R0SIHLzS?r`nOPq@IeI5(~D9^IwUy`jDbYIUZp`k|)1SbNT&wETgr zIQrqCz_bs@4tmBwPY9{zRaexXg^yjb;RCww}Oq>(N*-`sJx?g zbajU}d^S8e$F4sI->p{k4df=<*jmp@AObC@Z%Eq&PU``cwJWYteYgM~8$zg$|6#!Z z(F{zhI$GbLc$T^p);b!LCT#$5;_ri1!snt0&x-#5cQDTV@WG-~BWdW5wu20Fif8 z`5QFGCm&k_k?;-E-#mJ<22BPZ?{=!ZICqGi@X*ADd zNL;ZXDbUuYKGZ}joBB8xy5^hc_t<`^Lr=Au7^@(cvuk@=$3^rAEQWzr4_|^p9uPXA z?KQ_yyfm#hm?+wYyM`8~~tx3Lp*upoPegfgx4} zhyww{n}x70lBYNT0C$-(zX0!&&wV|_01540TN#XnKt<{6rUu$muZON8Rd_kD9tY{Q z`Axz6o-m_4Y2F8V-`eTc$0%Lxj!Ff)XFrV+{os7!Pd z+PXSCpoNeTov>$Lc7%*B7-w~jJT{Dc20f^a?2e8eMNH`G^_P=66U|ox*KMjKZkPz;r?zL75oag(mA?4i{Vxj9VbE&UhSK^U=^T;AUQ_qXgfgR zr%@kBch9N9km6=Q9!T2a9ugb1gbat~Dg_IO?G?TPKdKWLlyNYh5USorBAHgLr>yum zx*Y(HO;s1;(?%q!tyRnyOqUeXDQ}0?$5t#@71$iG-xXkF)2eO(0!8E?=qYm2z(LHMCNOXw2Ji$hAJP>E zBj)EZQiM>atV)moML@LSN$b9XT^Y@$#*>;>nbiWyM_sFFk9`(ZeYQ2`zW9!!tz#Ia zB`pe0VvA;z_GY)N9HA&>$FE@}ZvkFPnY$G(A)IZ;cQfcV0Hpb)&281@AKT^GRm)aw zyK69~n&0Vc{S;RnBhTpGW1Vcg=uaVud$@Zjx; zO0g#NXY+3L>(P4li5y$TVUFTl*lsM>}bZ3I}+uphGk^oZ(-3a_Mx z8PTn(3qc2$c@)=1piXKlfur6aw3gFLx$r79S4|%*V-tzMA#W(F8w1)v4+le-xDCx9 z&>1ddgq+(&&a{ooRGP1A_5xYOago4$06+0hlWv&;ADF5hc9lifkj(^US^>);8d z9NnPqg4+C8mw`USIBgl#WL!`~Pz2jm%tJYlMcXMiAtx>&K>{WD*6Sjz07XymI4)g) zs4^~zV+(XEidX&G&47omCX0Z&NqbuwR6wmHG^g|(D~1PydLyD>c~+n|7a4tMYs{^BfKjK%PozTbyTCx=$kAIB^M@7ok|i z21fK=RCk3D{Ubkf(N2`^4Q7=n9Iy6h+SCdw5Qkc@tKS8_&pB4K4PP*7NX8i(31J_b zR4ngyRm?@jD9%+?++l0M6}0T?`ms`Pct|UqEUa~s1gdjqQYz8Vq+4}b0a`%RXa}%P zV6u?i#Ty$94@H)vLgT$qX<=cWlHfCvNnMh$mD_cEcC3^SS1*f~9sLIMQdx*{&ygxc z&fe;XynYO4Zj0F=|?4B{!@ho8f);0HYIC=t-8grkx(zFw%QrWtsE~ zX-{EVFdbzc=R#0&A?diZ>lsB^+cid`Pr;kT;xm_e$Hqb|-6agnsZU4Gbc(jZ%jxQr zPRfYnLr6&N;DlZjxtMqz2-6DbXCm~jo&*O(Z${%tPn(r42xfasb{NcdP^;{{IJT41 zT+AYc(UKn2&1cio+GA2atF-85Qh&6@R)!NOV_7M|dOQc|Rx6rOc4Dl*1B{)koI0R~ zuZ1f+iUI2|{a^EghK#OZok9_^O(BZ2vvCdfkCdTy{7nR8Wl6=1V1jH-f0kHHx3Pk< z*ciKRrw!vKk!k`LYCXO?}Z;rIJuqq`dw)Af+-kccR%_Liiz$f zEMJ)z$cL|^6Z^Y@E_P+D==FefU|Pr^)&gL)FN1ONy92YuIG92li-2J2L{wg zQ{F|^-r|a+0=>ho&|<;w9YOjHNDrsf1)J71d&v1&EGHd{<)oA^U(+-5`JRL?Gulrv zI39xPnKh$0Up8dwKflQ{O8plm?(Dh`Ax^J3{!YwSr)~LEU|XH*HJ!PBbKS)Vwag4Q zcl(XRI%IypZ?P_b0;tx;pMXWzXK)0?AgO81OW=gM8z`8e{7@DdrReXc2QNGSsY{0_MsJX`>5? zXvOXALo0p<5-I|z?L$kp53%}G%0V;kHG4C?R)~3qRmQ-VGs6EvC-{Q<5*XX$Pw(pq z-vfB_nPhBuAiS+6HUY%*etIy)7S9Lhxgzm=h@L3%e1x87(GxVG6qzWkIj_7}>M}70 zG{P?+PWTS|l)Lvuf+nM&XGsE6;gL}o;6RELjsq!DE)Jwfk-c_jY1kq)0{N55VgpMG zWj!4YSgCq;MM(&Gpb0d%s5mI zt2W+%9F6FG)YAug()HR}6rYTAE7M&H(3)JEsOUv_$+wAj7+!L2;vIpPyqkDO;U)Jb z-WBkYe-p3l!g!Tt{3;ZOpjIhxw~Bzfm4En7w0TNAZ}NorlStT7l%W+9xpwg`k!u(4 z61jHqt|~q;irL#9#>4`VhSfTb5idnkWHVQ@MXEys*cfN?W$uv{Vo$FeWmiX2xXrHN zh41E%1g^|n-H!pG>SpfY*Q;dX-vV*9OKaA!>|}+XMJ`w|WxlIspyFhs51~~mwy{ba z7=MI3^TW}-fYVC~-QNl%jg(JiQu1bsMxcVbJ{68-LZo(L(x~kti8`}dHPgo=9|d@R zREjT?A06$PpwA@egLP_MFRso?54Kn5q+2_xr|WvKIxl_JU0pDxC&LVoUCM|yf83=5H9G56PC~%&;(%f7U`xL*J#KmsQ$hCZ@yl#Yo0XC)11apj z7EBd1JXKtjA7y}r{8aepUf~o8?eMXw>Z0_l4neb>NK#4=`=p-URAEsnN)6Rmsvb%x zDM_TnkCHh`(A2?Hkmnr#2heLF3;Y3X_YfHhj8_c5B*6%`xJJ7;ysy=}lZb3Tu9d7s zJ}KK}P3&$M;pdr?F{<{mIaw>!?!+9eG>+fl(t7-kl-A%^?QUDaPHC;IRaB0gHLM)T z3B;gaVJ~xW{9fb`e+WNv2)bX>DJYRyOjgmH;Y>P|q{GB$x;i8RTV#)|eGqk>ChrQ-s%KL8J~FKsxjlaLq5}n#;W9Zb zL&YZrC}+KL_)qwaAY;AgeUgSUBJGFc4)ybzCVk zJ`x17u`mNU?S)`ySb&tD)~Bf^x30mU<(1*RpM8&e1K)sbbx^;N4wFcZ?=*LaIjqy< zA?7F#hd0u;Xe@a!LoAkZ_#Iw_AKD?l5Sjgzc8IVt5f$2v+fxNsO%+aJ+nm@2p(Qw4Xgslp;l!#XVudxQD17nIBBuIjI)_l?Sgmx1m72NQRaYAmRO{k<~G zG!RGWhQCEN91{$sVkl)QQ5x3hL**`jm{y4bk?0XB1~rNVpkh#|0DvDAqXVE~P}xEZ zepHMOfQmug0x|eeF**P$2K5cZ;77&i0H_#LJrIK*6{7>d7=f5#$LyhI^D2G@n{|BJ z;6Q;*1%^h>SX?AvqOw<{Q&Obg$@?-`{Zi^Tb??W3z7@(FN#R-JzXM?IL@bffq(`n5 z?ZtNx|DcIqf-X^xaf=9kZ2wgB>f0nWi?QWO-5p-ku~C47G0SO8%F66(H*T`(+GbJx~BkD2VFZIb%5xE?pHZM zw{FSWwE?sAR7qo&*2=eXh>c4sJiBzrWX3KXID=E@Nd#06WmIe!!qTA@m8ajA(&uF4 zeK_e;?Wb606BWZB0g1|*#QvPNQuz}{8!ljJOKdo3M*!EAN={Q*HRiqm(2M4DpJID$MD4J3dp zT66-0t4@AqblNDwaI$UQju4J1-4G5cL{u(FnBT2;MPIZQg$y{tbZ4+=H41UK9Mv{W z2Y|~_T>y?TU4ZT}21ypJM*+eGsrU~awBf2$S0-GVY6H~r6jt}ogiJ_nbZNFZ#c}89 zE!)_u(W~_OM-Zv`9Lm6Bq4{GFu^>UQ>n*ZTzK_!zj2hhzlN2#a=Q?W(((=5DS5WZ3 z^?K9;w;sVD45k5;okxRbSD}yS4VD!B3(DkPlJW)-gt>Rs^U+UXgatmg5>p9@97G>O zXi=?U90i6vQu2}VStN`mbUlJBhRJ(~J4P^#kg%O_u742aqLdbZN4B%k$B|)9mED0* zajuO=-ih9Y^aazEt;Er}dEbN$8@isNKm`5Int~CfV6g7xC}v;z5pyTPH9D}<^)u>1 zn@<2%#bJ=1Tq0;ISvR&*4@{_4rmobbRs3FMyGhxV0OnAw`bD2a?i;d@R(nA=ex0ok zM0wuk4t&>9zSf`?kmAu6{D{3uzX97Y0c|4u{gAU6wR{kGMjh7?;d-cI^fY|!Xfu9u zl_N6-+)sf!HTmZFp_>^eGy%-p(HuUWTeDRxFG=XsK82Lgr+~7IIEsRq=w1LO)Vk&4 zfG7V{^&`j@E4r38BpC9II8UkxJ?WLfv51*kG5R!eC|xj_O`V6#h>D=b-cyj@QK-9t zYF!LOG5Q{wi4Se%mDMwm0fehy(9pviEE9eP`Kh7QGJ{TBV4rFgVeeP}EMhbp;BD^a z|2GInb>g|~MZA|x9N@#}0TArg8Ac~m2`svJ-QxwH6>lX z@-*9xK8J!}*B4@dz)oI-nYu^b8k!jhv%rWIh%0v)+0hr_oPG`F!%lUzbMvLaR7uCDj+F(kxfQYX27jab;9oU6b{})SMPEgEm?4sA=ptW(PsH?OL3ye$oBKL| z!!-0SM&E!li5&ea+_ghh=5}PD7STJ=is;rX4n{kFK;f!GkO@VBN{I1IB;BwTGC<{3 zU8%lFC25PKH%Qy)TP$z2uxW8tm{hf967waj-s9TUr8tM8P5E&hXmJc^Av?}q{oBY0 zvrHw1^R7qNdb;W* z(RYwzu5z#wVGYH*>Rb*+ID-K9%9%bZ`Ys$rK_RX*Rc04#PjJ~dGV(n%wj^@Kc<@8Q-1d_+iEfc5?CcpIH*ic?-(f$Z~}2 z(Z2&OhVc_d%vNgyJVU4{fP|zkMdYfU!LUe!**2e8MHw!^Pr?+Z8u72YvdS5;olo+X z{uvg)UGZwdeuO-SK0_+Hvd~(p{?P)(xtl*x)|0 zmCekdNuT&JG7W!%pIRyo36YqVoNM-UD;xw4{9-4EU4dOIKAL&`6t0|}K+Z}b&FfK| zVjSs#H9stZ_hIvf=xS6|p+WQ?%nDb0Dr!oN;49QDa4!yHR}Fn;s{Ck|CC zQ+PGP7~>WEbx-aA4SdxVA!d7Uhmh~Wq&*yB3QX9JI*c*geYV~DVTO6qFL}5NW;WTj zdc#9sO6rQ@gfJ!6a9*reV&S?7%o&tejt$oi4;hrCa9BeQo<|0CUdYW z#`#{jq@Vfm0dQM>zp8zI z5dIr-h+wQ}CE6%foxJIHB_|kgF6}?zR|721$h-=;K9;x|;h(^bh9Cf=P}og-$fE`Z zEJ~+`C8FKmW8e@;9xOu?PsG`R6h%kPAo_9RfLdQ$0!=@IM85$B(SPAbFf<~;@ZE-B zwkwBoBDnKJaZzf|R@N@KQ9b`-K-UMp@~3m6jXRK=F91pPqO4&xUqtsR<%aHsxj7~h zUh{=?>WvrU6V!i42sp>&w3~^e-viR}K&-YsP;c5Ekf`lJ^LsohzzmFN4}GU3*+I#J z_Q2orWQg?)tB$#Ra(3IK9k?0`^#-vGiV_mw0yV82WOW7E^a+nrPdNeYZq)kYJHeOXSBWKba&M~{Ok1Xb@v%St zdxm7Fwzv|KnFV~RKl~aZOR~C0xZZdf>Y+Do#P1CButUKy8Rb<$b8?*q)bg7Ug9jV< zHE`9&RphNoUqVCxNQo@eX=Z58HdVeIxgUZhX(kTW0EODf-c5>dHZli8t`WZ$^*mAf zqA*E=ED@{9>NwG3{8rqfose0i|RD=8(<&cl8ZcC+9 z=DakTRlNC9V@*ys6sr@UsF*OhA$62Ju=A1gEI2<0U$&P~Aq3G9t>B=61S+<}Lil$@1na;4EKZ4$WAGIf->4b@zZ_ zmM)rAcM1T1?iE~zuPyap9z!!YHCDkb1d?HcnM7ZM{(9-0XVeY`(_{K)THy@HP(4y_ z5CtouJkzZvgDM9i4%P|NI5_IB;!v<54ue$YLo=YKDu74e%fH$S%(LoA45FaI=cfkr zq44o2KYl-CUmeP~x0M3}i)oD#;zXrK#F4@__{0z3fjO#F83=Ufz`?4L&b4B}TN^ad-b z&`@P7cgHm<9v1z=Ey%HU|6r0H1@lfWe;tNC>;w?gB-!xvbN`GiyNZ=H1&G=b z4ZO2fX~U#vl{U^CY?n6T^8bz~U4@FFT!Q5K%dz5-;`w(#?{xM%*yLrKB)#1v;dOlo zMteltX_D@hE0Vld3$<70u|7y@y9zgp6H%{rvV}!<;Dg;=3%k26#KSW{mdb=xI*9NZ z;cI4mz%L@Xppjp~aOhc2$5&Bkh%#6;swy+uh^lUQKCtFmqpm#(I6nb6%l1k7h6I-q zCtB^8jekUuw-yPvqK%KlcfyYSKB$1W!NsfMF@Pr_0Z!~EobdVNrhdx#-y;7rkiP*` z_eNw5Oo~-Qu>Mm0Qh5@inNh0EJXYadg!aWag87>2-U(_mI8E5jC23A96d@mZPNCJ> z9fizT@epc&AOedpnUX9(Hi?9}4fKJI143C+Ds46XWfT%TbdS7 zVb7v8d{GP}*yPyt6L|PUl2-WI(5?qX=RvBND@91iE59lOr;^MdUy%1 zl)(fN=>Vw6QX$1rD&vkiOn(rA!a2w;DO0e*LhoV>n1{kxMF+1K+IHZ3)?WAqJXn3) zUZ~|9W5&i!1;uRTNULh{oSTEkL?9l{B*Aptx9|w4zRkwPEZuSJy>UOqki95$6WCB3 zxVs0JRvclV|H8LHe7MW!2WYWcpHVt^5|+Q4CNoB95*P6BTA6vlg*RP19TIneEu}YJ zkB`!x-vAfICIdvkiUZ@#>j02<6gU=(2iMZ^&@|5@)Ilfy>GfNn7dKyrxcWF(2Aa${ zoshnfZX?8c5@>Q6o5X0oi7?48x&cWifYUuKklr9V&3{KhDo!9*ccyM$^r`msu9DLK zy7JBFrGh~5e~18Ci8Tv~A?I*7`VZSE1xXHwQIE}NxAv%cW=8E)lSW4Kr>&})OeLA=*^r@1@lu!;yMx1R{U#Lsjq^~skrmu z2%6y1Yz3RvL}N&UkaubN+D z7?*mMbc?JWje=x$VBdVHP+^|EfV81ef`@slq0J&a|G@1xLVaz19HFWE6LiZlG=2QR zeoa#`K0|0m^}ElCyZJeO%;p#Q37Q|~#~2K8cOPvyZS5t<|7_rBR$XiyH@<}MyY&X6 zjZWgR4LVlL*qDibj48#xat5vZNqCJ2HRLvy|fCLCudvY1B)%?7qBm&iv zp&O0gfR4fZU=T!iAvs2Q7HT*D6JYYStGzm}aZL3Mxn~#ez>qh*0JVt(3x5Pb-w|ZDn=^U$=4}vM}=1u z+~n)wT4cNo;N!xpW4H*;%h-0n*lPzKSJ;VTz&nllYBX7sjo(=$URIGJZbcDY@DT;y zx)_d^QJBDpk4EQfvfJU_czyrS_O5@Wv+E2$}a8g{({BFWR2o_K_O`gZMJ5)tC z@9&E0Ng>UTfRMrJTo!`{ozP($VfN8eii0i?zTMOW`Y^Z(gB`Y$ed|I{A>LD8C5kxxMu;A`QF;}WWC>*`|j zj3xJ)yVh*-5)Q7M04t;cRE3~~vEF;N<1tXKpn3}0JG{!3|NE?MP2Z#_6zmw9n9zkx zDZswwgFsq6H-;xSPzh10grLEW&QQFvfz9B2seetaYrIwMkT!oYZ8q%n-nH)EFcKok zz@&}e-Z?zbh7EA~jgg98!cO?#gdBc$cKW5Ab?|elqJCB$|FHdR(%JkhI-4|W0ZJCx z7B{%!DTTcnc`d8eKXVCo@7HWu#BfIZ@ctGSENl`Z9*|-$K&f+RoYVuW8V8)Gko;@Z38lU$^<#3sXh?Wgi3k?= zPt)!%-53ul?H5*iS~`OSFUc%(ut_$@d@`erYso!L7>O7bWJCwj^-R}%kh=;(Auce& zbRP3QTe||C=^UB&ap5AF#NnM((F<{vpUm&DHYEu^$$Yd1PQ>)3Sn)WJuu{L=Z**Pz>QdefBNr=(l+6u(vW3d#* z`+4w26S3p0bK{#(Z`hX#YKdBGgH2`rx1aDWFNZJAt#cZUc`4`7%VBKTYF)^Yi8-d+ ztv`_euX>+^8DS|x3`z&+!JmVFm|V-d;1<3f{&5P6c_*(Z7Q+(*-#q?7EszVph({m( zeYo}B2{sXv_f9xCmkOc>uD%buj|rF>7Zw@Sy*xZ${t(imT;G7fg`v~nBK$QCD~kPC zh8M#Mqc<~)09ai7v^zkr^^3(uTxrEMQ_$fpPzD)iU?-4fd~`bm86yB0|B4y61A6h! zNiRZrGi&<89CW?-)K;S2OaP!w;Q1{e7JNsOo1wtbxFD+M7QCTy%jWxEE7sJ#ndyhv ze5~)S_&yo+t-pdpjUHc$OvH>&PFKeuX@|F83s-Q-RL_!n7@L60ooKuPp5!fx%ONpB}yx zv6bCvd^wOzEa-;);lK*inXCnWxM&qy?r9Sn(zAND4&+is5b$Ir#~*lDmY`RMy?xRontIq zh2ppjqAKjAHOr#H*}#WiDl8Nv0QZB*g_*&aY-$y7b1ka~)i9?Vy;u#{vtho_m*&(T z6nsAyZA5P<35vge&6|pK|f!Fuc&-Ol{L^K3RGYU1A_xYeqZ=vWPT7@ z8-E)%o*Rw<+r)e3##z+bXJp?WnEuq#3GOchL7`X~L*B)gzZGkXtFPp*A8fw=dT~H& zrQP1x^mqJz$aPD5KZ?V8B<^$C$c+H3ATeH9v76PwPC~U7Pf36we3o}_z7$6_W)-nb z5Zep@N*E1KvPrOFHduEEw_!N}X2eMnOtOR0;A@4!iVTprMKt{|-tppFUiK|8l`hV) zgW${ey#PfQeNfm?*37wAH-~zx6cOU-*m+Ymg4KG!OY_#qwF{LM?&ubsZ|ddL_R)(# zbxz}vD}?OW^n;e1)N=1i(ocWdD!)lD9XFlVOXse2;F>FWv$$tzGa*|E*_=Su&XsS~ z_0vY?&oxe)Jx5=CntA>?hJG46r32!kQz-ILPCTG?+&$VEGw%N1ou`SkSjN1?s@^XZ$+J5>S!*VW_t5*S+ z@b+9gzv*ts38A%em%pfo2Ld~+rv59&8hpOOk6zyZso4BF-6PGf@guhvHSdR$_6aWo zRblCK5G%&xi#O75hOfj2)=5y8Zz3Sm{4(QXkK~)lSJHz926U>Ys#ux zi=PHz)yJ!Ed=o@!bTCS*9)Xo424Pj7A89U3IYmgRe3B$@K@u^VRY;$rH@?jragc}K za%rrLvT1|BJ-GuZ10*0=lZ`))r1jM(ZL2YU$0x=$Wr}DSlPBqo`&j7luEui2j=l14MV5>MbDH}u@hPE7O z3w(IUXNfA>W$8XDxord-vkvFZz8M+)UkPF^odpip6S!I zG2ru5;Da{3MapIm|A;iwf|T8-61^_ho@0>6SgK z1_x|_$K{UMAh7T6L}LBTU69$PYU5f*_l5bbqvmUrrn2UyZ7sL^!9#}>FzN9xF< z0?Ixg91(5^E&V1pRr2)0j7)h|iXhs}S{dP+04M#vO8TiVqy9Z8#I*V( zLOjtxZc_#AK`KC|K>rCpQ*ge6DS*b!K8cDav=DU=U{1{VAOpdJk^xRrO(WISP-l9o zc##>WP|26OR>EB8b~vIrBt@j{?2x!3>6ei3TjBo=zT>zNT${-t<6UP0^j`qMWLPCT z9PyKAwS4#^v@;U_f{AyJs`B}K67f*4qa}>~0B-XID&7OW10FtZ2YZj~>&sl|iEtbE z_c0(#_=oYk4&VR6w}>w*L3kCM!@1UB_^!nFz(w)%fZqW4wdk5~N z0{>nC$KT^0^Wz`o1soa32wmF#FHKxu$R2@5zBM4rXFexkBNF6i7k+PB_ z+~0njo;PAKO>=#yHEqUpB@zRaeEoST2g{|8GT}=oT2GNa(gS#NC0dUead- zQ`vZIuqA+{{W|(G&WXZI7B3=I^H$XEy!x&uri?v^+vFrp2X_y&V2fD1s90R_E#{su zRBbH6-6?H!+Ih>Lss{x4t!;D_52^7Y8~fG&XXYypQnsxW-)|EPsq0wUaZ+oJ9}gmH z$me4q0hD~!_1)H65w-p?{4^O1F~LvKz?)H@An+RmHuwuvp|j|`_e9$aTn%|mDmskf zLZ$M6zGTv1C8+N3yA_JpX8e<@DG0TxF0fzw}}-~O-TJvV~)k~TdZblSo; z6|R;s0&|S8b^JD08R|HA%=z7+;ILVoTL2Bc+Qa)eY0M!x;q4Lafc5H}F>RG^0UW&w zeUzi4;&7#C)whB49xmpfP7}e#nr;rU(F{s~aHrDMyc#r0SJt%@T&ntv>KdNI~rl?ceWbwGai8 z99zeeaPgT))Ny1rIs+&I{EQB8bQWRJ1^88C`!UEMzwXVz(`^s-@vTTACa6cf7$HtX zE7aOGDqX%Zf?Z73Ln$Ld_$0{X4IyH`dJNnD8!nWcrQ_njAn%!%f@;Oi@|$=yNtwXn zp+YI3f~!r4b>3ZnHl|{#&CCB_RL9lGUxkX?QZ;y9M?5fdrxNiPRFYczzXEBQEQkXD zPR#@$j?wz>FvfGikOMvzqm8T9qoLHa3{bK?LtmYS9?wwDBbbNMH)&=5Fmi=@`ftpf zH-C%YP<|9jZ+Uc_V>NF79-xI6qi(~BvE2SG=_c=^H@*G)b!d;2m!{DoT*J&<%^1A@ z`vg>v_kYum`@d;ZrY>8R3sX--sJim|_j1kmr-1LaG0HJsNmWQLkNk4|-WEK)*86ct z*#S;(^d3%c^j5t664pax#HncW^iFSLET`GkbxTs)N50ql-R)GoYN_j9@2|JRc*#=N zCEbheSla7~rT@))y}Jlja7LZxh$M3eWO*uiyA0QIS(W;9IexZVYs z$8hMqvj|f9U*;Zyu&fcDin0$vMETooW&t`4AaLXv#+cl?W7xER>nXNxj6NL^k~@5O zQ}h$yZ3klf?C@a>PkiP0vnXEOGLA=iY?uy%U1>VpTf|b9TSQLGSS@I|e5jEbC*Bcw znRDXB<=eE|PrWPP#TcD>T3DJK;9rYSMe4U+;BE zV)!#e)vsh+l|c0V%r-(y1`t!*eJP4zT?5qQIs{rk7gC45X z#di}cdGW%1j#1>Vjxnl~ePm(Lkz_AnF@VNTvRiZu;9i#i{!Is{j@tnL77tHw-4oL& zdHXA#2F=t;FyAp#E#2-qc=%3%+T91Q-ziYL3t1xxsNIdM(FD})N>=9`%vYiOXOL%- zcdxm`&-=kMk9ae<9ZdJ()*9*Q>IMeK89F!T4xO8~OT*Ym!ER$|m={I+Ca#PL+RU8v ztnyYIcKj(g8lV5*CprC#N9ulw9!hzqYv`rgrNB>b{1{Q9bHMxIFL3w(m)m5+C&O2N z3VybVtv>hQ=2;ge`j=pEgx`%p_!EhL%`DT-;iq<`q#Q^0)+YPK9bX3W*Ux2E;kTgr zW{phvTO`98Cr?{CI0$zIZv29C+LZ*Q=gnZvfr$!|h^WN(wKB=5$d}Lc8|!#{59aFi z^AM%UT3}kvk2y|jfMWfrg#QEpjs*O+&iaby56~rXlf$1dMN>C9EajH>AtgyaaxAmI zTUvxVK2zvNN)N%fQHn@U>XutxOrOt3GR&`@h7aH0U{+SNiFsMFI-ob02PYpM4$+6d zKqJMwTO{a8AZ1_CDx1yQRdz3P?JRpU0BPCSvruJk0dVP}4;xOY-x(kE<{Qq(qHO*t zQdbX8_~%06j;#RFKe~t>9IF?aY49ZQi{X^@Y~;nYCmtxsuh)zN;hhY3w;BR>T4J~+ zO=RXI4ggqL0f?iswUATiSye+`uve4aT5o(A>Z8l5Hr@x1uY=Ff<;ED#8ZqlXXO~D% z`x?#PqYxZh0dsJ#?Y~$g)?y5uun0y6Pclqc zlCQ2?&EGLl4+jv~{JFRr{NP0vRUB$cKTjq95?>t6l<&=#s%<91NSW$yRQGGU^nEY=zCNEDMYbL{>z04+rQWe9L zo)L?)Fy5lW+8MootMvjkigVNVt9ZzV)WwHnF|c(*vKTv~8xVT|IwKROK*%zK_f#ix zPnxVDEf(5n40c6`KRLHZn!$dSAIMAIsdGKjT_*J;Pw)mzE)9dTS#3E7ho{$)7p476H`05;5sCTmIG zIa+g1&<3tWSL}Mjy&?Ev1va#hnjMtshGweBh%A7N_^GUfzoVMnp^B`0_TH*}Bkc!R zzm)cT1)gzIbT$`ckMV=R>2lI0X^rSQq-(N8aFdAz1eRL7_^e%c|ph^nXMol#!&H-l&QIrjL5S2^Cg`tcwr zju>9WFK>ic!6wHL!`zC|<;c1W=%_%|#*$IL0?@6NY(-(P|A4Wzb&tcdr0#=wR~M>6 zglPF)LC(qQPPh^|fJ@mQho>L3x4Oxl6Q-8y*K(BK+^bm)+**0?ez_$wc$gU=t{MYO z&CREIn0zaf@0p?v53=qUC`%35!-|0~Zp{Y_GrZ_I`0_5wfu7wsrLL{8 z%b2{FJo)H#xVrnSq>Y}3D76i^)E(bo3YMxY#)!7!SGl8xI2n$2c%;N6;Q0VWP5hvf zN@iws4SbOQ$}~~r{w!z<{_^WD!FU@$fPkR{tKxI2>(qHB@V!5y9k-=Wp6B0cKsq0~XkmVYUB6dY*ywS2I15RFFhnwy3V?RQC?zW+LScqU%tsx*qV~Pzvv3 z+bcxfFh{} z8tBum^Sf5v2kCP4>ruPB<3=~&JJCUC={uy=49b1(;yM^seE`X`cwz^V1{ZN-w8xzf zxRK=rDxbsQS9$sekw7Jm!H1~e-4ngpo;^1I11@fuVb$m%gher)&>#EM>uA1pk& zqp(yi;YSRYz4)@BWZXo$#fQ{b_XsH@OfO<`4qOvOAh#AERV4O+bzZRYdms}Am zuEFR=#4b@*IP~J8)?$0UQa6roacq$!z?7l&h3# zqrHjN-vcQbU4(2oYmX0Dk;W07)zq-NqFsl)U^5}PiB&>;7NSKM9xe4WS$r-0IlERe zs)yksz~c0z6W3IeeJ65Rqv{851JdnvlEEd58fGF}???R|xH-T>=V&cW5?yFitz zjzJa$%f_R+)lr)0MzJsE+e|7;^ zpQ@{?X&;J9E0f!+{Y;{3=-TJCEtBdFWbP?{QP(ug4gC1mX-zTaNj-a3?p@C$Xw}j| zM=l+7`qDucE**3wgTB>G?gWkNmrnJnrBl6q>7dUo9rWVw2S#z{0xV)q zMF-Cr)d9oCogD}hV^?k!!w3TElBe!QHY*`|U8`rn1lx_-o#b9!=@tvRWrv%Q8R9*N zbhR&m*-drNFM21KJ)>@D<@iUvSl4dQ4}Y&d1d#-tDWh!%uirpk?-@&a_5W+U?xTby zD9$_1m!SBeOQ$+%=^$R#y+m1?m}=jxd&|;6A6Yu+;iZH2FlgUQwz{-r&|{YlI&bNq zE0+#xE**5+K7t0pu)Sc)(HX}W*_ky)2C?iCoko`J=FY>rxKp>>m{PFKoo-Cg*Y?}t z6FOM+W6Q8=!mEer$3MHxt6#v_hb1FFeix9&boQUY@SN~-R274lY!PeFR8;fpFpg<% z5Z%Oa!h{A3d(&Ps#Q5T^$5acC0Luu1E)r9wU-JY6$Sw>3tb>_)Sbg$KE@3qT(10+92%0OU7!xT|pT z8IWa&YKR0WGT9;w$XxDd7gA&@cV!od%;c`>0+ET_u})BU1{&H>qp^CDz>T(%_|L$h z^<7^32?>ZL?YNbcOY)Ydb~hRaHhF6D2pIQqN8o=U+FkFc1!q9GbZ?Vr(zp$GvYQO!U=ReDCV_9$(sJQ-*)qB@2Xa9!DRM&gek;ezgnM0GxUO`v}HL!rqpFLWqUx+ zty{-}a~%ca0lYYWK+-wyc^BwLEwwnm5!*hRQ9W4X@EGK9bp$aFNn-*acj_O-jX6t6 zGdz_Lv!#^*6g+I(&MGPCJ&@qT{UpAZ5sqpHpfMuFZg&lUHgE+Vnv* z{`zqhC99&~eFjA7O*Nt8phr^P+yM&1{6qTzJfaW*M)-k%{Sg0L^rsX~UFppTd@=ji zmB9UP*1sM}jk)9cv}hOo6J$-4Pn9fVl_Lo#!&^YNaP z&9CWVb39@KHqWJOuBCkbWDs^7|DFy0&4C8|BcEe!M#HLyoYCmy^LGPw1Nr!qsmkxTt(n0T8I_UfR2x_U-(~qE57ZtaOZe13Xm1w&E84U87q=(Z6IY?{ zzJ&dA1F-6t{y^K~g0!f*sZNM}XAKijn4mlf9OPxHdG+E@L=*mgBfbz>bSOQG#WkL1 z9L(c5OKXZHr~Wv_lEpu&^jPRq6PbKsi_e^MkXIe64~}{y4@-L1KF=Ev-g)2vh7)q; z0Po9Oz_RR$+j2q<;v`*sHxL)GUi&_Ro`hJn2Yef^GZ=W~5mUV!kB=g9#wNk7^ zAMJdo{NYSEdKojv)fJozW|c4J#P4b4?3j`<&OWKYiR5F)6oiIM9oxE!9a9DxZ4FW+ zx-GHxj!Qjr@3-N}U~3m|DqmO&E!S(jk~F6iXLy&ajiMe;O*2sTqS6 z%M70aBINPzv{V#T`(&$XKUGz$eNTnqOuwQuXTN@lKP=C(8ItWd$q;HZWTjtFN_zp{D( zSgrYDyzmsgX}odjlIA4Mve7bMNafj_ZTU}GR2$evjouM=&tI#4eKPv0(f z3+P!I{`v8@kyhOUZ&X)9ufZ#&>JUy`IvD2}xXytm83QcdFSzRQFST#ev4o$MNlDIj z)QrT5Pe;n=PE^5>Wo=xZ3wJz6DCXY@w5XsLwxHPCvo)x}ym#D>uLitJ2fhh_wuV`M z9WshukDo+>zIplJdzTOX{_??mY;2jb?d5~_ET8$v>SZ(Euzc`&%LiY(eDK}N2Y+<= z;D?qE{`K;~eG{lRrb=p4XRih=Eg#%ip5{j}b!%mGugvF`2#zmBfOLnfaTLZtYWl;| zhhSB`dY~=4Xz@D`Lv;&20xS#e7$AO*jyQqHBZxfQj{LQDWC~LR;r;qn>|y1 zPdhTD9)cFIaV0t1GU#@UlUONL3z0uY2Tdj&I2s?bm$>nvhjc3a0JC>=tmK(7`-2;w zxHumBfg7LN1$N_eQa=V|GiGPNvOh%+eB}M)l|dQv<4uUHmaA+jkuP#znP!ltVwZ@o zCp5{1oxqJ>wm2S{zYA}&dl!HV-jx$s+Kq2poD*5ujo-5vOcw6Sk4)>vUt1iH%<9I! zBzQM$!M2faQ{2g^c!E6KR~XsUjSCEGO~ODmvZoubUJNE%y7A#%;AF~X$`VDg%9-W7 ztYekaDyM6lA=VWB2$nb)a?}I=@{enr_hLeJGvsQicY8lp^YB*cNGjUn6Hy+{ho}=_ z3+{00Sa6Ce5|y$bzMRppl9&YhW*X5q7o6cFCdT(5evQP;v|?sjF*6I!ND`BsCw{xc zv|2H(R!nQb8BJoc=fw9)OuH4+ZpE}0oE1q-b{pA0M#m`@)mawb8E&~2oRvvTY67zV zx`4&7(IlojJe;}~oK;Cota=5qd$r(ut(e|$n#Nmj#*&zL9yE}#Zvl6Dre$VZrDqqM zlAA=uR63C9?*i`mOtZ=jk0izC5Y|_@Ze_!%937%qbYbB{Io|EA7mI}7Q3!sw0s)x22j|Z>6oVo%zvs+i_DqYzN zBznSEmJZspbkJ0}vpQWFK8HcyPKU9spjR!O>H`dVV4tbJ$)J5NaNCt7(U@5}XfuOa z#O}iIbwi2-&hC7QT_2WC*5lHg*?zW$FF7>sGP-BZLLkr*7FtsDlr)WzgGQ6u#<&Dmk zZFkwEUzHf#VzRx0anZ-K?&I!*Sn%u>eD?C0^Hkfuq)AftJgWyBPmaQs8d9lY3a0J(8+VRLPPQqLQf;PBH$q zq;S#{PzDo)#(`>l6s_+@>`_xU8rbDiY^r`sfU-A;kD{PRV_&&s+uYz zo7N+nrpUJHAu3yvL{v7FBv*{>HN-EMCdsubBC1=GL{zs5HXNzCB{j*XN%E~05fv^; z(xt*BRq0KW^tP%Zs$7ypR5?{jUs{*GG)Z5pE~3&UNkpYnN%~Xf>Q9sOx9S4buGE_( z@qIs4L;bWaewxH@)x}4Wz9b1>nol&>ft0-l(j)_|x(pymf0Bf+%_m6;X>@1#yu zJ+(bm_0;y%Q&oKg>5YQ$+Erdg+gY^f&U-Pmq;S5IsX5r7{p#xt{vbh$QIH|ZJ_<5as?AvThvFbZjqDE*q!a}i?j4Tj{==o(Nfu-{4l>-x z%P>I(qaY)_BXN+CI4>h{kda1SMhFsjE~|Q1#X(lZd07<)S=GqPDuTql%j(|Magfz< zURK9JRyXppnjmraGTJ*DFHS~dN*;}aj5hKzszr(xoBzlnM|>Qm%Yt=eNnZ z!-R-S*<02yA7{$9L-Q@IZ(HYETVe0yJEd+C=(YQZT?Zw&1akgXH26VpM(e4b%L7?# zK6FWXxmX@+i25*|xEpRCtNWsF(Dq933ud>I<%oNv!2q_79n|xh1d<$MP_5_@pJ03w^81j3QcI;z6od$|GKe()TStjdeZ?O2YTveRaWycS- zGO6PWi*;7$-U@MvAAA{n3%0hSvkvpOfN>$>Pd|2D8zU}-uz$C8i79Ch5piP;WkV5Q1lG#iHS~mLAwJQuZ)aLKC z1{-ekCn45H-N%Z9XMF4RA%9PYF%~>}>+u1P9rC+D>&I zc!ZOJ;C4MAu*&k^6Ai|EwKrpy+~5V!V>f2~xL_uHD{WvxCpeNOp2!|XD#00&#Pw>^ zpMqNQPR6Pn?kd~%?eCc^k3BoZ%?{qf!@>SczPUHsZW(pwvQ|k>S(hu;$(`@@NI9*!sbhnpyhFLb5B^Ay^y5#jMUMf6CdTKH|X!3@7yG=Xe z69+{6i3cg~iHR0VxDiNk{SdufX?-6(*W|Jkr#uxXl;@qv@$Lh*fljt|7MXOt+2gY{ zj#x&PL$b9OG%N>XYp-Zn9+R!TtzlW4t=-$ORI2O1RRY_>`PfK5KGIK!^b;ffBk}y8^Pl^Av#P0~5$-C&I_=5}jOlQF8nZ}sEEdlz%Nm(R#&CdRTi z(@34A6*pSi6e3=4W@urrvpkEq^aw=6;&+obW!i9zS5xs~sJj=^8 zChUusovyrDcDluI%d#`x!&toRbRj4xm-D!!Sa!xaU%c#eA@cFuvt`*C=X~+9(}iH! z>2lt(?2L21WZ7vn%T7U*k(Om=oRKBVP8Wn_r^`vpvNO)fl4Yk0vMipgw=6s3tSnh} zx>mxn)0J?`vNJ|($+FW0VcF>rYgu;2h%H%mx*#k&9mAnz*%>3YWZCJ0u~wi)S$4*GS+eYOL0ERWytFJk+p_G8^Ri^w>4LEA zJk$ukW!V|$g=J?;r=a~l&Bb3&pHQ-agyX1ouxqDRJBv7sU&FmD&!fADHf$nkjCov5 zMk8a}XePvAW3}QuDvHycI#ZloOcl8n!$gvH(u6gq-RTe6JXUGZht^&}l#R4(%Po#o zah~*d$0=bL;?&61--yp`Htmq??mHMt5QdUbq9?XTlujHJ#Xr<2hmJUVwGV)1GhQ1d zn(<^3=Q0<$f%3E!NWS(dd^<6LOs)JFlH8xcc1@;sPQ#p>sF>`)-jW@NMQVPGb5o>- z1xqASlbkr*WCsqG?7;qh$SBFE&VlXakB#Gw7Cl1%BIyHl)h1AoiUbNQlHr+yB~$Q- zksQ{HM7_5O8l+t$aoS^%w8Mo>uUa7bjU^U`47CahE{BGY{8D?f@@f2C{Yu1v_)ck$PaSt0pXT|`1iu?K?k2-iHSk8e5t|9Mc;4<-)OPB!yBc5nd@xg- zLZ&AF+_+LB3R~tq;5B@1RucvKrC*V zc0zzY;+Cm~%895vX8k1h`4aS-sfUq9U-JFuZie!RZCBFGX6)PJ{cq@M{1|+A8&s~mw@;#g6etP*BQ)%P4)Da>00tazZrXr>P^Da$=RkR&StSYn_?JOj@PY9d%=mu-7`VAb zH2yywfP01z5w2wB23Br_-WiJtYK=^LoZcB-u44TX1)kVR`n3fDI~+JWYcrNq8c}xj zI7|aK(nyQzS4Rmo2YwP_VdeT8p5bVW`gZq-*dG5z+^&D&Qa!OA+B*_0Q>`4ngZ}?i z4vXlbd!;v0f@vqhn9Q=AH_k!rV_=(i9ABGB?aNFmVp&I%lk*OVCqt}pb@M?yof7YN zg1M3N9?Mt0yW!oKUTt$HPNNfoGhV+?R~3hNs2Rd0N@5wu6QyYWg9J(*;Lv9nGbf(rrqtJnZd2pXL^#O$OkcH zN`*&5N-H8N2odVwL`ci=)Xau=Q8Wm^?xN7_GM0kPSu)KTOQtzv;W$9sjHR0=BKD#~ z=z)SJr=^Mv@kC?e@#3Q$v3IeO)f0LS*>`iBK!B+6&=t#@(1FO;x z4pMK^lHBJA(d)bJ2Xudc^}r*zI+lY`88?Knt<4aYZ7_&OmK2;5|*lREWGwRRlPm&F}csO)Z|`{HSV@BjJ=z7 z5O*h9@B+#&4o~Rj%3`lc|6>0q1X`58fPgyAhYc_zXP(G!z3?0FSw8unmOO44Q9xOmK~rPHfn<4I@#I zX34@ob;Z%MXqTY*g2;iZAq5vn^I|1SBz;(;H1};SH*LllYPA7;MA$)&!fp+3(WUGx z2nCl&+MLGi86|Dr=rvn}1x(s3(rZ#{1XWQP8AWy#xMN&I01esPGSHwSl@WcopLh}U z$UKo^Q@J#=!vu<8C@rd$||Q z{3rS|wO2PRnPfJ2Aw}a5>fV3|Jnb_XTmj6DTN{wIgQvZ=QQil9(g4pZ#1(MBod!^( zu0ki4WowUb_@68$?Y0M(gyn04W)0ceNlia1ou69Ok1DNtR<^cjse1^>qNpC0tv#>l z-j}RtcGZ$bbu228tK`chu&tAB&gi2&XPe|UF_CRKSyax}Ue!opf&=YuXxI+?1zTA0 z3r)!UhL3dDCXcMEKIyhO=>~%Nc zzCyU9U0Y#6?DF7KoAQWRlR@Nu!9*H*ti6M*<-Onq1e!QEX;)P&!gKOC2QEjORif#n z-Cof``d+Y&7$*H14?x=bSaWEL$ayuRogS~)G|bIcQrde;ycIl>?l>H;f|i4uISaS% z&F(1NimvFUc4kQBiJPcCdV;LM=A zii4Xt76;=UAiegK4`{u%_mQ%`yN7bCRS$<565OfLLpQxW9_##jv2l;9P2pZl zIAgdf2aepH{2 z30Bx}4YeI#+3_=>!?+xN9Jh&QM~3ho`RuM98DFsROL;?FEo5gnZ~5fu%`YpTubmJPUW-1UsjXeAmSJZsO7Du8BsZDLn+oji3GVY?|i#5Qr;>h-CL>0PWJ%DmBJh#t`wduRBdEjrDQ@^DUSDXT;lZG++2|>AMaCbp?^ub zb~?W-!_yjfKvr07aclUV+6d(q%zYz0w(k+y_m1>xqzBS@;XuK|GZ|bPma}C!F&V!W z>U=y~K-b>kfhXQhog^o8b@#Z!e}fvUD@JcYUwb==rFc*6ELvQt-@Qp1x!r?A0M`wh zzgF{mfKO~7M!5`zpT=4j(yf3vocZNl0*mB6MYt=ki>z-0kB5gv+bckl-z#2`$iKj3 z2|T?enb;S+z2I$lbFaK3!eeoKkT~Lm^hA_1`{74rc9!5CLV2a&cC^Y)m+`3hE~Ie6 zuglqr!zB>jCy%75dtFu~6Nz_N+HVCK9)+mz@J!VU%yt5{`Dd~IfFbK3rvM2r0>XQg zYbb;2X_3Q|aNq&gMkIq=9U9vok6YyQRE(L(i~zYmep`)h)ms+_yaXmS4Y}W*@efUbY zH)9e#hJwc-@;j9O#gyjS>gMQ`r(SW&;;!v8KDf_FbUCJxcwRD_tbx_7Faxm>#DHkz1g9Kri6Ms+*o zF=5Y};H}hAYNZYpy0@ST4L?8;I{a94e3dw&yWx=yc}-&Fo*GtZH}}zg-buTezn@Nz zd7zcVIVzSlEtbf5F7WxU;E|2c5XpQ7Ls*LzG5(CC}u+p^Og;RIjmQ~@|vELA|7=9ObFJs+T;S}>j{ zwgpv=!Y?*jigOFCCGVy;y$jD1$3`BTquLTwilcUiVM&wc-6au?b-XBIW1e^vjCA&E z!?Kydw&+w^|4I&{%&fkYso_ zg*7~M6LTsX+s79)-xxj9rX3aDE%NN$3}rYu!P6d#W(p-2se@Y#_DYe%L@&MCaQ6j~ zL%)rV(IZBhcN1fRqu)vObFv+Elr!r+jQy~0R==<~!Sb>tDMs^=Qhrx@jlBp%dyVHl zYu6^yieGEAj}j+C+R_QzuAVgy53iv_lyyD)Zkg1)EI;7StcvU!+%&)XkTSzo%Li5T z{^YY5?i8;4yG<4zu5Tmw$PsZK z1K-N7ujt<9);wz~`Q(UU?^tS#OGIwNN4~g)>t##x-=n)^bNjDa##X1Y{%~e2fuAkw zl9?)vUB=C!hbP`aQN_{Of16xpa$DwD9B)~7Uj!~1xOHE6*K)3Q{2`q@JL10~v-ZA- zt*uIlW6qAZhnFSJyeP3;^`W)Y5OgSh{0`R!||m@RpKfO{38PnC0O;YtKt z!*>(81GEg!=_vV(?vs~%e=@O=v@%L7N{XxVn^jK4TzTpbtnYU~H&61TS9xRNn2zHb zjpE|&n;tLe-w=G9^0sSgw0-qUFZiUWOnFQu&ZMT{=8>9BGi|i92{we)KC9$PeGP?m zWh+inD}?&<7Xx0n7yyf?J;)V{0b3UX;7i4HZWR`#=;%58JX5s@5=~O;?fxl6^^$HV zY@3u8s`2th@fPBo*xdBXngP0Ew^jnhHXG3zpPPrq{y^Ez?3+w3D8Xd-B|^-7HM|ck zQy$wiu{=2*ei2J))&Y}Dn08@DcHK)%5ca()>rOqZ3Oi{d&@Lt`e!Sv}`BVc2NFM8p=4Mdu|#S>wn^xQm7vwW;B%whH2=wBq_{JZL=we_|Vr z?Sx{VUoEDN@AYqJX&cBO&x)~;I-bV%Be*2%_o^-(9(q&br8(A5>we;zW3KYx(t>oP zXfqF1m?~ACBa1q=;`$7m;vWW9Qh%lQi=Lp$<`-qXIY}uGx$({7OE#7tBDr{Ax7P2{ z(<}%!h&BHS8jGV$tu!lt@P@4~t*;|!#3&iqQeP{ZR)jC8Psx~^e+R{0UoZ3g|Iks^ zCox(-2YWPem*^oCe2y6LI?X((&L@@Tska3g=7#{~t6W_t8;xQ9`|6r!urODA3|i%C zZ$Y{pkn$Gf5*Zc3jN-Zof$&|R!prVvNm_p_oBSoiCz6nOI}_N%0;-zcRrK6*w`O@OIdNriDZjA#{P!e%rOxxYGFdhbzpQ)hMNulykY`vhM%OICSYTY z*!*!#W|dv8hFHF15V#P=!w-m?VUWAc(uL}3rVajV#zxrg?4+*;g5g7FXY-k?2H17q zw{tUZA zo8^(^byref>BK4EeXj5>!ZyK7vdL1anP_s5V^xhLlS6TW`8Yj4N{$GYCRaH-88EBO zho_0Nvala$CBq+rhqX6mYBsNkxtifCnCI6w;0ejf9Woyvv$r6vez45N`5zIw{y3Qz z%%?f-*B$$Eq3ioM1J3_gA$YJXj%ofs1rRPwLO5y@{Fv$wz9SmYLw{75BDrY#Ctz_2 zSj@kLs;nOfOwCa-TVpc=0CPCRWiI>)Q5PTfDrdLYy#*y6{uHNK#c+^f(EC%`sr&$C zuQzvuPWUstj2D8FDKRhjJ_xCcGnb#^lHZld1k8W)-}5K-X3hCMJcKR$wii*xy9zvk zCAMw9UW%L;_rn)snM6d@0jo?3g?RWXGN$L%uEN>p0ZA(a@Gw*jk8X#DLHzIm5ZIN; zM(NWAXy_iIdhiOE8tV6$#L%&cg66s&QmM;sb8zty25=p;_N}CYd6Im13~S0J?+dALxvbr?TivrmxhAcq z8%60oUvw2br0Bc_(N*|MnT40zD_NOXz1HQ$W7eJ9?99TMb|ayWN5gr%4d>k@*vLzi z2Us;fpn@l<=x0KIh7bI0FR?Q5*rS>_90?8|5)LjOzXEpz^w%zHO@>p7!HsfmHSg}~{$9Xs=SZPW zc)5xzNA|r~nB^zf`BoRums*+122?YT8>~zR$AIW&8v{NSjL|W=S)ZeYBgoT7EWIVI zqEuG}S9#g9*(@AwM-Xd(>weIv-_~-gJ}xe|bmC>C!TPvYZ~Er*h9RRxGrd0Ecn8<& zkrD7Wcw;4bDr6@7i^Z*XFv*_(FTlZX`5@z%34Vv6xHdpuNzJ7NM@Y+}7Is^r{$<^* zyRyBhxIwAhJzgQ-v{fvqL?V8S@fOeC%&s3nwxfRXeil=nU8fWLp7`odz{$qmrxEUB zTuCO2TX-7x*Vz5~FZd?=>%Wm^Ufg%#LgJWA7OP#W>*ryNpwE)A zKYT7TkzxgwjO^-?46e5(#pIBM7jD=2dW+M3Q38=0ivq>2_kL67(%qJvb#yw-DcMy0rVl(4n)Spo> zn-l+zIvUS^Lj47`L5AeQgGvWxb1I)4H%n=*E*LfydTGn7EBvU`g%(Z^ppEzN&aMo( z9gO4k^Fc`moHvb5?dz~C_qa-_-OgOBrS3-RTkyMKJ(JrgI|@5|&gg7pRcWqY9LWzm zM)D9MBra4bqJY0UL#IQM(nJ4DO5+PIg0}ME zG^@6htH<;A3Eh!HFpQXqo(xsSkb5Isg1H?R*_^VG zP(%tUmim8NU8qJ@S;~VI=h`6l{o9G6XvD7m%vzA^gM7V%%VeVb*O}4w;O5DN*|6e& z5s#YmQtT>Bxfa?IMHJly;A9i~^25NIFZs{*_b2e_)Mlz)+4t3@l0H;ffA*H!OIx`m! zX&R4Hu=W;c87`>nIEyw%_zQSGb?F?TiDtQHYRCnPTcWwSrsRgX@jMfYzt9jhXvO`z zhNAB3dPn4$9a}HLp4~B{HEeg4hNNCFvtuH~vNtuHo$J=Ie!nz_z(^`PJpI{dn9R6H z=i<>aV@)LKyP?!D$y!H{Wi(fr+2GofT+s9e9$7RcNaoyN+ncg^PkS-kq3200stE$B z2eQt@O_rMW@c9&=ty9Gt-Ip?R{H44<=z6tamU%0y^r3d^Hs!o>oL9PrJ&CTm2+mF1 zjMs4{aos~)@tU_D;vOs`CU^#1mgtA`TA3ZX^ zu#4v+!ovyZ-fXvN{jNl`uf9)W?_(1En#bSZEhwdyBr-0Eu8Qg5A4y>i+hj|p5zM?MGxFqsE zPCE-T__IX1GdV1tq;1t!A5RNqzbbRy&UY zN8_FeK|^Z#3RbLI`yUEU;Kdrb;Z|JFideQ{69Y1T11U`K*17aB+stDQBh?<}1?qPN z$XY}ZBrSrlfJ-Xu=6mUC3aT=d)bXbI$BIBA^R&ztIoh0H^(bQXl9z3O4#H~WCMuMh zbleV*+giCz!^YHksUBehu`E+c4H8=Jpw7#R$V+d-i(14L!qqjEgGBhUTT^ikM)*yK zXL~^(!M%CCSY2m=lk!YFx&8tLqX8TMQt+nwl@^3n7Z{!X%5;UOoa)*6J9}E%ObeS5 zfZ;B)noA|?X2X*(5LZPyabBSOUgz0c(v!o^v&uw)!e=lh^*`LjBPx|5<=}v40F*_k zh7wh2Sj3tVUWRt;LqZ+`vWkn^L04iJ8i7XyjaV|E=I2)?9xmop0}xPNEOje~h06&h zbS)JlN(nmSPWip12>)eAG@)-~4tAUZl0 z6fC;xNin?tiEZ$MV)%aT@V#RA)7s&M;5&`N%2>zB?GhK`$C8O4(1~dMO(6Oi(F60C z@EoDCkq`2lIZC1Sd;-nq>B}#7#vO|_sN$_ZnBY4xXqIpib2!CkaK@i!Ux`>E zl9&^I&!lJ>kW}}{@FkS}u6%|Q0`6E`la-lteHM5+Ug~ob%UJl%^cc%o)DAx(jvAP>PK6!w^)TpBOjYd5a=# zZdoV*8v46BnA(hlDIlVTfY9>(9z12NMO&c{Tr74qef@d*`oWTA^Ks*P!E9Zlkz; zUTzvt!Pt_q-Y+weftWSGYOo4UR`h2?%?NS7@Udi?*(2Kp`O0z0ff@Esj+Gx^)@u<) zhhU+(0_}8$bo7f-uv%vfQ(XiXQ0vvGCE2Eh6DNzREY4FRvClqER!se&_`F{b4Lgi2 zzGz_AQ6zt2Ul)1QD=zZ}TvzCagp6utX~I#10cY*kbE&@lT&C3)gG0y>5^kouv$d9m zi9Mpa)+odljExHtWKsT#)}_Z3NZi7o(sOgd@IevJfM>dOUXmOzTctMiBnEElx0xIs zq)NA`0AbaRuSEYMWuSfHtt2#o6zLoY24(ubQZhPxFcO>r%%L*&vc5zjd=W@SSy|bd zmHyyReC}F9{;Wkjj?|+Sl{$IXI4lLk?h=-YAEgrQnXFFC9G_Stx)Xk{2EY5Pj;zV4 z9cTw6ZU_vD-=euiBJItw*3C2gVt6gC99Ni?W+U>vmNJD*sjl2+xDAP8M&D5p8NS=E zCf%S6!FFdeR%p5q1j6I^tY+sNm1y?QR6{h+cuL}+t6hKmXV2zVlO9qW3$Vab6J`?f z220ijbS3FLL{k1L&{E|!QE=#_*y2;01&$2ljpb2)I0lZinaRx7F(O>i<*~uAhhUC2 z_5nAVU~h|u1@#rF@LW0yDqEJMZwJl`8RiPMq761{i)=W!P}+gT^3eRAM7d3KJGI}v z6#wOoCHIRJ1+&OxD%?b&)?XxVS9=T6Cx*y?4Bmpgg=dO>`s*^c9KU&qJf!L`6_m-W zthV+u1HC}17}N-8c}gXer;PHHN{1x~IbSUz`j!sn@q$!V3LdnBBTDyE>zk5^Erj`! z(RZt)U5t1ENm z(`N`Rlqb>|=I{l(jW;!YE3DB>MS?nNn^%$Um!oux-N`<`$Rmjt_HsMUKbZbxd-|jP zWG>~R=w z_zd0}Nb=|)g+V3e2c{mEojfo%u}pWnQiu698(xdgjJs&-ke6eopI5))UhUI?$U|h? z8;V&|y@-97(|H!%m0BiCsdZQ98pW*?`qJ6SLweH#QwMP8{?kh{MHa_a8)*(zT78Ta zd#bCN&{+pf0rhi}$=*~?1Ghy5aA=i{oe0(SJ#BdUEqA(%gQ{JnSsAYVmJUG#KSdr` z#*Hy|O-%Q1eK(bEW^Z+HI{oA9j*7v&9n7!&MBpV7U!nZGh4T;O1UPA6`jn-Fb1+ zuh>P`Hhzh|rP&LvkY41Zrk|V6X8F!t-(dJc>#k98RBLh2>yY(3EiS~;+;|@)NkfVX=P(+t%Sd)=Elg(R zb4zb_OAOvJXQu16oI1PN3L$cEB}|qmvB@{N%=Km`uQr;gLNi}|M4GupG&9hbP8RE| z6jMnnw7Q4@(m&YG4W4?PHUf<{#uwzJG&|mxG0(l39GSQ!xo|q*T=AxAR{ljf;z8xI z(;u&%za(hZ1_tU4)Q#mSX+H$?=%KCP?yfvD!=dY`MS z&Xb1P;PfjwpjH>LMS#eQ@g> zmig;%N%|!V9r?VzkEkQhDkarp!OE+*kfSITIdwZH`uJNcXI7vbex_KBid-(E65J8x zI<+HMLwAAf)=jQJEkJ3u*S}!Aujl689*W1%?)Bjt_W3P1s)7a&)(sd-P+8_sVY9=+ zUVjVI;O8;6aqF|A&|tv^L-jSxPZM8*ZptgJQR9SDS?aF#`Pod0#&g|l>Ff)}3pd-y zMBnjqDCGdpYW_M6b}T=zfOAXZpoZg?-pi#g0TSQ-1&&OT>+d!G!5Ve>q*-MCU)ppg z3kT~3S1@roJD;SSS9BHE{ipAs8gL%vN2jWewV`MVaEhBMiMds!u(zr-_Ev?p<1bDl zjysMsjw_DCC$toKG?hh{%0()VE>(yWd}X_=rUzZ>U;PO`;imNUThY5RkFYQB*NLyBgp-1dj3fegk|b;Kp3r)+p=9;@34Na#txGtfijMt%SqCc}?I41U(R0 z%|v-w^p3&9OxNRg4E&>YVG%{c`vyhK@jC`1W6gIA)&P&+F_^*}zhiJ9=J*|hqcOX8 z4906`U>=R)>?NLZF0womhjKo$TrNu?vb;o=?#ObzEInr7Q3T;1Wg`Rcgxbqb9PVW2 zL|Olgs=}z1T!NQ)5;1&ZY1vKem$A}tHze+psi`=eWjIq)c{ocCkD?uosWSN#_AhK+fC8pE=$Y6alw37SjQ#vmOPfYXwENSiOc3M@)j4)337=`=O=P0M;II`m$At5Il1f+S#gZRZu0_2PbsY+3mM%rrg^9YB0Y)R^aAkz&NW78CaAoW_v~0i@|6lBj zunmwuoB3B}{*#%1Y35n`&gok_@0fV!G3H9tykH-eAnfV9pAHlz+TGGh^$)o2bU{$@ z)C87p_MbXkhp=R~z1`9jTnMurCO#TYiedupym7gc0c;I-&g3kRd#U;W^FA@s775!6 zjYv3wc#{xbM=!z7qT&P8{p1)_+ltZoj~Ua(T!m$5=#!3kX#Yrh+Z&NL(n}oMNblJg zA1yuY7AG{$_RfD-!{-OVI{34g%llFQ@Xp^%M_s6{+$x7m_&xkYu*~EyRKgzxZf8K> zOg#T?<@6yyVTIuC+IuSNBS2Wzy_%wCCtL2pH7(|ATg?uiglG!CVV3$IpJmUaS>gyxQJpof?VRt?M=MZUA5!AUlVVufmInR zrPVWi>M$^(si}elI}gbPxtXpcIm1;s0)QOIX_;l!n$AUs@$q$Br28dl!`lL z$OX|W6TuF02wQxd5~fn~)1Rd(Xj|!ox*Q(Z0VD9x4W^_|N!nV6(ZS-baE2jl!X3d_aTiYvVQ$?Qm3 zk$fw<<2s%A5n=y>u&nHZSCIf6dt`9r1A8=ebfLO2jw))0t8{08OJzJF^gngQ=;GuG z*lz5%>g#hD^rcSjMc}}2ct`5!?rcxBfSAdCl#B7;GVA_pX^HROvBaCu*4k-8hm3e! z?Fb41YMy!-`8{6wE!ID*&g1C_EXZJ7eVvVe4TUhlF6isfClB?50Zo&!--Nxo)-Uff zg}C~jQ)$0^=1dO%Hwa$B@LC1HfhKK<&-(aG{&Q-x%C?UbJ^Pa=j@ zs$7%|eoAjSxjb3kdx|S{Hch3I<*6Aq?@G`~DzTD*9Yz~tpY`A^xccR_GsqqY`4XpQ z6fjk&k}#RGDVbrd2;3m7i6$42=OcpGC9*06ZcYBOk;|v#`Nprf>7{l z1IsbG2w+)TVQQDGJ3BD5q6M$gTz55>br)97vKi4#kYj%eeQYbTRtVkMm%N;KdyftP&fmoP^1p+}LGy6i0ue+HpT+a12#4Dm#T zkljK!2Mf{eaDOud%a^XY>=wc~Scs;>(NVr?H}Y_I@NOzaf~Rj$mz1o3K|!0=FUpFv zc8eFUW&mIg0>nP$u!w!Cn+c6hzn;0_|*HQdK;vg&z~*EPM~T<~6?lisevt_0B@O0<)2 zWMWo$xH!_7Gkd|EcYlFYd`CmuYhYfNU%@Ag9fvGpG!+==1&Pmvby5ry}lJL*QB?SohI$nKo7lajb_`B;svc@SN)WHOWkO}y4Jr}1s>HT^*3 zH|1dqJW^-9oPmuWL_)9x2;1K;fXh|q!YDZEN?WVbw{>E?L1g~zMD+00d1a5aw$jQ!_zH!fTv*yPn9k04~37X zOtgJGaFAFc5h~!IDwyl_CGO$SYeAqiH^T-ryN~pd!itUT#>-4Aa}N)|gz;A9xXbq( zBB`tKtjuwx{#_JG{Tq>OWo|)6tF*cLH!-ruA3gzWdO2R9)MpE%?CPL5ec8JkN^u88X1vQe6w{uack0!LFVSWo&DB0@Im`O>X_X;@S&4T}m!ENqjH zqC;1^r62yP124onGPACOHpAibQy{o4WP3ljj{uUTOqz_-&&kWyi-0G?qbO~GC29FjiSs5ui__}IwR35WHNwfy;&AH} zPM;;|9nuIV=f&ZUR5*Q>)lgUae;k)3dHbru=(8lPT>y7aLBCSCKX(e(eLOCse3ry`uw0(VX9*Thlgl$Y zg}GcVFYDy86QILSeioPE`ybKuOONRKpO5JJ-?-NFS&~2R1YB0|S>jTW%YL0)o(Rz8 zLVgzK;>1UEJrmcOK1ESlAEQ41ne_SdPnPLfm}=({rXf21Zw!is z>SMRc4|meMoG~R6y=i}}1_XtO;X~o?aSo1CtJJny#@@x8ytiF?+VP$DNgQ^8lbzOB zCVm`y>AhPuE=I>{EXhgEVSSm=r*SC8pkDYC($ML=$a*|h<;}(2omf8N#A$XLx6oc1 zx1e5lg2i2`Sl+zw#NEUlZ^^KB(~!={ukn|)+a+j~Ln3H#OT8vLOE=T^<7@*FZmG`; zszaS7z2leWVv9BHf}rQZgJa!Oin0 zQ4=bgzI9!RW#|v7-oI`$hVYwcoY8PevnaJBid=QdRJ(Gt$*6DHb}7jgw_PTDFZb90 z(?u{{rTTLLu=DgBX~p`p<$MTp5qAE43PE6wQAYNn^OkbnC<}8QcH3vm%6-hK78Jww zd{?4NWo6M#-7l-%)x%Nc1trLHG}?Bp)U*?;xs$sW_Lt--eVKeuX4ApR6mZo~-zqzg zcMc@|i=xoU;cC}V_!-H$i%d2r6*Q-m&`I%-mXtrW$s^^M|iAvB-?#Cd zC4Yn0ybJ=DAYajP&ugY7D+~!@ygV~eLPIHj8k{_%rV_Tc1B5&Iz0IH^9VW#ev)issjnq(HNZ<&UcwI)wr zrrfD*sB>1^ke#-XPx@O1n+@U!`U=+|{+yoZF3mqAT86LX8Oifnt=*VEWwSx7H7zdlA=+_pJqHmZ4n9jwM8W8*A|hWUt2_ier*v6`n5$Q=+_pJpkEUSwopEg zIk%G_h#7^cmZFkrCqdpgH4hCE^lMEL^lMEL^lOVr&^HpSypX=TE~*=o>{0y+8G|`$ z5%^0*Zj5VxqMA9@eyX6U@DI>$<#0|M1%DPi6?DV+6Cf2(uD+M9zfj?BTLg&HS(d7A zYfq2Ur_Hd2OYCP^+99;ecd1^7$Mmvn@K>dSC+9gAdCEIaw1umLfS93XsBrWIfW|W1 zkOXpWW&rRK0W@UoDF$ZInE`+*%>ZTq@O%NRt-1R#exs|#nntC z7%1VqsCd|>TQN25n-I<15jor#!xCdCi3_b+q%GCIkxqQ4m>I6?=BAE5-3SxSE1kM562W@+vS74F9( z^;z^*CHPlRmDbu2x0Y#ZVk7E3i`0n`+_y41=oYLMZ*|?;i&tJ283toOJ~ph34Tady z7aO``L;n)P@(3~->8m1rB=*@G8&<@Ip4d=|4LN5J9X_3+`HiD{VeHy@-alfHYz&~j zh=NmZ>R$8{P?GJC`MD^u!>&NR7WEF4{2ze|Q3`)9iheoqM$}y>xsON6PSSZ+Y(@wh zK7oU05^2tUhuI(I>+Czt{(De%_UmLXIWzpbgvWJaBBko{J?_miQ_bVTFEd@>4Lido zZ^Rj%<_$W-v7Sk+ImroT_V7%A%~|^C2rcpg&=}1n^c?pw`+@j> zS({(l@VaQHf?l?T4u_Y^%enA029g*`ks7qO4NCsI*zX@~1%{^+EOCWbv=h0gj|pBx_MWY^A9rs zYGtT#%?2zxVZXP!={@6tn{N4KINQKr2CZ$p#@faUzrjFGCuzFtBzak=;_Nm`a2

zn&sNf4Y!x6cKRbXS&WN5d}_nP24Is>%$L1azEkCmTPi$CR5?3!Kb@AFqT1U@4E>u_ z%Id?9gN}Yn87yn@v~fMa`>8i~TWdLg4OG{~qoK{yn>^!wzm_dF@7UV=Ij^=Z@^)SFS~ zp?-=gqF#e~8tR*<{ZMzIo{jngY8mQU)N!aUp{7vpL|ugX6>1c93+fEiF4Q5YkD|7s z9!7Pcu0S1zx(Brf>P@J#P(MWVqIRH8Kz#+Z9`zp7C8+;Gd*a2YBT%10jiYWwos0SjY5?_W)KgL4Ks^@qKGbEX z-=lg^*PxC?-G`b)y#w_u)Gtx1Q8%NWj`|PO<4_+#)lq*%^^t?Vu3X|(=&wRQ3H>DW zuc3bpeFl97{Z8~d(dW_U(SL{jJM;p20sZCZFGoKH{TTEwpnn0qie5#(9sPFn3(+q` z{{{Ll&_~cm&~HS)5&bmu)6l<*{$2Eg&<{fY5c-GE7tj~b|APJ(^bC3i{iWzHML!Dt zDD=;ue+GRY^nK9Zg8mlt^U=>o{~7wv&`ang^w*-l7X1|TQ_#PK{w?(V(f3Ec8~twd z=b%3a{g3E>L|=}+9Q_sOuRwna`cu%qjQ(ZxwdiZn--Z4z^bkEn|26ur(aY#%^f#ct z0euttCiL&4e;@r&^h41uFBWetFCTa!hc+@)7#i%UmiKqZ| z0csF6i`syCE-Hn30%~v6Gf@4glTnXBU5ZK)!x=_8S9BK%qzX4PaYBef}>O&P!Bd83j zgwoyLSCP7Y?wr@F=?}*?(h=Js-|_o@#8C`)xa&2zln;);KW>0u3wW#Cw!WRs=CLk@ zqpgahynKE={r0xk$;mvu1NUNiGV5ZxldGDFY;( zok@nQm0@@IVOhCfj465D{v8G;Efy`@)cvx?j47RksgO_cg4Uz|o-rhSnS6*h#U6w4 zreudVl}q}gP1Y2=`G__32V+gasPVU-!FXk?sg=pm@RO|C<{#4l$DFB)2-pISIa8xC zXG*xdloA84MSLk?+rpQ!oIW~l>Q_zv(-Pj)vXdGy{{J;^s)Y&r{|nyKbpiW8`T2|a zY}*M*IV<}r`ECCu>+MuBH|jeu+ba3`{{!p=Y<}duko^i>c^T*eNVq#}T;z43qrB8A zssJ_@^2P??LPvungSRNg*wcn3o&;Is>FC(gtt=xvq#J93B)7}f9$hW=d8ww%N>h+U z(Y+-0bgQOXf^_ov(Iq|w>E!cEvCjsIf-FMuzhh4g6b0!N-O7`r zQnoD^Wk!&s?e4T^W>vdS?dNQwUx3xvn;g6GlVgd1og!wb$*IQ;jMy}rhmUFp6KW?{ zJ6nW1GlR947+}bc0K>Jn^~y)E27b1?e5$6DoO?S4-)YAHTm|WbYyPQGt{R0T$f80T zUgAlRMV=;NPmPikq_rg3Ce)*7b8MAm{Nx69UEa1X^k8)*u%D7xXN#gq_}_2EETa~e0gElYg9W;Z@RvBak! zo#Omy!>8>lQn!M1s@oN(EXGriPH}Er;!}`LKF?UAjakWTgf z=_Nh|>E!cQ4WBV33(_g|hZ{cQ)CK7j=bm$MdB#2k>E!dshR-;4K{};=LF}{9ECpHA zEMF9RYIHz?bc*invCl?yf-H(|*Ah>HEb^ot%!b}u)qiPFus*G&H@k>qJ9K&`B|3p{ zhqKPJ@1N)P>EOn8H(8zA8E$ajs;NRUJRa|sPNl}^e;dA1lN{j+*(c?ScI`OXU~h6T zPh+fsfsP!qCJkFPxd_>7&4&wo3e~+=b_K97^~AVl559TuL-vL83vZTRHiYu{fpM3g z{F*!exJN^3oC&3qM=2)OAH_0(pT@T%(bG!PA=iR+oJ_cl_||Z!$xwczv=LH?qFGV| zsqhM70f!NIjBg>$|IwH_!CjlL7ca;iO||QN3tsp_yoOiu>8YNP3wPncsvDvGV^**w z9~{UyI`M>TZN;e#+kSrV9{kk?0S(#6Y@!Jni6vzD40_q{MZ}0PWP2vR#tuUia^VlK zOy01oKX;i=0ZC+GLbCnW0{&inIMtQgo{25nZM(?I?d9a5yJNZO8bnvU{rQwl>?ZcN zs!BGiidi7s$T6=Kek)a&vWzB!w?ZfR>Y$fe>>+rYTwL)YB&-@opgnjoy1PesEW#_9 zDg|sf@X%b}n&9^$yL9kDGUX0k_|cmJaH$K4z7HwqtUJWw7cHck{K=VTx-GhiXC&=v zy{14r+vQUfc64QfU)wLXOk~`Az2et4#<0mAzjkD7naH@!=1TBK@Ja@s6I!s4^Ow^a zREq(8V#gnJcP9#`WJ}6Mq`s57>JHef=Jrmyto-GXgW6n8vq2~1UKpsIsI)(W$5tPo zZXkq@Z^k~LQI*B9l*OM&_kJdT(F0xV;xhN^DfXqRy_^iWp^ypQPLxpCtcWegGps*v zdao(^^4xqcJ?=Wi(aafV&h}-wI&Z^GAfOxaT#Q2cva`tE z1Sb;A5Wb82^yRq&u(~gI=@oA1OIs|h2N_I!-o@(f@asixp0vMQJ&0I7E4rRGs^#)m z_^zB;Fktu!%ns75uHqIQ3_t!w0b$+&AHR%1V)j2TR7ljDGl5;@}v} z59M<`Xoo+>#9^xaVE?!TS{)z4u{#1>wl}^7U^nEoik71)ybHl@MLzr$A83Q)f(g!5 zSZ{lqsf z-9+>;B68t$z1v-?ec12NNG+ohQQWSZ=>y5yc%zhT;nByjA7NY!5wOeG7TQA8u36-n zUYuxu7b9oUsx`U746Yz=p+rXTv}rU-+X+=E1CxUmyy0RJN+DYW!u4aj_1|y_j-r6W z6)yfC@790A#ra<;|LL%RW_N&0EsJg1SD(Q~sl5-^a5W!SmH2o9bg_oI`vHg_xB(%q zT?4(*c*Zdo#=SE)w>GtQ4@(*VHv=zpXLKo!2Sv)MDl$!$zqKj>EfNV z&>CDk8S>tu>asoo!M^H>43d09x+gk6nKikx!Rd#xgELH@#DFnThL(^v5^A9rGj<48Q_3|)O2rmUl~vz+7zH(f#iEpR$) zJ6_e7;Yvu|OY6?FMhNI4&hkDt)1j63a-9daD>8o2UA@;l;1Ltm*pqGqRbisCJX}OLED{ch%uA{bWG(LS~V9cTQ{tHYSc-h)eNKc*#oS>ioE`6Q^VY zIKQH+)^$3f*A_t(GI%!*?yT;WE;&nY0Dm3QTh^N1WHUX7O)gn7N?6g=>TQC@i`@}< zu1I*2q0xq=;TL7fVVQJimY6rdyJwy-zaOEPoamMYn^1;~BKb9b?T3h{)%FL~7@+$+ zYL9OL=!$~cQ7r&nV^BMx1#lYX+NKu3g#v^vfaeKNZvm*Quf4PZu)fqyEUg!<)RMMw zo2u=QAN7E@Y7^P|rpg($+kr0cvN11U9CTgpZsD#CQv!70l*MHlv+_wdfKB!J-oySq zbR6>)>-_js+ChloYUiFc2`N>kw!W32H00ATGvXogX>c#RO_pJ^s17ph$#DA?br5`t zL`J>jpiRUz3g@>!159@Mr2)6^?1#4#I2pWMQ7jER{P%=?N9VAEe^1zVD(oSKr?#jK zo66y}yD9AXcj2~8IoFQ0?NrCQ=7lpVTFQ3oNAb}g+<|8vrn#4Z_n$`=ZEGRC6X^VV z`Q-g=@@JkYs*kx?x0(L5;693}Hu7|Yc?AgHM}SHM-M=GrQ%C5lIzr#q5&GSZ(DWId zaM+_G^r()|=XHd>x+C-h9ihMM2p!tg3A2MbLeK38y{aSh_KwhRcZ8j=H7BlJBTq2KKY?K-xe@~=t&)+S9FAatRwXI9igkw?}Wn<9ih+a2z_-& z=tnw2f6@`!b3rE@_U#BgsU!5&9ii{*2>o(L=mQ<0>CK%m+p8n=n2ykMJ3_DM2;I>U zdT&SQFFQgH*wP8#xsK2)Izn&n2>o0~=P32_2#H9icaOgnpqT^iLh3 z`#iG~X6JN-zM>=aa~+|7?FcPBt5a%^?+CrDBlHa&q4#!#{PLkRgEv}VFaYuh5#SG5m`@92@r5r0!mD8QPXUVK zJ^EjdHx<6jA}+az&+`_9Mlt!-o5;8sOCbWZd1Ht@5wA*Hva`$KAF!j+o942(z5h6@L9!22j?K1Gbnw ztAp@rFyft@HrR^<WK>;SYewgK6HC@|7tG<2sINuAu!PVVw0pA0j-GVD^VZ$j_ zs~K07N`1~sAqx4Rygcr4a0DWNd>k+-ZYKL4Y2+p)RVE&#RrNoXL0+y=sNpDYoGNiv zm#q?~TmFfxEzV7G{oem@ey0}YcU1Op1(j{jpFtSfKhdF)?1PCUhDgV`h7?Y?1kun0c{DaN;S@X7*83{5Z3Ro29U8h?Ao7Xf+kG^3~h2s(_49)mL$|;RZsM zrZ^xFJ?RZpc#=Dx%=+0KHyLLwm6@IXjjmHMzMaFE5@xqVN%QP$>(0WvB-sQxdBJTMQ0zuwC8GcAkq?@!2u~xV6!#G7AB%7@h z5N+4m}1Qfc0TzFTLB zEr5!7wy-usPn|RdQN(R`eg=!hRPf&l_c=mH6wveoy;As0QB81#GOhkt`>*;XCr)&p zT=ZPWWY^s(SnzuyTH~36#n*~Q>`|Bnbo3360zeZ3^>1K6`=&J4rE`~>9G}J=TIf(v zaIqnENrOI;$eFWeLHRpB2fPxiGZw`TrA8*Xj8DPCUt*>0n3*w1?Lg+?Yc|vDI1<1; zL|8cz;4R!|2CmHek{P(x?#pHn8@D%;yWn>ImpN*@&E2Q@aWf*OTFD4u#BOPhQ5#V;32;I9}ft2VI0g zKM+HQ1ID8K{ALj8@h$hTKfi&iqkwGEJ#1GDw^GMAjb9u)dAV>4p#sJNZhZowUHRMu z8w}Utk#3{WZwwA5CicYYAsK(z-R_PE@yYL2omgLP7>SMOEhwJtSL53rC8qt>=19=8 zI`*PNIA-6#)(Q>xb7OZaqq-^u=oRfy)fvzm+o7s1pm(=JRhvM+(he07xVm>FQpuOB zlPguGYJbG5d%JL|cGe}a8P*_eKb1I=4m)FYD%#~_|69qP9;AYnjD*;LbOg7vH&d{i z9J)7%Ih?iY95Q}D7n|?NhTnp>m>Z)vOUx8%UsgKo@#HVh>EmF2Aa*4%fdXZ9$d;Y79teXAYi7^>VRaGm!S` zg3o}Wx1byt~$h_%prQDa!Suyi!R_8+PO)sqg7vI1XR|zWOTvX5|K0#66E_|(~d`H4o zf{e9|V(-hX%vlKzQ+Qmw)^O@G=9g0TAG#7q>3Y(v|U`4&4(x}rRkTn6eB0ZC;-(_~IfCZIM8uA$2_BQ zwECTXpjeQTaNv2&;?25#KT{r^eu&8|a3!4;+@`YSzUhZtG-C;tgQc52uQ=XQKO0Xu zdp=V3zEu4j0KKXDCN!;eQk?BeaHdQBq39@eeLht>yHGuiuJBasYxm~*csY>x^^pl( z~>3Lg_j}nDC+e$MehDBx}}6?Aw9hfIjw!t$UM`X zPVPvjc0BA!L|-??Yn(_YICGH5F~1lnBum#xc5QWEdKgKX$^6*WWT!7Z#5h1_I! zGpE&++1yNamF2qXyP~k>m^!3SGY(f~myt8$(>N+|6mO5y2Ct`V=pn5;SP-4JfESF; z!^`QP$}1(kX_#$&7mdWX8jUV*rB!mNe6rup@&HP)REbd+2L9DW^IEfz-F?; zA!!Hb=0<{@N}ApzGNp&-h7CrmSPe=lh1Rr&%+WHJp8h@_)NXhnGq|al1!6O+`N`#G^o1l#JR)S|5+ zZjzCQgq_8564B?YNmKoho_AK4Szh7Ktv@AMppw;*euZAcz%Zp;;IEu{f$L(Ohu{su zCZocZzd6Gy@-c28uFIL5weGkQM@r|mn@FP|k$-U0czr6me%_#~AQ;r9-y1@+m3r_RO&PWRctmFJpa zXGbniZ-kpo0Ufs}s71w;oMfe;=0ltvx|!-3c-LTocWE>-WWX)JRy{+Q+F^O0{r}i| z6Y#i-D{c7pc3a(Atd^|SVxw+sY`3-9k_=wJ*s>(s0$DOzY>6edEVXSJS#5VqHpY?J zk^qiL0WLm+G+O!hq?giIEakPxykWQYTSKoXL`kjXLxod11K)$Oj9Wk}|k|NrKH zp0A~Q@2RR&Ri{p!I|wQ(}2lpC`&vCrv9DBPq==OU=N~$jw4*IXpcLy9Mst~a)4&a<+oFrWAKk!MEFmSj( z*Nsicwc>-K6`mrhQWwGoCyIUGQz{BpX>=5*E0$=5ENDw^Dl0csFvbZtIASO59t&zB zcVTQ7&lNL7)&r9p`tn5Up3?9V7SaswT=9-xj+hNEP8CD)Ymq zI2}|`->_X>geQNxH5N9`&<#{I>a3v@s*p{#vY}4nXl<^`Arbjy}u6k#CsT>df3D7E=4Db!s9Hp9tbn~>jMr1f#cw}bRoXx z`WGfA&RQQ1)Wdv897}H`W9R7RMC?9i_$=dQp^Q783I;Y2lBd6+T9fAQpAbC1jurce z+r9;b3L8mpQz9H<6D|B4Iw-UKHzX2)693U3hTsW|SM99Em-so()TWmSBZ;*-%W zZlAKs)Jm6DAomNCI2L5vrLGL4?NW(^>!EciTxE?|2ERu#meIb9VcaslaVt1>D?$-X z1}%N3^rdwNN6qDFk6gdKFzAQbymtnU$_jcb`s{_%JSBCx{K_u&QKV6QvERmSrDd8< zBqZY+wO;@?1&G~EtX6l$Bn)E|#v_i>W3SRa4C-UIk$BbClkxkdw#LoTaQ}A9JNxGZYadl%5`X!L@x|*+<3sG3cpoOTBH3I)kVPQ6RLgew zLiY6q67L1?x%NRP7CQJ)tSxV7N2Mt)k>$E`m{>s!_kMZoZ-#^K*G$B8KQiFnzY5`- zR20cUYG47zHfidX6?0=#Rrgqb!M-Z$EE*D`uxFb(L3w2#!@)T1}yjuA2eMG4RyF9yrZr`x$J&5x>NO`1aBcktP`=zaG)kk z_C5j5t2zFD&h*Pyj6;M$ztTaJImo?)^v6C7TyEy9s)wFhoe6?_KNlsIKPGZbl=2l{ zBRoe!OZ!zWN`NsAk__Ig2LE5?Q<|Ffd8eu_zH_5tNKsl-RF7a4a-ajq-c;))P zL-tW2td|L{Tmh!^POK(eCRJ?L>~ZgxFcH-S+ux*>w7*#^nX#}|1(()g>4906W0YmK znJBjAv9JWLGFG{kufTT2V3dfC(6M}xcqs8=)%KP5=jp~*igriZ@gT|NlbatsOZ(Fj zL1$UND!C&cSh8Z$ft-c^M>P`Klp>Z(W`siCWqmS~QLBoYM-J6Ovw!LSsik^IN%elN zN7nRax0%v@-94yQO zT#bTZ9MD&CS@EQS_r6)+!8ZwP#ETo@zzG>PZa8VkStkvdb<&U=e<)`~1oAHx5z6uR z_veRl#L=G%BeeQze7{H46)5%wuy}g5PU$2S#UX+xcwK7TDniUx8g#&ljm4 zw|b9hPb>mG+)!~TpIG7HlLNR3N;UK!A84MGT6cl(l)i~3LO|qG5IMjFqIyFz!2upz z3@wK=mtQc!A)!tPZ)-kc;Vlj;S9__KG%~nSX($gFft42cX7))QZ&MNYsL*N18j)J? zs5pOu6G)^;gt7}JWL>FTInSTCh+*CdPNLie_5?>9VXYlEXeTIA&Ufb9YQno@4 zc|74AbAs|#&z4tWn)RNt33RZ0`N73SJR11ePadK&;1+Hwk6Le}s@fgdJ+T0x9*?}I z3-6d74kt2i=E4(;nLz9aXmH04P zpFSb1m_8vqn?51DoUVB6#KOEY@`m~b?CVHb$&(f&NJu^A50WJ61lz23S(htXLnY)9Dt;CnKk)FEn(?@jTEn#_}ZSlhv& z1ZkFum@Bq>_VYccH|)!>9?SaR2^48YdDml#nQ;Yuc7HApaHXt<^;=V04V7)Rtf9mH zfq77=#>tvyU?J)vi0oAJrks-vxLLQ*`foA+$l0#mo!RC6^&jM6jpWm3ATam{IOMHZ z2v#f*_Q(tWno~XU;us4Q@}9XCd`OE}<8*IDU7_bd6*8{4RbB&AeW(=@?SG2){~H!Q zCe*x=VvT+Om3S*5tXg?9BoAw|)G(F(6VGUQO|IxY;?jsq|qf#Zch_25Y#eS}6>-c6pgl&_rK|g}; z%aV&%<8uI!#N&38+@4Hj@b}=|{9mUZ(aqZo7coLiV0nmjQyA*!X$Kcm z(;@ht%fg!>Njg#}$(8cEc9tFIyTl$vVIwQ#yCYwVbkhPRgj!eQ8(Qk z`!{%F{1tl&Pv^6iWjKuhDY|2i!}9`ik98pXz&`*AV0VHSP7^F2_(+m*ZUOFU8@ClW zz98*D$ysBG&8V-$Rj|d!hFp*mct$U8A%%PA;pQMFzi4dpP~IG z(!Mv0fojGNr#|su^o++H@W}Jm6k+^%fTeyM;#=b_4OWN!wZ%C#g%|^-{n10hQfiJ< z=w!(lzG7cXdB2KGC{f~Dp`=@Cr?$%@a?+UZj#4V5NY%?dQS5VN(Gx2$+B4=6A)+Tm zMqw6vqS(C&pN6}m`0!DAn$+)S5iy~8hIJw066Fh+#(D18)9{L%)`+FLOksI$PA$@k zVu&LdD9*`iiVT({TI*3Mft)@k=jt+#l0hH7)g?{+PKYDMjUkM)C8dmrD6*Ic$Pyuq z6rM;HnnH#w7=^@s4*ETbAF?{|DXn%s0jJ1x8%jw#g9B&cofT^MGE@LhT<25mg!Li= z?BuDaBekTMhW@UP^HK|UV={;-68uBA5}&E<0WsS+pl&m zFUmPy5~Vxm5FbqWlPKIF4BUW>)7o(!kvkMP#79+8@Oa5Ix`T)KsNyN=d+E+S#0Mic zGBUcf99glnYygbXGJkaB5ZqloJ0HukMJE-awh zVM(J46K?5Q)bIzz38InvPwICYicX)>_tqe*Vz^zlZuV1~ZW$dZYKz;oi@O?C3UegdV<$ z_bPw7WD~iG8|YE8W8!)~y%X=pgB_joWCC;_<`cGx=PM8cQ}IgpVS0uc&SY;}d81X6 zD)y(d-20iuFh>*#jEcGU9iaCEO8l4_i2HTA%Bu6AC!WlYbt#~D}?vhU`TM83?nP>n*cHRTt1VliZ# z>#Oy_Ru7h|Uf+9$7x=iQo16R!6WT_5D|i-QakmeirQ`6NLr*WPRi}9wZE-R0;T>n> zCa+?!#Gx1B?C4t*5U_u^(C7CKBkclT>=Yz`u&Nui@Z~_tytiWaKk3$LL8DLYUUf}& z?L0*%+q;`D)1;3>Jz`r`bY|hixA8>X`EdS;3Oj*k3e|^CY7;Ag{LdFS2#W@Z*^rz3 zMY^oYufT`z;3TxrXX}zCeg=wJQlWV<=)!)SPMgS0uGj;1ah}Re*RrZtHA-}Lw&zyt zF$oE>4bggoqJ=3zsfgy?qHHq){_o@xWw;CZm5JObM945vYXY`J;pgv)d)RCAF$#um zRaoA$6Fb>=PlISev)Z-xfiID}a6XYuii?5^QdBFsTl9Q}l&7V_NJ|Z9L5GU=l%|Ea zY)^c$4O}g4AW@49Vn1iZOghK1(!pA*nGX97ro$)G*<+;hi|lls(doEx_RN2?E))x6 zCaW%%k>lfwFoICWggj0*E6`5h%SWT`63+?=GH)kOW@MLz{UXc4C(CjVBio86cd-UC zJo#n1EZsX~|u@oYI5t)|2tgSMTKizbS3r{AA? zo`JEmAz!L@&1Cm0hiN0lTW7kq?6_+veTrq z>ZiK%dh3Qt1?IU`CPOf`kS-5r07@fg5fvRg&DeHMnuR+KbK`{#l1$;+q} z-UqFKhJQUC$(!JjIoB<51N`Rdpa&V0=0{c#TJgz(9zA)imrfq!+lvHmaQKv!SLvGv zC19t8%>+slzs6HjKATave5$s;GYi#x@}Pl}2VHjZpu5S6swwljjj^UK6gO8q32#4j z@>t(GdC;>b5Bkf=gGw(sDTVbX55he4WaVm}B35Z$IDg5Dn1>iWa^Titba&^XiOPn) zl){i#P53e34PvWQN?*>L(!RXRLLz)Ac-Z;$-_hP{@%CC~wbj!!fB;#9F=BWV-vcT( zN%bbaPXNZgC3Vx05XCfPZR{<2#klzgO$;sI;(5Hr1xIWn(6Nz%6$jHto z=U>BLR*DKWUGnPZxEtS2%Yijc5)==h{)9Chy;Kd2QcwysnsWCY?8{1~*2b8{9 zk&o{I%-)G(DU2Pwvd_?|*}7B4k~NdYl7_rM0dhLy52H6p+{%Ph$0cjU83i3Hqt4}+ zpbR>HR#qN&N3~vlfn#gp+z6c6#8LAIQ<+X4Go?rB2{d)A{KzsadO8{Nbm%b;biNE| zu=K;pMItlS$(13_A@<^!?qmYlyVtmFXY8X8RLPJJc{L9-ws4IeM$4kcWy=7(2(B*h z_;D;XXGyR*hIygg@CSq2v6u6n9%vNY&z-W ztT6_gU+knR)uX3jv=rgI(Zlf&&IruZckJ&-O^rpAsB!McNo-;|`cUnKNi64*rJL~9 zunO}*hGWt!Q{vdK(4G=7XS5Tr3AI(2>Y4rF+@C*)e073BB#3hca({kH#*fqD+75T@ z1tg-;^5L~(;wfxVqh`V-I~u1WGodL@!Z<&!F2_e@G8Z>O`qb=P`7r6Fo%rgfH1}8) zdc{A3$LWb}KkCJn`EYGs>?N?kPQ8NgOOIFhu|E+c+QR9bpLyA;;@p;e8;4KK;9IgE z`pD#)G9(br2(uE!$UpDcDy))F*6qYa$TFOFtRD056G$Ij_LhjW~r* z#e>!oY{Y|A2eFKB3v1gWL)VEL35O?c60eDy@!+C|^CYIc2@wDR#KQrA zT=K=+zyRNJFoi=qD5?mjqpI$4I@NH#%N?7KdZ@)7D&TKb@=@Mrpsit`Zp}ye4q)>F z9IPut?p&XYvh#fU0BN6$$Ai^#{51i;jKhP~!JHa@j?f-FmY*Mc9t;U6wyK=)D#K%Y zV~uQpMON|`$S;P)^59&UFnLUm#CM3|Nn&sOU8aBR3~*F@WrH$xiag3AGBn33TW;mg zf|L4U1Ikc^GE8&Fu=I{n)D(Ga%;OV}B59l)@{r_^_&gqH=M|;l*m^43Tu-t#7YoTe zpWYLhm-q^vHsX0=iwqwK3FTlN@_>q^U3QDxz8*VF6?r2UN*r%wp**YS`6CzB1^tnE zb@=FFRwK+fHG*G-`@ISf+bB=N=P7@VzN-fPUNp(f`&I9culooJ81&d-ylDM0NSa&Z zvSafA6uA_WWue(G{S6ilts10JWT_R$BCAxSsR$D~*1VwlYS-x6DZty?*y-?B>yonK zo~!eJ4BolbIoLYm2ZV|&Rp%n3MV1m$9gp79K=F(^vMWDUn08kzzQgY&@|@kgm-b!32M#mn!@&kVoJ4?c zZEBzNhYx!j^YF=J$n@M$T&2Zcp`aSl=oC{7|2*sX7zJ_DO@EI6z8RZCtbU~(-Vmk!;XlZe6sHRE(qn5cg4Bk;-V#U@WKU~3mpzF$pxf8Bq|8y^c5EbLIwTBMWLcl z&O&dfs2cAyii=87+yd}JI5dYwn)Qodkl)vz7xJS7cBp8z3tQ&IX4M+*BQEBh3ZH-qNuKMav$Zj?Hl@DeHz%T>s9nIbvYpf+Tq zYOwPYnD|S?DwRk;4RN2X0W=f4RL7>rrrKX?|I$zalSfMmAX)GPvOs1P7Z@SH4QwK7 z4>vw-&%rhe%U&ciFjVJmWr4GQgs=ZYA$+h_+K7Q=$sLpAV_dS6SvHKj8DHUN@~E zC;6P?CAneD6h80()A}gWvavF6BnGOH+8UK*{R$`5Q!jN2QiXyvhLGw7ju%qRO{&H{?;_A^b-do7J zHu3QyMt;QEWxxwH9KiEoTuh7jL0tS1e=`C62uBIvNBlbo;75PwNBDB>AiPq;#D4~t zlfJF}iGwk){0Nt6nE3C*#r0a!gV*!&BhDoT%&{_m#D5&udANv=3Ap@-zukai8Yce7 z4S(YC$LBQyDR`}hiT?_&^|+WmmLlaxeDa$=!qai}YWO)k9r~*Q^GBR9ffT$*!%Y9% zxE%WP4V)nZK25{Kzt8YD>3N6Y-(ukZ8n8n@>EMsg3k6az?3d-o^l!$+va!4@2Y(Lu_O>0fEUt29jf z=W#jolSlj!|9pWIT%lp&AI9bIzuCaK)PR?1nD{@&MP4xNVqE+&{T%`+7;0I5#Q(I0 ziDS0+gNFY(8YcdK;&SLmmn=WVv6c@lq2A8)wiNBl2qnEnL@{2l}D&@k~|$F&)k$c~}^$us_#P6(GH z|5pKa=rQ&GZus*@{Ca^@dwc}2!yi)~1~d-wPc`uGH2gI=lI9hLf0Kd#OTbS0W_{sB znEaT2xrSNZ8*n-8*VO;}G!F5XYMA&>;36-`AM$}e;tUI<;Q1OR{wEE8y7?piwE`)) zO~VX-6_-Q5*T5ma`D5G?T*M*F@3I~GP5nQPF#d>hx9W5Ir7hP@JD>S5R@O`f{2w%ME;Ha28YccRTn_)8dSv;cu4ry@r3MfqxwEW?WKM zt#Fwp%fuhyLR_Soa0-`0k5exC@503&;e`UJ_V_ixOpEE8`hPRr{1HD&06)_IA%T>? z1_kGG!+)iQiT^AvCw*J{GtE8&F4HjaugB%ck0a;AzeM8@UZP>*{}7iWKOyZ;ob3i2 z(=hQrVfYh|KR&M!NWp70O#J`A<YPEsHRH)xpYe*>4pe^VcBG4N*@_;(xrZUes3fL9s#zXI&gFKrlZ(sRDX zAzYzh(sKlt!~bUOPn=5)c$tQY{}Wu~1=B9Z#UJr^2&CXD4HN$}hQHa~4;udG82Enz z?9gxO{|yFy81Tcmm@j`0{~MK4{P!5}85$-%kKuCoZ|cLX2L4eR3BYwR=O8*ZZ^PxtKkI=%;!g;q;N==7{=egL z6V~CVdb5I4&1|3~tB=!l&Zmcv1YL zs=S0rAICA`kAiYcK==w=4{O-9Ig>t;Ow)gbK|l3>ntn_MC=X1B^_!+2orgpJ0Q}SR zZ_cDo{hX#Bg>mSwhku&>g&F#(f70}0FzV3%HTXY_OUktw_PcnE|!HC_XKvvV^P+)ykMO3`15!j7i&eGU(OeFk&y$>wlWxSww>BRiYB>&Uw^N$IiIOU2@IMaqDkK*tnJY{t#KpF)u3K?+g*e?uu0x>wLW>eHZ$AuTG>3Es+1 z>l{skXPlyh({FN<+rR|%HKod^rbs>IgD+(Wnw$Jm8VTE|Qj}QHualMhw$&{<9frsF zmYD=5-arTh17FM@2c$}8PftL5;KQ`o-{DvL+_3@}`i5sCz7h)^6{<>?jHgTK(g=vG zwA|!br`D=hFpzJl;u5jEWEnm3%`z-6L!NPwNV~Q$`FoI`T>N$v6kq?s#8AtE8yVo> z0Y$S14siA=@SPt^N;$klSgjo_)FILMFgC6J~l$q7$NxTg)!BI#WYc1`@QI+=H z2SGaN|L5rQF?)%_zKF8povPmO;k2~&xoNs>Msy0{Hyt^Wq@>BYYJ>1e$%3jMU9b2Q znH<39#fUKXACOFcI5tET!!jxxM%Dp8f(F|tEkWkYFwVIY-$3<>8oSMpoA4YAemiipD~_R2fT__9xneU|R@3X=2zW4x4N%X5@lP4$SH= zbXVgjFouCsc?`rJ=47-ZbyODW0Io!)$cj9}8{Z|f@p)AFeXgokO|s)c zlGvC&AsYW-MVH6A+No=;=S%FyBDbh^b(E=+0OdO$3V)Js?4*4HzGhXOf|EjB4m8A&?s%{+75?Fjcj4 z1=sdV%~bpS?gWfKZGYY|e;|g@Zt&?GmYd%zyYVH>qIMacO8enB6#L~O&tVK)#R zOk4$7!sckxVK^k?i)+BDTrl%#WCy=z@IWt80-eYK20tsU!6%!lGqDpPB!Q3V3X1Gl z5kS}hlLc@U!&Unm^gj0S@SJq-ldclbA7gzqSf_T2ssg;rn(=Pc->_TYCo;wJRab%JO!0)H{tVCaFld5JiJd4xCcu*EUB(RKY!&L^C6yJY5JU3l@kwYo> zd~5M$r`%=MroA%!1`n>bX56WG;DK#tJIcwQ3|%j0i%69t;mau@(N81b@=pSqe%#&( zrl%?pH2na5)B&^xn3}<8pF&W2gp3n{CO!iXH~L!joA@-t&xZAb_kxL96Z-~Nr`8rY|JtrbXk3F--K1VU|&FGh3fYTI`=-LTTg z_t>$SAWd5a!0g~Rehe1xhS0@Mp+8Lm*f)D+K8UdZ#4oQjwF};A%MX4kKf5yhfqtd> zKHm<^Rvs^3S7B)M5Vzzmd=S&i;StH}YOtCy28?JQH7_*iN7LJRdkUFF5fzK=#CE zaaXd!ah%|W749S?B*D0}&tX#B%>N!y@1SY)Y`XCX1{2b<&Z zYx^93x=pw(rr~qi!~|vi5-8OwwQZAOL=sFJkp%73fixc4)jwu4^6n|y0t;ib1=;xM zt=j_@%AHuW8A;B{xbLQWRmS~)+XU3kN$f^$)f)iLxDInI*Th2*MR#PS=)sAv(Gj~I z^$c0_KzD9|obboJEWg6Q@WjJ>>}Ry_fiLrZah8j-+;LWjvjWcW z#8;6D&H|Er@ntw{S!3@93GUcULJ0Tny#q8XgUowsFz9tvVaMhiFYrqH>kE^cQSZrb zo+EY2eSO#`=!Kl_Onnt25-9*4@XSGuAtDZH!YR} z)>!&VoDVBp5d6qWol^*0qsoC8d)zKhV6&H`asBEaegt3 zGq9f>vkc{2A1T{%6z=!37Ut~c-3h|x^O3?Wo3EhX)EL+ux$;dB%KNTY@g0kTNa2co zF!+oV!YHBE9}1M>D(^pndu9KT0X!lF`dNr)>PwGc z8cm?=2#*0ERDOh;{1d7;Qf$Kprh3JU97zb4_?rS-L%vO$`(R!HQ=B7x2fhTn@R2@@ znP`1q?2A+e1Q&-N=G%GNz9tx%-teW!^y1v=voc8ygnR=kom`zx>B-Z{MG104xsh1I zLy=fP`8u8Qlc$r9bn-*_ z;Os++XJJDQa{8p|RY0i`5HJJEi~wxMZ$v3KLwsgPg&AV&5Y?osR(squTk%AqZd$qw zZH5Yv@e^!k)%;$h9)=~0>(?kzh2ctHFnT%ga4;do+K#NW`(v}w^FXC2O(6|Lg@z+b zbl4IJtDb+-WR|3pQK$+rvc$cg?Ju%qh({qZ$H-FcwJ_s_JvRj_mhn1Mdqp!|I4(i3 z$}(QdwO3)r>ulv!neoAG`fTkO%!Gy$cWTh&$qeDwY z<3*;cu_tWxPqCpE*mC@3gGVaM{pFkb&u0}p@c}X2M=Ll+g^b@V`>s6yLoYow`t+A) zy!WSH+wvXP?AC49KJeJf$DjV<&3k$p3SW8liLZaQLiEm@$A60y)uK9Eo6`4l9)BtA zOYL2CDGqoK)Zy3;SLwvR!UMa&eVvc+#3KyGnse+H7R4*xFoxFdutM`HGz?l8t14Iy zW9D2AXc$`-Bsidvr0Oy|npAbU_cJpXGgolXpS0D`U*wJNz`6F}8$YPWHywI>LpR3$ zB_5s_De*lO)vofyw?JSOOp;@*nAJIE#`3NqDO|%?r)H*m_oe8^WaGgEmWXY0BSMaN zW=%%$R3yHMgj2WSruQqHltk9l;510Rf$K~SDx9f-lH=4FJLN>+rtP&6#t!942?Ak$l|CV9XTq;S|Ru??GZ}l93;fNrs(ss|>3G zVv6g}Ih+|(1!Qj&!yq*vhPas+98xJO(|~MflH7%^Qm4k@6jF=i*U1r&ne9jdNxYpf zH(U-RCvCVKNH)SU)|e;+l9LQ_1F|WKVO<+YUOPDowujA5W71?JkepBQ*yyGVx8rV=g_u0S`29u4P>Zc|8kb2X6vzVS~ZxSfOL6TF%OoB?{%ES5dj9 zJ%$&buH0j=#_NOYX@6}E-V4RZV>0Z*kIb+v$})!QcPrvgO1fHJna55- zVl-eB^${eX3g#E3p%%HIIaqq-Wpk%$L?Qe9i5Q}%i)_oDi*C%i&)cu)<2rUF=#w>6 ziISL)7>LdUHS;zjJ>k1oz9qrlsCwU85B3#UoDcE;4KVU@O6pGWgmctdu?N-cNvwo_ zPQPA1&aIHfj6IgsvT}G~jyrK7_*w0;?+ldr?{p{6L}G!&sj^^(x<#uFCVq)qX?<=C za;bM2F+*yLVt+>c`0dyifu|O=Q+U%W8zLp1g&(kgg@-$}4eL*|Qw=2Igs|KM6IX9y z4;`?#R>(Pme9SZV7!<3skH^1Sr#x$UW}$lTaYy<7SIq*x4Hmg)q^c;J-yy6-Irc?V z65d$GKFZ4S#6F(o6in*+M-f9NzXEJ^?`IN;<0MsqZvZ^*#Y@vn$S{%>muE-f?+8u@ z64wk2fdiCB*6$oVxvrzr!B)0>?|8klKXUBTpl^nAz&v^+p@UeY^1BX|8mNeUip6n= z!v34VC(!vRqP)HYJ{(9>w=Wl$)VsTueyAct;^pX-;6rq#y0m{-V00(dziA4XSKlvKIPRCIT_epafd ztbO_9n~jx7FTBIyJ}Y7vZ8OacY`?`bE-LImWW}Z}K|9BfQC;r!qnm@3wCL_*C*^5) zR>hbj73ta0C)K3(Ng4$?U{6*(==9CZvZH$Pa?1K!J&20MVJnJ@pLpa{)=dW`{#Z3+ zZ?p;c0*a?9IVIWnY@J z$g#c}R;tGpfX_$-^o2OakQNC<2e#EoOo~lhamebyDI;llwUC z#uJ-;pS=B5dqo~}n-rD00558;ud#6}X@mfhndpDhntB-Xk&L5X%7U3cy^xgB(K$G_ z!87p~iN(a`dw9wl0P*lBH}ou>T>dYJzwaHZSx%f-IxaiJa%Pf><>xQWB)(PO8*a0Uux%Yj_!**m5G0aPwI)Zw=;UL zM?}Nh8MyxgYx<#+ccjJj}Ky53}vb z!)$xFv+d-hVfO#deQz)Wo%n%B-Ng6R<8jK^`Ixbawjt)c&Eo+1)fR_6Ga&qGYSPl(z33`1gfdI zxwX5yZB=_~w5g>f+SJ}2%?~!U_q29Jn>w1>`_G4eM+^PBqfOn-xLP~9+j`nIw8C#y z>*~&~*66C%o{g=o9nn>7YuY+`=-<}S)YTtd)!w-(x~j8hExr1q%}l%*i8Qq^GN9II z^V+74HS*}9*V?A8re@~dytcLZ+-P%WdwWxlAa}O+uIqqDM+-9V6sV)MSwO_=?C9?4 zYGUR9d)hjBktBewwpG17on75by0c?LYZt=1TA5;VS7*0)_jYx)cJyp&5l`*tXDFrcEhuO)7s8nhW2k-*T&phK>_)wd^&nT z1VQcJ(%Q_h*5^OKW>me`^bT+FKd36;(ms?q-ycZZK_K zTSr@WPg`@eg^!MAiKoG?&W-Ti5N+w~WmO|;SLga@OD{5OZE9u(wYH-SytS>4wsthP zgJP149GcbxYVAWx-Fz_F*1q-aV0UzN6JxDz?U5u_w|6%6MCHCnJ(d6$A`->b3_J)+ z+nNsgb#<|GyS+q9vrV@-5z+nTkT)_1jacD42NBMRA> z#Y*iVoD?|CVw3>cP%=Scez2{hrL_;>>Nb?Tt)l~VN6*gQ9=I~%Oc(;fAO`f*^VXo; zjf5BR#uDMtx(2E6*|h;I1kg$U?r0l)C`#vaO4jGL_D6AbN6&4OhSlEM)WX8yi3Zf( zx|;d5x19^PZ5=q<-qz9DMDhr9N5Rh)+|Y1DB;oDAN+RJr7vV^dK^<$P!4VL)ws)e6 z8L%S zf$EN?p588SrK6LvJ32RQL>0Df>gn7Bz0lsdCfb3D$8B9}7lbuGh}PV>9tCWJt|0(7 zJOzNp=#N5vI=fn=)>vn_0OKz8nIBx=g;vweSdf-=)I00DI-6TtdQtxf?d^hofq?N2 z?!$|ZZgFht>_GZ-D;iZ`JA78RLM=cu0$c-OmjF~6gdP4(P!C!C=*A58(m-PL+t zZyU1gYK1Cllg8K83PyCmXG14yxC;U;5v0Dmq2bmwMb(3vNbxd@%iU<~NGKzs#99v( z37rOCgsergh9`6e1P1Q)O+9VkeD`{=WVJB2`#d<$Yj5pqZdI&>1HuClMZELcH#T*3 zP#^)KcGheH^;9@?Lh70~t?umYXxRkqAtb_A@=Bw1Bk`W5E@&Hypy*%}a+63u)FRrO z(o4vXobOqSUINJdB6(nPaX(M|qy^Bo z8!aAr^sX08-n$+;MS7Xu?k3bc6gDoEYHv@oQuhR;T{(cG=Fy~kQS}>|x^zbdh+Px1 z*O2O@;6MS^L^rZn`9VBT{~Om*&1`IwUQZ-H+IRZGrO`grS$?n|&3n^2bWLlc=eKrs zLWJ9+QTSt2h&`L|iO2W9^YTL&;E6r|NcX1Wh0ZCn&zxMb<<6Ehnh9UI;mcXIEJk8zD^Hz~z$eNzknzxQ;(l`ZSS zS9X8@;MM27{GO|ysj0ta_QF-yKHWL;?!UeA+Pm+%+&+|8_s;8{J-hh&kG%GW8{YW# z14mx`%D~O9|LVuL)VcQE_H^$B_pSWXi}zQ)yRN8HbUag*zTFE#w)tgqD7zx|_vy=?~AoTJy(W{@|?S^T#$V`PJ4-uKnHFuYBY8p%oXs^3mHH{%HO7 znm=9}`IkSRw)AVS&G?M{diQsFUq5};R!{1lcY0n}IqLn(v+wY}99it&_RDQKw|?P? zoIlw=3O@Jtx%rQ5>z&qn=H11EpRNyIGW*8z+aBFN^E)^E^c4HRle0@Ud~?oSryi_& zX6Uu5cdos<{sZ@SHGZb|f-{y5-naCcp6@QZ_6J{I{`dKhF8}wD`V~8;e{;o$&)?8` z*;jYB9(=ZQ&1HKZU(-MK!?yQdTGC!{U*UPn|Mb#%?_YYPd*(Io?QI;nr8n~Z_ip&( z1CN|vb>~+uxbCt)T;yJJWqjb_C0kGH{KmE~-1)2FX|Mlwc;^q^J=(c_IMHBTzx%IW zxo+RLSASyy8vt8)FCaFBj{(LzF>4Fl=b)Oez}0}&JFKKy>kF`m4F5|IeqX?{T0_`p z0E;PS!u_dy?8yeBpk|1&8+g+Yz5!wHg@Mtp@lx!2!1+DkFC%^n`B1KD<4OxOkUgosIOqOBm_A0Nk$tH;nwYAdL{x`y3j{9E9ULcPor>?B}s=+KjZ1 z!MzgU1<3DG;Fp4ieMsY7NH2o2901;LfVUB8-Vb`e51b9i7t<%}9q{`c;{F=x-3mT@ z3C{z-S%x_O0lf7{djS4FM0z&@?;fNVLAq|l$Ehj!N*ugEoVTMa_u?u>Iox=D2I&qX z+zs3Xz_|_SJp#HWK>tO6Z$_L);D0ajNFWdX&I9f%2;Yf(N)UH1(u#qWZd^|y&N~tR zPk{NFkjroPmZA=utRWbX?ZT!Ractbs1|zu+Y~VejHl(A z)=?Eq;>nZ|pvCbwgi@c5ePVu!;L}vuoM4vlL@J6R$-~jSwbxn9 z=|pmx0tMSC+FyWB*Mj7?B4tvJf`FVs&^siwZ%dbiC1Y9opb8eXAduWl;<*I@N@#mf z<)b>niG=+-BF=3^6xJ5oma1YFkaF7%-$ALxF-s1^TdfN_0+O6aEy#;`GD0hIqtvL} z*FbB=-YSa2f=hv1Hx;sjpmLxqh4jgmyAfsXYGh6+ZxT+JEsi=U0pS`3Vb3U16l$BG zvN4zvxB+EjLm0Bkq1jJcgN(+kwMcWvW5!SAwA!~ph%M|0y z%RT_)Xa;%eGT-E+xJT$C8_X8c2||?gk@{}{c?na@MxLxQx`k!Kz}sdN`#%x6GCQ)v zI;R~jMi*9-jWU^StE6&S4dl;WM8KCrRLOgVfvUATeZzeSo_k{OROT6&>VC8NunTVn>6CCvvmXPGDrQ68va;FI zlxX#Uu@qm2W;Tu0KnD>CcoNZ3H&YcgWqlRMAVL)(DcUoM;&h{n%+^XT0&!+16xa@= zN@gjw#(r2)S&AV{O{WY8=<(KCx)l*-nGvRL00Tg)TaW5y0oWO^KuMI}?Dv#frbLrr zhY+RV#3*moZF~;Vs{WB^Y9RItpr3XkI%_YxiToE3YfeNoi{y9P1-K8ImxH8T)=h7X>a>I(oQOJEIXkKT{;g4+RPnLSWLnuTZUwcD-f~jyerr@G z)%z4GJETF~$W{x#2hkvu06M4-1GOU4tEg@*Gp;>`;27IAhh|Q1s8lcgc4qZhrI;YB zbdV{>+oTZGNbLSIL!w^Pk_xBN*$omigZZ$>+A1KsjkE3i z2?%9O+EE6oSe>ZzA*&J79|UFwACBgr@=GGHVsZ^+*mDbl=bFXOZo#I)`>D!?{kq~5 zvvHX7n#v|Sa3fGTXpUP^%%%!@;Gn8doM?sD!fY=!h)_)0Cj6b;Lwo^|@EsqO4#)i& z@}}xe-i_(rIT_?uM56#Dr3tYRPKUJ)$z5Xfxl<*UvhG51m6_yLBY`ncvE3Nl{T?WD zGbqj&b*l90G0!zh;-HeB&VVgL@DPw^X41`6Ukl1Z?fS9o)G`RHqa?Uah2qRw9szQ6 zs?;1JC~?Pt6wV--bp07Yv!)KpRLGFkidnmn4W*a;6ZID7j#Ptj>wQ2n*g#2Cij9Jz zW)+z(_dX!kWHLSxIeS1oWc}!^B4jJ*A^9@Q$e|Yvc_Ro)f)v%f)dai^?jaC(iFL+w zEMH_uIxzw#P*lxofXFc*8?iGo9Yyr2H;c~t%jEVApf7nd^lr3x4uClN$R3iWtmBB> z@Q+7UW4DyG7CRc0Wuj%X<3L!InSb=orl$&%E@Rdb4ulEELd~_Wzl35HiI#t zHhxli4y%0UDH9@UIcEj`GqLN8Q;1Uv=0u95^+mh6=6nnmGWnq;6E~u+!l|MitZgA+YSPvUL4;S9ZZaj?;K6J&cMrx_W0;F;AlDrqKauMCA=wNT43$2Bp4ST>K;qR2X?xa zH4lsq#)WAEqtW;!@xk#ivIm|F?>rrKB|3@`S9rQ*f0d=()duFE5gWwiP2FA81n#y z10!I;(7q@*G+O7H-JA&=AB|tK3yAR{Bm;TgIXsHWKq{viNIS<y_+ehM{e2~w6?7Tv#a!c`77 z;a!#~%JFUB?Vh-+judPIG)nn^Annz>W5Y1&OSOzT*CybjWf|;(oUky_mVvPW^;#}E zkV+*6hsh!(reoWIZ?J0b_Tjcafr@_|^f?Z`M$JbTBbQ zS#&7eiZTt=Mc0qS2U2kqSlX6kg(3`~`EEm%CK!QDWgp%kn#pM$K*3ANTSnwLHZVMr zs&lPXlBo$!Bo}m`0@AH`a6Fkrd(B95bZD4~Z5d~I@v3n&McGe`BBf|+GKrcSgkVWC z0$VOdT7zlPa@DT}+eV^s!DA6oPhjv+bZA_3)S%LC{dN7bzR|VhQ1~}YvN;T6REM*(J?5Ut*8|6V_+*g5=e6t z(gRg38j18nGNappJvy*69-X(peq!FTXt(fLnBSZjiZ9>aFj1rGLOC1Z?2rav;4GS` zb2W6uQI+vMOc;%EFpg?Kfgu^fRpvz!gzQv2xrcf$xd@6zI1k^b7Ta1Y(x{n ze9`O^2`B{WB$gL?954KZfOG?fkR|p?XRacmorWDG>eO`o)w!1A^NiLmdko{^6XPkP z{i9zrwUX}EhlV-wfRZsV^`M1pPPd*EMc&Xj(E$+0BAlS3*jdFofIhT-cvoC?_8FC? zOAOJAUku52&7TT$bY7Y@7?|nN1vqr#V2s1AXa{=aF6o5OV9`BLBB*E7Xi(|=I@jKf z40Fb5sWEVODAVxRpddNDsQ!%DtU@mkPl?2B9T-W)YoO&vGF6aL{fY=R@*IXN?%Ra{ z+9kX2@yD>JZK}7q9ZH4`?jbkLK0^Yef24YmcAu6ZhhyFN04Sr)AxSlCB8e?K*wE1? zoUUHRNoc1sB0+zF_Q)!!h<0w>%I-ZQ`J+zHJYNUBSyR@{c>emd0IKF8x=0UaRF-j! z6qw`O464pkI5iM;@>OlZRdxcNGXO5hgk%~$v|z?t(csXHu3TkZI~gOZBX>GHj7N8& z9_n0+)?*kUE!RmYGqTd14Mv7C#2ws@@?&_G#K5v#c|hxqj1Qrs!dNB_ z#g6v26%{6(Y)ZNg>FeuUGwV9=JsHO^6tz9*pP-%4HYM2A&RQKE-?;_8NPu4jG0Aif z0ikoci0$l36PzxvhvJ~@1kD~^I{<~4k?8XTG3Dz1$8#a;lB%mRa~K>MhSsPR1u-}< zxE*W^cPF-vO_AA5Q6AE1P9gS-*AH-{l2X$f>T{^nodcI_66F~m+O$i;(=A4OL)~_v zjZ3$j?$2aqA-$C9%BfaQR2nh{AxnovBXSxO9ZxZ(Zgx2M5^G?jNoIMjOS+(UAyeoR z*!5)Ejvf)VV!VfnLh%PL7QKVcO-%%m^v;2cp^e$AV??O?K1}GK8>nxSn9HEls6aLM zQKOWk%CF9KR`-b-YO>CdIU0o!g9Cn%MuAaMw7gl3`}BwslQ#}eL8;azDc$!wF;kiw zpk`5By=#sd)vzPLR4oPdE$YQlMUL`5^Pd>Pqy-pE6ls}75mXsSjX857Q6frdyH1nY zu|_&UBeEXZhs-uoIss{K5~C3yC4114z+9?lOe`^)m$ccw=!;43aAGJL9~s!i8G@1x za07#4^rRdl?slm3Rwnw)ui~je>NNnMVmm)e~ zbOM?7z6(PUDG`KW=K!ar7-%I1rE}&Q#oz!()6#o!(8B4PGato3K&Dx213*D9h{hLX zf*46$>I@xOXVB?kG=pX4{Hj@IRIatXqq3?2j-i_y#N3+Pg}k!C%OGBwb=&AzV?*7# zflJgl)+7Q0Fyvq7S|vHiSQ$$lCrnZ}>e(6}8{A$O?NCZ`c@zWjn&>*LEevdv@wcmf zGL@Z}HO7aQ8Krg>W|phbo~!L7*=EmPWcI0MF3WWO%TLHXBuP=z?u%;nR2W_zT=3qF7W9M=mtAWYGd6A+Bt;z@d9?FwFv z6S{zz

Ff(Vhe+g^a68lDc?!*Djr!n#_n4#AFgSe>syt3XuI6v&GvA?tpd$h$|D%V@nOD<0`~oguM$DHPGB zp*>jRNk%sgB-x0TMHRczSd`w!SRQ?;Oc`ChZx)Z5My>nJLmu;FfdEnr{VOwaNIwx0 z9QL!Zay-a|5io7>n^r$*Bg-@t|6(q~wz$?QfP+x2|^} ziZs-*m9ux}Oh;Pq*2EwP8&cC@44Nc0bT_+4GJI|4`k4}>%xpN_G{J^5GKxaCe)fO^ zqgV@5>NPVvl%7oH+ZgQL>B>X|OGo_c+)&h?cyp)NE0NDrSm=5~mX;T>3? zMQ?O6^O?EgJCl<^yDS2-COPe5yPd^bCO3!*rUI%Av()n7N$Ed3Q-RQeSiR>=0<8pM zl-h@SM(=}_c}lQam*TPjR9JF+lu8Y&b-km*mqgXV-xM=UO3p^;IH-D88w9{uUeT*B zYFQS2u3qxR%z^_zsy0Xp3Mi^hYr28xn(<)>{V5yO2+OHgJz8@H;O}&$o1q>=gJkL^ zweEtYOwMl7lS)}YrFh76L3BII=q$jd@ffV<-+JODLWT7hnG$3Y+&PfEm`i8Z7G%sX zgD}5@;bprrz6@&POFZG*jsIp`j_IW~yu?EcFJW&U6i`GmP8jV6`3B_VBYNl+VG5`^haFA`JMl|f}) zi3hAJ)7Fx-$VoeBaFgW_qnor(FKqDWfMsRcoH7k`i}56F{j?Qj+OAT&X{RQjGNz(E zrDIdcCv7V66q`ys#iEi=7*FB>4mR5*i!}_d&)Ebdnmvgg36jwY$=1Zr3})R zQYcoKIS+u;G@N!($4 zhkHgG33t&;u6hCuyfyN+h_@xY(P&bhG@2yP36sg7Hkl04XeK-wf#0@5sVkz0wr3@xv>)6ziF_O$cO2}v|2EUFqa+7A_7)!#Zb3JYu zQ_0}ErfvwqCMj*M5FIg|46@F|bdq05>IV7smvyWVm2xElFDdO?qW2lATe(v*p8cHG6|3-lX!^1B%U;w#DfNte6%+~ zlC`-cp2}Pj0F5Q_ps{37j3t9zG?ff08%h1>p2AQPUNn@%Lz|{&%p?K9A7+wiBgvpP zlEhOPNzx3GSK3694hRgC0sw6wNzgEm6em=xX&@x#q63@ACNYo9HjWI6abz%K z94V%eLE1rzFcCoe5DyU~G!@4%(lLv~6PlN1k;*8NcNj(DA#(1RL?(&}lZd$@l=Cc^?Jb zEgv$Zh;iS2E^Fmw@ayfiemzg^@iTi(Z(9q({tEZQ=OAp=NMZ|-@q-mh;l{6ic0~Z+ zuUoIV8ZCU7!`!iZhn!*ck_TsawKEamF__2S71#j8pstM0( zB>FV2I{?EJL(am%M@>vx(q>i&mUDOc#D+Jz#J1(idChNIIdad(J!nSQ4l%K`g!g{xdqnsh4&!tgN2NHNzpwhX=gFZdklBm`p@al zPA{_lT=G&$kyRJw{T#V(3;zzGSBLk9ZR^Wna%@HUX)y5k@l3*Bt>pbb<^HG0v(s(s zSJ7vu7g+9Dq@)3N+uA*ge7kEFF@Has+^C<=&|cha>x%iLr?#5#!_~yOua@_hYkyR0 zTl4F#0sZS2{tow#E@Zx6l>18!Pc_(9^XZE~fuf&$OUz z74^Q+Q)E4O;d?H$t+OtAs-eiL7&v7`kyR`AZn=LLciZ~JmOHlC*6Vv%>d0Q+m&pB= zy)7`?e6fRhoqi>GHGCD}d*4C->#p8)wQb!l_x;yic&%;y?jS?|dWdlDb-W*zyX*Zd zd!^i$%YB2~6LLQ&_q*l((EAzdiT5*|UyIMQ!+*zC;HMvE3hU)QEcZJPUx|&kACdb@ zhl%ey!WyqQLi*p5U%ST6hyvTPgQZ+>5M(H?j7=eiLQ#TY$mCn=ZVz$nxLJ zda1veWmzWoHMkd97u`(E?Kd-43U~1KX6E(Po0;-o*YW-%z(v+Gg7a6o2X7%}^(_n? zxrO-CP|_!@D{rB;x$_q0@>vOe?Upxs3ao>-Qcmv29elWzT=L(>xTnZ{socX?zvi#7 z{(9SQZY#2;ePCKJXf=F*EpABeSIGV2xEEPJL1>Zn3%S24ckc)3Q!e-Ua$h0$?YP_4 z2c;H%`$6(N=P2*9jxzVUqom}TqonqB@%g;mUpUHESuj9tu=)1)Tv%Z3yq)x4iF=WC z9ej$c_v3C`pG3+9){k#z8+l&tf5hFk-T>bUtl%Al*WAHY{H{B8-(g!HxPxuvzB@?O z_wRTJK2IXF(t6{LSMR8_LLcJ2T<#0yzECtLJf zxi6IaGP$pndzah~;BH&*yOT8BerI$kT01o7&)wyBTZxJ>=@Pd(OJY zwl2MgoWJEB#`>JxYwkU*yxO($Ud!tADp}fiFWdg$y_CQY-OE~jQtq$H-FqK>#_ywU z`Ph9o-Dg|h6xh07OPOXy$gHsm1EC8pTOAq(OL;t07u}QCZ}KaiK`qg3!BvL!G=;k>lC=|Kq~LB-iP}N z>s-;>vZAmQFd{ zw9qPoYazZ3eXpb$bust2byQM`xtQNJP!d3zi^Mf-Jt$$T#FeyuV_l9MIwZ|;>o1Z+ zA6#qkA*>H&Ewo19YDcN2iRM6L?3!&_e6WLg#(fUcvmPU_NeL=5itIdvMiSk6YKenEz9_PPcw(J>nu?UKFZ- zX?;^%e-zjA){n$>TwE_$&q$hi?w3I4udSEGHPcO6{(!xxSfaVOFU9G*<>ER6n5bLV zsczbHru4mLd#i)WQ`2FP97E5M0ZxnQ$@9y@DBWwTbIpaDCW1)wNAh zxe2aTxUQ10d)=4ebM#YP2igh=E_BmFHpE6Rv=V<%__z&PuxS;IgcR zaGj1?s1nyY?Wz;ZVYvDc)*!B{;JOH|)5Y}xxCY=_Eb%@n@vd@hgAf#2kHQtVu5w*0 zxjzS&&w7VzL|m_U$m@5xMm?nSxX^ixYmc~cyrlZ5>k`4t_r4FV&$%v>{KDS()-YUG zAq-!4sR7T5p7-J8efbaj9Kd!Mt-YLy ze|%p1z1P~q+57B$_8G52`4;2?--8Bng}vo%s!Keiv&3N}u%!Ui7boO)qA^ULkmp>W z=fSp@Xf03`c~TacxYz9i@)V~ee0>sfISJ${&M;jh`jP1l(QiOl-hCoJL#Hz=OxF|$ zZJtCaOjU_8nCcSsXKF<>5D2$D69~>Uh`hxRqTvR7x(-@C%ffaUX`G^3zi#2^A7fl3 zT1+&~xCNzqi`9^Bm>6&TPU*G)jT1BB%YK;4QOaeeQA^?0p0==8UN@o?%}bQaawA%S zN&E!qCW;kCEZN*_*h;I6_b8VNKn}6Scwb?84S=SKwZ=wB2crte0@?>Q7*#;7;$7ni z(IBF2NZ>ieHp6C#-9T8g_idA5Oz$yTT1dNqEOEf-M)bK2xBY-Ii0Cv>RdL7|1_Rq$ zd{3Tdj43#Ui@QYkjk%Tux%>|2PL_DV+-b>BcrnUlwwNx4n!7CA+R{LtK%Y>$N-kK> z7tMoILTw;ROaQ{|YYa3~%rdW0x^|RqzF8eknY=}c3)b^Zv#||5dw}O6@tz6GUMPJu z<+9NnV8imJQo7CNa2w9o1w-t|8k#a}n7-q+C8T*AVR`I%sYn z&!gmd#5_TCmgtyy(IzW;i>u(dRGctxLpu0s$Q#%aUz!hWe$YyLfjq@6rp|Acq$P_> zQj?V>Y3SeR!@tqDf1`j^CDVPex+JM}C8^=xXwcuN+WL~7&p9bMd%K&TNX|Y^dfhDq zy8bbQrSNn|4I!;UTHC!6#I$g)3fi7xQYfZ}JA9{H^r4uc?wCU^#Vn@qYWG?Y^MQL5 z=xz70;6~q+3ZpA>B)Qkn||&SET1iFOq&sdIK~{{9NiW92y=$7$;s-%Nt|dC>%gqhO|6s zP0~8vQktSZX;boVN%0*ioC0Aff_<=UEBIi$Rr8q+!&|p%55H9q9^$u7`oKF>UqLt} z0R7WRdy_sNfN8gp?hR0IJNTdZ3E}8-uP3i~-#eSQD;ed=}Um!Y2d$ zAbdHn66i01Ur8nYBDDu4KyHCS=o1>02pS!PsagbehWI!NCk3S%rsx)w4qCfRP52kb z#$_>8JZVzdrf^)yD2qL{h;$h!Zf{?R*V|iitJjltBk9MaJ4g#ji%5@>>Q)N&=?wE7 z=Agut3Pa!{J>OTr*7&Q!OAvo36wCUW^mgcWh`ArS8`P!ZK~S%XXe|qxlD(-SrrJw- zxZ+)~o~Q7DN`A1Inp7zWG`A9#HH&ls>845{5dTRf%;!_mBb6#bj83J;Li;Lc?M^zR zN(xwCu2R#vSLarK-b%~90V>6=Dp-d-hQjZLa2 z7?zk)eIm@wxz#Jdd^Ce}PW8^p67xwHSI4v~tK$}Z0O929%i#0hj-&4=?GL0slinwN zL~4X#&UR8SQeV;_P(6;KMcJ^Yqp1?a!~aW@)*_82Yh%)8q%Fec!Y60ikhMK&XVO%% zb`R^UOwos8c0wIY@jQixge`znqrz~X)MKhljdd`NYSh5iZeHUqv__j6XnnrMeF%@K z@h9l48Up^V^357GA)gIo-C4ten9pipZ=Qm9DZZ`Y3NhbPK2K`++Dy?myg%rm@PQB? z>{HRDcn=Tukx-)E&x3s$b9{34rdrradqJgmQmYTdTeY!wylZ1j2x;@$VHNIao|e5b3Uw3dC!}AJUM9Um zD(j+;A8A$6XwtT%X`};5$CJ(`T|)XHXrS0z*T)q`cilkH-|Ciig&7HsL4l%UJ*;7q zMuXx1*IG5g*(|XU&TQQqz38UI3ynsB>anS313eGC*eC{ie^MiC=Uhl7#gC1#zaBQm zQExTD7<vHl4>TqF38`xghD(!HBaH@4&TdBf-yJLCDQzdx6w-9k-lWfy4j~;unngO9G>>#9 z>C>@aeDs_L@upZDv)kPi0p1C4?0Ab}R+GL*`cce2cOUU*47NG;ua9Wm;ta%e1C?S? z3v9`ETVPA>Z*c))PPDiVDq`KudzeCx9o-ixtJbc97R_}P&L_(X2@V_IS+hAHfdvu3a%cU3uG0EA7Ae@$cxefN(UD79{ zK5a3kI%!?fmZaEIY1!CQY1C6`+1OKQ+1OKQw4O<$^-Nkeu4mG+aXpikjq91TY+TQz zW#f7#EgRP}Y1w)`lL|Q}XJ?QOAbpW^ENDu0F6nI2H%V8JZXn%8x)(G`d_j5!G+JC~ z`xx{m(%(sK@tsw)C`DR^w0b=HM1z_lE@+VNdSK#gi`*t-9N4I-=d`xTS?v<9^i}ZQYp`@coCz0ln zz5!a?N6Xt`&Z|i`whM;%yX~rgmTeyiy0gYA(D+20rIQn(EHNPw%XK8;D9b~IwdhAM zHeXMSfw8%ibS>$Jr29yZkbXsaj`TX|FQk8wx_7`FN|BZ)4JWNf+LrV=(&s^o=h879 zUc{M!bS~*zq#H=LkbXjXi1ailrj-)b5*@~rO3VI<^d9LSq@p9nyORcxmLsh~T8p$1 zX&cgxq}@p~NuMVjOgfHqDro`f64JG#TS*H^50IW9y+C?{^d4yO_WoLaI@J7ON7Top zW+x20l9nP3AT3K;i8O*VigZ^X`Zu8PI~6e8g2M5n$)sIL?RK2}gRq=!hqB)v#_t{UcZ1H#39bgNUCcUtzZq`#B?MXEYu zyc?+xX&`ARX${gkq|bLm&w3PYPTGpJJ!xms6w(aRL8PNdvq*D5i`)Oz&dnjW7Xne| zPWo@M`UUA((kr0Fp0_&3gU>Ide}ERp*DTcm z;>{$~QlLH}Bq9r)BrGtI& zn5)-XnaMh4tGA9x&K{VIX~!flfTQ-jRo4c{LeV0=G!- zCF6P7ljPH2wYp%=rAVuH!4+fOF6SX0&$D2)*5wk^Ijk$rdv!pQv;UuGX*~l+iw<3L zJ)=cBsGk_nH6L^|=@d{?6hOQwmUhKicWqakZ$Bd44vO23s}$UJAF;nHw&BUHo8XVP zGHdVh!8tb274D$+#%=!!W?dgqt3E$?$LnM|UMJJ>Iyt*i7Fz$Cl~t68gtTzhmepC=L@Np>k)~%Q zzlJSWU4pYk^;Jt#AcWycOQ#Fs#qf z%2T*9X&7k~X;ad6q`0a~rqxSwHm+WhvvKv3OzX^lZjJw@9bjBgiM>e&lj`;ASPJKo z7LYC`T}iru6jv|F*|@4n&c;mE`)?)17yuaR(Fl$@>CNVqQY5r@X@ z^@|c`#vK5?45>=4g-mgK+(bBk`~~7o@y9qk$F#kI;ULn=q~WB?v+z34ycpDa6w`vV zEonzmeU_R^;mlWXEI&^=m|}*LzCxNyI*W7>=_=9>Nk1VyN_v{~D(NlKhor9Kv7Wu* zOwAO*6s|}bLE3OUmfn&yku+ueVc4U(llCDUMDZiX<7_jQQe~4)ACK+uI)&dLeVcS0 z=|<9Rq@R)=COtcTtG6jGQMlVgtW|%~VWi_ob3jYZW5shw{=^V}I7=d3O1hSGRA-Fe zLgC${2T9vg{1+4sq;O}_ix2}(j!eYk$XzJQCZ15(brQym^+FAya81%_FrV8*!%289 z*>X~dzY^^!jK>8<#|0(uxS+&ylLo`tC7y98(Qgu7j~Y5D9R7?Dud_)pF?%?K@d}kG zcGSkvs?SaIRfU<^c$G|_Uj+Nihp!jwiq=iInpbnH%Wg6l_Dm`D-e!lIe3L33DieS%tg(~Jq6bb3vzMnyq9|se1d)c0@Zac zdBl8rRTIut$zM(l4e}8tDEvLrR6JS*Q@F-dY^AzW@kkvv6}LLr2ls@M$MFSIu_nu> zHioo;P0{)#dFo^C#i@9Y7tb&6Co-0I_x6+BR(>DhCtqE88+6%9h?ifi`~|{t)kDzeRgXdASD{aj zRp29DS_P>@4ywGp`a&H)X{^DtmDk0_`^m2B+JH`5*B*2+=?Cl3`YCDa^^SIaa`gJV zcE>~Uu0me0;n4)@8D5ddZue*@3=z!~1U5r7W2)v652GoLsfkA-P)DXtU{j(iQy;J? z(Tiy`*eo%CX$sijekapxu)&C6dK+vuk_2-B2P(~E zc#VO(N^sGbY^A)$1Jz^-@p8bJsLK>a1ebKsQ#A5Q0^5EfhiL8<545`~+H#<$6^yG# zPV$q%qER)niQe9!vYdE7Qd58Lnle;uWE$ihB`b>2^b}=5@PqiqZg@`|e?^{Sywl;i z0sSlTba=OtPididLJ4}u8=qn*_WaPhO9|TR9se{J>q~EZ!ht=li{5=@EhpXd9x5Zn zOsWg+yR&4JSnH(u@DOGp(REj>S$%PU=!$E&Pb*npe8JSsCjsb7rfi>1KWgpLw#KIm*nVdE(g$rJ@E;pOT#<%vH?WOns_ENTHWmk&l6{BDX5tpnTrtIWnQSh` z!T&Jp5%+@Ni* ziFTqC(>S6arW~SBqWNNGzysM%{Ge@OZop&NUesuTxfF?|0rBueLp>ra-NooAay5x7 z0i}#&u`L!o9l{61NRDKv7J81*MDL zqA`ktw<`H4I)1)PpHDc!dF<4JFF4cL~O?(hXr6246UY z&j>Q*2d_5ziV2+VO(>zSSi-cGs8$==KJj_*2Jnn!ItjLZBA;l!xD~v~=qGlw?U&%~ z27Hi`s7O8zE|kxUdrU@Yq(@Bl(oNuLj+^mVfKNGX{xQiT2CErN1%;i$!c3UHYOiOsr*clum~)^KE9DSvnEu8d08DT>6?Z zT$E|A^ITo}mN7!qAj%V4OW!v}iN;I^N=tK$h-W%eIu*WY+?DAXl#nI*5*5ksp@b|k zoar~H^*Aw!$yO#6{!C#8Q$U$QIbJMcDqF_I94|Hz?U&WcWWW;}w}`F-70OBCPof-q zT$yw+NtpP^naHvC0?$bT4vFx?Q8fgfS_&g764>(DaJ3O_MFLwsTWn^+_RJRf9niL4 zU<*1#qmJ4WTQ^r+X2N!vir@2wUy;CVm?j1?;nwDhl}xy`(}j0u?TP*Hs#wm1+c!g; zWx~FlC59%Ur$Y=a8*9EUHZV;p8*k1QDg|vh;+?YT<{a@T6-m!o^M&eKOc^l81v}|^ za{+!m6MlNuUx**zgrA=E7m8>mob?xqhD{H1AgI znJC^B9f2>oX5t&Zu>|d8n7h6OU(@$lSfVwf=FPjR~hv_e{ zeJlnsxx#mMKNcgI{6dn%R`Ci`S+H#tIZTzowoSao6altvVjfd{ux%Ghm}0@UU94hC z1ltbr9#b0Fc8HIe`habx*v&KoY&*pPBHf$2#1}-mH+P9MOxT;d#2qH=&0XR#5%y*; zW0$bHW4l~&#opW{{F$&fcZnn-hj4@}GIxpG9^^@VyIZX6iR2KkhpaI7iI84MbKw}b z*8Eg7bJF|fe$k)EA(n@HY!(TR-spKn;y!UuoMOU#;;^_+lqc4Q^fHc!dYR~1Ahw2l zVjdBpeUS8#^0>H3G~a$OHX!V7{P@5%S|zw z3HO(qVgeEFFNc6~*@pYeO);AZ_m`XEf+pHSZi?jtur3ASM1`K}mUu*@`~7E;`U2Xn z&|Gj&tR7-G52GCBX#-SPFq48y~t%JrdoB9AaVUJL<7`pGenQ$WJxd!z(5ULmp;|shA3MiYd8b zx-jJ>rcCfO%%}Ig;22Wrv2u~8h#YXXwZX8U8iWaU@LWeoS1QWAOxPuuv_6k+wMWkH96jn76XaiGJ z)pYpZyvq{TeLjQG!1Og@)FYBICL*c!+(Og3n+8p{n#kwmGvR2LCbEgfw3shSeVHjv06x>Xwq zxeUoe8_cxT##&8eF4LH5g|eCSnWk;|MD>^!RU06h$)il~LN3kaWu`4aG4eLk0iYH# zAYbRwx;k7-kadWPTsu}z60x!&Q;+JYK(S1Ns;@9w%8pDg6ZIt0Bd(>q;G`*5E7@~8 zmQVyULlV5zkWG{)c2eM$ z>LdN%*7P9kwAEL}Fo_!Ht$wmU(R^XmxMmHIJy&SYfEqtqgXCQzY|lbDSXO-pZAgh? zu&n2#Alncb=cEd@VX~_xyL-(Q#&DTIRAet-GhPgr1DR^qOawZ|6a)VyG(z5CN`^mQ z7$IL;iRBg9``4^#8!5*!jjkC9lueXp$K&)Uxqu1R8l&V}On4=Dl)T7NR%V;!-v^kkqPi7 zIqvgI!e6#ckf}}@544i$gYaD2M0u0xSoloaB-!Xao$eT<%a-{}--a&$Izp5q?uV~1 z9J0~-+EYa=vpM8VqASuZq7!`c`3_Nzs1z|;Ii&vw=$RvGMZ}9Ka`;B1{Q|EnOp!~7 zitOF@^7N~Vm6450UzMn$}1%avQ0@*~~_+D)`yEREP`n<_ukWd9&y3(!%fJrO&A z&NH2e*kj9+-!lCeQ3UiO)8mN4K)-7erD~n9O_Nwllg5M1C7-ECzE*3P?Nukuspa7^ z!%53(m2sIZjZK&m$5DnTkiJf;;xb28BGP9Cb7f5;eO546Mls=8!CYCN3C{}V%2q^p zR#3xbu58aXJS&(h)0ptAV6M#6L}vwaW*30C2B3Jt~t@V3y_%=;g>y2_Ak*@V7 zS!D;>^x5@?awQR-u_wBGD68y58}2;=TsF%%B8R9~yHIYG!?g{rrVVh}D(ml}TxcD+ zL$+eVmE#WCnF&{wJ7f zZG~7~p50z&5s(*?UmZ*r$W*gV22cg2mUWWE7qU827os{$eTW(|y+jnNNldQumdh7% z2HRe(v(n|bY_)M_Oi~) z)K4)NTuVh-7vw@FJb$<(FEHU=a7l*l*PeJLbya2(>0Y@iXK1p&TIZq5HMyDTMC4yC z-^tyY#5tfF@*oi$VS&Dvbw0y9^$O`n*@$Sq_`ar>{YSaPNoDM}=mY`d%BeNd-s9zMhFVT3qoj@`@X>7*rgA7h}CR@(iHBTTVTk5!-%`MJ)eBT$gB zj7YB)gN@BZ*q$5h!Nv(q_K{KXqO9>X(}bubpesyM$@V=_kqC$mbuDY$VX7Hj4d?+= zqv$QRvc?mpcG2NrvkqZhieTNd5o{hzJ)$GQ=BLR%E;=2`3nX&b7e{xIWsOEm??=}M z&-p}G^-Fz7XT6)7C_U7#E0&WY2mDuH}rd!&DbJpkA_T1!Kk$ zO{0K9jjS&;EiRqxTG6O-63HPZ)=PJ-WQ3eTDiE{k^>eLe#C?TSB$qc+~mn$`k^ z88gmn+6Gj^==qJN13)#6h)YNgaiLy3eE+5!(~WwAUBiu`m(f-r9@iV=TF2;cRg-7^ z9M@=L9#fh6uesJUyuU>oysKV6*|m|emZ>gKV?%t8w*4};{$kfA#;G5X9HKK(*w07> zVqpEZ!8Y_B(ti0e*%m(3wy9+6|2xt=F~9yA@Z3fON0R!RT$>r)9%;|@^>?_&7(TLv`&?TaCy8_)#Tgfgu>YFCKiuCW+ApxyZHx=> zlm_G?ux4$HI|`{tV2`yi;^3JSBc=w87`D9gY5OI$e_nn_N2?51G0(IPRKc?83Jr zVEcwPSnS%x7z)qfW3NmBTNmRL(SCs~k!novLR*1Y)Zn~pn(>IpA=Wmy=9+GF!_OH& zJ>PF|$2G&qB`OlQ_w+J`!qYprwYc~6Hd5iqQ!H<5g9ome#tdJb?#l+ITR&qtJPm~< zTyIdy?FAzQ|F0eLe9)k@+aO~DJg60d;g2qTuLK;(kwNMke8O7I+MYzsk8JvK)fd;UfT zos=j>8Q=!LBG1noCW+Bb!h6t9>2$+ZZcph(!-S_~*iyLlkiUAL?_{$!bwiTd!Lh?g!fvX65eZ_ z;7PMXC`dHJmUcqwqTy|7ZbK% zp5amsd*!+-=9y=dBFeMRY%~dMK|~Ha-tW&dsxaXl{yZZ}6I@Np1nV3tvj3HO56jkQd;7tA&u zG2vb?+qhO;m+)reL@~#h5vFN<<5V%%I7@V0VsFkf;%ev;us0VNvzf3r7aF^W9AazZ z)ozQ7uyCErXN}?f$QVv^UE;p9*jUK6FJT*&7&1b8ULXn~x-M}aTw=7ZrOU(pbD5FP zg!|xf<17>IJ#QPgiE#Yo7%Pm3+L#V$hub^GSWUD7Ty4Cm$&Nj}+E~Mc&vL9bwy-DW zxyJaEZ81%vT-F+gnL0O#vDO-=m@=Cr!PgTmFpX%E3iKUQZ18@!b;eIjQ<@wEdZsFc>vc>$+yUi+t4cr9Mqh^uryPf3L zJjVSqC;0&#c2c?K?c7f|sb1}N?q52o2H3uGQj_ML+|M{E4(ObdQk!>m|HesuA>CCc zjcne_{hE`eH1F?z-AU~t2fN>N((L9V+<$b^lIG*wZ#!vK^L+OQPTJCZMhW_)`8@YO zoVI;HPmKN4O8S^%n76nEcf=IA8)m15x;+m7ndVTYlQA1CW!_@C2xKz{#%Ry$F-P6) zrgsZXqD7IryBQR#$pgs4oIs?@^EBg#^xDSLob9wV5uT<;OH7w1hP5b^US>2?4pDcY zP&iZkrp1r$UgjvKpMXl4Gnm|CAGmv)tC-3F`Ix(b^q4M`zUC<>jaI(qw@wPO`I!%$ z^u#^D^le4y>=CicY(ZuPrkL2#D##3DN&;K3S)Zvd*n-U%rqN(4Z6-41fvvQe%Crz{ zWz0TI>%dmV988pB-xUk1dvhey(bx>2@kB-Ti?K-}#LQv37n=$+gJ{37wJen7%q2{f zB9uot^A=O-mPw+#ncW(<2(J2pXL<85QxwrTrq(UpJ<6L8nZ~sA^$0apoK82RWo3^l zrZ>|&E$exNnGsBzS~l^hVM6xK>vc7m@OoVvj|eBtsnyY=wv(3C>furMZ|S0)w%2O) z^{DTpIkg6RG;|WCYicG?>9}WQc{DS-YO?#aT4swi`!ZE%HCn}*LrQqIG_y*0wlSvy z;hwdu)e?_3<}#-Df!dl|o#_f?y!n-r5=FdujVQ-{rq%l%3Fa*(oFfy=Uzu=~kYGMy zy3xwhN-+J}V0-4+@3oqt63mL4#N$?*J=&R#*yi3kU9>kdi1O@ZS|>oH zNv3yu?TPE2BvW+IdDe_xW=k?dm{ded@N7$@uWcuporv`H>m+jkQ()Xhk7V-|rW$e8 zT)UXLL^<#bWufe1o?>c2)TpB_9j~8tG3OEGz!R16qKkQ!X-M34k1l3bCtb5~aj7E3 zjOdJ%Bc{e}a!ECZFfD*QyP5?=MWScD#jah=H=T3`Xrq%7T+_^NiRO#-aX)!sB-u0;T#WhYWaC)I0;8bAJdjZwT97ADEpdTPI58(nze}Z z(}exaB&RLWrN22qlYLy9crn0yk!ePoM4+*n#9M8ud%j@iI;ocDAaffLd_Ss9Jw53f;&k^RGE@+z%Z%m|kjxrw*>EpvF^Dm;gqIvveuvJOXZJilE z({r@ht*fRXKrfrKpF^4}#>CI_9Am0(nzG}UdX6*u^+M8ljyJP2kaT;FH;0mKzIZME z9nbOR+TLiJFBSn!Fh!=O)$waRCz><+J+R#K((VGeVQ_ zNZ4THnsy)bDL>&)&lzSW(<1PkWhM>QwzUa~VzzmLX>-CztH8X*g!h@}m|}?bJeZI!=9-~H zHJwQ)lylAgOy4C809%z|+V&7^^UTXkp6!rgUevY=5D65Knu+?Ob^=C@LFWvVUq1@c)e-5zNFKIx3BND*sR3V z0%(cZ6sUM#T55K3QWLS%%y3eoSY{4&QZui&%qf~^4|&^sl?m^ezHQEBN^2i4R+x*K zGTSEttz;Suws*`8Oj%%i$K0k#vmrjfq zyG@UmsUPg&iAg}Enege2-DWjSG}rAmYdfizwcBjYp4}2RdKH>&m#E2by?2*q-^ic%>7L7CFOe`FheKO7E!G~H^ZDX+xv4f#z}?pu-QqI{kNnQ#$hu}lkiMN zTYn}$qIa3_-2Sk+lhXw!w{baa9w(YFswB_%K5YKLR4aK2&^;n}!Yw&n95&@7teI|! z!=^tGo>wgg&uAhXjkDwtv$d1fcpo#n6X`pC$IZS(`i|dma}X2W@jGq~W5PRr$IVxW z@Q&XH-p9=;Y{NT#$IV$xc*pO!xl$9|@jGtbVZytsr_524vDW%2%QI#!k-p=1)*R$0 zZtD#3wK>j7JG{@C(}{Gg&zl8Ay4L5-c}!UA^X5V(to3^G&d0#UFo%DnE zb+fvY?s?xd8#(Du?;p*6M0n(~e10}(IBfwwznPn~&7RUFPyJGLkjy_Je&&#$|{TZF0+(~n)?Ekf0k=(_9UE>SKv z)t|{dCC0L;VN9h{qFh|m%S@HQ=AtGM71{AVrCsGQ)k=Z42-WLM4N~HTt6IPmpOOf) zoT*z%oR6DY%QQHpJd`gp3aX_Tipp0eEATW!wQbSWj$$47;}s_FX_ zI1^U=Uqi|hDx#CkSFI(|>uX=Nk*G-gL7v++*=?!m!dLBOs+5`mbc9GhkK(5~&%iv3 z#GTYvef-owrt)3q`2?taGpRh-2Mc9sb%;n`sVS{a5zQA3x~}jkt*lw-IbXyQ1rrsB z_^yrJN~=~xxF@d$&w+E%Q_oW6)ng(Y9T}p$@|ss%-a)qtsyvY%;i0M;ksjfpsumND z@K6=Sgd;pu#Sq~L-|rTx+OiEtc&O^agd;pu_0&WoJX9@W!Vz9YongW!5vr@3M0$jW zsqyolZbJ>VoJg;9YN*{#N)$EJQBC&CUE@Vfb&cuAu8BbRnDG2BT)8fwZMWYCTeu2h zGSfcuiBPqf%A_3zYRMFp7B6b4ZcH(0i9iFG@GP>nn#h!xmH{-IsaIOMsH4^}4Fg*p zwS#E_*do;lrhKqPs%uR1pu8ycC)2x7UX*fOsB66&($!U=OkY5{x+ONDY=T7?6SFZT!Ygj8bdoEryP@zom z&m{uYX6gdAhN=xyZ?H8~DNIA3gJ(n4V5Z#X;Mq_$ktoN$1Z<7fYfNjw)>y4%&&`l$ z6Sb4+AmrIZea>_NY)#c=reDFI$J)Fh_eU~8cYm`;N&R;^|F0c^2qC)1N|A9%M^Cz%4$ zPx`b}-!Vm`r;AqV5mVdr44_hrb*(eO)>>6#8VR=6sxeb8*y28QS8D%0Zw?@sDhrYNv=QZ7q%JrjDQ!x#6`qLwi2hdjHe518=H{1jEhgm31js8dX5AziBak?AK$ zm#UsH89n1gR~4{K*SbQ_M4-w{&A^tXnlPnv>S z_35T&F&!mZM^pq)ygUHgKBg0q*Syo!WlePFpodC*3+qxOZuDHHdZ^V*w|hSF>8TD9 z<%vIfn!df%jOFO*5MCMAynCxEZ)*z5u>1B=nM@Tke0=+>Uzs8@;97|qx&l25#Fu`J z-Cj@!nc8KP_I*L!eFtqg&o}fPsN~9Gg6Do!h$g$tY~edZ#W`(-a)=t@q;_C?g*}5Z zlYED&X-w5K+X2lcnlBn=ruhz2{nzNaBxLsVeNio6tEqeDK;M_tFGP9bh0JBP;R+tA z!Mic3y?=;nqNUtuYsR=~5 z@+g$kR4&nc`!{{B`%Y7zGTrTa3+NEjQ8imX(G`*rg=p6O}d`% z6P0H=Kva+EB2jy$yF{5x9s{v1W0)!t&0vZlTEWzlXdBZQqGL=miLNoNCHjNuFp>9% zx}HA}Rbw&+Vd>47$`Ey7s!KGGsXfsoroKe;m|h`T$25m%57SDb(@dWb-D0{*WPGG+ zcAqGi$z?FstTt0HQ5;iEqV7!1iH0+ECCXzOK(vJEhzI8RAyXFF4l=z#bdl+OqFG^}IzC%A|&1o(-7F5p`gSBrk9Ez$h{`avC5mKvo~SL8gQzFdGNO@89~0#hIRw6?m9JJ1>9@4<)jB48ODkV} z#Ds5YO;>xE@GY(B>NpV|$EsS>RoGUnC(;z_RW(Tyyj__pW~hZk`d!PJY9$jsSv*Va z*@o$g}|xj^+{!e^HYRDULXE`6RFz=Thfzo7TcRY$tj7 zEmAp7^7DIBu#;-|tx#u~?v1JAw^D`d z#CDl4?u}{ew^sFHav2-vw?PeI@*CUU?>&{pRFsnJ_r99vq;7s2)n=xMv6+4!sxO&Z zj~(Fmk-9;o*C<=m9VZR<+oIa-!qW5XqsET$+p3a@^gX_F!%3g*>LHPSJ8y?t{t4#k5LVVnpB-w(ZcTw%g>t9rT!^IKqur^xFk%1gR9%^{ z|8}ZwOxS-rRevVzznyA06ZYRuHBuA3|FBDqX2N}Gmnzyr<EA<7f| zy$j`Obwd-aVo$4!M0$mLT0PR~*fy_7=W=sArW<-d(;cFROb>~&4{Dn^;ke&v<@!0& zT;Vn0jNe&Rk0?h3g6)DDcu0GOPDm0L)h(vl6R!AORGEjhtvPsJQNxaCil5Nh`c}Rg6T7;F8gHZZ+1p-}#${Eul{?u3iR zPb&8dO|vHa?Dw;paa_|<@Vu+k2~F#XhB0j>TF10|!UMm%>O9lu6EeiFD&(Y2cW%OB zzu#1~FExD+p7&KO(;q;;tAtb9<~FfVK2mX~H3d#w?Dt5;eyyo8&||g#f~H8ICo24s zrma~|{QgpnowUI+tOTZ*i7x)i+I(4iCQdAJce9#Z(S&=JyS0$%H00uL4ZNyt*Rqbf zds(x;)%0oB2Fu4vy^f^!7eDLh4YI-h;^*&Y{XvBDQlbd9%$sOK$`GY3ef>T4OR3KL#^En`J7;q}%sR&yr2-de_rBf2i}yKrSJ2NQl5uDrE}3BLrW=Ut5D5SKT>)2O;AF0%Y&&9N~mrHFx_Za-#^SM$8>a3x(KssGhHES z!Spjx2c{=P=}hjEG2K9>5TdP2)rpQW)gwC3)SAfkmab>Y0i$BE{P!pYD1hg&!AqRkJ>M9m|JlRrXY{l_n~(f0Ugh>R2I6pAbbe;d^Iw ztoBStvXQzneNCRdm|m^(8szzclOFg)T3MQCZ4+gA{HnL;r|e}a$|_4#B!0@?3X< zQJ(O1Z1Znnoh2#)`ourh`jx4SW1oLZYsP&{S0pMsCi%9tz97mI(T){nymiq@NBk44 zpP1H%ob+#JJ>qohL%#NJZ*_m5w=d3d*+0=5S|_Ck46tr7U3K&dc)@z)q<#Sdtyqb<RG%^~V3>7;s7SP&k{$4p^(_(3 z<%@xAipsO+PdOxqTV70fZF{&C$b{Fnhg%hh^sGO^s!pV5{Sj7eCY<$0Saq3j)*oTD zAi{fYZwHL9;@O7BfDu*-6CMLbSOYcDJ+~27gr&D(&XhF)FI%&T^w*fOtXph*Ys!ZK zS}nJ3Yfrdh9TfPs^@!<2Wck1qmaQh` z0=8;_D=mMf6Opw7S6SsX!TX!_1J_t#PKpU!Yc*u*nG+MZ&T8wlwGG^0b#+ow;QQ9| zPU;c3$;u)s5-;Vv5V*xUP6Xdr%7HJzS+|Jxi=3Pn1Gidz!?9*aqXV~DSxmEYUJ2Z8 zZFG_&aHmx-0zHeMp6%5q)(j?mdVjZNucd8EbC#*yRYnzi&#X;+9PWO9GC;7Q`lPE{nau)}FZZ)fe<>6bkD+7;M z%_5NsMA_W;1CLqRL=I6ccU#~|>l9Irh|b*|c*+_Wg`V&glH6|tPg@t5?9HyqGu9)f z`%SOPvsOr5?YTbgR^ZoGBccMaGq<_hIco#k@R`!{R&KQRJe>PW;CX8v(>J+)1YWRC z)kB-!Tfea;5b3@38|#A8mLa~eesz)&bkS1vF`XXamn;t=J;EJpU$T6eaD-p7 zDiGlacL};=Rc9NH@Jm)S6OQmpRx?dB!Y^6*On6uQTk8fBj@#?jLn3`w{f3p_5Nn2G zEJNJ1HajU%d~aPM(zX7!TR-ED&R-h6nv_9VBvysbKrly46DGGJEPFpb4?$ zNneEi(^^NQpB($s`kV;&vsvD{LMu zsdU(vlHf1w{fYF~9fd8F30qLu8fl^ygaOKgEvRfpE6hbdIp$*XC(J!j{M} zylvk*DKW^$_D~bOY36Ga@l?7UpR@9{!K=GaLZ1D*sp-PcR+$N(f%LOQG5Nu@3qM;d z)1Q@+guks5({EE#fijsyUb+ad6)^ea9g+dIWlZ>9WPoioQ%GKypa9zkn&=K{plusd z&B{?Ofwm$hyiyZrJI#dOa4T)Q#&o0d;(#)?yH09tm9?n^+9DB_2k)rZ>M=zVXu}ruP&1|cfa2s0K-Y3ej*O&&+vDiLlYBmj?W3lZa(%aY4*0~Gj zsqgK!vOVXdMA6EY>7-FXt!;yyG(M<}ZM>6mgA!~joHW}z(e@q@&U`b2I@-1p<=Hn* zOA?)Jh1%1;6KdAkCItTf2I?2n{@>ECAZJ6I1vSNaP$e#cTH*$%P5c1r0{`HOr9bP5 zKKTDgX#EAk28B)W8-(RQrg}DiOlxOJ#BW)#QZ{}Q9W zj?v*KRC>vLFy>$7W8^>0$Bn|++J@-ihw;7?qcx1e&1+-44(shr3BdZKgDTM*6#jLS zJX?VpA`#RSsT7kzF?-3si2Toxe+u<)Kk_N5Ln&qir5a6PUE(+j>;1uMiY5Lh`^F?n zrTwQ+SnpRQbsEKg9g2CP8t|VmSpNgG)jH-j)pl1E^qEfn7&hSlX)&f&7=~Ymc-?nW zyg@#1k$yzFgY*!oZf#xSQHm+KT~F)tY)$ZgiJz9Mb1RvD$=a4IMQ`sJDogw5@VYF_ zZBBKpIc|l*zj}u)()-o_WRF^37IWSRYKo6RmDmAli9%4DC<2w@9M$I=(krBTPsX(H z4_cs#(pr=j{%a0mTsZAN?f?JDUZH*TNGTb9cJ$%Cr^k5lNN>`pIK~h^P@PMT(2^tT zXRsRLKBy`F0#(8`9nq0c|<8y8`AHN;j*t4FsU1={~vD|#AYH_z)>JY$)m%whHrM&+nF^1yQs}&%^ z?IJPHk14EYfRg%bou7@_OF5sQ9Q0ZU)!>=%pTc_O@ICB-rZ`7w7X@M}9V1@Ddj7kZ zzgu+<+Wo;a&W(V#?FuM+hd zX$y=LNoNqnvw>c3KRtseK5NkaXodeehW+I4=Mnl0LeB|0t)9~+(fYF`mA;dX(K>A$ z#K4&ss41QURU(6Y)=_}k>3DVn+f_oJuIP%- zo3y9iB3;|rR64Ga4EQ%@tlMI$vmRgCr{q}E;TK>V4S}Y5L5x zpf+(9)J6O_LqHGU4_4;2o|apBCi+(ewL~3I_I_dAgshF@|^ZJAL-nR<>a&F86PMylnU3SmkdM9A;`@T=cttLLH||E z9f&v36KZ14!aDndTB6FVr#Ux<7%AdG4bhpx-6;G8orw>iFs>F%F^H`CxP$9$Q;eh- zeViQwVN=Y4-h>$m!j>oiwTZ=`E@BO+T|f&6SFs(!Qs{h+Lf8~1OT?U`7+hm3ap~X2 z>uW4e)%e>A^E*nbSC}^_&wI|8;_EOt&;Rqv|1tTyzm6@VJ$1Mo#Qbxrl6$OPr`4t$ zVkuQ;3S&HsL6%H&YXug>7@}i5rX4gMOT_g9 zoXe8uH(yGkFJ9p>L}jW^$*|tiIuKtxSCkCn+TIX_pnCmKyo%6gNxD^^y`I(( za{JG&(EiWQw(xpO@ycI^pU|r2Y1kBco%6rPDDe?_>TT3VipEs)=Af2n2@3z+Jq@@0 z*|hT@ttFO$+Qd~*7x<@cJW^nuuHp+&w|~4c^Xy*qe;R{phT`k$dY#Y)YAZz-Qk`3O z2pgg=#pv)z2p3<6*YO2i(Pt^BDb|8Qn}AwkJLvz7>!q)hsL%iDHva$He+sn>YVqD% z9D{2xz3s0)<1?T97lN8XpZTJvAut}+2Bd39wI_~5n2TV>mSP=+biaHAvjhVVpbOB^H1SlARj|K1~r980q%Px zkG8s=$Hrg|sQ-(%?+%Qr*#4ipd+(MsS}5rxffON45J5mmvKz7xNFbpKhD~-MD{1U* zXf_a3BH$C1Cej3jSiXwNv*A+|OP&?WQ!GzWEKw{xE27We=bX7)62SMq-#>n0K6~z& zGjnIooM~s~-W%?(lU_S~p&hY0`|eKn707hLy&RGghq#J39aA~YEDrr|=p2@((Gx2; z=q)g-zu+wV@tpE>M!6!WVY-RsC4D(_TA4#KSfNxcYN9O*|2&+XZ0nSw;=6`8~(rFCnd-ww9~n)!6Lgo{~kKZCD`Kifz9PkU+>uE9B+ z8ub7wpEuA1d6-Rt)`n&t(Jb6ESj9X@Mu(S23f2D$4{;FEl{XAeuRS zl2rM$gU06~OnffF%qJo&9Lsvvvkjl4q=7WaZly0P;L(!SF6&74&*AnjXN;0_I{m+$ zqsm&QS_|wjhUma-LDp&4JOpai$2tkc3h>VsOG?TsiK0Lx<2MC={qdJ23PrAXNSr4o;cp853d9BY8;$tW5k3QdGsOb@wcxKnT!L#4 z!kX~w#o1ghXs=i=e7IhOzs2}lioYxHcP0K(@g^F4{ZSsI9qfuo?y;N;FEX{A@Qxi@uCM~ z9I#5H0-sc@g0N5_%;wO8g5HpQ5Klorsmu`ch0GcF=2e9_D4zslnF6)f`qF+Q)Rgs! zqENlCTY0|%b=dkT{R-9M^}WDxte?%CS|FXgwL(i{!6&*9qPvEjphM-_UL5ph24 zw^=>e{VVYA-tb+&o$9;!KlO7ekB{vh*F)UCybo|~@8r0B>VXZv_IXro-;fh`81??7 z;!$4R@T9U&eH;A4{0?G|@;*2RIVTGgdWyj+e%nCb3cWsWMBD=0u>?rZK`dZh6{_3q z6>){CW#d>p+nl^{YTRM;C`&iC#!D5D^m|;kW{66NUk83VaM`B(_#TE$n?}bMYWHj^CO+Qo zy-s;()5TE^?deUw_L-qsmrsv(8tJ)`b;>uJE`dzKW>5TPWmd&y@m6tJU$Twj&8zzC zRK{(-F+ST+x!K$|PN8SL;uLyXs)s_~_$t8roS#${C|g&o>T_6qIC)Qe95nWG57Nd# z(DW2p6x&#wLQkSa;R%=z;-iFX^C$7kwZ)seC!7@Y*7eOuIUykm&st4Rh!tx$yMdcG z<2%Y+Bd{{?2QYuLcJJn~VgQF8R<|TQlR#y8A>oAKiOt7*?$oySeg&K@N$)1?)YkSs zny^#(I-x@BRQ_P>l}L0t<9UqZ8J$4V?XO7ZbxKEB+dC?8lDf8cV&YC{)oa|TZ0&uI z;e_E+gq|=&-&&g3ruDydEK)lUNO31ZvgFoc!$HVbp+wf@?nJ`+#CC9=RNC3{+o7M; zvF*xtc%EpKxIXWJM6#A`>L|hO0@i+I&vu2L6Dm}f-TFi-kBKY7}dqM$atm(>}-B%JymR=8sNtsE2Nyl~ky{ zd8;$&C|d%xl#Rt3aDE1)($9-(wX-y!JD2o6DSL~sat6M{p~8xS0V-h9xGHudkw!;D85>5f}^ zpHRkcnW%IqQ@8wGaqw3t9sHGc2fwYsA?V!;4t_hsL4&*(eX-D?&e=kmY1lFwz1epA znB++)1-+T1aYJ^mNn**CsmYs_m$z(5rW$`R`KWee%Qff&KiSf+S0VDOq;wz;sVOIb z$jBnu15cKWa zQJjZSY=?#Fv$y>_Wrm@z#WT<{%Y!8Uwdz_b*hP7^&_?KF{f zEl1q(qLp!->G^HhX$xR8dB9(`t?IJ??Hc0<^!Ao{ouY1^EyzNAeHXAbE?`?)z*giE zx96vcdPr6Ymv}z^YqMXcAId*wt{30TTAJqK?^M={U$(7H^NSwaKZy5pTlR~%?e2tn zJhitrtzOV~E(;WT(vaHS-n1j!YId4ZxBo3|v&h)~P8wNbd^(NkDe04xob7q(J+$+- zpAQ_j9r{vL2(oZ7iv(jg9YMVvsb{EsIOeHa9e)>MsyZH;! zsRvjcd(yCW`(^3vrp?=D;E9F9`Rn`8xW6r(>}0HHRqxnNqr7F~8uS=#+vf~8syw{i zJz$1%H8i=;bbX$8z@w&Tw~rT(LaQVDQ_9y3I4J1L9Vbowck~iHw45EO0~Is1rUGNt z4vb1hs*5;qEdRqf4{R1@V&1t0B*FF>VS~TbJ^`-v#nv8ZH#p008Y|+Z!w@WoY zyZrHt9tee``RI;a(R3GBvhfSL3+N}60<(1|IOc&npU-fZNACQ0WP!PA=j$1h%$}V` zGDevFJ3j(Vz1#@%tvf%R6Slg5-Sy=nYXvrZs%pmq>#1m7HE zOKZiwW{cgd+uL-c)ONE4_At{7>Nd8+-P}Ly7F$=WP20^jN#njf%VC@|afVo~mF}`< zQ96|J%vy)g2Z4(>-)>MW#J5@=*;Siu zwR}FSHhVLtvsnxtlVRN~E*#SYP6g97O#7L>mg!AQ-v#;}j&%>`^B&IsJv?HL;wQZB zVMI&87lJk$&gp++_E7^_^*+Q}9JNpMDw>VYXQvd^p7SVk9%W7(@`l#UDIXN{B^hcp zkDv1pQvSvK5L=^DY1l&j@He~OJ0}(Lzn^nZr0g~iIw^8?#|}EkUyeD*Uz(w~!@!v} z^gAnIsr4bGj4uvz`UMy(ZywyPxHfMYOs(nJ!H1cDn7_4=&00FZr8vNIgF`$wIK*>< zLUs2YW5oe3?*T6ROC0wl*2YUZhh`}U(38y1IUs1>azH%1f@qp2IJn;~u-vur)|@h~ zgAfH%?aBh#WmS`@zEcX~o z9%GFiXPR2{lge@C&^&Wf?s4t|k8`XwOs`?uVfpxuRgs6)+LZfqCs}wjv8?U=XzmG& zGKX@VxK{;c6qMQ#L2pezBIsT1R*|!PvNB2eBDq_h2Qst834WLNB<1=$H|8A?^mg|n zg5HmQM9>@Cj|h4n`Vm2IK3@R&op~n&z3ux1r|ht_-T7GFa?8_qK9xtk>#KQ(RVC?Y z-eD8v=P+{eW!^edpFP=WRJw2TeqhAA4nUve6i#y8on$Nejmt%IhNyh%fyaxJXj9wN zAH>8x{qj}J*>dxvFv`0VeqhPpxc`q*Xy*1Cx4z%F4?GF^N%?IS>X%MJ^5-5WA$hEO z53HEx=I`TLIIO15Zpxpe`1ULXF5j~}f3voB&({1$Eq~pEXK^`Y#rWKw$x5M#=9WJ& zher1C;viDUEO?aDA8gtNtAaApgIM-8ivX?xL%m2(;U&KYF2Dw%i->JdTj#y=wH z&GS}e-kc2Z7c;ibDYDVrjA9k-#hd7r$-n}vLrZNmi-=LJO3mJ(QC6efIm>1>&T-ZN z=R50w4?3G{M=Y1^9UXDRvcH9J4QMN`myaTE|Bmbc(%R>fy^q@_Dc|osXv;?E^T4~$ zd&_nLp&!@^j4RW>vTas!+qPiN7Qg&gn_{I{iuJil#XiDFb2-I2cu|bKhqAB@GbrQd z>F5EB)RQkTHEj83YN1B`xx;u(TdIA5>4n5ByT^1>TaLX@yRGdaa2`&+-9Y?O@Xtw~ z0NmX+7dUHuz1?bkxb1p-q4CK!tmyf^iPBCCAGU2%6S)m0a+|`;8M&er+3MIhh2GY3 zSbaLFcS)Q=Z)c%d3Wd^JRSMNRSBwOo-i8vV(7R0ztMMt5z@c}U99G9C%>hmCE{Rj< zEhSjl;e8~NSZ{<|z@fL0#3}Sn5gN5`DtXlOc^lq)1pmf+C06v|xEFH!eaR$a@%jyj zOY5mgM)RV-E2-em7O|Y$0>*WwukXrED^Tdo3I)oIE0zQ4oeM-S#r%O+4ZKP!;8jm7 z%J@KHEM^z;b7*}uPK`xdn4FNvZ6T5EKbB`f3m9WD)~`*AMW6Xee5{_rcKf}hM-B8= zgrf#}8$u5=y#*l_tNyjf39bEOamNoJPrcs&rWbJBGUy-kNrl=}8TWgG`M!hsz5_Ug z-FTnG$Y=2W0%*Ww_CS-_4qDF+aTK7xqLu7;e1Ne4y_U^EHB!d(RL4QA zMq^Z`aoDKE4qBzoiW>#JQ630;@W?(&p*i6wg=T}aa)BpDi%xzH>DQ*b4175GO`wwW zo@2AJ>h3Mctvugu#eDl`-0SJ2-+&oO%D53$>ZwLp*Y=JWH-c-2aJ(Rd7ed)|cj7oF z<{Kq(#97-n2A=LdA_iW+ICux6;Mudlb9XOrmUsX-M?4IyV@^GDnwf*yEBK3o$(HgJWUF0sda`A@Ck?40ylj06rwX z0X`zW2Obc=0B=#sjYvVMGRBDCly_8%C^JwVDh!m*9flh;i`dPaz0A4CKsmqPK)HIz zK)HIvK)E_#pjslNc{sJ{bUs=Q7kitWo#@{ij`Wav* z{bZTH!QS8;^MRO1;W9r9tTVp?tT(?6Y&L%c^qV_?i_QN6UT!`GTxM3gMT(W?Xy7Vy zAK)5u3h+jA7Vs8x0dSM~0^n`tV&D#Q8F06G3UIIal5S`zoVSNKZ;x=U4w%Uvo-$Lp z4w=b*UNFytjgSi#> zi+MHhH}hJcu>1w6TGjzAmYac5mi55ymW{wz%VuCd%NAgwWh=11Wjkp3n zo&?@zIRxBcX$S7MyaL>7c>{QlVc`OQN0BCJ#| zs+H=+Vx@YCvQoWtw^F^tTB%<8S*czUtyC}ltyC`qtW+;qR;ri5)*PgtZ_NV^wH5$} zTZaHgSjs zWsECXeiciuVVPT4W)p|r#-Y2JvzIydFz2}SdE{YK1l7)%2x`T)2x`Tp5!8yyBB&Kt zL{Kg7ji7wq6G3^qKZ0`gPz2@YkqEMc0}<3VpJK^F5o9MXM3CjY6hXG}S_Ij~n-OFi z??jMQydObUag5Xag3~URt7IiOlQW5n4uqx_d;PfcU?JQ1h z4yWeg)asa1&zxrF_@k%|E@r$uihAQ^QPdl+imYN&6j{P; zQDhZ67!O2KNuP?Qk{*htvb+#Yd3Y(B(tjSIV_%`ud+KZa6X97Ec;JchKfEQYkPGKRFVDu%SNCWf?eV+_^% zEiq(=n_?*EU&JKz%@xJU1K547RW^>x6(f}e!0}2<|6Eb2TmyQ(vIF?NNCTb{#5XEq zKu5AnFJ&U=1f~Zu4gsz(Mq2$TD~v{KHugVn~l~>&nY(F+|!jAe5Pl6?kACyPH_~=N8Q{#rvEchD|#=r zJrlLM_XFaYsC3M`iepHoHRgM3O#fXmkrCx%cg0-R7k6ZS8#u-N+hR^xV}ZtqoPXgW1+Mh7HKgm0ocJ%+gCqhAs)K=!SF}5>yFj`YNR_Zf7Q}eQ!ZcRI7 zeJsBpE#*$0j>;%Okoa)34uad4!yL?a44|?&IF%c9s%Ynv-TY;1}>p&`FwvNV#4@P7&Kbz&VA^-FU2ZuTa zdI!2La4_EiemZDl#05Y~$HOunaMoSmfn=YN9+vbB>=h9W8ufcYD?+D_Y-RaY$lL*% z?%s;fk)SDuZJ?hV*~a`fonwr6101rwc7!I5YS(F!Z$~<-!7)Y*15#=o9NMANB-4Rd zJ4bau=7CYxj4iRzqpcZSvl*&29XJY{e$w}WrLr~{nUz+MptVmiRN>>_LCDQoT+YbG=agglVTm`O6(;2a#2&7AB^ zE-A}9bo36~Ug&^KEs$b4kWLwBit7Qtz0d<%EAnJ|2gU%oT#$JHe7bKd(nOnu<4?_lA6u9d-QwoSEv^f zx){}qh~CZUD&){2<}fO@AwBbR58X(d9WM;&*`xFd?W%68@wX9wyYROMe|O_=AO0T3 z-?R8ru=7vv;ZsCDey_%F8Gcvb*N@+o_{9+~aSeX)3MjluSD`~&;yU`p|EmDYRDqo^ zT=Wy-db$R=8o!rAehq$c5L~RqZ!CUq5M%n)_gmEOrhbR}z18o%e!ut2h&wm#!nm@y zOXD`g9f~^|_g!4~ct^ZH{_6Pa;y1_N9)C}KdwfUyZ}El%OG2N7^n|>GkqLzfr3sfN z+>-D_!aou^623|JA;FN?CowfKJ25wLWa5-WZ{p>N%M;foK9cxc;+u)zC-zE;Pa2eD zOR7t1PP!@S>7>__zD)Wy>E|Rva<}B($qC8n$vMgACXYxiNiIvSNWM7Pne0ivA$e!= z6Um<@|B`G@>6@}Lr7h)!l-E*@qrcX@2I=wCZK>91`@27X9cOQ^9 zVCaD20W${7AFyP=4FlQ+93Jq&fXsmx4jezwIq#?jWv#-s5>71kIe0k1~=fn((ACxvIdr;n>QG=EZ zUNw04;0Fi4IQYZCh8#;ybWUtePR@lnWjV8Ryg66qtjhUI&Mi4Ra}MPEGw0i!A9Ese z2jwo!y)Jia?j5;z$WpKG6NZ?WHKztz6ezQ=x_{R#VX_80B%*gvsHl*E?|D9J0al{iYK zm$*wBO8g~DORg@tzGQRBJtg}~o+vp~@?yywB_Ee`l$$p*M;uQ$K6ZTN_|9P(*L&P~u*nPHdn|z` zQs66U?*PS^_W?H*9S7d;NQ5PyaP$WzjB_jWz9Ez7iF4KcFdt6AY3ly)Tc+c@;<>Q# z5jdwg%yl?pxJjgm9XO?Qm&g!z z<4oiKh#avGGwZ*KJn=WQ$ER_w@p&;^yo}UeL0(@K7m5!=k@%-57Dv%;KStg^!MTIa z#5nOK?sgm=)NgPG<42r%{0(Owqm^oSrk$9t*9eIg9DyodJG=s z#@d2#5#xM~=;cgbAA=*k;-;AOz)eiw!~BP1HiPpj^FL$yr%IhdvinuQKf12~M)aV2Ntrc0NoIdfk~z|oWKMRc(BFEJWR8@{Q2bv*G`$M*((b9_ATx<37Zx5Z}w?~A9LJi&MLwhHXWIE&7^VUf6VR^ebg<|bWp*-wm{2#^#7$0W*8{@N#XHS{R5}xwe zCFjE6!zJ(TPg;sp{s(+nzfbmm5cFz#cuU-xN;$lPX({=8I&riCgfWbL29QpY7&Dkt zFo5EYW|Z<$QpWmo`FArYKObgL`d>1hV$?E;6UEpklhRLROyau?V*aztc{P*kh%r5f z=yP)@%?ooVRzdc=c$1_oS9p2Ldwm4{gq+WSl`LPELw8)7^Bp*Uv;G9!7;y^tmQ^wT znFZz`G+e`HuZ#2kYspDnB>%Uy@NOQJ<>Nfkz~^~SAhmDu4gr5;z9pady&3y6p2IjS z|L>3)mXB=)v95r0xUqmFZ(~{vr8JX=Qd`RzT4WWX$8ZXjtto!^B@seo4tD`_m@nzm zWn}2F5%)qeyba2h_|65SrB5%Ql-uL~8I*az3z)=r`6b`dQ^ zHgnEr>}@rH^ElJey1p%L2S?gZwu9o1b5L9vx_20Hl<|ZUmAhhu7|L`JJ?4luMOYW{ zSMW=^Q7qdevghfO$R5saR}W&^_1{_GGhHMvtfIE>sG@sG{mUMBdX=w-5H-w~J##}9 z<@vHIs-0^XrFE@l{-&xWkeB`TomE$XexPb4@F1sf_MB7whUa|FY`Tlo`MlZvd!juu zN9upYY|7^ij2oE0hv|oAlLk)O2p?toRSx|Jx0nL|#I7Nx38g=?`am;w6;w z97aFm%1bD}60_H4Xx|MM=bL4p1 z#`I&=l(#n+k5>;y4u|ER3yhg#BXqU`|K@xO_=58};H%D;fct7r0$*Xe3S=<9UqZ7^gGNXI#m66XR~izcIea_$lMBj8RRLS`y<>#&L|(85b}vW8B2} zAmj6lA2R;H7}ZSa^k+Pev6OKt&wh z?mwS7T)t>2(*JXr(`O@R>v_WaoDZ*BhZc8lcbZ#<_irbdpEzbFQZJJC980u}7ZS;4meyW>np1gKp=yq5tx@(TVU!MVd2h0r^J3Z@*< z2#sQl!3tEtA7Kytqudep#7dOBHiW(L&wy2FZ_s`5&w!OFVLz-)@dgL{Gl+PR06Kv& zNhE=j2vo3MO#z+E*dMD_ycZ9vUV}JC3MD1Jl4?j4nJ8h<7Rh4Pq`<;tE#Zm7wdy6rcyIWJO#G#CvJ6QdUF*(l&^C z#zrw4bQA7?C!dkF0e-7m$lL%lh})5>LF__$2Ap8_0PjE=25~3SFo->fXApa_&Ntu; zkq@!{Dq2AAXM7k>8RET)jE{*W;6KXvxVQ}b13-g#0#6?*SodE6`blvW=%*N;hIh_@ z(@liWz<+?ZU%?+|5YNI3XTW)v4A3Hp5HAaJQlrsHKZ3Ja`5Bx|jJGN$ zL2pq`0UuU=N9ZF!*o^WA=*NHtaX`U;;t2rWH?0^!Kc#4(pJaSNF@tVbaC%n!U5Ny~ zs6+!_Qn~?OR(b$mQF;O2QhEdbq4Wj5jdPy(@_~{7Jfb84-&In8?)F@|zrH^U@g4?`s| z%`gR$=|I?(VH$9xVFqxN;bLI1VK&fas0P{%PT(3tEpV-Y{CqbU<^lg=@Bnuh<^yjx zGyr!Qnt;0v3xIbRe84*mExkknGLa*SHRxK8*d0H-jGs zM5{Ee2c5u}WZVc&B4e^~Gx#ZtLycR&AHq1yxE1tB<96UEJiTZTqm8?O7aH$?{6#?Y z%*H*yB4Zn{*myV4X1o_@H{J&K=T?4?G7AIsQB z?FN2t#=dF~@cS{wtG&RFV@yzcgHBZYA~XqT5SeNm=qw;cXEgyhOicowuciQptEs>d zYC7-&bs%u0nhANEiYIPFF{51_1WpNKshR`+SRiU#%>(UV9IqCDQwGFnt_}e`k+A}w zLBpFy87HadgFhK)5S924mxA-Bgj3a#;7nnhrj7<@IuJdxdJ*WEjI-22a4u$?trmlS z2@rDw)ed?N&>)=ZSkN_$F4X}}Ef8-*R>y;OGtN^dfK$hKsag)c2dLnb>m<1u4>&6ruTkfNe=X1;u2UO8uVTDjZ33s2akaVt{53%I zX{rzO4M6m1Y76Ka8E;Y-fwK;%h+EVppl@beuU-bu2F6Y572xAb@!;I5UIltH;}&%} zIJW`u<~wx-=xvO*tJi?DlkqW9Fe)T6+k)lY!GsGkB)s-FXYRXc#E)USZQsb2$sSHA`RTRj2%L;W5ov>$Tn*2dh&-(ln6FI%7HHFe=V~*6L$r&5L$%q!^R#N>5Xf41ZZIMwC#XyXS+7h5$y9_v4 zy8>9LT?MStmIJ3~DzuDuBSLVFq5p}h+HQacR%N_zu%Tzd=nwe~jf z8|?@%%k&=dbB^f)(AkWGOdo&~N$!*kV#t)QHIlTx8OKi%n+W zRVKVI1!wakfy+(ND*9?5dTCQP&?|wM=a}#|6>+Vp7w|e$Z{YQ&zQENcyk7;U^%HFhbbMn(=-rxyD1Z?-EYD($l^Z6eWpR6A28*B{~!?SO;aA|{Xl#Z z!i2YBh=)x>fRC8Y1OHJV>d|yQ@J-VQ;9I7Vz<-!V1K&2$H-z6Y6#|c#ih&=Q?7*WY z`kL^^CI|2n(|F)9(*&gUDG;@3DhGaUngq^qQzhuH7=JWP0sWI{nrgLY!=*P1?X0Z_Kcr#9w%mFSHHNea9^tuISOUPTYl6@(wz_nnX+zPM8IAtcVRGAJe zQKkYXDzktU$|bAihk)ZEaqJa-6-GC1%J%E2zdI29%dIKL*`T`FqalpSR3BacmdOOk6N(yila@Act zr=$a4PzD13u4DpVQnG=sD1(5nDLL@Ue1x3zz^ZCG@O|X12Uc5CfgdApJ+P{p1N;Jc z>mj~G-V()JV;(#&w;Nr+Ta43z8;mo7w;E>wZ!=y3+-95u++nN%-ejB#Kh0mkPr=N2 zI`DqTr-+9jpMrTcg+2oL6!943Q^WzJ++REget*oIrvv{E`TpV+$oChoA)Wr>b;$P@ zZ$iGm_y^>(Ft4DuE!}0xL*2e)o&|i)JRSIgc_#3Xc`EP~^CiI7%yWRRn`?k?nqBa? z90xrEPi#yFehm2;;xnW$Lwo`G8RARG&k+Aa3Nyqvke?~WS@K{n&6b(KM$2?yy=5xU zZ_s|Ph=(A5 zh4?GvuMm$w{z~yQ_*ddY`E=lOkiQZq%4Y#zK{{9BT=^W}>yW<^r^{X9(p|n?%XY2a z^=AC6gsT%)CsZfaB;J+yZsI42Unb5?z9g+K&6~C&?al$dfy)QxW(~_~$$t8rgq#66 zuAIAa9?WUZy)pOKJT-qn{ssBg(wj?PEPbz3b*y%%_$u>>QHmI&9MOIog+5w&Pm36h z`Hb>`)@wBJKh%p3)q66jcn%=*55Rd*- z@VE1Bf#e5 z@wWzlYw>pj{^-9_5pAV=;FrrFMonmPwbZ*W6cd(IE~wA7IsMLDSAD&_ENZErU)JPw zxxL}RELmLdaX0$AidA?$OuH=P=?ZUCLzCZGQ}3?wIvah?T29gC^(=II!#ES1jm~+< zx2=v;b}&eNiSlu+t*U>uXIz&6W#trP2Tx>NU^iF z&OJxhN~ycPIba}muNRtRO*2WgEH9CBqp`Ey-OyNa_ZR**&+oaHB%X(vexSfm|@WB z?Tevs|Cy8_#o0_wFNq#V+70QVYYYyN%;5cmZfNyRsJ7DWMXx|%Exr=w*oul9^j2l7 z;jEW<-1V;NP$@zRhk5#&YGFaF_)1?rx=OvM(%`}(xxIeRTu&{`h+BDC6G-ZGitC(S zw4e#jW+q|&$PZdnS<@mkucrDIl0uZ`MNWThoxBsZ(?FLK)?_QtpES6GMi{(AhEYi3 zSHO(Pg1H~^)XF-gZkkbCcI!T<`Rus-bANYl6FhyO*#Fz01;j5P{-xV}}~%dh{Vh zYLEtrPzS>~DDwExV(MEO8f9LY$p#};K#gUxJ2XCyZSlCMI|*q%td`J`g|%bqngU}K zCu?hJ!DykU>#p^nsfo(c!h%w#Pqzzc7Ep&AKe!W?@)ge7`P@yTuEVN2)W?U))!?gb z^3teVxx|ODN|e`JifjpcV@reJI_KJwfw^H_0J=%sSs!^TQG507iaMvyJ+VnQe6n^& zSOh5z!*bX>zUC$$jfKLY8>>gZXwU~qJvX_Ia(z%1azxdYt7nJ%rZ75JAIEJqfl<#< zT;J5_=37mG5u-u+{J}v`kBOlyw-Upq+wT*dhcy^Fm)=%`%=5?;7_S`ElXz;~0e&FA z(u!KV+}LyV@d_3Y7`GhdAbQ&fCOuZ}RzK;qX93Hr>>Flt2 z5GYNs=g{vO&cJ;`m%56e&SvPb(N8^Iy&$FN6^Hr^ziH<#B-B9!Yb4M+bX9|1v5v47 zq|-1@S9qS${sIlhRuf9bCA%qZj8$%L114ZJVC(EMPow*EuH9GbL`l#&a6c^OQr90Q zR^K^Rt?au6Pc~_CB+y7GWnWd3V_qXBbD}n+{<)rdcOwb;G0--(_ywkBXu^~xCWCW5 zi{FVlc~`;@QGZj~A?cx2rsSjCcB&KX~LuT1~aS6 z$BUWOl~t4Ng%hgn6K%MdXt&#{ZI0q9(DuobCzgi^OrBgm8JD)gszM6miwSnb)ajxr zB|&6`Syec>N|f0r(w}{Lm9RPRsx|_;C@!y5997X;|L5Wds^!Bt?x|Qu=*$Hcx^$q0Wgk$Z(I$q(8XEk<(L(;L8p3TjX{v z2B-FC!g}HUqnymge-sPT$bXb&fuOqnR6I2f@B zR>(OESP$G$Sbo+vxnSDD9Uy9hGizN3KKA7lJDYvbP&*onI@StusMIQ|4@lY(9ww_Wmw}xvQL$ym>|xCPP!vbXdA`uJjAo9x7%r-cotRyFaZm3~hNbXp7qucAL71RXh6wo{n%}{r1k=wD+ z#U4}m7ZwLBW2`$smAK*R5VZV&)g!0U;?H2Ooh{QL`vEq@&PEtAf=&k5rCz1~@O0}6n4Pq& zGZ#P(9mP#8@TbG=AV&z7fMWq&gWef+?Gsnk9qhSUfTXdi)aFiXek_%bg<8)Le~bjx9#a zCLA&pJ%Zd_(%Wyi?=iQkN%x5di8D)8vJVvlG5?-fM)%xSHR;4zqyl+|T!1{Yq?`@W z=#O>=r|FrciZJxJv1?b=6rj#5C%wk-Sn;O9nPo^9*cp_%0C8rifROw>vy47ipE*$1 z<)5gM8Yr^CKW9z@H^)u}7l(e?Gl^yFnS{rp3k-yZ)3$(jUCuGP*hL@|)%2%wlr-|e zKWDnTR3`Ruf<#Cv;Pxg5Hg)V(O&EXzl*8A#)pA3XO_Q11}L6SbLJL4pMQU z*9-AleLq(YU-B=AcE z9{KKFVWOxqw-J5VD&EPI+@_{`C#n9NEoj4ZXv`vQ~rXXJ!ai zvfJO{Z44$uvuI}}X37W(GI<#wx4cR`i_wwF9VcF5kUaJxNWQSqMZp1O604LH=_+r* zE?tn1vtO8X=qmxaL#JQV(m4X@DCbVW(^$j?NnWXW{yO6M#5A{a{$w}I6l(+WBS{f( zK%;VK>h54-sRKKym_|3S){C8uG)oH5?8yjRRJz^snJ(k|Fd3|88li$0(2OoaiE$?9 zAsmSZW><7cVS#Ik9)3;XeDiRDP7KbbZWz>l^xZsShh4%{no*@bx$PIYLKTn!OJ+%Z z3-${6h=`56m3$Y@vn)LoyWH!U=fTkz(m+5(_>}@6I6yCQPzzzj4KG@!QeYPrwiVI? zU3U_|i4J|2+vDT8B{nFy3qZpTEK&nHg2j7z{^}L9IZkXZChm01BD4kMTL6zf3F@m0 z2ucdaf;{Ajhw+fZ!iTKX$$rr%ylno|?%=?M@z5?IIhMr&ir~T&R}aJ5PWFr35mK!N zd&I&}`os^rq{=SpdP|ZyjY*QcMaefOkhnX!c zP*}+@v-;W=+H?=v6NOG`lo}7k*SD@h3|Vk_?eOsx&kWEt2Kt-{PVan}hQp^v4$km} z9O*(eby^LC^sOs6q}(t~hV<4&LEP=2n`3_)pTpvAgxeq=6d|RCu1M=u*!rt?G_oAi zWb|%6+O!JYC2)se z>Jtj_p{J@D6?WPvs1%h|<&*6;QB_z}W*0@+r?3kfBkc}U3LCztV=JGCphBCd!A2}p zTkoFhms_C72<;AF;||+~H8sLtgFMnHK5FU$djj(bYD8VjT(qo3kj5}Uqw6B_$ivs- zuAM)(QT`(L&<`&ZTsRkq@s`fd(V4aCX7(@z_X}7l)0@0F=i_XkV*{|vp#}LBIP^iM zQs}b0-qnROw4fj;0L@oA>-{Bg5C(ar?!|K9j3b0D@;=c4x=<(`xu|XNhC5Jd8?aN1 zxeXaL;_$SOcr*)ap~GNq7e+-n_u#`}Zd_LK$(FEiozWaHU!1Baq(Y+$L`Ni?VKfx$ zna88dRF99(OOTpzw1Cd~xG)ny*QXyggr#tv&`V-EAXSTPIelJG!~PLQnim8LK!pj5 zD1B9Boo_)#8!k^K9ey1iuHQUdL}!Idk-EY~=$gXARZZdH*Ay<7;z6owK`=no;-G@` zJO(=l9JzwYp)teyx*AR^t)p=v&iTq(*J)Ip zPSGv+kS^~HS64VH?A1k6DrX3JU5Q=eD#rwS`IIU#!BgvP@-@x%=T7r94mmfs(mB^H zZPO=+rX6>At$VBCz@}r$7*85_Pze-=yY0XQ#gcw2nl_@bIhu5@7gF(|B7LI8DcxIe zjJxDv7oS*2yXQW6Mf)zrm0`3)piRh02@PgEXZ83h-3wYUkAPPQJ;eeU439sb{0r8r zPdKr1#c4{iA?yf*xTVubb5bjhP}=+ur69hkrtI zbcatjpm5eSTKMynDa4f)S?)!W)Ki86s&QruC-ULhN5|dbhPScfX3*D4Hl@D87zr=k*lVvsj1BAg*suYe(H~KCO20NUnTmVEo?7CZ%=wP`B6smlxFiAsTo8 z7(fDKKoZxm88>FgXb{p}6}$|SK|S+Yth0D|qckx6cCa9?(?bvKgl><#kkP5aiaX;{+u(BEU} zO>G+#)*3{yl-{dQUTh_lrqpkso5PkJb_BX6J=NpJ2nk^#!irM`PY|Av;-FB8rg{8z zVWTXf1;c`Dc3DtJa2bQTn2eHF4l91o^Jt=p|XI|B~`JxxdzMzwuy*(m$#WGJAI46zON`R`-n>i@BNGOcMe=bFnaeQeXZifVq6GUK z{Loe|Kj_vp4-2HaCArhj%O6pU)v*5H4IU`&%m_71s$uywNhf(I$Lp`GEbAIkUe}>d z2xI_RLBDgyCU= zM;-kMRSR5MJR4&(Z|3o}6m^QK@nhK$cp}jg@UEkw>k-N54Sv}80mY~c_c&yNwq?s@hvlfrnEgACY1jIXKqSO66bl8iJ4A3c`z-bnm zWWXDYGLk0_3X!@9?0iW7dJQ~p^Vo3!`*tpLdg{54)<;~~a%diidTnBF0zZ-=oVb*f z9X?OYVd?M#x4d94CDSKmVcJf?A=8n~0_UN-vWmiU1B0NV(C%HJiRn`k7}{weld)su zq>(l#EBlx*MwNF-RTEOxcmF_z1+otGehY@%HN$5pLznz_&O44UPj(bn!ZL@A&bP@0LN%_Z*hPt>%wAnmRyel090#Mz3M(q$)eJEwmSb^TQi4<` zjuqtl{LCx27H0FN1yj6Bp)Zx$$4cBHean;%56N03 zibBvZo2mNoOG9n>Tux+4V?(EFPADvVn$zPC<-*fc>#z68wbZoALI+(65YRvQA>{M5 zwX)u@Sg&1(eikbMpWZ>j&A<;~V*2Q5#PI3SpG_4wNK!qm$Wc`(Dkj@2?Nxyz>CjY3 z*%X`-pIKc|IJwGESQfmloH4ODcu_K?EEH1WnCRdrHaqH|3aX!AuPQA^4WLGF3ca{$ zDB}>ua~TU5^F>ivdGYv4QCw;-9zRt643R(Q${#%A&X4M1SfITUAnE8&Qt$qO+tB_Nq#tCy1+a7m~Ow;spPU`)aJNDKRz z*|)@96Q1PK7bpQQuJk@(cEc-FGDN4#RULlq<%vcoRv?%gkL4wvc7AsOkL4wvc7AsM;S4wvc7AsKRj1a(B&>BI=75>gxq$#g=z z(2;58k?!;{RVtPHJ4pr}7jp+C$GZJYqaO)ONd-;2_(cG`7UgLq4HbbNLUuwS-OGNY zGZ&fAyO+j*Amyt(c!e72TpOLW+*zNUHP=Z=U6nyf3s-u84*dp34K8Kaq)uMfIekTL zcOxIJ^zr%+rY%om!K*zNCt3K>dMEam{8)+Un*^9ONe>0BngX5=GRg33-6q3XdS6Jh zPIkhCMpA03ftyj8XfA=~O7*Xk<&EJfkqk9NeQ%mCd1faEc4_{|rS7qoY6_?#Pz>Ty zb+faDE-=}E;&>yE)`6TVZ%8o3=?4xz5+^js%HnW#Ph*l~$bS)dNL3#34|iwten2?G zfg?UVJ=NVzb

    ^6&qHKa`LQKA!SalzK~7> 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 literal 294912 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

    ^abKQk1yq46uo8E;QUde6j9mXrk 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 z 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 From b49fb3db7ca665abf9753c74aa1e2b28eeb70946 Mon Sep 17 00:00:00 2001 From: AlexRa Date: Wed, 5 May 2010 22:34:41 +0300 Subject: [PATCH 07/46] Added MySqlMigrations.cs (supports stored proc/funcs) Uses MySqlScript class to correctly run proc/func definitions that need delimiter change. Requires MySql.Data.dll 6.2 or later. --- OpenSim/Data/MySQL/MySQLMigrations.cs | 85 +++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 OpenSim/Data/MySQL/MySQLMigrations.cs diff --git a/OpenSim/Data/MySQL/MySQLMigrations.cs b/OpenSim/Data/MySQL/MySQLMigrations.cs new file mode 100644 index 0000000000..b16655d1cb --- /dev/null +++ b/OpenSim/Data/MySQL/MySQLMigrations.cs @@ -0,0 +1,85 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; +using System.IO; +using System.Reflection; +using System.Text.RegularExpressions; +using log4net; +using MySql.Data.MySqlClient; + +namespace OpenSim.Data.MySQL +{ + ///

    This is a MySQL-customized migration processor. The only difference is in how + /// it executes SQL scripts (using MySqlScript instead of MyCommand) + /// + /// + public class MySqlMigration : Migration + { + public MySqlMigration() + : base() + { + } + + public MySqlMigration(DbConnection conn, Assembly assem, string subtype, string type) : + base(conn, assem, subtype, type) + { + } + + public MySqlMigration(DbConnection conn, Assembly assem, string type) : + base(conn, assem, type) + { + } + + protected override void ExecuteScript(DbConnection conn, string[] script) + { + if (!(conn is MySqlConnection)) + { + base.ExecuteScript(conn, script); + return; + } + + MySqlScript scr = new MySqlScript((MySqlConnection)conn); + { + foreach (string sql in script) + { + scr.Query = sql; + scr.Error += delegate(object sender, MySqlScriptErrorEventArgs args) + { + m_log.ErrorFormat("[MySQL MIGRATION]: Error {0}", args.Exception.Message); + m_log.ErrorFormat("[MySQL MIGRATION]: In SQL: {0}", args.StatementText); + throw args.Exception; + }; + scr.Execute(); + } + } + } + } +} From ee713cb253c1ef2d09de235964e02e7621649dd8 Mon Sep 17 00:00:00 2001 From: AlexRa Date: Sat, 1 May 2010 17:43:10 +0300 Subject: [PATCH 08/46] Converted MySQL migration history to the new format Replaced all NNN_StoreName.sql migration resources with a more readable, single-file-per-store --- OpenSim/Data/MSSQL/Resources/002_Presence.sql | 6 - .../Data/MySQL/Resources/001_AssetStore.sql | 15 - OpenSim/Data/MySQL/Resources/001_Avatar.sql | 5 - OpenSim/Data/MySQL/Resources/001_Friends.sql | 9 - .../Data/MySQL/Resources/001_FriendsStore.sql | 5 - .../MySQL/Resources/001_InventoryStore.sql | 40 - OpenSim/Data/MySQL/Resources/001_Presence.sql | 13 - .../Data/MySQL/Resources/001_RegionStore.sql | 154 ---- .../Data/MySQL/Resources/001_UserAccount.sql | 13 - .../Data/MySQL/Resources/002_AssetStore.sql | 9 - .../Data/MySQL/Resources/002_AuthStore.sql | 5 - OpenSim/Data/MySQL/Resources/002_Friends.sql | 5 - .../Data/MySQL/Resources/002_FriendsStore.sql | 5 - .../Data/MySQL/Resources/002_GridStore.sql | 5 - .../MySQL/Resources/002_InventoryStore.sql | 31 - .../Data/MySQL/Resources/002_RegionStore.sql | 6 - .../Data/MySQL/Resources/002_UserAccount.sql | 5 - .../Data/MySQL/Resources/002_UserStore.sql | 5 - .../Data/MySQL/Resources/003_AssetStore.sql | 9 - .../Data/MySQL/Resources/003_AuthStore.sql | 5 - .../Data/MySQL/Resources/003_GridStore.sql | 7 - .../MySQL/Resources/003_InventoryStore.sql | 5 - .../Data/MySQL/Resources/003_RegionStore.sql | 5 - .../Data/MySQL/Resources/003_UserAccount.sql | 9 - .../Data/MySQL/Resources/003_UserStore.sql | 6 - .../Data/MySQL/Resources/004_AssetStore.sql | 5 - .../Data/MySQL/Resources/004_GridStore.sql | 6 - .../MySQL/Resources/004_InventoryStore.sql | 7 - .../Data/MySQL/Resources/004_RegionStore.sql | 5 - .../Data/MySQL/Resources/004_UserAccount.sql | 8 - .../Data/MySQL/Resources/004_UserStore.sql | 6 - .../Data/MySQL/Resources/005_AssetStore.sql | 6 - .../Data/MySQL/Resources/005_GridStore.sql | 6 - .../Data/MySQL/Resources/005_RegionStore.sql | 40 - .../Data/MySQL/Resources/005_UserStore.sql | 5 - .../Data/MySQL/Resources/006_AssetStore.sql | 1 - .../Data/MySQL/Resources/006_GridStore.sql | 5 - .../Data/MySQL/Resources/006_RegionStore.sql | 12 - .../Data/MySQL/Resources/006_UserStore.sql | 5 - .../Data/MySQL/Resources/007_GridStore.sql | 7 - .../Data/MySQL/Resources/007_RegionStore.sql | 25 - .../Data/MySQL/Resources/007_UserStore.sql | 5 - .../Data/MySQL/Resources/008_RegionStore.sql | 9 - .../Data/MySQL/Resources/008_UserStore.sql | 5 - .../Data/MySQL/Resources/009_RegionStore.sql | 31 - .../Data/MySQL/Resources/010_RegionStore.sql | 9 - .../Data/MySQL/Resources/011_RegionStore.sql | 9 - .../Data/MySQL/Resources/012_RegionStore.sql | 5 - .../Data/MySQL/Resources/013_RegionStore.sql | 103 --- .../Data/MySQL/Resources/014_RegionStore.sql | 8 - .../Data/MySQL/Resources/015_RegionStore.sql | 6 - .../Data/MySQL/Resources/016_RegionStore.sql | 27 - .../Data/MySQL/Resources/017_RegionStore.sql | 9 - .../Data/MySQL/Resources/018_RegionStore.sql | 6 - .../Data/MySQL/Resources/019_RegionStore.sql | 6 - .../Data/MySQL/Resources/020_RegionStore.sql | 7 - .../Data/MySQL/Resources/021_RegionStore.sql | 8 - .../Data/MySQL/Resources/022_RegionStore.sql | 6 - .../Data/MySQL/Resources/023_RegionStore.sql | 6 - .../Data/MySQL/Resources/024_RegionStore.sql | 18 - .../Data/MySQL/Resources/025_RegionStore.sql | 46 - .../Data/MySQL/Resources/026_RegionStore.sql | 41 - .../Data/MySQL/Resources/027_RegionStore.sql | 5 - .../Data/MySQL/Resources/028_RegionStore.sql | 79 -- .../Data/MySQL/Resources/029_RegionStore.sql | 5 - .../Data/MySQL/Resources/030_RegionStore.sql | 7 - .../Data/MySQL/Resources/031_RegionStore.sql | 7 - .../Data/MySQL/Resources/032_RegionStore.sql | 3 - .../MySQL/Resources/AssetStore.migrations | 69 ++ ...001_AuthStore.sql => AuthStore.migrations} | 18 + .../Data/MySQL/Resources/Avatar.migrations | 12 + .../MySQL/Resources/FriendsStore.migrations | 25 + ...001_GridStore.sql => GridStore.migrations} | 57 ++ .../MySQL/Resources/InventoryStore.migrations | 93 ++ .../{001_LogStore.sql => LogStore.migrations} | 3 + .../Data/MySQL/Resources/Presence.migrations | 36 + .../MySQL/Resources/RegionStore.migrations | 806 ++++++++++++++++++ .../MySQL/Resources/UserAccount.migrations | 47 + ...001_UserStore.sql => UserStore.migrations} | 63 +- 79 files changed, 1228 insertions(+), 1008 deletions(-) delete mode 100644 OpenSim/Data/MSSQL/Resources/002_Presence.sql delete mode 100644 OpenSim/Data/MySQL/Resources/001_AssetStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/001_Avatar.sql delete mode 100644 OpenSim/Data/MySQL/Resources/001_Friends.sql delete mode 100644 OpenSim/Data/MySQL/Resources/001_FriendsStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/001_InventoryStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/001_Presence.sql delete mode 100644 OpenSim/Data/MySQL/Resources/001_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/001_UserAccount.sql delete mode 100644 OpenSim/Data/MySQL/Resources/002_AssetStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/002_AuthStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/002_Friends.sql delete mode 100644 OpenSim/Data/MySQL/Resources/002_FriendsStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/002_GridStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/002_InventoryStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/002_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/002_UserAccount.sql delete mode 100644 OpenSim/Data/MySQL/Resources/002_UserStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/003_AssetStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/003_AuthStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/003_GridStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/003_InventoryStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/003_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/003_UserAccount.sql delete mode 100644 OpenSim/Data/MySQL/Resources/003_UserStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/004_AssetStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/004_GridStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/004_InventoryStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/004_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/004_UserAccount.sql delete mode 100644 OpenSim/Data/MySQL/Resources/004_UserStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/005_AssetStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/005_GridStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/005_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/005_UserStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/006_AssetStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/006_GridStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/006_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/006_UserStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/007_GridStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/007_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/007_UserStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/008_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/008_UserStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/009_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/010_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/011_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/012_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/013_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/014_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/015_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/016_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/017_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/018_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/019_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/020_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/021_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/022_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/023_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/024_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/025_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/026_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/027_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/028_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/029_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/030_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/031_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/032_RegionStore.sql create mode 100644 OpenSim/Data/MySQL/Resources/AssetStore.migrations rename OpenSim/Data/MySQL/Resources/{001_AuthStore.sql => AuthStore.migrations} (51%) create mode 100644 OpenSim/Data/MySQL/Resources/Avatar.migrations create mode 100644 OpenSim/Data/MySQL/Resources/FriendsStore.migrations rename OpenSim/Data/MySQL/Resources/{001_GridStore.sql => GridStore.migrations} (64%) create mode 100644 OpenSim/Data/MySQL/Resources/InventoryStore.migrations rename OpenSim/Data/MySQL/Resources/{001_LogStore.sql => LogStore.migrations} (95%) create mode 100644 OpenSim/Data/MySQL/Resources/Presence.migrations create mode 100644 OpenSim/Data/MySQL/Resources/RegionStore.migrations create mode 100644 OpenSim/Data/MySQL/Resources/UserAccount.migrations rename OpenSim/Data/MySQL/Resources/{001_UserStore.sql => UserStore.migrations} (72%) diff --git a/OpenSim/Data/MSSQL/Resources/002_Presence.sql b/OpenSim/Data/MSSQL/Resources/002_Presence.sql deleted file mode 100644 index a67671ddf6..0000000000 --- a/OpenSim/Data/MSSQL/Resources/002_Presence.sql +++ /dev/null @@ -1,6 +0,0 @@ -BEGIN TRANSACTION - -CREATE UNIQUE INDEX SessionID ON Presence(SessionID); -CREATE INDEX UserID ON Presence(UserID); - -COMMIT \ No newline at end of file diff --git a/OpenSim/Data/MySQL/Resources/001_AssetStore.sql b/OpenSim/Data/MySQL/Resources/001_AssetStore.sql deleted file mode 100644 index 6a9a127b8f..0000000000 --- a/OpenSim/Data/MySQL/Resources/001_AssetStore.sql +++ /dev/null @@ -1,15 +0,0 @@ -BEGIN; - -CREATE TABLE `assets` ( - `id` binary(16) NOT NULL, - `name` varchar(64) NOT NULL, - `description` varchar(64) NOT NULL, - `assetType` tinyint(4) NOT NULL, - `invType` tinyint(4) NOT NULL, - `local` tinyint(1) NOT NULL, - `temporary` tinyint(1) NOT NULL, - `data` longblob NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Rev. 1'; - -COMMIT; \ No newline at end of file diff --git a/OpenSim/Data/MySQL/Resources/001_Avatar.sql b/OpenSim/Data/MySQL/Resources/001_Avatar.sql deleted file mode 100644 index 27a307244b..0000000000 --- a/OpenSim/Data/MySQL/Resources/001_Avatar.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -CREATE TABLE Avatars (PrincipalID CHAR(36) NOT NULL, Name VARCHAR(32) NOT NULL, Value VARCHAR(255) NOT NULL DEFAULT '', PRIMARY KEY(PrincipalID, Name), KEY(PrincipalID)); - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/001_Friends.sql b/OpenSim/Data/MySQL/Resources/001_Friends.sql deleted file mode 100644 index e158a2c802..0000000000 --- a/OpenSim/Data/MySQL/Resources/001_Friends.sql +++ /dev/null @@ -1,9 +0,0 @@ -BEGIN; - -CREATE TABLE `Friends` ( - `PrincipalID` CHAR(36) NOT NULL, - `FriendID` VARCHAR(255) NOT NULL, - `Flags` CHAR(16) NOT NULL DEFAULT '0' -) ENGINE=InnoDB; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/001_FriendsStore.sql b/OpenSim/Data/MySQL/Resources/001_FriendsStore.sql deleted file mode 100644 index da2c59c6d0..0000000000 --- a/OpenSim/Data/MySQL/Resources/001_FriendsStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -CREATE TABLE `Friends` (`PrincipalID` CHAR(36) NOT NULL, `Friend` VARCHAR(255) NOT NULL, `Flags` VARCHAR(16) NOT NULL DEFAULT 0, `Offered` VARCHAR(32) NOT NULL DEFAULT 0, PRIMARY KEY(`PrincipalID`, `Friend`), KEY(`PrincipalID`)); - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/001_InventoryStore.sql b/OpenSim/Data/MySQL/Resources/001_InventoryStore.sql deleted file mode 100644 index 40dc91cdc6..0000000000 --- a/OpenSim/Data/MySQL/Resources/001_InventoryStore.sql +++ /dev/null @@ -1,40 +0,0 @@ -BEGIN; - -CREATE TABLE `inventoryfolders` ( - `folderID` varchar(36) NOT NULL default '', - `agentID` varchar(36) default NULL, - `parentFolderID` varchar(36) default NULL, - `folderName` varchar(64) default NULL, - `type` smallint NOT NULL default 0, - `version` int NOT NULL default 0, - PRIMARY KEY (`folderID`), - KEY `owner` (`agentID`), - KEY `parent` (`parentFolderID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `inventoryitems` ( - `inventoryID` varchar(36) NOT NULL default '', - `assetID` varchar(36) default NULL, - `assetType` int(11) default NULL, - `parentFolderID` varchar(36) default NULL, - `avatarID` varchar(36) default NULL, - `inventoryName` varchar(64) default NULL, - `inventoryDescription` varchar(128) default NULL, - `inventoryNextPermissions` int(10) unsigned default NULL, - `inventoryCurrentPermissions` int(10) unsigned default NULL, - `invType` int(11) default NULL, - `creatorID` varchar(36) default NULL, - `inventoryBasePermissions` int(10) unsigned NOT NULL default 0, - `inventoryEveryOnePermissions` int(10) unsigned NOT NULL default 0, - `salePrice` int(11) NOT NULL default 0, - `saleType` tinyint(4) NOT NULL default 0, - `creationDate` int(11) NOT NULL default 0, - `groupID` varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000', - `groupOwned` tinyint(4) NOT NULL default 0, - `flags` int(11) unsigned NOT NULL default 0, - PRIMARY KEY (`inventoryID`), - KEY `owner` (`avatarID`), - KEY `folder` (`parentFolderID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -COMMIT; \ No newline at end of file diff --git a/OpenSim/Data/MySQL/Resources/001_Presence.sql b/OpenSim/Data/MySQL/Resources/001_Presence.sql deleted file mode 100644 index 84fa05794c..0000000000 --- a/OpenSim/Data/MySQL/Resources/001_Presence.sql +++ /dev/null @@ -1,13 +0,0 @@ -BEGIN; - -CREATE TABLE `Presence` ( - `UserID` VARCHAR(255) NOT NULL, - `RegionID` CHAR(36) NOT NULL, - `SessionID` CHAR(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000', - `SecureSessionID` CHAR(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000' -) ENGINE=InnoDB; - -CREATE UNIQUE INDEX SessionID ON Presence(SessionID); -CREATE INDEX UserID ON Presence(UserID); - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/001_RegionStore.sql b/OpenSim/Data/MySQL/Resources/001_RegionStore.sql deleted file mode 100644 index 31164b35ed..0000000000 --- a/OpenSim/Data/MySQL/Resources/001_RegionStore.sql +++ /dev/null @@ -1,154 +0,0 @@ -BEGIN; - -CREATE TABLE `prims` ( - `UUID` varchar(255) NOT NULL, - `RegionUUID` varchar(255) default NULL, - `ParentID` int(11) default NULL, - `CreationDate` int(11) default NULL, - `Name` varchar(255) default NULL, - `SceneGroupID` varchar(255) default NULL, - `Text` varchar(255) default NULL, - `Description` varchar(255) default NULL, - `SitName` varchar(255) default NULL, - `TouchName` varchar(255) default NULL, - `ObjectFlags` int(11) default NULL, - `CreatorID` varchar(255) default NULL, - `OwnerID` varchar(255) default NULL, - `GroupID` varchar(255) default NULL, - `LastOwnerID` varchar(255) default NULL, - `OwnerMask` int(11) default NULL, - `NextOwnerMask` int(11) default NULL, - `GroupMask` int(11) default NULL, - `EveryoneMask` int(11) default NULL, - `BaseMask` int(11) default NULL, - `PositionX` float default NULL, - `PositionY` float default NULL, - `PositionZ` float default NULL, - `GroupPositionX` float default NULL, - `GroupPositionY` float default NULL, - `GroupPositionZ` float default NULL, - `VelocityX` float default NULL, - `VelocityY` float default NULL, - `VelocityZ` float default NULL, - `AngularVelocityX` float default NULL, - `AngularVelocityY` float default NULL, - `AngularVelocityZ` float default NULL, - `AccelerationX` float default NULL, - `AccelerationY` float default NULL, - `AccelerationZ` float default NULL, - `RotationX` float default NULL, - `RotationY` float default NULL, - `RotationZ` float default NULL, - `RotationW` float default NULL, - `SitTargetOffsetX` float default NULL, - `SitTargetOffsetY` float default NULL, - `SitTargetOffsetZ` float default NULL, - `SitTargetOrientW` float default NULL, - `SitTargetOrientX` float default NULL, - `SitTargetOrientY` float default NULL, - `SitTargetOrientZ` float default NULL, - PRIMARY KEY (`UUID`) -) ENGINE=MyISAM DEFAULT CHARSET=latin1; - -CREATE TABLE `primshapes` ( - `UUID` varchar(255) NOT NULL, - `Shape` int(11) default NULL, - `ScaleX` float default NULL, - `ScaleY` float default NULL, - `ScaleZ` float default NULL, - `PCode` int(11) default NULL, - `PathBegin` int(11) default NULL, - `PathEnd` int(11) default NULL, - `PathScaleX` int(11) default NULL, - `PathScaleY` int(11) default NULL, - `PathShearX` int(11) default NULL, - `PathShearY` int(11) default NULL, - `PathSkew` int(11) default NULL, - `PathCurve` int(11) default NULL, - `PathRadiusOffset` int(11) default NULL, - `PathRevolutions` int(11) default NULL, - `PathTaperX` int(11) default NULL, - `PathTaperY` int(11) default NULL, - `PathTwist` int(11) default NULL, - `PathTwistBegin` int(11) default NULL, - `ProfileBegin` int(11) default NULL, - `ProfileEnd` int(11) default NULL, - `ProfileCurve` int(11) default NULL, - `ProfileHollow` int(11) default NULL, - `State` int(11) default NULL, - `Texture` longblob, - `ExtraParams` longblob, - PRIMARY KEY (`UUID`) -) ENGINE=MyISAM DEFAULT CHARSET=latin1; - -CREATE TABLE `primitems` ( - `itemID` varchar(255) NOT NULL, - `primID` varchar(255) default NULL, - `assetID` varchar(255) default NULL, - `parentFolderID` varchar(255) default NULL, - `invType` int(11) default NULL, - `assetType` int(11) default NULL, - `name` varchar(255) default NULL, - `description` varchar(255) default NULL, - `creationDate` bigint(20) default NULL, - `creatorID` varchar(255) default NULL, - `ownerID` varchar(255) default NULL, - `lastOwnerID` varchar(255) default NULL, - `groupID` varchar(255) default NULL, - `nextPermissions` int(11) default NULL, - `currentPermissions` int(11) default NULL, - `basePermissions` int(11) default NULL, - `everyonePermissions` int(11) default NULL, - `groupPermissions` int(11) default NULL, - PRIMARY KEY (`itemID`) -) ENGINE=MyISAM DEFAULT CHARSET=latin1; - -CREATE TABLE `terrain` ( - `RegionUUID` varchar(255) default NULL, - `Revision` int(11) default NULL, - `Heightfield` longblob -) ENGINE=MyISAM DEFAULT CHARSET=latin1; - -CREATE TABLE `land` ( - `UUID` varchar(255) NOT NULL, - `RegionUUID` varchar(255) default NULL, - `LocalLandID` int(11) default NULL, - `Bitmap` longblob, - `Name` varchar(255) default NULL, - `Description` varchar(255) default NULL, - `OwnerUUID` varchar(255) default NULL, - `IsGroupOwned` int(11) default NULL, - `Area` int(11) default NULL, - `AuctionID` int(11) default NULL, - `Category` int(11) default NULL, - `ClaimDate` int(11) default NULL, - `ClaimPrice` int(11) default NULL, - `GroupUUID` varchar(255) default NULL, - `SalePrice` int(11) default NULL, - `LandStatus` int(11) default NULL, - `LandFlags` int(11) default NULL, - `LandingType` int(11) default NULL, - `MediaAutoScale` int(11) default NULL, - `MediaTextureUUID` varchar(255) default NULL, - `MediaURL` varchar(255) default NULL, - `MusicURL` varchar(255) default NULL, - `PassHours` float default NULL, - `PassPrice` int(11) default NULL, - `SnapshotUUID` varchar(255) default NULL, - `UserLocationX` float default NULL, - `UserLocationY` float default NULL, - `UserLocationZ` float default NULL, - `UserLookAtX` float default NULL, - `UserLookAtY` float default NULL, - `UserLookAtZ` float default NULL, - `AuthbuyerID` varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000', - PRIMARY KEY (`UUID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `landaccesslist` ( - `LandUUID` varchar(255) default NULL, - `AccessUUID` varchar(255) default NULL, - `Flags` int(11) default NULL -) ENGINE=MyISAM DEFAULT CHARSET=latin1; - -COMMIT; \ No newline at end of file diff --git a/OpenSim/Data/MySQL/Resources/001_UserAccount.sql b/OpenSim/Data/MySQL/Resources/001_UserAccount.sql deleted file mode 100644 index 07da57118d..0000000000 --- a/OpenSim/Data/MySQL/Resources/001_UserAccount.sql +++ /dev/null @@ -1,13 +0,0 @@ -BEGIN; - -CREATE TABLE `UserAccounts` ( - `PrincipalID` CHAR(36) NOT NULL, - `ScopeID` CHAR(36) NOT NULL, - `FirstName` VARCHAR(64) NOT NULL, - `LastName` VARCHAR(64) NOT NULL, - `Email` VARCHAR(64), - `ServiceURLs` TEXT, - `Created` INT(11) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/002_AssetStore.sql b/OpenSim/Data/MySQL/Resources/002_AssetStore.sql deleted file mode 100644 index a7d7fca8c5..0000000000 --- a/OpenSim/Data/MySQL/Resources/002_AssetStore.sql +++ /dev/null @@ -1,9 +0,0 @@ -BEGIN; - -ALTER TABLE assets change id oldid binary(16); -ALTER TABLE assets add id varchar(36) not null default ''; -UPDATE assets set id = concat(substr(hex(oldid),1,8),"-",substr(hex(oldid),9,4),"-",substr(hex(oldid),13,4),"-",substr(hex(oldid),17,4),"-",substr(hex(oldid),21,12)); -ALTER TABLE assets drop oldid; -ALTER TABLE assets add constraint primary key(id); - -COMMIT; \ No newline at end of file diff --git a/OpenSim/Data/MySQL/Resources/002_AuthStore.sql b/OpenSim/Data/MySQL/Resources/002_AuthStore.sql deleted file mode 100644 index dc7dfe0115..0000000000 --- a/OpenSim/Data/MySQL/Resources/002_AuthStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -INSERT INTO auth (UUID, passwordHash, passwordSalt, webLoginKey) SELECT `UUID` AS UUID, `passwordHash` AS passwordHash, `passwordSalt` AS passwordSalt, `webLoginKey` AS webLoginKey FROM users; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/002_Friends.sql b/OpenSim/Data/MySQL/Resources/002_Friends.sql deleted file mode 100644 index 5ff64389f1..0000000000 --- a/OpenSim/Data/MySQL/Resources/002_Friends.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -INSERT INTO Friends (PrincipalID, FriendID, Flags) SELECT ownerID, friendID, friendPerms FROM userfriends; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/002_FriendsStore.sql b/OpenSim/Data/MySQL/Resources/002_FriendsStore.sql deleted file mode 100644 index a3638678c8..0000000000 --- a/OpenSim/Data/MySQL/Resources/002_FriendsStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -INSERT INTO `Friends` SELECT `ownerID`, `friendID`, `friendPerms`, 0 FROM `userfriends`; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/002_GridStore.sql b/OpenSim/Data/MySQL/Resources/002_GridStore.sql deleted file mode 100644 index 35b9be122e..0000000000 --- a/OpenSim/Data/MySQL/Resources/002_GridStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -ALTER TABLE regions add column access integer unsigned default 1; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/002_InventoryStore.sql b/OpenSim/Data/MySQL/Resources/002_InventoryStore.sql deleted file mode 100644 index c161a687e2..0000000000 --- a/OpenSim/Data/MySQL/Resources/002_InventoryStore.sql +++ /dev/null @@ -1,31 +0,0 @@ -BEGIN; - -ALTER TABLE inventoryfolders change folderID folderIDold varchar(36); -ALTER TABLE inventoryfolders change agentID agentIDold varchar(36); -ALTER TABLE inventoryfolders change parentFolderID parentFolderIDold varchar(36); -ALTER TABLE inventoryfolders add folderID char(36) not null default '00000000-0000-0000-0000-000000000000'; -ALTER TABLE inventoryfolders add agentID char(36) default NULL; -ALTER TABLE inventoryfolders add parentFolderID char(36) default NULL; -UPDATE inventoryfolders set folderID = folderIDold, agentID = agentIDold, parentFolderID = parentFolderIDold; -ALTER TABLE inventoryfolders drop folderIDold; -ALTER TABLE inventoryfolders drop agentIDold; -ALTER TABLE inventoryfolders drop parentFolderIDold; -ALTER TABLE inventoryfolders add constraint primary key(folderID); -ALTER TABLE inventoryfolders add index inventoryfolders_agentid(agentID); -ALTER TABLE inventoryfolders add index inventoryfolders_parentFolderid(parentFolderID); - -ALTER TABLE inventoryitems change inventoryID inventoryIDold varchar(36); -ALTER TABLE inventoryitems change avatarID avatarIDold varchar(36); -ALTER TABLE inventoryitems change parentFolderID parentFolderIDold varchar(36); -ALTER TABLE inventoryitems add inventoryID char(36) not null default '00000000-0000-0000-0000-000000000000'; -ALTER TABLE inventoryitems add avatarID char(36) default NULL; -ALTER TABLE inventoryitems add parentFolderID char(36) default NULL; -UPDATE inventoryitems set inventoryID = inventoryIDold, avatarID = avatarIDold, parentFolderID = parentFolderIDold; -ALTER TABLE inventoryitems drop inventoryIDold; -ALTER TABLE inventoryitems drop avatarIDold; -ALTER TABLE inventoryitems drop parentFolderIDold; -ALTER TABLE inventoryitems add constraint primary key(inventoryID); -ALTER TABLE inventoryitems add index inventoryitems_avatarid(avatarID); -ALTER TABLE inventoryitems add index inventoryitems_parentFolderid(parentFolderID); - -COMMIT; \ No newline at end of file diff --git a/OpenSim/Data/MySQL/Resources/002_RegionStore.sql b/OpenSim/Data/MySQL/Resources/002_RegionStore.sql deleted file mode 100644 index 45bf959d40..0000000000 --- a/OpenSim/Data/MySQL/Resources/002_RegionStore.sql +++ /dev/null @@ -1,6 +0,0 @@ -BEGIN; - -CREATE index prims_regionuuid on prims(RegionUUID); -CREATE index primitems_primid on primitems(primID); - -COMMIT; \ No newline at end of file diff --git a/OpenSim/Data/MySQL/Resources/002_UserAccount.sql b/OpenSim/Data/MySQL/Resources/002_UserAccount.sql deleted file mode 100644 index ad2ddda239..0000000000 --- a/OpenSim/Data/MySQL/Resources/002_UserAccount.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -INSERT INTO UserAccounts (PrincipalID, ScopeID, FirstName, LastName, Email, ServiceURLs, Created) SELECT `UUID` AS PrincipalID, '00000000-0000-0000-0000-000000000000' AS ScopeID, username AS FirstName, lastname AS LastName, email as Email, CONCAT('AssetServerURI=', userAssetURI, ' InventoryServerURI=', userInventoryURI, ' GatewayURI= HomeURI=') AS ServiceURLs, created as Created FROM users; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/002_UserStore.sql b/OpenSim/Data/MySQL/Resources/002_UserStore.sql deleted file mode 100644 index 393cea0f12..0000000000 --- a/OpenSim/Data/MySQL/Resources/002_UserStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -ALTER TABLE users add homeRegionID char(36) NOT NULL default '00000000-0000-0000-0000-000000000000'; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/003_AssetStore.sql b/OpenSim/Data/MySQL/Resources/003_AssetStore.sql deleted file mode 100644 index d489278f13..0000000000 --- a/OpenSim/Data/MySQL/Resources/003_AssetStore.sql +++ /dev/null @@ -1,9 +0,0 @@ -BEGIN; - -ALTER TABLE assets change id oldid varchar(36); -ALTER TABLE assets add id char(36) not null default '00000000-0000-0000-0000-000000000000'; -UPDATE assets set id = oldid; -ALTER TABLE assets drop oldid; -ALTER TABLE assets add constraint primary key(id); - -COMMIT; \ No newline at end of file diff --git a/OpenSim/Data/MySQL/Resources/003_AuthStore.sql b/OpenSim/Data/MySQL/Resources/003_AuthStore.sql deleted file mode 100644 index af9ffe6f1d..0000000000 --- a/OpenSim/Data/MySQL/Resources/003_AuthStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -ALTER TABLE `auth` ADD COLUMN `accountType` VARCHAR(32) NOT NULL DEFAULT 'UserAccount'; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/003_GridStore.sql b/OpenSim/Data/MySQL/Resources/003_GridStore.sql deleted file mode 100644 index bc3fe7df7a..0000000000 --- a/OpenSim/Data/MySQL/Resources/003_GridStore.sql +++ /dev/null @@ -1,7 +0,0 @@ -BEGIN; - -ALTER TABLE regions add column ScopeID char(36) not null default '00000000-0000-0000-0000-000000000000'; - -create index ScopeID on regions(ScopeID); - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/003_InventoryStore.sql b/OpenSim/Data/MySQL/Resources/003_InventoryStore.sql deleted file mode 100644 index 4c6da91aab..0000000000 --- a/OpenSim/Data/MySQL/Resources/003_InventoryStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -alter table inventoryitems add column inventoryGroupPermissions integer unsigned not null default 0; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/003_RegionStore.sql b/OpenSim/Data/MySQL/Resources/003_RegionStore.sql deleted file mode 100644 index cb0a6141cc..0000000000 --- a/OpenSim/Data/MySQL/Resources/003_RegionStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - - CREATE TABLE regionban (regionUUID VARCHAR(36) NOT NULL, bannedUUID VARCHAR(36) NOT NULL, bannedIp VARCHAR(16) NOT NULL, bannedIpHostMask VARCHAR(16) NOT NULL) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='Rev. 1'; - -COMMIT; \ No newline at end of file diff --git a/OpenSim/Data/MySQL/Resources/003_UserAccount.sql b/OpenSim/Data/MySQL/Resources/003_UserAccount.sql deleted file mode 100644 index e42d93b92c..0000000000 --- a/OpenSim/Data/MySQL/Resources/003_UserAccount.sql +++ /dev/null @@ -1,9 +0,0 @@ -BEGIN; - -CREATE UNIQUE INDEX PrincipalID ON UserAccounts(PrincipalID); -CREATE INDEX Email ON UserAccounts(Email); -CREATE INDEX FirstName ON UserAccounts(FirstName); -CREATE INDEX LastName ON UserAccounts(LastName); -CREATE INDEX Name ON UserAccounts(FirstName,LastName); - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/003_UserStore.sql b/OpenSim/Data/MySQL/Resources/003_UserStore.sql deleted file mode 100644 index 6f890eeec1..0000000000 --- a/OpenSim/Data/MySQL/Resources/003_UserStore.sql +++ /dev/null @@ -1,6 +0,0 @@ -BEGIN; - -ALTER TABLE users add userFlags integer NOT NULL default 0; -ALTER TABLE users add godLevel integer NOT NULL default 0; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/004_AssetStore.sql b/OpenSim/Data/MySQL/Resources/004_AssetStore.sql deleted file mode 100644 index ae1951df39..0000000000 --- a/OpenSim/Data/MySQL/Resources/004_AssetStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -ALTER TABLE assets drop InvType; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/004_GridStore.sql b/OpenSim/Data/MySQL/Resources/004_GridStore.sql deleted file mode 100644 index 2238a888ea..0000000000 --- a/OpenSim/Data/MySQL/Resources/004_GridStore.sql +++ /dev/null @@ -1,6 +0,0 @@ -BEGIN; - -ALTER TABLE regions add column sizeX integer not null default 0; -ALTER TABLE regions add column sizeY integer not null default 0; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/004_InventoryStore.sql b/OpenSim/Data/MySQL/Resources/004_InventoryStore.sql deleted file mode 100644 index c45f773904..0000000000 --- a/OpenSim/Data/MySQL/Resources/004_InventoryStore.sql +++ /dev/null @@ -1,7 +0,0 @@ -BEGIN; - -update inventoryitems set creatorID = '00000000-0000-0000-0000-000000000000' where creatorID is NULL; -update inventoryitems set creatorID = '00000000-0000-0000-0000-000000000000' where creatorID = ''; -alter table inventoryitems modify column creatorID varchar(36) not NULL default '00000000-0000-0000-0000-000000000000'; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/004_RegionStore.sql b/OpenSim/Data/MySQL/Resources/004_RegionStore.sql deleted file mode 100644 index 4db2f7587d..0000000000 --- a/OpenSim/Data/MySQL/Resources/004_RegionStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -ALTER TABLE primitems add flags integer not null default 0; - -COMMIT; \ No newline at end of file diff --git a/OpenSim/Data/MySQL/Resources/004_UserAccount.sql b/OpenSim/Data/MySQL/Resources/004_UserAccount.sql deleted file mode 100644 index 8abcd53a16..0000000000 --- a/OpenSim/Data/MySQL/Resources/004_UserAccount.sql +++ /dev/null @@ -1,8 +0,0 @@ -BEGIN; - -ALTER TABLE UserAccounts ADD COLUMN UserLevel integer NOT NULL DEFAULT 0; -ALTER TABLE UserAccounts ADD COLUMN UserFlags integer NOT NULL DEFAULT 0; -ALTER TABLE UserAccounts ADD COLUMN UserTitle varchar(64) NOT NULL DEFAULT ''; - -COMMIT; - diff --git a/OpenSim/Data/MySQL/Resources/004_UserStore.sql b/OpenSim/Data/MySQL/Resources/004_UserStore.sql deleted file mode 100644 index 03142afa37..0000000000 --- a/OpenSim/Data/MySQL/Resources/004_UserStore.sql +++ /dev/null @@ -1,6 +0,0 @@ -BEGIN; - -ALTER TABLE users add customType varchar(32) not null default ''; -ALTER TABLE users add partner char(36) not null default '00000000-0000-0000-0000-000000000000'; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/005_AssetStore.sql b/OpenSim/Data/MySQL/Resources/005_AssetStore.sql deleted file mode 100644 index bfeb6525af..0000000000 --- a/OpenSim/Data/MySQL/Resources/005_AssetStore.sql +++ /dev/null @@ -1,6 +0,0 @@ -BEGIN; - -ALTER TABLE assets add create_time integer default 0; -ALTER TABLE assets add access_time integer default 0; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/005_GridStore.sql b/OpenSim/Data/MySQL/Resources/005_GridStore.sql deleted file mode 100644 index 835ba89369..0000000000 --- a/OpenSim/Data/MySQL/Resources/005_GridStore.sql +++ /dev/null @@ -1,6 +0,0 @@ -BEGIN; - -ALTER TABLE `regions` ADD COLUMN `flags` integer NOT NULL DEFAULT 0; -CREATE INDEX flags ON regions(flags); - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/005_RegionStore.sql b/OpenSim/Data/MySQL/Resources/005_RegionStore.sql deleted file mode 100644 index c4a9527403..0000000000 --- a/OpenSim/Data/MySQL/Resources/005_RegionStore.sql +++ /dev/null @@ -1,40 +0,0 @@ -BEGIN; - -create table regionsettings ( - regionUUID char(36) not null, - block_terraform integer not null, - block_fly integer not null, - allow_damage integer not null, - restrict_pushing integer not null, - allow_land_resell integer not null, - allow_land_join_divide integer not null, - block_show_in_search integer not null, - agent_limit integer not null, - object_bonus float not null, - maturity integer not null, - disable_scripts integer not null, - disable_collisions integer not null, - disable_physics integer not null, - terrain_texture_1 char(36) not null, - terrain_texture_2 char(36) not null, - terrain_texture_3 char(36) not null, - terrain_texture_4 char(36) not null, - elevation_1_nw float not null, - elevation_2_nw float not null, - elevation_1_ne float not null, - elevation_2_ne float not null, - elevation_1_se float not null, - elevation_2_se float not null, - elevation_1_sw float not null, - elevation_2_sw float not null, - water_height float not null, - terrain_raise_limit float not null, - terrain_lower_limit float not null, - use_estate_sun integer not null, - fixed_sun integer not null, - sun_position float not null, - covenant char(36), - primary key(regionUUID) -); - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/005_UserStore.sql b/OpenSim/Data/MySQL/Resources/005_UserStore.sql deleted file mode 100644 index 55896bc9a0..0000000000 --- a/OpenSim/Data/MySQL/Resources/005_UserStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -CREATE TABLE `avatarattachments` (`UUID` char(36) NOT NULL, `attachpoint` int(11) NOT NULL, `item` char(36) NOT NULL, `asset` char(36) NOT NULL) ENGINE=InnoDB; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/006_AssetStore.sql b/OpenSim/Data/MySQL/Resources/006_AssetStore.sql deleted file mode 100644 index 31043537a3..0000000000 --- a/OpenSim/Data/MySQL/Resources/006_AssetStore.sql +++ /dev/null @@ -1 +0,0 @@ -DELETE FROM assets WHERE id = 'dc4b9f0b-d008-45c6-96a4-01dd947ac621' diff --git a/OpenSim/Data/MySQL/Resources/006_GridStore.sql b/OpenSim/Data/MySQL/Resources/006_GridStore.sql deleted file mode 100644 index 91322d6431..0000000000 --- a/OpenSim/Data/MySQL/Resources/006_GridStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -ALTER TABLE `regions` ADD COLUMN `last_seen` integer NOT NULL DEFAULT 0; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/006_RegionStore.sql b/OpenSim/Data/MySQL/Resources/006_RegionStore.sql deleted file mode 100644 index c1ba5b808d..0000000000 --- a/OpenSim/Data/MySQL/Resources/006_RegionStore.sql +++ /dev/null @@ -1,12 +0,0 @@ -BEGIN; - -alter table landaccesslist ENGINE = InnoDB; -alter table migrations ENGINE = InnoDB; -alter table primitems ENGINE = InnoDB; -alter table prims ENGINE = InnoDB; -alter table primshapes ENGINE = InnoDB; -alter table regionsettings ENGINE = InnoDB; -alter table terrain ENGINE = InnoDB; - -COMMIT; - diff --git a/OpenSim/Data/MySQL/Resources/006_UserStore.sql b/OpenSim/Data/MySQL/Resources/006_UserStore.sql deleted file mode 100644 index 10b321e601..0000000000 --- a/OpenSim/Data/MySQL/Resources/006_UserStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -ALTER TABLE agents add currentLookAt varchar(36) not null default ''; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/007_GridStore.sql b/OpenSim/Data/MySQL/Resources/007_GridStore.sql deleted file mode 100644 index dbec58432e..0000000000 --- a/OpenSim/Data/MySQL/Resources/007_GridStore.sql +++ /dev/null @@ -1,7 +0,0 @@ -BEGIN; - -ALTER TABLE `regions` ADD COLUMN `PrincipalID` char(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000'; -ALTER TABLE `regions` ADD COLUMN `Token` varchar(255) NOT NULL; - -COMMIT; - diff --git a/OpenSim/Data/MySQL/Resources/007_RegionStore.sql b/OpenSim/Data/MySQL/Resources/007_RegionStore.sql deleted file mode 100644 index 404d248e6b..0000000000 --- a/OpenSim/Data/MySQL/Resources/007_RegionStore.sql +++ /dev/null @@ -1,25 +0,0 @@ -BEGIN; - -ALTER TABLE prims change UUID UUIDold varchar(255); -ALTER TABLE prims change RegionUUID RegionUUIDold varchar(255); -ALTER TABLE prims change CreatorID CreatorIDold varchar(255); -ALTER TABLE prims change OwnerID OwnerIDold varchar(255); -ALTER TABLE prims change GroupID GroupIDold varchar(255); -ALTER TABLE prims change LastOwnerID LastOwnerIDold varchar(255); -ALTER TABLE prims add UUID char(36); -ALTER TABLE prims add RegionUUID char(36); -ALTER TABLE prims add CreatorID char(36); -ALTER TABLE prims add OwnerID char(36); -ALTER TABLE prims add GroupID char(36); -ALTER TABLE prims add LastOwnerID char(36); -UPDATE prims set UUID = UUIDold, RegionUUID = RegionUUIDold, CreatorID = CreatorIDold, OwnerID = OwnerIDold, GroupID = GroupIDold, LastOwnerID = LastOwnerIDold; -ALTER TABLE prims drop UUIDold; -ALTER TABLE prims drop RegionUUIDold; -ALTER TABLE prims drop CreatorIDold; -ALTER TABLE prims drop OwnerIDold; -ALTER TABLE prims drop GroupIDold; -ALTER TABLE prims drop LastOwnerIDold; -ALTER TABLE prims add constraint primary key(UUID); -ALTER TABLE prims add index prims_regionuuid(RegionUUID); - -COMMIT; \ No newline at end of file diff --git a/OpenSim/Data/MySQL/Resources/007_UserStore.sql b/OpenSim/Data/MySQL/Resources/007_UserStore.sql deleted file mode 100644 index 3ab5261373..0000000000 --- a/OpenSim/Data/MySQL/Resources/007_UserStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -ALTER TABLE users add email varchar(250); - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/008_RegionStore.sql b/OpenSim/Data/MySQL/Resources/008_RegionStore.sql deleted file mode 100644 index 7bc61c04e4..0000000000 --- a/OpenSim/Data/MySQL/Resources/008_RegionStore.sql +++ /dev/null @@ -1,9 +0,0 @@ -BEGIN; - -ALTER TABLE primshapes change UUID UUIDold varchar(255); -ALTER TABLE primshapes add UUID char(36); -UPDATE primshapes set UUID = UUIDold; -ALTER TABLE primshapes drop UUIDold; -ALTER TABLE primshapes add constraint primary key(UUID); - -COMMIT; \ No newline at end of file diff --git a/OpenSim/Data/MySQL/Resources/008_UserStore.sql b/OpenSim/Data/MySQL/Resources/008_UserStore.sql deleted file mode 100644 index 4500bd5d7b..0000000000 --- a/OpenSim/Data/MySQL/Resources/008_UserStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -ALTER TABLE users add scopeID char(36) not null default '00000000-0000-0000-0000-000000000000'; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/009_RegionStore.sql b/OpenSim/Data/MySQL/Resources/009_RegionStore.sql deleted file mode 100644 index 284732aa6f..0000000000 --- a/OpenSim/Data/MySQL/Resources/009_RegionStore.sql +++ /dev/null @@ -1,31 +0,0 @@ -BEGIN; - -ALTER TABLE primitems change itemID itemIDold varchar(255); -ALTER TABLE primitems change primID primIDold varchar(255); -ALTER TABLE primitems change assetID assetIDold varchar(255); -ALTER TABLE primitems change parentFolderID parentFolderIDold varchar(255); -ALTER TABLE primitems change creatorID creatorIDold varchar(255); -ALTER TABLE primitems change ownerID ownerIDold varchar(255); -ALTER TABLE primitems change groupID groupIDold varchar(255); -ALTER TABLE primitems change lastOwnerID lastOwnerIDold varchar(255); -ALTER TABLE primitems add itemID char(36); -ALTER TABLE primitems add primID char(36); -ALTER TABLE primitems add assetID char(36); -ALTER TABLE primitems add parentFolderID char(36); -ALTER TABLE primitems add creatorID char(36); -ALTER TABLE primitems add ownerID char(36); -ALTER TABLE primitems add groupID char(36); -ALTER TABLE primitems add lastOwnerID char(36); -UPDATE primitems set itemID = itemIDold, primID = primIDold, assetID = assetIDold, parentFolderID = parentFolderIDold, creatorID = creatorIDold, ownerID = ownerIDold, groupID = groupIDold, lastOwnerID = lastOwnerIDold; -ALTER TABLE primitems drop itemIDold; -ALTER TABLE primitems drop primIDold; -ALTER TABLE primitems drop assetIDold; -ALTER TABLE primitems drop parentFolderIDold; -ALTER TABLE primitems drop creatorIDold; -ALTER TABLE primitems drop ownerIDold; -ALTER TABLE primitems drop groupIDold; -ALTER TABLE primitems drop lastOwnerIDold; -ALTER TABLE primitems add constraint primary key(itemID); -ALTER TABLE primitems add index primitems_primid(primID); - -COMMIT; \ No newline at end of file diff --git a/OpenSim/Data/MySQL/Resources/010_RegionStore.sql b/OpenSim/Data/MySQL/Resources/010_RegionStore.sql deleted file mode 100644 index 031a746aeb..0000000000 --- a/OpenSim/Data/MySQL/Resources/010_RegionStore.sql +++ /dev/null @@ -1,9 +0,0 @@ -# 1 "010_RegionStore.sql" -# 1 "" -# 1 "" -# 1 "010_RegionStore.sql" -BEGIN; - -DELETE FROM regionsettings; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/011_RegionStore.sql b/OpenSim/Data/MySQL/Resources/011_RegionStore.sql deleted file mode 100644 index ab0196934a..0000000000 --- a/OpenSim/Data/MySQL/Resources/011_RegionStore.sql +++ /dev/null @@ -1,9 +0,0 @@ -BEGIN; - -ALTER TABLE prims change SceneGroupID SceneGroupIDold varchar(255); -ALTER TABLE prims add SceneGroupID char(36); -UPDATE prims set SceneGroupID = SceneGroupIDold; -ALTER TABLE prims drop SceneGroupIDold; -ALTER TABLE prims add index prims_scenegroupid(SceneGroupID); - -COMMIT; \ No newline at end of file diff --git a/OpenSim/Data/MySQL/Resources/012_RegionStore.sql b/OpenSim/Data/MySQL/Resources/012_RegionStore.sql deleted file mode 100644 index 95c27573de..0000000000 --- a/OpenSim/Data/MySQL/Resources/012_RegionStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -ALTER TABLE prims add index prims_parentid(ParentID); - -COMMIT; \ No newline at end of file diff --git a/OpenSim/Data/MySQL/Resources/013_RegionStore.sql b/OpenSim/Data/MySQL/Resources/013_RegionStore.sql deleted file mode 100644 index a6bd30da50..0000000000 --- a/OpenSim/Data/MySQL/Resources/013_RegionStore.sql +++ /dev/null @@ -1,103 +0,0 @@ -begin; - -drop table regionsettings; - -CREATE TABLE `regionsettings` ( - `regionUUID` char(36) NOT NULL, - `block_terraform` int(11) NOT NULL, - `block_fly` int(11) NOT NULL, - `allow_damage` int(11) NOT NULL, - `restrict_pushing` int(11) NOT NULL, - `allow_land_resell` int(11) NOT NULL, - `allow_land_join_divide` int(11) NOT NULL, - `block_show_in_search` int(11) NOT NULL, - `agent_limit` int(11) NOT NULL, - `object_bonus` float NOT NULL, - `maturity` int(11) NOT NULL, - `disable_scripts` int(11) NOT NULL, - `disable_collisions` int(11) NOT NULL, - `disable_physics` int(11) NOT NULL, - `terrain_texture_1` char(36) NOT NULL, - `terrain_texture_2` char(36) NOT NULL, - `terrain_texture_3` char(36) NOT NULL, - `terrain_texture_4` char(36) NOT NULL, - `elevation_1_nw` float NOT NULL, - `elevation_2_nw` float NOT NULL, - `elevation_1_ne` float NOT NULL, - `elevation_2_ne` float NOT NULL, - `elevation_1_se` float NOT NULL, - `elevation_2_se` float NOT NULL, - `elevation_1_sw` float NOT NULL, - `elevation_2_sw` float NOT NULL, - `water_height` float NOT NULL, - `terrain_raise_limit` float NOT NULL, - `terrain_lower_limit` float NOT NULL, - `use_estate_sun` int(11) NOT NULL, - `fixed_sun` int(11) NOT NULL, - `sun_position` float NOT NULL, - `covenant` char(36) default NULL, - `Sandbox` tinyint(4) NOT NULL, - PRIMARY KEY (`regionUUID`) -) ENGINE=InnoDB; - -CREATE TABLE `estate_managers` ( - `EstateID` int(10) unsigned NOT NULL, - `uuid` char(36) NOT NULL, - KEY `EstateID` (`EstateID`) -) ENGINE=InnoDB; - -CREATE TABLE `estate_groups` ( - `EstateID` int(10) unsigned NOT NULL, - `uuid` char(36) NOT NULL, - KEY `EstateID` (`EstateID`) -) ENGINE=InnoDB; - -CREATE TABLE `estate_users` ( - `EstateID` int(10) unsigned NOT NULL, - `uuid` char(36) NOT NULL, - KEY `EstateID` (`EstateID`) -) ENGINE=InnoDB; - -CREATE TABLE `estateban` ( - `EstateID` int(10) unsigned NOT NULL, - `bannedUUID` varchar(36) NOT NULL, - `bannedIp` varchar(16) NOT NULL, - `bannedIpHostMask` varchar(16) NOT NULL, - `bannedNameMask` varchar(64) default NULL, - KEY `estateban_EstateID` (`EstateID`) -) ENGINE=InnoDB; - -CREATE TABLE `estate_settings` ( - `EstateID` int(10) unsigned NOT NULL auto_increment, - `EstateName` varchar(64) default NULL, - `AbuseEmailToEstateOwner` tinyint(4) NOT NULL, - `DenyAnonymous` tinyint(4) NOT NULL, - `ResetHomeOnTeleport` tinyint(4) NOT NULL, - `FixedSun` tinyint(4) NOT NULL, - `DenyTransacted` tinyint(4) NOT NULL, - `BlockDwell` tinyint(4) NOT NULL, - `DenyIdentified` tinyint(4) NOT NULL, - `AllowVoice` tinyint(4) NOT NULL, - `UseGlobalTime` tinyint(4) NOT NULL, - `PricePerMeter` int(11) NOT NULL, - `TaxFree` tinyint(4) NOT NULL, - `AllowDirectTeleport` tinyint(4) NOT NULL, - `RedirectGridX` int(11) NOT NULL, - `RedirectGridY` int(11) NOT NULL, - `ParentEstateID` int(10) unsigned NOT NULL, - `SunPosition` double NOT NULL, - `EstateSkipScripts` tinyint(4) NOT NULL, - `BillableFactor` float NOT NULL, - `PublicAccess` tinyint(4) NOT NULL, - PRIMARY KEY (`EstateID`) -) ENGINE=InnoDB AUTO_INCREMENT=100; - -CREATE TABLE `estate_map` ( - `RegionID` char(36) NOT NULL default '00000000-0000-0000-0000-000000000000', - `EstateID` int(11) NOT NULL, - PRIMARY KEY (`RegionID`), - KEY `EstateID` (`EstateID`) -) ENGINE=InnoDB; - -commit; - diff --git a/OpenSim/Data/MySQL/Resources/014_RegionStore.sql b/OpenSim/Data/MySQL/Resources/014_RegionStore.sql deleted file mode 100644 index 788fd63c42..0000000000 --- a/OpenSim/Data/MySQL/Resources/014_RegionStore.sql +++ /dev/null @@ -1,8 +0,0 @@ -begin; - -alter table estate_settings add column AbuseEmail varchar(255) not null; - -alter table estate_settings add column EstateOwner varchar(36) not null; - -commit; - diff --git a/OpenSim/Data/MySQL/Resources/015_RegionStore.sql b/OpenSim/Data/MySQL/Resources/015_RegionStore.sql deleted file mode 100644 index 6d4f9f332f..0000000000 --- a/OpenSim/Data/MySQL/Resources/015_RegionStore.sql +++ /dev/null @@ -1,6 +0,0 @@ -begin; - -alter table estate_settings add column DenyMinors tinyint not null; - -commit; - diff --git a/OpenSim/Data/MySQL/Resources/016_RegionStore.sql b/OpenSim/Data/MySQL/Resources/016_RegionStore.sql deleted file mode 100644 index 9bc265e5ff..0000000000 --- a/OpenSim/Data/MySQL/Resources/016_RegionStore.sql +++ /dev/null @@ -1,27 +0,0 @@ -BEGIN; - -ALTER TABLE prims ADD COLUMN PayPrice integer not null default 0; -ALTER TABLE prims ADD COLUMN PayButton1 integer not null default 0; -ALTER TABLE prims ADD COLUMN PayButton2 integer not null default 0; -ALTER TABLE prims ADD COLUMN PayButton3 integer not null default 0; -ALTER TABLE prims ADD COLUMN PayButton4 integer not null default 0; -ALTER TABLE prims ADD COLUMN LoopedSound char(36) not null default '00000000-0000-0000-0000-000000000000'; -ALTER TABLE prims ADD COLUMN LoopedSoundGain float not null default 0.0; -ALTER TABLE prims ADD COLUMN TextureAnimation blob; -ALTER TABLE prims ADD COLUMN OmegaX float not null default 0.0; -ALTER TABLE prims ADD COLUMN OmegaY float not null default 0.0; -ALTER TABLE prims ADD COLUMN OmegaZ float not null default 0.0; -ALTER TABLE prims ADD COLUMN CameraEyeOffsetX float not null default 0.0; -ALTER TABLE prims ADD COLUMN CameraEyeOffsetY float not null default 0.0; -ALTER TABLE prims ADD COLUMN CameraEyeOffsetZ float not null default 0.0; -ALTER TABLE prims ADD COLUMN CameraAtOffsetX float not null default 0.0; -ALTER TABLE prims ADD COLUMN CameraAtOffsetY float not null default 0.0; -ALTER TABLE prims ADD COLUMN CameraAtOffsetZ float not null default 0.0; -ALTER TABLE prims ADD COLUMN ForceMouselook tinyint not null default 0; -ALTER TABLE prims ADD COLUMN ScriptAccessPin integer not null default 0; -ALTER TABLE prims ADD COLUMN AllowedDrop tinyint not null default 0; -ALTER TABLE prims ADD COLUMN DieAtEdge tinyint not null default 0; -ALTER TABLE prims ADD COLUMN SalePrice integer not null default 10; -ALTER TABLE prims ADD COLUMN SaleType tinyint not null default 0; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/017_RegionStore.sql b/OpenSim/Data/MySQL/Resources/017_RegionStore.sql deleted file mode 100644 index 0304f30b72..0000000000 --- a/OpenSim/Data/MySQL/Resources/017_RegionStore.sql +++ /dev/null @@ -1,9 +0,0 @@ -BEGIN; - -ALTER TABLE prims ADD COLUMN ColorR integer not null default 0; -ALTER TABLE prims ADD COLUMN ColorG integer not null default 0; -ALTER TABLE prims ADD COLUMN ColorB integer not null default 0; -ALTER TABLE prims ADD COLUMN ColorA integer not null default 0; -ALTER TABLE prims ADD COLUMN ParticleSystem blob; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/018_RegionStore.sql b/OpenSim/Data/MySQL/Resources/018_RegionStore.sql deleted file mode 100644 index 68c489c7bf..0000000000 --- a/OpenSim/Data/MySQL/Resources/018_RegionStore.sql +++ /dev/null @@ -1,6 +0,0 @@ -begin; - -ALTER TABLE prims ADD COLUMN ClickAction tinyint NOT NULL default 0; - -commit; - diff --git a/OpenSim/Data/MySQL/Resources/019_RegionStore.sql b/OpenSim/Data/MySQL/Resources/019_RegionStore.sql deleted file mode 100644 index 4c14f2a5f4..0000000000 --- a/OpenSim/Data/MySQL/Resources/019_RegionStore.sql +++ /dev/null @@ -1,6 +0,0 @@ -begin; - -ALTER TABLE prims ADD COLUMN Material tinyint NOT NULL default 3; - -commit; - diff --git a/OpenSim/Data/MySQL/Resources/020_RegionStore.sql b/OpenSim/Data/MySQL/Resources/020_RegionStore.sql deleted file mode 100644 index 814ef48bb6..0000000000 --- a/OpenSim/Data/MySQL/Resources/020_RegionStore.sql +++ /dev/null @@ -1,7 +0,0 @@ -begin; - -ALTER TABLE land ADD COLUMN OtherCleanTime integer NOT NULL default 0; -ALTER TABLE land ADD COLUMN Dwell integer NOT NULL default 0; - -commit; - diff --git a/OpenSim/Data/MySQL/Resources/021_RegionStore.sql b/OpenSim/Data/MySQL/Resources/021_RegionStore.sql deleted file mode 100644 index c59b27e745..0000000000 --- a/OpenSim/Data/MySQL/Resources/021_RegionStore.sql +++ /dev/null @@ -1,8 +0,0 @@ -begin; - -ALTER TABLE regionsettings ADD COLUMN sunvectorx double NOT NULL default 0; -ALTER TABLE regionsettings ADD COLUMN sunvectory double NOT NULL default 0; -ALTER TABLE regionsettings ADD COLUMN sunvectorz double NOT NULL default 0; - -commit; - diff --git a/OpenSim/Data/MySQL/Resources/022_RegionStore.sql b/OpenSim/Data/MySQL/Resources/022_RegionStore.sql deleted file mode 100644 index df0bb7dac9..0000000000 --- a/OpenSim/Data/MySQL/Resources/022_RegionStore.sql +++ /dev/null @@ -1,6 +0,0 @@ -BEGIN; - -ALTER TABLE prims ADD COLUMN CollisionSound char(36) not null default '00000000-0000-0000-0000-000000000000'; -ALTER TABLE prims ADD COLUMN CollisionSoundVolume float not null default 0.0; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/023_RegionStore.sql b/OpenSim/Data/MySQL/Resources/023_RegionStore.sql deleted file mode 100644 index 559591fba5..0000000000 --- a/OpenSim/Data/MySQL/Resources/023_RegionStore.sql +++ /dev/null @@ -1,6 +0,0 @@ -BEGIN; - -ALTER TABLE prims ADD COLUMN LinkNumber integer not null default 0; - -COMMIT; - diff --git a/OpenSim/Data/MySQL/Resources/024_RegionStore.sql b/OpenSim/Data/MySQL/Resources/024_RegionStore.sql deleted file mode 100644 index defbf5cbb1..0000000000 --- a/OpenSim/Data/MySQL/Resources/024_RegionStore.sql +++ /dev/null @@ -1,18 +0,0 @@ -BEGIN; - -alter table regionsettings change column `object_bonus` `object_bonus` double NOT NULL; -alter table regionsettings change column `elevation_1_nw` `elevation_1_nw` double NOT NULL; -alter table regionsettings change column `elevation_2_nw` `elevation_2_nw` double NOT NULL; -alter table regionsettings change column `elevation_1_ne` `elevation_1_ne` double NOT NULL; -alter table regionsettings change column `elevation_2_ne` `elevation_2_ne` double NOT NULL; -alter table regionsettings change column `elevation_1_se` `elevation_1_se` double NOT NULL; -alter table regionsettings change column `elevation_2_se` `elevation_2_se` double NOT NULL; -alter table regionsettings change column `elevation_1_sw` `elevation_1_sw` double NOT NULL; -alter table regionsettings change column `elevation_2_sw` `elevation_2_sw` double NOT NULL; -alter table regionsettings change column `water_height` `water_height` double NOT NULL; -alter table regionsettings change column `terrain_raise_limit` `terrain_raise_limit` double NOT NULL; -alter table regionsettings change column `terrain_lower_limit` `terrain_lower_limit` double NOT NULL; -alter table regionsettings change column `sun_position` `sun_position` double NOT NULL; - -COMMIT; - diff --git a/OpenSim/Data/MySQL/Resources/025_RegionStore.sql b/OpenSim/Data/MySQL/Resources/025_RegionStore.sql deleted file mode 100644 index e8f5d70e47..0000000000 --- a/OpenSim/Data/MySQL/Resources/025_RegionStore.sql +++ /dev/null @@ -1,46 +0,0 @@ -BEGIN; - -alter table prims change column `PositionX` `PositionX` double default NULL; -alter table prims change column `PositionY` `PositionY` double default NULL; -alter table prims change column `PositionZ` `PositionZ` double default NULL; -alter table prims change column `GroupPositionX` `GroupPositionX` double default NULL; -alter table prims change column `GroupPositionY` `GroupPositionY` double default NULL; -alter table prims change column `GroupPositionZ` `GroupPositionZ` double default NULL; -alter table prims change column `VelocityX` `VelocityX` double default NULL; -alter table prims change column `VelocityY` `VelocityY` double default NULL; -alter table prims change column `VelocityZ` `VelocityZ` double default NULL; -alter table prims change column `AngularVelocityX` `AngularVelocityX` double default NULL; -alter table prims change column `AngularVelocityY` `AngularVelocityY` double default NULL; -alter table prims change column `AngularVelocityZ` `AngularVelocityZ` double default NULL; -alter table prims change column `AccelerationX` `AccelerationX` double default NULL; -alter table prims change column `AccelerationY` `AccelerationY` double default NULL; -alter table prims change column `AccelerationZ` `AccelerationZ` double default NULL; -alter table prims change column `RotationX` `RotationX` double default NULL; -alter table prims change column `RotationY` `RotationY` double default NULL; -alter table prims change column `RotationZ` `RotationZ` double default NULL; -alter table prims change column `RotationW` `RotationW` double default NULL; -alter table prims change column `SitTargetOffsetX` `SitTargetOffsetX` double default NULL; -alter table prims change column `SitTargetOffsetY` `SitTargetOffsetY` double default NULL; -alter table prims change column `SitTargetOffsetZ` `SitTargetOffsetZ` double default NULL; -alter table prims change column `SitTargetOrientW` `SitTargetOrientW` double default NULL; -alter table prims change column `SitTargetOrientX` `SitTargetOrientX` double default NULL; -alter table prims change column `SitTargetOrientY` `SitTargetOrientY` double default NULL; -alter table prims change column `SitTargetOrientZ` `SitTargetOrientZ` double default NULL; -alter table prims change column `LoopedSoundGain` `LoopedSoundGain` double NOT NULL default '0'; -alter table prims change column `OmegaX` `OmegaX` double NOT NULL default '0'; -alter table prims change column `OmegaY` `OmegaY` double NOT NULL default '0'; -alter table prims change column `OmegaZ` `OmegaZ` double NOT NULL default '0'; -alter table prims change column `CameraEyeOffsetX` `CameraEyeOffsetX` double NOT NULL default '0'; -alter table prims change column `CameraEyeOffsetY` `CameraEyeOffsetY` double NOT NULL default '0'; -alter table prims change column `CameraEyeOffsetZ` `CameraEyeOffsetZ` double NOT NULL default '0'; -alter table prims change column `CameraAtOffsetX` `CameraAtOffsetX` double NOT NULL default '0'; -alter table prims change column `CameraAtOffsetY` `CameraAtOffsetY` double NOT NULL default '0'; -alter table prims change column `CameraAtOffsetZ` `CameraAtOffsetZ` double NOT NULL default '0'; -alter table prims change column `CollisionSoundVolume` `CollisionSoundVolume` double NOT NULL default '0'; - -alter table primshapes change column `ScaleX` `ScaleX` double NOT NULL default '0'; -alter table primshapes change column `ScaleY` `ScaleY` double NOT NULL default '0'; -alter table primshapes change column `ScaleZ` `ScaleZ` double NOT NULL default '0'; - -COMMIT; - diff --git a/OpenSim/Data/MySQL/Resources/026_RegionStore.sql b/OpenSim/Data/MySQL/Resources/026_RegionStore.sql deleted file mode 100644 index 91af8a84c8..0000000000 --- a/OpenSim/Data/MySQL/Resources/026_RegionStore.sql +++ /dev/null @@ -1,41 +0,0 @@ -begin; - -alter table prims change column `PositionX` `PositionX` double default NULL; -alter table prims change column `PositionY` `PositionY` double default NULL; -alter table prims change column `PositionZ` `PositionZ` double default NULL; -alter table prims change column `GroupPositionX` `GroupPositionX` double default NULL; -alter table prims change column `GroupPositionY` `GroupPositionY` double default NULL; -alter table prims change column `GroupPositionZ` `GroupPositionZ` double default NULL; -alter table prims change column `VelocityX` `VelocityX` double default NULL; -alter table prims change column `VelocityY` `VelocityY` double default NULL; -alter table prims change column `VelocityZ` `VelocityZ` double default NULL; -alter table prims change column `AngularVelocityX` `AngularVelocityX` double default NULL; -alter table prims change column `AngularVelocityY` `AngularVelocityY` double default NULL; -alter table prims change column `AngularVelocityZ` `AngularVelocityZ` double default NULL; -alter table prims change column `AccelerationX` `AccelerationX` double default NULL; -alter table prims change column `AccelerationY` `AccelerationY` double default NULL; -alter table prims change column `AccelerationZ` `AccelerationZ` double default NULL; -alter table prims change column `RotationX` `RotationX` double default NULL; -alter table prims change column `RotationY` `RotationY` double default NULL; -alter table prims change column `RotationZ` `RotationZ` double default NULL; -alter table prims change column `RotationW` `RotationW` double default NULL; -alter table prims change column `SitTargetOffsetX` `SitTargetOffsetX` double default NULL; -alter table prims change column `SitTargetOffsetY` `SitTargetOffsetY` double default NULL; -alter table prims change column `SitTargetOffsetZ` `SitTargetOffsetZ` double default NULL; -alter table prims change column `SitTargetOrientW` `SitTargetOrientW` double default NULL; -alter table prims change column `SitTargetOrientX` `SitTargetOrientX` double default NULL; -alter table prims change column `SitTargetOrientY` `SitTargetOrientY` double default NULL; -alter table prims change column `SitTargetOrientZ` `SitTargetOrientZ` double default NULL; -alter table prims change column `LoopedSoundGain` `LoopedSoundGain` double NOT NULL default '0'; -alter table prims change column `OmegaX` `OmegaX` double NOT NULL default '0'; -alter table prims change column `OmegaY` `OmegaY` double NOT NULL default '0'; -alter table prims change column `OmegaZ` `OmegaZ` double NOT NULL default '0'; -alter table prims change column `CameraEyeOffsetX` `CameraEyeOffsetX` double NOT NULL default '0'; -alter table prims change column `CameraEyeOffsetY` `CameraEyeOffsetY` double NOT NULL default '0'; -alter table prims change column `CameraEyeOffsetZ` `CameraEyeOffsetZ` double NOT NULL default '0'; -alter table prims change column `CameraAtOffsetX` `CameraAtOffsetX` double NOT NULL default '0'; -alter table prims change column `CameraAtOffsetY` `CameraAtOffsetY` double NOT NULL default '0'; -alter table prims change column `CameraAtOffsetZ` `CameraAtOffsetZ` double NOT NULL default '0'; -alter table prims change column `CollisionSoundVolume` `CollisionSoundVolume` double NOT NULL default '0'; - -commit; diff --git a/OpenSim/Data/MySQL/Resources/027_RegionStore.sql b/OpenSim/Data/MySQL/Resources/027_RegionStore.sql deleted file mode 100644 index e1efab31c1..0000000000 --- a/OpenSim/Data/MySQL/Resources/027_RegionStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -ALTER TABLE prims DROP COLUMN ParentID; - -COMMIT; \ No newline at end of file diff --git a/OpenSim/Data/MySQL/Resources/028_RegionStore.sql b/OpenSim/Data/MySQL/Resources/028_RegionStore.sql deleted file mode 100644 index 078394f80d..0000000000 --- a/OpenSim/Data/MySQL/Resources/028_RegionStore.sql +++ /dev/null @@ -1,79 +0,0 @@ -BEGIN; - -update terrain - set RegionUUID = concat(substr(RegionUUID, 1, 8), "-", substr(RegionUUID, 9, 4), "-", substr(RegionUUID, 13, 4), "-", substr(RegionUUID, 17, 4), "-", substr(RegionUUID, 21, 12)) - where RegionUUID not like '%-%'; - - -update landaccesslist - set LandUUID = concat(substr(LandUUID, 1, 8), "-", substr(LandUUID, 9, 4), "-", substr(LandUUID, 13, 4), "-", substr(LandUUID, 17, 4), "-", substr(LandUUID, 21, 12)) - where LandUUID not like '%-%'; - -update landaccesslist - set AccessUUID = concat(substr(AccessUUID, 1, 8), "-", substr(AccessUUID, 9, 4), "-", substr(AccessUUID, 13, 4), "-", substr(AccessUUID, 17, 4), "-", substr(AccessUUID, 21, 12)) - where AccessUUID not like '%-%'; - - -update prims - set UUID = concat(substr(UUID, 1, 8), "-", substr(UUID, 9, 4), "-", substr(UUID, 13, 4), "-", substr(UUID, 17, 4), "-", substr(UUID, 21, 12)) - where UUID not like '%-%'; - -update prims - set RegionUUID = concat(substr(RegionUUID, 1, 8), "-", substr(RegionUUID, 9, 4), "-", substr(RegionUUID, 13, 4), "-", substr(RegionUUID, 17, 4), "-", substr(RegionUUID, 21, 12)) - where RegionUUID not like '%-%'; - -update prims - set SceneGroupID = concat(substr(SceneGroupID, 1, 8), "-", substr(SceneGroupID, 9, 4), "-", substr(SceneGroupID, 13, 4), "-", substr(SceneGroupID, 17, 4), "-", substr(SceneGroupID, 21, 12)) - where SceneGroupID not like '%-%'; - -update prims - set CreatorID = concat(substr(CreatorID, 1, 8), "-", substr(CreatorID, 9, 4), "-", substr(CreatorID, 13, 4), "-", substr(CreatorID, 17, 4), "-", substr(CreatorID, 21, 12)) - where CreatorID not like '%-%'; - -update prims - set OwnerID = concat(substr(OwnerID, 1, 8), "-", substr(OwnerID, 9, 4), "-", substr(OwnerID, 13, 4), "-", substr(OwnerID, 17, 4), "-", substr(OwnerID, 21, 12)) - where OwnerID not like '%-%'; - -update prims - set GroupID = concat(substr(GroupID, 1, 8), "-", substr(GroupID, 9, 4), "-", substr(GroupID, 13, 4), "-", substr(GroupID, 17, 4), "-", substr(GroupID, 21, 12)) - where GroupID not like '%-%'; - -update prims - set LastOwnerID = concat(substr(LastOwnerID, 1, 8), "-", substr(LastOwnerID, 9, 4), "-", substr(LastOwnerID, 13, 4), "-", substr(LastOwnerID, 17, 4), "-", substr(LastOwnerID, 21, 12)) - where LastOwnerID not like '%-%'; - - -update primshapes - set UUID = concat(substr(UUID, 1, 8), "-", substr(UUID, 9, 4), "-", substr(UUID, 13, 4), "-", substr(UUID, 17, 4), "-", substr(UUID, 21, 12)) - where UUID not like '%-%'; - - -update land - set UUID = concat(substr(UUID, 1, 8), "-", substr(UUID, 9, 4), "-", substr(UUID, 13, 4), "-", substr(UUID, 17, 4), "-", substr(UUID, 21, 12)) - where UUID not like '%-%'; - -update land - set RegionUUID = concat(substr(RegionUUID, 1, 8), "-", substr(RegionUUID, 9, 4), "-", substr(RegionUUID, 13, 4), "-", substr(RegionUUID, 17, 4), "-", substr(RegionUUID, 21, 12)) - where RegionUUID not like '%-%'; - -update land - set OwnerUUID = concat(substr(OwnerUUID, 1, 8), "-", substr(OwnerUUID, 9, 4), "-", substr(OwnerUUID, 13, 4), "-", substr(OwnerUUID, 17, 4), "-", substr(OwnerUUID, 21, 12)) - where OwnerUUID not like '%-%'; - -update land - set GroupUUID = concat(substr(GroupUUID, 1, 8), "-", substr(GroupUUID, 9, 4), "-", substr(GroupUUID, 13, 4), "-", substr(GroupUUID, 17, 4), "-", substr(GroupUUID, 21, 12)) - where GroupUUID not like '%-%'; - -update land - set MediaTextureUUID = concat(substr(MediaTextureUUID, 1, 8), "-", substr(MediaTextureUUID, 9, 4), "-", substr(MediaTextureUUID, 13, 4), "-", substr(MediaTextureUUID, 17, 4), "-", substr(MediaTextureUUID, 21, 12)) - where MediaTextureUUID not like '%-%'; - -update land - set SnapshotUUID = concat(substr(SnapshotUUID, 1, 8), "-", substr(SnapshotUUID, 9, 4), "-", substr(SnapshotUUID, 13, 4), "-", substr(SnapshotUUID, 17, 4), "-", substr(SnapshotUUID, 21, 12)) - where SnapshotUUID not like '%-%'; - -update land - set AuthbuyerID = concat(substr(AuthbuyerID, 1, 8), "-", substr(AuthbuyerID, 9, 4), "-", substr(AuthbuyerID, 13, 4), "-", substr(AuthbuyerID, 17, 4), "-", substr(AuthbuyerID, 21, 12)) - where AuthbuyerID not like '%-%'; - -COMMIT; \ No newline at end of file diff --git a/OpenSim/Data/MySQL/Resources/029_RegionStore.sql b/OpenSim/Data/MySQL/Resources/029_RegionStore.sql deleted file mode 100644 index b5962a2e10..0000000000 --- a/OpenSim/Data/MySQL/Resources/029_RegionStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -ALTER TABLE prims ADD COLUMN PassTouches tinyint not null default 0; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/030_RegionStore.sql b/OpenSim/Data/MySQL/Resources/030_RegionStore.sql deleted file mode 100644 index dfdcf6d710..0000000000 --- a/OpenSim/Data/MySQL/Resources/030_RegionStore.sql +++ /dev/null @@ -1,7 +0,0 @@ -BEGIN; - -ALTER TABLE regionsettings ADD COLUMN loaded_creation_date varchar(20) default NULL; -ALTER TABLE regionsettings ADD COLUMN loaded_creation_time varchar(20) default NULL; -ALTER TABLE regionsettings ADD COLUMN loaded_creation_id varchar(64) default NULL; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/031_RegionStore.sql b/OpenSim/Data/MySQL/Resources/031_RegionStore.sql deleted file mode 100644 index d069296039..0000000000 --- a/OpenSim/Data/MySQL/Resources/031_RegionStore.sql +++ /dev/null @@ -1,7 +0,0 @@ -BEGIN; - -ALTER TABLE regionsettings DROP COLUMN loaded_creation_date; -ALTER TABLE regionsettings DROP COLUMN loaded_creation_time; -ALTER TABLE regionsettings ADD COLUMN loaded_creation_datetime int unsigned NOT NULL default 0; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/032_RegionStore.sql b/OpenSim/Data/MySQL/Resources/032_RegionStore.sql deleted file mode 100644 index dca5de7144..0000000000 --- a/OpenSim/Data/MySQL/Resources/032_RegionStore.sql +++ /dev/null @@ -1,3 +0,0 @@ -BEGIN; -ALTER TABLE estate_settings AUTO_INCREMENT = 100; -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/AssetStore.migrations b/OpenSim/Data/MySQL/Resources/AssetStore.migrations new file mode 100644 index 0000000000..b9595f0f47 --- /dev/null +++ b/OpenSim/Data/MySQL/Resources/AssetStore.migrations @@ -0,0 +1,69 @@ +# ----------------- +:VERSION 1 + +BEGIN; + +CREATE TABLE `assets` ( + `id` binary(16) NOT NULL, + `name` varchar(64) NOT NULL, + `description` varchar(64) NOT NULL, + `assetType` tinyint(4) NOT NULL, + `invType` tinyint(4) NOT NULL, + `local` tinyint(1) NOT NULL, + `temporary` tinyint(1) NOT NULL, + `data` longblob NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Rev. 1'; + +COMMIT; + +# ----------------- +:VERSION 2 + +BEGIN; + +ALTER TABLE assets change id oldid binary(16); +ALTER TABLE assets add id varchar(36) not null default ''; +UPDATE assets set id = concat(substr(hex(oldid),1,8),"-",substr(hex(oldid),9,4),"-",substr(hex(oldid),13,4),"-",substr(hex(oldid),17,4),"-",substr(hex(oldid),21,12)); +ALTER TABLE assets drop oldid; +ALTER TABLE assets add constraint primary key(id); + +COMMIT; + +# ----------------- +:VERSION 3 + +BEGIN; + +ALTER TABLE assets change id oldid varchar(36); +ALTER TABLE assets add id char(36) not null default '00000000-0000-0000-0000-000000000000'; +UPDATE assets set id = oldid; +ALTER TABLE assets drop oldid; +ALTER TABLE assets add constraint primary key(id); + +COMMIT; + +# ----------------- +:VERSION 4 + +BEGIN; + +ALTER TABLE assets drop InvType; + +COMMIT; + +# ----------------- +:VERSION 5 + +BEGIN; + +ALTER TABLE assets add create_time integer default 0; +ALTER TABLE assets add access_time integer default 0; + +COMMIT; + +# ----------------- +:VERSION 6 + +DELETE FROM assets WHERE id = 'dc4b9f0b-d008-45c6-96a4-01dd947ac621' + diff --git a/OpenSim/Data/MySQL/Resources/001_AuthStore.sql b/OpenSim/Data/MySQL/Resources/AuthStore.migrations similarity index 51% rename from OpenSim/Data/MySQL/Resources/001_AuthStore.sql rename to OpenSim/Data/MySQL/Resources/AuthStore.migrations index c7e16fbdfb..023c786aa5 100644 --- a/OpenSim/Data/MySQL/Resources/001_AuthStore.sql +++ b/OpenSim/Data/MySQL/Resources/AuthStore.migrations @@ -1,3 +1,5 @@ +:VERSION 1 # ------------------------------- + begin; CREATE TABLE `auth` ( @@ -19,3 +21,19 @@ CREATE TABLE `tokens` ( ) ENGINE=InnoDB; commit; + +:VERSION 2 # ------------------------------- + +BEGIN; + +INSERT INTO auth (UUID, passwordHash, passwordSalt, webLoginKey) SELECT `UUID` AS UUID, `passwordHash` AS passwordHash, `passwordSalt` AS passwordSalt, `webLoginKey` AS webLoginKey FROM users; + +COMMIT; + +:VERSION 3 # ------------------------------- + +BEGIN; + +ALTER TABLE `auth` ADD COLUMN `accountType` VARCHAR(32) NOT NULL DEFAULT 'UserAccount'; + +COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/Avatar.migrations b/OpenSim/Data/MySQL/Resources/Avatar.migrations new file mode 100644 index 0000000000..8d0eee68a1 --- /dev/null +++ b/OpenSim/Data/MySQL/Resources/Avatar.migrations @@ -0,0 +1,12 @@ +:VERSION 1 + +BEGIN; + +CREATE TABLE Avatars ( + PrincipalID CHAR(36) NOT NULL, + Name VARCHAR(32) NOT NULL, + Value VARCHAR(255) NOT NULL DEFAULT '', + PRIMARY KEY(PrincipalID, Name), + KEY(PrincipalID)); + +COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/FriendsStore.migrations b/OpenSim/Data/MySQL/Resources/FriendsStore.migrations new file mode 100644 index 0000000000..ce713bdb89 --- /dev/null +++ b/OpenSim/Data/MySQL/Resources/FriendsStore.migrations @@ -0,0 +1,25 @@ +:VERSION 1 # ------------------------- + +BEGIN; + +CREATE TABLE `Friends` ( + `PrincipalID` CHAR(36) NOT NULL, + `Friend` VARCHAR(255) NOT NULL, + `Flags` VARCHAR(16) NOT NULL DEFAULT 0, + `Offered` VARCHAR(32) NOT NULL DEFAULT 0, + PRIMARY KEY(`PrincipalID`, `Friend`), + KEY(`PrincipalID`) +); + +COMMIT; + +:VERSION 2 # ------------------------- + +BEGIN; + +INSERT INTO `Friends` SELECT `ownerID`, `friendID`, `friendPerms`, 0 FROM `userfriends`; + +COMMIT; + + + diff --git a/OpenSim/Data/MySQL/Resources/001_GridStore.sql b/OpenSim/Data/MySQL/Resources/GridStore.migrations similarity index 64% rename from OpenSim/Data/MySQL/Resources/001_GridStore.sql rename to OpenSim/Data/MySQL/Resources/GridStore.migrations index cb0f9bd2cd..523a8ac7dc 100644 --- a/OpenSim/Data/MySQL/Resources/001_GridStore.sql +++ b/OpenSim/Data/MySQL/Resources/GridStore.migrations @@ -1,3 +1,5 @@ +:VERSION 1 + CREATE TABLE `regions` ( `uuid` varchar(36) NOT NULL, `regionHandle` bigint(20) unsigned NOT NULL, @@ -30,3 +32,58 @@ CREATE TABLE `regions` ( KEY `regionHandle` (`regionHandle`), KEY `overrideHandles` (`eastOverrideHandle`,`westOverrideHandle`,`southOverrideHandle`,`northOverrideHandle`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Rev. 3'; + +:VERSION 2 + +BEGIN; + +ALTER TABLE regions add column access integer unsigned default 1; + +COMMIT; + +:VERSION 3 + +BEGIN; + +ALTER TABLE regions add column ScopeID char(36) not null default '00000000-0000-0000-0000-000000000000'; + +create index ScopeID on regions(ScopeID); + +COMMIT; + +:VERSION 4 + +BEGIN; + +ALTER TABLE regions add column sizeX integer not null default 0; +ALTER TABLE regions add column sizeY integer not null default 0; + +COMMIT; + +:VERSION 5 + +BEGIN; + +ALTER TABLE `regions` ADD COLUMN `flags` integer NOT NULL DEFAULT 0; +CREATE INDEX flags ON regions(flags); + +COMMIT; + +:VERSION 6 + +BEGIN; + +ALTER TABLE `regions` ADD COLUMN `last_seen` integer NOT NULL DEFAULT 0; + +COMMIT; + +:VERSION 7 + +BEGIN; + +ALTER TABLE `regions` ADD COLUMN `PrincipalID` char(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000'; +ALTER TABLE `regions` ADD COLUMN `Token` varchar(255) NOT NULL; + +COMMIT; + + diff --git a/OpenSim/Data/MySQL/Resources/InventoryStore.migrations b/OpenSim/Data/MySQL/Resources/InventoryStore.migrations new file mode 100644 index 0000000000..8c5864e97d --- /dev/null +++ b/OpenSim/Data/MySQL/Resources/InventoryStore.migrations @@ -0,0 +1,93 @@ +:VERSION 1 # ------------ +BEGIN; + +CREATE TABLE `inventoryfolders` ( + `folderID` varchar(36) NOT NULL default '', + `agentID` varchar(36) default NULL, + `parentFolderID` varchar(36) default NULL, + `folderName` varchar(64) default NULL, + `type` smallint NOT NULL default 0, + `version` int NOT NULL default 0, + PRIMARY KEY (`folderID`), + KEY `owner` (`agentID`), + KEY `parent` (`parentFolderID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `inventoryitems` ( + `inventoryID` varchar(36) NOT NULL default '', + `assetID` varchar(36) default NULL, + `assetType` int(11) default NULL, + `parentFolderID` varchar(36) default NULL, + `avatarID` varchar(36) default NULL, + `inventoryName` varchar(64) default NULL, + `inventoryDescription` varchar(128) default NULL, + `inventoryNextPermissions` int(10) unsigned default NULL, + `inventoryCurrentPermissions` int(10) unsigned default NULL, + `invType` int(11) default NULL, + `creatorID` varchar(36) default NULL, + `inventoryBasePermissions` int(10) unsigned NOT NULL default 0, + `inventoryEveryOnePermissions` int(10) unsigned NOT NULL default 0, + `salePrice` int(11) NOT NULL default 0, + `saleType` tinyint(4) NOT NULL default 0, + `creationDate` int(11) NOT NULL default 0, + `groupID` varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000', + `groupOwned` tinyint(4) NOT NULL default 0, + `flags` int(11) unsigned NOT NULL default 0, + PRIMARY KEY (`inventoryID`), + KEY `owner` (`avatarID`), + KEY `folder` (`parentFolderID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +COMMIT; + +:VERSION 2 # ------------ + +BEGIN; + +ALTER TABLE inventoryfolders change folderID folderIDold varchar(36); +ALTER TABLE inventoryfolders change agentID agentIDold varchar(36); +ALTER TABLE inventoryfolders change parentFolderID parentFolderIDold varchar(36); +ALTER TABLE inventoryfolders add folderID char(36) not null default '00000000-0000-0000-0000-000000000000'; +ALTER TABLE inventoryfolders add agentID char(36) default NULL; +ALTER TABLE inventoryfolders add parentFolderID char(36) default NULL; +UPDATE inventoryfolders set folderID = folderIDold, agentID = agentIDold, parentFolderID = parentFolderIDold; +ALTER TABLE inventoryfolders drop folderIDold; +ALTER TABLE inventoryfolders drop agentIDold; +ALTER TABLE inventoryfolders drop parentFolderIDold; +ALTER TABLE inventoryfolders add constraint primary key(folderID); +ALTER TABLE inventoryfolders add index inventoryfolders_agentid(agentID); +ALTER TABLE inventoryfolders add index inventoryfolders_parentFolderid(parentFolderID); + +ALTER TABLE inventoryitems change inventoryID inventoryIDold varchar(36); +ALTER TABLE inventoryitems change avatarID avatarIDold varchar(36); +ALTER TABLE inventoryitems change parentFolderID parentFolderIDold varchar(36); +ALTER TABLE inventoryitems add inventoryID char(36) not null default '00000000-0000-0000-0000-000000000000'; +ALTER TABLE inventoryitems add avatarID char(36) default NULL; +ALTER TABLE inventoryitems add parentFolderID char(36) default NULL; +UPDATE inventoryitems set inventoryID = inventoryIDold, avatarID = avatarIDold, parentFolderID = parentFolderIDold; +ALTER TABLE inventoryitems drop inventoryIDold; +ALTER TABLE inventoryitems drop avatarIDold; +ALTER TABLE inventoryitems drop parentFolderIDold; +ALTER TABLE inventoryitems add constraint primary key(inventoryID); +ALTER TABLE inventoryitems add index inventoryitems_avatarid(avatarID); +ALTER TABLE inventoryitems add index inventoryitems_parentFolderid(parentFolderID); + +COMMIT; + +:VERSION 3 # ------------ + +BEGIN; + +alter table inventoryitems add column inventoryGroupPermissions integer unsigned not null default 0; + +COMMIT; + +:VERSION 4 # ------------ + +BEGIN; + +update inventoryitems set creatorID = '00000000-0000-0000-0000-000000000000' where creatorID is NULL; +update inventoryitems set creatorID = '00000000-0000-0000-0000-000000000000' where creatorID = ''; +alter table inventoryitems modify column creatorID varchar(36) not NULL default '00000000-0000-0000-0000-000000000000'; + +COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/001_LogStore.sql b/OpenSim/Data/MySQL/Resources/LogStore.migrations similarity index 95% rename from OpenSim/Data/MySQL/Resources/001_LogStore.sql rename to OpenSim/Data/MySQL/Resources/LogStore.migrations index b4c29fbef5..9ac26ac722 100644 --- a/OpenSim/Data/MySQL/Resources/001_LogStore.sql +++ b/OpenSim/Data/MySQL/Resources/LogStore.migrations @@ -1,3 +1,6 @@ + +:VERSION 1 + CREATE TABLE `logs` ( `logID` int(10) unsigned NOT NULL auto_increment, `target` varchar(36) default NULL, diff --git a/OpenSim/Data/MySQL/Resources/Presence.migrations b/OpenSim/Data/MySQL/Resources/Presence.migrations new file mode 100644 index 0000000000..d513024987 --- /dev/null +++ b/OpenSim/Data/MySQL/Resources/Presence.migrations @@ -0,0 +1,36 @@ +:VERSION 1 # -------------------------- + +BEGIN; + +CREATE TABLE `Presence` ( + `UserID` VARCHAR(255) NOT NULL, + `RegionID` CHAR(36) NOT NULL, + `SessionID` CHAR(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000', + `SecureSessionID` CHAR(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000', + `Online` CHAR(5) NOT NULL DEFAULT 'false', + `Login` CHAR(16) NOT NULL DEFAULT '0', + `Logout` CHAR(16) NOT NULL DEFAULT '0', + `Position` CHAR(64) NOT NULL DEFAULT '<0,0,0>', + `LookAt` CHAR(64) NOT NULL DEFAULT '<0,0,0>' +) ENGINE=InnoDB; + +COMMIT; + +:VERSION 2 # -------------------------- + +BEGIN; + +ALTER TABLE Presence ADD COLUMN `HomeRegionID` CHAR(36) NOT NULL; +ALTER TABLE Presence ADD COLUMN `HomePosition` CHAR(64) NOT NULL DEFAULT '<0,0,0>'; +ALTER TABLE Presence ADD COLUMN `HomeLookAt` CHAR(64) NOT NULL DEFAULT '<0,0,0>'; + +COMMIT; + +:VERSION 3 # -------------------------- + +BEGIN; + +CREATE UNIQUE INDEX SessionID ON Presence(SessionID); +CREATE INDEX UserID ON Presence(UserID); + +COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/RegionStore.migrations b/OpenSim/Data/MySQL/Resources/RegionStore.migrations new file mode 100644 index 0000000000..3dab67e58e --- /dev/null +++ b/OpenSim/Data/MySQL/Resources/RegionStore.migrations @@ -0,0 +1,806 @@ + +:VERSION 1 #--------------------- + +BEGIN; + +CREATE TABLE `prims` ( + `UUID` varchar(255) NOT NULL, + `RegionUUID` varchar(255) default NULL, + `ParentID` int(11) default NULL, + `CreationDate` int(11) default NULL, + `Name` varchar(255) default NULL, + `SceneGroupID` varchar(255) default NULL, + `Text` varchar(255) default NULL, + `Description` varchar(255) default NULL, + `SitName` varchar(255) default NULL, + `TouchName` varchar(255) default NULL, + `ObjectFlags` int(11) default NULL, + `CreatorID` varchar(255) default NULL, + `OwnerID` varchar(255) default NULL, + `GroupID` varchar(255) default NULL, + `LastOwnerID` varchar(255) default NULL, + `OwnerMask` int(11) default NULL, + `NextOwnerMask` int(11) default NULL, + `GroupMask` int(11) default NULL, + `EveryoneMask` int(11) default NULL, + `BaseMask` int(11) default NULL, + `PositionX` float default NULL, + `PositionY` float default NULL, + `PositionZ` float default NULL, + `GroupPositionX` float default NULL, + `GroupPositionY` float default NULL, + `GroupPositionZ` float default NULL, + `VelocityX` float default NULL, + `VelocityY` float default NULL, + `VelocityZ` float default NULL, + `AngularVelocityX` float default NULL, + `AngularVelocityY` float default NULL, + `AngularVelocityZ` float default NULL, + `AccelerationX` float default NULL, + `AccelerationY` float default NULL, + `AccelerationZ` float default NULL, + `RotationX` float default NULL, + `RotationY` float default NULL, + `RotationZ` float default NULL, + `RotationW` float default NULL, + `SitTargetOffsetX` float default NULL, + `SitTargetOffsetY` float default NULL, + `SitTargetOffsetZ` float default NULL, + `SitTargetOrientW` float default NULL, + `SitTargetOrientX` float default NULL, + `SitTargetOrientY` float default NULL, + `SitTargetOrientZ` float default NULL, + PRIMARY KEY (`UUID`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1; + +CREATE TABLE `primshapes` ( + `UUID` varchar(255) NOT NULL, + `Shape` int(11) default NULL, + `ScaleX` float default NULL, + `ScaleY` float default NULL, + `ScaleZ` float default NULL, + `PCode` int(11) default NULL, + `PathBegin` int(11) default NULL, + `PathEnd` int(11) default NULL, + `PathScaleX` int(11) default NULL, + `PathScaleY` int(11) default NULL, + `PathShearX` int(11) default NULL, + `PathShearY` int(11) default NULL, + `PathSkew` int(11) default NULL, + `PathCurve` int(11) default NULL, + `PathRadiusOffset` int(11) default NULL, + `PathRevolutions` int(11) default NULL, + `PathTaperX` int(11) default NULL, + `PathTaperY` int(11) default NULL, + `PathTwist` int(11) default NULL, + `PathTwistBegin` int(11) default NULL, + `ProfileBegin` int(11) default NULL, + `ProfileEnd` int(11) default NULL, + `ProfileCurve` int(11) default NULL, + `ProfileHollow` int(11) default NULL, + `State` int(11) default NULL, + `Texture` longblob, + `ExtraParams` longblob, + PRIMARY KEY (`UUID`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1; + +CREATE TABLE `primitems` ( + `itemID` varchar(255) NOT NULL, + `primID` varchar(255) default NULL, + `assetID` varchar(255) default NULL, + `parentFolderID` varchar(255) default NULL, + `invType` int(11) default NULL, + `assetType` int(11) default NULL, + `name` varchar(255) default NULL, + `description` varchar(255) default NULL, + `creationDate` bigint(20) default NULL, + `creatorID` varchar(255) default NULL, + `ownerID` varchar(255) default NULL, + `lastOwnerID` varchar(255) default NULL, + `groupID` varchar(255) default NULL, + `nextPermissions` int(11) default NULL, + `currentPermissions` int(11) default NULL, + `basePermissions` int(11) default NULL, + `everyonePermissions` int(11) default NULL, + `groupPermissions` int(11) default NULL, + PRIMARY KEY (`itemID`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1; + +CREATE TABLE `terrain` ( + `RegionUUID` varchar(255) default NULL, + `Revision` int(11) default NULL, + `Heightfield` longblob +) ENGINE=MyISAM DEFAULT CHARSET=latin1; + +CREATE TABLE `land` ( + `UUID` varchar(255) NOT NULL, + `RegionUUID` varchar(255) default NULL, + `LocalLandID` int(11) default NULL, + `Bitmap` longblob, + `Name` varchar(255) default NULL, + `Description` varchar(255) default NULL, + `OwnerUUID` varchar(255) default NULL, + `IsGroupOwned` int(11) default NULL, + `Area` int(11) default NULL, + `AuctionID` int(11) default NULL, + `Category` int(11) default NULL, + `ClaimDate` int(11) default NULL, + `ClaimPrice` int(11) default NULL, + `GroupUUID` varchar(255) default NULL, + `SalePrice` int(11) default NULL, + `LandStatus` int(11) default NULL, + `LandFlags` int(11) default NULL, + `LandingType` int(11) default NULL, + `MediaAutoScale` int(11) default NULL, + `MediaTextureUUID` varchar(255) default NULL, + `MediaURL` varchar(255) default NULL, + `MusicURL` varchar(255) default NULL, + `PassHours` float default NULL, + `PassPrice` int(11) default NULL, + `SnapshotUUID` varchar(255) default NULL, + `UserLocationX` float default NULL, + `UserLocationY` float default NULL, + `UserLocationZ` float default NULL, + `UserLookAtX` float default NULL, + `UserLookAtY` float default NULL, + `UserLookAtZ` float default NULL, + `AuthbuyerID` varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000', + PRIMARY KEY (`UUID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `landaccesslist` ( + `LandUUID` varchar(255) default NULL, + `AccessUUID` varchar(255) default NULL, + `Flags` int(11) default NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1; + +COMMIT; + +:VERSION 2 #--------------------- + +BEGIN; + +CREATE index prims_regionuuid on prims(RegionUUID); +CREATE index primitems_primid on primitems(primID); + +COMMIT; + +:VERSION 3 #--------------------- + +BEGIN; + CREATE TABLE regionban (regionUUID VARCHAR(36) NOT NULL, bannedUUID VARCHAR(36) NOT NULL, bannedIp VARCHAR(16) NOT NULL, bannedIpHostMask VARCHAR(16) NOT NULL) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='Rev. 1'; +COMMIT; + +:VERSION 4 #--------------------- + +BEGIN; + +ALTER TABLE primitems add flags integer not null default 0; + +COMMIT; + +:VERSION 5 #--------------------- +BEGIN; + +create table regionsettings ( + regionUUID char(36) not null, + block_terraform integer not null, + block_fly integer not null, + allow_damage integer not null, + restrict_pushing integer not null, + allow_land_resell integer not null, + allow_land_join_divide integer not null, + block_show_in_search integer not null, + agent_limit integer not null, + object_bonus float not null, + maturity integer not null, + disable_scripts integer not null, + disable_collisions integer not null, + disable_physics integer not null, + terrain_texture_1 char(36) not null, + terrain_texture_2 char(36) not null, + terrain_texture_3 char(36) not null, + terrain_texture_4 char(36) not null, + elevation_1_nw float not null, + elevation_2_nw float not null, + elevation_1_ne float not null, + elevation_2_ne float not null, + elevation_1_se float not null, + elevation_2_se float not null, + elevation_1_sw float not null, + elevation_2_sw float not null, + water_height float not null, + terrain_raise_limit float not null, + terrain_lower_limit float not null, + use_estate_sun integer not null, + fixed_sun integer not null, + sun_position float not null, + covenant char(36), + primary key(regionUUID) +); + +COMMIT; + + +:VERSION 6 #--------------------- + +BEGIN; + +alter table landaccesslist ENGINE = InnoDB; +alter table migrations ENGINE = InnoDB; +alter table primitems ENGINE = InnoDB; +alter table prims ENGINE = InnoDB; +alter table primshapes ENGINE = InnoDB; +alter table regionsettings ENGINE = InnoDB; +alter table terrain ENGINE = InnoDB; + +COMMIT; + +:VERSION 7 #--------------------- + +BEGIN; + +ALTER TABLE prims change UUID UUIDold varchar(255); +ALTER TABLE prims change RegionUUID RegionUUIDold varchar(255); +ALTER TABLE prims change CreatorID CreatorIDold varchar(255); +ALTER TABLE prims change OwnerID OwnerIDold varchar(255); +ALTER TABLE prims change GroupID GroupIDold varchar(255); +ALTER TABLE prims change LastOwnerID LastOwnerIDold varchar(255); +ALTER TABLE prims add UUID char(36); +ALTER TABLE prims add RegionUUID char(36); +ALTER TABLE prims add CreatorID char(36); +ALTER TABLE prims add OwnerID char(36); +ALTER TABLE prims add GroupID char(36); +ALTER TABLE prims add LastOwnerID char(36); +UPDATE prims set UUID = UUIDold, RegionUUID = RegionUUIDold, CreatorID = CreatorIDold, OwnerID = OwnerIDold, GroupID = GroupIDold, LastOwnerID = LastOwnerIDold; +ALTER TABLE prims drop UUIDold; +ALTER TABLE prims drop RegionUUIDold; +ALTER TABLE prims drop CreatorIDold; +ALTER TABLE prims drop OwnerIDold; +ALTER TABLE prims drop GroupIDold; +ALTER TABLE prims drop LastOwnerIDold; +ALTER TABLE prims add constraint primary key(UUID); +ALTER TABLE prims add index prims_regionuuid(RegionUUID); + +COMMIT; + +:VERSION 8 #--------------------- + +BEGIN; + +ALTER TABLE primshapes change UUID UUIDold varchar(255); +ALTER TABLE primshapes add UUID char(36); +UPDATE primshapes set UUID = UUIDold; +ALTER TABLE primshapes drop UUIDold; +ALTER TABLE primshapes add constraint primary key(UUID); + +COMMIT; + +:VERSION 9 #--------------------- + +BEGIN; + +ALTER TABLE primitems change itemID itemIDold varchar(255); +ALTER TABLE primitems change primID primIDold varchar(255); +ALTER TABLE primitems change assetID assetIDold varchar(255); +ALTER TABLE primitems change parentFolderID parentFolderIDold varchar(255); +ALTER TABLE primitems change creatorID creatorIDold varchar(255); +ALTER TABLE primitems change ownerID ownerIDold varchar(255); +ALTER TABLE primitems change groupID groupIDold varchar(255); +ALTER TABLE primitems change lastOwnerID lastOwnerIDold varchar(255); +ALTER TABLE primitems add itemID char(36); +ALTER TABLE primitems add primID char(36); +ALTER TABLE primitems add assetID char(36); +ALTER TABLE primitems add parentFolderID char(36); +ALTER TABLE primitems add creatorID char(36); +ALTER TABLE primitems add ownerID char(36); +ALTER TABLE primitems add groupID char(36); +ALTER TABLE primitems add lastOwnerID char(36); +UPDATE primitems set itemID = itemIDold, primID = primIDold, assetID = assetIDold, parentFolderID = parentFolderIDold, creatorID = creatorIDold, ownerID = ownerIDold, groupID = groupIDold, lastOwnerID = lastOwnerIDold; +ALTER TABLE primitems drop itemIDold; +ALTER TABLE primitems drop primIDold; +ALTER TABLE primitems drop assetIDold; +ALTER TABLE primitems drop parentFolderIDold; +ALTER TABLE primitems drop creatorIDold; +ALTER TABLE primitems drop ownerIDold; +ALTER TABLE primitems drop groupIDold; +ALTER TABLE primitems drop lastOwnerIDold; +ALTER TABLE primitems add constraint primary key(itemID); +ALTER TABLE primitems add index primitems_primid(primID); + +COMMIT; + +:VERSION 10 #--------------------- + +# 1 "010_RegionStore.sql" +# 1 "" +# 1 "" +# 1 "010_RegionStore.sql" +BEGIN; + +DELETE FROM regionsettings; + +COMMIT; + + +:VERSION 11 #--------------------- + +BEGIN; + +ALTER TABLE prims change SceneGroupID SceneGroupIDold varchar(255); +ALTER TABLE prims add SceneGroupID char(36); +UPDATE prims set SceneGroupID = SceneGroupIDold; +ALTER TABLE prims drop SceneGroupIDold; +ALTER TABLE prims add index prims_scenegroupid(SceneGroupID); + +COMMIT; + +:VERSION 12 #--------------------- + +BEGIN; + +ALTER TABLE prims add index prims_parentid(ParentID); + +COMMIT; + +:VERSION 13 #--------------------- +begin; + +drop table regionsettings; + +CREATE TABLE `regionsettings` ( + `regionUUID` char(36) NOT NULL, + `block_terraform` int(11) NOT NULL, + `block_fly` int(11) NOT NULL, + `allow_damage` int(11) NOT NULL, + `restrict_pushing` int(11) NOT NULL, + `allow_land_resell` int(11) NOT NULL, + `allow_land_join_divide` int(11) NOT NULL, + `block_show_in_search` int(11) NOT NULL, + `agent_limit` int(11) NOT NULL, + `object_bonus` float NOT NULL, + `maturity` int(11) NOT NULL, + `disable_scripts` int(11) NOT NULL, + `disable_collisions` int(11) NOT NULL, + `disable_physics` int(11) NOT NULL, + `terrain_texture_1` char(36) NOT NULL, + `terrain_texture_2` char(36) NOT NULL, + `terrain_texture_3` char(36) NOT NULL, + `terrain_texture_4` char(36) NOT NULL, + `elevation_1_nw` float NOT NULL, + `elevation_2_nw` float NOT NULL, + `elevation_1_ne` float NOT NULL, + `elevation_2_ne` float NOT NULL, + `elevation_1_se` float NOT NULL, + `elevation_2_se` float NOT NULL, + `elevation_1_sw` float NOT NULL, + `elevation_2_sw` float NOT NULL, + `water_height` float NOT NULL, + `terrain_raise_limit` float NOT NULL, + `terrain_lower_limit` float NOT NULL, + `use_estate_sun` int(11) NOT NULL, + `fixed_sun` int(11) NOT NULL, + `sun_position` float NOT NULL, + `covenant` char(36) default NULL, + `Sandbox` tinyint(4) NOT NULL, + PRIMARY KEY (`regionUUID`) +) ENGINE=InnoDB; + +CREATE TABLE `estate_managers` ( + `EstateID` int(10) unsigned NOT NULL, + `uuid` char(36) NOT NULL, + KEY `EstateID` (`EstateID`) +) ENGINE=InnoDB; + +CREATE TABLE `estate_groups` ( + `EstateID` int(10) unsigned NOT NULL, + `uuid` char(36) NOT NULL, + KEY `EstateID` (`EstateID`) +) ENGINE=InnoDB; + +CREATE TABLE `estate_users` ( + `EstateID` int(10) unsigned NOT NULL, + `uuid` char(36) NOT NULL, + KEY `EstateID` (`EstateID`) +) ENGINE=InnoDB; + +CREATE TABLE `estateban` ( + `EstateID` int(10) unsigned NOT NULL, + `bannedUUID` varchar(36) NOT NULL, + `bannedIp` varchar(16) NOT NULL, + `bannedIpHostMask` varchar(16) NOT NULL, + `bannedNameMask` varchar(64) default NULL, + KEY `estateban_EstateID` (`EstateID`) +) ENGINE=InnoDB; + +CREATE TABLE `estate_settings` ( + `EstateID` int(10) unsigned NOT NULL auto_increment, + `EstateName` varchar(64) default NULL, + `AbuseEmailToEstateOwner` tinyint(4) NOT NULL, + `DenyAnonymous` tinyint(4) NOT NULL, + `ResetHomeOnTeleport` tinyint(4) NOT NULL, + `FixedSun` tinyint(4) NOT NULL, + `DenyTransacted` tinyint(4) NOT NULL, + `BlockDwell` tinyint(4) NOT NULL, + `DenyIdentified` tinyint(4) NOT NULL, + `AllowVoice` tinyint(4) NOT NULL, + `UseGlobalTime` tinyint(4) NOT NULL, + `PricePerMeter` int(11) NOT NULL, + `TaxFree` tinyint(4) NOT NULL, + `AllowDirectTeleport` tinyint(4) NOT NULL, + `RedirectGridX` int(11) NOT NULL, + `RedirectGridY` int(11) NOT NULL, + `ParentEstateID` int(10) unsigned NOT NULL, + `SunPosition` double NOT NULL, + `EstateSkipScripts` tinyint(4) NOT NULL, + `BillableFactor` float NOT NULL, + `PublicAccess` tinyint(4) NOT NULL, + PRIMARY KEY (`EstateID`) +) ENGINE=InnoDB AUTO_INCREMENT=100; + +CREATE TABLE `estate_map` ( + `RegionID` char(36) NOT NULL default '00000000-0000-0000-0000-000000000000', + `EstateID` int(11) NOT NULL, + PRIMARY KEY (`RegionID`), + KEY `EstateID` (`EstateID`) +) ENGINE=InnoDB; + +commit; + +:VERSION 14 #--------------------- + +begin; + +alter table estate_settings add column AbuseEmail varchar(255) not null; + +alter table estate_settings add column EstateOwner varchar(36) not null; + +commit; + + +:VERSION 15 #--------------------- + +begin; + +alter table estate_settings add column DenyMinors tinyint not null; + +commit; + +:VERSION 16 #--------------------- + +BEGIN; + +ALTER TABLE prims ADD COLUMN PayPrice integer not null default 0; +ALTER TABLE prims ADD COLUMN PayButton1 integer not null default 0; +ALTER TABLE prims ADD COLUMN PayButton2 integer not null default 0; +ALTER TABLE prims ADD COLUMN PayButton3 integer not null default 0; +ALTER TABLE prims ADD COLUMN PayButton4 integer not null default 0; +ALTER TABLE prims ADD COLUMN LoopedSound char(36) not null default '00000000-0000-0000-0000-000000000000'; +ALTER TABLE prims ADD COLUMN LoopedSoundGain float not null default 0.0; +ALTER TABLE prims ADD COLUMN TextureAnimation blob; +ALTER TABLE prims ADD COLUMN OmegaX float not null default 0.0; +ALTER TABLE prims ADD COLUMN OmegaY float not null default 0.0; +ALTER TABLE prims ADD COLUMN OmegaZ float not null default 0.0; +ALTER TABLE prims ADD COLUMN CameraEyeOffsetX float not null default 0.0; +ALTER TABLE prims ADD COLUMN CameraEyeOffsetY float not null default 0.0; +ALTER TABLE prims ADD COLUMN CameraEyeOffsetZ float not null default 0.0; +ALTER TABLE prims ADD COLUMN CameraAtOffsetX float not null default 0.0; +ALTER TABLE prims ADD COLUMN CameraAtOffsetY float not null default 0.0; +ALTER TABLE prims ADD COLUMN CameraAtOffsetZ float not null default 0.0; +ALTER TABLE prims ADD COLUMN ForceMouselook tinyint not null default 0; +ALTER TABLE prims ADD COLUMN ScriptAccessPin integer not null default 0; +ALTER TABLE prims ADD COLUMN AllowedDrop tinyint not null default 0; +ALTER TABLE prims ADD COLUMN DieAtEdge tinyint not null default 0; +ALTER TABLE prims ADD COLUMN SalePrice integer not null default 10; +ALTER TABLE prims ADD COLUMN SaleType tinyint not null default 0; + +COMMIT; + + +:VERSION 17 #--------------------- + +BEGIN; + +ALTER TABLE prims ADD COLUMN ColorR integer not null default 0; +ALTER TABLE prims ADD COLUMN ColorG integer not null default 0; +ALTER TABLE prims ADD COLUMN ColorB integer not null default 0; +ALTER TABLE prims ADD COLUMN ColorA integer not null default 0; +ALTER TABLE prims ADD COLUMN ParticleSystem blob; + +COMMIT; + + +:VERSION 18 #--------------------- + +begin; + +ALTER TABLE prims ADD COLUMN ClickAction tinyint NOT NULL default 0; + +commit; + +:VERSION 19 #--------------------- + +begin; + +ALTER TABLE prims ADD COLUMN Material tinyint NOT NULL default 3; + +commit; + + +:VERSION 20 #--------------------- + +begin; + +ALTER TABLE land ADD COLUMN OtherCleanTime integer NOT NULL default 0; +ALTER TABLE land ADD COLUMN Dwell integer NOT NULL default 0; + +commit; + +:VERSION 21 #--------------------- + +begin; + +ALTER TABLE regionsettings ADD COLUMN sunvectorx double NOT NULL default 0; +ALTER TABLE regionsettings ADD COLUMN sunvectory double NOT NULL default 0; +ALTER TABLE regionsettings ADD COLUMN sunvectorz double NOT NULL default 0; + +commit; + + +:VERSION 22 #--------------------- + +BEGIN; + +ALTER TABLE prims ADD COLUMN CollisionSound char(36) not null default '00000000-0000-0000-0000-000000000000'; +ALTER TABLE prims ADD COLUMN CollisionSoundVolume float not null default 0.0; + +COMMIT; + +:VERSION 23 #--------------------- + +BEGIN; + +ALTER TABLE prims ADD COLUMN LinkNumber integer not null default 0; + +COMMIT; + +:VERSION 24 #--------------------- + +BEGIN; + +alter table regionsettings change column `object_bonus` `object_bonus` double NOT NULL; +alter table regionsettings change column `elevation_1_nw` `elevation_1_nw` double NOT NULL; +alter table regionsettings change column `elevation_2_nw` `elevation_2_nw` double NOT NULL; +alter table regionsettings change column `elevation_1_ne` `elevation_1_ne` double NOT NULL; +alter table regionsettings change column `elevation_2_ne` `elevation_2_ne` double NOT NULL; +alter table regionsettings change column `elevation_1_se` `elevation_1_se` double NOT NULL; +alter table regionsettings change column `elevation_2_se` `elevation_2_se` double NOT NULL; +alter table regionsettings change column `elevation_1_sw` `elevation_1_sw` double NOT NULL; +alter table regionsettings change column `elevation_2_sw` `elevation_2_sw` double NOT NULL; +alter table regionsettings change column `water_height` `water_height` double NOT NULL; +alter table regionsettings change column `terrain_raise_limit` `terrain_raise_limit` double NOT NULL; +alter table regionsettings change column `terrain_lower_limit` `terrain_lower_limit` double NOT NULL; +alter table regionsettings change column `sun_position` `sun_position` double NOT NULL; + +COMMIT; + + +:VERSION 25 #--------------------- + +BEGIN; + +alter table prims change column `PositionX` `PositionX` double default NULL; +alter table prims change column `PositionY` `PositionY` double default NULL; +alter table prims change column `PositionZ` `PositionZ` double default NULL; +alter table prims change column `GroupPositionX` `GroupPositionX` double default NULL; +alter table prims change column `GroupPositionY` `GroupPositionY` double default NULL; +alter table prims change column `GroupPositionZ` `GroupPositionZ` double default NULL; +alter table prims change column `VelocityX` `VelocityX` double default NULL; +alter table prims change column `VelocityY` `VelocityY` double default NULL; +alter table prims change column `VelocityZ` `VelocityZ` double default NULL; +alter table prims change column `AngularVelocityX` `AngularVelocityX` double default NULL; +alter table prims change column `AngularVelocityY` `AngularVelocityY` double default NULL; +alter table prims change column `AngularVelocityZ` `AngularVelocityZ` double default NULL; +alter table prims change column `AccelerationX` `AccelerationX` double default NULL; +alter table prims change column `AccelerationY` `AccelerationY` double default NULL; +alter table prims change column `AccelerationZ` `AccelerationZ` double default NULL; +alter table prims change column `RotationX` `RotationX` double default NULL; +alter table prims change column `RotationY` `RotationY` double default NULL; +alter table prims change column `RotationZ` `RotationZ` double default NULL; +alter table prims change column `RotationW` `RotationW` double default NULL; +alter table prims change column `SitTargetOffsetX` `SitTargetOffsetX` double default NULL; +alter table prims change column `SitTargetOffsetY` `SitTargetOffsetY` double default NULL; +alter table prims change column `SitTargetOffsetZ` `SitTargetOffsetZ` double default NULL; +alter table prims change column `SitTargetOrientW` `SitTargetOrientW` double default NULL; +alter table prims change column `SitTargetOrientX` `SitTargetOrientX` double default NULL; +alter table prims change column `SitTargetOrientY` `SitTargetOrientY` double default NULL; +alter table prims change column `SitTargetOrientZ` `SitTargetOrientZ` double default NULL; +alter table prims change column `LoopedSoundGain` `LoopedSoundGain` double NOT NULL default '0'; +alter table prims change column `OmegaX` `OmegaX` double NOT NULL default '0'; +alter table prims change column `OmegaY` `OmegaY` double NOT NULL default '0'; +alter table prims change column `OmegaZ` `OmegaZ` double NOT NULL default '0'; +alter table prims change column `CameraEyeOffsetX` `CameraEyeOffsetX` double NOT NULL default '0'; +alter table prims change column `CameraEyeOffsetY` `CameraEyeOffsetY` double NOT NULL default '0'; +alter table prims change column `CameraEyeOffsetZ` `CameraEyeOffsetZ` double NOT NULL default '0'; +alter table prims change column `CameraAtOffsetX` `CameraAtOffsetX` double NOT NULL default '0'; +alter table prims change column `CameraAtOffsetY` `CameraAtOffsetY` double NOT NULL default '0'; +alter table prims change column `CameraAtOffsetZ` `CameraAtOffsetZ` double NOT NULL default '0'; +alter table prims change column `CollisionSoundVolume` `CollisionSoundVolume` double NOT NULL default '0'; + +alter table primshapes change column `ScaleX` `ScaleX` double NOT NULL default '0'; +alter table primshapes change column `ScaleY` `ScaleY` double NOT NULL default '0'; +alter table primshapes change column `ScaleZ` `ScaleZ` double NOT NULL default '0'; + +COMMIT; + +:VERSION 26 #--------------------- + +begin; + +alter table prims change column `PositionX` `PositionX` double default NULL; +alter table prims change column `PositionY` `PositionY` double default NULL; +alter table prims change column `PositionZ` `PositionZ` double default NULL; +alter table prims change column `GroupPositionX` `GroupPositionX` double default NULL; +alter table prims change column `GroupPositionY` `GroupPositionY` double default NULL; +alter table prims change column `GroupPositionZ` `GroupPositionZ` double default NULL; +alter table prims change column `VelocityX` `VelocityX` double default NULL; +alter table prims change column `VelocityY` `VelocityY` double default NULL; +alter table prims change column `VelocityZ` `VelocityZ` double default NULL; +alter table prims change column `AngularVelocityX` `AngularVelocityX` double default NULL; +alter table prims change column `AngularVelocityY` `AngularVelocityY` double default NULL; +alter table prims change column `AngularVelocityZ` `AngularVelocityZ` double default NULL; +alter table prims change column `AccelerationX` `AccelerationX` double default NULL; +alter table prims change column `AccelerationY` `AccelerationY` double default NULL; +alter table prims change column `AccelerationZ` `AccelerationZ` double default NULL; +alter table prims change column `RotationX` `RotationX` double default NULL; +alter table prims change column `RotationY` `RotationY` double default NULL; +alter table prims change column `RotationZ` `RotationZ` double default NULL; +alter table prims change column `RotationW` `RotationW` double default NULL; +alter table prims change column `SitTargetOffsetX` `SitTargetOffsetX` double default NULL; +alter table prims change column `SitTargetOffsetY` `SitTargetOffsetY` double default NULL; +alter table prims change column `SitTargetOffsetZ` `SitTargetOffsetZ` double default NULL; +alter table prims change column `SitTargetOrientW` `SitTargetOrientW` double default NULL; +alter table prims change column `SitTargetOrientX` `SitTargetOrientX` double default NULL; +alter table prims change column `SitTargetOrientY` `SitTargetOrientY` double default NULL; +alter table prims change column `SitTargetOrientZ` `SitTargetOrientZ` double default NULL; +alter table prims change column `LoopedSoundGain` `LoopedSoundGain` double NOT NULL default '0'; +alter table prims change column `OmegaX` `OmegaX` double NOT NULL default '0'; +alter table prims change column `OmegaY` `OmegaY` double NOT NULL default '0'; +alter table prims change column `OmegaZ` `OmegaZ` double NOT NULL default '0'; +alter table prims change column `CameraEyeOffsetX` `CameraEyeOffsetX` double NOT NULL default '0'; +alter table prims change column `CameraEyeOffsetY` `CameraEyeOffsetY` double NOT NULL default '0'; +alter table prims change column `CameraEyeOffsetZ` `CameraEyeOffsetZ` double NOT NULL default '0'; +alter table prims change column `CameraAtOffsetX` `CameraAtOffsetX` double NOT NULL default '0'; +alter table prims change column `CameraAtOffsetY` `CameraAtOffsetY` double NOT NULL default '0'; +alter table prims change column `CameraAtOffsetZ` `CameraAtOffsetZ` double NOT NULL default '0'; +alter table prims change column `CollisionSoundVolume` `CollisionSoundVolume` double NOT NULL default '0'; + +commit; + +:VERSION 27 #--------------------- + +BEGIN; + +ALTER TABLE prims DROP COLUMN ParentID; + +COMMIT; + +:VERSION 28 #--------------------- + +BEGIN; + +update terrain + set RegionUUID = concat(substr(RegionUUID, 1, 8), "-", substr(RegionUUID, 9, 4), "-", substr(RegionUUID, 13, 4), "-", substr(RegionUUID, 17, 4), "-", substr(RegionUUID, 21, 12)) + where RegionUUID not like '%-%'; + + +update landaccesslist + set LandUUID = concat(substr(LandUUID, 1, 8), "-", substr(LandUUID, 9, 4), "-", substr(LandUUID, 13, 4), "-", substr(LandUUID, 17, 4), "-", substr(LandUUID, 21, 12)) + where LandUUID not like '%-%'; + +update landaccesslist + set AccessUUID = concat(substr(AccessUUID, 1, 8), "-", substr(AccessUUID, 9, 4), "-", substr(AccessUUID, 13, 4), "-", substr(AccessUUID, 17, 4), "-", substr(AccessUUID, 21, 12)) + where AccessUUID not like '%-%'; + + +update prims + set UUID = concat(substr(UUID, 1, 8), "-", substr(UUID, 9, 4), "-", substr(UUID, 13, 4), "-", substr(UUID, 17, 4), "-", substr(UUID, 21, 12)) + where UUID not like '%-%'; + +update prims + set RegionUUID = concat(substr(RegionUUID, 1, 8), "-", substr(RegionUUID, 9, 4), "-", substr(RegionUUID, 13, 4), "-", substr(RegionUUID, 17, 4), "-", substr(RegionUUID, 21, 12)) + where RegionUUID not like '%-%'; + +update prims + set SceneGroupID = concat(substr(SceneGroupID, 1, 8), "-", substr(SceneGroupID, 9, 4), "-", substr(SceneGroupID, 13, 4), "-", substr(SceneGroupID, 17, 4), "-", substr(SceneGroupID, 21, 12)) + where SceneGroupID not like '%-%'; + +update prims + set CreatorID = concat(substr(CreatorID, 1, 8), "-", substr(CreatorID, 9, 4), "-", substr(CreatorID, 13, 4), "-", substr(CreatorID, 17, 4), "-", substr(CreatorID, 21, 12)) + where CreatorID not like '%-%'; + +update prims + set OwnerID = concat(substr(OwnerID, 1, 8), "-", substr(OwnerID, 9, 4), "-", substr(OwnerID, 13, 4), "-", substr(OwnerID, 17, 4), "-", substr(OwnerID, 21, 12)) + where OwnerID not like '%-%'; + +update prims + set GroupID = concat(substr(GroupID, 1, 8), "-", substr(GroupID, 9, 4), "-", substr(GroupID, 13, 4), "-", substr(GroupID, 17, 4), "-", substr(GroupID, 21, 12)) + where GroupID not like '%-%'; + +update prims + set LastOwnerID = concat(substr(LastOwnerID, 1, 8), "-", substr(LastOwnerID, 9, 4), "-", substr(LastOwnerID, 13, 4), "-", substr(LastOwnerID, 17, 4), "-", substr(LastOwnerID, 21, 12)) + where LastOwnerID not like '%-%'; + + +update primshapes + set UUID = concat(substr(UUID, 1, 8), "-", substr(UUID, 9, 4), "-", substr(UUID, 13, 4), "-", substr(UUID, 17, 4), "-", substr(UUID, 21, 12)) + where UUID not like '%-%'; + + +update land + set UUID = concat(substr(UUID, 1, 8), "-", substr(UUID, 9, 4), "-", substr(UUID, 13, 4), "-", substr(UUID, 17, 4), "-", substr(UUID, 21, 12)) + where UUID not like '%-%'; + +update land + set RegionUUID = concat(substr(RegionUUID, 1, 8), "-", substr(RegionUUID, 9, 4), "-", substr(RegionUUID, 13, 4), "-", substr(RegionUUID, 17, 4), "-", substr(RegionUUID, 21, 12)) + where RegionUUID not like '%-%'; + +update land + set OwnerUUID = concat(substr(OwnerUUID, 1, 8), "-", substr(OwnerUUID, 9, 4), "-", substr(OwnerUUID, 13, 4), "-", substr(OwnerUUID, 17, 4), "-", substr(OwnerUUID, 21, 12)) + where OwnerUUID not like '%-%'; + +update land + set GroupUUID = concat(substr(GroupUUID, 1, 8), "-", substr(GroupUUID, 9, 4), "-", substr(GroupUUID, 13, 4), "-", substr(GroupUUID, 17, 4), "-", substr(GroupUUID, 21, 12)) + where GroupUUID not like '%-%'; + +update land + set MediaTextureUUID = concat(substr(MediaTextureUUID, 1, 8), "-", substr(MediaTextureUUID, 9, 4), "-", substr(MediaTextureUUID, 13, 4), "-", substr(MediaTextureUUID, 17, 4), "-", substr(MediaTextureUUID, 21, 12)) + where MediaTextureUUID not like '%-%'; + +update land + set SnapshotUUID = concat(substr(SnapshotUUID, 1, 8), "-", substr(SnapshotUUID, 9, 4), "-", substr(SnapshotUUID, 13, 4), "-", substr(SnapshotUUID, 17, 4), "-", substr(SnapshotUUID, 21, 12)) + where SnapshotUUID not like '%-%'; + +update land + set AuthbuyerID = concat(substr(AuthbuyerID, 1, 8), "-", substr(AuthbuyerID, 9, 4), "-", substr(AuthbuyerID, 13, 4), "-", substr(AuthbuyerID, 17, 4), "-", substr(AuthbuyerID, 21, 12)) + where AuthbuyerID not like '%-%'; + +COMMIT; + +:VERSION 29 #--------------------- + +BEGIN; + +ALTER TABLE prims ADD COLUMN PassTouches tinyint not null default 0; + +COMMIT; + +:VERSION 30 #--------------------- + +BEGIN; + +ALTER TABLE regionsettings ADD COLUMN loaded_creation_date varchar(20) default NULL; +ALTER TABLE regionsettings ADD COLUMN loaded_creation_time varchar(20) default NULL; +ALTER TABLE regionsettings ADD COLUMN loaded_creation_id varchar(64) default NULL; + +COMMIT; + +:VERSION 31 #--------------------- + +BEGIN; + +ALTER TABLE regionsettings DROP COLUMN loaded_creation_date; +ALTER TABLE regionsettings DROP COLUMN loaded_creation_time; +ALTER TABLE regionsettings ADD COLUMN loaded_creation_datetime int unsigned NOT NULL default 0; + +COMMIT; + +:VERSION 32 #--------------------- + +BEGIN; +ALTER TABLE estate_settings AUTO_INCREMENT = 100; +COMMIT; + + + + diff --git a/OpenSim/Data/MySQL/Resources/UserAccount.migrations b/OpenSim/Data/MySQL/Resources/UserAccount.migrations new file mode 100644 index 0000000000..84011e6e49 --- /dev/null +++ b/OpenSim/Data/MySQL/Resources/UserAccount.migrations @@ -0,0 +1,47 @@ +:VERSION 1 # ------------------------- + +BEGIN; + +CREATE TABLE `UserAccounts` ( + `PrincipalID` CHAR(36) NOT NULL, + `ScopeID` CHAR(36) NOT NULL, + `FirstName` VARCHAR(64) NOT NULL, + `LastName` VARCHAR(64) NOT NULL, + `Email` VARCHAR(64), + `ServiceURLs` TEXT, + `Created` INT(11) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +COMMIT; + +:VERSION 2 # ------------------------- + +BEGIN; + +INSERT INTO UserAccounts (PrincipalID, ScopeID, FirstName, LastName, Email, ServiceURLs, Created) SELECT `UUID` AS PrincipalID, '00000000-0000-0000-0000-000000000000' AS ScopeID, username AS FirstName, lastname AS LastName, email as Email, CONCAT('AssetServerURI=', userAssetURI, ' InventoryServerURI=', userInventoryURI, ' GatewayURI= HomeURI=') AS ServiceURLs, created as Created FROM users; + +COMMIT; + +:VERSION 3 # ------------------------- + +BEGIN; + +CREATE UNIQUE INDEX PrincipalID ON UserAccounts(PrincipalID); +CREATE INDEX Email ON UserAccounts(Email); +CREATE INDEX FirstName ON UserAccounts(FirstName); +CREATE INDEX LastName ON UserAccounts(LastName); +CREATE INDEX Name ON UserAccounts(FirstName,LastName); + +COMMIT; + +:VERSION 4 # ------------------------- + +BEGIN; + +ALTER TABLE UserAccounts ADD COLUMN UserLevel integer NOT NULL DEFAULT 0; +ALTER TABLE UserAccounts ADD COLUMN UserFlags integer NOT NULL DEFAULT 0; +ALTER TABLE UserAccounts ADD COLUMN UserTitle varchar(64) NOT NULL DEFAULT ''; + +COMMIT; + + diff --git a/OpenSim/Data/MySQL/Resources/001_UserStore.sql b/OpenSim/Data/MySQL/Resources/UserStore.migrations similarity index 72% rename from OpenSim/Data/MySQL/Resources/001_UserStore.sql rename to OpenSim/Data/MySQL/Resources/UserStore.migrations index 29ebc7d88b..f054611f04 100644 --- a/OpenSim/Data/MySQL/Resources/001_UserStore.sql +++ b/OpenSim/Data/MySQL/Resources/UserStore.migrations @@ -1,3 +1,5 @@ +:VERSION 1 # ----------------------------- + BEGIN; SET FOREIGN_KEY_CHECKS=0; @@ -104,4 +106,63 @@ CREATE TABLE `users` ( -- ---------------------------- -- Records -- ---------------------------- -COMMIT; \ No newline at end of file +COMMIT; + +:VERSION 2 # ----------------------------- + +BEGIN; + +ALTER TABLE users add homeRegionID char(36) NOT NULL default '00000000-0000-0000-0000-000000000000'; + +COMMIT; + +:VERSION 3 # ----------------------------- + +BEGIN; + +ALTER TABLE users add userFlags integer NOT NULL default 0; +ALTER TABLE users add godLevel integer NOT NULL default 0; + +COMMIT; + +:VERSION 4 # ----------------------------- + +BEGIN; + +ALTER TABLE users add customType varchar(32) not null default ''; +ALTER TABLE users add partner char(36) not null default '00000000-0000-0000-0000-000000000000'; + +COMMIT; + +:VERSION 5 # ----------------------------- + +BEGIN; + +CREATE TABLE `avatarattachments` (`UUID` char(36) NOT NULL, `attachpoint` int(11) NOT NULL, `item` char(36) NOT NULL, `asset` char(36) NOT NULL) ENGINE=InnoDB; + +COMMIT; + +:VERSION 6 # ----------------------------- + +BEGIN; + +ALTER TABLE agents add currentLookAt varchar(36) not null default ''; + +COMMIT; + +:VERSION 7 # ----------------------------- + +BEGIN; + +ALTER TABLE users add email varchar(250); + +COMMIT; + +:VERSION 8 # ----------------------------- + +BEGIN; + +ALTER TABLE users add scopeID char(36) not null default '00000000-0000-0000-0000-000000000000'; + +COMMIT; + From 1ad12851d076094d6fad3ebe604b4cae378eaef3 Mon Sep 17 00:00:00 2001 From: AlexRa Date: Thu, 6 May 2010 22:44:57 +0300 Subject: [PATCH 09/46] Migrations for SQLite converted to new format --- .../Data/SQLite/Resources/001_AssetStore.sql | 12 - .../SQLite/Resources/001_InventoryStore.sql | 32 -- .../Data/SQLite/Resources/001_RegionStore.sql | 144 ----- .../Data/SQLite/Resources/001_UserStore.sql | 39 -- .../Data/SQLite/Resources/002_AssetStore.sql | 10 - .../Data/SQLite/Resources/002_AuthStore.sql | 5 - .../SQLite/Resources/002_FriendsStore.sql | 5 - .../SQLite/Resources/002_InventoryStore.sql | 8 - .../Data/SQLite/Resources/002_RegionStore.sql | 10 - .../Data/SQLite/Resources/002_UserAccount.sql | 5 - .../Data/SQLite/Resources/002_UserStore.sql | 5 - .../Data/SQLite/Resources/003_AssetStore.sql | 1 - .../SQLite/Resources/003_InventoryStore.sql | 5 - .../Data/SQLite/Resources/003_RegionStore.sql | 5 - .../Data/SQLite/Resources/003_UserStore.sql | 6 - .../Data/SQLite/Resources/004_AssetStore.sql | 7 - .../Data/SQLite/Resources/004_RegionStore.sql | 38 -- .../Data/SQLite/Resources/004_UserStore.sql | 6 - .../Data/SQLite/Resources/005_RegionStore.sql | 5 - .../Data/SQLite/Resources/005_UserStore.sql | 5 - .../Data/SQLite/Resources/006_RegionStore.sql | 102 ---- .../Data/SQLite/Resources/006_UserStore.sql | 20 - .../Data/SQLite/Resources/007_RegionStore.sql | 8 - .../Data/SQLite/Resources/007_UserStore.sql | 7 - .../Data/SQLite/Resources/008_RegionStore.sql | 6 - .../Data/SQLite/Resources/008_UserStore.sql | 5 - .../Data/SQLite/Resources/009_RegionStore.sql | 8 - .../Data/SQLite/Resources/009_UserStore.sql | 11 - .../Data/SQLite/Resources/010_RegionStore.sql | 5 - .../Data/SQLite/Resources/010_UserStore.sql | 37 -- .../Data/SQLite/Resources/011_RegionStore.sql | 28 - .../Data/SQLite/Resources/012_RegionStore.sql | 5 - .../Data/SQLite/Resources/013_RegionStore.sql | 6 - .../Data/SQLite/Resources/014_RegionStore.sql | 8 - .../Data/SQLite/Resources/015_RegionStore.sql | 6 - .../Data/SQLite/Resources/016_RegionStore.sql | 5 - .../Data/SQLite/Resources/017_RegionStore.sql | 8 - .../Data/SQLite/Resources/018_RegionStore.sql | 79 --- .../SQLite/Resources/AssetStore.migrations | 42 ++ ...001_AuthStore.sql => AuthStore.migrations} | 11 + .../{001_Avatar.sql => Avatar.migrations} | 2 + ...iendsStore.sql => FriendsStore.migrations} | 10 + ...oryStore.sql => InventoryStore.migrations} | 56 ++ .../SQLite/Resources/RegionStore.migrations | 526 ++++++++++++++++++ ...UserAccount.sql => UserAccount.migrations} | 14 +- .../SQLite/Resources/UserStore.migrations | 169 ++++++ 46 files changed, 828 insertions(+), 709 deletions(-) delete mode 100644 OpenSim/Data/SQLite/Resources/001_AssetStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/001_InventoryStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/001_RegionStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/001_UserStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/002_AssetStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/002_AuthStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/002_FriendsStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/002_InventoryStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/002_RegionStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/002_UserAccount.sql delete mode 100644 OpenSim/Data/SQLite/Resources/002_UserStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/003_AssetStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/003_InventoryStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/003_RegionStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/003_UserStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/004_AssetStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/004_RegionStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/004_UserStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/005_RegionStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/005_UserStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/006_RegionStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/006_UserStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/007_RegionStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/007_UserStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/008_RegionStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/008_UserStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/009_RegionStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/009_UserStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/010_RegionStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/010_UserStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/011_RegionStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/012_RegionStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/013_RegionStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/014_RegionStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/015_RegionStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/016_RegionStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/017_RegionStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/018_RegionStore.sql create mode 100644 OpenSim/Data/SQLite/Resources/AssetStore.migrations rename OpenSim/Data/SQLite/Resources/{001_AuthStore.sql => AuthStore.migrations} (62%) rename OpenSim/Data/SQLite/Resources/{001_Avatar.sql => Avatar.migrations} (92%) rename OpenSim/Data/SQLite/Resources/{001_FriendsStore.sql => FriendsStore.migrations} (63%) rename OpenSim/Data/SQLite/Resources/{004_InventoryStore.sql => InventoryStore.migrations} (55%) create mode 100644 OpenSim/Data/SQLite/Resources/RegionStore.migrations rename OpenSim/Data/SQLite/Resources/{001_UserAccount.sql => UserAccount.migrations} (51%) create mode 100644 OpenSim/Data/SQLite/Resources/UserStore.migrations diff --git a/OpenSim/Data/SQLite/Resources/001_AssetStore.sql b/OpenSim/Data/SQLite/Resources/001_AssetStore.sql deleted file mode 100644 index 2e026cad19..0000000000 --- a/OpenSim/Data/SQLite/Resources/001_AssetStore.sql +++ /dev/null @@ -1,12 +0,0 @@ -BEGIN TRANSACTION; -CREATE TABLE assets( - UUID varchar(255) primary key, - Name varchar(255), - Description varchar(255), - Type integer, - InvType integer, - Local integer, - Temporary integer, - Data blob); - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/001_InventoryStore.sql b/OpenSim/Data/SQLite/Resources/001_InventoryStore.sql deleted file mode 100644 index 554d5c2ec8..0000000000 --- a/OpenSim/Data/SQLite/Resources/001_InventoryStore.sql +++ /dev/null @@ -1,32 +0,0 @@ -BEGIN TRANSACTION; - -CREATE TABLE inventoryfolders( - UUID varchar(255) primary key, - name varchar(255), - agentID varchar(255), - parentID varchar(255), - type integer, - version integer); - -CREATE TABLE inventoryitems( - UUID varchar(255) primary key, - assetID varchar(255), - assetType integer, - invType integer, - parentFolderID varchar(255), - avatarID varchar(255), - creatorsID varchar(255), - inventoryName varchar(255), - inventoryDescription varchar(255), - inventoryNextPermissions integer, - inventoryCurrentPermissions integer, - inventoryBasePermissions integer, - inventoryEveryOnePermissions integer, - salePrice integer default 99, - saleType integer default 0, - creationDate integer default 2000, - groupID varchar(255) default '00000000-0000-0000-0000-000000000000', - groupOwned integer default 0, - flags integer default 0); - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/001_RegionStore.sql b/OpenSim/Data/SQLite/Resources/001_RegionStore.sql deleted file mode 100644 index 39e8180cdc..0000000000 --- a/OpenSim/Data/SQLite/Resources/001_RegionStore.sql +++ /dev/null @@ -1,144 +0,0 @@ -BEGIN TRANSACTION; - -CREATE TABLE prims( - UUID varchar(255) primary key, - RegionUUID varchar(255), - ParentID integer, - CreationDate integer, - Name varchar(255), - SceneGroupID varchar(255), - Text varchar(255), - Description varchar(255), - SitName varchar(255), - TouchName varchar(255), - CreatorID varchar(255), - OwnerID varchar(255), - GroupID varchar(255), - LastOwnerID varchar(255), - OwnerMask integer, - NextOwnerMask integer, - GroupMask integer, - EveryoneMask integer, - BaseMask integer, - PositionX float, - PositionY float, - PositionZ float, - GroupPositionX float, - GroupPositionY float, - GroupPositionZ float, - VelocityX float, - VelocityY float, - VelocityZ float, - AngularVelocityX float, - AngularVelocityY float, - AngularVelocityZ float, - AccelerationX float, - AccelerationY float, - AccelerationZ float, - RotationX float, - RotationY float, - RotationZ float, - RotationW float, - ObjectFlags integer, - SitTargetOffsetX float NOT NULL default 0, - SitTargetOffsetY float NOT NULL default 0, - SitTargetOffsetZ float NOT NULL default 0, - SitTargetOrientW float NOT NULL default 0, - SitTargetOrientX float NOT NULL default 0, - SitTargetOrientY float NOT NULL default 0, - SitTargetOrientZ float NOT NULL default 0); - -CREATE TABLE primshapes( - UUID varchar(255) primary key, - Shape integer, - ScaleX float, - ScaleY float, - ScaleZ float, - PCode integer, - PathBegin integer, - PathEnd integer, - PathScaleX integer, - PathScaleY integer, - PathShearX integer, - PathShearY integer, - PathSkew integer, - PathCurve integer, - PathRadiusOffset integer, - PathRevolutions integer, - PathTaperX integer, - PathTaperY integer, - PathTwist integer, - PathTwistBegin integer, - ProfileBegin integer, - ProfileEnd integer, - ProfileCurve integer, - ProfileHollow integer, - Texture blob, - ExtraParams blob, - State Integer NOT NULL default 0); - -CREATE TABLE primitems( - itemID varchar(255) primary key, - primID varchar(255), - assetID varchar(255), - parentFolderID varchar(255), - invType integer, - assetType integer, - name varchar(255), - description varchar(255), - creationDate integer, - creatorID varchar(255), - ownerID varchar(255), - lastOwnerID varchar(255), - groupID varchar(255), - nextPermissions string, - currentPermissions string, - basePermissions string, - everyonePermissions string, - groupPermissions string); - -CREATE TABLE terrain( - RegionUUID varchar(255), - Revision integer, - Heightfield blob); - -CREATE TABLE land( - UUID varchar(255) primary key, - RegionUUID varchar(255), - LocalLandID string, - Bitmap blob, - Name varchar(255), - Desc varchar(255), - OwnerUUID varchar(255), - IsGroupOwned string, - Area integer, - AuctionID integer, - Category integer, - ClaimDate integer, - ClaimPrice integer, - GroupUUID varchar(255), - SalePrice integer, - LandStatus integer, - LandFlags string, - LandingType string, - MediaAutoScale string, - MediaTextureUUID varchar(255), - MediaURL varchar(255), - MusicURL varchar(255), - PassHours float, - PassPrice string, - SnapshotUUID varchar(255), - UserLocationX float, - UserLocationY float, - UserLocationZ float, - UserLookAtX float, - UserLookAtY float, - UserLookAtZ float, - AuthbuyerID varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000'); - -CREATE TABLE landaccesslist( - LandUUID varchar(255), - AccessUUID varchar(255), - Flags string); - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/001_UserStore.sql b/OpenSim/Data/SQLite/Resources/001_UserStore.sql deleted file mode 100644 index b584594ced..0000000000 --- a/OpenSim/Data/SQLite/Resources/001_UserStore.sql +++ /dev/null @@ -1,39 +0,0 @@ -BEGIN TRANSACTION; - --- users table -CREATE TABLE users( - UUID varchar(255) primary key, - username varchar(255), - surname varchar(255), - passwordHash varchar(255), - passwordSalt varchar(255), - homeRegionX integer, - homeRegionY integer, - homeLocationX float, - homeLocationY float, - homeLocationZ float, - homeLookAtX float, - homeLookAtY float, - homeLookAtZ float, - created integer, - lastLogin integer, - rootInventoryFolderID varchar(255), - userInventoryURI varchar(255), - userAssetURI varchar(255), - profileCanDoMask integer, - profileWantDoMask integer, - profileAboutText varchar(255), - profileFirstText varchar(255), - profileImage varchar(255), - profileFirstImage varchar(255), - webLoginKey text default '00000000-0000-0000-0000-000000000000'); --- friends table -CREATE TABLE userfriends( - ownerID varchar(255), - friendID varchar(255), - friendPerms integer, - ownerPerms integer, - datetimestamp integer); - -COMMIT; - diff --git a/OpenSim/Data/SQLite/Resources/002_AssetStore.sql b/OpenSim/Data/SQLite/Resources/002_AssetStore.sql deleted file mode 100644 index 5339b84dfd..0000000000 --- a/OpenSim/Data/SQLite/Resources/002_AssetStore.sql +++ /dev/null @@ -1,10 +0,0 @@ -BEGIN TRANSACTION; - -CREATE TEMPORARY TABLE assets_backup(UUID,Name,Description,Type,Local,Temporary,Data); -INSERT INTO assets_backup SELECT UUID,Name,Description,Type,Local,Temporary,Data FROM assets; -DROP TABLE assets; -CREATE TABLE assets(UUID,Name,Description,Type,Local,Temporary,Data); -INSERT INTO assets SELECT UUID,Name,Description,Type,Local,Temporary,Data FROM assets_backup; -DROP TABLE assets_backup; - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/002_AuthStore.sql b/OpenSim/Data/SQLite/Resources/002_AuthStore.sql deleted file mode 100644 index 3237b68fd6..0000000000 --- a/OpenSim/Data/SQLite/Resources/002_AuthStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN TRANSACTION; - -INSERT INTO auth (UUID, passwordHash, passwordSalt, webLoginKey) SELECT `UUID` AS UUID, `passwordHash` AS passwordHash, `passwordSalt` AS passwordSalt, `webLoginKey` AS webLoginKey FROM users; - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/002_FriendsStore.sql b/OpenSim/Data/SQLite/Resources/002_FriendsStore.sql deleted file mode 100644 index 6733502224..0000000000 --- a/OpenSim/Data/SQLite/Resources/002_FriendsStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN TRANSACTION; - -INSERT INTO `Friends` SELECT `ownerID`, `friendID`, `friendPerms`, 0 FROM `userfriends`; - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/002_InventoryStore.sql b/OpenSim/Data/SQLite/Resources/002_InventoryStore.sql deleted file mode 100644 index 01951d6582..0000000000 --- a/OpenSim/Data/SQLite/Resources/002_InventoryStore.sql +++ /dev/null @@ -1,8 +0,0 @@ -BEGIN TRANSACTION; - -create index inventoryfolders_agentid on inventoryfolders(agentid); -create index inventoryfolders_parentid on inventoryfolders(parentid); -create index inventoryitems_parentfolderid on inventoryitems(parentfolderid); -create index inventoryitems_avatarid on inventoryitems(avatarid); - -COMMIT; \ No newline at end of file diff --git a/OpenSim/Data/SQLite/Resources/002_RegionStore.sql b/OpenSim/Data/SQLite/Resources/002_RegionStore.sql deleted file mode 100644 index c5c7c99455..0000000000 --- a/OpenSim/Data/SQLite/Resources/002_RegionStore.sql +++ /dev/null @@ -1,10 +0,0 @@ -BEGIN TRANSACTION; - -CREATE TABLE regionban( - regionUUID varchar (255), - bannedUUID varchar (255), - bannedIp varchar (255), - bannedIpHostMask varchar (255) - ); - -COMMIT; \ No newline at end of file diff --git a/OpenSim/Data/SQLite/Resources/002_UserAccount.sql b/OpenSim/Data/SQLite/Resources/002_UserAccount.sql deleted file mode 100644 index c7a62932ac..0000000000 --- a/OpenSim/Data/SQLite/Resources/002_UserAccount.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN TRANSACTION; - -INSERT INTO UserAccounts (PrincipalID, ScopeID, FirstName, LastName, Email, ServiceURLs, Created) SELECT `UUID` AS PrincipalID, '00000000-0000-0000-0000-000000000000' AS ScopeID, username AS FirstName, surname AS LastName, '' as Email, '' AS ServiceURLs, created as Created FROM users; - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/002_UserStore.sql b/OpenSim/Data/SQLite/Resources/002_UserStore.sql deleted file mode 100644 index 48fc680b33..0000000000 --- a/OpenSim/Data/SQLite/Resources/002_UserStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -ALTER TABLE users add homeRegionID varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000'; - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/003_AssetStore.sql b/OpenSim/Data/SQLite/Resources/003_AssetStore.sql deleted file mode 100644 index f54f8d98a2..0000000000 --- a/OpenSim/Data/SQLite/Resources/003_AssetStore.sql +++ /dev/null @@ -1 +0,0 @@ -DELETE FROM assets WHERE UUID = 'dc4b9f0bd00845c696a401dd947ac621' diff --git a/OpenSim/Data/SQLite/Resources/003_InventoryStore.sql b/OpenSim/Data/SQLite/Resources/003_InventoryStore.sql deleted file mode 100644 index 4c6da91aab..0000000000 --- a/OpenSim/Data/SQLite/Resources/003_InventoryStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -alter table inventoryitems add column inventoryGroupPermissions integer unsigned not null default 0; - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/003_RegionStore.sql b/OpenSim/Data/SQLite/Resources/003_RegionStore.sql deleted file mode 100644 index 4db2f7587d..0000000000 --- a/OpenSim/Data/SQLite/Resources/003_RegionStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -ALTER TABLE primitems add flags integer not null default 0; - -COMMIT; \ No newline at end of file diff --git a/OpenSim/Data/SQLite/Resources/003_UserStore.sql b/OpenSim/Data/SQLite/Resources/003_UserStore.sql deleted file mode 100644 index 6f890eeec1..0000000000 --- a/OpenSim/Data/SQLite/Resources/003_UserStore.sql +++ /dev/null @@ -1,6 +0,0 @@ -BEGIN; - -ALTER TABLE users add userFlags integer NOT NULL default 0; -ALTER TABLE users add godLevel integer NOT NULL default 0; - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/004_AssetStore.sql b/OpenSim/Data/SQLite/Resources/004_AssetStore.sql deleted file mode 100644 index 39421c4434..0000000000 --- a/OpenSim/Data/SQLite/Resources/004_AssetStore.sql +++ /dev/null @@ -1,7 +0,0 @@ -BEGIN; - -update assets - set UUID = substr(UUID, 1, 8) || "-" || substr(UUID, 9, 4) || "-" || substr(UUID, 13, 4) || "-" || substr(UUID, 17, 4) || "-" || substr(UUID, 21, 12) - where UUID not like '%-%'; - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/004_RegionStore.sql b/OpenSim/Data/SQLite/Resources/004_RegionStore.sql deleted file mode 100644 index de328cb47a..0000000000 --- a/OpenSim/Data/SQLite/Resources/004_RegionStore.sql +++ /dev/null @@ -1,38 +0,0 @@ -BEGIN; - -create table regionsettings ( - regionUUID char(36) not null, - block_terraform integer not null, - block_fly integer not null, - allow_damage integer not null, - restrict_pushing integer not null, - allow_land_resell integer not null, - allow_land_join_divide integer not null, - block_show_in_search integer not null, - agent_limit integer not null, - object_bonus float not null, - maturity integer not null, - disable_scripts integer not null, - disable_collisions integer not null, - disable_physics integer not null, - terrain_texture_1 char(36) not null, - terrain_texture_2 char(36) not null, - terrain_texture_3 char(36) not null, - terrain_texture_4 char(36) not null, - elevation_1_nw float not null, - elevation_2_nw float not null, - elevation_1_ne float not null, - elevation_2_ne float not null, - elevation_1_se float not null, - elevation_2_se float not null, - elevation_1_sw float not null, - elevation_2_sw float not null, - water_height float not null, - terrain_raise_limit float not null, - terrain_lower_limit float not null, - use_estate_sun integer not null, - fixed_sun integer not null, - sun_position float not null, - covenant char(36)); - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/004_UserStore.sql b/OpenSim/Data/SQLite/Resources/004_UserStore.sql deleted file mode 100644 index 03142afa37..0000000000 --- a/OpenSim/Data/SQLite/Resources/004_UserStore.sql +++ /dev/null @@ -1,6 +0,0 @@ -BEGIN; - -ALTER TABLE users add customType varchar(32) not null default ''; -ALTER TABLE users add partner char(36) not null default '00000000-0000-0000-0000-000000000000'; - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/005_RegionStore.sql b/OpenSim/Data/SQLite/Resources/005_RegionStore.sql deleted file mode 100644 index 1f6d1bd271..0000000000 --- a/OpenSim/Data/SQLite/Resources/005_RegionStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -delete from regionsettings; - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/005_UserStore.sql b/OpenSim/Data/SQLite/Resources/005_UserStore.sql deleted file mode 100644 index e45c09a493..0000000000 --- a/OpenSim/Data/SQLite/Resources/005_UserStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -CREATE TABLE `avatarattachments` (`UUID` char(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000', `attachpoint` int(11) NOT NULL DEFAULT 0, `item` char(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000', `asset` char(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000'); - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/006_RegionStore.sql b/OpenSim/Data/SQLite/Resources/006_RegionStore.sql deleted file mode 100644 index 94ed8181cd..0000000000 --- a/OpenSim/Data/SQLite/Resources/006_RegionStore.sql +++ /dev/null @@ -1,102 +0,0 @@ -BEGIN TRANSACTION; - -CREATE TABLE estate_groups ( - EstateID int(10) NOT NULL, - uuid char(36) NOT NULL -); - -CREATE TABLE estate_managers ( - EstateID int(10) NOT NULL, - uuid char(36) NOT NULL -); - -CREATE TABLE estate_map ( - RegionID char(36) NOT NULL default '00000000-0000-0000-0000-000000000000', - EstateID int(11) NOT NULL -); - -CREATE TABLE estate_settings ( - EstateID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - EstateName varchar(64) default NULL, - AbuseEmailToEstateOwner tinyint(4) NOT NULL, - DenyAnonymous tinyint(4) NOT NULL, - ResetHomeOnTeleport tinyint(4) NOT NULL, - FixedSun tinyint(4) NOT NULL, - DenyTransacted tinyint(4) NOT NULL, - BlockDwell tinyint(4) NOT NULL, - DenyIdentified tinyint(4) NOT NULL, - AllowVoice tinyint(4) NOT NULL, - UseGlobalTime tinyint(4) NOT NULL, - PricePerMeter int(11) NOT NULL, - TaxFree tinyint(4) NOT NULL, - AllowDirectTeleport tinyint(4) NOT NULL, - RedirectGridX int(11) NOT NULL, - RedirectGridY int(11) NOT NULL, - ParentEstateID int(10) NOT NULL, - SunPosition double NOT NULL, - EstateSkipScripts tinyint(4) NOT NULL, - BillableFactor float NOT NULL, - PublicAccess tinyint(4) NOT NULL -); -insert into estate_settings (EstateID,EstateName,AbuseEmailToEstateOwner,DenyAnonymous,ResetHomeOnTeleport,FixedSun,DenyTransacted,BlockDwell,DenyIdentified,AllowVoice,UseGlobalTime,PricePerMeter,TaxFree,AllowDirectTeleport,RedirectGridX,RedirectGridY,ParentEstateID,SunPosition,PublicAccess,EstateSkipScripts,BillableFactor) values ( 99, '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''); -delete from estate_settings; -CREATE TABLE estate_users ( - EstateID int(10) NOT NULL, - uuid char(36) NOT NULL -); - -CREATE TABLE estateban ( - EstateID int(10) NOT NULL, - bannedUUID varchar(36) NOT NULL, - bannedIp varchar(16) NOT NULL, - bannedIpHostMask varchar(16) NOT NULL, - bannedNameMask varchar(64) default NULL -); - -drop table regionsettings; -CREATE TABLE regionsettings ( - regionUUID char(36) NOT NULL, - block_terraform int(11) NOT NULL, - block_fly int(11) NOT NULL, - allow_damage int(11) NOT NULL, - restrict_pushing int(11) NOT NULL, - allow_land_resell int(11) NOT NULL, - allow_land_join_divide int(11) NOT NULL, - block_show_in_search int(11) NOT NULL, - agent_limit int(11) NOT NULL, - object_bonus float NOT NULL, - maturity int(11) NOT NULL, - disable_scripts int(11) NOT NULL, - disable_collisions int(11) NOT NULL, - disable_physics int(11) NOT NULL, - terrain_texture_1 char(36) NOT NULL, - terrain_texture_2 char(36) NOT NULL, - terrain_texture_3 char(36) NOT NULL, - terrain_texture_4 char(36) NOT NULL, - elevation_1_nw float NOT NULL, - elevation_2_nw float NOT NULL, - elevation_1_ne float NOT NULL, - elevation_2_ne float NOT NULL, - elevation_1_se float NOT NULL, - elevation_2_se float NOT NULL, - elevation_1_sw float NOT NULL, - elevation_2_sw float NOT NULL, - water_height float NOT NULL, - terrain_raise_limit float NOT NULL, - terrain_lower_limit float NOT NULL, - use_estate_sun int(11) NOT NULL, - fixed_sun int(11) NOT NULL, - sun_position float NOT NULL, - covenant char(36) default NULL, - Sandbox tinyint(4) NOT NULL, - PRIMARY KEY (regionUUID) -); - -CREATE INDEX estate_ban_estate_id on estateban(EstateID); -CREATE INDEX estate_groups_estate_id on estate_groups(EstateID); -CREATE INDEX estate_managers_estate_id on estate_managers(EstateID); -CREATE INDEX estate_map_estate_id on estate_map(EstateID); -CREATE UNIQUE INDEX estate_map_region_id on estate_map(RegionID); -CREATE INDEX estate_users_estate_id on estate_users(EstateID); - -COMMIT; \ No newline at end of file diff --git a/OpenSim/Data/SQLite/Resources/006_UserStore.sql b/OpenSim/Data/SQLite/Resources/006_UserStore.sql deleted file mode 100644 index f9454c55cf..0000000000 --- a/OpenSim/Data/SQLite/Resources/006_UserStore.sql +++ /dev/null @@ -1,20 +0,0 @@ -BEGIN TRANSACTION; - --- usersagents table -CREATE TABLE IF NOT EXISTS useragents( - UUID varchar(255) primary key, - agentIP varchar(255), - agentPort integer, - agentOnline boolean, - sessionID varchar(255), - secureSessionID varchar(255), - regionID varchar(255), - loginTime integer, - logoutTime integer, - currentRegion varchar(255), - currentHandle varchar(255), - currentPosX float, - currentPosY float, - currentPosZ float); - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/007_RegionStore.sql b/OpenSim/Data/SQLite/Resources/007_RegionStore.sql deleted file mode 100644 index 1c813a0d40..0000000000 --- a/OpenSim/Data/SQLite/Resources/007_RegionStore.sql +++ /dev/null @@ -1,8 +0,0 @@ -begin; - -alter table estate_settings add column AbuseEmail varchar(255) not null default ''; - -alter table estate_settings add column EstateOwner varchar(36) not null default ''; - -commit; - diff --git a/OpenSim/Data/SQLite/Resources/007_UserStore.sql b/OpenSim/Data/SQLite/Resources/007_UserStore.sql deleted file mode 100644 index 8b0cd285c7..0000000000 --- a/OpenSim/Data/SQLite/Resources/007_UserStore.sql +++ /dev/null @@ -1,7 +0,0 @@ -BEGIN TRANSACTION; - -ALTER TABLE useragents add currentLookAtX float not null default 128; -ALTER TABLE useragents add currentLookAtY float not null default 128; -ALTER TABLE useragents add currentLookAtZ float not null default 70; - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/008_RegionStore.sql b/OpenSim/Data/SQLite/Resources/008_RegionStore.sql deleted file mode 100644 index 28bfbf59c3..0000000000 --- a/OpenSim/Data/SQLite/Resources/008_RegionStore.sql +++ /dev/null @@ -1,6 +0,0 @@ -begin; - -alter table estate_settings add column DenyMinors tinyint not null default 0; - -commit; - diff --git a/OpenSim/Data/SQLite/Resources/008_UserStore.sql b/OpenSim/Data/SQLite/Resources/008_UserStore.sql deleted file mode 100644 index 97da81848c..0000000000 --- a/OpenSim/Data/SQLite/Resources/008_UserStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN TRANSACTION; - -ALTER TABLE users add email varchar(250); - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/009_RegionStore.sql b/OpenSim/Data/SQLite/Resources/009_RegionStore.sql deleted file mode 100644 index 1f40548f36..0000000000 --- a/OpenSim/Data/SQLite/Resources/009_RegionStore.sql +++ /dev/null @@ -1,8 +0,0 @@ -BEGIN; - -ALTER TABLE prims ADD COLUMN ColorR integer not null default 0; -ALTER TABLE prims ADD COLUMN ColorG integer not null default 0; -ALTER TABLE prims ADD COLUMN ColorB integer not null default 0; -ALTER TABLE prims ADD COLUMN ColorA integer not null default 0; - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/009_UserStore.sql b/OpenSim/Data/SQLite/Resources/009_UserStore.sql deleted file mode 100644 index 8ab03ef897..0000000000 --- a/OpenSim/Data/SQLite/Resources/009_UserStore.sql +++ /dev/null @@ -1,11 +0,0 @@ -BEGIN; - -update users - set UUID = substr(UUID, 1, 8) || "-" || substr(UUID, 9, 4) || "-" || substr(UUID, 13, 4) || "-" || substr(UUID, 17, 4) || "-" || substr(UUID, 21, 12) - where UUID not like '%-%'; - -update useragents - set UUID = substr(UUID, 1, 8) || "-" || substr(UUID, 9, 4) || "-" || substr(UUID, 13, 4) || "-" || substr(UUID, 17, 4) || "-" || substr(UUID, 21, 12) - where UUID not like '%-%'; - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/010_RegionStore.sql b/OpenSim/Data/SQLite/Resources/010_RegionStore.sql deleted file mode 100644 index b91ccf0a8d..0000000000 --- a/OpenSim/Data/SQLite/Resources/010_RegionStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -ALTER TABLE prims ADD COLUMN ClickAction INTEGER NOT NULL default 0; - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/010_UserStore.sql b/OpenSim/Data/SQLite/Resources/010_UserStore.sql deleted file mode 100644 index 5f956dadfd..0000000000 --- a/OpenSim/Data/SQLite/Resources/010_UserStore.sql +++ /dev/null @@ -1,37 +0,0 @@ -BEGIN TRANSACTION; - -CREATE TABLE IF NOT EXISTS avatarappearance( - Owner varchar(36) NOT NULL primary key, - BodyItem varchar(36) DEFAULT NULL, - BodyAsset varchar(36) DEFAULT NULL, - SkinItem varchar(36) DEFAULT NULL, - SkinAsset varchar(36) DEFAULT NULL, - HairItem varchar(36) DEFAULT NULL, - HairAsset varchar(36) DEFAULT NULL, - EyesItem varchar(36) DEFAULT NULL, - EyesAsset varchar(36) DEFAULT NULL, - ShirtItem varchar(36) DEFAULT NULL, - ShirtAsset varchar(36) DEFAULT NULL, - PantsItem varchar(36) DEFAULT NULL, - PantsAsset varchar(36) DEFAULT NULL, - ShoesItem varchar(36) DEFAULT NULL, - ShoesAsset varchar(36) DEFAULT NULL, - SocksItem varchar(36) DEFAULT NULL, - SocksAsset varchar(36) DEFAULT NULL, - JacketItem varchar(36) DEFAULT NULL, - JacketAsset varchar(36) DEFAULT NULL, - GlovesItem varchar(36) DEFAULT NULL, - GlovesAsset varchar(36) DEFAULT NULL, - UnderShirtItem varchar(36) DEFAULT NULL, - UnderShirtAsset varchar(36) DEFAULT NULL, - UnderPantsItem varchar(36) DEFAULT NULL, - UnderPantsAsset varchar(36) DEFAULT NULL, - SkirtItem varchar(36) DEFAULT NULL, - SkirtAsset varchar(36) DEFAULT NULL, - Texture blob, - VisualParams blob, - Serial int DEFAULT NULL, - AvatarHeight float DEFAULT NULL -); - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/011_RegionStore.sql b/OpenSim/Data/SQLite/Resources/011_RegionStore.sql deleted file mode 100644 index 42bef89616..0000000000 --- a/OpenSim/Data/SQLite/Resources/011_RegionStore.sql +++ /dev/null @@ -1,28 +0,0 @@ -BEGIN; - -ALTER TABLE prims ADD COLUMN PayPrice INTEGER NOT NULL default 0; -ALTER TABLE prims ADD COLUMN PayButton1 INTEGER NOT NULL default 0; -ALTER TABLE prims ADD COLUMN PayButton2 INTEGER NOT NULL default 0; -ALTER TABLE prims ADD COLUMN PayButton3 INTEGER NOT NULL default 0; -ALTER TABLE prims ADD COLUMN PayButton4 INTEGER NOT NULL default 0; -ALTER TABLE prims ADD COLUMN LoopedSound varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000'; -ALTER TABLE prims ADD COLUMN LoopedSoundGain float NOT NULL default 0; -ALTER TABLE prims ADD COLUMN TextureAnimation string; -ALTER TABLE prims ADD COLUMN ParticleSystem string; -ALTER TABLE prims ADD COLUMN OmegaX float NOT NULL default 0; -ALTER TABLE prims ADD COLUMN OmegaY float NOT NULL default 0; -ALTER TABLE prims ADD COLUMN OmegaZ float NOT NULL default 0; -ALTER TABLE prims ADD COLUMN CameraEyeOffsetX float NOT NULL default 0; -ALTER TABLE prims ADD COLUMN CameraEyeOffsetY float NOT NULL default 0; -ALTER TABLE prims ADD COLUMN CameraEyeOffsetZ float NOT NULL default 0; -ALTER TABLE prims ADD COLUMN CameraAtOffsetX float NOT NULL default 0; -ALTER TABLE prims ADD COLUMN CameraAtOffsetY float NOT NULL default 0; -ALTER TABLE prims ADD COLUMN CameraAtOffsetZ float NOT NULL default 0; -ALTER TABLE prims ADD COLUMN ForceMouselook string NOT NULL default 0; -ALTER TABLE prims ADD COLUMN ScriptAccessPin INTEGER NOT NULL default 0; -ALTER TABLE prims ADD COLUMN AllowedDrop INTEGER NOT NULL default 0; -ALTER TABLE prims ADD COLUMN DieAtEdge string NOT NULL default 0; -ALTER TABLE prims ADD COLUMN SalePrice INTEGER NOT NULL default 0; -ALTER TABLE prims ADD COLUMN SaleType string NOT NULL default 0; - -COMMIT; \ No newline at end of file diff --git a/OpenSim/Data/SQLite/Resources/012_RegionStore.sql b/OpenSim/Data/SQLite/Resources/012_RegionStore.sql deleted file mode 100644 index d952b78bd2..0000000000 --- a/OpenSim/Data/SQLite/Resources/012_RegionStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -ALTER TABLE prims ADD COLUMN Material INTEGER NOT NULL default 3; - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/013_RegionStore.sql b/OpenSim/Data/SQLite/Resources/013_RegionStore.sql deleted file mode 100644 index 11529cd3f1..0000000000 --- a/OpenSim/Data/SQLite/Resources/013_RegionStore.sql +++ /dev/null @@ -1,6 +0,0 @@ -BEGIN; - -ALTER TABLE land ADD COLUMN OtherCleanTime INTEGER NOT NULL default 0; -ALTER TABLE land ADD COLUMN Dwell INTEGER NOT NULL default 0; - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/014_RegionStore.sql b/OpenSim/Data/SQLite/Resources/014_RegionStore.sql deleted file mode 100644 index c59b27e745..0000000000 --- a/OpenSim/Data/SQLite/Resources/014_RegionStore.sql +++ /dev/null @@ -1,8 +0,0 @@ -begin; - -ALTER TABLE regionsettings ADD COLUMN sunvectorx double NOT NULL default 0; -ALTER TABLE regionsettings ADD COLUMN sunvectory double NOT NULL default 0; -ALTER TABLE regionsettings ADD COLUMN sunvectorz double NOT NULL default 0; - -commit; - diff --git a/OpenSim/Data/SQLite/Resources/015_RegionStore.sql b/OpenSim/Data/SQLite/Resources/015_RegionStore.sql deleted file mode 100644 index c43f356be3..0000000000 --- a/OpenSim/Data/SQLite/Resources/015_RegionStore.sql +++ /dev/null @@ -1,6 +0,0 @@ -BEGIN; - -ALTER TABLE prims ADD COLUMN CollisionSound varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000'; -ALTER TABLE prims ADD COLUMN CollisionSoundVolume float NOT NULL default 0; - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/016_RegionStore.sql b/OpenSim/Data/SQLite/Resources/016_RegionStore.sql deleted file mode 100644 index 52f160cdbc..0000000000 --- a/OpenSim/Data/SQLite/Resources/016_RegionStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -ALTER TABLE prims ADD COLUMN VolumeDetect INTEGER NOT NULL DEFAULT 0; - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/017_RegionStore.sql b/OpenSim/Data/SQLite/Resources/017_RegionStore.sql deleted file mode 100644 index 6c6b7b5d40..0000000000 --- a/OpenSim/Data/SQLite/Resources/017_RegionStore.sql +++ /dev/null @@ -1,8 +0,0 @@ -BEGIN; -CREATE TEMPORARY TABLE prims_backup(UUID,RegionUUID,CreationDate,Name,SceneGroupID,Text,Description,SitName,TouchName,CreatorID,OwnerID,GroupID,LastOwnerID,OwnerMask,NextOwnerMask,GroupMask,EveryoneMask,BaseMask,PositionX,PositionY,PositionZ,GroupPositionX,GroupPositionY,GroupPositionZ,VelocityX,VelocityY,VelocityZ,AngularVelocityX,AngularVelocityY,AngularVelocityZ,AccelerationX,AccelerationY,AccelerationZ,RotationX,RotationY,RotationZ,RotationW,ObjectFlags,SitTargetOffsetX,SitTargetOffsetY,SitTargetOffsetZ,SitTargetOrientW,SitTargetOrientX,SitTargetOrientY,SitTargetOrientZ,ColorR,ColorG,ColorB,ColorA,ClickAction,PayPrice,PayButton1,PayButton2,PayButton3,PayButton4,LoopedSound,LoopedSoundGain,TextureAnimation,ParticleSystem,OmegaX,OmegaY,OmegaZ,CameraEyeOffsetX,CameraEyeOffsetY,CameraEyeOffsetZ,CameraAtOffsetX,CameraAtOffsetY,CameraAtOffsetZ,ForceMouselook,ScriptAccessPin,AllowedDrop,DieAtEdge,SalePrice,SaleType,Material,CollisionSound,CollisionSoundVolume,VolumeDetect); -INSERT INTO prims_backup SELECT UUID,RegionUUID,CreationDate,Name,SceneGroupID,Text,Description,SitName,TouchName,CreatorID,OwnerID,GroupID,LastOwnerID,OwnerMask,NextOwnerMask,GroupMask,EveryoneMask,BaseMask,PositionX,PositionY,PositionZ,GroupPositionX,GroupPositionY,GroupPositionZ,VelocityX,VelocityY,VelocityZ,AngularVelocityX,AngularVelocityY,AngularVelocityZ,AccelerationX,AccelerationY,AccelerationZ,RotationX,RotationY,RotationZ,RotationW,ObjectFlags,SitTargetOffsetX,SitTargetOffsetY,SitTargetOffsetZ,SitTargetOrientW,SitTargetOrientX,SitTargetOrientY,SitTargetOrientZ,ColorR,ColorG,ColorB,ColorA,ClickAction,PayPrice,PayButton1,PayButton2,PayButton3,PayButton4,LoopedSound,LoopedSoundGain,TextureAnimation,ParticleSystem,OmegaX,OmegaY,OmegaZ,CameraEyeOffsetX,CameraEyeOffsetY,CameraEyeOffsetZ,CameraAtOffsetX,CameraAtOffsetY,CameraAtOffsetZ,ForceMouselook,ScriptAccessPin,AllowedDrop,DieAtEdge,SalePrice,SaleType,Material,CollisionSound,CollisionSoundVolume,VolumeDetect FROM prims; -DROP TABLE prims; -CREATE TABLE prims(UUID,RegionUUID,CreationDate,Name,SceneGroupID,Text,Description,SitName,TouchName,CreatorID,OwnerID,GroupID,LastOwnerID,OwnerMask,NextOwnerMask,GroupMask,EveryoneMask,BaseMask,PositionX,PositionY,PositionZ,GroupPositionX,GroupPositionY,GroupPositionZ,VelocityX,VelocityY,VelocityZ,AngularVelocityX,AngularVelocityY,AngularVelocityZ,AccelerationX,AccelerationY,AccelerationZ,RotationX,RotationY,RotationZ,RotationW,ObjectFlags,SitTargetOffsetX,SitTargetOffsetY,SitTargetOffsetZ,SitTargetOrientW,SitTargetOrientX,SitTargetOrientY,SitTargetOrientZ,ColorR,ColorG,ColorB,ColorA,ClickAction,PayPrice,PayButton1,PayButton2,PayButton3,PayButton4,LoopedSound,LoopedSoundGain,TextureAnimation,ParticleSystem,OmegaX,OmegaY,OmegaZ,CameraEyeOffsetX,CameraEyeOffsetY,CameraEyeOffsetZ,CameraAtOffsetX,CameraAtOffsetY,CameraAtOffsetZ,ForceMouselook,ScriptAccessPin,AllowedDrop,DieAtEdge,SalePrice,SaleType,Material,CollisionSound,CollisionSoundVolume,VolumeDetect); -INSERT INTO prims SELECT UUID,RegionUUID,CreationDate,Name,SceneGroupID,Text,Description,SitName,TouchName,CreatorID,OwnerID,GroupID,LastOwnerID,OwnerMask,NextOwnerMask,GroupMask,EveryoneMask,BaseMask,PositionX,PositionY,PositionZ,GroupPositionX,GroupPositionY,GroupPositionZ,VelocityX,VelocityY,VelocityZ,AngularVelocityX,AngularVelocityY,AngularVelocityZ,AccelerationX,AccelerationY,AccelerationZ,RotationX,RotationY,RotationZ,RotationW,ObjectFlags,SitTargetOffsetX,SitTargetOffsetY,SitTargetOffsetZ,SitTargetOrientW,SitTargetOrientX,SitTargetOrientY,SitTargetOrientZ,ColorR,ColorG,ColorB,ColorA,ClickAction,PayPrice,PayButton1,PayButton2,PayButton3,PayButton4,LoopedSound,LoopedSoundGain,TextureAnimation,ParticleSystem,OmegaX,OmegaY,OmegaZ,CameraEyeOffsetX,CameraEyeOffsetY,CameraEyeOffsetZ,CameraAtOffsetX,CameraAtOffsetY,CameraAtOffsetZ,ForceMouselook,ScriptAccessPin,AllowedDrop,DieAtEdge,SalePrice,SaleType,Material,CollisionSound,CollisionSoundVolume,VolumeDetect FROM prims_backup; -DROP TABLE prims_backup; -COMMIT; \ No newline at end of file diff --git a/OpenSim/Data/SQLite/Resources/018_RegionStore.sql b/OpenSim/Data/SQLite/Resources/018_RegionStore.sql deleted file mode 100644 index 6a390c2161..0000000000 --- a/OpenSim/Data/SQLite/Resources/018_RegionStore.sql +++ /dev/null @@ -1,79 +0,0 @@ -BEGIN; - -update terrain - set RegionUUID = substr(RegionUUID, 1, 8) || "-" || substr(RegionUUID, 9, 4) || "-" || substr(RegionUUID, 13, 4) || "-" || substr(RegionUUID, 17, 4) || "-" || substr(RegionUUID, 21, 12) - where RegionUUID not like '%-%'; - - -update landaccesslist - set LandUUID = substr(LandUUID, 1, 8) || "-" || substr(LandUUID, 9, 4) || "-" || substr(LandUUID, 13, 4) || "-" || substr(LandUUID, 17, 4) || "-" || substr(LandUUID, 21, 12) - where LandUUID not like '%-%'; - -update landaccesslist - set AccessUUID = substr(AccessUUID, 1, 8) || "-" || substr(AccessUUID, 9, 4) || "-" || substr(AccessUUID, 13, 4) || "-" || substr(AccessUUID, 17, 4) || "-" || substr(AccessUUID, 21, 12) - where AccessUUID not like '%-%'; - - -update prims - set UUID = substr(UUID, 1, 8) || "-" || substr(UUID, 9, 4) || "-" || substr(UUID, 13, 4) || "-" || substr(UUID, 17, 4) || "-" || substr(UUID, 21, 12) - where UUID not like '%-%'; - -update prims - set RegionUUID = substr(RegionUUID, 1, 8) || "-" || substr(RegionUUID, 9, 4) || "-" || substr(RegionUUID, 13, 4) || "-" || substr(RegionUUID, 17, 4) || "-" || substr(RegionUUID, 21, 12) - where RegionUUID not like '%-%'; - -update prims - set SceneGroupID = substr(SceneGroupID, 1, 8) || "-" || substr(SceneGroupID, 9, 4) || "-" || substr(SceneGroupID, 13, 4) || "-" || substr(SceneGroupID, 17, 4) || "-" || substr(SceneGroupID, 21, 12) - where SceneGroupID not like '%-%'; - -update prims - set CreatorID = substr(CreatorID, 1, 8) || "-" || substr(CreatorID, 9, 4) || "-" || substr(CreatorID, 13, 4) || "-" || substr(CreatorID, 17, 4) || "-" || substr(CreatorID, 21, 12) - where CreatorID not like '%-%'; - -update prims - set OwnerID = substr(OwnerID, 1, 8) || "-" || substr(OwnerID, 9, 4) || "-" || substr(OwnerID, 13, 4) || "-" || substr(OwnerID, 17, 4) || "-" || substr(OwnerID, 21, 12) - where OwnerID not like '%-%'; - -update prims - set GroupID = substr(GroupID, 1, 8) || "-" || substr(GroupID, 9, 4) || "-" || substr(GroupID, 13, 4) || "-" || substr(GroupID, 17, 4) || "-" || substr(GroupID, 21, 12) - where GroupID not like '%-%'; - -update prims - set LastOwnerID = substr(LastOwnerID, 1, 8) || "-" || substr(LastOwnerID, 9, 4) || "-" || substr(LastOwnerID, 13, 4) || "-" || substr(LastOwnerID, 17, 4) || "-" || substr(LastOwnerID, 21, 12) - where LastOwnerID not like '%-%'; - - -update primshapes - set UUID = substr(UUID, 1, 8) || "-" || substr(UUID, 9, 4) || "-" || substr(UUID, 13, 4) || "-" || substr(UUID, 17, 4) || "-" || substr(UUID, 21, 12) - where UUID not like '%-%'; - - -update land - set UUID = substr(UUID, 1, 8) || "-" || substr(UUID, 9, 4) || "-" || substr(UUID, 13, 4) || "-" || substr(UUID, 17, 4) || "-" || substr(UUID, 21, 12) - where UUID not like '%-%'; - -update land - set RegionUUID = substr(RegionUUID, 1, 8) || "-" || substr(RegionUUID, 9, 4) || "-" || substr(RegionUUID, 13, 4) || "-" || substr(RegionUUID, 17, 4) || "-" || substr(RegionUUID, 21, 12) - where RegionUUID not like '%-%'; - -update land - set OwnerUUID = substr(OwnerUUID, 1, 8) || "-" || substr(OwnerUUID, 9, 4) || "-" || substr(OwnerUUID, 13, 4) || "-" || substr(OwnerUUID, 17, 4) || "-" || substr(OwnerUUID, 21, 12) - where OwnerUUID not like '%-%'; - -update land - set GroupUUID = substr(GroupUUID, 1, 8) || "-" || substr(GroupUUID, 9, 4) || "-" || substr(GroupUUID, 13, 4) || "-" || substr(GroupUUID, 17, 4) || "-" || substr(GroupUUID, 21, 12) - where GroupUUID not like '%-%'; - -update land - set MediaTextureUUID = substr(MediaTextureUUID, 1, 8) || "-" || substr(MediaTextureUUID, 9, 4) || "-" || substr(MediaTextureUUID, 13, 4) || "-" || substr(MediaTextureUUID, 17, 4) || "-" || substr(MediaTextureUUID, 21, 12) - where MediaTextureUUID not like '%-%'; - -update land - set SnapshotUUID = substr(SnapshotUUID, 1, 8) || "-" || substr(SnapshotUUID, 9, 4) || "-" || substr(SnapshotUUID, 13, 4) || "-" || substr(SnapshotUUID, 17, 4) || "-" || substr(SnapshotUUID, 21, 12) - where SnapshotUUID not like '%-%'; - -update land - set AuthbuyerID = substr(AuthbuyerID, 1, 8) || "-" || substr(AuthbuyerID, 9, 4) || "-" || substr(AuthbuyerID, 13, 4) || "-" || substr(AuthbuyerID, 17, 4) || "-" || substr(AuthbuyerID, 21, 12) - where AuthbuyerID not like '%-%'; - -COMMIT; \ No newline at end of file diff --git a/OpenSim/Data/SQLite/Resources/AssetStore.migrations b/OpenSim/Data/SQLite/Resources/AssetStore.migrations new file mode 100644 index 0000000000..fb72b91af9 --- /dev/null +++ b/OpenSim/Data/SQLite/Resources/AssetStore.migrations @@ -0,0 +1,42 @@ +:VERSION 1 + +BEGIN TRANSACTION; +CREATE TABLE assets( + UUID varchar(255) primary key, + Name varchar(255), + Description varchar(255), + Type integer, + InvType integer, + Local integer, + Temporary integer, + Data blob); + +COMMIT; + +:VERSION 2 + +BEGIN TRANSACTION; + +CREATE TEMPORARY TABLE assets_backup(UUID,Name,Description,Type,Local,Temporary,Data); +INSERT INTO assets_backup SELECT UUID,Name,Description,Type,Local,Temporary,Data FROM assets; +DROP TABLE assets; +CREATE TABLE assets(UUID,Name,Description,Type,Local,Temporary,Data); +INSERT INTO assets SELECT UUID,Name,Description,Type,Local,Temporary,Data FROM assets_backup; +DROP TABLE assets_backup; + +COMMIT; + +:VERSION 3 + +DELETE FROM assets WHERE UUID = 'dc4b9f0bd00845c696a401dd947ac621' + +:VERSION 4 + +BEGIN; + +update assets + set UUID = substr(UUID, 1, 8) || "-" || substr(UUID, 9, 4) || "-" || substr(UUID, 13, 4) || "-" || substr(UUID, 17, 4) || "-" || substr(UUID, 21, 12) + where UUID not like '%-%'; + +COMMIT; + diff --git a/OpenSim/Data/SQLite/Resources/001_AuthStore.sql b/OpenSim/Data/SQLite/Resources/AuthStore.migrations similarity index 62% rename from OpenSim/Data/SQLite/Resources/001_AuthStore.sql rename to OpenSim/Data/SQLite/Resources/AuthStore.migrations index 468567dcc2..ca6bdf55a5 100644 --- a/OpenSim/Data/SQLite/Resources/001_AuthStore.sql +++ b/OpenSim/Data/SQLite/Resources/AuthStore.migrations @@ -1,3 +1,5 @@ +:VERSION 1 + BEGIN TRANSACTION; CREATE TABLE auth ( @@ -16,3 +18,12 @@ CREATE TABLE tokens ( ); COMMIT; + +:VERSION 2 + +BEGIN TRANSACTION; + +INSERT INTO auth (UUID, passwordHash, passwordSalt, webLoginKey) SELECT `UUID` AS UUID, `passwordHash` AS passwordHash, `passwordSalt` AS passwordSalt, `webLoginKey` AS webLoginKey FROM users; + +COMMIT; + diff --git a/OpenSim/Data/SQLite/Resources/001_Avatar.sql b/OpenSim/Data/SQLite/Resources/Avatar.migrations similarity index 92% rename from OpenSim/Data/SQLite/Resources/001_Avatar.sql rename to OpenSim/Data/SQLite/Resources/Avatar.migrations index 7ec906b48a..13b41969ec 100644 --- a/OpenSim/Data/SQLite/Resources/001_Avatar.sql +++ b/OpenSim/Data/SQLite/Resources/Avatar.migrations @@ -1,3 +1,5 @@ +:VERSION 1 + BEGIN TRANSACTION; CREATE TABLE Avatars ( diff --git a/OpenSim/Data/SQLite/Resources/001_FriendsStore.sql b/OpenSim/Data/SQLite/Resources/FriendsStore.migrations similarity index 63% rename from OpenSim/Data/SQLite/Resources/001_FriendsStore.sql rename to OpenSim/Data/SQLite/Resources/FriendsStore.migrations index f1b9ab9902..3eb4352a0c 100644 --- a/OpenSim/Data/SQLite/Resources/001_FriendsStore.sql +++ b/OpenSim/Data/SQLite/Resources/FriendsStore.migrations @@ -1,3 +1,5 @@ +:VERSION 1 + BEGIN TRANSACTION; CREATE TABLE `Friends` ( @@ -8,3 +10,11 @@ CREATE TABLE `Friends` ( PRIMARY KEY(`PrincipalID`, `Friend`)); COMMIT; + +:VERSION 2 + +BEGIN TRANSACTION; + +INSERT INTO `Friends` SELECT `ownerID`, `friendID`, `friendPerms`, 0 FROM `userfriends`; + +COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/004_InventoryStore.sql b/OpenSim/Data/SQLite/Resources/InventoryStore.migrations similarity index 55% rename from OpenSim/Data/SQLite/Resources/004_InventoryStore.sql rename to OpenSim/Data/SQLite/Resources/InventoryStore.migrations index e8f4d46333..585ac498e6 100644 --- a/OpenSim/Data/SQLite/Resources/004_InventoryStore.sql +++ b/OpenSim/Data/SQLite/Resources/InventoryStore.migrations @@ -1,3 +1,59 @@ +:VERSION 1 + +BEGIN TRANSACTION; + +CREATE TABLE inventoryfolders( + UUID varchar(255) primary key, + name varchar(255), + agentID varchar(255), + parentID varchar(255), + type integer, + version integer); + +CREATE TABLE inventoryitems( + UUID varchar(255) primary key, + assetID varchar(255), + assetType integer, + invType integer, + parentFolderID varchar(255), + avatarID varchar(255), + creatorsID varchar(255), + inventoryName varchar(255), + inventoryDescription varchar(255), + inventoryNextPermissions integer, + inventoryCurrentPermissions integer, + inventoryBasePermissions integer, + inventoryEveryOnePermissions integer, + salePrice integer default 99, + saleType integer default 0, + creationDate integer default 2000, + groupID varchar(255) default '00000000-0000-0000-0000-000000000000', + groupOwned integer default 0, + flags integer default 0); + +COMMIT; + +:VERSION 2 + +BEGIN TRANSACTION; + +create index inventoryfolders_agentid on inventoryfolders(agentid); +create index inventoryfolders_parentid on inventoryfolders(parentid); +create index inventoryitems_parentfolderid on inventoryitems(parentfolderid); +create index inventoryitems_avatarid on inventoryitems(avatarid); + +COMMIT; + +:VERSION 3 + +BEGIN; + +alter table inventoryitems add column inventoryGroupPermissions integer unsigned not null default 0; + +COMMIT; + +:VERSION 4 + BEGIN; update inventoryitems diff --git a/OpenSim/Data/SQLite/Resources/RegionStore.migrations b/OpenSim/Data/SQLite/Resources/RegionStore.migrations new file mode 100644 index 0000000000..7b27378139 --- /dev/null +++ b/OpenSim/Data/SQLite/Resources/RegionStore.migrations @@ -0,0 +1,526 @@ +:VERSION 1 + +BEGIN TRANSACTION; + +CREATE TABLE prims( + UUID varchar(255) primary key, + RegionUUID varchar(255), + ParentID integer, + CreationDate integer, + Name varchar(255), + SceneGroupID varchar(255), + Text varchar(255), + Description varchar(255), + SitName varchar(255), + TouchName varchar(255), + CreatorID varchar(255), + OwnerID varchar(255), + GroupID varchar(255), + LastOwnerID varchar(255), + OwnerMask integer, + NextOwnerMask integer, + GroupMask integer, + EveryoneMask integer, + BaseMask integer, + PositionX float, + PositionY float, + PositionZ float, + GroupPositionX float, + GroupPositionY float, + GroupPositionZ float, + VelocityX float, + VelocityY float, + VelocityZ float, + AngularVelocityX float, + AngularVelocityY float, + AngularVelocityZ float, + AccelerationX float, + AccelerationY float, + AccelerationZ float, + RotationX float, + RotationY float, + RotationZ float, + RotationW float, + ObjectFlags integer, + SitTargetOffsetX float NOT NULL default 0, + SitTargetOffsetY float NOT NULL default 0, + SitTargetOffsetZ float NOT NULL default 0, + SitTargetOrientW float NOT NULL default 0, + SitTargetOrientX float NOT NULL default 0, + SitTargetOrientY float NOT NULL default 0, + SitTargetOrientZ float NOT NULL default 0); + +CREATE TABLE primshapes( + UUID varchar(255) primary key, + Shape integer, + ScaleX float, + ScaleY float, + ScaleZ float, + PCode integer, + PathBegin integer, + PathEnd integer, + PathScaleX integer, + PathScaleY integer, + PathShearX integer, + PathShearY integer, + PathSkew integer, + PathCurve integer, + PathRadiusOffset integer, + PathRevolutions integer, + PathTaperX integer, + PathTaperY integer, + PathTwist integer, + PathTwistBegin integer, + ProfileBegin integer, + ProfileEnd integer, + ProfileCurve integer, + ProfileHollow integer, + Texture blob, + ExtraParams blob, + State Integer NOT NULL default 0); + +CREATE TABLE primitems( + itemID varchar(255) primary key, + primID varchar(255), + assetID varchar(255), + parentFolderID varchar(255), + invType integer, + assetType integer, + name varchar(255), + description varchar(255), + creationDate integer, + creatorID varchar(255), + ownerID varchar(255), + lastOwnerID varchar(255), + groupID varchar(255), + nextPermissions string, + currentPermissions string, + basePermissions string, + everyonePermissions string, + groupPermissions string); + +CREATE TABLE terrain( + RegionUUID varchar(255), + Revision integer, + Heightfield blob); + +CREATE TABLE land( + UUID varchar(255) primary key, + RegionUUID varchar(255), + LocalLandID string, + Bitmap blob, + Name varchar(255), + Desc varchar(255), + OwnerUUID varchar(255), + IsGroupOwned string, + Area integer, + AuctionID integer, + Category integer, + ClaimDate integer, + ClaimPrice integer, + GroupUUID varchar(255), + SalePrice integer, + LandStatus integer, + LandFlags string, + LandingType string, + MediaAutoScale string, + MediaTextureUUID varchar(255), + MediaURL varchar(255), + MusicURL varchar(255), + PassHours float, + PassPrice string, + SnapshotUUID varchar(255), + UserLocationX float, + UserLocationY float, + UserLocationZ float, + UserLookAtX float, + UserLookAtY float, + UserLookAtZ float, + AuthbuyerID varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000'); + +CREATE TABLE landaccesslist( + LandUUID varchar(255), + AccessUUID varchar(255), + Flags string); + +COMMIT; + +:VERSION 2 + +BEGIN TRANSACTION; + +CREATE TABLE regionban( + regionUUID varchar (255), + bannedUUID varchar (255), + bannedIp varchar (255), + bannedIpHostMask varchar (255) + ); + +COMMIT; + +:VERSION 3 + +BEGIN; + +ALTER TABLE primitems add flags integer not null default 0; + +COMMIT; + +:VERSION 4 + +BEGIN; + +create table regionsettings ( + regionUUID char(36) not null, + block_terraform integer not null, + block_fly integer not null, + allow_damage integer not null, + restrict_pushing integer not null, + allow_land_resell integer not null, + allow_land_join_divide integer not null, + block_show_in_search integer not null, + agent_limit integer not null, + object_bonus float not null, + maturity integer not null, + disable_scripts integer not null, + disable_collisions integer not null, + disable_physics integer not null, + terrain_texture_1 char(36) not null, + terrain_texture_2 char(36) not null, + terrain_texture_3 char(36) not null, + terrain_texture_4 char(36) not null, + elevation_1_nw float not null, + elevation_2_nw float not null, + elevation_1_ne float not null, + elevation_2_ne float not null, + elevation_1_se float not null, + elevation_2_se float not null, + elevation_1_sw float not null, + elevation_2_sw float not null, + water_height float not null, + terrain_raise_limit float not null, + terrain_lower_limit float not null, + use_estate_sun integer not null, + fixed_sun integer not null, + sun_position float not null, + covenant char(36)); + +COMMIT; + +:VERSION 5 + +BEGIN; + +delete from regionsettings; + +COMMIT; + +:VERSION 6 + +BEGIN TRANSACTION; + +CREATE TABLE estate_groups ( + EstateID int(10) NOT NULL, + uuid char(36) NOT NULL +); + +CREATE TABLE estate_managers ( + EstateID int(10) NOT NULL, + uuid char(36) NOT NULL +); + +CREATE TABLE estate_map ( + RegionID char(36) NOT NULL default '00000000-0000-0000-0000-000000000000', + EstateID int(11) NOT NULL +); + +CREATE TABLE estate_settings ( + EstateID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + EstateName varchar(64) default NULL, + AbuseEmailToEstateOwner tinyint(4) NOT NULL, + DenyAnonymous tinyint(4) NOT NULL, + ResetHomeOnTeleport tinyint(4) NOT NULL, + FixedSun tinyint(4) NOT NULL, + DenyTransacted tinyint(4) NOT NULL, + BlockDwell tinyint(4) NOT NULL, + DenyIdentified tinyint(4) NOT NULL, + AllowVoice tinyint(4) NOT NULL, + UseGlobalTime tinyint(4) NOT NULL, + PricePerMeter int(11) NOT NULL, + TaxFree tinyint(4) NOT NULL, + AllowDirectTeleport tinyint(4) NOT NULL, + RedirectGridX int(11) NOT NULL, + RedirectGridY int(11) NOT NULL, + ParentEstateID int(10) NOT NULL, + SunPosition double NOT NULL, + EstateSkipScripts tinyint(4) NOT NULL, + BillableFactor float NOT NULL, + PublicAccess tinyint(4) NOT NULL +); +insert into estate_settings (EstateID,EstateName,AbuseEmailToEstateOwner,DenyAnonymous,ResetHomeOnTeleport,FixedSun,DenyTransacted,BlockDwell,DenyIdentified,AllowVoice,UseGlobalTime,PricePerMeter,TaxFree,AllowDirectTeleport,RedirectGridX,RedirectGridY,ParentEstateID,SunPosition,PublicAccess,EstateSkipScripts,BillableFactor) values ( 99, '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''); +delete from estate_settings; +CREATE TABLE estate_users ( + EstateID int(10) NOT NULL, + uuid char(36) NOT NULL +); + +CREATE TABLE estateban ( + EstateID int(10) NOT NULL, + bannedUUID varchar(36) NOT NULL, + bannedIp varchar(16) NOT NULL, + bannedIpHostMask varchar(16) NOT NULL, + bannedNameMask varchar(64) default NULL +); + +drop table regionsettings; +CREATE TABLE regionsettings ( + regionUUID char(36) NOT NULL, + block_terraform int(11) NOT NULL, + block_fly int(11) NOT NULL, + allow_damage int(11) NOT NULL, + restrict_pushing int(11) NOT NULL, + allow_land_resell int(11) NOT NULL, + allow_land_join_divide int(11) NOT NULL, + block_show_in_search int(11) NOT NULL, + agent_limit int(11) NOT NULL, + object_bonus float NOT NULL, + maturity int(11) NOT NULL, + disable_scripts int(11) NOT NULL, + disable_collisions int(11) NOT NULL, + disable_physics int(11) NOT NULL, + terrain_texture_1 char(36) NOT NULL, + terrain_texture_2 char(36) NOT NULL, + terrain_texture_3 char(36) NOT NULL, + terrain_texture_4 char(36) NOT NULL, + elevation_1_nw float NOT NULL, + elevation_2_nw float NOT NULL, + elevation_1_ne float NOT NULL, + elevation_2_ne float NOT NULL, + elevation_1_se float NOT NULL, + elevation_2_se float NOT NULL, + elevation_1_sw float NOT NULL, + elevation_2_sw float NOT NULL, + water_height float NOT NULL, + terrain_raise_limit float NOT NULL, + terrain_lower_limit float NOT NULL, + use_estate_sun int(11) NOT NULL, + fixed_sun int(11) NOT NULL, + sun_position float NOT NULL, + covenant char(36) default NULL, + Sandbox tinyint(4) NOT NULL, + PRIMARY KEY (regionUUID) +); + +CREATE INDEX estate_ban_estate_id on estateban(EstateID); +CREATE INDEX estate_groups_estate_id on estate_groups(EstateID); +CREATE INDEX estate_managers_estate_id on estate_managers(EstateID); +CREATE INDEX estate_map_estate_id on estate_map(EstateID); +CREATE UNIQUE INDEX estate_map_region_id on estate_map(RegionID); +CREATE INDEX estate_users_estate_id on estate_users(EstateID); + +COMMIT; + +:VERSION 7 + +begin; + +alter table estate_settings add column AbuseEmail varchar(255) not null default ''; + +alter table estate_settings add column EstateOwner varchar(36) not null default ''; + +commit; + +:VERSION 8 + +begin; + +alter table estate_settings add column DenyMinors tinyint not null default 0; + +commit; + +:VERSION 9 + +BEGIN; + +ALTER TABLE prims ADD COLUMN ColorR integer not null default 0; +ALTER TABLE prims ADD COLUMN ColorG integer not null default 0; +ALTER TABLE prims ADD COLUMN ColorB integer not null default 0; +ALTER TABLE prims ADD COLUMN ColorA integer not null default 0; + +COMMIT; + +:VERSION 10 + +BEGIN; + +ALTER TABLE prims ADD COLUMN ClickAction INTEGER NOT NULL default 0; + +COMMIT; + +:VERSION 11 + +BEGIN; + +ALTER TABLE prims ADD COLUMN PayPrice INTEGER NOT NULL default 0; +ALTER TABLE prims ADD COLUMN PayButton1 INTEGER NOT NULL default 0; +ALTER TABLE prims ADD COLUMN PayButton2 INTEGER NOT NULL default 0; +ALTER TABLE prims ADD COLUMN PayButton3 INTEGER NOT NULL default 0; +ALTER TABLE prims ADD COLUMN PayButton4 INTEGER NOT NULL default 0; +ALTER TABLE prims ADD COLUMN LoopedSound varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000'; +ALTER TABLE prims ADD COLUMN LoopedSoundGain float NOT NULL default 0; +ALTER TABLE prims ADD COLUMN TextureAnimation string; +ALTER TABLE prims ADD COLUMN ParticleSystem string; +ALTER TABLE prims ADD COLUMN OmegaX float NOT NULL default 0; +ALTER TABLE prims ADD COLUMN OmegaY float NOT NULL default 0; +ALTER TABLE prims ADD COLUMN OmegaZ float NOT NULL default 0; +ALTER TABLE prims ADD COLUMN CameraEyeOffsetX float NOT NULL default 0; +ALTER TABLE prims ADD COLUMN CameraEyeOffsetY float NOT NULL default 0; +ALTER TABLE prims ADD COLUMN CameraEyeOffsetZ float NOT NULL default 0; +ALTER TABLE prims ADD COLUMN CameraAtOffsetX float NOT NULL default 0; +ALTER TABLE prims ADD COLUMN CameraAtOffsetY float NOT NULL default 0; +ALTER TABLE prims ADD COLUMN CameraAtOffsetZ float NOT NULL default 0; +ALTER TABLE prims ADD COLUMN ForceMouselook string NOT NULL default 0; +ALTER TABLE prims ADD COLUMN ScriptAccessPin INTEGER NOT NULL default 0; +ALTER TABLE prims ADD COLUMN AllowedDrop INTEGER NOT NULL default 0; +ALTER TABLE prims ADD COLUMN DieAtEdge string NOT NULL default 0; +ALTER TABLE prims ADD COLUMN SalePrice INTEGER NOT NULL default 0; +ALTER TABLE prims ADD COLUMN SaleType string NOT NULL default 0; + +COMMIT; + +:VERSION 12 + +BEGIN; + +ALTER TABLE prims ADD COLUMN Material INTEGER NOT NULL default 3; + +COMMIT; + +:VERSION 13 + +BEGIN; + +ALTER TABLE land ADD COLUMN OtherCleanTime INTEGER NOT NULL default 0; +ALTER TABLE land ADD COLUMN Dwell INTEGER NOT NULL default 0; + +COMMIT; + +:VERSION 14 + +begin; + +ALTER TABLE regionsettings ADD COLUMN sunvectorx double NOT NULL default 0; +ALTER TABLE regionsettings ADD COLUMN sunvectory double NOT NULL default 0; +ALTER TABLE regionsettings ADD COLUMN sunvectorz double NOT NULL default 0; + +commit; + +:VERSION 15 + +BEGIN; + +ALTER TABLE prims ADD COLUMN CollisionSound varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000'; +ALTER TABLE prims ADD COLUMN CollisionSoundVolume float NOT NULL default 0; + +COMMIT; + +:VERSION 16 + +BEGIN; + +ALTER TABLE prims ADD COLUMN VolumeDetect INTEGER NOT NULL DEFAULT 0; + +COMMIT; + +:VERSION 17 + +BEGIN; +CREATE TEMPORARY TABLE prims_backup(UUID,RegionUUID,CreationDate,Name,SceneGroupID,Text,Description,SitName,TouchName,CreatorID,OwnerID,GroupID,LastOwnerID,OwnerMask,NextOwnerMask,GroupMask,EveryoneMask,BaseMask,PositionX,PositionY,PositionZ,GroupPositionX,GroupPositionY,GroupPositionZ,VelocityX,VelocityY,VelocityZ,AngularVelocityX,AngularVelocityY,AngularVelocityZ,AccelerationX,AccelerationY,AccelerationZ,RotationX,RotationY,RotationZ,RotationW,ObjectFlags,SitTargetOffsetX,SitTargetOffsetY,SitTargetOffsetZ,SitTargetOrientW,SitTargetOrientX,SitTargetOrientY,SitTargetOrientZ,ColorR,ColorG,ColorB,ColorA,ClickAction,PayPrice,PayButton1,PayButton2,PayButton3,PayButton4,LoopedSound,LoopedSoundGain,TextureAnimation,ParticleSystem,OmegaX,OmegaY,OmegaZ,CameraEyeOffsetX,CameraEyeOffsetY,CameraEyeOffsetZ,CameraAtOffsetX,CameraAtOffsetY,CameraAtOffsetZ,ForceMouselook,ScriptAccessPin,AllowedDrop,DieAtEdge,SalePrice,SaleType,Material,CollisionSound,CollisionSoundVolume,VolumeDetect); +INSERT INTO prims_backup SELECT UUID,RegionUUID,CreationDate,Name,SceneGroupID,Text,Description,SitName,TouchName,CreatorID,OwnerID,GroupID,LastOwnerID,OwnerMask,NextOwnerMask,GroupMask,EveryoneMask,BaseMask,PositionX,PositionY,PositionZ,GroupPositionX,GroupPositionY,GroupPositionZ,VelocityX,VelocityY,VelocityZ,AngularVelocityX,AngularVelocityY,AngularVelocityZ,AccelerationX,AccelerationY,AccelerationZ,RotationX,RotationY,RotationZ,RotationW,ObjectFlags,SitTargetOffsetX,SitTargetOffsetY,SitTargetOffsetZ,SitTargetOrientW,SitTargetOrientX,SitTargetOrientY,SitTargetOrientZ,ColorR,ColorG,ColorB,ColorA,ClickAction,PayPrice,PayButton1,PayButton2,PayButton3,PayButton4,LoopedSound,LoopedSoundGain,TextureAnimation,ParticleSystem,OmegaX,OmegaY,OmegaZ,CameraEyeOffsetX,CameraEyeOffsetY,CameraEyeOffsetZ,CameraAtOffsetX,CameraAtOffsetY,CameraAtOffsetZ,ForceMouselook,ScriptAccessPin,AllowedDrop,DieAtEdge,SalePrice,SaleType,Material,CollisionSound,CollisionSoundVolume,VolumeDetect FROM prims; +DROP TABLE prims; +CREATE TABLE prims(UUID,RegionUUID,CreationDate,Name,SceneGroupID,Text,Description,SitName,TouchName,CreatorID,OwnerID,GroupID,LastOwnerID,OwnerMask,NextOwnerMask,GroupMask,EveryoneMask,BaseMask,PositionX,PositionY,PositionZ,GroupPositionX,GroupPositionY,GroupPositionZ,VelocityX,VelocityY,VelocityZ,AngularVelocityX,AngularVelocityY,AngularVelocityZ,AccelerationX,AccelerationY,AccelerationZ,RotationX,RotationY,RotationZ,RotationW,ObjectFlags,SitTargetOffsetX,SitTargetOffsetY,SitTargetOffsetZ,SitTargetOrientW,SitTargetOrientX,SitTargetOrientY,SitTargetOrientZ,ColorR,ColorG,ColorB,ColorA,ClickAction,PayPrice,PayButton1,PayButton2,PayButton3,PayButton4,LoopedSound,LoopedSoundGain,TextureAnimation,ParticleSystem,OmegaX,OmegaY,OmegaZ,CameraEyeOffsetX,CameraEyeOffsetY,CameraEyeOffsetZ,CameraAtOffsetX,CameraAtOffsetY,CameraAtOffsetZ,ForceMouselook,ScriptAccessPin,AllowedDrop,DieAtEdge,SalePrice,SaleType,Material,CollisionSound,CollisionSoundVolume,VolumeDetect); +INSERT INTO prims SELECT UUID,RegionUUID,CreationDate,Name,SceneGroupID,Text,Description,SitName,TouchName,CreatorID,OwnerID,GroupID,LastOwnerID,OwnerMask,NextOwnerMask,GroupMask,EveryoneMask,BaseMask,PositionX,PositionY,PositionZ,GroupPositionX,GroupPositionY,GroupPositionZ,VelocityX,VelocityY,VelocityZ,AngularVelocityX,AngularVelocityY,AngularVelocityZ,AccelerationX,AccelerationY,AccelerationZ,RotationX,RotationY,RotationZ,RotationW,ObjectFlags,SitTargetOffsetX,SitTargetOffsetY,SitTargetOffsetZ,SitTargetOrientW,SitTargetOrientX,SitTargetOrientY,SitTargetOrientZ,ColorR,ColorG,ColorB,ColorA,ClickAction,PayPrice,PayButton1,PayButton2,PayButton3,PayButton4,LoopedSound,LoopedSoundGain,TextureAnimation,ParticleSystem,OmegaX,OmegaY,OmegaZ,CameraEyeOffsetX,CameraEyeOffsetY,CameraEyeOffsetZ,CameraAtOffsetX,CameraAtOffsetY,CameraAtOffsetZ,ForceMouselook,ScriptAccessPin,AllowedDrop,DieAtEdge,SalePrice,SaleType,Material,CollisionSound,CollisionSoundVolume,VolumeDetect FROM prims_backup; +DROP TABLE prims_backup; +COMMIT; + +:VERSION 18 + +BEGIN; + +update terrain + set RegionUUID = substr(RegionUUID, 1, 8) || "-" || substr(RegionUUID, 9, 4) || "-" || substr(RegionUUID, 13, 4) || "-" || substr(RegionUUID, 17, 4) || "-" || substr(RegionUUID, 21, 12) + where RegionUUID not like '%-%'; + + +update landaccesslist + set LandUUID = substr(LandUUID, 1, 8) || "-" || substr(LandUUID, 9, 4) || "-" || substr(LandUUID, 13, 4) || "-" || substr(LandUUID, 17, 4) || "-" || substr(LandUUID, 21, 12) + where LandUUID not like '%-%'; + +update landaccesslist + set AccessUUID = substr(AccessUUID, 1, 8) || "-" || substr(AccessUUID, 9, 4) || "-" || substr(AccessUUID, 13, 4) || "-" || substr(AccessUUID, 17, 4) || "-" || substr(AccessUUID, 21, 12) + where AccessUUID not like '%-%'; + + +update prims + set UUID = substr(UUID, 1, 8) || "-" || substr(UUID, 9, 4) || "-" || substr(UUID, 13, 4) || "-" || substr(UUID, 17, 4) || "-" || substr(UUID, 21, 12) + where UUID not like '%-%'; + +update prims + set RegionUUID = substr(RegionUUID, 1, 8) || "-" || substr(RegionUUID, 9, 4) || "-" || substr(RegionUUID, 13, 4) || "-" || substr(RegionUUID, 17, 4) || "-" || substr(RegionUUID, 21, 12) + where RegionUUID not like '%-%'; + +update prims + set SceneGroupID = substr(SceneGroupID, 1, 8) || "-" || substr(SceneGroupID, 9, 4) || "-" || substr(SceneGroupID, 13, 4) || "-" || substr(SceneGroupID, 17, 4) || "-" || substr(SceneGroupID, 21, 12) + where SceneGroupID not like '%-%'; + +update prims + set CreatorID = substr(CreatorID, 1, 8) || "-" || substr(CreatorID, 9, 4) || "-" || substr(CreatorID, 13, 4) || "-" || substr(CreatorID, 17, 4) || "-" || substr(CreatorID, 21, 12) + where CreatorID not like '%-%'; + +update prims + set OwnerID = substr(OwnerID, 1, 8) || "-" || substr(OwnerID, 9, 4) || "-" || substr(OwnerID, 13, 4) || "-" || substr(OwnerID, 17, 4) || "-" || substr(OwnerID, 21, 12) + where OwnerID not like '%-%'; + +update prims + set GroupID = substr(GroupID, 1, 8) || "-" || substr(GroupID, 9, 4) || "-" || substr(GroupID, 13, 4) || "-" || substr(GroupID, 17, 4) || "-" || substr(GroupID, 21, 12) + where GroupID not like '%-%'; + +update prims + set LastOwnerID = substr(LastOwnerID, 1, 8) || "-" || substr(LastOwnerID, 9, 4) || "-" || substr(LastOwnerID, 13, 4) || "-" || substr(LastOwnerID, 17, 4) || "-" || substr(LastOwnerID, 21, 12) + where LastOwnerID not like '%-%'; + + +update primshapes + set UUID = substr(UUID, 1, 8) || "-" || substr(UUID, 9, 4) || "-" || substr(UUID, 13, 4) || "-" || substr(UUID, 17, 4) || "-" || substr(UUID, 21, 12) + where UUID not like '%-%'; + + +update land + set UUID = substr(UUID, 1, 8) || "-" || substr(UUID, 9, 4) || "-" || substr(UUID, 13, 4) || "-" || substr(UUID, 17, 4) || "-" || substr(UUID, 21, 12) + where UUID not like '%-%'; + +update land + set RegionUUID = substr(RegionUUID, 1, 8) || "-" || substr(RegionUUID, 9, 4) || "-" || substr(RegionUUID, 13, 4) || "-" || substr(RegionUUID, 17, 4) || "-" || substr(RegionUUID, 21, 12) + where RegionUUID not like '%-%'; + +update land + set OwnerUUID = substr(OwnerUUID, 1, 8) || "-" || substr(OwnerUUID, 9, 4) || "-" || substr(OwnerUUID, 13, 4) || "-" || substr(OwnerUUID, 17, 4) || "-" || substr(OwnerUUID, 21, 12) + where OwnerUUID not like '%-%'; + +update land + set GroupUUID = substr(GroupUUID, 1, 8) || "-" || substr(GroupUUID, 9, 4) || "-" || substr(GroupUUID, 13, 4) || "-" || substr(GroupUUID, 17, 4) || "-" || substr(GroupUUID, 21, 12) + where GroupUUID not like '%-%'; + +update land + set MediaTextureUUID = substr(MediaTextureUUID, 1, 8) || "-" || substr(MediaTextureUUID, 9, 4) || "-" || substr(MediaTextureUUID, 13, 4) || "-" || substr(MediaTextureUUID, 17, 4) || "-" || substr(MediaTextureUUID, 21, 12) + where MediaTextureUUID not like '%-%'; + +update land + set SnapshotUUID = substr(SnapshotUUID, 1, 8) || "-" || substr(SnapshotUUID, 9, 4) || "-" || substr(SnapshotUUID, 13, 4) || "-" || substr(SnapshotUUID, 17, 4) || "-" || substr(SnapshotUUID, 21, 12) + where SnapshotUUID not like '%-%'; + +update land + set AuthbuyerID = substr(AuthbuyerID, 1, 8) || "-" || substr(AuthbuyerID, 9, 4) || "-" || substr(AuthbuyerID, 13, 4) || "-" || substr(AuthbuyerID, 17, 4) || "-" || substr(AuthbuyerID, 21, 12) + where AuthbuyerID not like '%-%'; + +COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/001_UserAccount.sql b/OpenSim/Data/SQLite/Resources/UserAccount.migrations similarity index 51% rename from OpenSim/Data/SQLite/Resources/001_UserAccount.sql rename to OpenSim/Data/SQLite/Resources/UserAccount.migrations index c38d9a762f..854fe694c2 100644 --- a/OpenSim/Data/SQLite/Resources/001_UserAccount.sql +++ b/OpenSim/Data/SQLite/Resources/UserAccount.migrations @@ -1,4 +1,6 @@ -BEGIN TRANSACTION; +:VERSION 1 + +BEGIN TRANSACTION; -- useraccounts table CREATE TABLE UserAccounts ( @@ -14,4 +16,12 @@ CREATE TABLE UserAccounts ( UserTitle varchar(64) NOT NULL DEFAULT '' ); -COMMIT; \ No newline at end of file +COMMIT; + +:VERSION 2 + +BEGIN TRANSACTION; + +INSERT INTO UserAccounts (PrincipalID, ScopeID, FirstName, LastName, Email, ServiceURLs, Created) SELECT `UUID` AS PrincipalID, '00000000-0000-0000-0000-000000000000' AS ScopeID, username AS FirstName, surname AS LastName, '' as Email, '' AS ServiceURLs, created as Created FROM users; + +COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/UserStore.migrations b/OpenSim/Data/SQLite/Resources/UserStore.migrations new file mode 100644 index 0000000000..73d35e83c3 --- /dev/null +++ b/OpenSim/Data/SQLite/Resources/UserStore.migrations @@ -0,0 +1,169 @@ +:VERSION 1 + +BEGIN TRANSACTION; + +-- users table +CREATE TABLE users( + UUID varchar(255) primary key, + username varchar(255), + surname varchar(255), + passwordHash varchar(255), + passwordSalt varchar(255), + homeRegionX integer, + homeRegionY integer, + homeLocationX float, + homeLocationY float, + homeLocationZ float, + homeLookAtX float, + homeLookAtY float, + homeLookAtZ float, + created integer, + lastLogin integer, + rootInventoryFolderID varchar(255), + userInventoryURI varchar(255), + userAssetURI varchar(255), + profileCanDoMask integer, + profileWantDoMask integer, + profileAboutText varchar(255), + profileFirstText varchar(255), + profileImage varchar(255), + profileFirstImage varchar(255), + webLoginKey text default '00000000-0000-0000-0000-000000000000'); +-- friends table +CREATE TABLE userfriends( + ownerID varchar(255), + friendID varchar(255), + friendPerms integer, + ownerPerms integer, + datetimestamp integer); + +COMMIT; + +:VERSION 2 + +BEGIN; + +ALTER TABLE users add homeRegionID varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000'; + +COMMIT; + +:VERSION 3 + +BEGIN; + +ALTER TABLE users add userFlags integer NOT NULL default 0; +ALTER TABLE users add godLevel integer NOT NULL default 0; + +COMMIT; + +:VERSION 4 + +BEGIN; + +ALTER TABLE users add customType varchar(32) not null default ''; +ALTER TABLE users add partner char(36) not null default '00000000-0000-0000-0000-000000000000'; + +COMMIT; + +:VERSION 5 + +BEGIN; + +CREATE TABLE `avatarattachments` (`UUID` char(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000', `attachpoint` int(11) NOT NULL DEFAULT 0, `item` char(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000', `asset` char(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000'); + +COMMIT; + +:VERSION 6 + +BEGIN TRANSACTION; + +-- usersagents table +CREATE TABLE IF NOT EXISTS useragents( + UUID varchar(255) primary key, + agentIP varchar(255), + agentPort integer, + agentOnline boolean, + sessionID varchar(255), + secureSessionID varchar(255), + regionID varchar(255), + loginTime integer, + logoutTime integer, + currentRegion varchar(255), + currentHandle varchar(255), + currentPosX float, + currentPosY float, + currentPosZ float); + +COMMIT; + +:VERSION 7 + +BEGIN TRANSACTION; + +ALTER TABLE useragents add currentLookAtX float not null default 128; +ALTER TABLE useragents add currentLookAtY float not null default 128; +ALTER TABLE useragents add currentLookAtZ float not null default 70; + +COMMIT; + +:VERSION 8 + +BEGIN TRANSACTION; + +ALTER TABLE users add email varchar(250); + +COMMIT; + +:VERSION 9 + +BEGIN; + +update users + set UUID = substr(UUID, 1, 8) || "-" || substr(UUID, 9, 4) || "-" || substr(UUID, 13, 4) || "-" || substr(UUID, 17, 4) || "-" || substr(UUID, 21, 12) + where UUID not like '%-%'; + +update useragents + set UUID = substr(UUID, 1, 8) || "-" || substr(UUID, 9, 4) || "-" || substr(UUID, 13, 4) || "-" || substr(UUID, 17, 4) || "-" || substr(UUID, 21, 12) + where UUID not like '%-%'; + +COMMIT; + +:VERSION 10 + +BEGIN TRANSACTION; + +CREATE TABLE IF NOT EXISTS avatarappearance( + Owner varchar(36) NOT NULL primary key, + BodyItem varchar(36) DEFAULT NULL, + BodyAsset varchar(36) DEFAULT NULL, + SkinItem varchar(36) DEFAULT NULL, + SkinAsset varchar(36) DEFAULT NULL, + HairItem varchar(36) DEFAULT NULL, + HairAsset varchar(36) DEFAULT NULL, + EyesItem varchar(36) DEFAULT NULL, + EyesAsset varchar(36) DEFAULT NULL, + ShirtItem varchar(36) DEFAULT NULL, + ShirtAsset varchar(36) DEFAULT NULL, + PantsItem varchar(36) DEFAULT NULL, + PantsAsset varchar(36) DEFAULT NULL, + ShoesItem varchar(36) DEFAULT NULL, + ShoesAsset varchar(36) DEFAULT NULL, + SocksItem varchar(36) DEFAULT NULL, + SocksAsset varchar(36) DEFAULT NULL, + JacketItem varchar(36) DEFAULT NULL, + JacketAsset varchar(36) DEFAULT NULL, + GlovesItem varchar(36) DEFAULT NULL, + GlovesAsset varchar(36) DEFAULT NULL, + UnderShirtItem varchar(36) DEFAULT NULL, + UnderShirtAsset varchar(36) DEFAULT NULL, + UnderPantsItem varchar(36) DEFAULT NULL, + UnderPantsAsset varchar(36) DEFAULT NULL, + SkirtItem varchar(36) DEFAULT NULL, + SkirtAsset varchar(36) DEFAULT NULL, + Texture blob, + VisualParams blob, + Serial int DEFAULT NULL, + AvatarHeight float DEFAULT NULL +); + +COMMIT; From dfeb9a0b5c07a85ec8aed591206468cee83ce637 Mon Sep 17 00:00:00 2001 From: AlexRa Date: Thu, 6 May 2010 23:16:36 +0300 Subject: [PATCH 10/46] MS SQL migrations converted to the new format --- .../Data/MSSQL/Resources/001_AssetStore.sql | 13 - .../Data/MSSQL/Resources/001_EstateStore.sql | 85 -- .../Data/MSSQL/Resources/001_GridStore.sql | 37 - .../MSSQL/Resources/001_InventoryStore.sql | 64 -- .../Data/MSSQL/Resources/001_RegionStore.sql | 161 --- .../Data/MSSQL/Resources/001_UserAccount.sql | 14 - .../Data/MSSQL/Resources/001_UserStore.sql | 112 --- .../Data/MSSQL/Resources/002_AssetStore.sql | 29 - .../Data/MSSQL/Resources/002_AuthStore.sql | 6 - .../Data/MSSQL/Resources/002_EstateStore.sql | 25 - .../Data/MSSQL/Resources/002_FriendsStore.sql | 6 - .../Data/MSSQL/Resources/002_GridStore.sql | 49 - .../MSSQL/Resources/002_InventoryStore.sql | 5 - .../Data/MSSQL/Resources/002_RegionStore.sql | 50 - .../Data/MSSQL/Resources/002_UserAccount.sql | 12 - .../Data/MSSQL/Resources/002_UserStore.sql | 9 - .../Data/MSSQL/Resources/003_AssetStore.sql | 6 - .../Data/MSSQL/Resources/003_EstateStore.sql | 25 - .../Data/MSSQL/Resources/003_GridStore.sql | 22 - .../MSSQL/Resources/003_InventoryStore.sql | 38 - .../Data/MSSQL/Resources/003_RegionStore.sql | 67 -- .../Data/MSSQL/Resources/003_UserAccount.sql | 9 - .../Data/MSSQL/Resources/003_UserStore.sql | 15 - .../Data/MSSQL/Resources/004_AssetStore.sql | 31 - .../Data/MSSQL/Resources/004_EstateStore.sql | 22 - .../Data/MSSQL/Resources/004_GridStore.sql | 68 -- .../MSSQL/Resources/004_InventoryStore.sql | 52 - .../Data/MSSQL/Resources/004_RegionStore.sql | 40 - .../Data/MSSQL/Resources/004_UserAccount.sql | 7 - .../Data/MSSQL/Resources/004_UserStore.sql | 29 - .../Data/MSSQL/Resources/005_AssetStore.sql | 1 - .../Data/MSSQL/Resources/005_EstateStore.sql | 22 - .../Data/MSSQL/Resources/005_GridStore.sql | 5 - .../Data/MSSQL/Resources/005_RegionStore.sql | 49 - .../Data/MSSQL/Resources/005_UserStore.sql | 5 - .../Data/MSSQL/Resources/006_EstateStore.sql | 22 - .../Data/MSSQL/Resources/006_GridStore.sql | 8 - .../Data/MSSQL/Resources/006_RegionStore.sql | 36 - .../Data/MSSQL/Resources/006_UserStore.sql | 57 -- .../Data/MSSQL/Resources/007_EstateStore.sql | 25 - .../Data/MSSQL/Resources/007_GridStore.sql | 9 - .../Data/MSSQL/Resources/007_RegionStore.sql | 10 - .../Data/MSSQL/Resources/007_UserStore.sql | 42 - .../Data/MSSQL/Resources/008_EstateStore.sql | 49 - .../Data/MSSQL/Resources/008_RegionStore.sql | 7 - .../Data/MSSQL/Resources/008_UserStore.sql | 29 - .../Data/MSSQL/Resources/009_EstateStore.sql | 24 - .../Data/MSSQL/Resources/009_RegionStore.sql | 5 - .../Data/MSSQL/Resources/009_UserStore.sql | 53 - .../Data/MSSQL/Resources/010_RegionStore.sql | 7 - .../Data/MSSQL/Resources/010_UserStore.sql | 24 - .../Data/MSSQL/Resources/011_RegionStore.sql | 6 - .../Data/MSSQL/Resources/011_UserStore.sql | 5 - .../Data/MSSQL/Resources/012_RegionStore.sql | 5 - .../Data/MSSQL/Resources/013_RegionStore.sql | 112 --- .../Data/MSSQL/Resources/014_RegionStore.sql | 49 - .../Data/MSSQL/Resources/015_RegionStore.sql | 45 - .../Data/MSSQL/Resources/016_RegionStore.sql | 19 - .../Data/MSSQL/Resources/017_RegionStore.sql | 56 -- .../Data/MSSQL/Resources/018_RegionStore.sql | 18 - .../Data/MSSQL/Resources/019_RegionStore.sql | 19 - .../Data/MSSQL/Resources/020_RegionStore.sql | 58 -- .../Data/MSSQL/Resources/021_RegionStore.sql | 5 - .../Data/MSSQL/Resources/022_RegionStore.sql | 7 - .../Data/MSSQL/Resources/023_RegionStore.sql | 7 - .../MSSQL/Resources/AssetStore.migrations | 100 ++ ...001_AuthStore.sql => AuthStore.migrations} | 11 + .../{001_Avatar.sql => Avatar.migrations} | 2 + .../MSSQL/Resources/EstateStore.migrations | 334 +++++++ ...iendsStore.sql => FriendsStore.migrations} | 9 + .../Data/MSSQL/Resources/GridStore.migrations | 225 +++++ .../MSSQL/Resources/InventoryStore.migrations | 174 ++++ .../{001_LogStore.sql => LogStore.migrations} | 2 + .../{001_Presence.sql => Presence.migrations} | 11 + .../MSSQL/Resources/RegionStore.migrations | 929 ++++++++++++++++++ .../MSSQL/Resources/UserAccount.migrations | 55 ++ .../Data/MSSQL/Resources/UserStore.migrations | 421 ++++++++ 77 files changed, 2273 insertions(+), 2008 deletions(-) delete mode 100644 OpenSim/Data/MSSQL/Resources/001_AssetStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/001_EstateStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/001_GridStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/001_InventoryStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/001_RegionStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/001_UserAccount.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/001_UserStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/002_AssetStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/002_AuthStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/002_EstateStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/002_FriendsStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/002_GridStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/002_InventoryStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/002_RegionStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/002_UserAccount.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/002_UserStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/003_AssetStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/003_EstateStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/003_GridStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/003_InventoryStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/003_RegionStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/003_UserAccount.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/003_UserStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/004_AssetStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/004_EstateStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/004_GridStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/004_InventoryStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/004_RegionStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/004_UserAccount.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/004_UserStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/005_AssetStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/005_EstateStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/005_GridStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/005_RegionStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/005_UserStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/006_EstateStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/006_GridStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/006_RegionStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/006_UserStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/007_EstateStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/007_GridStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/007_RegionStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/007_UserStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/008_EstateStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/008_RegionStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/008_UserStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/009_EstateStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/009_RegionStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/009_UserStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/010_RegionStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/010_UserStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/011_RegionStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/011_UserStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/012_RegionStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/013_RegionStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/014_RegionStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/015_RegionStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/016_RegionStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/017_RegionStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/018_RegionStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/019_RegionStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/020_RegionStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/021_RegionStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/022_RegionStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/023_RegionStore.sql create mode 100644 OpenSim/Data/MSSQL/Resources/AssetStore.migrations rename OpenSim/Data/MSSQL/Resources/{001_AuthStore.sql => AuthStore.migrations} (63%) rename OpenSim/Data/MSSQL/Resources/{001_Avatar.sql => Avatar.migrations} (94%) create mode 100644 OpenSim/Data/MSSQL/Resources/EstateStore.migrations rename OpenSim/Data/MSSQL/Resources/{001_FriendsStore.sql => FriendsStore.migrations} (54%) create mode 100644 OpenSim/Data/MSSQL/Resources/GridStore.migrations create mode 100644 OpenSim/Data/MSSQL/Resources/InventoryStore.migrations rename OpenSim/Data/MSSQL/Resources/{001_LogStore.sql => LogStore.migrations} (96%) rename OpenSim/Data/MSSQL/Resources/{001_Presence.sql => Presence.migrations} (81%) create mode 100644 OpenSim/Data/MSSQL/Resources/RegionStore.migrations create mode 100644 OpenSim/Data/MSSQL/Resources/UserAccount.migrations create mode 100644 OpenSim/Data/MSSQL/Resources/UserStore.migrations diff --git a/OpenSim/Data/MSSQL/Resources/001_AssetStore.sql b/OpenSim/Data/MSSQL/Resources/001_AssetStore.sql deleted file mode 100644 index 2b293c7636..0000000000 --- a/OpenSim/Data/MSSQL/Resources/001_AssetStore.sql +++ /dev/null @@ -1,13 +0,0 @@ -CREATE TABLE [assets] ( - [id] [varchar](36) NOT NULL, - [name] [varchar](64) NOT NULL, - [description] [varchar](64) NOT NULL, - [assetType] [tinyint] NOT NULL, - [local] [tinyint] NOT NULL, - [temporary] [tinyint] NOT NULL, - [data] [image] NOT NULL, -PRIMARY KEY CLUSTERED -( - [id] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] -) ON [PRIMARY] diff --git a/OpenSim/Data/MSSQL/Resources/001_EstateStore.sql b/OpenSim/Data/MSSQL/Resources/001_EstateStore.sql deleted file mode 100644 index 9bb2f75965..0000000000 --- a/OpenSim/Data/MSSQL/Resources/001_EstateStore.sql +++ /dev/null @@ -1,85 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE [dbo].[estate_managers]( - [EstateID] [int] NOT NULL, - [uuid] [varchar](36) NOT NULL, - CONSTRAINT [PK_estate_managers] PRIMARY KEY CLUSTERED -( - [EstateID] ASC -)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] -) ON [PRIMARY]; - -CREATE TABLE [dbo].[estate_groups]( - [EstateID] [int] NOT NULL, - [uuid] [varchar](36) NOT NULL, - CONSTRAINT [PK_estate_groups] PRIMARY KEY CLUSTERED -( - [EstateID] ASC -)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] -) ON [PRIMARY]; - - -CREATE TABLE [dbo].[estate_users]( - [EstateID] [int] NOT NULL, - [uuid] [varchar](36) NOT NULL, - CONSTRAINT [PK_estate_users] PRIMARY KEY CLUSTERED -( - [EstateID] ASC -)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] -) ON [PRIMARY]; - - -CREATE TABLE [dbo].[estateban]( - [EstateID] [int] NOT NULL, - [bannedUUID] [varchar](36) NOT NULL, - [bannedIp] [varchar](16) NOT NULL, - [bannedIpHostMask] [varchar](16) NOT NULL, - [bannedNameMask] [varchar](64) NULL DEFAULT (NULL), - CONSTRAINT [PK_estateban] PRIMARY KEY CLUSTERED -( - [EstateID] ASC -)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] -) ON [PRIMARY]; - -CREATE TABLE [dbo].[estate_settings]( - [EstateID] [int] IDENTITY(1,100) NOT NULL, - [EstateName] [varchar](64) NULL DEFAULT (NULL), - [AbuseEmailToEstateOwner] [bit] NOT NULL, - [DenyAnonymous] [bit] NOT NULL, - [ResetHomeOnTeleport] [bit] NOT NULL, - [FixedSun] [bit] NOT NULL, - [DenyTransacted] [bit] NOT NULL, - [BlockDwell] [bit] NOT NULL, - [DenyIdentified] [bit] NOT NULL, - [AllowVoice] [bit] NOT NULL, - [UseGlobalTime] [bit] NOT NULL, - [PricePerMeter] [int] NOT NULL, - [TaxFree] [bit] NOT NULL, - [AllowDirectTeleport] [bit] NOT NULL, - [RedirectGridX] [int] NOT NULL, - [RedirectGridY] [int] NOT NULL, - [ParentEstateID] [int] NOT NULL, - [SunPosition] [float] NOT NULL, - [EstateSkipScripts] [bit] NOT NULL, - [BillableFactor] [float] NOT NULL, - [PublicAccess] [bit] NOT NULL, - [AbuseEmail] [varchar](255) NOT NULL, - [EstateOwner] [varchar](36) NOT NULL, - [DenyMinors] [bit] NOT NULL, - CONSTRAINT [PK_estate_settings] PRIMARY KEY CLUSTERED -( - [EstateID] ASC -)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] -) ON [PRIMARY]; - - -CREATE TABLE [dbo].[estate_map]( - [RegionID] [varchar](36) NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'), - [EstateID] [int] NOT NULL, - CONSTRAINT [PK_estate_map] PRIMARY KEY CLUSTERED -( - [RegionID] ASC -)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] -) ON [PRIMARY]; - -COMMIT \ No newline at end of file diff --git a/OpenSim/Data/MSSQL/Resources/001_GridStore.sql b/OpenSim/Data/MSSQL/Resources/001_GridStore.sql deleted file mode 100644 index ff15f54c07..0000000000 --- a/OpenSim/Data/MSSQL/Resources/001_GridStore.sql +++ /dev/null @@ -1,37 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE [dbo].[regions]( - [regionHandle] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [regionName] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [uuid] [varchar](255) COLLATE Latin1_General_CI_AS NOT NULL, - [regionRecvKey] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [regionSecret] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [regionSendKey] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [regionDataURI] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [serverIP] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [serverPort] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [serverURI] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [locX] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [locY] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [locZ] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [eastOverrideHandle] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [westOverrideHandle] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [southOverrideHandle] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [northOverrideHandle] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [regionAssetURI] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [regionAssetRecvKey] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [regionAssetSendKey] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [regionUserURI] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [regionUserRecvKey] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [regionUserSendKey] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [regionMapTexture] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [serverHttpPort] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [serverRemotingPort] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [owner_uuid] [varchar](36) COLLATE Latin1_General_CI_AS NULL, -PRIMARY KEY CLUSTERED -( - [uuid] ASC -)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] -) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/001_InventoryStore.sql b/OpenSim/Data/MSSQL/Resources/001_InventoryStore.sql deleted file mode 100644 index 836d2d1e2b..0000000000 --- a/OpenSim/Data/MSSQL/Resources/001_InventoryStore.sql +++ /dev/null @@ -1,64 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE [inventoryfolders] ( - [folderID] [varchar](36) NOT NULL default '', - [agentID] [varchar](36) default NULL, - [parentFolderID] [varchar](36) default NULL, - [folderName] [varchar](64) default NULL, - [type] [smallint] NOT NULL default 0, - [version] [int] NOT NULL default 0, - PRIMARY KEY CLUSTERED -( - [folderID] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] -) ON [PRIMARY] - -CREATE NONCLUSTERED INDEX [owner] ON [inventoryfolders] -( - [agentID] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -CREATE NONCLUSTERED INDEX [parent] ON [inventoryfolders] -( - [parentFolderID] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - - -CREATE TABLE [inventoryitems] ( - [inventoryID] [varchar](36) NOT NULL default '', - [assetID] [varchar](36) default NULL, - [assetType] [int] default NULL, - [parentFolderID] [varchar](36) default NULL, - [avatarID] [varchar](36) default NULL, - [inventoryName] [varchar](64) default NULL, - [inventoryDescription] [varchar](128) default NULL, - [inventoryNextPermissions] [int] default NULL, - [inventoryCurrentPermissions] [int] default NULL, - [invType] [int] default NULL, - [creatorID] [varchar](36) default NULL, - [inventoryBasePermissions] [int] NOT NULL default 0, - [inventoryEveryOnePermissions] [int] NOT NULL default 0, - [salePrice] [int] default NULL, - [saleType] [tinyint] default NULL, - [creationDate] [int] default NULL, - [groupID] [varchar](36) default NULL, - [groupOwned] [bit] default NULL, - [flags] [int] default NULL, - PRIMARY KEY CLUSTERED -( - [inventoryID] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] -) ON [PRIMARY] - - -CREATE NONCLUSTERED INDEX [owner] ON [inventoryitems] -( - [avatarID] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -CREATE NONCLUSTERED INDEX [folder] ON [inventoryitems] -( - [parentFolderID] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/001_RegionStore.sql b/OpenSim/Data/MSSQL/Resources/001_RegionStore.sql deleted file mode 100644 index fe7c58f8ed..0000000000 --- a/OpenSim/Data/MSSQL/Resources/001_RegionStore.sql +++ /dev/null @@ -1,161 +0,0 @@ -CREATE TABLE [dbo].[prims]( - [UUID] [varchar](255) NOT NULL, - [RegionUUID] [varchar](255) NULL, - [ParentID] [int] NULL, - [CreationDate] [int] NULL, - [Name] [varchar](255) NULL, - [SceneGroupID] [varchar](255) NULL, - [Text] [varchar](255) NULL, - [Description] [varchar](255) NULL, - [SitName] [varchar](255) NULL, - [TouchName] [varchar](255) NULL, - [ObjectFlags] [int] NULL, - [CreatorID] [varchar](255) NULL, - [OwnerID] [varchar](255) NULL, - [GroupID] [varchar](255) NULL, - [LastOwnerID] [varchar](255) NULL, - [OwnerMask] [int] NULL, - [NextOwnerMask] [int] NULL, - [GroupMask] [int] NULL, - [EveryoneMask] [int] NULL, - [BaseMask] [int] NULL, - [PositionX] [float] NULL, - [PositionY] [float] NULL, - [PositionZ] [float] NULL, - [GroupPositionX] [float] NULL, - [GroupPositionY] [float] NULL, - [GroupPositionZ] [float] NULL, - [VelocityX] [float] NULL, - [VelocityY] [float] NULL, - [VelocityZ] [float] NULL, - [AngularVelocityX] [float] NULL, - [AngularVelocityY] [float] NULL, - [AngularVelocityZ] [float] NULL, - [AccelerationX] [float] NULL, - [AccelerationY] [float] NULL, - [AccelerationZ] [float] NULL, - [RotationX] [float] NULL, - [RotationY] [float] NULL, - [RotationZ] [float] NULL, - [RotationW] [float] NULL, - [SitTargetOffsetX] [float] NULL, - [SitTargetOffsetY] [float] NULL, - [SitTargetOffsetZ] [float] NULL, - [SitTargetOrientW] [float] NULL, - [SitTargetOrientX] [float] NULL, - [SitTargetOrientY] [float] NULL, - [SitTargetOrientZ] [float] NULL, -PRIMARY KEY CLUSTERED -( - [UUID] ASC -)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] -) ON [PRIMARY] - -CREATE TABLE [dbo].[primshapes]( - [UUID] [varchar](255) NOT NULL, - [Shape] [int] NULL, - [ScaleX] [float] NULL, - [ScaleY] [float] NULL, - [ScaleZ] [float] NULL, - [PCode] [int] NULL, - [PathBegin] [int] NULL, - [PathEnd] [int] NULL, - [PathScaleX] [int] NULL, - [PathScaleY] [int] NULL, - [PathShearX] [int] NULL, - [PathShearY] [int] NULL, - [PathSkew] [int] NULL, - [PathCurve] [int] NULL, - [PathRadiusOffset] [int] NULL, - [PathRevolutions] [int] NULL, - [PathTaperX] [int] NULL, - [PathTaperY] [int] NULL, - [PathTwist] [int] NULL, - [PathTwistBegin] [int] NULL, - [ProfileBegin] [int] NULL, - [ProfileEnd] [int] NULL, - [ProfileCurve] [int] NULL, - [ProfileHollow] [int] NULL, - [State] [int] NULL, - [Texture] [image] NULL, - [ExtraParams] [image] NULL, -PRIMARY KEY CLUSTERED -( - [UUID] ASC -)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] -) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] - -CREATE TABLE [dbo].[primitems]( - [itemID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, - [primID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, - [assetID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, - [parentFolderID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, - [invType] [int] NULL, - [assetType] [int] NULL, - [name] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, - [description] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, - [creationDate] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, - [creatorID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, - [ownerID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, - [lastOwnerID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, - [groupID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, - [nextPermissions] [int] NULL, - [currentPermissions] [int] NULL, - [basePermissions] [int] NULL, - [everyonePermissions] [int] NULL, - [groupPermissions] [int] NULL, -PRIMARY KEY CLUSTERED -( - [itemID] ASC -)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] -) ON [PRIMARY] - -CREATE TABLE [dbo].[terrain]( - [RegionUUID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, - [Revision] [int] NULL, - [Heightfield] [image] NULL -) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] - -CREATE TABLE [dbo].[land]( - [UUID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, - [RegionUUID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, - [LocalLandID] [int] NULL, - [Bitmap] [image] NULL, - [Name] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, - [Description] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, - [OwnerUUID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, - [IsGroupOwned] [int] NULL, - [Area] [int] NULL, - [AuctionID] [int] NULL, - [Category] [int] NULL, - [ClaimDate] [int] NULL, - [ClaimPrice] [int] NULL, - [GroupUUID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, - [SalePrice] [int] NULL, - [LandStatus] [int] NULL, - [LandFlags] [int] NULL, - [LandingType] [int] NULL, - [MediaAutoScale] [int] NULL, - [MediaTextureUUID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, - [MediaURL] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, - [MusicURL] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, - [PassHours] [float] NULL, - [PassPrice] [int] NULL, - [SnapshotUUID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, - [UserLocationX] [float] NULL, - [UserLocationY] [float] NULL, - [UserLocationZ] [float] NULL, - [UserLookAtX] [float] NULL, - [UserLookAtY] [float] NULL, - [UserLookAtZ] [float] NULL, -PRIMARY KEY CLUSTERED -( - [UUID] ASC -)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] -) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] - -CREATE TABLE [dbo].[landaccesslist]( - [LandUUID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, - [AccessUUID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, - [Flags] [int] NULL -) ON [PRIMARY] \ No newline at end of file diff --git a/OpenSim/Data/MSSQL/Resources/001_UserAccount.sql b/OpenSim/Data/MSSQL/Resources/001_UserAccount.sql deleted file mode 100644 index 3dbf8a4925..0000000000 --- a/OpenSim/Data/MSSQL/Resources/001_UserAccount.sql +++ /dev/null @@ -1,14 +0,0 @@ -CREATE TABLE [UserAccounts] ( - [PrincipalID] uniqueidentifier NOT NULL, - [ScopeID] uniqueidentifier NOT NULL, - [FirstName] [varchar](64) NOT NULL, - [LastName] [varchar](64) NOT NULL, - [Email] [varchar](64) NULL, - [ServiceURLs] [text] NULL, - [Created] [int] default NULL, - - PRIMARY KEY CLUSTERED -( - [PrincipalID] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] -) ON [PRIMARY] diff --git a/OpenSim/Data/MSSQL/Resources/001_UserStore.sql b/OpenSim/Data/MSSQL/Resources/001_UserStore.sql deleted file mode 100644 index 160c457dad..0000000000 --- a/OpenSim/Data/MSSQL/Resources/001_UserStore.sql +++ /dev/null @@ -1,112 +0,0 @@ -CREATE TABLE [users] ( - [UUID] [varchar](36) NOT NULL default '', - [username] [varchar](32) NOT NULL, - [lastname] [varchar](32) NOT NULL, - [passwordHash] [varchar](32) NOT NULL, - [passwordSalt] [varchar](32) NOT NULL, - [homeRegion] [bigint] default NULL, - [homeLocationX] [float] default NULL, - [homeLocationY] [float] default NULL, - [homeLocationZ] [float] default NULL, - [homeLookAtX] [float] default NULL, - [homeLookAtY] [float] default NULL, - [homeLookAtZ] [float] default NULL, - [created] [int] NOT NULL, - [lastLogin] [int] NOT NULL, - [userInventoryURI] [varchar](255) default NULL, - [userAssetURI] [varchar](255) default NULL, - [profileCanDoMask] [int] default NULL, - [profileWantDoMask] [int] default NULL, - [profileAboutText] [ntext], - [profileFirstText] [ntext], - [profileImage] [varchar](36) default NULL, - [profileFirstImage] [varchar](36) default NULL, - [webLoginKey] [varchar](36) default NULL, - PRIMARY KEY CLUSTERED -( - [UUID] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] -) ON [PRIMARY] - - -CREATE NONCLUSTERED INDEX [usernames] ON [users] -( - [username] ASC, - [lastname] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - - -CREATE TABLE [agents] ( - [UUID] [varchar](36) NOT NULL, - [sessionID] [varchar](36) NOT NULL, - [secureSessionID] [varchar](36) NOT NULL, - [agentIP] [varchar](16) NOT NULL, - [agentPort] [int] NOT NULL, - [agentOnline] [tinyint] NOT NULL, - [loginTime] [int] NOT NULL, - [logoutTime] [int] NOT NULL, - [currentRegion] [varchar](36) NOT NULL, - [currentHandle] [bigint] NOT NULL, - [currentPos] [varchar](64) NOT NULL, - PRIMARY KEY CLUSTERED -( - [UUID] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] -) ON [PRIMARY] - - -CREATE NONCLUSTERED INDEX [session] ON [agents] -( - [sessionID] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -CREATE NONCLUSTERED INDEX [ssession] ON [agents] -( - [secureSessionID] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - - -CREATE TABLE [dbo].[userfriends]( - [ownerID] [varchar](50) COLLATE Latin1_General_CI_AS NOT NULL, - [friendID] [varchar](50) COLLATE Latin1_General_CI_AS NOT NULL, - [friendPerms] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, - [datetimestamp] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL -) ON [PRIMARY] - -CREATE TABLE [avatarappearance] ( - [Owner] [varchar](36) NOT NULL, - [Serial] int NOT NULL, - [Visual_Params] [image] NOT NULL, - [Texture] [image] NOT NULL, - [Avatar_Height] float NOT NULL, - [Body_Item] [varchar](36) NOT NULL, - [Body_Asset] [varchar](36) NOT NULL, - [Skin_Item] [varchar](36) NOT NULL, - [Skin_Asset] [varchar](36) NOT NULL, - [Hair_Item] [varchar](36) NOT NULL, - [Hair_Asset] [varchar](36) NOT NULL, - [Eyes_Item] [varchar](36) NOT NULL, - [Eyes_Asset] [varchar](36) NOT NULL, - [Shirt_Item] [varchar](36) NOT NULL, - [Shirt_Asset] [varchar](36) NOT NULL, - [Pants_Item] [varchar](36) NOT NULL, - [Pants_Asset] [varchar](36) NOT NULL, - [Shoes_Item] [varchar](36) NOT NULL, - [Shoes_Asset] [varchar](36) NOT NULL, - [Socks_Item] [varchar](36) NOT NULL, - [Socks_Asset] [varchar](36) NOT NULL, - [Jacket_Item] [varchar](36) NOT NULL, - [Jacket_Asset] [varchar](36) NOT NULL, - [Gloves_Item] [varchar](36) NOT NULL, - [Gloves_Asset] [varchar](36) NOT NULL, - [Undershirt_Item] [varchar](36) NOT NULL, - [Undershirt_Asset] [varchar](36) NOT NULL, - [Underpants_Item] [varchar](36) NOT NULL, - [Underpants_Asset] [varchar](36) NOT NULL, - [Skirt_Item] [varchar](36) NOT NULL, - [Skirt_Asset] [varchar](36) NOT NULL, - - PRIMARY KEY CLUSTERED ( - [Owner] - ) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] -) ON [PRIMARY] diff --git a/OpenSim/Data/MSSQL/Resources/002_AssetStore.sql b/OpenSim/Data/MSSQL/Resources/002_AssetStore.sql deleted file mode 100644 index 3e245432bf..0000000000 --- a/OpenSim/Data/MSSQL/Resources/002_AssetStore.sql +++ /dev/null @@ -1,29 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE Tmp_assets - ( - id varchar(36) NOT NULL, - name varchar(64) NOT NULL, - description varchar(64) NOT NULL, - assetType tinyint NOT NULL, - local bit NOT NULL, - temporary bit NOT NULL, - data image NOT NULL - ) ON [PRIMARY] - TEXTIMAGE_ON [PRIMARY] - -IF EXISTS(SELECT * FROM assets) - EXEC('INSERT INTO Tmp_assets (id, name, description, assetType, local, temporary, data) - SELECT id, name, description, assetType, CONVERT(bit, local), CONVERT(bit, temporary), data FROM assets WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE assets - -EXECUTE sp_rename N'Tmp_assets', N'assets', 'OBJECT' - -ALTER TABLE dbo.assets ADD CONSTRAINT - PK__assets__id PRIMARY KEY CLUSTERED - ( - id - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/002_AuthStore.sql b/OpenSim/Data/MSSQL/Resources/002_AuthStore.sql deleted file mode 100644 index daed955932..0000000000 --- a/OpenSim/Data/MSSQL/Resources/002_AuthStore.sql +++ /dev/null @@ -1,6 +0,0 @@ -BEGIN TRANSACTION - -INSERT INTO auth (UUID, passwordHash, passwordSalt, webLoginKey, accountType) SELECT [UUID] AS UUID, [passwordHash] AS passwordHash, [passwordSalt] AS passwordSalt, [webLoginKey] AS webLoginKey, 'UserAccount' as [accountType] FROM users; - - -COMMIT \ No newline at end of file diff --git a/OpenSim/Data/MSSQL/Resources/002_EstateStore.sql b/OpenSim/Data/MSSQL/Resources/002_EstateStore.sql deleted file mode 100644 index 18c12c097c..0000000000 --- a/OpenSim/Data/MSSQL/Resources/002_EstateStore.sql +++ /dev/null @@ -1,25 +0,0 @@ -BEGIN TRANSACTION - -ALTER TABLE dbo.estate_managers DROP CONSTRAINT PK_estate_managers - -CREATE NONCLUSTERED INDEX IX_estate_managers ON dbo.estate_managers - ( - EstateID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -ALTER TABLE dbo.estate_groups DROP CONSTRAINT PK_estate_groups - -CREATE NONCLUSTERED INDEX IX_estate_groups ON dbo.estate_groups - ( - EstateID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - - -ALTER TABLE dbo.estate_users DROP CONSTRAINT PK_estate_users - -CREATE NONCLUSTERED INDEX IX_estate_users ON dbo.estate_users - ( - EstateID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/002_FriendsStore.sql b/OpenSim/Data/MSSQL/Resources/002_FriendsStore.sql deleted file mode 100644 index e67d20e4b7..0000000000 --- a/OpenSim/Data/MSSQL/Resources/002_FriendsStore.sql +++ /dev/null @@ -1,6 +0,0 @@ -BEGIN TRANSACTION - -INSERT INTO Friends (PrincipalID, Friend, Flags, Offered) SELECT [ownerID], [friendID], [friendPerms], 0 FROM userfriends; - - -COMMIT \ No newline at end of file diff --git a/OpenSim/Data/MSSQL/Resources/002_GridStore.sql b/OpenSim/Data/MSSQL/Resources/002_GridStore.sql deleted file mode 100644 index f5901cb527..0000000000 --- a/OpenSim/Data/MSSQL/Resources/002_GridStore.sql +++ /dev/null @@ -1,49 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE Tmp_regions - ( - uuid varchar(36) COLLATE Latin1_General_CI_AS NOT NULL, - regionHandle bigint NULL, - regionName varchar(20) NULL, - regionRecvKey varchar(128) NULL, - regionSendKey varchar(128) NULL, - regionSecret varchar(128) NULL, - regionDataURI varchar(128) NULL, - serverIP varchar(64) NULL, - serverPort int NULL, - serverURI varchar(255) NULL, - locX int NULL, - locY int NULL, - locZ int NULL, - eastOverrideHandle bigint NULL, - westOverrideHandle bigint NULL, - southOverrideHandle bigint NULL, - northOverrideHandle bigint NULL, - regionAssetURI varchar(255) NULL, - regionAssetRecvKey varchar(128) NULL, - regionAssetSendKey varchar(128) NULL, - regionUserURI varchar(255) NULL, - regionUserRecvKey varchar(128) NULL, - regionUserSendKey varchar(128) NULL, - regionMapTexture varchar(36) NULL, - serverHttpPort int NULL, - serverRemotingPort int NULL, - owner_uuid varchar(36) NULL, - originUUID varchar(36) NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000') - ) ON [PRIMARY] - -IF EXISTS(SELECT * FROM regions) - EXEC('INSERT INTO Tmp_regions (uuid, regionHandle, regionName, regionRecvKey, regionSendKey, regionSecret, regionDataURI, serverIP, serverPort, serverURI, locX, locY, locZ, eastOverrideHandle, westOverrideHandle, southOverrideHandle, northOverrideHandle, regionAssetURI, regionAssetRecvKey, regionAssetSendKey, regionUserURI, regionUserRecvKey, regionUserSendKey, regionMapTexture, serverHttpPort, serverRemotingPort, owner_uuid) - SELECT CONVERT(varchar(36), uuid), CONVERT(bigint, regionHandle), CONVERT(varchar(20), regionName), CONVERT(varchar(128), regionRecvKey), CONVERT(varchar(128), regionSendKey), CONVERT(varchar(128), regionSecret), CONVERT(varchar(128), regionDataURI), CONVERT(varchar(64), serverIP), CONVERT(int, serverPort), serverURI, CONVERT(int, locX), CONVERT(int, locY), CONVERT(int, locZ), CONVERT(bigint, eastOverrideHandle), CONVERT(bigint, westOverrideHandle), CONVERT(bigint, southOverrideHandle), CONVERT(bigint, northOverrideHandle), regionAssetURI, CONVERT(varchar(128), regionAssetRecvKey), CONVERT(varchar(128), regionAssetSendKey), regionUserURI, CONVERT(varchar(128), regionUserRecvKey), CONVERT(varchar(128), regionUserSendKey), CONVERT(varchar(36), regionMapTexture), CONVERT(int, serverHttpPort), CONVERT(int, serverRemotingPort), owner_uuid FROM regions') - -DROP TABLE regions - -EXECUTE sp_rename N'Tmp_regions', N'regions', 'OBJECT' - -ALTER TABLE regions ADD CONSTRAINT - PK__regions__uuid PRIMARY KEY CLUSTERED - ( - uuid - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT \ No newline at end of file diff --git a/OpenSim/Data/MSSQL/Resources/002_InventoryStore.sql b/OpenSim/Data/MSSQL/Resources/002_InventoryStore.sql deleted file mode 100644 index bcc26b88c8..0000000000 --- a/OpenSim/Data/MSSQL/Resources/002_InventoryStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN TRANSACTION - -ALTER TABLE inventoryitems ADD inventoryGroupPermissions INTEGER NOT NULL default 0 - -COMMIT \ No newline at end of file diff --git a/OpenSim/Data/MSSQL/Resources/002_RegionStore.sql b/OpenSim/Data/MSSQL/Resources/002_RegionStore.sql deleted file mode 100644 index 1801035206..0000000000 --- a/OpenSim/Data/MSSQL/Resources/002_RegionStore.sql +++ /dev/null @@ -1,50 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE regionban ( - [regionUUID] VARCHAR(36) NOT NULL, - [bannedUUID] VARCHAR(36) NOT NULL, - [bannedIp] VARCHAR(16) NOT NULL, - [bannedIpHostMask] VARCHAR(16) NOT NULL) - -create table [dbo].[regionsettings] ( - [regionUUID] [varchar](36) not null, - [block_terraform] [bit] not null, - [block_fly] [bit] not null, - [allow_damage] [bit] not null, - [restrict_pushing] [bit] not null, - [allow_land_resell] [bit] not null, - [allow_land_join_divide] [bit] not null, - [block_show_in_search] [bit] not null, - [agent_limit] [int] not null, - [object_bonus] [float] not null, - [maturity] [int] not null, - [disable_scripts] [bit] not null, - [disable_collisions] [bit] not null, - [disable_physics] [bit] not null, - [terrain_texture_1] [varchar](36) not null, - [terrain_texture_2] [varchar](36) not null, - [terrain_texture_3] [varchar](36) not null, - [terrain_texture_4] [varchar](36) not null, - [elevation_1_nw] [float] not null, - [elevation_2_nw] [float] not null, - [elevation_1_ne] [float] not null, - [elevation_2_ne] [float] not null, - [elevation_1_se] [float] not null, - [elevation_2_se] [float] not null, - [elevation_1_sw] [float] not null, - [elevation_2_sw] [float] not null, - [water_height] [float] not null, - [terrain_raise_limit] [float] not null, - [terrain_lower_limit] [float] not null, - [use_estate_sun] [bit] not null, - [fixed_sun] [bit] not null, - [sun_position] [float] not null, - [covenant] [varchar](36) default NULL, - [Sandbox] [bit] NOT NULL, -PRIMARY KEY CLUSTERED -( - [regionUUID] ASC -)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] -) ON [PRIMARY] - -COMMIT \ No newline at end of file diff --git a/OpenSim/Data/MSSQL/Resources/002_UserAccount.sql b/OpenSim/Data/MSSQL/Resources/002_UserAccount.sql deleted file mode 100644 index 89d1f3495a..0000000000 --- a/OpenSim/Data/MSSQL/Resources/002_UserAccount.sql +++ /dev/null @@ -1,12 +0,0 @@ -BEGIN TRANSACTION - -INSERT INTO UserAccounts (PrincipalID, ScopeID, FirstName, LastName, Email, ServiceURLs, Created) SELECT [UUID] AS PrincipalID, '00000000-0000-0000-0000-000000000000' AS ScopeID, -username AS FirstName, -lastname AS LastName, -email as Email, ( -'AssetServerURI=' + -userAssetURI + ' InventoryServerURI=' + userInventoryURI + ' GatewayURI= HomeURI=') AS ServiceURLs, -created as Created FROM users; - - -COMMIT \ No newline at end of file diff --git a/OpenSim/Data/MSSQL/Resources/002_UserStore.sql b/OpenSim/Data/MSSQL/Resources/002_UserStore.sql deleted file mode 100644 index 402eddf15c..0000000000 --- a/OpenSim/Data/MSSQL/Resources/002_UserStore.sql +++ /dev/null @@ -1,9 +0,0 @@ -BEGIN TRANSACTION - -ALTER TABLE users ADD homeRegionID varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000'; -ALTER TABLE users ADD userFlags int NOT NULL default 0; -ALTER TABLE users ADD godLevel int NOT NULL default 0; -ALTER TABLE users ADD customType varchar(32) not null default ''; -ALTER TABLE users ADD partner varchar(36) not null default '00000000-0000-0000-0000-000000000000'; - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/003_AssetStore.sql b/OpenSim/Data/MSSQL/Resources/003_AssetStore.sql deleted file mode 100644 index 1434330739..0000000000 --- a/OpenSim/Data/MSSQL/Resources/003_AssetStore.sql +++ /dev/null @@ -1,6 +0,0 @@ -BEGIN TRANSACTION - -ALTER TABLE assets add create_time integer default 0 -ALTER TABLE assets add access_time integer default 0 - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/003_EstateStore.sql b/OpenSim/Data/MSSQL/Resources/003_EstateStore.sql deleted file mode 100644 index 120966ae1d..0000000000 --- a/OpenSim/Data/MSSQL/Resources/003_EstateStore.sql +++ /dev/null @@ -1,25 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_estateban - ( - EstateID int NOT NULL, - bannedUUID varchar(36) NOT NULL, - bannedIp varchar(16) NULL, - bannedIpHostMask varchar(16) NULL, - bannedNameMask varchar(64) NULL - ) ON [PRIMARY] - -IF EXISTS(SELECT * FROM dbo.estateban) - EXEC('INSERT INTO dbo.Tmp_estateban (EstateID, bannedUUID, bannedIp, bannedIpHostMask, bannedNameMask) - SELECT EstateID, bannedUUID, bannedIp, bannedIpHostMask, bannedNameMask FROM dbo.estateban') - -DROP TABLE dbo.estateban - -EXECUTE sp_rename N'dbo.Tmp_estateban', N'estateban', 'OBJECT' - -CREATE NONCLUSTERED INDEX IX_estateban ON dbo.estateban - ( - EstateID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/003_GridStore.sql b/OpenSim/Data/MSSQL/Resources/003_GridStore.sql deleted file mode 100644 index e080947665..0000000000 --- a/OpenSim/Data/MSSQL/Resources/003_GridStore.sql +++ /dev/null @@ -1,22 +0,0 @@ -BEGIN TRANSACTION - -CREATE NONCLUSTERED INDEX IX_regions_name ON dbo.regions - ( - regionName - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -CREATE NONCLUSTERED INDEX IX_regions_handle ON dbo.regions - ( - regionHandle - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - - -CREATE NONCLUSTERED INDEX IX_regions_override ON dbo.regions - ( - eastOverrideHandle, - westOverrideHandle, - southOverrideHandle, - northOverrideHandle - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/003_InventoryStore.sql b/OpenSim/Data/MSSQL/Resources/003_InventoryStore.sql deleted file mode 100644 index 2f623ec911..0000000000 --- a/OpenSim/Data/MSSQL/Resources/003_InventoryStore.sql +++ /dev/null @@ -1,38 +0,0 @@ -/* To prevent any potential data loss issues, you should review this script in detail before running it outside the context of the database designer.*/ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_inventoryfolders - ( - folderID uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'), - agentID uniqueidentifier NULL DEFAULT (NULL), - parentFolderID uniqueidentifier NULL DEFAULT (NULL), - folderName varchar(64) NULL DEFAULT (NULL), - type smallint NOT NULL DEFAULT ((0)), - version int NOT NULL DEFAULT ((0)) - ) ON [PRIMARY] - -IF EXISTS(SELECT * FROM dbo.inventoryfolders) - EXEC('INSERT INTO dbo.Tmp_inventoryfolders (folderID, agentID, parentFolderID, folderName, type, version) - SELECT CONVERT(uniqueidentifier, folderID), CONVERT(uniqueidentifier, agentID), CONVERT(uniqueidentifier, parentFolderID), folderName, type, version FROM dbo.inventoryfolders WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE dbo.inventoryfolders - -EXECUTE sp_rename N'dbo.Tmp_inventoryfolders', N'inventoryfolders', 'OBJECT' - -ALTER TABLE dbo.inventoryfolders ADD CONSTRAINT - PK__inventor__C2FABFB3173876EA PRIMARY KEY CLUSTERED - ( - folderID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -CREATE NONCLUSTERED INDEX owner ON dbo.inventoryfolders - ( - agentID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -CREATE NONCLUSTERED INDEX parent ON dbo.inventoryfolders - ( - parentFolderID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/003_RegionStore.sql b/OpenSim/Data/MSSQL/Resources/003_RegionStore.sql deleted file mode 100644 index a8f40c2a86..0000000000 --- a/OpenSim/Data/MSSQL/Resources/003_RegionStore.sql +++ /dev/null @@ -1,67 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_prims - ( - UUID varchar(36) NOT NULL, - RegionUUID varchar(36) NULL, - ParentID int NULL, - CreationDate int NULL, - Name varchar(255) NULL, - SceneGroupID varchar(36) NULL, - Text varchar(255) NULL, - Description varchar(255) NULL, - SitName varchar(255) NULL, - TouchName varchar(255) NULL, - ObjectFlags int NULL, - CreatorID varchar(36) NULL, - OwnerID varchar(36) NULL, - GroupID varchar(36) NULL, - LastOwnerID varchar(36) NULL, - OwnerMask int NULL, - NextOwnerMask int NULL, - GroupMask int NULL, - EveryoneMask int NULL, - BaseMask int NULL, - PositionX float(53) NULL, - PositionY float(53) NULL, - PositionZ float(53) NULL, - GroupPositionX float(53) NULL, - GroupPositionY float(53) NULL, - GroupPositionZ float(53) NULL, - VelocityX float(53) NULL, - VelocityY float(53) NULL, - VelocityZ float(53) NULL, - AngularVelocityX float(53) NULL, - AngularVelocityY float(53) NULL, - AngularVelocityZ float(53) NULL, - AccelerationX float(53) NULL, - AccelerationY float(53) NULL, - AccelerationZ float(53) NULL, - RotationX float(53) NULL, - RotationY float(53) NULL, - RotationZ float(53) NULL, - RotationW float(53) NULL, - SitTargetOffsetX float(53) NULL, - SitTargetOffsetY float(53) NULL, - SitTargetOffsetZ float(53) NULL, - SitTargetOrientW float(53) NULL, - SitTargetOrientX float(53) NULL, - SitTargetOrientY float(53) NULL, - SitTargetOrientZ float(53) NULL - ) ON [PRIMARY] - -IF EXISTS(SELECT * FROM dbo.prims) - EXEC('INSERT INTO dbo.Tmp_prims (UUID, RegionUUID, ParentID, CreationDate, Name, SceneGroupID, Text, Description, SitName, TouchName, ObjectFlags, CreatorID, OwnerID, GroupID, LastOwnerID, OwnerMask, NextOwnerMask, GroupMask, EveryoneMask, BaseMask, PositionX, PositionY, PositionZ, GroupPositionX, GroupPositionY, GroupPositionZ, VelocityX, VelocityY, VelocityZ, AngularVelocityX, AngularVelocityY, AngularVelocityZ, AccelerationX, AccelerationY, AccelerationZ, RotationX, RotationY, RotationZ, RotationW, SitTargetOffsetX, SitTargetOffsetY, SitTargetOffsetZ, SitTargetOrientW, SitTargetOrientX, SitTargetOrientY, SitTargetOrientZ) - SELECT CONVERT(varchar(36), UUID), CONVERT(varchar(36), RegionUUID), ParentID, CreationDate, Name, CONVERT(varchar(36), SceneGroupID), Text, Description, SitName, TouchName, ObjectFlags, CONVERT(varchar(36), CreatorID), CONVERT(varchar(36), OwnerID), CONVERT(varchar(36), GroupID), CONVERT(varchar(36), LastOwnerID), OwnerMask, NextOwnerMask, GroupMask, EveryoneMask, BaseMask, PositionX, PositionY, PositionZ, GroupPositionX, GroupPositionY, GroupPositionZ, VelocityX, VelocityY, VelocityZ, AngularVelocityX, AngularVelocityY, AngularVelocityZ, AccelerationX, AccelerationY, AccelerationZ, RotationX, RotationY, RotationZ, RotationW, SitTargetOffsetX, SitTargetOffsetY, SitTargetOffsetZ, SitTargetOrientW, SitTargetOrientX, SitTargetOrientY, SitTargetOrientZ FROM dbo.prims WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE dbo.prims - -EXECUTE sp_rename N'dbo.Tmp_prims', N'prims', 'OBJECT' - -ALTER TABLE dbo.prims ADD CONSTRAINT - PK__prims__10566F31 PRIMARY KEY CLUSTERED - ( - UUID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT \ No newline at end of file diff --git a/OpenSim/Data/MSSQL/Resources/003_UserAccount.sql b/OpenSim/Data/MSSQL/Resources/003_UserAccount.sql deleted file mode 100644 index da0395b49c..0000000000 --- a/OpenSim/Data/MSSQL/Resources/003_UserAccount.sql +++ /dev/null @@ -1,9 +0,0 @@ -BEGIN TRANSACTION - -CREATE UNIQUE INDEX PrincipalID ON UserAccounts(PrincipalID); -CREATE INDEX Email ON UserAccounts(Email); -CREATE INDEX FirstName ON UserAccounts(FirstName); -CREATE INDEX LastName ON UserAccounts(LastName); -CREATE INDEX Name ON UserAccounts(FirstName,LastName); - -COMMIT \ No newline at end of file diff --git a/OpenSim/Data/MSSQL/Resources/003_UserStore.sql b/OpenSim/Data/MSSQL/Resources/003_UserStore.sql deleted file mode 100644 index cb507c9630..0000000000 --- a/OpenSim/Data/MSSQL/Resources/003_UserStore.sql +++ /dev/null @@ -1,15 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE [avatarattachments] ( - [UUID] varchar(36) NOT NULL - , [attachpoint] int NOT NULL - , [item] varchar(36) NOT NULL - , [asset] varchar(36) NOT NULL) - -CREATE NONCLUSTERED INDEX IX_avatarattachments ON dbo.avatarattachments - ( - UUID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/004_AssetStore.sql b/OpenSim/Data/MSSQL/Resources/004_AssetStore.sql deleted file mode 100644 index 215cf3a14e..0000000000 --- a/OpenSim/Data/MSSQL/Resources/004_AssetStore.sql +++ /dev/null @@ -1,31 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_assets - ( - id uniqueidentifier NOT NULL, - name varchar(64) NOT NULL, - description varchar(64) NOT NULL, - assetType tinyint NOT NULL, - local bit NOT NULL, - temporary bit NOT NULL, - data image NOT NULL, - create_time int NULL, - access_time int NULL - ) ON [PRIMARY] - TEXTIMAGE_ON [PRIMARY] - -IF EXISTS(SELECT * FROM dbo.assets) - EXEC('INSERT INTO dbo.Tmp_assets (id, name, description, assetType, local, temporary, data, create_time, access_time) - SELECT CONVERT(uniqueidentifier, id), name, description, assetType, local, temporary, data, create_time, access_time FROM dbo.assets WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE assets - -EXECUTE sp_rename N'Tmp_assets', N'assets', 'OBJECT' - -ALTER TABLE dbo.assets ADD CONSTRAINT - PK__assets__id PRIMARY KEY CLUSTERED - ( - id - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/004_EstateStore.sql b/OpenSim/Data/MSSQL/Resources/004_EstateStore.sql deleted file mode 100644 index 0a132c110e..0000000000 --- a/OpenSim/Data/MSSQL/Resources/004_EstateStore.sql +++ /dev/null @@ -1,22 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_estate_managers - ( - EstateID int NOT NULL, - uuid uniqueidentifier NOT NULL - ) ON [PRIMARY] - -IF EXISTS(SELECT * FROM dbo.estate_managers) - EXEC('INSERT INTO dbo.Tmp_estate_managers (EstateID, uuid) - SELECT EstateID, CONVERT(uniqueidentifier, uuid) FROM dbo.estate_managers WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE dbo.estate_managers - -EXECUTE sp_rename N'dbo.Tmp_estate_managers', N'estate_managers', 'OBJECT' - -CREATE NONCLUSTERED INDEX IX_estate_managers ON dbo.estate_managers - ( - EstateID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/004_GridStore.sql b/OpenSim/Data/MSSQL/Resources/004_GridStore.sql deleted file mode 100644 index 6456c95f83..0000000000 --- a/OpenSim/Data/MSSQL/Resources/004_GridStore.sql +++ /dev/null @@ -1,68 +0,0 @@ -/* To prevent any potential data loss issues, you should review this script in detail before running it outside the context of the database designer.*/ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_regions - ( - uuid uniqueidentifier NOT NULL, - regionHandle bigint NULL, - regionName varchar(20) NULL, - regionRecvKey varchar(128) NULL, - regionSendKey varchar(128) NULL, - regionSecret varchar(128) NULL, - regionDataURI varchar(128) NULL, - serverIP varchar(64) NULL, - serverPort int NULL, - serverURI varchar(255) NULL, - locX int NULL, - locY int NULL, - locZ int NULL, - eastOverrideHandle bigint NULL, - westOverrideHandle bigint NULL, - southOverrideHandle bigint NULL, - northOverrideHandle bigint NULL, - regionAssetURI varchar(255) NULL, - regionAssetRecvKey varchar(128) NULL, - regionAssetSendKey varchar(128) NULL, - regionUserURI varchar(255) NULL, - regionUserRecvKey varchar(128) NULL, - regionUserSendKey varchar(128) NULL, - regionMapTexture uniqueidentifier NULL, - serverHttpPort int NULL, - serverRemotingPort int NULL, - owner_uuid uniqueidentifier NOT NULL, - originUUID uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000') - ) ON [PRIMARY] - -IF EXISTS(SELECT * FROM dbo.regions) - EXEC('INSERT INTO dbo.Tmp_regions (uuid, regionHandle, regionName, regionRecvKey, regionSendKey, regionSecret, regionDataURI, serverIP, serverPort, serverURI, locX, locY, locZ, eastOverrideHandle, westOverrideHandle, southOverrideHandle, northOverrideHandle, regionAssetURI, regionAssetRecvKey, regionAssetSendKey, regionUserURI, regionUserRecvKey, regionUserSendKey, regionMapTexture, serverHttpPort, serverRemotingPort, owner_uuid, originUUID) - SELECT CONVERT(uniqueidentifier, uuid), regionHandle, regionName, regionRecvKey, regionSendKey, regionSecret, regionDataURI, serverIP, serverPort, serverURI, locX, locY, locZ, eastOverrideHandle, westOverrideHandle, southOverrideHandle, northOverrideHandle, regionAssetURI, regionAssetRecvKey, regionAssetSendKey, regionUserURI, regionUserRecvKey, regionUserSendKey, CONVERT(uniqueidentifier, regionMapTexture), serverHttpPort, serverRemotingPort, CONVERT(uniqueidentifier, owner_uuid), CONVERT(uniqueidentifier, originUUID) FROM dbo.regions WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE dbo.regions - -EXECUTE sp_rename N'dbo.Tmp_regions', N'regions', 'OBJECT' - -ALTER TABLE dbo.regions ADD CONSTRAINT - PK__regions__uuid PRIMARY KEY CLUSTERED - ( - uuid - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -CREATE NONCLUSTERED INDEX IX_regions_name ON dbo.regions - ( - regionName - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -CREATE NONCLUSTERED INDEX IX_regions_handle ON dbo.regions - ( - regionHandle - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -CREATE NONCLUSTERED INDEX IX_regions_override ON dbo.regions - ( - eastOverrideHandle, - westOverrideHandle, - southOverrideHandle, - northOverrideHandle - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/004_InventoryStore.sql b/OpenSim/Data/MSSQL/Resources/004_InventoryStore.sql deleted file mode 100644 index 96ef1c0c90..0000000000 --- a/OpenSim/Data/MSSQL/Resources/004_InventoryStore.sql +++ /dev/null @@ -1,52 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_inventoryitems - ( - inventoryID uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'), - assetID uniqueidentifier NULL DEFAULT (NULL), - assetType int NULL DEFAULT (NULL), - parentFolderID uniqueidentifier NULL DEFAULT (NULL), - avatarID uniqueidentifier NULL DEFAULT (NULL), - inventoryName varchar(64) NULL DEFAULT (NULL), - inventoryDescription varchar(128) NULL DEFAULT (NULL), - inventoryNextPermissions int NULL DEFAULT (NULL), - inventoryCurrentPermissions int NULL DEFAULT (NULL), - invType int NULL DEFAULT (NULL), - creatorID uniqueidentifier NULL DEFAULT (NULL), - inventoryBasePermissions int NOT NULL DEFAULT ((0)), - inventoryEveryOnePermissions int NOT NULL DEFAULT ((0)), - salePrice int NULL DEFAULT (NULL), - saleType tinyint NULL DEFAULT (NULL), - creationDate int NULL DEFAULT (NULL), - groupID uniqueidentifier NULL DEFAULT (NULL), - groupOwned bit NULL DEFAULT (NULL), - flags int NULL DEFAULT (NULL), - inventoryGroupPermissions int NOT NULL DEFAULT ((0)) - ) ON [PRIMARY] - -IF EXISTS(SELECT * FROM dbo.inventoryitems) - EXEC('INSERT INTO dbo.Tmp_inventoryitems (inventoryID, assetID, assetType, parentFolderID, avatarID, inventoryName, inventoryDescription, inventoryNextPermissions, inventoryCurrentPermissions, invType, creatorID, inventoryBasePermissions, inventoryEveryOnePermissions, salePrice, saleType, creationDate, groupID, groupOwned, flags, inventoryGroupPermissions) - SELECT CONVERT(uniqueidentifier, inventoryID), CONVERT(uniqueidentifier, assetID), assetType, CONVERT(uniqueidentifier, parentFolderID), CONVERT(uniqueidentifier, avatarID), inventoryName, inventoryDescription, inventoryNextPermissions, inventoryCurrentPermissions, invType, CONVERT(uniqueidentifier, creatorID), inventoryBasePermissions, inventoryEveryOnePermissions, salePrice, saleType, creationDate, CONVERT(uniqueidentifier, groupID), groupOwned, flags, inventoryGroupPermissions FROM dbo.inventoryitems WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE dbo.inventoryitems - -EXECUTE sp_rename N'dbo.Tmp_inventoryitems', N'inventoryitems', 'OBJECT' - -ALTER TABLE dbo.inventoryitems ADD CONSTRAINT - PK__inventor__C4B7BC2220C1E124 PRIMARY KEY CLUSTERED - ( - inventoryID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - - -CREATE NONCLUSTERED INDEX owner ON dbo.inventoryitems - ( - avatarID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -CREATE NONCLUSTERED INDEX folder ON dbo.inventoryitems - ( - parentFolderID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/004_RegionStore.sql b/OpenSim/Data/MSSQL/Resources/004_RegionStore.sql deleted file mode 100644 index 15b39a7fcf..0000000000 --- a/OpenSim/Data/MSSQL/Resources/004_RegionStore.sql +++ /dev/null @@ -1,40 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE Tmp_primitems - ( - itemID varchar(36) NOT NULL, - primID varchar(36) NULL, - assetID varchar(36) NULL, - parentFolderID varchar(36) NULL, - invType int NULL, - assetType int NULL, - name varchar(255) NULL, - description varchar(255) NULL, - creationDate varchar(255) NULL, - creatorID varchar(36) NULL, - ownerID varchar(36) NULL, - lastOwnerID varchar(36) NULL, - groupID varchar(36) NULL, - nextPermissions int NULL, - currentPermissions int NULL, - basePermissions int NULL, - everyonePermissions int NULL, - groupPermissions int NULL - ) ON [PRIMARY] - -IF EXISTS(SELECT * FROM primitems) - EXEC('INSERT INTO Tmp_primitems (itemID, primID, assetID, parentFolderID, invType, assetType, name, description, creationDate, creatorID, ownerID, lastOwnerID, groupID, nextPermissions, currentPermissions, basePermissions, everyonePermissions, groupPermissions) - SELECT CONVERT(varchar(36), itemID), CONVERT(varchar(36), primID), CONVERT(varchar(36), assetID), CONVERT(varchar(36), parentFolderID), invType, assetType, name, description, creationDate, CONVERT(varchar(36), creatorID), CONVERT(varchar(36), ownerID), CONVERT(varchar(36), lastOwnerID), CONVERT(varchar(36), groupID), nextPermissions, currentPermissions, basePermissions, everyonePermissions, groupPermissions') - -DROP TABLE primitems - -EXECUTE sp_rename N'Tmp_primitems', N'primitems', 'OBJECT' - -ALTER TABLE primitems ADD CONSTRAINT - PK__primitems__0A688BB1 PRIMARY KEY CLUSTERED - ( - itemID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/004_UserAccount.sql b/OpenSim/Data/MSSQL/Resources/004_UserAccount.sql deleted file mode 100644 index a9a9021cc7..0000000000 --- a/OpenSim/Data/MSSQL/Resources/004_UserAccount.sql +++ /dev/null @@ -1,7 +0,0 @@ -BEGIN TRANSACTION - -ALTER TABLE UserAccounts ADD UserLevel integer NOT NULL DEFAULT 0; -ALTER TABLE UserAccounts ADD UserFlags integer NOT NULL DEFAULT 0; -ALTER TABLE UserAccounts ADD UserTitle varchar(64) NOT NULL DEFAULT ''; - -COMMIT \ No newline at end of file diff --git a/OpenSim/Data/MSSQL/Resources/004_UserStore.sql b/OpenSim/Data/MSSQL/Resources/004_UserStore.sql deleted file mode 100644 index 08f1a1d182..0000000000 --- a/OpenSim/Data/MSSQL/Resources/004_UserStore.sql +++ /dev/null @@ -1,29 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE Tmp_userfriends - ( - ownerID varchar(36) NOT NULL, - friendID varchar(36) NOT NULL, - friendPerms int NOT NULL, - datetimestamp int NOT NULL - ) ON [PRIMARY] - -IF EXISTS(SELECT * FROM userfriends) - EXEC('INSERT INTO dbo.Tmp_userfriends (ownerID, friendID, friendPerms, datetimestamp) - SELECT CONVERT(varchar(36), ownerID), CONVERT(varchar(36), friendID), CONVERT(int, friendPerms), CONVERT(int, datetimestamp) FROM dbo.userfriends WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE dbo.userfriends - -EXECUTE sp_rename N'Tmp_userfriends', N'userfriends', 'OBJECT' - -CREATE NONCLUSTERED INDEX IX_userfriends_ownerID ON userfriends - ( - ownerID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -CREATE NONCLUSTERED INDEX IX_userfriends_friendID ON userfriends - ( - friendID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/005_AssetStore.sql b/OpenSim/Data/MSSQL/Resources/005_AssetStore.sql deleted file mode 100644 index 4e95b2b693..0000000000 --- a/OpenSim/Data/MSSQL/Resources/005_AssetStore.sql +++ /dev/null @@ -1 +0,0 @@ -DELETE FROM assets WHERE id = 'dc4b9f0b-d008-45c6-96a4-01dd947ac621'; diff --git a/OpenSim/Data/MSSQL/Resources/005_EstateStore.sql b/OpenSim/Data/MSSQL/Resources/005_EstateStore.sql deleted file mode 100644 index ba93b39ff4..0000000000 --- a/OpenSim/Data/MSSQL/Resources/005_EstateStore.sql +++ /dev/null @@ -1,22 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_estate_groups - ( - EstateID int NOT NULL, - uuid uniqueidentifier NOT NULL - ) ON [PRIMARY] - -IF EXISTS(SELECT * FROM dbo.estate_groups) - EXEC('INSERT INTO dbo.Tmp_estate_groups (EstateID, uuid) - SELECT EstateID, CONVERT(uniqueidentifier, uuid) FROM dbo.estate_groups WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE dbo.estate_groups - -EXECUTE sp_rename N'dbo.Tmp_estate_groups', N'estate_groups', 'OBJECT' - -CREATE NONCLUSTERED INDEX IX_estate_groups ON dbo.estate_groups - ( - EstateID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/005_GridStore.sql b/OpenSim/Data/MSSQL/Resources/005_GridStore.sql deleted file mode 100644 index aa04a33019..0000000000 --- a/OpenSim/Data/MSSQL/Resources/005_GridStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN TRANSACTION - -ALTER TABLE regions ADD access int default 0; - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/005_RegionStore.sql b/OpenSim/Data/MSSQL/Resources/005_RegionStore.sql deleted file mode 100644 index eb0862c9bd..0000000000 --- a/OpenSim/Data/MSSQL/Resources/005_RegionStore.sql +++ /dev/null @@ -1,49 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE Tmp_primshapes - ( - UUID varchar(36) NOT NULL, - Shape int NULL, - ScaleX float(53) NULL, - ScaleY float(53) NULL, - ScaleZ float(53) NULL, - PCode int NULL, - PathBegin int NULL, - PathEnd int NULL, - PathScaleX int NULL, - PathScaleY int NULL, - PathShearX int NULL, - PathShearY int NULL, - PathSkew int NULL, - PathCurve int NULL, - PathRadiusOffset int NULL, - PathRevolutions int NULL, - PathTaperX int NULL, - PathTaperY int NULL, - PathTwist int NULL, - PathTwistBegin int NULL, - ProfileBegin int NULL, - ProfileEnd int NULL, - ProfileCurve int NULL, - ProfileHollow int NULL, - State int NULL, - Texture image NULL, - ExtraParams image NULL - ) ON [PRIMARY] - TEXTIMAGE_ON [PRIMARY] - -IF EXISTS(SELECT * FROM primshapes) - EXEC('INSERT INTO Tmp_primshapes (UUID, Shape, ScaleX, ScaleY, ScaleZ, PCode, PathBegin, PathEnd, PathScaleX, PathScaleY, PathShearX, PathShearY, PathSkew, PathCurve, PathRadiusOffset, PathRevolutions, PathTaperX, PathTaperY, PathTwist, PathTwistBegin, ProfileBegin, ProfileEnd, ProfileCurve, ProfileHollow, State, Texture, ExtraParams) - SELECT CONVERT(varchar(36), UUID), Shape, ScaleX, ScaleY, ScaleZ, PCode, PathBegin, PathEnd, PathScaleX, PathScaleY, PathShearX, PathShearY, PathSkew, PathCurve, PathRadiusOffset, PathRevolutions, PathTaperX, PathTaperY, PathTwist, PathTwistBegin, ProfileBegin, ProfileEnd, ProfileCurve, ProfileHollow, State, Texture, ExtraParams FROM primshapes WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE primshapes - -EXECUTE sp_rename N'Tmp_primshapes', N'primshapes', 'OBJECT' - -ALTER TABLE primshapes ADD CONSTRAINT - PK__primshapes__0880433F PRIMARY KEY CLUSTERED - ( - UUID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/005_UserStore.sql b/OpenSim/Data/MSSQL/Resources/005_UserStore.sql deleted file mode 100644 index 1b6ab8f7da..0000000000 --- a/OpenSim/Data/MSSQL/Resources/005_UserStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN TRANSACTION - - ALTER TABLE users add email varchar(250); - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/006_EstateStore.sql b/OpenSim/Data/MSSQL/Resources/006_EstateStore.sql deleted file mode 100644 index f7df8fda18..0000000000 --- a/OpenSim/Data/MSSQL/Resources/006_EstateStore.sql +++ /dev/null @@ -1,22 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_estate_users - ( - EstateID int NOT NULL, - uuid uniqueidentifier NOT NULL - ) ON [PRIMARY] - -IF EXISTS(SELECT * FROM dbo.estate_users) - EXEC('INSERT INTO dbo.Tmp_estate_users (EstateID, uuid) - SELECT EstateID, CONVERT(uniqueidentifier, uuid) FROM dbo.estate_users WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE dbo.estate_users - -EXECUTE sp_rename N'dbo.Tmp_estate_users', N'estate_users', 'OBJECT' - -CREATE NONCLUSTERED INDEX IX_estate_users ON dbo.estate_users - ( - EstateID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/006_GridStore.sql b/OpenSim/Data/MSSQL/Resources/006_GridStore.sql deleted file mode 100644 index 42010ce657..0000000000 --- a/OpenSim/Data/MSSQL/Resources/006_GridStore.sql +++ /dev/null @@ -1,8 +0,0 @@ -BEGIN TRANSACTION - -ALTER TABLE regions ADD scopeid uniqueidentifier default '00000000-0000-0000-0000-000000000000'; -ALTER TABLE regions ADD DEFAULT ('00000000-0000-0000-0000-000000000000') FOR [owner_uuid]; -ALTER TABLE regions ADD sizeX integer not null default 0; -ALTER TABLE regions ADD sizeY integer not null default 0; - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/006_RegionStore.sql b/OpenSim/Data/MSSQL/Resources/006_RegionStore.sql deleted file mode 100644 index 0419c0c8a6..0000000000 --- a/OpenSim/Data/MSSQL/Resources/006_RegionStore.sql +++ /dev/null @@ -1,36 +0,0 @@ -BEGIN TRANSACTION - -ALTER TABLE prims ADD PayPrice int not null default 0 -ALTER TABLE prims ADD PayButton1 int not null default 0 -ALTER TABLE prims ADD PayButton2 int not null default 0 -ALTER TABLE prims ADD PayButton3 int not null default 0 -ALTER TABLE prims ADD PayButton4 int not null default 0 -ALTER TABLE prims ADD LoopedSound varchar(36) not null default '00000000-0000-0000-0000-000000000000'; -ALTER TABLE prims ADD LoopedSoundGain float not null default 0.0; -ALTER TABLE prims ADD TextureAnimation image -ALTER TABLE prims ADD OmegaX float not null default 0.0 -ALTER TABLE prims ADD OmegaY float not null default 0.0 -ALTER TABLE prims ADD OmegaZ float not null default 0.0 -ALTER TABLE prims ADD CameraEyeOffsetX float not null default 0.0 -ALTER TABLE prims ADD CameraEyeOffsetY float not null default 0.0 -ALTER TABLE prims ADD CameraEyeOffsetZ float not null default 0.0 -ALTER TABLE prims ADD CameraAtOffsetX float not null default 0.0 -ALTER TABLE prims ADD CameraAtOffsetY float not null default 0.0 -ALTER TABLE prims ADD CameraAtOffsetZ float not null default 0.0 -ALTER TABLE prims ADD ForceMouselook tinyint not null default 0 -ALTER TABLE prims ADD ScriptAccessPin int not null default 0 -ALTER TABLE prims ADD AllowedDrop tinyint not null default 0 -ALTER TABLE prims ADD DieAtEdge tinyint not null default 0 -ALTER TABLE prims ADD SalePrice int not null default 10 -ALTER TABLE prims ADD SaleType tinyint not null default 0 - -ALTER TABLE primitems add flags integer not null default 0 - -ALTER TABLE land ADD AuthbuyerID varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000' - -CREATE index prims_regionuuid on prims(RegionUUID) -CREATE index prims_parentid on prims(ParentID) - -CREATE index primitems_primid on primitems(primID) - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/006_UserStore.sql b/OpenSim/Data/MSSQL/Resources/006_UserStore.sql deleted file mode 100644 index 67fe5818a8..0000000000 --- a/OpenSim/Data/MSSQL/Resources/006_UserStore.sql +++ /dev/null @@ -1,57 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_users - ( - UUID uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'), - username varchar(32) NOT NULL, - lastname varchar(32) NOT NULL, - passwordHash varchar(32) NOT NULL, - passwordSalt varchar(32) NOT NULL, - homeRegion bigint NULL DEFAULT (NULL), - homeLocationX float(53) NULL DEFAULT (NULL), - homeLocationY float(53) NULL DEFAULT (NULL), - homeLocationZ float(53) NULL DEFAULT (NULL), - homeLookAtX float(53) NULL DEFAULT (NULL), - homeLookAtY float(53) NULL DEFAULT (NULL), - homeLookAtZ float(53) NULL DEFAULT (NULL), - created int NOT NULL, - lastLogin int NOT NULL, - userInventoryURI varchar(255) NULL DEFAULT (NULL), - userAssetURI varchar(255) NULL DEFAULT (NULL), - profileCanDoMask int NULL DEFAULT (NULL), - profileWantDoMask int NULL DEFAULT (NULL), - profileAboutText ntext NULL, - profileFirstText ntext NULL, - profileImage uniqueidentifier NULL DEFAULT (NULL), - profileFirstImage uniqueidentifier NULL DEFAULT (NULL), - webLoginKey uniqueidentifier NULL DEFAULT (NULL), - homeRegionID uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'), - userFlags int NOT NULL DEFAULT ((0)), - godLevel int NOT NULL DEFAULT ((0)), - customType varchar(32) NOT NULL DEFAULT (''), - partner uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'), - email varchar(250) NULL - ) ON [PRIMARY] - TEXTIMAGE_ON [PRIMARY] - -IF EXISTS(SELECT * FROM dbo.users) - EXEC('INSERT INTO dbo.Tmp_users (UUID, username, lastname, passwordHash, passwordSalt, homeRegion, homeLocationX, homeLocationY, homeLocationZ, homeLookAtX, homeLookAtY, homeLookAtZ, created, lastLogin, userInventoryURI, userAssetURI, profileCanDoMask, profileWantDoMask, profileAboutText, profileFirstText, profileImage, profileFirstImage, webLoginKey, homeRegionID, userFlags, godLevel, customType, partner, email) - SELECT CONVERT(uniqueidentifier, UUID), username, lastname, passwordHash, passwordSalt, homeRegion, homeLocationX, homeLocationY, homeLocationZ, homeLookAtX, homeLookAtY, homeLookAtZ, created, lastLogin, userInventoryURI, userAssetURI, profileCanDoMask, profileWantDoMask, profileAboutText, profileFirstText, CONVERT(uniqueidentifier, profileImage), CONVERT(uniqueidentifier, profileFirstImage), CONVERT(uniqueidentifier, webLoginKey), CONVERT(uniqueidentifier, homeRegionID), userFlags, godLevel, customType, CONVERT(uniqueidentifier, partner), email FROM dbo.users WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE dbo.users - -EXECUTE sp_rename N'dbo.Tmp_users', N'users', 'OBJECT' - -ALTER TABLE dbo.users ADD CONSTRAINT - PK__users__65A475E737A5467C PRIMARY KEY CLUSTERED - ( - UUID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -CREATE NONCLUSTERED INDEX usernames ON dbo.users - ( - username, - lastname - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/007_EstateStore.sql b/OpenSim/Data/MSSQL/Resources/007_EstateStore.sql deleted file mode 100644 index c9165b0c6d..0000000000 --- a/OpenSim/Data/MSSQL/Resources/007_EstateStore.sql +++ /dev/null @@ -1,25 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_estateban - ( - EstateID int NOT NULL, - bannedUUID uniqueidentifier NOT NULL, - bannedIp varchar(16) NULL, - bannedIpHostMask varchar(16) NULL, - bannedNameMask varchar(64) NULL - ) ON [PRIMARY] - -IF EXISTS(SELECT * FROM dbo.estateban) - EXEC('INSERT INTO dbo.Tmp_estateban (EstateID, bannedUUID, bannedIp, bannedIpHostMask, bannedNameMask) - SELECT EstateID, CONVERT(uniqueidentifier, bannedUUID), bannedIp, bannedIpHostMask, bannedNameMask FROM dbo.estateban WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE dbo.estateban - -EXECUTE sp_rename N'dbo.Tmp_estateban', N'estateban', 'OBJECT' - -CREATE NONCLUSTERED INDEX IX_estateban ON dbo.estateban - ( - EstateID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/007_GridStore.sql b/OpenSim/Data/MSSQL/Resources/007_GridStore.sql deleted file mode 100644 index 0b66d40b47..0000000000 --- a/OpenSim/Data/MSSQL/Resources/007_GridStore.sql +++ /dev/null @@ -1,9 +0,0 @@ -BEGIN TRANSACTION - -ALTER TABLE regions ADD [flags] integer NOT NULL DEFAULT 0; -CREATE INDEX [flags] ON regions(flags); -ALTER TABLE [regions] ADD [last_seen] integer NOT NULL DEFAULT 0; -ALTER TABLE [regions] ADD [PrincipalID] uniqueidentifier NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000'; -ALTER TABLE [regions] ADD [Token] varchar(255) NOT NULL DEFAULT 0; - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/007_RegionStore.sql b/OpenSim/Data/MSSQL/Resources/007_RegionStore.sql deleted file mode 100644 index 684f937334..0000000000 --- a/OpenSim/Data/MSSQL/Resources/007_RegionStore.sql +++ /dev/null @@ -1,10 +0,0 @@ -BEGIN TRANSACTION - -ALTER TABLE prims ADD ColorR int not null default 0; -ALTER TABLE prims ADD ColorG int not null default 0; -ALTER TABLE prims ADD ColorB int not null default 0; -ALTER TABLE prims ADD ColorA int not null default 0; -ALTER TABLE prims ADD ParticleSystem IMAGE; -ALTER TABLE prims ADD ClickAction tinyint NOT NULL default 0; - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/007_UserStore.sql b/OpenSim/Data/MSSQL/Resources/007_UserStore.sql deleted file mode 100644 index 92a8fc572a..0000000000 --- a/OpenSim/Data/MSSQL/Resources/007_UserStore.sql +++ /dev/null @@ -1,42 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_agents - ( - UUID uniqueidentifier NOT NULL, - sessionID uniqueidentifier NOT NULL, - secureSessionID uniqueidentifier NOT NULL, - agentIP varchar(16) NOT NULL, - agentPort int NOT NULL, - agentOnline tinyint NOT NULL, - loginTime int NOT NULL, - logoutTime int NOT NULL, - currentRegion uniqueidentifier NOT NULL, - currentHandle bigint NOT NULL, - currentPos varchar(64) NOT NULL - ) ON [PRIMARY] - -IF EXISTS(SELECT * FROM dbo.agents) - EXEC('INSERT INTO dbo.Tmp_agents (UUID, sessionID, secureSessionID, agentIP, agentPort, agentOnline, loginTime, logoutTime, currentRegion, currentHandle, currentPos) - SELECT CONVERT(uniqueidentifier, UUID), CONVERT(uniqueidentifier, sessionID), CONVERT(uniqueidentifier, secureSessionID), agentIP, agentPort, agentOnline, loginTime, logoutTime, CONVERT(uniqueidentifier, currentRegion), currentHandle, currentPos FROM dbo.agents WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE dbo.agents - -EXECUTE sp_rename N'dbo.Tmp_agents', N'agents', 'OBJECT' - -ALTER TABLE dbo.agents ADD CONSTRAINT - PK__agents__65A475E749C3F6B7 PRIMARY KEY CLUSTERED - ( - UUID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -CREATE NONCLUSTERED INDEX session ON dbo.agents - ( - sessionID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -CREATE NONCLUSTERED INDEX ssession ON dbo.agents - ( - secureSessionID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/008_EstateStore.sql b/OpenSim/Data/MSSQL/Resources/008_EstateStore.sql deleted file mode 100644 index 9c5355eac7..0000000000 --- a/OpenSim/Data/MSSQL/Resources/008_EstateStore.sql +++ /dev/null @@ -1,49 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_estate_settings - ( - EstateID int NOT NULL IDENTITY (1, 100), - EstateName varchar(64) NULL DEFAULT (NULL), - AbuseEmailToEstateOwner bit NOT NULL, - DenyAnonymous bit NOT NULL, - ResetHomeOnTeleport bit NOT NULL, - FixedSun bit NOT NULL, - DenyTransacted bit NOT NULL, - BlockDwell bit NOT NULL, - DenyIdentified bit NOT NULL, - AllowVoice bit NOT NULL, - UseGlobalTime bit NOT NULL, - PricePerMeter int NOT NULL, - TaxFree bit NOT NULL, - AllowDirectTeleport bit NOT NULL, - RedirectGridX int NOT NULL, - RedirectGridY int NOT NULL, - ParentEstateID int NOT NULL, - SunPosition float(53) NOT NULL, - EstateSkipScripts bit NOT NULL, - BillableFactor float(53) NOT NULL, - PublicAccess bit NOT NULL, - AbuseEmail varchar(255) NOT NULL, - EstateOwner uniqueidentifier NOT NULL, - DenyMinors bit NOT NULL - ) ON [PRIMARY] - -SET IDENTITY_INSERT dbo.Tmp_estate_settings ON - -IF EXISTS(SELECT * FROM dbo.estate_settings) - EXEC('INSERT INTO dbo.Tmp_estate_settings (EstateID, EstateName, AbuseEmailToEstateOwner, DenyAnonymous, ResetHomeOnTeleport, FixedSun, DenyTransacted, BlockDwell, DenyIdentified, AllowVoice, UseGlobalTime, PricePerMeter, TaxFree, AllowDirectTeleport, RedirectGridX, RedirectGridY, ParentEstateID, SunPosition, EstateSkipScripts, BillableFactor, PublicAccess, AbuseEmail, EstateOwner, DenyMinors) - SELECT EstateID, EstateName, AbuseEmailToEstateOwner, DenyAnonymous, ResetHomeOnTeleport, FixedSun, DenyTransacted, BlockDwell, DenyIdentified, AllowVoice, UseGlobalTime, PricePerMeter, TaxFree, AllowDirectTeleport, RedirectGridX, RedirectGridY, ParentEstateID, SunPosition, EstateSkipScripts, BillableFactor, PublicAccess, AbuseEmail, CONVERT(uniqueidentifier, EstateOwner), DenyMinors FROM dbo.estate_settings WITH (HOLDLOCK TABLOCKX)') - -SET IDENTITY_INSERT dbo.Tmp_estate_settings OFF - -DROP TABLE dbo.estate_settings - -EXECUTE sp_rename N'dbo.Tmp_estate_settings', N'estate_settings', 'OBJECT' - -ALTER TABLE dbo.estate_settings ADD CONSTRAINT - PK_estate_settings PRIMARY KEY CLUSTERED - ( - EstateID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/008_RegionStore.sql b/OpenSim/Data/MSSQL/Resources/008_RegionStore.sql deleted file mode 100644 index 87d6d80005..0000000000 --- a/OpenSim/Data/MSSQL/Resources/008_RegionStore.sql +++ /dev/null @@ -1,7 +0,0 @@ -BEGIN TRANSACTION - -ALTER TABLE land ADD OtherCleanTime integer NOT NULL default 0; -ALTER TABLE land ADD Dwell integer NOT NULL default 0; - -COMMIT - diff --git a/OpenSim/Data/MSSQL/Resources/008_UserStore.sql b/OpenSim/Data/MSSQL/Resources/008_UserStore.sql deleted file mode 100644 index 505252ba42..0000000000 --- a/OpenSim/Data/MSSQL/Resources/008_UserStore.sql +++ /dev/null @@ -1,29 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_userfriends - ( - ownerID uniqueidentifier NOT NULL, - friendID uniqueidentifier NOT NULL, - friendPerms int NOT NULL, - datetimestamp int NOT NULL - ) ON [PRIMARY] - -IF EXISTS(SELECT * FROM dbo.userfriends) - EXEC('INSERT INTO dbo.Tmp_userfriends (ownerID, friendID, friendPerms, datetimestamp) - SELECT CONVERT(uniqueidentifier, ownerID), CONVERT(uniqueidentifier, friendID), friendPerms, datetimestamp FROM dbo.userfriends WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE dbo.userfriends - -EXECUTE sp_rename N'dbo.Tmp_userfriends', N'userfriends', 'OBJECT' - -CREATE NONCLUSTERED INDEX IX_userfriends_ownerID ON dbo.userfriends - ( - ownerID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -CREATE NONCLUSTERED INDEX IX_userfriends_friendID ON dbo.userfriends - ( - friendID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/009_EstateStore.sql b/OpenSim/Data/MSSQL/Resources/009_EstateStore.sql deleted file mode 100644 index f91557c805..0000000000 --- a/OpenSim/Data/MSSQL/Resources/009_EstateStore.sql +++ /dev/null @@ -1,24 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_estate_map - ( - RegionID uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'), - EstateID int NOT NULL - ) ON [PRIMARY] - -IF EXISTS(SELECT * FROM dbo.estate_map) - EXEC('INSERT INTO dbo.Tmp_estate_map (RegionID, EstateID) - SELECT CONVERT(uniqueidentifier, RegionID), EstateID FROM dbo.estate_map WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE dbo.estate_map - -EXECUTE sp_rename N'dbo.Tmp_estate_map', N'estate_map', 'OBJECT' - -ALTER TABLE dbo.estate_map ADD CONSTRAINT - PK_estate_map PRIMARY KEY CLUSTERED - ( - RegionID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/009_RegionStore.sql b/OpenSim/Data/MSSQL/Resources/009_RegionStore.sql deleted file mode 100644 index 4ef3b3f125..0000000000 --- a/OpenSim/Data/MSSQL/Resources/009_RegionStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN TRANSACTION - -ALTER TABLE prims ADD Material tinyint NOT NULL default 3 - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/009_UserStore.sql b/OpenSim/Data/MSSQL/Resources/009_UserStore.sql deleted file mode 100644 index b1ab8ba69b..0000000000 --- a/OpenSim/Data/MSSQL/Resources/009_UserStore.sql +++ /dev/null @@ -1,53 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_avatarappearance - ( - Owner uniqueidentifier NOT NULL, - Serial int NOT NULL, - Visual_Params image NOT NULL, - Texture image NOT NULL, - Avatar_Height float(53) NOT NULL, - Body_Item uniqueidentifier NOT NULL, - Body_Asset uniqueidentifier NOT NULL, - Skin_Item uniqueidentifier NOT NULL, - Skin_Asset uniqueidentifier NOT NULL, - Hair_Item uniqueidentifier NOT NULL, - Hair_Asset uniqueidentifier NOT NULL, - Eyes_Item uniqueidentifier NOT NULL, - Eyes_Asset uniqueidentifier NOT NULL, - Shirt_Item uniqueidentifier NOT NULL, - Shirt_Asset uniqueidentifier NOT NULL, - Pants_Item uniqueidentifier NOT NULL, - Pants_Asset uniqueidentifier NOT NULL, - Shoes_Item uniqueidentifier NOT NULL, - Shoes_Asset uniqueidentifier NOT NULL, - Socks_Item uniqueidentifier NOT NULL, - Socks_Asset uniqueidentifier NOT NULL, - Jacket_Item uniqueidentifier NOT NULL, - Jacket_Asset uniqueidentifier NOT NULL, - Gloves_Item uniqueidentifier NOT NULL, - Gloves_Asset uniqueidentifier NOT NULL, - Undershirt_Item uniqueidentifier NOT NULL, - Undershirt_Asset uniqueidentifier NOT NULL, - Underpants_Item uniqueidentifier NOT NULL, - Underpants_Asset uniqueidentifier NOT NULL, - Skirt_Item uniqueidentifier NOT NULL, - Skirt_Asset uniqueidentifier NOT NULL - ) ON [PRIMARY] - TEXTIMAGE_ON [PRIMARY] - -IF EXISTS(SELECT * FROM dbo.avatarappearance) - EXEC('INSERT INTO dbo.Tmp_avatarappearance (Owner, Serial, Visual_Params, Texture, Avatar_Height, Body_Item, Body_Asset, Skin_Item, Skin_Asset, Hair_Item, Hair_Asset, Eyes_Item, Eyes_Asset, Shirt_Item, Shirt_Asset, Pants_Item, Pants_Asset, Shoes_Item, Shoes_Asset, Socks_Item, Socks_Asset, Jacket_Item, Jacket_Asset, Gloves_Item, Gloves_Asset, Undershirt_Item, Undershirt_Asset, Underpants_Item, Underpants_Asset, Skirt_Item, Skirt_Asset) - SELECT CONVERT(uniqueidentifier, Owner), Serial, Visual_Params, Texture, Avatar_Height, CONVERT(uniqueidentifier, Body_Item), CONVERT(uniqueidentifier, Body_Asset), CONVERT(uniqueidentifier, Skin_Item), CONVERT(uniqueidentifier, Skin_Asset), CONVERT(uniqueidentifier, Hair_Item), CONVERT(uniqueidentifier, Hair_Asset), CONVERT(uniqueidentifier, Eyes_Item), CONVERT(uniqueidentifier, Eyes_Asset), CONVERT(uniqueidentifier, Shirt_Item), CONVERT(uniqueidentifier, Shirt_Asset), CONVERT(uniqueidentifier, Pants_Item), CONVERT(uniqueidentifier, Pants_Asset), CONVERT(uniqueidentifier, Shoes_Item), CONVERT(uniqueidentifier, Shoes_Asset), CONVERT(uniqueidentifier, Socks_Item), CONVERT(uniqueidentifier, Socks_Asset), CONVERT(uniqueidentifier, Jacket_Item), CONVERT(uniqueidentifier, Jacket_Asset), CONVERT(uniqueidentifier, Gloves_Item), CONVERT(uniqueidentifier, Gloves_Asset), CONVERT(uniqueidentifier, Undershirt_Item), CONVERT(uniqueidentifier, Undershirt_Asset), CONVERT(uniqueidentifier, Underpants_Item), CONVERT(uniqueidentifier, Underpants_Asset), CONVERT(uniqueidentifier, Skirt_Item), CONVERT(uniqueidentifier, Skirt_Asset) FROM dbo.avatarappearance WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE dbo.avatarappearance - -EXECUTE sp_rename N'dbo.Tmp_avatarappearance', N'avatarappearance', 'OBJECT' - -ALTER TABLE dbo.avatarappearance ADD CONSTRAINT - PK__avatarap__7DD115CC4E88ABD4 PRIMARY KEY CLUSTERED - ( - Owner - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/010_RegionStore.sql b/OpenSim/Data/MSSQL/Resources/010_RegionStore.sql deleted file mode 100644 index 74ad9c2e28..0000000000 --- a/OpenSim/Data/MSSQL/Resources/010_RegionStore.sql +++ /dev/null @@ -1,7 +0,0 @@ -BEGIN TRANSACTION - -ALTER TABLE regionsettings ADD sunvectorx float NOT NULL default 0; -ALTER TABLE regionsettings ADD sunvectory float NOT NULL default 0; -ALTER TABLE regionsettings ADD sunvectorz float NOT NULL default 0; - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/010_UserStore.sql b/OpenSim/Data/MSSQL/Resources/010_UserStore.sql deleted file mode 100644 index 0af008aa13..0000000000 --- a/OpenSim/Data/MSSQL/Resources/010_UserStore.sql +++ /dev/null @@ -1,24 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_avatarattachments - ( - UUID uniqueidentifier NOT NULL, - attachpoint int NOT NULL, - item uniqueidentifier NOT NULL, - asset uniqueidentifier NOT NULL - ) ON [PRIMARY] - -IF EXISTS(SELECT * FROM dbo.avatarattachments) - EXEC('INSERT INTO dbo.Tmp_avatarattachments (UUID, attachpoint, item, asset) - SELECT CONVERT(uniqueidentifier, UUID), attachpoint, CONVERT(uniqueidentifier, item), CONVERT(uniqueidentifier, asset) FROM dbo.avatarattachments WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE dbo.avatarattachments - -EXECUTE sp_rename N'dbo.Tmp_avatarattachments', N'avatarattachments', 'OBJECT' - -CREATE NONCLUSTERED INDEX IX_avatarattachments ON dbo.avatarattachments - ( - UUID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/011_RegionStore.sql b/OpenSim/Data/MSSQL/Resources/011_RegionStore.sql deleted file mode 100644 index 14c71a3737..0000000000 --- a/OpenSim/Data/MSSQL/Resources/011_RegionStore.sql +++ /dev/null @@ -1,6 +0,0 @@ -BEGIN TRANSACTION - -ALTER TABLE prims ADD CollisionSound char(36) not null default '00000000-0000-0000-0000-000000000000' -ALTER TABLE prims ADD CollisionSoundVolume float not null default 0.0 - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/011_UserStore.sql b/OpenSim/Data/MSSQL/Resources/011_UserStore.sql deleted file mode 100644 index 5aa064fac8..0000000000 --- a/OpenSim/Data/MSSQL/Resources/011_UserStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN TRANSACTION - -ALTER TABLE users ADD scopeID uniqueidentifier not null default '00000000-0000-0000-0000-000000000000' - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/012_RegionStore.sql b/OpenSim/Data/MSSQL/Resources/012_RegionStore.sql deleted file mode 100644 index eef8d9075c..0000000000 --- a/OpenSim/Data/MSSQL/Resources/012_RegionStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN TRANSACTION - -ALTER TABLE prims ADD LinkNumber integer not null default 0 - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/013_RegionStore.sql b/OpenSim/Data/MSSQL/Resources/013_RegionStore.sql deleted file mode 100644 index ef5d4c035c..0000000000 --- a/OpenSim/Data/MSSQL/Resources/013_RegionStore.sql +++ /dev/null @@ -1,112 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_prims - ( - UUID uniqueidentifier NOT NULL, - RegionUUID uniqueidentifier NULL, - ParentID int NULL, - CreationDate int NULL, - Name varchar(255) NULL, - SceneGroupID uniqueidentifier NULL, - Text varchar(255) NULL, - Description varchar(255) NULL, - SitName varchar(255) NULL, - TouchName varchar(255) NULL, - ObjectFlags int NULL, - CreatorID uniqueidentifier NULL, - OwnerID uniqueidentifier NULL, - GroupID uniqueidentifier NULL, - LastOwnerID uniqueidentifier NULL, - OwnerMask int NULL, - NextOwnerMask int NULL, - GroupMask int NULL, - EveryoneMask int NULL, - BaseMask int NULL, - PositionX float(53) NULL, - PositionY float(53) NULL, - PositionZ float(53) NULL, - GroupPositionX float(53) NULL, - GroupPositionY float(53) NULL, - GroupPositionZ float(53) NULL, - VelocityX float(53) NULL, - VelocityY float(53) NULL, - VelocityZ float(53) NULL, - AngularVelocityX float(53) NULL, - AngularVelocityY float(53) NULL, - AngularVelocityZ float(53) NULL, - AccelerationX float(53) NULL, - AccelerationY float(53) NULL, - AccelerationZ float(53) NULL, - RotationX float(53) NULL, - RotationY float(53) NULL, - RotationZ float(53) NULL, - RotationW float(53) NULL, - SitTargetOffsetX float(53) NULL, - SitTargetOffsetY float(53) NULL, - SitTargetOffsetZ float(53) NULL, - SitTargetOrientW float(53) NULL, - SitTargetOrientX float(53) NULL, - SitTargetOrientY float(53) NULL, - SitTargetOrientZ float(53) NULL, - PayPrice int NOT NULL DEFAULT ((0)), - PayButton1 int NOT NULL DEFAULT ((0)), - PayButton2 int NOT NULL DEFAULT ((0)), - PayButton3 int NOT NULL DEFAULT ((0)), - PayButton4 int NOT NULL DEFAULT ((0)), - LoopedSound uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'), - LoopedSoundGain float(53) NOT NULL DEFAULT ((0.0)), - TextureAnimation image NULL, - OmegaX float(53) NOT NULL DEFAULT ((0.0)), - OmegaY float(53) NOT NULL DEFAULT ((0.0)), - OmegaZ float(53) NOT NULL DEFAULT ((0.0)), - CameraEyeOffsetX float(53) NOT NULL DEFAULT ((0.0)), - CameraEyeOffsetY float(53) NOT NULL DEFAULT ((0.0)), - CameraEyeOffsetZ float(53) NOT NULL DEFAULT ((0.0)), - CameraAtOffsetX float(53) NOT NULL DEFAULT ((0.0)), - CameraAtOffsetY float(53) NOT NULL DEFAULT ((0.0)), - CameraAtOffsetZ float(53) NOT NULL DEFAULT ((0.0)), - ForceMouselook tinyint NOT NULL DEFAULT ((0)), - ScriptAccessPin int NOT NULL DEFAULT ((0)), - AllowedDrop tinyint NOT NULL DEFAULT ((0)), - DieAtEdge tinyint NOT NULL DEFAULT ((0)), - SalePrice int NOT NULL DEFAULT ((10)), - SaleType tinyint NOT NULL DEFAULT ((0)), - ColorR int NOT NULL DEFAULT ((0)), - ColorG int NOT NULL DEFAULT ((0)), - ColorB int NOT NULL DEFAULT ((0)), - ColorA int NOT NULL DEFAULT ((0)), - ParticleSystem image NULL, - ClickAction tinyint NOT NULL DEFAULT ((0)), - Material tinyint NOT NULL DEFAULT ((3)), - CollisionSound uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'), - CollisionSoundVolume float(53) NOT NULL DEFAULT ((0.0)), - LinkNumber int NOT NULL DEFAULT ((0)) - ) ON [PRIMARY] - TEXTIMAGE_ON [PRIMARY] - -IF EXISTS(SELECT * FROM dbo.prims) - EXEC('INSERT INTO dbo.Tmp_prims (UUID, RegionUUID, ParentID, CreationDate, Name, SceneGroupID, Text, Description, SitName, TouchName, ObjectFlags, CreatorID, OwnerID, GroupID, LastOwnerID, OwnerMask, NextOwnerMask, GroupMask, EveryoneMask, BaseMask, PositionX, PositionY, PositionZ, GroupPositionX, GroupPositionY, GroupPositionZ, VelocityX, VelocityY, VelocityZ, AngularVelocityX, AngularVelocityY, AngularVelocityZ, AccelerationX, AccelerationY, AccelerationZ, RotationX, RotationY, RotationZ, RotationW, SitTargetOffsetX, SitTargetOffsetY, SitTargetOffsetZ, SitTargetOrientW, SitTargetOrientX, SitTargetOrientY, SitTargetOrientZ, PayPrice, PayButton1, PayButton2, PayButton3, PayButton4, LoopedSound, LoopedSoundGain, TextureAnimation, OmegaX, OmegaY, OmegaZ, CameraEyeOffsetX, CameraEyeOffsetY, CameraEyeOffsetZ, CameraAtOffsetX, CameraAtOffsetY, CameraAtOffsetZ, ForceMouselook, ScriptAccessPin, AllowedDrop, DieAtEdge, SalePrice, SaleType, ColorR, ColorG, ColorB, ColorA, ParticleSystem, ClickAction, Material, CollisionSound, CollisionSoundVolume, LinkNumber) - SELECT CONVERT(uniqueidentifier, UUID), CONVERT(uniqueidentifier, RegionUUID), ParentID, CreationDate, Name, CONVERT(uniqueidentifier, SceneGroupID), Text, Description, SitName, TouchName, ObjectFlags, CONVERT(uniqueidentifier, CreatorID), CONVERT(uniqueidentifier, OwnerID), CONVERT(uniqueidentifier, GroupID), CONVERT(uniqueidentifier, LastOwnerID), OwnerMask, NextOwnerMask, GroupMask, EveryoneMask, BaseMask, PositionX, PositionY, PositionZ, GroupPositionX, GroupPositionY, GroupPositionZ, VelocityX, VelocityY, VelocityZ, AngularVelocityX, AngularVelocityY, AngularVelocityZ, AccelerationX, AccelerationY, AccelerationZ, RotationX, RotationY, RotationZ, RotationW, SitTargetOffsetX, SitTargetOffsetY, SitTargetOffsetZ, SitTargetOrientW, SitTargetOrientX, SitTargetOrientY, SitTargetOrientZ, PayPrice, PayButton1, PayButton2, PayButton3, PayButton4, CONVERT(uniqueidentifier, LoopedSound), LoopedSoundGain, TextureAnimation, OmegaX, OmegaY, OmegaZ, CameraEyeOffsetX, CameraEyeOffsetY, CameraEyeOffsetZ, CameraAtOffsetX, CameraAtOffsetY, CameraAtOffsetZ, ForceMouselook, ScriptAccessPin, AllowedDrop, DieAtEdge, SalePrice, SaleType, ColorR, ColorG, ColorB, ColorA, ParticleSystem, ClickAction, Material, CONVERT(uniqueidentifier, CollisionSound), CollisionSoundVolume, LinkNumber FROM dbo.prims WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE dbo.prims - -EXECUTE sp_rename N'dbo.Tmp_prims', N'prims', 'OBJECT' - -ALTER TABLE dbo.prims ADD CONSTRAINT - PK__prims__10566F31 PRIMARY KEY CLUSTERED - ( - UUID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - - -CREATE NONCLUSTERED INDEX prims_regionuuid ON dbo.prims - ( - RegionUUID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -CREATE NONCLUSTERED INDEX prims_parentid ON dbo.prims - ( - ParentID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/014_RegionStore.sql b/OpenSim/Data/MSSQL/Resources/014_RegionStore.sql deleted file mode 100644 index 02f6f55b86..0000000000 --- a/OpenSim/Data/MSSQL/Resources/014_RegionStore.sql +++ /dev/null @@ -1,49 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_primshapes - ( - UUID uniqueidentifier NOT NULL, - Shape int NULL, - ScaleX float(53) NULL, - ScaleY float(53) NULL, - ScaleZ float(53) NULL, - PCode int NULL, - PathBegin int NULL, - PathEnd int NULL, - PathScaleX int NULL, - PathScaleY int NULL, - PathShearX int NULL, - PathShearY int NULL, - PathSkew int NULL, - PathCurve int NULL, - PathRadiusOffset int NULL, - PathRevolutions int NULL, - PathTaperX int NULL, - PathTaperY int NULL, - PathTwist int NULL, - PathTwistBegin int NULL, - ProfileBegin int NULL, - ProfileEnd int NULL, - ProfileCurve int NULL, - ProfileHollow int NULL, - State int NULL, - Texture image NULL, - ExtraParams image NULL - ) ON [PRIMARY] - TEXTIMAGE_ON [PRIMARY] - -IF EXISTS(SELECT * FROM dbo.primshapes) - EXEC('INSERT INTO dbo.Tmp_primshapes (UUID, Shape, ScaleX, ScaleY, ScaleZ, PCode, PathBegin, PathEnd, PathScaleX, PathScaleY, PathShearX, PathShearY, PathSkew, PathCurve, PathRadiusOffset, PathRevolutions, PathTaperX, PathTaperY, PathTwist, PathTwistBegin, ProfileBegin, ProfileEnd, ProfileCurve, ProfileHollow, State, Texture, ExtraParams) - SELECT CONVERT(uniqueidentifier, UUID), Shape, ScaleX, ScaleY, ScaleZ, PCode, PathBegin, PathEnd, PathScaleX, PathScaleY, PathShearX, PathShearY, PathSkew, PathCurve, PathRadiusOffset, PathRevolutions, PathTaperX, PathTaperY, PathTwist, PathTwistBegin, ProfileBegin, ProfileEnd, ProfileCurve, ProfileHollow, State, Texture, ExtraParams FROM dbo.primshapes WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE dbo.primshapes - -EXECUTE sp_rename N'dbo.Tmp_primshapes', N'primshapes', 'OBJECT' - -ALTER TABLE dbo.primshapes ADD CONSTRAINT - PK__primshapes__0880433F PRIMARY KEY CLUSTERED - ( - UUID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/015_RegionStore.sql b/OpenSim/Data/MSSQL/Resources/015_RegionStore.sql deleted file mode 100644 index cbaaf88bb9..0000000000 --- a/OpenSim/Data/MSSQL/Resources/015_RegionStore.sql +++ /dev/null @@ -1,45 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_primitems - ( - itemID uniqueidentifier NOT NULL, - primID uniqueidentifier NULL, - assetID uniqueidentifier NULL, - parentFolderID uniqueidentifier NULL, - invType int NULL, - assetType int NULL, - name varchar(255) NULL, - description varchar(255) NULL, - creationDate varchar(255) NULL, - creatorID uniqueidentifier NULL, - ownerID uniqueidentifier NULL, - lastOwnerID uniqueidentifier NULL, - groupID uniqueidentifier NULL, - nextPermissions int NULL, - currentPermissions int NULL, - basePermissions int NULL, - everyonePermissions int NULL, - groupPermissions int NULL, - flags int NOT NULL DEFAULT ((0)) - ) ON [PRIMARY] - -IF EXISTS(SELECT * FROM dbo.primitems) - EXEC('INSERT INTO dbo.Tmp_primitems (itemID, primID, assetID, parentFolderID, invType, assetType, name, description, creationDate, creatorID, ownerID, lastOwnerID, groupID, nextPermissions, currentPermissions, basePermissions, everyonePermissions, groupPermissions, flags) - SELECT CONVERT(uniqueidentifier, itemID), CONVERT(uniqueidentifier, primID), CONVERT(uniqueidentifier, assetID), CONVERT(uniqueidentifier, parentFolderID), invType, assetType, name, description, creationDate, CONVERT(uniqueidentifier, creatorID), CONVERT(uniqueidentifier, ownerID), CONVERT(uniqueidentifier, lastOwnerID), CONVERT(uniqueidentifier, groupID), nextPermissions, currentPermissions, basePermissions, everyonePermissions, groupPermissions, flags FROM dbo.primitems WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE dbo.primitems - -EXECUTE sp_rename N'dbo.Tmp_primitems', N'primitems', 'OBJECT' - -ALTER TABLE dbo.primitems ADD CONSTRAINT - PK__primitems__0A688BB1 PRIMARY KEY CLUSTERED - ( - itemID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -CREATE NONCLUSTERED INDEX primitems_primid ON dbo.primitems - ( - primID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/016_RegionStore.sql b/OpenSim/Data/MSSQL/Resources/016_RegionStore.sql deleted file mode 100644 index e91da19b12..0000000000 --- a/OpenSim/Data/MSSQL/Resources/016_RegionStore.sql +++ /dev/null @@ -1,19 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_terrain - ( - RegionUUID uniqueidentifier NULL, - Revision int NULL, - Heightfield image NULL - ) ON [PRIMARY] - TEXTIMAGE_ON [PRIMARY] - -IF EXISTS(SELECT * FROM dbo.terrain) - EXEC('INSERT INTO dbo.Tmp_terrain (RegionUUID, Revision, Heightfield) - SELECT CONVERT(uniqueidentifier, RegionUUID), Revision, Heightfield FROM dbo.terrain WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE dbo.terrain - -EXECUTE sp_rename N'dbo.Tmp_terrain', N'terrain', 'OBJECT' - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/017_RegionStore.sql b/OpenSim/Data/MSSQL/Resources/017_RegionStore.sql deleted file mode 100644 index 3d3dbc0ee7..0000000000 --- a/OpenSim/Data/MSSQL/Resources/017_RegionStore.sql +++ /dev/null @@ -1,56 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_land - ( - UUID uniqueidentifier NOT NULL, - RegionUUID uniqueidentifier NULL, - LocalLandID int NULL, - Bitmap image NULL, - Name varchar(255) NULL, - Description varchar(255) NULL, - OwnerUUID uniqueidentifier NULL, - IsGroupOwned int NULL, - Area int NULL, - AuctionID int NULL, - Category int NULL, - ClaimDate int NULL, - ClaimPrice int NULL, - GroupUUID uniqueidentifier NULL, - SalePrice int NULL, - LandStatus int NULL, - LandFlags int NULL, - LandingType int NULL, - MediaAutoScale int NULL, - MediaTextureUUID uniqueidentifier NULL, - MediaURL varchar(255) NULL, - MusicURL varchar(255) NULL, - PassHours float(53) NULL, - PassPrice int NULL, - SnapshotUUID uniqueidentifier NULL, - UserLocationX float(53) NULL, - UserLocationY float(53) NULL, - UserLocationZ float(53) NULL, - UserLookAtX float(53) NULL, - UserLookAtY float(53) NULL, - UserLookAtZ float(53) NULL, - AuthbuyerID uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'), - OtherCleanTime int NOT NULL DEFAULT ((0)), - Dwell int NOT NULL DEFAULT ((0)) - ) ON [PRIMARY] - TEXTIMAGE_ON [PRIMARY] - -IF EXISTS(SELECT * FROM dbo.land) - EXEC('INSERT INTO dbo.Tmp_land (UUID, RegionUUID, LocalLandID, Bitmap, Name, Description, OwnerUUID, IsGroupOwned, Area, AuctionID, Category, ClaimDate, ClaimPrice, GroupUUID, SalePrice, LandStatus, LandFlags, LandingType, MediaAutoScale, MediaTextureUUID, MediaURL, MusicURL, PassHours, PassPrice, SnapshotUUID, UserLocationX, UserLocationY, UserLocationZ, UserLookAtX, UserLookAtY, UserLookAtZ, AuthbuyerID, OtherCleanTime, Dwell) - SELECT CONVERT(uniqueidentifier, UUID), CONVERT(uniqueidentifier, RegionUUID), LocalLandID, Bitmap, Name, Description, CONVERT(uniqueidentifier, OwnerUUID), IsGroupOwned, Area, AuctionID, Category, ClaimDate, ClaimPrice, CONVERT(uniqueidentifier, GroupUUID), SalePrice, LandStatus, LandFlags, LandingType, MediaAutoScale, CONVERT(uniqueidentifier, MediaTextureUUID), MediaURL, MusicURL, PassHours, PassPrice, CONVERT(uniqueidentifier, SnapshotUUID), UserLocationX, UserLocationY, UserLocationZ, UserLookAtX, UserLookAtY, UserLookAtZ, CONVERT(uniqueidentifier, AuthbuyerID), OtherCleanTime, Dwell FROM dbo.land WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE dbo.land - -EXECUTE sp_rename N'dbo.Tmp_land', N'land', 'OBJECT' - -ALTER TABLE dbo.land ADD CONSTRAINT - PK__land__65A475E71BFD2C07 PRIMARY KEY CLUSTERED - ( - UUID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/018_RegionStore.sql b/OpenSim/Data/MSSQL/Resources/018_RegionStore.sql deleted file mode 100644 index 6157e3536e..0000000000 --- a/OpenSim/Data/MSSQL/Resources/018_RegionStore.sql +++ /dev/null @@ -1,18 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_landaccesslist - ( - LandUUID uniqueidentifier NULL, - AccessUUID uniqueidentifier NULL, - Flags int NULL - ) ON [PRIMARY] - -IF EXISTS(SELECT * FROM dbo.landaccesslist) - EXEC('INSERT INTO dbo.Tmp_landaccesslist (LandUUID, AccessUUID, Flags) - SELECT CONVERT(uniqueidentifier, LandUUID), CONVERT(uniqueidentifier, AccessUUID), Flags FROM dbo.landaccesslist WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE dbo.landaccesslist - -EXECUTE sp_rename N'dbo.Tmp_landaccesslist', N'landaccesslist', 'OBJECT' - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/019_RegionStore.sql b/OpenSim/Data/MSSQL/Resources/019_RegionStore.sql deleted file mode 100644 index 8e613b9d09..0000000000 --- a/OpenSim/Data/MSSQL/Resources/019_RegionStore.sql +++ /dev/null @@ -1,19 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_regionban - ( - regionUUID uniqueidentifier NOT NULL, - bannedUUID uniqueidentifier NOT NULL, - bannedIp varchar(16) NOT NULL, - bannedIpHostMask varchar(16) NOT NULL - ) ON [PRIMARY] - -IF EXISTS(SELECT * FROM dbo.regionban) - EXEC('INSERT INTO dbo.Tmp_regionban (regionUUID, bannedUUID, bannedIp, bannedIpHostMask) - SELECT CONVERT(uniqueidentifier, regionUUID), CONVERT(uniqueidentifier, bannedUUID), bannedIp, bannedIpHostMask FROM dbo.regionban WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE dbo.regionban - -EXECUTE sp_rename N'dbo.Tmp_regionban', N'regionban', 'OBJECT' - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/020_RegionStore.sql b/OpenSim/Data/MSSQL/Resources/020_RegionStore.sql deleted file mode 100644 index 2ce91f6dca..0000000000 --- a/OpenSim/Data/MSSQL/Resources/020_RegionStore.sql +++ /dev/null @@ -1,58 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_regionsettings - ( - regionUUID uniqueidentifier NOT NULL, - block_terraform bit NOT NULL, - block_fly bit NOT NULL, - allow_damage bit NOT NULL, - restrict_pushing bit NOT NULL, - allow_land_resell bit NOT NULL, - allow_land_join_divide bit NOT NULL, - block_show_in_search bit NOT NULL, - agent_limit int NOT NULL, - object_bonus float(53) NOT NULL, - maturity int NOT NULL, - disable_scripts bit NOT NULL, - disable_collisions bit NOT NULL, - disable_physics bit NOT NULL, - terrain_texture_1 uniqueidentifier NOT NULL, - terrain_texture_2 uniqueidentifier NOT NULL, - terrain_texture_3 uniqueidentifier NOT NULL, - terrain_texture_4 uniqueidentifier NOT NULL, - elevation_1_nw float(53) NOT NULL, - elevation_2_nw float(53) NOT NULL, - elevation_1_ne float(53) NOT NULL, - elevation_2_ne float(53) NOT NULL, - elevation_1_se float(53) NOT NULL, - elevation_2_se float(53) NOT NULL, - elevation_1_sw float(53) NOT NULL, - elevation_2_sw float(53) NOT NULL, - water_height float(53) NOT NULL, - terrain_raise_limit float(53) NOT NULL, - terrain_lower_limit float(53) NOT NULL, - use_estate_sun bit NOT NULL, - fixed_sun bit NOT NULL, - sun_position float(53) NOT NULL, - covenant uniqueidentifier NULL DEFAULT (NULL), - Sandbox bit NOT NULL, - sunvectorx float(53) NOT NULL DEFAULT ((0)), - sunvectory float(53) NOT NULL DEFAULT ((0)), - sunvectorz float(53) NOT NULL DEFAULT ((0)) - ) ON [PRIMARY] - -IF EXISTS(SELECT * FROM dbo.regionsettings) - EXEC('INSERT INTO dbo.Tmp_regionsettings (regionUUID, block_terraform, block_fly, allow_damage, restrict_pushing, allow_land_resell, allow_land_join_divide, block_show_in_search, agent_limit, object_bonus, maturity, disable_scripts, disable_collisions, disable_physics, terrain_texture_1, 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_sw, water_height, terrain_raise_limit, terrain_lower_limit, use_estate_sun, fixed_sun, sun_position, covenant, Sandbox, sunvectorx, sunvectory, sunvectorz) - SELECT CONVERT(uniqueidentifier, regionUUID), block_terraform, block_fly, allow_damage, restrict_pushing, allow_land_resell, allow_land_join_divide, block_show_in_search, agent_limit, object_bonus, maturity, disable_scripts, disable_collisions, disable_physics, CONVERT(uniqueidentifier, terrain_texture_1), CONVERT(uniqueidentifier, terrain_texture_2), CONVERT(uniqueidentifier, terrain_texture_3), CONVERT(uniqueidentifier, 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_sw, water_height, terrain_raise_limit, terrain_lower_limit, use_estate_sun, fixed_sun, sun_position, CONVERT(uniqueidentifier, covenant), Sandbox, sunvectorx, sunvectory, sunvectorz FROM dbo.regionsettings WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE dbo.regionsettings - -EXECUTE sp_rename N'dbo.Tmp_regionsettings', N'regionsettings', 'OBJECT' - -ALTER TABLE dbo.regionsettings ADD CONSTRAINT - PK__regionse__5B35159D21B6055D PRIMARY KEY CLUSTERED - ( - regionUUID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/021_RegionStore.sql b/OpenSim/Data/MSSQL/Resources/021_RegionStore.sql deleted file mode 100644 index ac59182abc..0000000000 --- a/OpenSim/Data/MSSQL/Resources/021_RegionStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN TRANSACTION - -ALTER TABLE prims ADD PassTouches bit not null default 0 - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/022_RegionStore.sql b/OpenSim/Data/MSSQL/Resources/022_RegionStore.sql deleted file mode 100644 index 421e8d3dc7..0000000000 --- a/OpenSim/Data/MSSQL/Resources/022_RegionStore.sql +++ /dev/null @@ -1,7 +0,0 @@ -BEGIN TRANSACTION - -ALTER TABLE regionsettings ADD loaded_creation_date varchar(20) -ALTER TABLE regionsettings ADD loaded_creation_time varchar(20) -ALTER TABLE regionsettings ADD loaded_creation_id varchar(64) - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/023_RegionStore.sql b/OpenSim/Data/MSSQL/Resources/023_RegionStore.sql deleted file mode 100644 index 75a16f3fb0..0000000000 --- a/OpenSim/Data/MSSQL/Resources/023_RegionStore.sql +++ /dev/null @@ -1,7 +0,0 @@ -BEGIN TRANSACTION - -ALTER TABLE regionsettings DROP COLUMN loaded_creation_date -ALTER TABLE regionsettings DROP COLUMN loaded_creation_time -ALTER TABLE regionsettings ADD loaded_creation_datetime int NOT NULL default 0 - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/AssetStore.migrations b/OpenSim/Data/MSSQL/Resources/AssetStore.migrations new file mode 100644 index 0000000000..beb82b9fc2 --- /dev/null +++ b/OpenSim/Data/MSSQL/Resources/AssetStore.migrations @@ -0,0 +1,100 @@ +:VERSION 1 + +CREATE TABLE [assets] ( + [id] [varchar](36) NOT NULL, + [name] [varchar](64) NOT NULL, + [description] [varchar](64) NOT NULL, + [assetType] [tinyint] NOT NULL, + [local] [tinyint] NOT NULL, + [temporary] [tinyint] NOT NULL, + [data] [image] NOT NULL, +PRIMARY KEY CLUSTERED +( + [id] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] + + +:VERSION 2 + +BEGIN TRANSACTION + +CREATE TABLE Tmp_assets + ( + id varchar(36) NOT NULL, + name varchar(64) NOT NULL, + description varchar(64) NOT NULL, + assetType tinyint NOT NULL, + local bit NOT NULL, + temporary bit NOT NULL, + data image NOT NULL + ) ON [PRIMARY] + TEXTIMAGE_ON [PRIMARY] + +IF EXISTS(SELECT * FROM assets) + EXEC('INSERT INTO Tmp_assets (id, name, description, assetType, local, temporary, data) + SELECT id, name, description, assetType, CONVERT(bit, local), CONVERT(bit, temporary), data FROM assets WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE assets + +EXECUTE sp_rename N'Tmp_assets', N'assets', 'OBJECT' + +ALTER TABLE dbo.assets ADD CONSTRAINT + PK__assets__id PRIMARY KEY CLUSTERED + ( + id + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + +:VERSION 3 + +BEGIN TRANSACTION + +ALTER TABLE assets add create_time integer default 0 +ALTER TABLE assets add access_time integer default 0 + +COMMIT + + +:VERSION 4 + +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_assets + ( + id uniqueidentifier NOT NULL, + name varchar(64) NOT NULL, + description varchar(64) NOT NULL, + assetType tinyint NOT NULL, + local bit NOT NULL, + temporary bit NOT NULL, + data image NOT NULL, + create_time int NULL, + access_time int NULL + ) ON [PRIMARY] + TEXTIMAGE_ON [PRIMARY] + +IF EXISTS(SELECT * FROM dbo.assets) + EXEC('INSERT INTO dbo.Tmp_assets (id, name, description, assetType, local, temporary, data, create_time, access_time) + SELECT CONVERT(uniqueidentifier, id), name, description, assetType, local, temporary, data, create_time, access_time FROM dbo.assets WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE assets + +EXECUTE sp_rename N'Tmp_assets', N'assets', 'OBJECT' + +ALTER TABLE dbo.assets ADD CONSTRAINT + PK__assets__id PRIMARY KEY CLUSTERED + ( + id + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + +:VERSION 5 + +DELETE FROM assets WHERE id = 'dc4b9f0b-d008-45c6-96a4-01dd947ac621'; + + diff --git a/OpenSim/Data/MSSQL/Resources/001_AuthStore.sql b/OpenSim/Data/MSSQL/Resources/AuthStore.migrations similarity index 63% rename from OpenSim/Data/MSSQL/Resources/001_AuthStore.sql rename to OpenSim/Data/MSSQL/Resources/AuthStore.migrations index c70a19319b..5b90ca3d36 100644 --- a/OpenSim/Data/MSSQL/Resources/001_AuthStore.sql +++ b/OpenSim/Data/MSSQL/Resources/AuthStore.migrations @@ -1,3 +1,5 @@ +:VERSION 1 + BEGIN TRANSACTION CREATE TABLE [auth] ( @@ -14,4 +16,13 @@ CREATE TABLE [tokens] ( [validity] [datetime] NOT NULL ) ON [PRIMARY] +COMMIT + +:VERSION 2 + +BEGIN TRANSACTION + +INSERT INTO auth (UUID, passwordHash, passwordSalt, webLoginKey, accountType) SELECT [UUID] AS UUID, [passwordHash] AS passwordHash, [passwordSalt] AS passwordSalt, [webLoginKey] AS webLoginKey, 'UserAccount' as [accountType] FROM users; + + COMMIT \ No newline at end of file diff --git a/OpenSim/Data/MSSQL/Resources/001_Avatar.sql b/OpenSim/Data/MSSQL/Resources/Avatar.migrations similarity index 94% rename from OpenSim/Data/MSSQL/Resources/001_Avatar.sql rename to OpenSim/Data/MSSQL/Resources/Avatar.migrations index 48f4c00669..759e939caf 100644 --- a/OpenSim/Data/MSSQL/Resources/001_Avatar.sql +++ b/OpenSim/Data/MSSQL/Resources/Avatar.migrations @@ -1,3 +1,5 @@ +:VERSION 1 + BEGIN TRANSACTION CREATE TABLE [Avatars] ( diff --git a/OpenSim/Data/MSSQL/Resources/EstateStore.migrations b/OpenSim/Data/MSSQL/Resources/EstateStore.migrations new file mode 100644 index 0000000000..64b2d2bdb2 --- /dev/null +++ b/OpenSim/Data/MSSQL/Resources/EstateStore.migrations @@ -0,0 +1,334 @@ +:VERSION 1 + +BEGIN TRANSACTION + +CREATE TABLE [dbo].[estate_managers]( + [EstateID] [int] NOT NULL, + [uuid] [varchar](36) NOT NULL, + CONSTRAINT [PK_estate_managers] PRIMARY KEY CLUSTERED +( + [EstateID] ASC +)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] +) ON [PRIMARY]; + +CREATE TABLE [dbo].[estate_groups]( + [EstateID] [int] NOT NULL, + [uuid] [varchar](36) NOT NULL, + CONSTRAINT [PK_estate_groups] PRIMARY KEY CLUSTERED +( + [EstateID] ASC +)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] +) ON [PRIMARY]; + + +CREATE TABLE [dbo].[estate_users]( + [EstateID] [int] NOT NULL, + [uuid] [varchar](36) NOT NULL, + CONSTRAINT [PK_estate_users] PRIMARY KEY CLUSTERED +( + [EstateID] ASC +)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] +) ON [PRIMARY]; + + +CREATE TABLE [dbo].[estateban]( + [EstateID] [int] NOT NULL, + [bannedUUID] [varchar](36) NOT NULL, + [bannedIp] [varchar](16) NOT NULL, + [bannedIpHostMask] [varchar](16) NOT NULL, + [bannedNameMask] [varchar](64) NULL DEFAULT (NULL), + CONSTRAINT [PK_estateban] PRIMARY KEY CLUSTERED +( + [EstateID] ASC +)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] +) ON [PRIMARY]; + +CREATE TABLE [dbo].[estate_settings]( + [EstateID] [int] IDENTITY(1,100) NOT NULL, + [EstateName] [varchar](64) NULL DEFAULT (NULL), + [AbuseEmailToEstateOwner] [bit] NOT NULL, + [DenyAnonymous] [bit] NOT NULL, + [ResetHomeOnTeleport] [bit] NOT NULL, + [FixedSun] [bit] NOT NULL, + [DenyTransacted] [bit] NOT NULL, + [BlockDwell] [bit] NOT NULL, + [DenyIdentified] [bit] NOT NULL, + [AllowVoice] [bit] NOT NULL, + [UseGlobalTime] [bit] NOT NULL, + [PricePerMeter] [int] NOT NULL, + [TaxFree] [bit] NOT NULL, + [AllowDirectTeleport] [bit] NOT NULL, + [RedirectGridX] [int] NOT NULL, + [RedirectGridY] [int] NOT NULL, + [ParentEstateID] [int] NOT NULL, + [SunPosition] [float] NOT NULL, + [EstateSkipScripts] [bit] NOT NULL, + [BillableFactor] [float] NOT NULL, + [PublicAccess] [bit] NOT NULL, + [AbuseEmail] [varchar](255) NOT NULL, + [EstateOwner] [varchar](36) NOT NULL, + [DenyMinors] [bit] NOT NULL, + CONSTRAINT [PK_estate_settings] PRIMARY KEY CLUSTERED +( + [EstateID] ASC +)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] +) ON [PRIMARY]; + + +CREATE TABLE [dbo].[estate_map]( + [RegionID] [varchar](36) NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'), + [EstateID] [int] NOT NULL, + CONSTRAINT [PK_estate_map] PRIMARY KEY CLUSTERED +( + [RegionID] ASC +)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] +) ON [PRIMARY]; + +COMMIT + +:VERSION 2 + +BEGIN TRANSACTION + +ALTER TABLE dbo.estate_managers DROP CONSTRAINT PK_estate_managers + +CREATE NONCLUSTERED INDEX IX_estate_managers ON dbo.estate_managers + ( + EstateID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +ALTER TABLE dbo.estate_groups DROP CONSTRAINT PK_estate_groups + +CREATE NONCLUSTERED INDEX IX_estate_groups ON dbo.estate_groups + ( + EstateID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + + +ALTER TABLE dbo.estate_users DROP CONSTRAINT PK_estate_users + +CREATE NONCLUSTERED INDEX IX_estate_users ON dbo.estate_users + ( + EstateID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + +:VERSION 3 + +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_estateban + ( + EstateID int NOT NULL, + bannedUUID varchar(36) NOT NULL, + bannedIp varchar(16) NULL, + bannedIpHostMask varchar(16) NULL, + bannedNameMask varchar(64) NULL + ) ON [PRIMARY] + +IF EXISTS(SELECT * FROM dbo.estateban) + EXEC('INSERT INTO dbo.Tmp_estateban (EstateID, bannedUUID, bannedIp, bannedIpHostMask, bannedNameMask) + SELECT EstateID, bannedUUID, bannedIp, bannedIpHostMask, bannedNameMask FROM dbo.estateban') + +DROP TABLE dbo.estateban + +EXECUTE sp_rename N'dbo.Tmp_estateban', N'estateban', 'OBJECT' + +CREATE NONCLUSTERED INDEX IX_estateban ON dbo.estateban + ( + EstateID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + +:VERSION 4 + +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_estate_managers + ( + EstateID int NOT NULL, + uuid uniqueidentifier NOT NULL + ) ON [PRIMARY] + +IF EXISTS(SELECT * FROM dbo.estate_managers) + EXEC('INSERT INTO dbo.Tmp_estate_managers (EstateID, uuid) + SELECT EstateID, CONVERT(uniqueidentifier, uuid) FROM dbo.estate_managers WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE dbo.estate_managers + +EXECUTE sp_rename N'dbo.Tmp_estate_managers', N'estate_managers', 'OBJECT' + +CREATE NONCLUSTERED INDEX IX_estate_managers ON dbo.estate_managers + ( + EstateID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + +:VERSION 5 + +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_estate_groups + ( + EstateID int NOT NULL, + uuid uniqueidentifier NOT NULL + ) ON [PRIMARY] + +IF EXISTS(SELECT * FROM dbo.estate_groups) + EXEC('INSERT INTO dbo.Tmp_estate_groups (EstateID, uuid) + SELECT EstateID, CONVERT(uniqueidentifier, uuid) FROM dbo.estate_groups WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE dbo.estate_groups + +EXECUTE sp_rename N'dbo.Tmp_estate_groups', N'estate_groups', 'OBJECT' + +CREATE NONCLUSTERED INDEX IX_estate_groups ON dbo.estate_groups + ( + EstateID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + +:VERSION 6 + +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_estate_users + ( + EstateID int NOT NULL, + uuid uniqueidentifier NOT NULL + ) ON [PRIMARY] + +IF EXISTS(SELECT * FROM dbo.estate_users) + EXEC('INSERT INTO dbo.Tmp_estate_users (EstateID, uuid) + SELECT EstateID, CONVERT(uniqueidentifier, uuid) FROM dbo.estate_users WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE dbo.estate_users + +EXECUTE sp_rename N'dbo.Tmp_estate_users', N'estate_users', 'OBJECT' + +CREATE NONCLUSTERED INDEX IX_estate_users ON dbo.estate_users + ( + EstateID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + +:VERSION 7 + +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_estateban + ( + EstateID int NOT NULL, + bannedUUID uniqueidentifier NOT NULL, + bannedIp varchar(16) NULL, + bannedIpHostMask varchar(16) NULL, + bannedNameMask varchar(64) NULL + ) ON [PRIMARY] + +IF EXISTS(SELECT * FROM dbo.estateban) + EXEC('INSERT INTO dbo.Tmp_estateban (EstateID, bannedUUID, bannedIp, bannedIpHostMask, bannedNameMask) + SELECT EstateID, CONVERT(uniqueidentifier, bannedUUID), bannedIp, bannedIpHostMask, bannedNameMask FROM dbo.estateban WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE dbo.estateban + +EXECUTE sp_rename N'dbo.Tmp_estateban', N'estateban', 'OBJECT' + +CREATE NONCLUSTERED INDEX IX_estateban ON dbo.estateban + ( + EstateID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + +:VERSION 8 + +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_estate_settings + ( + EstateID int NOT NULL IDENTITY (1, 100), + EstateName varchar(64) NULL DEFAULT (NULL), + AbuseEmailToEstateOwner bit NOT NULL, + DenyAnonymous bit NOT NULL, + ResetHomeOnTeleport bit NOT NULL, + FixedSun bit NOT NULL, + DenyTransacted bit NOT NULL, + BlockDwell bit NOT NULL, + DenyIdentified bit NOT NULL, + AllowVoice bit NOT NULL, + UseGlobalTime bit NOT NULL, + PricePerMeter int NOT NULL, + TaxFree bit NOT NULL, + AllowDirectTeleport bit NOT NULL, + RedirectGridX int NOT NULL, + RedirectGridY int NOT NULL, + ParentEstateID int NOT NULL, + SunPosition float(53) NOT NULL, + EstateSkipScripts bit NOT NULL, + BillableFactor float(53) NOT NULL, + PublicAccess bit NOT NULL, + AbuseEmail varchar(255) NOT NULL, + EstateOwner uniqueidentifier NOT NULL, + DenyMinors bit NOT NULL + ) ON [PRIMARY] + +SET IDENTITY_INSERT dbo.Tmp_estate_settings ON + +IF EXISTS(SELECT * FROM dbo.estate_settings) + EXEC('INSERT INTO dbo.Tmp_estate_settings (EstateID, EstateName, AbuseEmailToEstateOwner, DenyAnonymous, ResetHomeOnTeleport, FixedSun, DenyTransacted, BlockDwell, DenyIdentified, AllowVoice, UseGlobalTime, PricePerMeter, TaxFree, AllowDirectTeleport, RedirectGridX, RedirectGridY, ParentEstateID, SunPosition, EstateSkipScripts, BillableFactor, PublicAccess, AbuseEmail, EstateOwner, DenyMinors) + SELECT EstateID, EstateName, AbuseEmailToEstateOwner, DenyAnonymous, ResetHomeOnTeleport, FixedSun, DenyTransacted, BlockDwell, DenyIdentified, AllowVoice, UseGlobalTime, PricePerMeter, TaxFree, AllowDirectTeleport, RedirectGridX, RedirectGridY, ParentEstateID, SunPosition, EstateSkipScripts, BillableFactor, PublicAccess, AbuseEmail, CONVERT(uniqueidentifier, EstateOwner), DenyMinors FROM dbo.estate_settings WITH (HOLDLOCK TABLOCKX)') + +SET IDENTITY_INSERT dbo.Tmp_estate_settings OFF + +DROP TABLE dbo.estate_settings + +EXECUTE sp_rename N'dbo.Tmp_estate_settings', N'estate_settings', 'OBJECT' + +ALTER TABLE dbo.estate_settings ADD CONSTRAINT + PK_estate_settings PRIMARY KEY CLUSTERED + ( + EstateID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + +:VERSION 9 + +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_estate_map + ( + RegionID uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'), + EstateID int NOT NULL + ) ON [PRIMARY] + +IF EXISTS(SELECT * FROM dbo.estate_map) + EXEC('INSERT INTO dbo.Tmp_estate_map (RegionID, EstateID) + SELECT CONVERT(uniqueidentifier, RegionID), EstateID FROM dbo.estate_map WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE dbo.estate_map + +EXECUTE sp_rename N'dbo.Tmp_estate_map', N'estate_map', 'OBJECT' + +ALTER TABLE dbo.estate_map ADD CONSTRAINT + PK_estate_map PRIMARY KEY CLUSTERED + ( + RegionID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + + +COMMIT + + diff --git a/OpenSim/Data/MSSQL/Resources/001_FriendsStore.sql b/OpenSim/Data/MSSQL/Resources/FriendsStore.migrations similarity index 54% rename from OpenSim/Data/MSSQL/Resources/001_FriendsStore.sql rename to OpenSim/Data/MSSQL/Resources/FriendsStore.migrations index 94d240b512..f981a91999 100644 --- a/OpenSim/Data/MSSQL/Resources/001_FriendsStore.sql +++ b/OpenSim/Data/MSSQL/Resources/FriendsStore.migrations @@ -1,3 +1,5 @@ +:VERSION 1 + BEGIN TRANSACTION CREATE TABLE [Friends] ( @@ -7,5 +9,12 @@ CREATE TABLE [Friends] ( [Offered] varchar(32) NOT NULL DEFAULT 0) ON [PRIMARY] +COMMIT + +:VERSION 2 + +BEGIN TRANSACTION + +INSERT INTO Friends (PrincipalID, Friend, Flags, Offered) SELECT [ownerID], [friendID], [friendPerms], 0 FROM userfriends; COMMIT \ No newline at end of file diff --git a/OpenSim/Data/MSSQL/Resources/GridStore.migrations b/OpenSim/Data/MSSQL/Resources/GridStore.migrations new file mode 100644 index 0000000000..d2ca27a071 --- /dev/null +++ b/OpenSim/Data/MSSQL/Resources/GridStore.migrations @@ -0,0 +1,225 @@ +:VERSION 1 + +BEGIN TRANSACTION + +CREATE TABLE [dbo].[regions]( + [regionHandle] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [regionName] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [uuid] [varchar](255) COLLATE Latin1_General_CI_AS NOT NULL, + [regionRecvKey] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [regionSecret] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [regionSendKey] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [regionDataURI] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [serverIP] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [serverPort] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [serverURI] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [locX] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [locY] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [locZ] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [eastOverrideHandle] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [westOverrideHandle] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [southOverrideHandle] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [northOverrideHandle] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [regionAssetURI] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [regionAssetRecvKey] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [regionAssetSendKey] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [regionUserURI] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [regionUserRecvKey] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [regionUserSendKey] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [regionMapTexture] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [serverHttpPort] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [serverRemotingPort] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [owner_uuid] [varchar](36) COLLATE Latin1_General_CI_AS NULL, +PRIMARY KEY CLUSTERED +( + [uuid] ASC +)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] +) ON [PRIMARY] + +COMMIT + + +:VERSION 2 + +BEGIN TRANSACTION + +CREATE TABLE Tmp_regions + ( + uuid varchar(36) COLLATE Latin1_General_CI_AS NOT NULL, + regionHandle bigint NULL, + regionName varchar(20) NULL, + regionRecvKey varchar(128) NULL, + regionSendKey varchar(128) NULL, + regionSecret varchar(128) NULL, + regionDataURI varchar(128) NULL, + serverIP varchar(64) NULL, + serverPort int NULL, + serverURI varchar(255) NULL, + locX int NULL, + locY int NULL, + locZ int NULL, + eastOverrideHandle bigint NULL, + westOverrideHandle bigint NULL, + southOverrideHandle bigint NULL, + northOverrideHandle bigint NULL, + regionAssetURI varchar(255) NULL, + regionAssetRecvKey varchar(128) NULL, + regionAssetSendKey varchar(128) NULL, + regionUserURI varchar(255) NULL, + regionUserRecvKey varchar(128) NULL, + regionUserSendKey varchar(128) NULL, + regionMapTexture varchar(36) NULL, + serverHttpPort int NULL, + serverRemotingPort int NULL, + owner_uuid varchar(36) NULL, + originUUID varchar(36) NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000') + ) ON [PRIMARY] + +IF EXISTS(SELECT * FROM regions) + EXEC('INSERT INTO Tmp_regions (uuid, regionHandle, regionName, regionRecvKey, regionSendKey, regionSecret, regionDataURI, serverIP, serverPort, serverURI, locX, locY, locZ, eastOverrideHandle, westOverrideHandle, southOverrideHandle, northOverrideHandle, regionAssetURI, regionAssetRecvKey, regionAssetSendKey, regionUserURI, regionUserRecvKey, regionUserSendKey, regionMapTexture, serverHttpPort, serverRemotingPort, owner_uuid) + SELECT CONVERT(varchar(36), uuid), CONVERT(bigint, regionHandle), CONVERT(varchar(20), regionName), CONVERT(varchar(128), regionRecvKey), CONVERT(varchar(128), regionSendKey), CONVERT(varchar(128), regionSecret), CONVERT(varchar(128), regionDataURI), CONVERT(varchar(64), serverIP), CONVERT(int, serverPort), serverURI, CONVERT(int, locX), CONVERT(int, locY), CONVERT(int, locZ), CONVERT(bigint, eastOverrideHandle), CONVERT(bigint, westOverrideHandle), CONVERT(bigint, southOverrideHandle), CONVERT(bigint, northOverrideHandle), regionAssetURI, CONVERT(varchar(128), regionAssetRecvKey), CONVERT(varchar(128), regionAssetSendKey), regionUserURI, CONVERT(varchar(128), regionUserRecvKey), CONVERT(varchar(128), regionUserSendKey), CONVERT(varchar(36), regionMapTexture), CONVERT(int, serverHttpPort), CONVERT(int, serverRemotingPort), owner_uuid FROM regions') + +DROP TABLE regions + +EXECUTE sp_rename N'Tmp_regions', N'regions', 'OBJECT' + +ALTER TABLE regions ADD CONSTRAINT + PK__regions__uuid PRIMARY KEY CLUSTERED + ( + uuid + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + +:VERSION 3 + +BEGIN TRANSACTION + +CREATE NONCLUSTERED INDEX IX_regions_name ON dbo.regions + ( + regionName + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +CREATE NONCLUSTERED INDEX IX_regions_handle ON dbo.regions + ( + regionHandle + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + + +CREATE NONCLUSTERED INDEX IX_regions_override ON dbo.regions + ( + eastOverrideHandle, + westOverrideHandle, + southOverrideHandle, + northOverrideHandle + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + +:VERSION 4 + +/* To prevent any potential data loss issues, you should review this script in detail before running it outside the context of the database designer.*/ +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_regions + ( + uuid uniqueidentifier NOT NULL, + regionHandle bigint NULL, + regionName varchar(20) NULL, + regionRecvKey varchar(128) NULL, + regionSendKey varchar(128) NULL, + regionSecret varchar(128) NULL, + regionDataURI varchar(128) NULL, + serverIP varchar(64) NULL, + serverPort int NULL, + serverURI varchar(255) NULL, + locX int NULL, + locY int NULL, + locZ int NULL, + eastOverrideHandle bigint NULL, + westOverrideHandle bigint NULL, + southOverrideHandle bigint NULL, + northOverrideHandle bigint NULL, + regionAssetURI varchar(255) NULL, + regionAssetRecvKey varchar(128) NULL, + regionAssetSendKey varchar(128) NULL, + regionUserURI varchar(255) NULL, + regionUserRecvKey varchar(128) NULL, + regionUserSendKey varchar(128) NULL, + regionMapTexture uniqueidentifier NULL, + serverHttpPort int NULL, + serverRemotingPort int NULL, + owner_uuid uniqueidentifier NOT NULL, + originUUID uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000') + ) ON [PRIMARY] + +IF EXISTS(SELECT * FROM dbo.regions) + EXEC('INSERT INTO dbo.Tmp_regions (uuid, regionHandle, regionName, regionRecvKey, regionSendKey, regionSecret, regionDataURI, serverIP, serverPort, serverURI, locX, locY, locZ, eastOverrideHandle, westOverrideHandle, southOverrideHandle, northOverrideHandle, regionAssetURI, regionAssetRecvKey, regionAssetSendKey, regionUserURI, regionUserRecvKey, regionUserSendKey, regionMapTexture, serverHttpPort, serverRemotingPort, owner_uuid, originUUID) + SELECT CONVERT(uniqueidentifier, uuid), regionHandle, regionName, regionRecvKey, regionSendKey, regionSecret, regionDataURI, serverIP, serverPort, serverURI, locX, locY, locZ, eastOverrideHandle, westOverrideHandle, southOverrideHandle, northOverrideHandle, regionAssetURI, regionAssetRecvKey, regionAssetSendKey, regionUserURI, regionUserRecvKey, regionUserSendKey, CONVERT(uniqueidentifier, regionMapTexture), serverHttpPort, serverRemotingPort, CONVERT(uniqueidentifier, owner_uuid), CONVERT(uniqueidentifier, originUUID) FROM dbo.regions WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE dbo.regions + +EXECUTE sp_rename N'dbo.Tmp_regions', N'regions', 'OBJECT' + +ALTER TABLE dbo.regions ADD CONSTRAINT + PK__regions__uuid PRIMARY KEY CLUSTERED + ( + uuid + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +CREATE NONCLUSTERED INDEX IX_regions_name ON dbo.regions + ( + regionName + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +CREATE NONCLUSTERED INDEX IX_regions_handle ON dbo.regions + ( + regionHandle + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +CREATE NONCLUSTERED INDEX IX_regions_override ON dbo.regions + ( + eastOverrideHandle, + westOverrideHandle, + southOverrideHandle, + northOverrideHandle + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + +:VERSION 5 + +BEGIN TRANSACTION + +ALTER TABLE regions ADD access int default 0; + +COMMIT + + +:VERSION 6 + +BEGIN TRANSACTION + +ALTER TABLE regions ADD scopeid uniqueidentifier default '00000000-0000-0000-0000-000000000000'; +ALTER TABLE regions ADD DEFAULT ('00000000-0000-0000-0000-000000000000') FOR [owner_uuid]; +ALTER TABLE regions ADD sizeX integer not null default 0; +ALTER TABLE regions ADD sizeY integer not null default 0; + +COMMIT + + +:VERSION 7 + +BEGIN TRANSACTION + +ALTER TABLE regions ADD [flags] integer NOT NULL DEFAULT 0; +CREATE INDEX [flags] ON regions(flags); +ALTER TABLE [regions] ADD [last_seen] integer NOT NULL DEFAULT 0; +ALTER TABLE [regions] ADD [PrincipalID] uniqueidentifier NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000'; +ALTER TABLE [regions] ADD [Token] varchar(255) NOT NULL DEFAULT 0; + +COMMIT + + diff --git a/OpenSim/Data/MSSQL/Resources/InventoryStore.migrations b/OpenSim/Data/MSSQL/Resources/InventoryStore.migrations new file mode 100644 index 0000000000..cd5dfdc1ca --- /dev/null +++ b/OpenSim/Data/MSSQL/Resources/InventoryStore.migrations @@ -0,0 +1,174 @@ +:VERSION 1 + +BEGIN TRANSACTION + +CREATE TABLE [inventoryfolders] ( + [folderID] [varchar](36) NOT NULL default '', + [agentID] [varchar](36) default NULL, + [parentFolderID] [varchar](36) default NULL, + [folderName] [varchar](64) default NULL, + [type] [smallint] NOT NULL default 0, + [version] [int] NOT NULL default 0, + PRIMARY KEY CLUSTERED +( + [folderID] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] + +CREATE NONCLUSTERED INDEX [owner] ON [inventoryfolders] +( + [agentID] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +CREATE NONCLUSTERED INDEX [parent] ON [inventoryfolders] +( + [parentFolderID] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + + +CREATE TABLE [inventoryitems] ( + [inventoryID] [varchar](36) NOT NULL default '', + [assetID] [varchar](36) default NULL, + [assetType] [int] default NULL, + [parentFolderID] [varchar](36) default NULL, + [avatarID] [varchar](36) default NULL, + [inventoryName] [varchar](64) default NULL, + [inventoryDescription] [varchar](128) default NULL, + [inventoryNextPermissions] [int] default NULL, + [inventoryCurrentPermissions] [int] default NULL, + [invType] [int] default NULL, + [creatorID] [varchar](36) default NULL, + [inventoryBasePermissions] [int] NOT NULL default 0, + [inventoryEveryOnePermissions] [int] NOT NULL default 0, + [salePrice] [int] default NULL, + [saleType] [tinyint] default NULL, + [creationDate] [int] default NULL, + [groupID] [varchar](36) default NULL, + [groupOwned] [bit] default NULL, + [flags] [int] default NULL, + PRIMARY KEY CLUSTERED +( + [inventoryID] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] + + +CREATE NONCLUSTERED INDEX [owner] ON [inventoryitems] +( + [avatarID] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +CREATE NONCLUSTERED INDEX [folder] ON [inventoryitems] +( + [parentFolderID] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + +:VERSION 2 + +BEGIN TRANSACTION + +ALTER TABLE inventoryitems ADD inventoryGroupPermissions INTEGER NOT NULL default 0 + +COMMIT + +:VERSION 3 + +/* To prevent any potential data loss issues, you should review this script in detail before running it outside the context of the database designer.*/ +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_inventoryfolders + ( + folderID uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'), + agentID uniqueidentifier NULL DEFAULT (NULL), + parentFolderID uniqueidentifier NULL DEFAULT (NULL), + folderName varchar(64) NULL DEFAULT (NULL), + type smallint NOT NULL DEFAULT ((0)), + version int NOT NULL DEFAULT ((0)) + ) ON [PRIMARY] + +IF EXISTS(SELECT * FROM dbo.inventoryfolders) + EXEC('INSERT INTO dbo.Tmp_inventoryfolders (folderID, agentID, parentFolderID, folderName, type, version) + SELECT CONVERT(uniqueidentifier, folderID), CONVERT(uniqueidentifier, agentID), CONVERT(uniqueidentifier, parentFolderID), folderName, type, version FROM dbo.inventoryfolders WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE dbo.inventoryfolders + +EXECUTE sp_rename N'dbo.Tmp_inventoryfolders', N'inventoryfolders', 'OBJECT' + +ALTER TABLE dbo.inventoryfolders ADD CONSTRAINT + PK__inventor__C2FABFB3173876EA PRIMARY KEY CLUSTERED + ( + folderID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +CREATE NONCLUSTERED INDEX owner ON dbo.inventoryfolders + ( + agentID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +CREATE NONCLUSTERED INDEX parent ON dbo.inventoryfolders + ( + parentFolderID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + +:VERSION 4 + +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_inventoryitems + ( + inventoryID uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'), + assetID uniqueidentifier NULL DEFAULT (NULL), + assetType int NULL DEFAULT (NULL), + parentFolderID uniqueidentifier NULL DEFAULT (NULL), + avatarID uniqueidentifier NULL DEFAULT (NULL), + inventoryName varchar(64) NULL DEFAULT (NULL), + inventoryDescription varchar(128) NULL DEFAULT (NULL), + inventoryNextPermissions int NULL DEFAULT (NULL), + inventoryCurrentPermissions int NULL DEFAULT (NULL), + invType int NULL DEFAULT (NULL), + creatorID uniqueidentifier NULL DEFAULT (NULL), + inventoryBasePermissions int NOT NULL DEFAULT ((0)), + inventoryEveryOnePermissions int NOT NULL DEFAULT ((0)), + salePrice int NULL DEFAULT (NULL), + saleType tinyint NULL DEFAULT (NULL), + creationDate int NULL DEFAULT (NULL), + groupID uniqueidentifier NULL DEFAULT (NULL), + groupOwned bit NULL DEFAULT (NULL), + flags int NULL DEFAULT (NULL), + inventoryGroupPermissions int NOT NULL DEFAULT ((0)) + ) ON [PRIMARY] + +IF EXISTS(SELECT * FROM dbo.inventoryitems) + EXEC('INSERT INTO dbo.Tmp_inventoryitems (inventoryID, assetID, assetType, parentFolderID, avatarID, inventoryName, inventoryDescription, inventoryNextPermissions, inventoryCurrentPermissions, invType, creatorID, inventoryBasePermissions, inventoryEveryOnePermissions, salePrice, saleType, creationDate, groupID, groupOwned, flags, inventoryGroupPermissions) + SELECT CONVERT(uniqueidentifier, inventoryID), CONVERT(uniqueidentifier, assetID), assetType, CONVERT(uniqueidentifier, parentFolderID), CONVERT(uniqueidentifier, avatarID), inventoryName, inventoryDescription, inventoryNextPermissions, inventoryCurrentPermissions, invType, CONVERT(uniqueidentifier, creatorID), inventoryBasePermissions, inventoryEveryOnePermissions, salePrice, saleType, creationDate, CONVERT(uniqueidentifier, groupID), groupOwned, flags, inventoryGroupPermissions FROM dbo.inventoryitems WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE dbo.inventoryitems + +EXECUTE sp_rename N'dbo.Tmp_inventoryitems', N'inventoryitems', 'OBJECT' + +ALTER TABLE dbo.inventoryitems ADD CONSTRAINT + PK__inventor__C4B7BC2220C1E124 PRIMARY KEY CLUSTERED + ( + inventoryID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + + +CREATE NONCLUSTERED INDEX owner ON dbo.inventoryitems + ( + avatarID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +CREATE NONCLUSTERED INDEX folder ON dbo.inventoryitems + ( + parentFolderID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + diff --git a/OpenSim/Data/MSSQL/Resources/001_LogStore.sql b/OpenSim/Data/MSSQL/Resources/LogStore.migrations similarity index 96% rename from OpenSim/Data/MSSQL/Resources/001_LogStore.sql rename to OpenSim/Data/MSSQL/Resources/LogStore.migrations index 9ece6274dd..1430d8d0ee 100644 --- a/OpenSim/Data/MSSQL/Resources/001_LogStore.sql +++ b/OpenSim/Data/MSSQL/Resources/LogStore.migrations @@ -1,3 +1,5 @@ +:VERSION 1 + BEGIN TRANSACTION CREATE TABLE [logs] ( diff --git a/OpenSim/Data/MSSQL/Resources/001_Presence.sql b/OpenSim/Data/MSSQL/Resources/Presence.migrations similarity index 81% rename from OpenSim/Data/MSSQL/Resources/001_Presence.sql rename to OpenSim/Data/MSSQL/Resources/Presence.migrations index 877881c859..35f78e1f52 100644 --- a/OpenSim/Data/MSSQL/Resources/001_Presence.sql +++ b/OpenSim/Data/MSSQL/Resources/Presence.migrations @@ -1,3 +1,5 @@ +:VERSION 1 + BEGIN TRANSACTION CREATE TABLE [Presence] ( @@ -16,4 +18,13 @@ CREATE TABLE [Presence] ( ) ON [PRIMARY] +COMMIT + +:VERSION 2 + +BEGIN TRANSACTION + +CREATE UNIQUE INDEX SessionID ON Presence(SessionID); +CREATE INDEX UserID ON Presence(UserID); + COMMIT \ No newline at end of file diff --git a/OpenSim/Data/MSSQL/Resources/RegionStore.migrations b/OpenSim/Data/MSSQL/Resources/RegionStore.migrations new file mode 100644 index 0000000000..e912d646a0 --- /dev/null +++ b/OpenSim/Data/MSSQL/Resources/RegionStore.migrations @@ -0,0 +1,929 @@ + +:VERSION 1 + +CREATE TABLE [dbo].[prims]( + [UUID] [varchar](255) NOT NULL, + [RegionUUID] [varchar](255) NULL, + [ParentID] [int] NULL, + [CreationDate] [int] NULL, + [Name] [varchar](255) NULL, + [SceneGroupID] [varchar](255) NULL, + [Text] [varchar](255) NULL, + [Description] [varchar](255) NULL, + [SitName] [varchar](255) NULL, + [TouchName] [varchar](255) NULL, + [ObjectFlags] [int] NULL, + [CreatorID] [varchar](255) NULL, + [OwnerID] [varchar](255) NULL, + [GroupID] [varchar](255) NULL, + [LastOwnerID] [varchar](255) NULL, + [OwnerMask] [int] NULL, + [NextOwnerMask] [int] NULL, + [GroupMask] [int] NULL, + [EveryoneMask] [int] NULL, + [BaseMask] [int] NULL, + [PositionX] [float] NULL, + [PositionY] [float] NULL, + [PositionZ] [float] NULL, + [GroupPositionX] [float] NULL, + [GroupPositionY] [float] NULL, + [GroupPositionZ] [float] NULL, + [VelocityX] [float] NULL, + [VelocityY] [float] NULL, + [VelocityZ] [float] NULL, + [AngularVelocityX] [float] NULL, + [AngularVelocityY] [float] NULL, + [AngularVelocityZ] [float] NULL, + [AccelerationX] [float] NULL, + [AccelerationY] [float] NULL, + [AccelerationZ] [float] NULL, + [RotationX] [float] NULL, + [RotationY] [float] NULL, + [RotationZ] [float] NULL, + [RotationW] [float] NULL, + [SitTargetOffsetX] [float] NULL, + [SitTargetOffsetY] [float] NULL, + [SitTargetOffsetZ] [float] NULL, + [SitTargetOrientW] [float] NULL, + [SitTargetOrientX] [float] NULL, + [SitTargetOrientY] [float] NULL, + [SitTargetOrientZ] [float] NULL, +PRIMARY KEY CLUSTERED +( + [UUID] ASC +)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] +) ON [PRIMARY] + +CREATE TABLE [dbo].[primshapes]( + [UUID] [varchar](255) NOT NULL, + [Shape] [int] NULL, + [ScaleX] [float] NULL, + [ScaleY] [float] NULL, + [ScaleZ] [float] NULL, + [PCode] [int] NULL, + [PathBegin] [int] NULL, + [PathEnd] [int] NULL, + [PathScaleX] [int] NULL, + [PathScaleY] [int] NULL, + [PathShearX] [int] NULL, + [PathShearY] [int] NULL, + [PathSkew] [int] NULL, + [PathCurve] [int] NULL, + [PathRadiusOffset] [int] NULL, + [PathRevolutions] [int] NULL, + [PathTaperX] [int] NULL, + [PathTaperY] [int] NULL, + [PathTwist] [int] NULL, + [PathTwistBegin] [int] NULL, + [ProfileBegin] [int] NULL, + [ProfileEnd] [int] NULL, + [ProfileCurve] [int] NULL, + [ProfileHollow] [int] NULL, + [State] [int] NULL, + [Texture] [image] NULL, + [ExtraParams] [image] NULL, +PRIMARY KEY CLUSTERED +( + [UUID] ASC +)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] +) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] + +CREATE TABLE [dbo].[primitems]( + [itemID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [primID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [assetID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [parentFolderID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [invType] [int] NULL, + [assetType] [int] NULL, + [name] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [description] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [creationDate] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [creatorID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [ownerID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [lastOwnerID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [groupID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [nextPermissions] [int] NULL, + [currentPermissions] [int] NULL, + [basePermissions] [int] NULL, + [everyonePermissions] [int] NULL, + [groupPermissions] [int] NULL, +PRIMARY KEY CLUSTERED +( + [itemID] ASC +)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] +) ON [PRIMARY] + +CREATE TABLE [dbo].[terrain]( + [RegionUUID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [Revision] [int] NULL, + [Heightfield] [image] NULL +) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] + +CREATE TABLE [dbo].[land]( + [UUID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [RegionUUID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [LocalLandID] [int] NULL, + [Bitmap] [image] NULL, + [Name] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [Description] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [OwnerUUID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [IsGroupOwned] [int] NULL, + [Area] [int] NULL, + [AuctionID] [int] NULL, + [Category] [int] NULL, + [ClaimDate] [int] NULL, + [ClaimPrice] [int] NULL, + [GroupUUID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [SalePrice] [int] NULL, + [LandStatus] [int] NULL, + [LandFlags] [int] NULL, + [LandingType] [int] NULL, + [MediaAutoScale] [int] NULL, + [MediaTextureUUID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [MediaURL] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [MusicURL] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [PassHours] [float] NULL, + [PassPrice] [int] NULL, + [SnapshotUUID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [UserLocationX] [float] NULL, + [UserLocationY] [float] NULL, + [UserLocationZ] [float] NULL, + [UserLookAtX] [float] NULL, + [UserLookAtY] [float] NULL, + [UserLookAtZ] [float] NULL, +PRIMARY KEY CLUSTERED +( + [UUID] ASC +)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] +) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] + +CREATE TABLE [dbo].[landaccesslist]( + [LandUUID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [AccessUUID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [Flags] [int] NULL +) ON [PRIMARY] + +:VERSION 2 + +BEGIN TRANSACTION + +CREATE TABLE regionban ( + [regionUUID] VARCHAR(36) NOT NULL, + [bannedUUID] VARCHAR(36) NOT NULL, + [bannedIp] VARCHAR(16) NOT NULL, + [bannedIpHostMask] VARCHAR(16) NOT NULL) + +create table [dbo].[regionsettings] ( + [regionUUID] [varchar](36) not null, + [block_terraform] [bit] not null, + [block_fly] [bit] not null, + [allow_damage] [bit] not null, + [restrict_pushing] [bit] not null, + [allow_land_resell] [bit] not null, + [allow_land_join_divide] [bit] not null, + [block_show_in_search] [bit] not null, + [agent_limit] [int] not null, + [object_bonus] [float] not null, + [maturity] [int] not null, + [disable_scripts] [bit] not null, + [disable_collisions] [bit] not null, + [disable_physics] [bit] not null, + [terrain_texture_1] [varchar](36) not null, + [terrain_texture_2] [varchar](36) not null, + [terrain_texture_3] [varchar](36) not null, + [terrain_texture_4] [varchar](36) not null, + [elevation_1_nw] [float] not null, + [elevation_2_nw] [float] not null, + [elevation_1_ne] [float] not null, + [elevation_2_ne] [float] not null, + [elevation_1_se] [float] not null, + [elevation_2_se] [float] not null, + [elevation_1_sw] [float] not null, + [elevation_2_sw] [float] not null, + [water_height] [float] not null, + [terrain_raise_limit] [float] not null, + [terrain_lower_limit] [float] not null, + [use_estate_sun] [bit] not null, + [fixed_sun] [bit] not null, + [sun_position] [float] not null, + [covenant] [varchar](36) default NULL, + [Sandbox] [bit] NOT NULL, +PRIMARY KEY CLUSTERED +( + [regionUUID] ASC +)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] +) ON [PRIMARY] + +COMMIT + +:VERSION 3 + +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_prims + ( + UUID varchar(36) NOT NULL, + RegionUUID varchar(36) NULL, + ParentID int NULL, + CreationDate int NULL, + Name varchar(255) NULL, + SceneGroupID varchar(36) NULL, + Text varchar(255) NULL, + Description varchar(255) NULL, + SitName varchar(255) NULL, + TouchName varchar(255) NULL, + ObjectFlags int NULL, + CreatorID varchar(36) NULL, + OwnerID varchar(36) NULL, + GroupID varchar(36) NULL, + LastOwnerID varchar(36) NULL, + OwnerMask int NULL, + NextOwnerMask int NULL, + GroupMask int NULL, + EveryoneMask int NULL, + BaseMask int NULL, + PositionX float(53) NULL, + PositionY float(53) NULL, + PositionZ float(53) NULL, + GroupPositionX float(53) NULL, + GroupPositionY float(53) NULL, + GroupPositionZ float(53) NULL, + VelocityX float(53) NULL, + VelocityY float(53) NULL, + VelocityZ float(53) NULL, + AngularVelocityX float(53) NULL, + AngularVelocityY float(53) NULL, + AngularVelocityZ float(53) NULL, + AccelerationX float(53) NULL, + AccelerationY float(53) NULL, + AccelerationZ float(53) NULL, + RotationX float(53) NULL, + RotationY float(53) NULL, + RotationZ float(53) NULL, + RotationW float(53) NULL, + SitTargetOffsetX float(53) NULL, + SitTargetOffsetY float(53) NULL, + SitTargetOffsetZ float(53) NULL, + SitTargetOrientW float(53) NULL, + SitTargetOrientX float(53) NULL, + SitTargetOrientY float(53) NULL, + SitTargetOrientZ float(53) NULL + ) ON [PRIMARY] + +IF EXISTS(SELECT * FROM dbo.prims) + EXEC('INSERT INTO dbo.Tmp_prims (UUID, RegionUUID, ParentID, CreationDate, Name, SceneGroupID, Text, Description, SitName, TouchName, ObjectFlags, CreatorID, OwnerID, GroupID, LastOwnerID, OwnerMask, NextOwnerMask, GroupMask, EveryoneMask, BaseMask, PositionX, PositionY, PositionZ, GroupPositionX, GroupPositionY, GroupPositionZ, VelocityX, VelocityY, VelocityZ, AngularVelocityX, AngularVelocityY, AngularVelocityZ, AccelerationX, AccelerationY, AccelerationZ, RotationX, RotationY, RotationZ, RotationW, SitTargetOffsetX, SitTargetOffsetY, SitTargetOffsetZ, SitTargetOrientW, SitTargetOrientX, SitTargetOrientY, SitTargetOrientZ) + SELECT CONVERT(varchar(36), UUID), CONVERT(varchar(36), RegionUUID), ParentID, CreationDate, Name, CONVERT(varchar(36), SceneGroupID), Text, Description, SitName, TouchName, ObjectFlags, CONVERT(varchar(36), CreatorID), CONVERT(varchar(36), OwnerID), CONVERT(varchar(36), GroupID), CONVERT(varchar(36), LastOwnerID), OwnerMask, NextOwnerMask, GroupMask, EveryoneMask, BaseMask, PositionX, PositionY, PositionZ, GroupPositionX, GroupPositionY, GroupPositionZ, VelocityX, VelocityY, VelocityZ, AngularVelocityX, AngularVelocityY, AngularVelocityZ, AccelerationX, AccelerationY, AccelerationZ, RotationX, RotationY, RotationZ, RotationW, SitTargetOffsetX, SitTargetOffsetY, SitTargetOffsetZ, SitTargetOrientW, SitTargetOrientX, SitTargetOrientY, SitTargetOrientZ FROM dbo.prims WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE dbo.prims + +EXECUTE sp_rename N'dbo.Tmp_prims', N'prims', 'OBJECT' + +ALTER TABLE dbo.prims ADD CONSTRAINT + PK__prims__10566F31 PRIMARY KEY CLUSTERED + ( + UUID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + +:VERSION 4 + +BEGIN TRANSACTION + +CREATE TABLE Tmp_primitems + ( + itemID varchar(36) NOT NULL, + primID varchar(36) NULL, + assetID varchar(36) NULL, + parentFolderID varchar(36) NULL, + invType int NULL, + assetType int NULL, + name varchar(255) NULL, + description varchar(255) NULL, + creationDate varchar(255) NULL, + creatorID varchar(36) NULL, + ownerID varchar(36) NULL, + lastOwnerID varchar(36) NULL, + groupID varchar(36) NULL, + nextPermissions int NULL, + currentPermissions int NULL, + basePermissions int NULL, + everyonePermissions int NULL, + groupPermissions int NULL + ) ON [PRIMARY] + +IF EXISTS(SELECT * FROM primitems) + EXEC('INSERT INTO Tmp_primitems (itemID, primID, assetID, parentFolderID, invType, assetType, name, description, creationDate, creatorID, ownerID, lastOwnerID, groupID, nextPermissions, currentPermissions, basePermissions, everyonePermissions, groupPermissions) + SELECT CONVERT(varchar(36), itemID), CONVERT(varchar(36), primID), CONVERT(varchar(36), assetID), CONVERT(varchar(36), parentFolderID), invType, assetType, name, description, creationDate, CONVERT(varchar(36), creatorID), CONVERT(varchar(36), ownerID), CONVERT(varchar(36), lastOwnerID), CONVERT(varchar(36), groupID), nextPermissions, currentPermissions, basePermissions, everyonePermissions, groupPermissions') + +DROP TABLE primitems + +EXECUTE sp_rename N'Tmp_primitems', N'primitems', 'OBJECT' + +ALTER TABLE primitems ADD CONSTRAINT + PK__primitems__0A688BB1 PRIMARY KEY CLUSTERED + ( + itemID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + + +COMMIT + + +:VERSION 5 + +BEGIN TRANSACTION + +CREATE TABLE Tmp_primshapes + ( + UUID varchar(36) NOT NULL, + Shape int NULL, + ScaleX float(53) NULL, + ScaleY float(53) NULL, + ScaleZ float(53) NULL, + PCode int NULL, + PathBegin int NULL, + PathEnd int NULL, + PathScaleX int NULL, + PathScaleY int NULL, + PathShearX int NULL, + PathShearY int NULL, + PathSkew int NULL, + PathCurve int NULL, + PathRadiusOffset int NULL, + PathRevolutions int NULL, + PathTaperX int NULL, + PathTaperY int NULL, + PathTwist int NULL, + PathTwistBegin int NULL, + ProfileBegin int NULL, + ProfileEnd int NULL, + ProfileCurve int NULL, + ProfileHollow int NULL, + State int NULL, + Texture image NULL, + ExtraParams image NULL + ) ON [PRIMARY] + TEXTIMAGE_ON [PRIMARY] + +IF EXISTS(SELECT * FROM primshapes) + EXEC('INSERT INTO Tmp_primshapes (UUID, Shape, ScaleX, ScaleY, ScaleZ, PCode, PathBegin, PathEnd, PathScaleX, PathScaleY, PathShearX, PathShearY, PathSkew, PathCurve, PathRadiusOffset, PathRevolutions, PathTaperX, PathTaperY, PathTwist, PathTwistBegin, ProfileBegin, ProfileEnd, ProfileCurve, ProfileHollow, State, Texture, ExtraParams) + SELECT CONVERT(varchar(36), UUID), Shape, ScaleX, ScaleY, ScaleZ, PCode, PathBegin, PathEnd, PathScaleX, PathScaleY, PathShearX, PathShearY, PathSkew, PathCurve, PathRadiusOffset, PathRevolutions, PathTaperX, PathTaperY, PathTwist, PathTwistBegin, ProfileBegin, ProfileEnd, ProfileCurve, ProfileHollow, State, Texture, ExtraParams FROM primshapes WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE primshapes + +EXECUTE sp_rename N'Tmp_primshapes', N'primshapes', 'OBJECT' + +ALTER TABLE primshapes ADD CONSTRAINT + PK__primshapes__0880433F PRIMARY KEY CLUSTERED + ( + UUID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + +:VERSION 6 + +BEGIN TRANSACTION + +ALTER TABLE prims ADD PayPrice int not null default 0 +ALTER TABLE prims ADD PayButton1 int not null default 0 +ALTER TABLE prims ADD PayButton2 int not null default 0 +ALTER TABLE prims ADD PayButton3 int not null default 0 +ALTER TABLE prims ADD PayButton4 int not null default 0 +ALTER TABLE prims ADD LoopedSound varchar(36) not null default '00000000-0000-0000-0000-000000000000'; +ALTER TABLE prims ADD LoopedSoundGain float not null default 0.0; +ALTER TABLE prims ADD TextureAnimation image +ALTER TABLE prims ADD OmegaX float not null default 0.0 +ALTER TABLE prims ADD OmegaY float not null default 0.0 +ALTER TABLE prims ADD OmegaZ float not null default 0.0 +ALTER TABLE prims ADD CameraEyeOffsetX float not null default 0.0 +ALTER TABLE prims ADD CameraEyeOffsetY float not null default 0.0 +ALTER TABLE prims ADD CameraEyeOffsetZ float not null default 0.0 +ALTER TABLE prims ADD CameraAtOffsetX float not null default 0.0 +ALTER TABLE prims ADD CameraAtOffsetY float not null default 0.0 +ALTER TABLE prims ADD CameraAtOffsetZ float not null default 0.0 +ALTER TABLE prims ADD ForceMouselook tinyint not null default 0 +ALTER TABLE prims ADD ScriptAccessPin int not null default 0 +ALTER TABLE prims ADD AllowedDrop tinyint not null default 0 +ALTER TABLE prims ADD DieAtEdge tinyint not null default 0 +ALTER TABLE prims ADD SalePrice int not null default 10 +ALTER TABLE prims ADD SaleType tinyint not null default 0 + +ALTER TABLE primitems add flags integer not null default 0 + +ALTER TABLE land ADD AuthbuyerID varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000' + +CREATE index prims_regionuuid on prims(RegionUUID) +CREATE index prims_parentid on prims(ParentID) + +CREATE index primitems_primid on primitems(primID) + +COMMIT + + +:VERSION 7 + +BEGIN TRANSACTION + +ALTER TABLE prims ADD ColorR int not null default 0; +ALTER TABLE prims ADD ColorG int not null default 0; +ALTER TABLE prims ADD ColorB int not null default 0; +ALTER TABLE prims ADD ColorA int not null default 0; +ALTER TABLE prims ADD ParticleSystem IMAGE; +ALTER TABLE prims ADD ClickAction tinyint NOT NULL default 0; + +COMMIT + + +:VERSION 8 + +BEGIN TRANSACTION + +ALTER TABLE land ADD OtherCleanTime integer NOT NULL default 0; +ALTER TABLE land ADD Dwell integer NOT NULL default 0; + +COMMIT + +:VERSION 9 + +BEGIN TRANSACTION + +ALTER TABLE prims ADD Material tinyint NOT NULL default 3 + +COMMIT + + +:VERSION 10 + +BEGIN TRANSACTION + +ALTER TABLE regionsettings ADD sunvectorx float NOT NULL default 0; +ALTER TABLE regionsettings ADD sunvectory float NOT NULL default 0; +ALTER TABLE regionsettings ADD sunvectorz float NOT NULL default 0; + +COMMIT + + +:VERSION 11 + +BEGIN TRANSACTION + +ALTER TABLE prims ADD CollisionSound char(36) not null default '00000000-0000-0000-0000-000000000000' +ALTER TABLE prims ADD CollisionSoundVolume float not null default 0.0 + +COMMIT + + +:VERSION 12 + +BEGIN TRANSACTION + +ALTER TABLE prims ADD LinkNumber integer not null default 0 + +COMMIT + + +:VERSION 13 + +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_prims + ( + UUID uniqueidentifier NOT NULL, + RegionUUID uniqueidentifier NULL, + ParentID int NULL, + CreationDate int NULL, + Name varchar(255) NULL, + SceneGroupID uniqueidentifier NULL, + Text varchar(255) NULL, + Description varchar(255) NULL, + SitName varchar(255) NULL, + TouchName varchar(255) NULL, + ObjectFlags int NULL, + CreatorID uniqueidentifier NULL, + OwnerID uniqueidentifier NULL, + GroupID uniqueidentifier NULL, + LastOwnerID uniqueidentifier NULL, + OwnerMask int NULL, + NextOwnerMask int NULL, + GroupMask int NULL, + EveryoneMask int NULL, + BaseMask int NULL, + PositionX float(53) NULL, + PositionY float(53) NULL, + PositionZ float(53) NULL, + GroupPositionX float(53) NULL, + GroupPositionY float(53) NULL, + GroupPositionZ float(53) NULL, + VelocityX float(53) NULL, + VelocityY float(53) NULL, + VelocityZ float(53) NULL, + AngularVelocityX float(53) NULL, + AngularVelocityY float(53) NULL, + AngularVelocityZ float(53) NULL, + AccelerationX float(53) NULL, + AccelerationY float(53) NULL, + AccelerationZ float(53) NULL, + RotationX float(53) NULL, + RotationY float(53) NULL, + RotationZ float(53) NULL, + RotationW float(53) NULL, + SitTargetOffsetX float(53) NULL, + SitTargetOffsetY float(53) NULL, + SitTargetOffsetZ float(53) NULL, + SitTargetOrientW float(53) NULL, + SitTargetOrientX float(53) NULL, + SitTargetOrientY float(53) NULL, + SitTargetOrientZ float(53) NULL, + PayPrice int NOT NULL DEFAULT ((0)), + PayButton1 int NOT NULL DEFAULT ((0)), + PayButton2 int NOT NULL DEFAULT ((0)), + PayButton3 int NOT NULL DEFAULT ((0)), + PayButton4 int NOT NULL DEFAULT ((0)), + LoopedSound uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'), + LoopedSoundGain float(53) NOT NULL DEFAULT ((0.0)), + TextureAnimation image NULL, + OmegaX float(53) NOT NULL DEFAULT ((0.0)), + OmegaY float(53) NOT NULL DEFAULT ((0.0)), + OmegaZ float(53) NOT NULL DEFAULT ((0.0)), + CameraEyeOffsetX float(53) NOT NULL DEFAULT ((0.0)), + CameraEyeOffsetY float(53) NOT NULL DEFAULT ((0.0)), + CameraEyeOffsetZ float(53) NOT NULL DEFAULT ((0.0)), + CameraAtOffsetX float(53) NOT NULL DEFAULT ((0.0)), + CameraAtOffsetY float(53) NOT NULL DEFAULT ((0.0)), + CameraAtOffsetZ float(53) NOT NULL DEFAULT ((0.0)), + ForceMouselook tinyint NOT NULL DEFAULT ((0)), + ScriptAccessPin int NOT NULL DEFAULT ((0)), + AllowedDrop tinyint NOT NULL DEFAULT ((0)), + DieAtEdge tinyint NOT NULL DEFAULT ((0)), + SalePrice int NOT NULL DEFAULT ((10)), + SaleType tinyint NOT NULL DEFAULT ((0)), + ColorR int NOT NULL DEFAULT ((0)), + ColorG int NOT NULL DEFAULT ((0)), + ColorB int NOT NULL DEFAULT ((0)), + ColorA int NOT NULL DEFAULT ((0)), + ParticleSystem image NULL, + ClickAction tinyint NOT NULL DEFAULT ((0)), + Material tinyint NOT NULL DEFAULT ((3)), + CollisionSound uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'), + CollisionSoundVolume float(53) NOT NULL DEFAULT ((0.0)), + LinkNumber int NOT NULL DEFAULT ((0)) + ) ON [PRIMARY] + TEXTIMAGE_ON [PRIMARY] + +IF EXISTS(SELECT * FROM dbo.prims) + EXEC('INSERT INTO dbo.Tmp_prims (UUID, RegionUUID, ParentID, CreationDate, Name, SceneGroupID, Text, Description, SitName, TouchName, ObjectFlags, CreatorID, OwnerID, GroupID, LastOwnerID, OwnerMask, NextOwnerMask, GroupMask, EveryoneMask, BaseMask, PositionX, PositionY, PositionZ, GroupPositionX, GroupPositionY, GroupPositionZ, VelocityX, VelocityY, VelocityZ, AngularVelocityX, AngularVelocityY, AngularVelocityZ, AccelerationX, AccelerationY, AccelerationZ, RotationX, RotationY, RotationZ, RotationW, SitTargetOffsetX, SitTargetOffsetY, SitTargetOffsetZ, SitTargetOrientW, SitTargetOrientX, SitTargetOrientY, SitTargetOrientZ, PayPrice, PayButton1, PayButton2, PayButton3, PayButton4, LoopedSound, LoopedSoundGain, TextureAnimation, OmegaX, OmegaY, OmegaZ, CameraEyeOffsetX, CameraEyeOffsetY, CameraEyeOffsetZ, CameraAtOffsetX, CameraAtOffsetY, CameraAtOffsetZ, ForceMouselook, ScriptAccessPin, AllowedDrop, DieAtEdge, SalePrice, SaleType, ColorR, ColorG, ColorB, ColorA, ParticleSystem, ClickAction, Material, CollisionSound, CollisionSoundVolume, LinkNumber) + SELECT CONVERT(uniqueidentifier, UUID), CONVERT(uniqueidentifier, RegionUUID), ParentID, CreationDate, Name, CONVERT(uniqueidentifier, SceneGroupID), Text, Description, SitName, TouchName, ObjectFlags, CONVERT(uniqueidentifier, CreatorID), CONVERT(uniqueidentifier, OwnerID), CONVERT(uniqueidentifier, GroupID), CONVERT(uniqueidentifier, LastOwnerID), OwnerMask, NextOwnerMask, GroupMask, EveryoneMask, BaseMask, PositionX, PositionY, PositionZ, GroupPositionX, GroupPositionY, GroupPositionZ, VelocityX, VelocityY, VelocityZ, AngularVelocityX, AngularVelocityY, AngularVelocityZ, AccelerationX, AccelerationY, AccelerationZ, RotationX, RotationY, RotationZ, RotationW, SitTargetOffsetX, SitTargetOffsetY, SitTargetOffsetZ, SitTargetOrientW, SitTargetOrientX, SitTargetOrientY, SitTargetOrientZ, PayPrice, PayButton1, PayButton2, PayButton3, PayButton4, CONVERT(uniqueidentifier, LoopedSound), LoopedSoundGain, TextureAnimation, OmegaX, OmegaY, OmegaZ, CameraEyeOffsetX, CameraEyeOffsetY, CameraEyeOffsetZ, CameraAtOffsetX, CameraAtOffsetY, CameraAtOffsetZ, ForceMouselook, ScriptAccessPin, AllowedDrop, DieAtEdge, SalePrice, SaleType, ColorR, ColorG, ColorB, ColorA, ParticleSystem, ClickAction, Material, CONVERT(uniqueidentifier, CollisionSound), CollisionSoundVolume, LinkNumber FROM dbo.prims WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE dbo.prims + +EXECUTE sp_rename N'dbo.Tmp_prims', N'prims', 'OBJECT' + +ALTER TABLE dbo.prims ADD CONSTRAINT + PK__prims__10566F31 PRIMARY KEY CLUSTERED + ( + UUID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + + +CREATE NONCLUSTERED INDEX prims_regionuuid ON dbo.prims + ( + RegionUUID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +CREATE NONCLUSTERED INDEX prims_parentid ON dbo.prims + ( + ParentID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + +:VERSION 14 + +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_primshapes + ( + UUID uniqueidentifier NOT NULL, + Shape int NULL, + ScaleX float(53) NULL, + ScaleY float(53) NULL, + ScaleZ float(53) NULL, + PCode int NULL, + PathBegin int NULL, + PathEnd int NULL, + PathScaleX int NULL, + PathScaleY int NULL, + PathShearX int NULL, + PathShearY int NULL, + PathSkew int NULL, + PathCurve int NULL, + PathRadiusOffset int NULL, + PathRevolutions int NULL, + PathTaperX int NULL, + PathTaperY int NULL, + PathTwist int NULL, + PathTwistBegin int NULL, + ProfileBegin int NULL, + ProfileEnd int NULL, + ProfileCurve int NULL, + ProfileHollow int NULL, + State int NULL, + Texture image NULL, + ExtraParams image NULL + ) ON [PRIMARY] + TEXTIMAGE_ON [PRIMARY] + +IF EXISTS(SELECT * FROM dbo.primshapes) + EXEC('INSERT INTO dbo.Tmp_primshapes (UUID, Shape, ScaleX, ScaleY, ScaleZ, PCode, PathBegin, PathEnd, PathScaleX, PathScaleY, PathShearX, PathShearY, PathSkew, PathCurve, PathRadiusOffset, PathRevolutions, PathTaperX, PathTaperY, PathTwist, PathTwistBegin, ProfileBegin, ProfileEnd, ProfileCurve, ProfileHollow, State, Texture, ExtraParams) + SELECT CONVERT(uniqueidentifier, UUID), Shape, ScaleX, ScaleY, ScaleZ, PCode, PathBegin, PathEnd, PathScaleX, PathScaleY, PathShearX, PathShearY, PathSkew, PathCurve, PathRadiusOffset, PathRevolutions, PathTaperX, PathTaperY, PathTwist, PathTwistBegin, ProfileBegin, ProfileEnd, ProfileCurve, ProfileHollow, State, Texture, ExtraParams FROM dbo.primshapes WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE dbo.primshapes + +EXECUTE sp_rename N'dbo.Tmp_primshapes', N'primshapes', 'OBJECT' + +ALTER TABLE dbo.primshapes ADD CONSTRAINT + PK__primshapes__0880433F PRIMARY KEY CLUSTERED + ( + UUID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + +:VERSION 15 + +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_primitems + ( + itemID uniqueidentifier NOT NULL, + primID uniqueidentifier NULL, + assetID uniqueidentifier NULL, + parentFolderID uniqueidentifier NULL, + invType int NULL, + assetType int NULL, + name varchar(255) NULL, + description varchar(255) NULL, + creationDate varchar(255) NULL, + creatorID uniqueidentifier NULL, + ownerID uniqueidentifier NULL, + lastOwnerID uniqueidentifier NULL, + groupID uniqueidentifier NULL, + nextPermissions int NULL, + currentPermissions int NULL, + basePermissions int NULL, + everyonePermissions int NULL, + groupPermissions int NULL, + flags int NOT NULL DEFAULT ((0)) + ) ON [PRIMARY] + +IF EXISTS(SELECT * FROM dbo.primitems) + EXEC('INSERT INTO dbo.Tmp_primitems (itemID, primID, assetID, parentFolderID, invType, assetType, name, description, creationDate, creatorID, ownerID, lastOwnerID, groupID, nextPermissions, currentPermissions, basePermissions, everyonePermissions, groupPermissions, flags) + SELECT CONVERT(uniqueidentifier, itemID), CONVERT(uniqueidentifier, primID), CONVERT(uniqueidentifier, assetID), CONVERT(uniqueidentifier, parentFolderID), invType, assetType, name, description, creationDate, CONVERT(uniqueidentifier, creatorID), CONVERT(uniqueidentifier, ownerID), CONVERT(uniqueidentifier, lastOwnerID), CONVERT(uniqueidentifier, groupID), nextPermissions, currentPermissions, basePermissions, everyonePermissions, groupPermissions, flags FROM dbo.primitems WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE dbo.primitems + +EXECUTE sp_rename N'dbo.Tmp_primitems', N'primitems', 'OBJECT' + +ALTER TABLE dbo.primitems ADD CONSTRAINT + PK__primitems__0A688BB1 PRIMARY KEY CLUSTERED + ( + itemID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +CREATE NONCLUSTERED INDEX primitems_primid ON dbo.primitems + ( + primID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + +:VERSION 16 + + +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_terrain + ( + RegionUUID uniqueidentifier NULL, + Revision int NULL, + Heightfield image NULL + ) ON [PRIMARY] + TEXTIMAGE_ON [PRIMARY] + +IF EXISTS(SELECT * FROM dbo.terrain) + EXEC('INSERT INTO dbo.Tmp_terrain (RegionUUID, Revision, Heightfield) + SELECT CONVERT(uniqueidentifier, RegionUUID), Revision, Heightfield FROM dbo.terrain WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE dbo.terrain + +EXECUTE sp_rename N'dbo.Tmp_terrain', N'terrain', 'OBJECT' + +COMMIT + + +:VERSION 17 + +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_land + ( + UUID uniqueidentifier NOT NULL, + RegionUUID uniqueidentifier NULL, + LocalLandID int NULL, + Bitmap image NULL, + Name varchar(255) NULL, + Description varchar(255) NULL, + OwnerUUID uniqueidentifier NULL, + IsGroupOwned int NULL, + Area int NULL, + AuctionID int NULL, + Category int NULL, + ClaimDate int NULL, + ClaimPrice int NULL, + GroupUUID uniqueidentifier NULL, + SalePrice int NULL, + LandStatus int NULL, + LandFlags int NULL, + LandingType int NULL, + MediaAutoScale int NULL, + MediaTextureUUID uniqueidentifier NULL, + MediaURL varchar(255) NULL, + MusicURL varchar(255) NULL, + PassHours float(53) NULL, + PassPrice int NULL, + SnapshotUUID uniqueidentifier NULL, + UserLocationX float(53) NULL, + UserLocationY float(53) NULL, + UserLocationZ float(53) NULL, + UserLookAtX float(53) NULL, + UserLookAtY float(53) NULL, + UserLookAtZ float(53) NULL, + AuthbuyerID uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'), + OtherCleanTime int NOT NULL DEFAULT ((0)), + Dwell int NOT NULL DEFAULT ((0)) + ) ON [PRIMARY] + TEXTIMAGE_ON [PRIMARY] + +IF EXISTS(SELECT * FROM dbo.land) + EXEC('INSERT INTO dbo.Tmp_land (UUID, RegionUUID, LocalLandID, Bitmap, Name, Description, OwnerUUID, IsGroupOwned, Area, AuctionID, Category, ClaimDate, ClaimPrice, GroupUUID, SalePrice, LandStatus, LandFlags, LandingType, MediaAutoScale, MediaTextureUUID, MediaURL, MusicURL, PassHours, PassPrice, SnapshotUUID, UserLocationX, UserLocationY, UserLocationZ, UserLookAtX, UserLookAtY, UserLookAtZ, AuthbuyerID, OtherCleanTime, Dwell) + SELECT CONVERT(uniqueidentifier, UUID), CONVERT(uniqueidentifier, RegionUUID), LocalLandID, Bitmap, Name, Description, CONVERT(uniqueidentifier, OwnerUUID), IsGroupOwned, Area, AuctionID, Category, ClaimDate, ClaimPrice, CONVERT(uniqueidentifier, GroupUUID), SalePrice, LandStatus, LandFlags, LandingType, MediaAutoScale, CONVERT(uniqueidentifier, MediaTextureUUID), MediaURL, MusicURL, PassHours, PassPrice, CONVERT(uniqueidentifier, SnapshotUUID), UserLocationX, UserLocationY, UserLocationZ, UserLookAtX, UserLookAtY, UserLookAtZ, CONVERT(uniqueidentifier, AuthbuyerID), OtherCleanTime, Dwell FROM dbo.land WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE dbo.land + +EXECUTE sp_rename N'dbo.Tmp_land', N'land', 'OBJECT' + +ALTER TABLE dbo.land ADD CONSTRAINT + PK__land__65A475E71BFD2C07 PRIMARY KEY CLUSTERED + ( + UUID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + + +:VERSION 18 + +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_landaccesslist + ( + LandUUID uniqueidentifier NULL, + AccessUUID uniqueidentifier NULL, + Flags int NULL + ) ON [PRIMARY] + +IF EXISTS(SELECT * FROM dbo.landaccesslist) + EXEC('INSERT INTO dbo.Tmp_landaccesslist (LandUUID, AccessUUID, Flags) + SELECT CONVERT(uniqueidentifier, LandUUID), CONVERT(uniqueidentifier, AccessUUID), Flags FROM dbo.landaccesslist WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE dbo.landaccesslist + +EXECUTE sp_rename N'dbo.Tmp_landaccesslist', N'landaccesslist', 'OBJECT' + +COMMIT + + + +:VERSION 19 + +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_regionban + ( + regionUUID uniqueidentifier NOT NULL, + bannedUUID uniqueidentifier NOT NULL, + bannedIp varchar(16) NOT NULL, + bannedIpHostMask varchar(16) NOT NULL + ) ON [PRIMARY] + +IF EXISTS(SELECT * FROM dbo.regionban) + EXEC('INSERT INTO dbo.Tmp_regionban (regionUUID, bannedUUID, bannedIp, bannedIpHostMask) + SELECT CONVERT(uniqueidentifier, regionUUID), CONVERT(uniqueidentifier, bannedUUID), bannedIp, bannedIpHostMask FROM dbo.regionban WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE dbo.regionban + +EXECUTE sp_rename N'dbo.Tmp_regionban', N'regionban', 'OBJECT' + +COMMIT + + +:VERSION 20 + +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_regionsettings + ( + regionUUID uniqueidentifier NOT NULL, + block_terraform bit NOT NULL, + block_fly bit NOT NULL, + allow_damage bit NOT NULL, + restrict_pushing bit NOT NULL, + allow_land_resell bit NOT NULL, + allow_land_join_divide bit NOT NULL, + block_show_in_search bit NOT NULL, + agent_limit int NOT NULL, + object_bonus float(53) NOT NULL, + maturity int NOT NULL, + disable_scripts bit NOT NULL, + disable_collisions bit NOT NULL, + disable_physics bit NOT NULL, + terrain_texture_1 uniqueidentifier NOT NULL, + terrain_texture_2 uniqueidentifier NOT NULL, + terrain_texture_3 uniqueidentifier NOT NULL, + terrain_texture_4 uniqueidentifier NOT NULL, + elevation_1_nw float(53) NOT NULL, + elevation_2_nw float(53) NOT NULL, + elevation_1_ne float(53) NOT NULL, + elevation_2_ne float(53) NOT NULL, + elevation_1_se float(53) NOT NULL, + elevation_2_se float(53) NOT NULL, + elevation_1_sw float(53) NOT NULL, + elevation_2_sw float(53) NOT NULL, + water_height float(53) NOT NULL, + terrain_raise_limit float(53) NOT NULL, + terrain_lower_limit float(53) NOT NULL, + use_estate_sun bit NOT NULL, + fixed_sun bit NOT NULL, + sun_position float(53) NOT NULL, + covenant uniqueidentifier NULL DEFAULT (NULL), + Sandbox bit NOT NULL, + sunvectorx float(53) NOT NULL DEFAULT ((0)), + sunvectory float(53) NOT NULL DEFAULT ((0)), + sunvectorz float(53) NOT NULL DEFAULT ((0)) + ) ON [PRIMARY] + +IF EXISTS(SELECT * FROM dbo.regionsettings) + EXEC('INSERT INTO dbo.Tmp_regionsettings (regionUUID, block_terraform, block_fly, allow_damage, restrict_pushing, allow_land_resell, allow_land_join_divide, block_show_in_search, agent_limit, object_bonus, maturity, disable_scripts, disable_collisions, disable_physics, terrain_texture_1, 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_sw, water_height, terrain_raise_limit, terrain_lower_limit, use_estate_sun, fixed_sun, sun_position, covenant, Sandbox, sunvectorx, sunvectory, sunvectorz) + SELECT CONVERT(uniqueidentifier, regionUUID), block_terraform, block_fly, allow_damage, restrict_pushing, allow_land_resell, allow_land_join_divide, block_show_in_search, agent_limit, object_bonus, maturity, disable_scripts, disable_collisions, disable_physics, CONVERT(uniqueidentifier, terrain_texture_1), CONVERT(uniqueidentifier, terrain_texture_2), CONVERT(uniqueidentifier, terrain_texture_3), CONVERT(uniqueidentifier, 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_sw, water_height, terrain_raise_limit, terrain_lower_limit, use_estate_sun, fixed_sun, sun_position, CONVERT(uniqueidentifier, covenant), Sandbox, sunvectorx, sunvectory, sunvectorz FROM dbo.regionsettings WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE dbo.regionsettings + +EXECUTE sp_rename N'dbo.Tmp_regionsettings', N'regionsettings', 'OBJECT' + +ALTER TABLE dbo.regionsettings ADD CONSTRAINT + PK__regionse__5B35159D21B6055D PRIMARY KEY CLUSTERED + ( + regionUUID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + +:VERSION 21 + +BEGIN TRANSACTION + +ALTER TABLE prims ADD PassTouches bit not null default 0 + +COMMIT + + +:VERSION 22 + +BEGIN TRANSACTION + +ALTER TABLE regionsettings ADD loaded_creation_date varchar(20) +ALTER TABLE regionsettings ADD loaded_creation_time varchar(20) +ALTER TABLE regionsettings ADD loaded_creation_id varchar(64) + +COMMIT + +:VERSION 23 + +BEGIN TRANSACTION + +ALTER TABLE regionsettings DROP COLUMN loaded_creation_date +ALTER TABLE regionsettings DROP COLUMN loaded_creation_time +ALTER TABLE regionsettings ADD loaded_creation_datetime int NOT NULL default 0 + +COMMIT + + + diff --git a/OpenSim/Data/MSSQL/Resources/UserAccount.migrations b/OpenSim/Data/MSSQL/Resources/UserAccount.migrations new file mode 100644 index 0000000000..8534e235c9 --- /dev/null +++ b/OpenSim/Data/MSSQL/Resources/UserAccount.migrations @@ -0,0 +1,55 @@ +:VERSION 1 + +CREATE TABLE [UserAccounts] ( + [PrincipalID] uniqueidentifier NOT NULL, + [ScopeID] uniqueidentifier NOT NULL, + [FirstName] [varchar](64) NOT NULL, + [LastName] [varchar](64) NOT NULL, + [Email] [varchar](64) NULL, + [ServiceURLs] [text] NULL, + [Created] [int] default NULL, + + PRIMARY KEY CLUSTERED +( + [PrincipalID] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] + + +:VERSION 2 + +BEGIN TRANSACTION + +INSERT INTO UserAccounts (PrincipalID, ScopeID, FirstName, LastName, Email, ServiceURLs, Created) SELECT [UUID] AS PrincipalID, '00000000-0000-0000-0000-000000000000' AS ScopeID, +username AS FirstName, +lastname AS LastName, +email as Email, ( +'AssetServerURI=' + +userAssetURI + ' InventoryServerURI=' + userInventoryURI + ' GatewayURI= HomeURI=') AS ServiceURLs, +created as Created FROM users; + + +COMMIT + +:VERSION 3 + +BEGIN TRANSACTION + +CREATE UNIQUE INDEX PrincipalID ON UserAccounts(PrincipalID); +CREATE INDEX Email ON UserAccounts(Email); +CREATE INDEX FirstName ON UserAccounts(FirstName); +CREATE INDEX LastName ON UserAccounts(LastName); +CREATE INDEX Name ON UserAccounts(FirstName,LastName); + +COMMIT + +:VERSION 4 + +BEGIN TRANSACTION + +ALTER TABLE UserAccounts ADD UserLevel integer NOT NULL DEFAULT 0; +ALTER TABLE UserAccounts ADD UserFlags integer NOT NULL DEFAULT 0; +ALTER TABLE UserAccounts ADD UserTitle varchar(64) NOT NULL DEFAULT ''; + +COMMIT + diff --git a/OpenSim/Data/MSSQL/Resources/UserStore.migrations b/OpenSim/Data/MSSQL/Resources/UserStore.migrations new file mode 100644 index 0000000000..050c544f64 --- /dev/null +++ b/OpenSim/Data/MSSQL/Resources/UserStore.migrations @@ -0,0 +1,421 @@ +:VERSION 1 + +CREATE TABLE [users] ( + [UUID] [varchar](36) NOT NULL default '', + [username] [varchar](32) NOT NULL, + [lastname] [varchar](32) NOT NULL, + [passwordHash] [varchar](32) NOT NULL, + [passwordSalt] [varchar](32) NOT NULL, + [homeRegion] [bigint] default NULL, + [homeLocationX] [float] default NULL, + [homeLocationY] [float] default NULL, + [homeLocationZ] [float] default NULL, + [homeLookAtX] [float] default NULL, + [homeLookAtY] [float] default NULL, + [homeLookAtZ] [float] default NULL, + [created] [int] NOT NULL, + [lastLogin] [int] NOT NULL, + [userInventoryURI] [varchar](255) default NULL, + [userAssetURI] [varchar](255) default NULL, + [profileCanDoMask] [int] default NULL, + [profileWantDoMask] [int] default NULL, + [profileAboutText] [ntext], + [profileFirstText] [ntext], + [profileImage] [varchar](36) default NULL, + [profileFirstImage] [varchar](36) default NULL, + [webLoginKey] [varchar](36) default NULL, + PRIMARY KEY CLUSTERED +( + [UUID] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] + + +CREATE NONCLUSTERED INDEX [usernames] ON [users] +( + [username] ASC, + [lastname] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + + +CREATE TABLE [agents] ( + [UUID] [varchar](36) NOT NULL, + [sessionID] [varchar](36) NOT NULL, + [secureSessionID] [varchar](36) NOT NULL, + [agentIP] [varchar](16) NOT NULL, + [agentPort] [int] NOT NULL, + [agentOnline] [tinyint] NOT NULL, + [loginTime] [int] NOT NULL, + [logoutTime] [int] NOT NULL, + [currentRegion] [varchar](36) NOT NULL, + [currentHandle] [bigint] NOT NULL, + [currentPos] [varchar](64) NOT NULL, + PRIMARY KEY CLUSTERED +( + [UUID] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] + + +CREATE NONCLUSTERED INDEX [session] ON [agents] +( + [sessionID] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +CREATE NONCLUSTERED INDEX [ssession] ON [agents] +( + [secureSessionID] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + + +CREATE TABLE [dbo].[userfriends]( + [ownerID] [varchar](50) COLLATE Latin1_General_CI_AS NOT NULL, + [friendID] [varchar](50) COLLATE Latin1_General_CI_AS NOT NULL, + [friendPerms] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [datetimestamp] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL +) ON [PRIMARY] + +CREATE TABLE [avatarappearance] ( + [Owner] [varchar](36) NOT NULL, + [Serial] int NOT NULL, + [Visual_Params] [image] NOT NULL, + [Texture] [image] NOT NULL, + [Avatar_Height] float NOT NULL, + [Body_Item] [varchar](36) NOT NULL, + [Body_Asset] [varchar](36) NOT NULL, + [Skin_Item] [varchar](36) NOT NULL, + [Skin_Asset] [varchar](36) NOT NULL, + [Hair_Item] [varchar](36) NOT NULL, + [Hair_Asset] [varchar](36) NOT NULL, + [Eyes_Item] [varchar](36) NOT NULL, + [Eyes_Asset] [varchar](36) NOT NULL, + [Shirt_Item] [varchar](36) NOT NULL, + [Shirt_Asset] [varchar](36) NOT NULL, + [Pants_Item] [varchar](36) NOT NULL, + [Pants_Asset] [varchar](36) NOT NULL, + [Shoes_Item] [varchar](36) NOT NULL, + [Shoes_Asset] [varchar](36) NOT NULL, + [Socks_Item] [varchar](36) NOT NULL, + [Socks_Asset] [varchar](36) NOT NULL, + [Jacket_Item] [varchar](36) NOT NULL, + [Jacket_Asset] [varchar](36) NOT NULL, + [Gloves_Item] [varchar](36) NOT NULL, + [Gloves_Asset] [varchar](36) NOT NULL, + [Undershirt_Item] [varchar](36) NOT NULL, + [Undershirt_Asset] [varchar](36) NOT NULL, + [Underpants_Item] [varchar](36) NOT NULL, + [Underpants_Asset] [varchar](36) NOT NULL, + [Skirt_Item] [varchar](36) NOT NULL, + [Skirt_Asset] [varchar](36) NOT NULL, + + PRIMARY KEY CLUSTERED ( + [Owner] + ) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] + +:VERSION 2 + +BEGIN TRANSACTION + +ALTER TABLE users ADD homeRegionID varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000'; +ALTER TABLE users ADD userFlags int NOT NULL default 0; +ALTER TABLE users ADD godLevel int NOT NULL default 0; +ALTER TABLE users ADD customType varchar(32) not null default ''; +ALTER TABLE users ADD partner varchar(36) not null default '00000000-0000-0000-0000-000000000000'; + +COMMIT + + +:VERSION 3 + +BEGIN TRANSACTION + +CREATE TABLE [avatarattachments] ( + [UUID] varchar(36) NOT NULL + , [attachpoint] int NOT NULL + , [item] varchar(36) NOT NULL + , [asset] varchar(36) NOT NULL) + +CREATE NONCLUSTERED INDEX IX_avatarattachments ON dbo.avatarattachments + ( + UUID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + + +COMMIT + + +:VERSION 4 + +BEGIN TRANSACTION + +CREATE TABLE Tmp_userfriends + ( + ownerID varchar(36) NOT NULL, + friendID varchar(36) NOT NULL, + friendPerms int NOT NULL, + datetimestamp int NOT NULL + ) ON [PRIMARY] + +IF EXISTS(SELECT * FROM userfriends) + EXEC('INSERT INTO dbo.Tmp_userfriends (ownerID, friendID, friendPerms, datetimestamp) + SELECT CONVERT(varchar(36), ownerID), CONVERT(varchar(36), friendID), CONVERT(int, friendPerms), CONVERT(int, datetimestamp) FROM dbo.userfriends WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE dbo.userfriends + +EXECUTE sp_rename N'Tmp_userfriends', N'userfriends', 'OBJECT' + +CREATE NONCLUSTERED INDEX IX_userfriends_ownerID ON userfriends + ( + ownerID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +CREATE NONCLUSTERED INDEX IX_userfriends_friendID ON userfriends + ( + friendID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + +:VERSION 5 + +BEGIN TRANSACTION + + ALTER TABLE users add email varchar(250); + +COMMIT + + +:VERSION 6 + +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_users + ( + UUID uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'), + username varchar(32) NOT NULL, + lastname varchar(32) NOT NULL, + passwordHash varchar(32) NOT NULL, + passwordSalt varchar(32) NOT NULL, + homeRegion bigint NULL DEFAULT (NULL), + homeLocationX float(53) NULL DEFAULT (NULL), + homeLocationY float(53) NULL DEFAULT (NULL), + homeLocationZ float(53) NULL DEFAULT (NULL), + homeLookAtX float(53) NULL DEFAULT (NULL), + homeLookAtY float(53) NULL DEFAULT (NULL), + homeLookAtZ float(53) NULL DEFAULT (NULL), + created int NOT NULL, + lastLogin int NOT NULL, + userInventoryURI varchar(255) NULL DEFAULT (NULL), + userAssetURI varchar(255) NULL DEFAULT (NULL), + profileCanDoMask int NULL DEFAULT (NULL), + profileWantDoMask int NULL DEFAULT (NULL), + profileAboutText ntext NULL, + profileFirstText ntext NULL, + profileImage uniqueidentifier NULL DEFAULT (NULL), + profileFirstImage uniqueidentifier NULL DEFAULT (NULL), + webLoginKey uniqueidentifier NULL DEFAULT (NULL), + homeRegionID uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'), + userFlags int NOT NULL DEFAULT ((0)), + godLevel int NOT NULL DEFAULT ((0)), + customType varchar(32) NOT NULL DEFAULT (''), + partner uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'), + email varchar(250) NULL + ) ON [PRIMARY] + TEXTIMAGE_ON [PRIMARY] + +IF EXISTS(SELECT * FROM dbo.users) + EXEC('INSERT INTO dbo.Tmp_users (UUID, username, lastname, passwordHash, passwordSalt, homeRegion, homeLocationX, homeLocationY, homeLocationZ, homeLookAtX, homeLookAtY, homeLookAtZ, created, lastLogin, userInventoryURI, userAssetURI, profileCanDoMask, profileWantDoMask, profileAboutText, profileFirstText, profileImage, profileFirstImage, webLoginKey, homeRegionID, userFlags, godLevel, customType, partner, email) + SELECT CONVERT(uniqueidentifier, UUID), username, lastname, passwordHash, passwordSalt, homeRegion, homeLocationX, homeLocationY, homeLocationZ, homeLookAtX, homeLookAtY, homeLookAtZ, created, lastLogin, userInventoryURI, userAssetURI, profileCanDoMask, profileWantDoMask, profileAboutText, profileFirstText, CONVERT(uniqueidentifier, profileImage), CONVERT(uniqueidentifier, profileFirstImage), CONVERT(uniqueidentifier, webLoginKey), CONVERT(uniqueidentifier, homeRegionID), userFlags, godLevel, customType, CONVERT(uniqueidentifier, partner), email FROM dbo.users WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE dbo.users + +EXECUTE sp_rename N'dbo.Tmp_users', N'users', 'OBJECT' + +ALTER TABLE dbo.users ADD CONSTRAINT + PK__users__65A475E737A5467C PRIMARY KEY CLUSTERED + ( + UUID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +CREATE NONCLUSTERED INDEX usernames ON dbo.users + ( + username, + lastname + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + +:VERSION 7 + +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_agents + ( + UUID uniqueidentifier NOT NULL, + sessionID uniqueidentifier NOT NULL, + secureSessionID uniqueidentifier NOT NULL, + agentIP varchar(16) NOT NULL, + agentPort int NOT NULL, + agentOnline tinyint NOT NULL, + loginTime int NOT NULL, + logoutTime int NOT NULL, + currentRegion uniqueidentifier NOT NULL, + currentHandle bigint NOT NULL, + currentPos varchar(64) NOT NULL + ) ON [PRIMARY] + +IF EXISTS(SELECT * FROM dbo.agents) + EXEC('INSERT INTO dbo.Tmp_agents (UUID, sessionID, secureSessionID, agentIP, agentPort, agentOnline, loginTime, logoutTime, currentRegion, currentHandle, currentPos) + SELECT CONVERT(uniqueidentifier, UUID), CONVERT(uniqueidentifier, sessionID), CONVERT(uniqueidentifier, secureSessionID), agentIP, agentPort, agentOnline, loginTime, logoutTime, CONVERT(uniqueidentifier, currentRegion), currentHandle, currentPos FROM dbo.agents WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE dbo.agents + +EXECUTE sp_rename N'dbo.Tmp_agents', N'agents', 'OBJECT' + +ALTER TABLE dbo.agents ADD CONSTRAINT + PK__agents__65A475E749C3F6B7 PRIMARY KEY CLUSTERED + ( + UUID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +CREATE NONCLUSTERED INDEX session ON dbo.agents + ( + sessionID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +CREATE NONCLUSTERED INDEX ssession ON dbo.agents + ( + secureSessionID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + +:VERSION 8 + +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_userfriends + ( + ownerID uniqueidentifier NOT NULL, + friendID uniqueidentifier NOT NULL, + friendPerms int NOT NULL, + datetimestamp int NOT NULL + ) ON [PRIMARY] + +IF EXISTS(SELECT * FROM dbo.userfriends) + EXEC('INSERT INTO dbo.Tmp_userfriends (ownerID, friendID, friendPerms, datetimestamp) + SELECT CONVERT(uniqueidentifier, ownerID), CONVERT(uniqueidentifier, friendID), friendPerms, datetimestamp FROM dbo.userfriends WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE dbo.userfriends + +EXECUTE sp_rename N'dbo.Tmp_userfriends', N'userfriends', 'OBJECT' + +CREATE NONCLUSTERED INDEX IX_userfriends_ownerID ON dbo.userfriends + ( + ownerID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +CREATE NONCLUSTERED INDEX IX_userfriends_friendID ON dbo.userfriends + ( + friendID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + +:VERSION 9 + +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_avatarappearance + ( + Owner uniqueidentifier NOT NULL, + Serial int NOT NULL, + Visual_Params image NOT NULL, + Texture image NOT NULL, + Avatar_Height float(53) NOT NULL, + Body_Item uniqueidentifier NOT NULL, + Body_Asset uniqueidentifier NOT NULL, + Skin_Item uniqueidentifier NOT NULL, + Skin_Asset uniqueidentifier NOT NULL, + Hair_Item uniqueidentifier NOT NULL, + Hair_Asset uniqueidentifier NOT NULL, + Eyes_Item uniqueidentifier NOT NULL, + Eyes_Asset uniqueidentifier NOT NULL, + Shirt_Item uniqueidentifier NOT NULL, + Shirt_Asset uniqueidentifier NOT NULL, + Pants_Item uniqueidentifier NOT NULL, + Pants_Asset uniqueidentifier NOT NULL, + Shoes_Item uniqueidentifier NOT NULL, + Shoes_Asset uniqueidentifier NOT NULL, + Socks_Item uniqueidentifier NOT NULL, + Socks_Asset uniqueidentifier NOT NULL, + Jacket_Item uniqueidentifier NOT NULL, + Jacket_Asset uniqueidentifier NOT NULL, + Gloves_Item uniqueidentifier NOT NULL, + Gloves_Asset uniqueidentifier NOT NULL, + Undershirt_Item uniqueidentifier NOT NULL, + Undershirt_Asset uniqueidentifier NOT NULL, + Underpants_Item uniqueidentifier NOT NULL, + Underpants_Asset uniqueidentifier NOT NULL, + Skirt_Item uniqueidentifier NOT NULL, + Skirt_Asset uniqueidentifier NOT NULL + ) ON [PRIMARY] + TEXTIMAGE_ON [PRIMARY] + +IF EXISTS(SELECT * FROM dbo.avatarappearance) + EXEC('INSERT INTO dbo.Tmp_avatarappearance (Owner, Serial, Visual_Params, Texture, Avatar_Height, Body_Item, Body_Asset, Skin_Item, Skin_Asset, Hair_Item, Hair_Asset, Eyes_Item, Eyes_Asset, Shirt_Item, Shirt_Asset, Pants_Item, Pants_Asset, Shoes_Item, Shoes_Asset, Socks_Item, Socks_Asset, Jacket_Item, Jacket_Asset, Gloves_Item, Gloves_Asset, Undershirt_Item, Undershirt_Asset, Underpants_Item, Underpants_Asset, Skirt_Item, Skirt_Asset) + SELECT CONVERT(uniqueidentifier, Owner), Serial, Visual_Params, Texture, Avatar_Height, CONVERT(uniqueidentifier, Body_Item), CONVERT(uniqueidentifier, Body_Asset), CONVERT(uniqueidentifier, Skin_Item), CONVERT(uniqueidentifier, Skin_Asset), CONVERT(uniqueidentifier, Hair_Item), CONVERT(uniqueidentifier, Hair_Asset), CONVERT(uniqueidentifier, Eyes_Item), CONVERT(uniqueidentifier, Eyes_Asset), CONVERT(uniqueidentifier, Shirt_Item), CONVERT(uniqueidentifier, Shirt_Asset), CONVERT(uniqueidentifier, Pants_Item), CONVERT(uniqueidentifier, Pants_Asset), CONVERT(uniqueidentifier, Shoes_Item), CONVERT(uniqueidentifier, Shoes_Asset), CONVERT(uniqueidentifier, Socks_Item), CONVERT(uniqueidentifier, Socks_Asset), CONVERT(uniqueidentifier, Jacket_Item), CONVERT(uniqueidentifier, Jacket_Asset), CONVERT(uniqueidentifier, Gloves_Item), CONVERT(uniqueidentifier, Gloves_Asset), CONVERT(uniqueidentifier, Undershirt_Item), CONVERT(uniqueidentifier, Undershirt_Asset), CONVERT(uniqueidentifier, Underpants_Item), CONVERT(uniqueidentifier, Underpants_Asset), CONVERT(uniqueidentifier, Skirt_Item), CONVERT(uniqueidentifier, Skirt_Asset) FROM dbo.avatarappearance WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE dbo.avatarappearance + +EXECUTE sp_rename N'dbo.Tmp_avatarappearance', N'avatarappearance', 'OBJECT' + +ALTER TABLE dbo.avatarappearance ADD CONSTRAINT + PK__avatarap__7DD115CC4E88ABD4 PRIMARY KEY CLUSTERED + ( + Owner + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + +:VERSION 10 + +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_avatarattachments + ( + UUID uniqueidentifier NOT NULL, + attachpoint int NOT NULL, + item uniqueidentifier NOT NULL, + asset uniqueidentifier NOT NULL + ) ON [PRIMARY] + +IF EXISTS(SELECT * FROM dbo.avatarattachments) + EXEC('INSERT INTO dbo.Tmp_avatarattachments (UUID, attachpoint, item, asset) + SELECT CONVERT(uniqueidentifier, UUID), attachpoint, CONVERT(uniqueidentifier, item), CONVERT(uniqueidentifier, asset) FROM dbo.avatarattachments WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE dbo.avatarattachments + +EXECUTE sp_rename N'dbo.Tmp_avatarattachments', N'avatarattachments', 'OBJECT' + +CREATE NONCLUSTERED INDEX IX_avatarattachments ON dbo.avatarattachments + ( + UUID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + +:VERSION 11 + +BEGIN TRANSACTION + +ALTER TABLE users ADD scopeID uniqueidentifier not null default '00000000-0000-0000-0000-000000000000' + +COMMIT From 3e1f2ddb8e296a7fef9b7887fa9fda48f4eb2abf Mon Sep 17 00:00:00 2001 From: Melanie Thielker Date: Tue, 18 May 2010 19:25:40 +0200 Subject: [PATCH 11/46] Allow remote admin to be used on a different port from the main region port --- .../ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs | 5 +++-- bin/OpenSim.ini.example | 4 ++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs index c5346d4ac0..7ebb5de6dd 100644 --- a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs +++ b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs @@ -63,7 +63,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController private static Object SOLock = new Object(); private OpenSimBase m_app; - private BaseHttpServer m_httpd; + private IHttpServer m_httpd; private IConfig m_config; private IConfigSource m_configSource; private string m_requiredPassword = String.Empty; @@ -113,9 +113,10 @@ namespace OpenSim.ApplicationPlugins.RemoteController m_config = m_configSource.Configs["RemoteAdmin"]; m_log.Info("[RADMIN]: Remote Admin Plugin Enabled"); m_requiredPassword = m_config.GetString("access_password", String.Empty); + int port = m_config.GetInt("port", 0); m_app = openSim; - m_httpd = openSim.HttpServer; + m_httpd = MainServer.GetHttpServer((uint)port); Dictionary availableMethods = new Dictionary(); availableMethods["admin_create_region"] = XmlRpcCreateRegionMethod; diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example index a5eb78b777..7b427a5fd2 100644 --- a/bin/OpenSim.ini.example +++ b/bin/OpenSim.ini.example @@ -591,6 +591,10 @@ [RemoteAdmin] enabled = false + + ; Set this to a nonzero value to have remote admin use a different port + port = 0 + access_password = unknown ; set this variable to true if you want the create_region XmlRpc From d95f232629aaef110bb9e0cd2fe7d209781466e1 Mon Sep 17 00:00:00 2001 From: AlexRa Date: Tue, 18 May 2010 01:44:51 +0300 Subject: [PATCH 12/46] Massive bugfix in MSSQLEstateData (now works!) --- OpenSim/Data/MSSQL/MSSQLEstateData.cs | 94 ++++++++++++--------------- 1 file changed, 43 insertions(+), 51 deletions(-) diff --git a/OpenSim/Data/MSSQL/MSSQLEstateData.cs b/OpenSim/Data/MSSQL/MSSQLEstateData.cs index 474f706ed3..66931e2423 100644 --- a/OpenSim/Data/MSSQL/MSSQLEstateData.cs +++ b/OpenSim/Data/MSSQL/MSSQLEstateData.cs @@ -101,22 +101,30 @@ namespace OpenSim.Data.MSSQL { foreach (string name in FieldList) { - if (_FieldMap[name].GetValue(es) is bool) + FieldInfo f = _FieldMap[name]; + object v = reader[name]; + if (f.FieldType == typeof(bool) ) { - int v = Convert.ToInt32(reader[name]); - if (v != 0) - _FieldMap[name].SetValue(es, true); - else - _FieldMap[name].SetValue(es, false); + f.SetValue(es, Convert.ToInt32(v) != 0); } - else if (_FieldMap[name].GetValue(es) is UUID) + else if (f.FieldType == typeof(UUID) ) { - _FieldMap[name].SetValue(es, new UUID((Guid)reader[name])); // uuid); + f.SetValue(es, new UUID((Guid)v)); // uuid); + } + else if (f.FieldType == typeof(string)) + { + f.SetValue(es, v.ToString()); + } + else if (f.FieldType == typeof(UInt32)) + { + f.SetValue(es, Convert.ToUInt32(v)); + } + else if (f.FieldType == typeof(Single)) + { + f.SetValue(es, Convert.ToSingle(v)); } else - { - es.EstateID = Convert.ToUInt32(reader["EstateID"].ToString()); - } + f.SetValue(es, v); } } else @@ -288,61 +296,45 @@ namespace OpenSim.Data.MSSQL private void SaveBanList(EstateSettings es) { //Delete first - string sql = "delete from estateban where EstateID = @EstateID"; using (SqlConnection conn = new SqlConnection(m_connectionString)) - using (SqlCommand cmd = new SqlCommand(sql, conn)) { - cmd.Parameters.Add(_Database.CreateParameter("@EstateID", es.EstateID)); conn.Open(); - cmd.ExecuteNonQuery(); - } - - //Insert after - sql = "insert into estateban (EstateID, bannedUUID) values ( @EstateID, @bannedUUID )"; - using (SqlConnection conn = new SqlConnection(m_connectionString)) - using (SqlCommand cmd = new SqlCommand(sql, conn)) - { - foreach (EstateBan b in es.EstateBans) + using (SqlCommand cmd = conn.CreateCommand()) { - cmd.Parameters.Add(_Database.CreateParameter("@EstateID", es.EstateID)); - cmd.Parameters.Add(_Database.CreateParameter("@bannedUUID", b.BannedUserID)); - conn.Open(); + cmd.CommandText = "delete from estateban where EstateID = @EstateID"; + cmd.Parameters.AddWithValue("@EstateID", (int)es.EstateID); cmd.ExecuteNonQuery(); - cmd.Parameters.Clear(); + + //Insert after + cmd.CommandText = "insert into estateban (EstateID, bannedUUID) values ( @EstateID, @bannedUUID )"; + cmd.Parameters.AddWithValue("@bannedUUID", Guid.Empty); + foreach (EstateBan b in es.EstateBans) + { + cmd.Parameters["@bannedUUID"].Value = b.BannedUserID.Guid; + cmd.ExecuteNonQuery(); + } } } } private void SaveUUIDList(uint estateID, string table, UUID[] data) { - //Delete first - string sql = string.Format("delete from {0} where EstateID = @EstateID", table); using (SqlConnection conn = new SqlConnection(m_connectionString)) - using (SqlCommand cmd = new SqlCommand(sql, conn)) { - cmd.Parameters.Add(_Database.CreateParameter("@EstateID", estateID)); - cmd.ExecuteNonQuery(); - } - - sql = string.Format("insert into {0} (EstateID, uuid) values ( @EstateID, @uuid )", table); - using (SqlConnection conn = new SqlConnection(m_connectionString)) - using (SqlCommand cmd = new SqlCommand(sql, conn)) - { - cmd.Parameters.Add(_Database.CreateParameter("@EstateID", estateID)); - - bool createParamOnce = true; - - foreach (UUID uuid in data) + conn.Open(); + using (SqlCommand cmd = conn.CreateCommand()) { - if (createParamOnce) - { - cmd.Parameters.Add(_Database.CreateParameter("@uuid", uuid)); - createParamOnce = false; - } - else - cmd.Parameters["@uuid"].Value = uuid.Guid; //.ToString(); //TODO check if this works - conn.Open(); + cmd.Parameters.AddWithValue("@EstateID", (int)estateID); + cmd.CommandText = string.Format("delete from {0} where EstateID = @EstateID", table); cmd.ExecuteNonQuery(); + + cmd.CommandText = string.Format("insert into {0} (EstateID, uuid) values ( @EstateID, @uuid )", table); + cmd.Parameters.AddWithValue("@uuid", Guid.Empty); + foreach (UUID uuid in data) + { + cmd.Parameters["@uuid"].Value = uuid.Guid; //.ToString(); //TODO check if this works + cmd.ExecuteNonQuery(); + } } } } From f4450ccf4f76db7f6e18c483ac48f30e0907eb2a Mon Sep 17 00:00:00 2001 From: AlexRa Date: Sun, 16 May 2010 16:22:38 +0300 Subject: [PATCH 13/46] Migration.cs supports single-file migration history format Scans for migration resources in either old-style "scattered" (one file per version) or new-style "integrated" format (single file "Resources/{StoreName}.migrations[.nnn]") with ":VERSION nnn" sections). In the new-style migrations it also recognizes ':GO' separators for parts of the SQL script that must be sent to the server separately. The old-style migrations are loaded each in one piece and don't support the ':GO' feature. Status: TESTED and works fine in all modes! --- OpenSim/Data/Migration.cs | 347 ++++++++++++++++++++++++++------------ 1 file changed, 238 insertions(+), 109 deletions(-) diff --git a/OpenSim/Data/Migration.cs b/OpenSim/Data/Migration.cs index 06defe4e36..7980c35ba0 100644 --- a/OpenSim/Data/Migration.cs +++ b/OpenSim/Data/Migration.cs @@ -70,61 +70,111 @@ namespace OpenSim.Data public class Migration { - private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + protected static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - private string _type; - private DbConnection _conn; - // private string _subtype; - private Assembly _assem; - private Regex _match; + protected string _type; + protected DbConnection _conn; + protected Assembly _assem; - private static readonly string _migrations_create = "create table migrations(name varchar(100), version int)"; - // private static readonly string _migrations_init = "insert into migrations values('migrations', 1)"; - // private static readonly string _migrations_find = "select version from migrations where name='migrations'"; + private Regex _match_old; + private Regex _match_new; - - public Migration(DbConnection conn, Assembly assem, string type) - { - _type = type; - _conn = conn; - _assem = assem; - _match = new Regex(@"\.(\d\d\d)_" + _type + @"\.sql"); - Initialize(); + /// Have the parameterless constructor just so we can specify it as a generic parameter with the new() constraint. + /// Currently this is only used in the tests. A Migration instance created this way must be then + /// initialized with Initialize(). Regular creation should be through the parameterized constructors. + /// + public Migration() + { } public Migration(DbConnection conn, Assembly assem, string subtype, string type) + { + Initialize(conn, assem, type, subtype); + } + + public Migration(DbConnection conn, Assembly assem, string type) + { + Initialize(conn, assem, type, ""); + } + + /// Must be called after creating with the parameterless constructor. + /// NOTE that the Migration class now doesn't access database in any way during initialization. + /// Specifically, it won't check if the [migrations] table exists. Such checks are done later: + /// automatically on Update(), or you can explicitly call InitMigrationsTable(). + /// + /// + /// + /// + /// + public void Initialize (DbConnection conn, Assembly assem, string type, string subtype) { _type = type; _conn = conn; _assem = assem; - _match = new Regex(subtype + @"\.(\d\d\d)_" + _type + @"\.sql"); - Initialize(); + _match_old = new Regex(subtype + @"\.(\d\d\d)_" + _type + @"\.sql"); + string s = String.IsNullOrEmpty(subtype) ? _type : _type + @"\." + subtype; + _match_new = new Regex(@"\." + s + @"\.migrations(?:\.(?\d+)$|.*)"); } - private void Initialize() + public void InitMigrationsTable() { - // clever, eh, we figure out which migrations version we are - int migration_version = FindVersion(_conn, "migrations"); - - if (migration_version > 0) - return; - - // If not, create the migration tables - using (DbCommand cmd = _conn.CreateCommand()) + // NOTE: normally when the [migrations] table is created, the version record for 'migrations' is + // added immediately. However, if for some reason the table is there but empty, we want to handle that as well. + int ver = FindVersion(_conn, "migrations"); + if (ver <= 0) // -1 = no table, 0 = no version record { - cmd.CommandText = _migrations_create; - cmd.ExecuteNonQuery(); + if( ver < 0 ) + ExecuteScript("create table migrations(name varchar(100), version int)"); + InsertVersion("migrations", 1); } - - InsertVersion("migrations", 1); } + /// Executes a script, possibly in a database-specific way. + /// It can be redefined for a specific DBMS, if necessary. Specifically, + /// to avoid problems with proc definitions in MySQL, we must use + /// MySqlScript class instead of just DbCommand. We don't want to bring + /// MySQL references here, so instead define a MySQLMigration class + /// in OpenSim.Data.MySQL + /// + /// + /// Array of strings, one-per-batch (often just one) + protected virtual void ExecuteScript(DbConnection conn, string[] script) + { + using (DbCommand cmd = conn.CreateCommand()) + { + cmd.CommandTimeout = 0; + foreach (string sql in script) + { + cmd.CommandText = sql; + cmd.ExecuteNonQuery(); + } + } + } + + protected void ExecuteScript(DbConnection conn, string sql) + { + ExecuteScript(conn, new string[]{sql}); + } + + protected void ExecuteScript(string sql) + { + ExecuteScript(_conn, sql); + } + + protected void ExecuteScript(string[] script) + { + ExecuteScript(_conn, script); + } + + + public void Update() { - int version = 0; - version = FindVersion(_conn, _type); + InitMigrationsTable(); - SortedList migrations = GetMigrationsAfter(version); + int version = FindVersion(_conn, _type); + + SortedList migrations = GetMigrationsAfter(version); if (migrations.Count < 1) return; @@ -132,57 +182,41 @@ namespace OpenSim.Data m_log.InfoFormat("[MIGRATIONS] Upgrading {0} to latest revision {1}.", _type, migrations.Keys[migrations.Count - 1]); m_log.Info("[MIGRATIONS] NOTE: this may take a while, don't interupt this process!"); - using (DbCommand cmd = _conn.CreateCommand()) + foreach (KeyValuePair kvp in migrations) { - 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; - try - { - cmd.ExecuteNonQuery(); - } - catch (Exception e) - { - m_log.DebugFormat("[MIGRATIONS] Cmd was {0}", cmd.CommandText); - m_log.DebugFormat("[MIGRATIONS]: An error has occurred in the migration {0}.\n This may mean you could see errors trying to run OpenSim. If you see database related errors, you will need to fix the issue manually. Continuing.", e.Message); - cmd.CommandText = "ROLLBACK;"; - cmd.ExecuteNonQuery(); - } + int newversion = kvp.Key; + // we need to up the command timeout to infinite as we might be doing long migrations. - if (version == 0) - { - InsertVersion(_type, newversion); - } - else - { - UpdateVersion(_type, newversion); - } - version = newversion; + /* [AlexRa 01-May-10]: We can't always just run any SQL in a single batch (= ExecuteNonQuery()). Things like + * stored proc definitions might have to be sent to the server each in a separate batch. + * This is certainly so for MS SQL; not sure how the MySQL connector sorts out the mess + * with 'delimiter @@'/'delimiter ;' around procs. So each "script" this code executes now is not + * a single string, but an array of strings, executed separately. + */ + try + { + ExecuteScript(kvp.Value); } + catch (Exception e) + { + m_log.DebugFormat("[MIGRATIONS] Cmd was {0}", kvp.Value.ToString()); + m_log.DebugFormat("[MIGRATIONS]: An error has occurred in the migration {0}.\n This may mean you could see errors trying to run OpenSim. If you see database related errors, you will need to fix the issue manually. Migration aborted.", e.Message); + ExecuteScript("ROLLBACK;"); + return; + } + + if (version == 0) + { + InsertVersion(_type, newversion); + } + else + { + UpdateVersion(_type, newversion); + } + version = newversion; } } - // private int MaxVersion() - // { - // int max = 0; - // string[] names = _assem.GetManifestResourceNames(); - - // foreach (string s in names) - // { - // Match m = _match.Match(s); - // if (m.Success) - // { - // int MigrationVersion = int.Parse(m.Groups[1].ToString()); - // if (MigrationVersion > max) - // max = MigrationVersion; - // } - // } - // return max; - // } - public int Version { get { return FindVersion(_conn, _type); } @@ -206,7 +240,7 @@ namespace OpenSim.Data try { cmd.CommandText = "select version from migrations where name='" + type + "' order by version desc"; - using (IDataReader reader = cmd.ExecuteReader()) + using (DbDataReader reader = cmd.ExecuteReader()) { if (reader.Read()) { @@ -217,7 +251,8 @@ namespace OpenSim.Data } catch { - // Something went wrong, so we're version 0 + // Something went wrong (probably no table), so we're at version -1 + version = -1; } } return version; @@ -225,57 +260,151 @@ namespace OpenSim.Data private void InsertVersion(string type, int version) { - 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(); - } + m_log.InfoFormat("[MIGRATIONS]: Creating {0} at version {1}", type, version); + ExecuteScript("insert into migrations(name, version) values('" + type + "', " + version + ")"); } private void UpdateVersion(string type, int version) { - 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(); - } + m_log.InfoFormat("[MIGRATIONS]: Updating {0} to version {1}", type, version); + ExecuteScript("update migrations set version=" + version + " where name='" + type + "'"); } - // private SortedList GetAllMigrations() - // { - // return GetMigrationsAfter(0); - // } + private delegate void FlushProc(); - private SortedList GetMigrationsAfter(int after) + /// Scans for migration resources in either old-style "scattered" (one file per version) + /// or new-style "integrated" format (single file with ":VERSION nnn" sections). + /// In the new-style migrations it also recognizes ':GO' separators for parts of the SQL script + /// that must be sent to the server separately. The old-style migrations are loaded each in one piece + /// and don't support the ':GO' feature. + /// + /// The version we are currently at. Scan for any higher versions + /// A list of string arrays, representing the scripts. + private SortedList GetMigrationsAfter(int after) { - string[] names = _assem.GetManifestResourceNames(); - SortedList migrations = new SortedList(); - // because life is funny if we don't - Array.Sort(names); + SortedList migrations = new SortedList(); + string[] names = _assem.GetManifestResourceNames(); + if( names.Length == 0 ) // should never happen + return migrations; + + Array.Sort(names); // we want all the migrations ordered + + int nLastVerFound = 0; + Match m = null; + string sFile = Array.FindLast(names, nm => { m = _match_new.Match(nm); return m.Success; }); // ; nm.StartsWith(sPrefix, StringComparison.InvariantCultureIgnoreCase + + if( (m != null) && !String.IsNullOrEmpty(sFile) ) + { + /* The filename should be '.migrations[.NNN]' where NNN + * is the last version number defined in the file. If the '.NNN' part is recognized, the code can skip + * the file without looking inside if we have a higher version already. Without the suffix we read + * the file anyway and use the version numbers inside. Any unrecognized suffix (such as '.sql') + * is valid but ignored. + * + * NOTE that we expect only one 'merged' migration file. If there are several, we take the last one. + * If you are numbering them, leave only the latest one in the project or at least make sure they numbered + * to come up in the correct order (e.g. 'SomeStore.migrations.001' rather than 'SomeStore.migrations.1') + */ + + if (m.Groups.Count > 1 && int.TryParse(m.Groups[1].Value, out nLastVerFound)) + { + if( nLastVerFound <= after ) + goto scan_old_style; + } + + System.Text.StringBuilder sb = new System.Text.StringBuilder(4096); + int nVersion = -1; + + List script = new List(); + + FlushProc flush = delegate() + { + if (sb.Length > 0) // last SQL stmt to script list + { + script.Add(sb.ToString()); + sb.Length = 0; + } + + if ( (nVersion > 0) && (nVersion > after) && (script.Count > 0) && !migrations.ContainsKey(nVersion)) // script to the versioned script list + { + migrations[nVersion] = script.ToArray(); + } + script.Clear(); + }; + + using (Stream resource = _assem.GetManifestResourceStream(sFile)) + using (StreamReader resourceReader = new StreamReader(resource)) + { + int nLineNo = 0; + while (!resourceReader.EndOfStream) + { + string sLine = resourceReader.ReadLine(); + nLineNo++; + + if( String.IsNullOrEmpty(sLine) || sLine.StartsWith("#") ) // ignore a comment or empty line + continue; + + if (sLine.Trim().Equals(":GO", StringComparison.InvariantCultureIgnoreCase)) + { + if (sb.Length == 0) continue; + if (nVersion > after) + script.Add(sb.ToString()); + sb.Length = 0; + continue; + } + + if (sLine.StartsWith(":VERSION ", StringComparison.InvariantCultureIgnoreCase)) // ":VERSION nnn" + { + flush(); + + int n = sLine.IndexOf('#'); // Comment is allowed in version sections, ignored + if (n >= 0) + sLine = sLine.Substring(0, n); + + if (!int.TryParse(sLine.Substring(9).Trim(), out nVersion)) + { + m_log.ErrorFormat("[MIGRATIONS]: invalid version marker at {0}: line {1}. Migration failed!", sFile, nLineNo); + break; + } + } + else + { + sb.AppendLine(sLine); + } + } + flush(); + + // If there are scattered migration files as well, only look for those with higher version numbers. + if (after < nVersion) + after = nVersion; + } + } + +scan_old_style: + // scan "old style" migration pieces anyway, ignore any versions already filled from the single file foreach (string s in names) { - Match m = _match.Match(s); + m = _match_old.Match(s); if (m.Success) { int version = int.Parse(m.Groups[1].ToString()); - if (version > after) + if ( (version > after) && !migrations.ContainsKey(version) ) { using (Stream resource = _assem.GetManifestResourceStream(s)) { using (StreamReader resourceReader = new StreamReader(resource)) { - string resourceString = resourceReader.ReadToEnd(); - migrations.Add(version, resourceString); + string sql = resourceReader.ReadToEnd(); + migrations.Add(version, new string[]{sql}); } } } } } - - if (migrations.Count < 1) { + + if (migrations.Count < 1) + { m_log.InfoFormat("[MIGRATIONS]: {0} up to date, no migrations to apply", _type); } return migrations; From ade2e5a9d21f7ee10afea4f315e37999b4b760a0 Mon Sep 17 00:00:00 2001 From: AlexRa Date: Sun, 16 May 2010 16:24:50 +0300 Subject: [PATCH 14/46] Embedded MySql.Data.dll updated to 6.2.3.0. This is necessary to correct a known problem with the DELIMITER command in previous versions of the client library. --- bin/MySql.Data.dll | Bin 294912 -> 335872 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/bin/MySql.Data.dll b/bin/MySql.Data.dll index a94dd3def8deda655b3e0a9304dfb05e135bd398..7aa95ec345a5d23b2cb6a7da21c534328e65da90 100644 GIT binary patch literal 335872 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

      ^6&qHKa`LQKA!SalzK~7> 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 literal 294912 zcmeFa37jNFl|NpcnUzOX^^slORn^@yUClrbMIAlU-5fI`Fart#a(DsV!!ZMhGL4du z4Tuyq4&LGbGLF~C4A6?K2j2I!c&`UKvaYVHj^c&7>bl-83cv67MPyZ0U&y+@{rx|m zKiQp?5ieduym;{<;>CU1=2s@nL?U6~efZ%-;zRiI*(ATq|LlNsSMeiViT8Q;9`vD( zQ|~?K>6dJq9l1OVo)up3oRNzzxa_jv%8?5%9tp3yY-HPIBTqQvX(P`Go^kP5XJ_gV z9rTk=NF+|}Fcbgw*_9_pv3);b9F*>G6Nx8-su2af>@scMK}r+8zyyIiu z9y311fyX%T7zZBXz+)VEj02Bx;4uz7#(~E;@E8Xk)V!i@2@_2*ZG4NzT=t$=e{_}@k zw)5z(%w7Alt=IMb;s>{MJ@urHb634&@;z%l`MukA?s)JI>qdWf=u;kgTebW4pUh31 z`Ag@n%f9X%d+MPtJ@=%|cfRxdRiRO;B@!vaY;<5y!02xn{Nx)*rBxm_>geKIX2%duXD(~yvPr|pjb@z&z4}grKG*#i zm_}WQ7_Bpm{M2aH6>@wxSOdRV+o|?=z8$QEWpysS?wt(Wb|Vl_WWgvQ2D{p0)RXX6bA3Cr?gE9mW)djn$&7DRT@btO6a_9% zuC$A5CJXtj<$1vb;>l0vgGo}d?ogswHOo&{3x0BaLHS5+>V^S{UFRskxr`TFL%jKP zi^88lJP_rG1DUd1zSN5}^-mi8WevGy1Y?+qEiA9e#4gAwIN~R3Mh*z%k=giYGdWh{ zV@-3i@$sg)&QxxAI}=y;;b+4gVx;$o8{~1?sH2j!ax>#c83DLvEBl(2>Z@SWDywHo z>yQQ8(v^%Nqrbs8lv$$dAA<-;Ce~H{FdK4C=@}+6cRuc9R^jH9OTIxWjXHC&+7|^w zF$#VI{-!FuZLnVurczdQ?Bavuo?V@^^J8mN7&RvZ<1VixLsUYShoIzg6+rzTL3C+7 zQZoB91ahqo1hoz+uakpGl^0EWZrrxl--*(Yj3G^z6H=cZ3cjKm_C;<}raiO9G`FQ} z5#6*AY(PX#&beuuaAAhUfV>GF2YC5(NOBf7WBW0%HXsL9`B;duz)WQaOKB~471MZq z20*->C6qfBIq@{MpVrc`40JF&2#GCIb|^-u+x+BJbgret3S4Gii|n{Ic_%@s-b865 zJRJ-~c^WzFbJ18CAib;}&9T;mMQOy&)9FgP4Oa=F~>6G4^a zYUNyKcxG~SnItelOtd}4O!HEC};_^ z7`}=Xf*X`UC3$5gUIbpD*!V_p3cRQ6@Bw6yh*j_;0POJ3uou%iQDhAb$#*0!&q-!z zKn;MnmnXvBr`@*E4Qj>Z+WrO@b331pY}bHK1CWmczC9n~!TA_@W1g4C1JD-eQ|4nl zYd+xm`Ci^OAMi;5P(U@M-<}WnJpkKJ1(!6!fH{wh;{b>labC>)yr$U*P9v9t)A5UP zY$ZbEm5clcQFJdKk^+>nb2^8Q1C}ZUc3y*69yO?-L9L==4`@)U_}GIQ)G9)@6d|eO z9BC)fO!#L0#%qxDY|>BWiW~O&$>0pc1XA{to(x0U&MQO4E+|8%lbh&bDHhJjT8?iO3!A6YhHp8pmum^JE>TiP_Cu15Rji;IeK1NLDKJynQ4P{s zP7R`p>}C~7w4E;it*j!&&)9xiqbl-iV5HKA*C5ms(v~be6$aFLou*xS8jJx7iCsqZ z7Je7VrKbZ_I+O6IPO%a|OQ021bxMtO3Q82}l>V8?g9oJrK)K2d233T#+Rl~Ef_G}% z8c$a{D(JJ@-BzJ&OMzs0eBq+yk!jFE#_~A$$i*?{V?lAezZKeJ#SvB962(#4{I$pr zs3yK4Sr<$p>r(b;di@~a4`sK%!-T%|QOHKIYj!i-M#H~?xw+CgVoqA9sI<8s=7Khl z!aShON5DL&&Bwqzq|GP8yh59&VP2`t&w+VZo6#A(yy$7mi)l$|%d2QfYs+o4WVGdO zS~|t@P<99D*U4~tjncUwyL!BP0<=|XqW`V8V&uy?)MZ8j4N?Ny*nHkqk90zEqjVl( zs~zfuWQVd0IwAR?ES*ls1d639fg(KCk=L7;$8QgJG_@Y8Cv)VT%#m*)cZ!GT9KpL|K&Ys+!8^u%+~*A|LLu~%Ctf5oh}ByT2^Vx1GF407RW1eS7)-_+adD0{!&(%CmaIdfa=Cd8mlc53A6->{Jay?+fwXg!h$rcj0|K-rMlriT7=I-;MW! zct4K!(|Est_p5lB`-$e+aLAH`=+*{q=ujQk#{E$3+|lt=zRi&-;^9wJa?W1u|pM;b@|q5;F& zI9MJkTQy^-JXjw2HA*+Y68?ko`yT@NFERg0%xGzV^Gh*L$?r6O!v~Qgs%J5*2Cpzs z5DjAG*nH2PkAmGOsOH;bJ8TNYetzw#)q6UK=Kl{l{g#BL+=e?3socpqiBW^Y(fxrAC+zR6Ss5Wwm~vE25?66Q|aIt z2oYUq1|K6bKi#6O(+y_fAER1Aqfq5rQwBR)iZj7ZkT{-k1EFCZgQ6H9%7 z5|rBbOZ1}`KsS8|&~jo3^>_w6Mp5-K;sY(%P9?B#uj*gFHqT*_S#&G~yJ> zA%$C|g74UlPf-MukQp`f&$(3bA4BU zZg3TVJslWI&w*((h{*&W(3=A9y=uw>yF1rC0boDrOgfktSSRM<<0g;tYKJ?ual1C= zTW*Z4z7;E@ZqAMIcpXP?{3PZIGWcDE;q_#3>tvT#OFNh+NT$^YeX@A&q>lJY$V3%D zezFf`@@mk9GU>tJrpLXb>6jaDI&RdCw=nyGC2?$=T;tTLUhOa)gr6L{vYqI5IxAaEswRb`CyQIgO86ZcTZP|4##SsBF4CwbSRhnWti4sK-S~1; zo9+I5tBheKi=%orO!Wb@GB<5wFL)3p8Jiaa>WCpWhz}WbqfxhUry~96O#22#)XqjA zXx^lSw2kW+R`7b1w}yDlR4__Rn7hYuRpZ5Kv~dcm9XCIfaUH3XC;kn3znSdKOXSl8gOa$dHBHyHRGtBoXb=;D90$)I%5jnhRUeZ3$6vO zjJu4v%2IP3)WCIsg_wvH6CaJmuyShn9Ol53?HGmSJA) z$qn8DE@eGG&ZnZbRdWpW4DxaSY4JTIij}qB36eVfPCs+gwvEq4U4!{2%1(Z&!H*UT zrJ-yGIl=AlR6enl!BoqjxhBxA8;RZEO&<9#l}$>jnn-h!hCbs2&u3mq+nlv3$AQDm zrWwPp*4hUS^!t`-R@qKCC`;0;V#t$q z`coX;z8;!5{VIxnB5{LGLx&bmB?`ftkUk7cQ7kaZ{#`_bvLi}vd6zN5S=EWY?HEo!}%VR6ppDCjk?47-%%DdLOtCNf&cJ%+L?TjL~STQ=1Dg zbD}n#%es{wvyO2<3$^iHAM#C6D0Ywk+&1fI5G}L*O8o9FY|c;R_9_c-lIvLWDGWck z8!`wXB+f4RQK9(Oc*?gBo(QBy@ZC%H`jB!cxYpWdMp57V5)}8*EBKqAy5xF(bC5CH zn{Y9C>rL;@dg6aqHf4_1Uqf*}{Pi{w5W^FtX z^5>^(9cACjPb2*{QjKp!%C72vM8-H((~7FdDL>UR?J7)N0@erB2M%WNz(^ zWJe{8yza`{m2)B{=BG!q;3S$#&79*aOg&@~iIokFLn|D89jJ8@6tSqr?n$}1YC!UQIVP^cJS zay0Ah^F68E5Cr(kFroe2ss$iFt#iI#=X{j!(+%diDWnx9UTOHr28B%n&graVOqBMw zp#*yQ=}s@d=GSgk3wwTdry?)kM&)Q0s{s_1soncbRBH6CF?U1FQ6*(miVE{FE&TG+ z9#|oTsO6MVPFR1iPb69x3Y`&b6)94w)EvA;r`o!uv;*}^e(Jtk6+^{Ce#*Bm8O?U? z^*g~H#*_DL^b50gj7DZq;pml+`30nODN?$$-`)GrQNjovigHp(XbBx{(f{lOs>B4U zYQNZXBMT=~y?myUwOt48^YpH%{Dqf{ruRzgh`Qsakd*a?HTehZ*yi|idQ2sAWncy>Y#fub+0i#|~tQTS1qQCN|Gq>pLj9GSe(*JYm!dJwYa zD1|TIw0<-A^6k_wK7ZFk`bZn&=hNf&CS1ouXE|+U%ub`L10x`OI-m+#$s{Uz+ri`N z$J0-0-jkm9WFFz^e1xa#?|i!d&PO=Yo6Yv&>BoaPSb6gLDa?BY<~@Ut@C-e|v*Pc3 zR{oujzVq0-z&elJ z3#^a8{=r9LzZ3!dMCFC$m}NLByDYaXr!1RYcrnZ(11!+b5-aeI;4R@@i+3H~O?aP- zcPn0uG9-53y&dm8c)yP~{;)2I$ICbwALC*?jAH~Z!`_5%o8>n+P7(;CDB{#}S;>;P*7a z$15=UW(efHP4MFZ9$|{5KQ+4leNC4qhzqFEF7I!;oWP(WdOpwupGa^-&j*`ebSF4g ztQ2k;1H%B5JXmpo5jFHkUWnviP0bm!7QltvK4Cs6G2&LDkGos?i76gL- z6o{0x)R~mN;7{mh7II^3S5t&Ql(0!i78%yXx8ED_tofOmZyas>0BkZ!5h5!yZu)k%9C-LfWd#pex`~v$wyF5y5&h ztg-lCAB(?=_z#kNX~usTK1w;dFarqUjIZKgALgM`F##c)=&hjX?LhhK&> zDP=*0b1OY^E$cS;5oOXqTP6j2Nkc^Y z!R@r$ns$DLc6!x3Kvfv$!9H49@i3QWQK!TmZ>Nyd!-&yg@T17O(ns3+f^>WQbMg2`+v7)Zlzirw@n6Jo zu)jV2?4t2|?eV`c9{=k0_`wc|pI^rRjYk)Manbm@Rs7PdX?}tKMgq-T;!wt~+NOA^ zHtK9H&EQS&nzFGj_fBdW-~?OE1>mrPcvTh4e0`B6x)#Dk3|3X=)J@xJMqfF+o~U<9 zu)&-0311Ju{^v$Q8r%gKruD?>opfTvBD8Hzc`O=S!s$y(`}*b5PEHB|K7Y};29|dU z{sAPXoqX^Xd^P2x^s;!OPFULMqNSa#U)qUFF!v)L7va)g`dU0u@2At^y#4CZzJ9p0 z(_fc%%BGhjV{&Py)0TGPg3u+>wPg`sdCZ8d`vKHeC6V5qELy-*kXsy-6an-tH5Lyg zEd>w-&&5birnL+fP|6&JvR9!Vs$p)gelkYtD&5)uhddn4iTSXCEFc&Lw1R#bFhJIi zEh5Q~5{jXtoi9PA$+AD+Q4W+(--$aULuRkx1#bmq3O5-t?+|D&0*ytN49OP2i-1>q zG+nX*;US~a5nDhD5-1r!UBMtIAW_g{Upppqs2#$h0>3Ng`(-%+e0V;b*$?>Od^p7& zRGtntM$xm}s1>!KkuneW(_-!{JODi@0@<>@7SjOGp;I!(8R?E2doZCEZ{gV#QO~pz zPe8qghCHrcP=~A@YKtyO1(%8>)CksJs4+RAA}jxcw=odaxX6q{tKBa_nUt|QQ~HC@ z@nYfMnbh?;>UCS%SEwP0%HnnJLXE1amj{^Bu&cIAj+M1mbh_4x&{~L!gPA<(Ahfif zv?x70sR%@ESyMr%8g`@&DFl@`&}bzlK_hyBsK=qYV`WjUY~Hjj;&18gUsxFLd)Zhjf}nJ62N zBJNw}#r;mkjgDyPT{Ijk@}awZ=&Dkmdp3B#1~lYm&>TM<+1Z;gu4C6XxD_f!nj0Vt zr_4=Q&hAsW;%7-z3$lk9#rR;BU;QA(`&R(}H;i|p1f2KTy z`3_V`>|Zu@jM9ryvQ*DaNm3vCz)Df*G)lLFYv|Ro+}SnEoS|4-`7K1gM_T0*2-~4`fPLftRjgrB_aL^pJ~d6R-JP;%xGcd#e5!kO}b4%uS?Q4NyA# zD_Mx94TCVM6-bBEnHE~Ba{Z>~5(kimPka0T6$))OuLx7cs43PoQE-M+=du7^owkRdUMFIPj zT|0E~3P$--Ssq}=vR&Q`8Dmw~92T5?KWNA17_)Icz$mI%zNR+Ih}~3n3`^2l9#jj3 zyNbPBSxeNNuVP~lckws2pH|iL9}G|Els$z;0)1bOpJO4@-H1)^m-zsU&HXZ^57Ne! zjphH6-FE0Z+dDfUGqN)#YZhcf+}CE&r`7OiC(MW7GX`D-)H1_CoNSL?in8i3Kic-C zku*^S)xI=I)+6tQIlJX+!Cn~bAC5xgUYNF>XrG=B_%;ABRo4z5oR9H;ZEIQ^VgLJE z)3_D0L`u7V)+DSxn=C?WaKX&y$_p?#t5~@ z2E&c^f&ZB1(nld8MhUtLw}C%Ekc8aa2L2O(C@&lnLp>$W-w|$Wd$$DqOruURa^`)v zBGqEd2Ok4TqDY|_Xjx4rc+P;ya)N3B8n7@YZ8|WPKF%Zv)sEhz&JZV~*jHu@=Vq8th!-olN`+xnfJbs>pg&3B<7m^fjo{2DL|7 zRkHG96aSs0%}-5k{1Bu5DAPMOFTKOG2cJM@A23%RNI)o68~THU`||`A*d;o?p|Sv{ zH%Jb_H_J|l(0_T2>*vmUJ?}i zBZA0}rNh^v3RPN^+1e!6!}SQk_dp_6kEg?jn>Z*nT>F0_m~sTd>O=8hXrf7nYr0Sy zW1)<#HkpR!!JctyMYDQ1N>hGf%nfmp!sRBmnZ5$w(mfy{Qz@9$esS)GLp6n;{Ol*; zl7fQEuxHBS(4EfZ`hgnm;TTxqW;wH!FZ%kqSP; zpxw%uI4NZY#w(#Ib?~^9m3DOytB7*JXNd*fGZlP}KcB}>^-zS2YAeMhWmp)bk^Tt~ zI51c&$3~-%b#$_8pf-oajjmeUh}E4~+~}#rjZ}R_-i*YT6Bmwk^fRByA7@z?xF#{mQIVa_bp5N`urkJgEumU zv{}udoE0W)CuipO%wbpu(rRbSYOm?w+zU2%Z->B2tLMf_hE*w{)HO>+r<3IrPdT?ncoY%1w@y9Ifbk5RFvr9X@ zd}*gwFYWZUMV$H|uw4+!!AaK~*poH~`sOg`1(~zacW%|&R^^B`=`?IFWG&c|PA_ED z*RngMFU3UlQ_F~|mes?Jc`Obt)r}d0YqEL(ib7{+=L)))v4(3VeO_9JOhT# zb=LtG%iwndC2Mt|_v+(UHo9%N08VCWnu2oPI*kIu<4i+y;G79aMx*GIU?f>jW>9Ds zPG(SEy&)O5jSwlP-hj{&fheC|z70gVY@>rB*9M@VwE-wzUZE{6iWSm87sYo?EM;n5 zgp?(3u#E=Fkhh`@MA`9Hwt*-!-f$dL`ZDs>RE@8mGYF8?sSVG=WWj-ySH;5Q=fM7* zGRK;zR~?KO3QOYMcvEb6@o+5rulTM<9viVFu>DWj#VrA1!GvJ{SXQ~(*kl$0Buq6z z^0Xyu8Mj!9JWOI(LY&>W54U)j6Wj~`oh}C0J-pKr9Cpyn3oF_$mkhZlUhT5)0++cf zUTw4QGD7B`77nh!SI2-jS`B#UFD ztDJO0vNs-91Sf9+|78?M1Seww|8oQvDswXrb;KqP-H<$vhbjP}v4y5*>s+PwrqpIx z?jlAFn^KxDwrN1~O>50p@28znD0)L}#?JsHqfn?X9EVN|%jzm*9?$K-0Z?l54`76U z3NMDO6I)_%_FXTA{c$38>fhc_y`K?tpCl~C8%^3&}Ln^4VEocB! z>o!xYV`A4SVjXJ+V=bVFHAnMf4VLtv*kECQ=or{L~gZHT3$URueNF`a4pHh2e1toGH7ct)snntX-Sr` zq)1L{$PEWC&JvR~#7M8m>HYXV2XIV?H|3XdiW3i&?z?fmoK6F+os?z{j8OksjXhtYCv|$QkTa0-*d9w) zZQDm7x5Mut#s!=40srGXc#{0VVFvhQoeEDWRYu>b=6xqTCmg$s(r_I zIQe2?Mi+YUeE?NHq4@W-L@`vwh58rfa1+OZCrJr0rS#;qvSr-xsAkA+QUb1al$GOZ z{c%DT9xJ58w=_^EWVwkkQ>qC^uomKq2Hs-4#%1*r%L5IiJgb)330VMbfp=Lov#;V9 z$-iLTh$7bO~9(Tm=i2;;GYJ zIanbsOr!Wvy@qzOvdD^R#xNaZVCn0i6DLiud!>f2xTeOCV|OrqsLz2gC0Ejw6;60T zl#Z&4a}6$`uxVE(yf|{JeUlX=*PL7dS>J?ka;eHiI#V4h0CQ3SVoo{Iz$EQpD=c!< zhh{IU@z`Q0CuCXg!ZNRR#5m#Df1k3GYGeCumNm|U?!@;v#2;=0ZL|M^SW;$n6b)5w zyl6|=2=9hV9-B?&=t~Sn&UwK%fQLnk>;S~n!L(?D8SJQ+0ZBLfHhc!(1d=Pmk-6Ys zVGbW4^jl46UP1q}3B@`JCjpU998bE;{5)M{0Dx8-F#B%^DEKyhbe(s^^3G>2?>xJ_ z^Nq_p-?hB+XP0;W-tx}L!m{Z;XnE%omUq5*dFPid?|j$t&L3Xh`CsTV;n*_*(FFC*?Mxos#N>-&)j-Vv6+hgok*3 zP&~cx-{;3dvGl?R+rU~mx75;4rJJYc4dd9&ah#HwNc;sNaR}4)(?n;fB@>98xqw#Zos)?B@M1E3p?y$z> z(F@Y{&EX`9D9&^<_Vk=v^fW5^_PLPVoH;+!3^Y?1(9vgrn$oB^&LkIh3up65MPy;VBW9k9%#@N;Mm1nK)Q`dto(;cJw|XHZ zAUv;SXSS=z0t_4~h2IOA<7%M83z@}*oy=n$1T!|=)(V2Tncqo{XaweAY&Db@GUvig zBTXWhUExVBJM(B{2P#%cnGS`y6JFLrVwQyYgPMUb9}4kk$$fQt7@I&ZB+J92S{}&f zVs|SF)efjJ8m_Ik5=Wv;9nLbv`nIi1J&=ftN~_RnUHQ*+ZVK4~XW4VaAzGQvUf_&j zomfd(;LN3It%9_`S$6R>%h>{FE?#RDs0Gek%C?L%7q%_q%w=xNICIh4GS2OraTbuq zv)Y&O&6C@gappPh%Q(Mnd1o%9+y9a!bBrgxFXR0C`Zy5pH1wIF?BJNH%>?UD7^8T~a>me0YWUup=M#K%{O^ zZPGqOZBjm*eE59v;Y2>1fk@S%`lNk``lNig`S2Cu!;O4Eans6&3pGmn5H(6EM_`mn zN5m<=$tvH2I;DNIsZ%-~sVI(AGaXc`v=33MR2=Cj9qGtNx|t49ue29YuauWeKDf;@QSx(oww0> z5$(o_x+K({J_z;gMCwlLSGMU+H!cx6C;HG^f-9GUV%@{+_wm6v%>DRuR?hX}OAJPu zOAOF;&f)?%uTteXf;d@I57w|g$0*7_!L#n+tJ_o19i8H-mp=Dad|8L?)$VYE9{|;n zC9-I|mc0^%m!^AJtJuP}YCibMT z>GI(4Y4+1N{(2S02~I+o`pnBQ_)hEbVE^E@fiDXy=c0ixt6IZeD~x?vv9YfwweZ;# z!Kpd+6`lM$i{MuyAX(56UIY(%j)1-8XOTP;*_k)Enkt1SF6l(8-iG%) zfep6daS^9)wJ$y5>P_ET(T2xmo4&QO4aW7FzBSwi<3debJ>#_jv$6!L7@N!mg`Ujo?EhRKDO0QxOp+e#$N++)Vk6Aa^$<^j zS=|nSD;yYwjw!mrp?ao+LwM9AHzok((5xK3oCG}>Z-wu;!Ko4Kf-PZI#4eXGBLYi+ z`3zVvp#h5(U_wT|D7`i=J8%oK3Ze%aIDU$S;MMiI4~$(1scJQ5kyE{M;{zy-`SC1D zR;|m*$K2=4(aic6fDAX>g2brO_INjZPSbL%8#bDj^=^1$({i{Q-qp0Mal=nGEtSdy zX#Rqx`HT8{ul{~TeRBa;b1+ePW#}u9$zarupCLu%7hsp)FJLf6xJ01wYZ^;GLGl3q z0};+LN~mbDgC;=dHihWGh*bG_!|W^lfN-ny8wL-6Rf3S%I6Lb<>F=%c08u<$R^va~ z<11rTWz(bPw}db;0KhyFfEWPycLE?=+{c7=Ngf11 zuz8h*_5~NED#K0NB-qM;c@=w(Rcu!mgNUy#0TRCLJ-NAc7I^xjQ481FT?wOyq~~};hV(g@M4HY;9tS_8yZG4U*fzSuRZcd{7#=hp1fDT zAHz5P68>4daUS-<&MNB&ycq0jdzrU{myMMT5o4p+r45A$kctewks%!!vXLPZ8Tu9& zx;122e^==5P=x76hMvgK85#1*z&tY&BjE3;%rjGrCv)idAM;T^}j zL7ShBZxZjhcrVBMBD}ZbJq$0x6t~CY`wYC-;N6M$cD&3xzUwdwnK0zW9Le0WA$RCR z=HG)fZO-d&F%=myks+-OgZew9zXko3y`$PZ5W)V~3VJw#aaKs1b4?fsRA%z(NMM{M z^1V=?u~tPy_^LH5ubxrt2~cmRB4|lN{Wd5E#;dMThy#P4!&?avUrLJmFRc$I>&Z2$8wlY=K zNdsV`KGp3VYCM!&Rl$lu)vM1%D)|_4djKk()-3{)=HLtziEF`HRoiyQEIchxTM%$fAM?P?1T91fZ39RK6k*?!kQT~aTes^ z49Z+SI241UsqJ(L{sQdL&eC7;5r8d+oLzMpQ|r|FjoEvFn^sOv@Lr%*9LEU03aFDg z;CQ8n0Q!!LhDxnV8%P{}8n?2mdNqshlNo1l1KMZojqE7nR;z!7XSGgharbXF-Mitx z7^B%P^|75tAJky~lcm{@r6b)+htWz$YCE}M2M>c%JNPyN7cWMT=)ewE$5BbpcP03V zHJcRujN^@nB5cbSQLwa14%J#E^M`*9e~3_Iq-K#Ew*ju0QSM6b~SKn#X(O~%ViC; zMnkWV<9`A76F0m;rRzvxhY@%Pa5d$o2EK3u>__oM0|+)*u$rYIDvqTUWcV|2Q#-ak zm#VO=HtI;CRl)?1zMCwW_%QhNH1H`mn?k6m5d)nXY^7#U;cwXifIOv2hrtIpk)KTi zDahbQ;b+?L`$yaGvCE@{Ux)%dqKQ;Spq*HakQ*#@BE(V!b{=Tf1q-&~J_U$syRK`F z{M1CFkPEPbJ+&J5vX**aXn?VzkMcf(Nfd6h=ct#3^gG}gcg+Jq3UtW_e#$81?C{RE z_#0#hlxTiH$;gY2#gTtaY8qsnp_1Bw$XF`5cKGgQAi^13Q4hy>awAU=)TXC<=X;{# zVxAz3O-~QZ_e96VJVBV7p3K#48DZ4v*ygFuxP{ZJ%eYI9o2v8ZudRf~*WP+1~URV$x5;N?;WlB;20oxu8s&$@Mq z)Zu){A5tqUf(`q1x<(LgxrQaw9 zwspDE@yJ3M%Yk+v=PaNB3|1nnR3&GaxR~wn%;Rp;!eUkhxBDl5B5jSCn1P?O!M_}i zX-j4*XX6reXsIdigfV!s>x=`P{o{EkTZEyuCdQ=W)GVyPJqTxT(V12+Rq6F`D;Io| z;A+xAhaDH=;c_Tz;!eAU)5Fx=ie}>Fh<8fIo6DG4JBP*JmtvEJ^C;u5wZ}hf*F4Xf zOu9I4>afLW!A|=rZlJ;d?2$;w#0~vr***_>vJ%JxUIW^8S6z-5(g}s@J`b{+L}o2A z!1DR&u${LaPJImI={1=li_ z=_b1w1MYIH9qT9i$JS%6^Su0I4tvTZHc>?z5mQQ&fn0#%0+Z8309OU01h3iPDr6`^urYS!&_hjKZ&F%@O} zRn0PP1b2W{xXoFXyk7xx|72eI4t@liz-8te4VDBN{GMYwVzh%a%vjmA8U%&85=I~n zg$cWG1;91c0)TSQTR4Lf9OGMvy>;h6cH$cYvDNQ>WV{?8x(VT7{pTqR_6s0IZcCKm zIJsHnG_WQ>dxwf94$+WiO1Xy{WR7fQB#gxAhP z#%( zUo5(8cKDH&wNM_QG(+P{U5P5gpapHXwj62XN^6=n6oR#|;CvP|(^RZX)HUpd^D!aB zpF+5^=&4{blj^y5jNGTJb4rJlqs|AF`mQBaT+ZfpGd-QMKt&VHat28IFVtT z5(At?z~&g>83bGs1F-rC!zLhP;Z+l9Qf#H#Itmn)LsNRdmYlXLvU8^oNs!W1K0mw; zL3DS>`tB0$!&HTSN%&7pRW*(kOsO4>hivT0v}Zqqr8vQx@l##|eiz}CA@CF3Yk4r9 zzaFt!!3O;1$2u@watZ>fPFTUc4C`?K<3Pph(dU~z8s=*iybv4%i&3Y9*3id6b%rLN zwkn3I_|-EcD-`~y)V9h+$>6c@4`MhM`UX&P9`aVrh2m1llUT#OhtY2YR(wl!XXTXm zZfZB=S-^^!&qvi!t?D_{mw}sl^8ni2oGXVi3m%pZsipoETn5QHqV|sF)w) z0cfaP)P+#>%@0YOb*&6{Cvb;E(Hq0{W*zwk^hcaT)_}swll7pystJd4$rIdTP5Wjv zUSiKFG)tkODHG?^K)DN7c;m1o`j)N|n>h(;tTj$kekyJo213mazk&po!*B3c>MD-h z+2CPPDx^m^dk?sjflwp>roL2c!+Jt_fVQQt56;J!cMzZ_ zXK%N8;kw7RK)KSf4ZyXHZC<#Vu?;ZqAV3f%7^n=QMY>$0*xILoZQSO(Ah--MVhPtA zMrJNBRA#mIK`o$-Rzz&vhK9H~R06qU`wE?&=dJp)r=aD=_-rtRFOJh-)qp$sj>E^Q zuC`>=MS-g>(zZ16j&9>)>niTI19WY;z`3Pw$(Y?Ch+`|_FlK+tX(T&92PcJzqSB=h z-1Gq)c89wio&)jtPIT9&lkf{_O9$JXGvNOM`iGYQUN8cOS#ewRyx<84t7XjvC%~?b ze^}B*X<@vGw@<=jeax{%(s|)xbYAhubV^{vLty0VHiQLzVR^nDCKrY#D+9drdOl}y zl^+WjFTOhPOdpjrCChR~Qe2lQG48^7wKS~h;?6_rz~#!U3kDF* z48p;=iNTK{`?y_u_8s`5CcFiKNFSR~G#EVMPNVCQiTED83MlG?%4lqmXGE@ooNvG+ z$enOCO6ZQF{IcwHp#OxKLe2q`(>dseOx%W7BRrgKtgcNXBs>*aZO(Fu8I(ING0Rkn zxC(tYM6we%bMuSSh{QL~UpyUAxU!n5_N@bH)=Z`2P$fMycp&9gZCBOb3O$^m6rBMN zIF3CIdK1DdJ(($G1{kGR3-Q9pJQ!KS`S4JF>y&_C003?}t@4Bcj{DRuHLjzu4CeJn zLPZDt%4TdQ$03YNDmqL=tTpP)>fA)psAK#B$)Z(sJegsUTn8QwpQPyGtfaQ6*6#rK z!nZdWhTFb{FX7J_H6zNxr*O5e5<#%45f^r-x)yuvQ30iDeK-Sh4f@5be>JRH#Gwf% z!WYgqISzdx45-}!*U~-sk?IzJU^i=*l4L`zI#|dwu)619;N|T6?qeSRa2U1QILu}IOAMh|iq=czVnhmTvIPL0a zOXsS@))yo^(odRi1t!>;IP{jeLyRt>^|cZa{3>_==WsCyn~%;Kq%#6t-W04=$3t zk-B69N_ZT`QJn^=n`j(+`-LzUHp|V!jh7N$yjEFWCYIBc<>j!TNfXT5 zaO3s-l-|mMEIh7*66jz&D+A-pqy$&MYd%W;PW%j)5WtBv;41UnUQTj2#o>uxVEP7d zM(q+VYJV|{b_@TGW_-j1|XW$MMmaD*VmooXWr2<9rceNKfjAzrh$B+#roCFGmC{PD>rJ{VB-IsLu|kTYb!?XNT`bed#8pTc$1Ko_ zNF^Xepnfuhy>vILDJ5t|opK%n*G0|)j2PL)-c$t@0x8@6c=)q#A%Az_D$D$I${twr zBg_=O295)WeDl!M(A416l!zWxYLR*9`icf~qyt$vJyiMtqeg9_P07LOL4l!EtOQB( z;~Ef0NnCQ`dpaq&Zld(ARuT}JSS8(Nf)PEEtUxTj0n(Nhi}%4*#G+uJ{U=qW_ajEg z4(_YBYCo@B?p7xt6xjvN(5#9*F)x_MADAvkGAfS~NfX@pO1d7US zi9od%jSt$`UT?;ik5Nz=gf0)HYkM~;eUS$&N&yjAn$F68s+gM6v=qHH!^``@qEq_O zytoLVUe2=$6_x zr6?4}x2jYQZ-x*^8((J=Kg|UTBle666m8zFnW35O$AJoW_srDhscmX65Sqqs+XIsC z@J^yN&(6WExK81mHC);!EHLV?f@^*njf&Kb7^_rmF;qR0wH|XRSg+7xFXEiKW%$C8 z1lp1<^BwY2x5zzxTec!v<%f)SBe2Y~+qIP8m?9;WONE2ZEuDrJF;Tf}--I-IyE!OZ z%{trBC5LS~ZD4{}SA3{wg{SbUL{8Wcd9k-cm8F-Ifx1b&pt@p;Hp-<45}S(3KoyMQ zwkr}lsh`mY7P;e^1F+nOXRVm*n#xG6yK>^+E0~{bfztvW*#Vyu4=mBoFEV9EBV;V=-Hp+vljM|F*@U$xP zztJAYyW)XkC5D8T8}DonuRYRF8KsZ0eo=Z{5^MXdOB8X|Gqu5}UkD}0BbwV}+AMvN0V-HSIiuWL!5`?I?WLJ`2wY*EC>0*p)IJjkL(}6}OrT5< zI4ZySwOGgUDF!FjTGEuuvc$6fH4J1_7bjv*Me4KY%|e+yh5Hg&;COL5zs^KOljck- z{o2vKN}rH;NNWA#_)#&%3ajceY~KpE>5b>2<-vUGJU<&w02sHznS&2?%y+BdEYUGs z8CNLto5xh{g+{U_b3eM$g=SYm%%VppWlsR>${flrdmFiN)VdU|!X$cN9}!|j+ZP>1 z={JTlm)-$acoU^%YUNb3?szS{4>SR|6>)9KNmXoX2-jVutidUJZMWG!mga)i(me>H za;alat}+UmP6Q-+jWi6~d)PXBm{=zmgYz&{zeCimJjib9Uim2~^`&=`cvaR^)hEHI zPDGOZONu1R5cRuXq0P8L+6>iKW9DL|3NvQ9)2l&UrLl%!+p}CBq?TyQ zEnw6Cm}FLtGLSI~f@|YBcqk>KjYenvnSWihSvVHpWtxRaqkutxs98WdS?^tA%1)U_ zDf_?u|BCD*Lzpizas@M`w^3(C6(o!8>eWV_qgqN-*IcqpDLHkyQZlr*rkwL*7 z0WB+DW=6QPcihntt5^p%p1`uD3k&Hu=5PTh@nY6a4NPZr;mf1kk#>BDIxxTZ5tyHD zN(8NiX_fLwJ}_j(pgni(|I-=?Wl9l?-n|g$TN|cCm1$fD@**BZR13|{`ugHh{R}15 zb^5HH*`4@q=gNvuF%njV=wP~@N^a{*E#Tu zX&GrdIQ>GT5d%Uu#ijPPA&db-nh z#WJ17oZ)x{vyiO1JYL~uuQ^tSv_wWxMKFD5i&h#&dpi8&I2NHmliM&2t%kQ3FvHej zadcT3%SS@l9!?JDO8-QicMP^-cjas5GvAUA^iNm^*MQ`oF$>GUj7tWoS7{G7$+AO9FyJ20M>auea$u7GvZWbTHqRz%W z2nsi6Z{r8M;xFSDBRu?4foo8zQUCFS;z^Ci=t{1fYFted5cw5ED!4%82Z&VgV592* zByZrH230~G5N2y+7KfRuL28mllq(g60*Gpr?@F$ik~m(aJn%E9!;k?9HQ+J0xxsED zLL@@roW`qZ8&KBGja{@^4R)f8F1taE%ShhWxRhVB^o1s`?ZkE9ImVNH)6C6`rW&6B zhTZrGel_dOLIb@~PJVE_5T9r9Qzs9R8L$gC6`*Dn%N3(|MdKN8HO=~Gh&0oe%LQ-7 zkbUFR^qFfso1fBKK!Z{G2mC?}zKo>VeDcsCk)cTLm|8Or+b7%Iz^!Q#Z;XuCIiT6Wbt_Gj1!L?w; z8evZz!@5@WAhZ5Kd@(>#m+m3>&=j%BK5KBS$K1XJ2!ng1{$ce||2REp_(~0b5Cb2L zi{N0?Db_glLy5P}kxj3Iq-MHzQs+!(;&^eZmh z8jai}o#Mz=Ob{0Ff8I0(baa_AoYMPPZlooxmJF54INs($l&@{dO~It+HM2#*mMDrc zT~N)NGEAk@cNo?KF(oLJiZcbvUK?XbEa5SZ6%=xH0e5sDU;!I}TFzSk^=28D@+`A- z{he(^hXsynRZc*6fMaH|t|o_XWd&AUqdma=481Tx!eMe@`V388Va)OdCewxlEOn4q zwY~7u2F&%*cI%}!%i2p4z@KgS>*0CR5`3#umXCo+Lgw3jMe?b zPuke!HG_oApmeEvu*%Wtzcp`!`v^wrQOS~;T7^UzcI6%#?Bn&Z{hQl)Q#h0QBUnE% zhcg!cO}_d_GkYNXwb%zkyGr+=a74ZI6Rn-0Sbdd#h&3fWMFVb zailmB2MrDm7JG_4g_ysgVL*TuhphlihNk5w?y_>YIHFt&_vn>#X5&_*7KNI%IS%aE#}71z+vJ;U+>S3#^l8iykeg}TLBO$SMfk`?H^=5R2HMPIXDYl5Sz;m?N07(H+@8NA+zxA4s~z|8MA+3zXIm`_e;1OeL&H2kd`-4J ze#XkQ9$&tD3TC1cGc-`GVLGtXZNt`6KQhm@>0 zQo_u}oA?=4D&?INDhLo^kgOiOeUvVu?)(U)YivJ1aWh>ru5IL6-D^aq-pRbh z(LknMnrf4&>84Bpm-27}zLZ0h0>%eHGp;~5#!mjA-Xk#>iH?zG_0Qlw&|m_x$8*7m zfH5Y1aDDA&gm2|%rc;%E1+%|y2H1;e-*>A`u$`M(^OMLIcgds_2V!xOF7Ec%`m02g zGVN_G8NPW@873QIGFO4c6hxA=kp;2ny`6W8|?6ZU!F0+buKcL>x4__>ZKsF+dlxY zDE&KXC>;1O`!1}xYkU$Aqb|Q@@HRkr6a=j`=>kM9Z>NjMsF64bU+Vb_@q)JkjXMJw zfQ@OW1tA6RU_dhq9Z*@`O((SI=%)TBNt`ie@4{F0C+qi+P+&<97BteXX;eTJ1!o+oz+zBPzH%Un zcE1?#o3?2SyLaQq8KNc=_%YhYm%_BCCQyDqsskXdJ$3Y(k;D?zgjCVH5tMYK9h7^a zM8zbfYYs;~AAzN_a}L%ai6djyP6OHreLxkqh7V~tX22MihOX4mVRe%KoKu2ElM1%t zN5}~8Ly1?(79XVxBIg)cF(Oo?Dhk~T8kP7kH^gWa>S&z=1H=yo^*%w{%#`$?VI{M1 z&H_IXK0D9=Nk6)kGn~F-`c=;w^|LMKcqut%=LC0SjT=espMickDq1;0p^K)Onq%z{ zRF+VK0YgoLUv_VdI_6ApAW5tD9RuU2f@q#ku%;UPAOiMtnGpGwuZBcQSbYs<1#D2j z`C(+`RmJWdEV@{aKYJJZ_(Fm@*M;@7llTFY_-i4HSoO*kuDA(=pKPYstqh&oA={nH zrl9sahUurKcHc~_(JT0ypSqqOTy8RzO<~^}h8F!~?VC<+w>6o;5KsTUE+?1Umn-A5 zJL~4LBs_z22X^Dg1T1Laa`a;N_^*6kjOk)P3o8P%I958FBvx{Ftrg_2{UnCMFn)y< zgjpA%`R=|vd}C-R>sMCzJk4M?7K!=nO8&L1L-+G=#ZK?!!~tR?V;Hc-(&76$A>H}h zXx84B&!!65p30El?f3XLwpZ`Q;zfI(-vgq1TB#k)CTrixWs_i!Vhxb0BV8$Yvtyx; zX0s8avVL-3(?7yYS`(l3yS?2#1`hW|)X9Aas~;;<+>5haxV#0t%cgVL-gTqsY~jp? z-KlkHm~_Xd%Xg=;U7p`Hoy8g4zPr})dn<^{@aC4Zd(QMD|@m>r-_Ur}<5aHGDoj4HjxVOv8?e=@8Ms81H_Ci>UC7lG0 zX4CudjU^XoN-C`CY2XBMY#(l{@$LKY$@?xoNgtG}rDKRDQ}EM17l=;pp7!l&B6qnO z;M-FJn+K#YRBQ;8pWermA>GIPi9?tOkO@VYDQhAPpCk96hTB&;3z?AGom{h;fzddU zKy^1^6}MtrBMB)GI!dwKy{}RtR#JJH-d*gODsGxmNLC9iIlUVq$JoeIT>I#E$x0i@ zbU~4vj#2B|$QsBunD_(u%8MtU`tWC8fMR0jwQmBp)PAbrdB2Onqa=9<7CeD0kXhNT zmdEoANP$?w>sSQfhB0Ww3M>){>y&zP<7eRQz%lN@S$5Di>*ZJK9pC9oda&#U5I z%*r=o_mlggLwX;+zl>xi>;8@bk?XGnLzOJU>#lNO_ z_DVXjzdh`c5wKeY56x1Rp>F>=Dx>ZHf}gHrvdd{kRZAuj>R~EMH{1~gUFoxne;MoU za>LI>Ac+kPdT#qS7}hr#7Vce)2L`GU+7nfj;~S$;t+6N}Wh7+MN2td}AcWeA>+%@X z#x&?<;EuP?%nj|ca@+4igmcN<_J8I#SKf*=qaTI}kUt4IJCr=;Jf|vCBc=-_L5-}-r zNt=oPt{9wneE5Btn3VY>Z6^M&@je+Z!^hx(Jj5rz`Ow^l_e^d6A-)m)6`1)D=Sndt z^Woae@c#*KM1N-t=NU0G`tkA*{~xrOVaDlsQ4IbBZ6^Lt@kaF14t1~Uc3?i-w1QW|AS%XL!3}d$~>XX4F5BDBmSpjI2XputF)Q;Z;HXu zK+41LUl21Nug%2&5#ES?@{|wpH;YM`2ep~_yYWW+e|!uF`jb5LyFr_Y|8>0N1;ftb zgiT@qE5&wrYoH*Q%&4=bOF)99kOq&VsikWYUnNQbdhW{75 zTk(qQ#Oir~?Cnv`T9Ape{`fc!9!rpsWW1>L}jp?t0&%?s^}H zii_ZQARf4iC$5Ua`~5wUS(V*01Fp+|_kI7L?U|^Ecp~D7C!ToX%!nrxM{eySC-kTL z|BDIJpW^IqF30~b;!fyK_y13h<0$^hRQz|O;OX}G!W8_NRQ!8zC-e)K{$wX-wB=qd zAb%?Fb(lo{RSx|rPRm@*eMsz9{O@2+!-)Us{-3*^_NTOyv0L#!61xRYm-i(p_{p(b z@&ANL==W1`(zFc#SA7WQXD|u>_rk3|!RO57+%vIT_&P>c*e(2D z#U%Vs_x~59;_s7+|Lzn#&Ce@S@Z(bPe~CMxU-{`z^lUVjb0__z!f(VR{69Ap=dzUh zu-L8m+c63MlX?{XD2^ld>e#LLpGd*e<$YNS{^(Tv9k|cNSXtu^S2$HB{mI>j5zTVX zVG??hatZznjQ-@_*Icf>e+sv734gl(KO4XP6n|U}{zU&9&E?>+)8bs7f*&5c75@jA z1b-02g>!w%Jsi6g{~AmpKZ%?x{&V6ua<7fuivM*?B0rTFt~gIgxx?74`2U=OE1v#j zzsOw9{ixWj_`k*^^r!oO@mqgNJBUg8pSy4;^e633aW-T0C-;8la{T-P?u7nye|TOT zNAdSg#eaJWo~GvoDfrQ;_&>v)&@Wv2ll=s9Irp;It@6GWqq0dJR1Wv>{k2_r{LWw_tupAq}Z+af5as8`>8m}Q-8{O z?}b}`iqkZgb5F-^;r~}m!vA!CxG5EX&s6-IQgAQjeqPFbWGepMxD)!V4dWL*XU1{l z9*y0i=kGBI|Bs5{igQWIy)Jeu{VmG^r!f<=5p?O>{k5ur{L-KepL#7LMs06 zaVPYr`~SzK;#YCsj8VS&OZY$Iyas<(%6&lW7Cm3VB>YeJhv%o_uS&)LhZH>BpIniG zADfE*3)~6)%1?iy^GW7%?iI0H;WuCs{-2wQvnAy|GbpQW%srUz`;(r6T zcp?6X5Bd|$7n;kt9}&A%U++!9<=3C$zt~*PeSGXz_-`=@{ptQz{MMh+4q+5W?*Huk z|4XDv=uh|mPX?|(;aq7hS6}ap-GZmv;|o*pV^Z;djys`WY4j)iiRN=yl>!zBDq_y6an;wN|%|E(#wpK?Dx9sb2<0Y*sb`l#w7et@F@O#97pbhVz=Ud8M!Ac!e_ysZ6PksBV)Jd`5GqSf4cv_AQgX~RQ!KT z!PES_G6g>_75`q`3H{1Xf1+ojxtu%cCl&sBOv3+jQ*ka!xetroivK-K!vCZmg+Gep z$h|stEB+@_@Fgkt%Tn$~$8N=c03-Uvd-b>CySed*&vL8ZJ1c?rIerQ*qkh)n(|M_l z$gTca?cd;sckuhbG%q(elN<3t?maM?FB*K@l~-=jr+JLQDX8WIaz7VybL{RqyMrH; zZTg>^qF?=gn|>Apk_X{Y{kG|6@JQ%C2Y8$Qvpe|JKey?pFbVx@fVb)2w?n`BpEmtW zMicr!1^i}=mFsNowBr_T`60vTQoXAD8Z*_7giH0Qx==e*n~*$=VfMmIVALKC!W@NB z-JOe>!#p4JCd_9rcVRS!{Ad0YJ#ED2wDIw$jmnZXDp%Uzwe{jN(gtE9e?I!o$Jbq5J%R2CWOFi7TOw7w%Z>Y_@m+i?Z0e^W}`>yj*5{Hlw;C=O_pRL2R0 zP7kW!wA38aa%cbusp)q#M`^i^8!Fw_DQZV449V0j@+QX)-^15V-NW!Q`#=M83C^-! z2O~>pV5F6n!gC>(~|vsxPUhtvxSrn_r%2vM;05eTH6Y+de02LV8h zhM_qRG;>}%MtsP%oZn@r;YRe_-IraQ9lRQWLw**We^pshX9vgc1Hp#z)_120sg;vZg59@Dtll2Slxx@o)Xr_ z&~AAzytXuI;#yT$W=|G$7xHtj;}qB>USJPN>Wvy@HddV7k>gBE%lIR`&DqQgse{Wz zm*XIZ=+MvFadQ*KI4d{@kh!jP-3=Kije*bBbC_+}<~k4PUENm8?rvhZc=P`rEuY)2AUxeWup>mqX*Y zMn03L(!`!TQ_d;T6c0lV^p!3wdqFiHHjHJdx_aa-AlI2p&E3@h`c*U~;of-b^?oh8 z;@q}p7&TcP-v|fsR0?V8a^(q71tp;a!RY$vW3b)%qfg*;`u~mq?{mac4vaGb{FK;1 z>nD~5i9$h^q~d_S@HG^E{JE4Vt}Wjp@z6CF7fcSpqw+r+n<0-n5)xi%=9dfMCX%ky zF%3>;Hr^W1oh6`l(bB+95mV5lsO6-nc?+yxrE~9=Gq&>f!hPWHf?``gz87@b*k&So zE7woCH9Wee9L`fv_XHcdCM3r7Qzr7UVEdeD>g%fR`zy!0M}dQR1!YxVF*G$sXG4Ng z+<8EwWT(ctNZAuB=pEFzRBKk}9C6*(8>+{!YdEhY8Gko8p9fBK(%mTZG3rr2%b_sN z#5;1Y=SX9plo*yK=F`obS9M}BGluV{VCNb zh*4hE=W$R>3Qj~i?}WK#(A(o$LD4mWT=kH%=umY~*|ml9GBdBv^r|hqJEmN^oQ!7c zPuncnVE9}d9j!LL_}6zhv|5~p0piKqv7g_Tsp_m=WKw6S_p~I`b(n?B!K{?b)6>@_nC5ht&n1R*xkU2|(&akKl`Gmrp4Hhk3>7M7bPisga&jIE z3s*^~1I|cW1i>6?2dK_QPX^TXaECW;V%GAv_m*98@{9YjCue$^j$X~Zj)y+_T*d*r zWudoi$Nvm$!!h&&HpAEKxfi3=%fyNyUR!ltKaLS=JUCXwj^HBIr^Xj%W0@-?<6+rTloNi-neZpUj{BVIU3uq3$DH=F}Lf)(eMOjT-j`flq-z0A=BKX^G*9?j|pF%zRSN>_}e6m@UZbp=c`q5o`R>CZQA z%&sm<8=~^A`{UGnW_I(3rK=+JtoM6#y0ZzFHD9oQE2o;??n1sA9)yQUj+R&%|dg!BniE?K|b#I z9UzY)*`b+xTpmo%*Mdv-E>6|18idEDQXbpfsyG(h#>L&{QvIUljf9wr_^p%FvS&HA^I32o z-RaQx!{Z=^=hn`U)%<{xA8*c&$a$ii)ez+wvd)n;henE0YX@wMoe$vDl<&8)H90f~ zfL|s6a{#zE0hj{-w@zFVa{%~N0x$=F-z5NZ0Qh|ZFb9D95`Z}XaEaX^H3xwINC4&l z@W%vT4gh~j0OkO|L0*T$902~30L%g4{sdqS0OE+)VC>MC;NC}kF*1P8tMFKOH(3rZ z(#U-<9K6IaEczrBTbt^s(f5gO_8f^9a^H!L%%w7|=iS`tJq=*gByGWzu=i|V5;Pbe zE!owexl<2ss89DY`(_@o!M1K_H|SmSGP>thX?}t_b?;?);U=)vW_p9>HvvX$*_2js zXU)LFGu=V+S8cEtK9;x*V1<2?s6n&Zc5j)3Cf*?2D`>6)=!K^eebI9f(PrYTn&?kQ zaWF4Do9M%$WWP2_Q6g|nlpNg#2hGP>1}71eq&@|A1H8|&5cyn)^#N8`=J<~S?1cLQ z3fkz;H?Ozof+vX16rzcI^RpK61bmbE<`394n#eVOXE4Rs%0#p)x>%+0!Y2V3dxGXv zay4rCW@(KWAfJn9#ZKNwgvu$x^X@{O1udX*y^xH1q3rm%EGRwNP#VmV@E{lAO>3VE zOCz`|O)AIPMLBxm!L35koQCPu+8J(u{+a)n<)3*i9cM;R2^ui~1vN<_uzNZ~RHVRsh4X;xs*(j`- z%7&#;Pcem!Y>dCD%g%$SH{`POkgQy*DvQg`Y$r$$N^2Oq&d6He4T3`EB+QpF4a~bR zPs98>W*O#s%o8woVh+Z9409>wevF5C9_C2Qr!jkCwqZ75eu(MEyaIC?=2px!<~^7u z<~NuU<|@nym@i`Ln0H`iG526bG1pcU&8(p_5}6>_B*lPiTzaUr(*vc z`{&q8v6o`M4*PZ3XJMa(eFyd(*au-Bg#A(Mk7Cbb&tv}?`_I^U>^%0B*jHj7hkYFO z=deGAy$|+2*l)#tEA|E07hwMc`zP2n>>Bo~v0sh-c}O;D0s9ZwOR$$#<*t zy%BpO_V=*AhkY3KVc4I<{v`Hg*q32Hfc*frc0~`zjAPEm^kGiL?2CB@rhs`ACd51i zGmKe}S&MlNCW|>5vp42E%pm5mnEf!DF+Lcck2wnS8O&aoH(}1j+=bECiawL#9Jq7f z%Yh?Dzm%iz$$=tFY!6FK?&XgJF}vjm!mDE|k^ntbF}USO0}d>Akq3Zr>vF7{g)_I4P;(Vt1d@7P zpzs-TLbIoL!R*iDjm##{)>0D6vss>HvFBOxut8`c&yiu!xY?+BJOdxcjKCwv+|E`P1p^hXLsVcKg6vW||NqkvJyGG~;rd{J3tS@!1Bxz!)X zy4(J&sEkyWslM41+GiXWMu{_B;)Ty)ERM_W=?$?`Ty`(KL>^amFPxXhmE8+3mB*Fc z3tRG7*}=9&9&w<)g-5Tj8(f1HGaGDq3Kx%DxOXm?=_=eN{N@0lhz2kR0HrX1IRJ

      ^abKQk1yq46uo8E;QUde6j9mXrk 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 z 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 From 4ebb985b46385b8c03ac572648a1c628262f65d0 Mon Sep 17 00:00:00 2001 From: AlexRa Date: Wed, 5 May 2010 22:34:41 +0300 Subject: [PATCH 15/46] Added MySqlMigrations.cs (supports stored proc/funcs) Uses MySqlScript class to correctly run proc/func definitions that need delimiter change. Requires MySql.Data.dll 6.2 or later. --- OpenSim/Data/MySQL/MySQLMigrations.cs | 85 +++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 OpenSim/Data/MySQL/MySQLMigrations.cs diff --git a/OpenSim/Data/MySQL/MySQLMigrations.cs b/OpenSim/Data/MySQL/MySQLMigrations.cs new file mode 100644 index 0000000000..b16655d1cb --- /dev/null +++ b/OpenSim/Data/MySQL/MySQLMigrations.cs @@ -0,0 +1,85 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; +using System.IO; +using System.Reflection; +using System.Text.RegularExpressions; +using log4net; +using MySql.Data.MySqlClient; + +namespace OpenSim.Data.MySQL +{ + ///

      This is a MySQL-customized migration processor. The only difference is in how + /// it executes SQL scripts (using MySqlScript instead of MyCommand) + /// + /// + public class MySqlMigration : Migration + { + public MySqlMigration() + : base() + { + } + + public MySqlMigration(DbConnection conn, Assembly assem, string subtype, string type) : + base(conn, assem, subtype, type) + { + } + + public MySqlMigration(DbConnection conn, Assembly assem, string type) : + base(conn, assem, type) + { + } + + protected override void ExecuteScript(DbConnection conn, string[] script) + { + if (!(conn is MySqlConnection)) + { + base.ExecuteScript(conn, script); + return; + } + + MySqlScript scr = new MySqlScript((MySqlConnection)conn); + { + foreach (string sql in script) + { + scr.Query = sql; + scr.Error += delegate(object sender, MySqlScriptErrorEventArgs args) + { + m_log.ErrorFormat("[MySQL MIGRATION]: Error {0}", args.Exception.Message); + m_log.ErrorFormat("[MySQL MIGRATION]: In SQL: {0}", args.StatementText); + throw args.Exception; + }; + scr.Execute(); + } + } + } + } +} From e4419c34c30e1cf6529ced125f0c05aed24644a4 Mon Sep 17 00:00:00 2001 From: AlexRa Date: Sat, 1 May 2010 17:43:10 +0300 Subject: [PATCH 16/46] Converted MySQL migration history to the new format Replaced all NNN_StoreName.sql migration resources with a more readable, single-file-per-store --- OpenSim/Data/MSSQL/Resources/002_Presence.sql | 6 - .../Data/MySQL/Resources/001_AssetStore.sql | 15 - OpenSim/Data/MySQL/Resources/001_Avatar.sql | 5 - OpenSim/Data/MySQL/Resources/001_Friends.sql | 9 - .../Data/MySQL/Resources/001_FriendsStore.sql | 5 - .../MySQL/Resources/001_InventoryStore.sql | 40 - OpenSim/Data/MySQL/Resources/001_Presence.sql | 13 - .../Data/MySQL/Resources/001_RegionStore.sql | 154 ---- .../Data/MySQL/Resources/001_UserAccount.sql | 13 - .../Data/MySQL/Resources/002_AssetStore.sql | 9 - .../Data/MySQL/Resources/002_AuthStore.sql | 5 - OpenSim/Data/MySQL/Resources/002_Friends.sql | 5 - .../Data/MySQL/Resources/002_FriendsStore.sql | 5 - .../Data/MySQL/Resources/002_GridStore.sql | 5 - .../MySQL/Resources/002_InventoryStore.sql | 31 - .../Data/MySQL/Resources/002_RegionStore.sql | 6 - .../Data/MySQL/Resources/002_UserAccount.sql | 5 - .../Data/MySQL/Resources/002_UserStore.sql | 5 - .../Data/MySQL/Resources/003_AssetStore.sql | 9 - .../Data/MySQL/Resources/003_AuthStore.sql | 5 - .../Data/MySQL/Resources/003_GridStore.sql | 7 - .../MySQL/Resources/003_InventoryStore.sql | 5 - .../Data/MySQL/Resources/003_RegionStore.sql | 5 - .../Data/MySQL/Resources/003_UserAccount.sql | 9 - .../Data/MySQL/Resources/003_UserStore.sql | 6 - .../Data/MySQL/Resources/004_AssetStore.sql | 5 - .../Data/MySQL/Resources/004_GridStore.sql | 6 - .../MySQL/Resources/004_InventoryStore.sql | 7 - .../Data/MySQL/Resources/004_RegionStore.sql | 5 - .../Data/MySQL/Resources/004_UserAccount.sql | 8 - .../Data/MySQL/Resources/004_UserStore.sql | 6 - .../Data/MySQL/Resources/005_AssetStore.sql | 6 - .../Data/MySQL/Resources/005_GridStore.sql | 6 - .../Data/MySQL/Resources/005_RegionStore.sql | 40 - .../Data/MySQL/Resources/005_UserStore.sql | 5 - .../Data/MySQL/Resources/006_AssetStore.sql | 1 - .../Data/MySQL/Resources/006_GridStore.sql | 5 - .../Data/MySQL/Resources/006_RegionStore.sql | 12 - .../Data/MySQL/Resources/006_UserStore.sql | 5 - .../Data/MySQL/Resources/007_GridStore.sql | 7 - .../Data/MySQL/Resources/007_RegionStore.sql | 25 - .../Data/MySQL/Resources/007_UserStore.sql | 5 - .../Data/MySQL/Resources/008_RegionStore.sql | 9 - .../Data/MySQL/Resources/008_UserStore.sql | 5 - .../Data/MySQL/Resources/009_RegionStore.sql | 31 - .../Data/MySQL/Resources/010_RegionStore.sql | 9 - .../Data/MySQL/Resources/011_RegionStore.sql | 9 - .../Data/MySQL/Resources/012_RegionStore.sql | 5 - .../Data/MySQL/Resources/013_RegionStore.sql | 103 --- .../Data/MySQL/Resources/014_RegionStore.sql | 8 - .../Data/MySQL/Resources/015_RegionStore.sql | 6 - .../Data/MySQL/Resources/016_RegionStore.sql | 27 - .../Data/MySQL/Resources/017_RegionStore.sql | 9 - .../Data/MySQL/Resources/018_RegionStore.sql | 6 - .../Data/MySQL/Resources/019_RegionStore.sql | 6 - .../Data/MySQL/Resources/020_RegionStore.sql | 7 - .../Data/MySQL/Resources/021_RegionStore.sql | 8 - .../Data/MySQL/Resources/022_RegionStore.sql | 6 - .../Data/MySQL/Resources/023_RegionStore.sql | 6 - .../Data/MySQL/Resources/024_RegionStore.sql | 18 - .../Data/MySQL/Resources/025_RegionStore.sql | 46 - .../Data/MySQL/Resources/026_RegionStore.sql | 41 - .../Data/MySQL/Resources/027_RegionStore.sql | 5 - .../Data/MySQL/Resources/028_RegionStore.sql | 79 -- .../Data/MySQL/Resources/029_RegionStore.sql | 5 - .../Data/MySQL/Resources/030_RegionStore.sql | 7 - .../Data/MySQL/Resources/031_RegionStore.sql | 7 - .../Data/MySQL/Resources/032_RegionStore.sql | 3 - .../MySQL/Resources/AssetStore.migrations | 69 ++ ...001_AuthStore.sql => AuthStore.migrations} | 18 + .../Data/MySQL/Resources/Avatar.migrations | 12 + .../MySQL/Resources/FriendsStore.migrations | 25 + ...001_GridStore.sql => GridStore.migrations} | 57 ++ .../MySQL/Resources/InventoryStore.migrations | 93 ++ .../{001_LogStore.sql => LogStore.migrations} | 3 + .../Data/MySQL/Resources/Presence.migrations | 36 + .../MySQL/Resources/RegionStore.migrations | 806 ++++++++++++++++++ .../MySQL/Resources/UserAccount.migrations | 47 + ...001_UserStore.sql => UserStore.migrations} | 63 +- 79 files changed, 1228 insertions(+), 1008 deletions(-) delete mode 100644 OpenSim/Data/MSSQL/Resources/002_Presence.sql delete mode 100644 OpenSim/Data/MySQL/Resources/001_AssetStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/001_Avatar.sql delete mode 100644 OpenSim/Data/MySQL/Resources/001_Friends.sql delete mode 100644 OpenSim/Data/MySQL/Resources/001_FriendsStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/001_InventoryStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/001_Presence.sql delete mode 100644 OpenSim/Data/MySQL/Resources/001_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/001_UserAccount.sql delete mode 100644 OpenSim/Data/MySQL/Resources/002_AssetStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/002_AuthStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/002_Friends.sql delete mode 100644 OpenSim/Data/MySQL/Resources/002_FriendsStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/002_GridStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/002_InventoryStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/002_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/002_UserAccount.sql delete mode 100644 OpenSim/Data/MySQL/Resources/002_UserStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/003_AssetStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/003_AuthStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/003_GridStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/003_InventoryStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/003_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/003_UserAccount.sql delete mode 100644 OpenSim/Data/MySQL/Resources/003_UserStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/004_AssetStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/004_GridStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/004_InventoryStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/004_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/004_UserAccount.sql delete mode 100644 OpenSim/Data/MySQL/Resources/004_UserStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/005_AssetStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/005_GridStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/005_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/005_UserStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/006_AssetStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/006_GridStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/006_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/006_UserStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/007_GridStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/007_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/007_UserStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/008_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/008_UserStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/009_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/010_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/011_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/012_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/013_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/014_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/015_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/016_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/017_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/018_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/019_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/020_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/021_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/022_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/023_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/024_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/025_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/026_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/027_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/028_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/029_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/030_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/031_RegionStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/032_RegionStore.sql create mode 100644 OpenSim/Data/MySQL/Resources/AssetStore.migrations rename OpenSim/Data/MySQL/Resources/{001_AuthStore.sql => AuthStore.migrations} (51%) create mode 100644 OpenSim/Data/MySQL/Resources/Avatar.migrations create mode 100644 OpenSim/Data/MySQL/Resources/FriendsStore.migrations rename OpenSim/Data/MySQL/Resources/{001_GridStore.sql => GridStore.migrations} (64%) create mode 100644 OpenSim/Data/MySQL/Resources/InventoryStore.migrations rename OpenSim/Data/MySQL/Resources/{001_LogStore.sql => LogStore.migrations} (95%) create mode 100644 OpenSim/Data/MySQL/Resources/Presence.migrations create mode 100644 OpenSim/Data/MySQL/Resources/RegionStore.migrations create mode 100644 OpenSim/Data/MySQL/Resources/UserAccount.migrations rename OpenSim/Data/MySQL/Resources/{001_UserStore.sql => UserStore.migrations} (72%) diff --git a/OpenSim/Data/MSSQL/Resources/002_Presence.sql b/OpenSim/Data/MSSQL/Resources/002_Presence.sql deleted file mode 100644 index a67671ddf6..0000000000 --- a/OpenSim/Data/MSSQL/Resources/002_Presence.sql +++ /dev/null @@ -1,6 +0,0 @@ -BEGIN TRANSACTION - -CREATE UNIQUE INDEX SessionID ON Presence(SessionID); -CREATE INDEX UserID ON Presence(UserID); - -COMMIT \ No newline at end of file diff --git a/OpenSim/Data/MySQL/Resources/001_AssetStore.sql b/OpenSim/Data/MySQL/Resources/001_AssetStore.sql deleted file mode 100644 index 6a9a127b8f..0000000000 --- a/OpenSim/Data/MySQL/Resources/001_AssetStore.sql +++ /dev/null @@ -1,15 +0,0 @@ -BEGIN; - -CREATE TABLE `assets` ( - `id` binary(16) NOT NULL, - `name` varchar(64) NOT NULL, - `description` varchar(64) NOT NULL, - `assetType` tinyint(4) NOT NULL, - `invType` tinyint(4) NOT NULL, - `local` tinyint(1) NOT NULL, - `temporary` tinyint(1) NOT NULL, - `data` longblob NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Rev. 1'; - -COMMIT; \ No newline at end of file diff --git a/OpenSim/Data/MySQL/Resources/001_Avatar.sql b/OpenSim/Data/MySQL/Resources/001_Avatar.sql deleted file mode 100644 index 27a307244b..0000000000 --- a/OpenSim/Data/MySQL/Resources/001_Avatar.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -CREATE TABLE Avatars (PrincipalID CHAR(36) NOT NULL, Name VARCHAR(32) NOT NULL, Value VARCHAR(255) NOT NULL DEFAULT '', PRIMARY KEY(PrincipalID, Name), KEY(PrincipalID)); - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/001_Friends.sql b/OpenSim/Data/MySQL/Resources/001_Friends.sql deleted file mode 100644 index e158a2c802..0000000000 --- a/OpenSim/Data/MySQL/Resources/001_Friends.sql +++ /dev/null @@ -1,9 +0,0 @@ -BEGIN; - -CREATE TABLE `Friends` ( - `PrincipalID` CHAR(36) NOT NULL, - `FriendID` VARCHAR(255) NOT NULL, - `Flags` CHAR(16) NOT NULL DEFAULT '0' -) ENGINE=InnoDB; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/001_FriendsStore.sql b/OpenSim/Data/MySQL/Resources/001_FriendsStore.sql deleted file mode 100644 index da2c59c6d0..0000000000 --- a/OpenSim/Data/MySQL/Resources/001_FriendsStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -CREATE TABLE `Friends` (`PrincipalID` CHAR(36) NOT NULL, `Friend` VARCHAR(255) NOT NULL, `Flags` VARCHAR(16) NOT NULL DEFAULT 0, `Offered` VARCHAR(32) NOT NULL DEFAULT 0, PRIMARY KEY(`PrincipalID`, `Friend`), KEY(`PrincipalID`)); - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/001_InventoryStore.sql b/OpenSim/Data/MySQL/Resources/001_InventoryStore.sql deleted file mode 100644 index 40dc91cdc6..0000000000 --- a/OpenSim/Data/MySQL/Resources/001_InventoryStore.sql +++ /dev/null @@ -1,40 +0,0 @@ -BEGIN; - -CREATE TABLE `inventoryfolders` ( - `folderID` varchar(36) NOT NULL default '', - `agentID` varchar(36) default NULL, - `parentFolderID` varchar(36) default NULL, - `folderName` varchar(64) default NULL, - `type` smallint NOT NULL default 0, - `version` int NOT NULL default 0, - PRIMARY KEY (`folderID`), - KEY `owner` (`agentID`), - KEY `parent` (`parentFolderID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `inventoryitems` ( - `inventoryID` varchar(36) NOT NULL default '', - `assetID` varchar(36) default NULL, - `assetType` int(11) default NULL, - `parentFolderID` varchar(36) default NULL, - `avatarID` varchar(36) default NULL, - `inventoryName` varchar(64) default NULL, - `inventoryDescription` varchar(128) default NULL, - `inventoryNextPermissions` int(10) unsigned default NULL, - `inventoryCurrentPermissions` int(10) unsigned default NULL, - `invType` int(11) default NULL, - `creatorID` varchar(36) default NULL, - `inventoryBasePermissions` int(10) unsigned NOT NULL default 0, - `inventoryEveryOnePermissions` int(10) unsigned NOT NULL default 0, - `salePrice` int(11) NOT NULL default 0, - `saleType` tinyint(4) NOT NULL default 0, - `creationDate` int(11) NOT NULL default 0, - `groupID` varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000', - `groupOwned` tinyint(4) NOT NULL default 0, - `flags` int(11) unsigned NOT NULL default 0, - PRIMARY KEY (`inventoryID`), - KEY `owner` (`avatarID`), - KEY `folder` (`parentFolderID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -COMMIT; \ No newline at end of file diff --git a/OpenSim/Data/MySQL/Resources/001_Presence.sql b/OpenSim/Data/MySQL/Resources/001_Presence.sql deleted file mode 100644 index 84fa05794c..0000000000 --- a/OpenSim/Data/MySQL/Resources/001_Presence.sql +++ /dev/null @@ -1,13 +0,0 @@ -BEGIN; - -CREATE TABLE `Presence` ( - `UserID` VARCHAR(255) NOT NULL, - `RegionID` CHAR(36) NOT NULL, - `SessionID` CHAR(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000', - `SecureSessionID` CHAR(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000' -) ENGINE=InnoDB; - -CREATE UNIQUE INDEX SessionID ON Presence(SessionID); -CREATE INDEX UserID ON Presence(UserID); - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/001_RegionStore.sql b/OpenSim/Data/MySQL/Resources/001_RegionStore.sql deleted file mode 100644 index 31164b35ed..0000000000 --- a/OpenSim/Data/MySQL/Resources/001_RegionStore.sql +++ /dev/null @@ -1,154 +0,0 @@ -BEGIN; - -CREATE TABLE `prims` ( - `UUID` varchar(255) NOT NULL, - `RegionUUID` varchar(255) default NULL, - `ParentID` int(11) default NULL, - `CreationDate` int(11) default NULL, - `Name` varchar(255) default NULL, - `SceneGroupID` varchar(255) default NULL, - `Text` varchar(255) default NULL, - `Description` varchar(255) default NULL, - `SitName` varchar(255) default NULL, - `TouchName` varchar(255) default NULL, - `ObjectFlags` int(11) default NULL, - `CreatorID` varchar(255) default NULL, - `OwnerID` varchar(255) default NULL, - `GroupID` varchar(255) default NULL, - `LastOwnerID` varchar(255) default NULL, - `OwnerMask` int(11) default NULL, - `NextOwnerMask` int(11) default NULL, - `GroupMask` int(11) default NULL, - `EveryoneMask` int(11) default NULL, - `BaseMask` int(11) default NULL, - `PositionX` float default NULL, - `PositionY` float default NULL, - `PositionZ` float default NULL, - `GroupPositionX` float default NULL, - `GroupPositionY` float default NULL, - `GroupPositionZ` float default NULL, - `VelocityX` float default NULL, - `VelocityY` float default NULL, - `VelocityZ` float default NULL, - `AngularVelocityX` float default NULL, - `AngularVelocityY` float default NULL, - `AngularVelocityZ` float default NULL, - `AccelerationX` float default NULL, - `AccelerationY` float default NULL, - `AccelerationZ` float default NULL, - `RotationX` float default NULL, - `RotationY` float default NULL, - `RotationZ` float default NULL, - `RotationW` float default NULL, - `SitTargetOffsetX` float default NULL, - `SitTargetOffsetY` float default NULL, - `SitTargetOffsetZ` float default NULL, - `SitTargetOrientW` float default NULL, - `SitTargetOrientX` float default NULL, - `SitTargetOrientY` float default NULL, - `SitTargetOrientZ` float default NULL, - PRIMARY KEY (`UUID`) -) ENGINE=MyISAM DEFAULT CHARSET=latin1; - -CREATE TABLE `primshapes` ( - `UUID` varchar(255) NOT NULL, - `Shape` int(11) default NULL, - `ScaleX` float default NULL, - `ScaleY` float default NULL, - `ScaleZ` float default NULL, - `PCode` int(11) default NULL, - `PathBegin` int(11) default NULL, - `PathEnd` int(11) default NULL, - `PathScaleX` int(11) default NULL, - `PathScaleY` int(11) default NULL, - `PathShearX` int(11) default NULL, - `PathShearY` int(11) default NULL, - `PathSkew` int(11) default NULL, - `PathCurve` int(11) default NULL, - `PathRadiusOffset` int(11) default NULL, - `PathRevolutions` int(11) default NULL, - `PathTaperX` int(11) default NULL, - `PathTaperY` int(11) default NULL, - `PathTwist` int(11) default NULL, - `PathTwistBegin` int(11) default NULL, - `ProfileBegin` int(11) default NULL, - `ProfileEnd` int(11) default NULL, - `ProfileCurve` int(11) default NULL, - `ProfileHollow` int(11) default NULL, - `State` int(11) default NULL, - `Texture` longblob, - `ExtraParams` longblob, - PRIMARY KEY (`UUID`) -) ENGINE=MyISAM DEFAULT CHARSET=latin1; - -CREATE TABLE `primitems` ( - `itemID` varchar(255) NOT NULL, - `primID` varchar(255) default NULL, - `assetID` varchar(255) default NULL, - `parentFolderID` varchar(255) default NULL, - `invType` int(11) default NULL, - `assetType` int(11) default NULL, - `name` varchar(255) default NULL, - `description` varchar(255) default NULL, - `creationDate` bigint(20) default NULL, - `creatorID` varchar(255) default NULL, - `ownerID` varchar(255) default NULL, - `lastOwnerID` varchar(255) default NULL, - `groupID` varchar(255) default NULL, - `nextPermissions` int(11) default NULL, - `currentPermissions` int(11) default NULL, - `basePermissions` int(11) default NULL, - `everyonePermissions` int(11) default NULL, - `groupPermissions` int(11) default NULL, - PRIMARY KEY (`itemID`) -) ENGINE=MyISAM DEFAULT CHARSET=latin1; - -CREATE TABLE `terrain` ( - `RegionUUID` varchar(255) default NULL, - `Revision` int(11) default NULL, - `Heightfield` longblob -) ENGINE=MyISAM DEFAULT CHARSET=latin1; - -CREATE TABLE `land` ( - `UUID` varchar(255) NOT NULL, - `RegionUUID` varchar(255) default NULL, - `LocalLandID` int(11) default NULL, - `Bitmap` longblob, - `Name` varchar(255) default NULL, - `Description` varchar(255) default NULL, - `OwnerUUID` varchar(255) default NULL, - `IsGroupOwned` int(11) default NULL, - `Area` int(11) default NULL, - `AuctionID` int(11) default NULL, - `Category` int(11) default NULL, - `ClaimDate` int(11) default NULL, - `ClaimPrice` int(11) default NULL, - `GroupUUID` varchar(255) default NULL, - `SalePrice` int(11) default NULL, - `LandStatus` int(11) default NULL, - `LandFlags` int(11) default NULL, - `LandingType` int(11) default NULL, - `MediaAutoScale` int(11) default NULL, - `MediaTextureUUID` varchar(255) default NULL, - `MediaURL` varchar(255) default NULL, - `MusicURL` varchar(255) default NULL, - `PassHours` float default NULL, - `PassPrice` int(11) default NULL, - `SnapshotUUID` varchar(255) default NULL, - `UserLocationX` float default NULL, - `UserLocationY` float default NULL, - `UserLocationZ` float default NULL, - `UserLookAtX` float default NULL, - `UserLookAtY` float default NULL, - `UserLookAtZ` float default NULL, - `AuthbuyerID` varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000', - PRIMARY KEY (`UUID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `landaccesslist` ( - `LandUUID` varchar(255) default NULL, - `AccessUUID` varchar(255) default NULL, - `Flags` int(11) default NULL -) ENGINE=MyISAM DEFAULT CHARSET=latin1; - -COMMIT; \ No newline at end of file diff --git a/OpenSim/Data/MySQL/Resources/001_UserAccount.sql b/OpenSim/Data/MySQL/Resources/001_UserAccount.sql deleted file mode 100644 index 07da57118d..0000000000 --- a/OpenSim/Data/MySQL/Resources/001_UserAccount.sql +++ /dev/null @@ -1,13 +0,0 @@ -BEGIN; - -CREATE TABLE `UserAccounts` ( - `PrincipalID` CHAR(36) NOT NULL, - `ScopeID` CHAR(36) NOT NULL, - `FirstName` VARCHAR(64) NOT NULL, - `LastName` VARCHAR(64) NOT NULL, - `Email` VARCHAR(64), - `ServiceURLs` TEXT, - `Created` INT(11) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/002_AssetStore.sql b/OpenSim/Data/MySQL/Resources/002_AssetStore.sql deleted file mode 100644 index a7d7fca8c5..0000000000 --- a/OpenSim/Data/MySQL/Resources/002_AssetStore.sql +++ /dev/null @@ -1,9 +0,0 @@ -BEGIN; - -ALTER TABLE assets change id oldid binary(16); -ALTER TABLE assets add id varchar(36) not null default ''; -UPDATE assets set id = concat(substr(hex(oldid),1,8),"-",substr(hex(oldid),9,4),"-",substr(hex(oldid),13,4),"-",substr(hex(oldid),17,4),"-",substr(hex(oldid),21,12)); -ALTER TABLE assets drop oldid; -ALTER TABLE assets add constraint primary key(id); - -COMMIT; \ No newline at end of file diff --git a/OpenSim/Data/MySQL/Resources/002_AuthStore.sql b/OpenSim/Data/MySQL/Resources/002_AuthStore.sql deleted file mode 100644 index dc7dfe0115..0000000000 --- a/OpenSim/Data/MySQL/Resources/002_AuthStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -INSERT INTO auth (UUID, passwordHash, passwordSalt, webLoginKey) SELECT `UUID` AS UUID, `passwordHash` AS passwordHash, `passwordSalt` AS passwordSalt, `webLoginKey` AS webLoginKey FROM users; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/002_Friends.sql b/OpenSim/Data/MySQL/Resources/002_Friends.sql deleted file mode 100644 index 5ff64389f1..0000000000 --- a/OpenSim/Data/MySQL/Resources/002_Friends.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -INSERT INTO Friends (PrincipalID, FriendID, Flags) SELECT ownerID, friendID, friendPerms FROM userfriends; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/002_FriendsStore.sql b/OpenSim/Data/MySQL/Resources/002_FriendsStore.sql deleted file mode 100644 index a3638678c8..0000000000 --- a/OpenSim/Data/MySQL/Resources/002_FriendsStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -INSERT INTO `Friends` SELECT `ownerID`, `friendID`, `friendPerms`, 0 FROM `userfriends`; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/002_GridStore.sql b/OpenSim/Data/MySQL/Resources/002_GridStore.sql deleted file mode 100644 index 35b9be122e..0000000000 --- a/OpenSim/Data/MySQL/Resources/002_GridStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -ALTER TABLE regions add column access integer unsigned default 1; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/002_InventoryStore.sql b/OpenSim/Data/MySQL/Resources/002_InventoryStore.sql deleted file mode 100644 index c161a687e2..0000000000 --- a/OpenSim/Data/MySQL/Resources/002_InventoryStore.sql +++ /dev/null @@ -1,31 +0,0 @@ -BEGIN; - -ALTER TABLE inventoryfolders change folderID folderIDold varchar(36); -ALTER TABLE inventoryfolders change agentID agentIDold varchar(36); -ALTER TABLE inventoryfolders change parentFolderID parentFolderIDold varchar(36); -ALTER TABLE inventoryfolders add folderID char(36) not null default '00000000-0000-0000-0000-000000000000'; -ALTER TABLE inventoryfolders add agentID char(36) default NULL; -ALTER TABLE inventoryfolders add parentFolderID char(36) default NULL; -UPDATE inventoryfolders set folderID = folderIDold, agentID = agentIDold, parentFolderID = parentFolderIDold; -ALTER TABLE inventoryfolders drop folderIDold; -ALTER TABLE inventoryfolders drop agentIDold; -ALTER TABLE inventoryfolders drop parentFolderIDold; -ALTER TABLE inventoryfolders add constraint primary key(folderID); -ALTER TABLE inventoryfolders add index inventoryfolders_agentid(agentID); -ALTER TABLE inventoryfolders add index inventoryfolders_parentFolderid(parentFolderID); - -ALTER TABLE inventoryitems change inventoryID inventoryIDold varchar(36); -ALTER TABLE inventoryitems change avatarID avatarIDold varchar(36); -ALTER TABLE inventoryitems change parentFolderID parentFolderIDold varchar(36); -ALTER TABLE inventoryitems add inventoryID char(36) not null default '00000000-0000-0000-0000-000000000000'; -ALTER TABLE inventoryitems add avatarID char(36) default NULL; -ALTER TABLE inventoryitems add parentFolderID char(36) default NULL; -UPDATE inventoryitems set inventoryID = inventoryIDold, avatarID = avatarIDold, parentFolderID = parentFolderIDold; -ALTER TABLE inventoryitems drop inventoryIDold; -ALTER TABLE inventoryitems drop avatarIDold; -ALTER TABLE inventoryitems drop parentFolderIDold; -ALTER TABLE inventoryitems add constraint primary key(inventoryID); -ALTER TABLE inventoryitems add index inventoryitems_avatarid(avatarID); -ALTER TABLE inventoryitems add index inventoryitems_parentFolderid(parentFolderID); - -COMMIT; \ No newline at end of file diff --git a/OpenSim/Data/MySQL/Resources/002_RegionStore.sql b/OpenSim/Data/MySQL/Resources/002_RegionStore.sql deleted file mode 100644 index 45bf959d40..0000000000 --- a/OpenSim/Data/MySQL/Resources/002_RegionStore.sql +++ /dev/null @@ -1,6 +0,0 @@ -BEGIN; - -CREATE index prims_regionuuid on prims(RegionUUID); -CREATE index primitems_primid on primitems(primID); - -COMMIT; \ No newline at end of file diff --git a/OpenSim/Data/MySQL/Resources/002_UserAccount.sql b/OpenSim/Data/MySQL/Resources/002_UserAccount.sql deleted file mode 100644 index ad2ddda239..0000000000 --- a/OpenSim/Data/MySQL/Resources/002_UserAccount.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -INSERT INTO UserAccounts (PrincipalID, ScopeID, FirstName, LastName, Email, ServiceURLs, Created) SELECT `UUID` AS PrincipalID, '00000000-0000-0000-0000-000000000000' AS ScopeID, username AS FirstName, lastname AS LastName, email as Email, CONCAT('AssetServerURI=', userAssetURI, ' InventoryServerURI=', userInventoryURI, ' GatewayURI= HomeURI=') AS ServiceURLs, created as Created FROM users; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/002_UserStore.sql b/OpenSim/Data/MySQL/Resources/002_UserStore.sql deleted file mode 100644 index 393cea0f12..0000000000 --- a/OpenSim/Data/MySQL/Resources/002_UserStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -ALTER TABLE users add homeRegionID char(36) NOT NULL default '00000000-0000-0000-0000-000000000000'; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/003_AssetStore.sql b/OpenSim/Data/MySQL/Resources/003_AssetStore.sql deleted file mode 100644 index d489278f13..0000000000 --- a/OpenSim/Data/MySQL/Resources/003_AssetStore.sql +++ /dev/null @@ -1,9 +0,0 @@ -BEGIN; - -ALTER TABLE assets change id oldid varchar(36); -ALTER TABLE assets add id char(36) not null default '00000000-0000-0000-0000-000000000000'; -UPDATE assets set id = oldid; -ALTER TABLE assets drop oldid; -ALTER TABLE assets add constraint primary key(id); - -COMMIT; \ No newline at end of file diff --git a/OpenSim/Data/MySQL/Resources/003_AuthStore.sql b/OpenSim/Data/MySQL/Resources/003_AuthStore.sql deleted file mode 100644 index af9ffe6f1d..0000000000 --- a/OpenSim/Data/MySQL/Resources/003_AuthStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -ALTER TABLE `auth` ADD COLUMN `accountType` VARCHAR(32) NOT NULL DEFAULT 'UserAccount'; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/003_GridStore.sql b/OpenSim/Data/MySQL/Resources/003_GridStore.sql deleted file mode 100644 index bc3fe7df7a..0000000000 --- a/OpenSim/Data/MySQL/Resources/003_GridStore.sql +++ /dev/null @@ -1,7 +0,0 @@ -BEGIN; - -ALTER TABLE regions add column ScopeID char(36) not null default '00000000-0000-0000-0000-000000000000'; - -create index ScopeID on regions(ScopeID); - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/003_InventoryStore.sql b/OpenSim/Data/MySQL/Resources/003_InventoryStore.sql deleted file mode 100644 index 4c6da91aab..0000000000 --- a/OpenSim/Data/MySQL/Resources/003_InventoryStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -alter table inventoryitems add column inventoryGroupPermissions integer unsigned not null default 0; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/003_RegionStore.sql b/OpenSim/Data/MySQL/Resources/003_RegionStore.sql deleted file mode 100644 index cb0a6141cc..0000000000 --- a/OpenSim/Data/MySQL/Resources/003_RegionStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - - CREATE TABLE regionban (regionUUID VARCHAR(36) NOT NULL, bannedUUID VARCHAR(36) NOT NULL, bannedIp VARCHAR(16) NOT NULL, bannedIpHostMask VARCHAR(16) NOT NULL) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='Rev. 1'; - -COMMIT; \ No newline at end of file diff --git a/OpenSim/Data/MySQL/Resources/003_UserAccount.sql b/OpenSim/Data/MySQL/Resources/003_UserAccount.sql deleted file mode 100644 index e42d93b92c..0000000000 --- a/OpenSim/Data/MySQL/Resources/003_UserAccount.sql +++ /dev/null @@ -1,9 +0,0 @@ -BEGIN; - -CREATE UNIQUE INDEX PrincipalID ON UserAccounts(PrincipalID); -CREATE INDEX Email ON UserAccounts(Email); -CREATE INDEX FirstName ON UserAccounts(FirstName); -CREATE INDEX LastName ON UserAccounts(LastName); -CREATE INDEX Name ON UserAccounts(FirstName,LastName); - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/003_UserStore.sql b/OpenSim/Data/MySQL/Resources/003_UserStore.sql deleted file mode 100644 index 6f890eeec1..0000000000 --- a/OpenSim/Data/MySQL/Resources/003_UserStore.sql +++ /dev/null @@ -1,6 +0,0 @@ -BEGIN; - -ALTER TABLE users add userFlags integer NOT NULL default 0; -ALTER TABLE users add godLevel integer NOT NULL default 0; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/004_AssetStore.sql b/OpenSim/Data/MySQL/Resources/004_AssetStore.sql deleted file mode 100644 index ae1951df39..0000000000 --- a/OpenSim/Data/MySQL/Resources/004_AssetStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -ALTER TABLE assets drop InvType; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/004_GridStore.sql b/OpenSim/Data/MySQL/Resources/004_GridStore.sql deleted file mode 100644 index 2238a888ea..0000000000 --- a/OpenSim/Data/MySQL/Resources/004_GridStore.sql +++ /dev/null @@ -1,6 +0,0 @@ -BEGIN; - -ALTER TABLE regions add column sizeX integer not null default 0; -ALTER TABLE regions add column sizeY integer not null default 0; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/004_InventoryStore.sql b/OpenSim/Data/MySQL/Resources/004_InventoryStore.sql deleted file mode 100644 index c45f773904..0000000000 --- a/OpenSim/Data/MySQL/Resources/004_InventoryStore.sql +++ /dev/null @@ -1,7 +0,0 @@ -BEGIN; - -update inventoryitems set creatorID = '00000000-0000-0000-0000-000000000000' where creatorID is NULL; -update inventoryitems set creatorID = '00000000-0000-0000-0000-000000000000' where creatorID = ''; -alter table inventoryitems modify column creatorID varchar(36) not NULL default '00000000-0000-0000-0000-000000000000'; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/004_RegionStore.sql b/OpenSim/Data/MySQL/Resources/004_RegionStore.sql deleted file mode 100644 index 4db2f7587d..0000000000 --- a/OpenSim/Data/MySQL/Resources/004_RegionStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -ALTER TABLE primitems add flags integer not null default 0; - -COMMIT; \ No newline at end of file diff --git a/OpenSim/Data/MySQL/Resources/004_UserAccount.sql b/OpenSim/Data/MySQL/Resources/004_UserAccount.sql deleted file mode 100644 index 8abcd53a16..0000000000 --- a/OpenSim/Data/MySQL/Resources/004_UserAccount.sql +++ /dev/null @@ -1,8 +0,0 @@ -BEGIN; - -ALTER TABLE UserAccounts ADD COLUMN UserLevel integer NOT NULL DEFAULT 0; -ALTER TABLE UserAccounts ADD COLUMN UserFlags integer NOT NULL DEFAULT 0; -ALTER TABLE UserAccounts ADD COLUMN UserTitle varchar(64) NOT NULL DEFAULT ''; - -COMMIT; - diff --git a/OpenSim/Data/MySQL/Resources/004_UserStore.sql b/OpenSim/Data/MySQL/Resources/004_UserStore.sql deleted file mode 100644 index 03142afa37..0000000000 --- a/OpenSim/Data/MySQL/Resources/004_UserStore.sql +++ /dev/null @@ -1,6 +0,0 @@ -BEGIN; - -ALTER TABLE users add customType varchar(32) not null default ''; -ALTER TABLE users add partner char(36) not null default '00000000-0000-0000-0000-000000000000'; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/005_AssetStore.sql b/OpenSim/Data/MySQL/Resources/005_AssetStore.sql deleted file mode 100644 index bfeb6525af..0000000000 --- a/OpenSim/Data/MySQL/Resources/005_AssetStore.sql +++ /dev/null @@ -1,6 +0,0 @@ -BEGIN; - -ALTER TABLE assets add create_time integer default 0; -ALTER TABLE assets add access_time integer default 0; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/005_GridStore.sql b/OpenSim/Data/MySQL/Resources/005_GridStore.sql deleted file mode 100644 index 835ba89369..0000000000 --- a/OpenSim/Data/MySQL/Resources/005_GridStore.sql +++ /dev/null @@ -1,6 +0,0 @@ -BEGIN; - -ALTER TABLE `regions` ADD COLUMN `flags` integer NOT NULL DEFAULT 0; -CREATE INDEX flags ON regions(flags); - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/005_RegionStore.sql b/OpenSim/Data/MySQL/Resources/005_RegionStore.sql deleted file mode 100644 index c4a9527403..0000000000 --- a/OpenSim/Data/MySQL/Resources/005_RegionStore.sql +++ /dev/null @@ -1,40 +0,0 @@ -BEGIN; - -create table regionsettings ( - regionUUID char(36) not null, - block_terraform integer not null, - block_fly integer not null, - allow_damage integer not null, - restrict_pushing integer not null, - allow_land_resell integer not null, - allow_land_join_divide integer not null, - block_show_in_search integer not null, - agent_limit integer not null, - object_bonus float not null, - maturity integer not null, - disable_scripts integer not null, - disable_collisions integer not null, - disable_physics integer not null, - terrain_texture_1 char(36) not null, - terrain_texture_2 char(36) not null, - terrain_texture_3 char(36) not null, - terrain_texture_4 char(36) not null, - elevation_1_nw float not null, - elevation_2_nw float not null, - elevation_1_ne float not null, - elevation_2_ne float not null, - elevation_1_se float not null, - elevation_2_se float not null, - elevation_1_sw float not null, - elevation_2_sw float not null, - water_height float not null, - terrain_raise_limit float not null, - terrain_lower_limit float not null, - use_estate_sun integer not null, - fixed_sun integer not null, - sun_position float not null, - covenant char(36), - primary key(regionUUID) -); - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/005_UserStore.sql b/OpenSim/Data/MySQL/Resources/005_UserStore.sql deleted file mode 100644 index 55896bc9a0..0000000000 --- a/OpenSim/Data/MySQL/Resources/005_UserStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -CREATE TABLE `avatarattachments` (`UUID` char(36) NOT NULL, `attachpoint` int(11) NOT NULL, `item` char(36) NOT NULL, `asset` char(36) NOT NULL) ENGINE=InnoDB; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/006_AssetStore.sql b/OpenSim/Data/MySQL/Resources/006_AssetStore.sql deleted file mode 100644 index 31043537a3..0000000000 --- a/OpenSim/Data/MySQL/Resources/006_AssetStore.sql +++ /dev/null @@ -1 +0,0 @@ -DELETE FROM assets WHERE id = 'dc4b9f0b-d008-45c6-96a4-01dd947ac621' diff --git a/OpenSim/Data/MySQL/Resources/006_GridStore.sql b/OpenSim/Data/MySQL/Resources/006_GridStore.sql deleted file mode 100644 index 91322d6431..0000000000 --- a/OpenSim/Data/MySQL/Resources/006_GridStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -ALTER TABLE `regions` ADD COLUMN `last_seen` integer NOT NULL DEFAULT 0; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/006_RegionStore.sql b/OpenSim/Data/MySQL/Resources/006_RegionStore.sql deleted file mode 100644 index c1ba5b808d..0000000000 --- a/OpenSim/Data/MySQL/Resources/006_RegionStore.sql +++ /dev/null @@ -1,12 +0,0 @@ -BEGIN; - -alter table landaccesslist ENGINE = InnoDB; -alter table migrations ENGINE = InnoDB; -alter table primitems ENGINE = InnoDB; -alter table prims ENGINE = InnoDB; -alter table primshapes ENGINE = InnoDB; -alter table regionsettings ENGINE = InnoDB; -alter table terrain ENGINE = InnoDB; - -COMMIT; - diff --git a/OpenSim/Data/MySQL/Resources/006_UserStore.sql b/OpenSim/Data/MySQL/Resources/006_UserStore.sql deleted file mode 100644 index 10b321e601..0000000000 --- a/OpenSim/Data/MySQL/Resources/006_UserStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -ALTER TABLE agents add currentLookAt varchar(36) not null default ''; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/007_GridStore.sql b/OpenSim/Data/MySQL/Resources/007_GridStore.sql deleted file mode 100644 index dbec58432e..0000000000 --- a/OpenSim/Data/MySQL/Resources/007_GridStore.sql +++ /dev/null @@ -1,7 +0,0 @@ -BEGIN; - -ALTER TABLE `regions` ADD COLUMN `PrincipalID` char(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000'; -ALTER TABLE `regions` ADD COLUMN `Token` varchar(255) NOT NULL; - -COMMIT; - diff --git a/OpenSim/Data/MySQL/Resources/007_RegionStore.sql b/OpenSim/Data/MySQL/Resources/007_RegionStore.sql deleted file mode 100644 index 404d248e6b..0000000000 --- a/OpenSim/Data/MySQL/Resources/007_RegionStore.sql +++ /dev/null @@ -1,25 +0,0 @@ -BEGIN; - -ALTER TABLE prims change UUID UUIDold varchar(255); -ALTER TABLE prims change RegionUUID RegionUUIDold varchar(255); -ALTER TABLE prims change CreatorID CreatorIDold varchar(255); -ALTER TABLE prims change OwnerID OwnerIDold varchar(255); -ALTER TABLE prims change GroupID GroupIDold varchar(255); -ALTER TABLE prims change LastOwnerID LastOwnerIDold varchar(255); -ALTER TABLE prims add UUID char(36); -ALTER TABLE prims add RegionUUID char(36); -ALTER TABLE prims add CreatorID char(36); -ALTER TABLE prims add OwnerID char(36); -ALTER TABLE prims add GroupID char(36); -ALTER TABLE prims add LastOwnerID char(36); -UPDATE prims set UUID = UUIDold, RegionUUID = RegionUUIDold, CreatorID = CreatorIDold, OwnerID = OwnerIDold, GroupID = GroupIDold, LastOwnerID = LastOwnerIDold; -ALTER TABLE prims drop UUIDold; -ALTER TABLE prims drop RegionUUIDold; -ALTER TABLE prims drop CreatorIDold; -ALTER TABLE prims drop OwnerIDold; -ALTER TABLE prims drop GroupIDold; -ALTER TABLE prims drop LastOwnerIDold; -ALTER TABLE prims add constraint primary key(UUID); -ALTER TABLE prims add index prims_regionuuid(RegionUUID); - -COMMIT; \ No newline at end of file diff --git a/OpenSim/Data/MySQL/Resources/007_UserStore.sql b/OpenSim/Data/MySQL/Resources/007_UserStore.sql deleted file mode 100644 index 3ab5261373..0000000000 --- a/OpenSim/Data/MySQL/Resources/007_UserStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -ALTER TABLE users add email varchar(250); - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/008_RegionStore.sql b/OpenSim/Data/MySQL/Resources/008_RegionStore.sql deleted file mode 100644 index 7bc61c04e4..0000000000 --- a/OpenSim/Data/MySQL/Resources/008_RegionStore.sql +++ /dev/null @@ -1,9 +0,0 @@ -BEGIN; - -ALTER TABLE primshapes change UUID UUIDold varchar(255); -ALTER TABLE primshapes add UUID char(36); -UPDATE primshapes set UUID = UUIDold; -ALTER TABLE primshapes drop UUIDold; -ALTER TABLE primshapes add constraint primary key(UUID); - -COMMIT; \ No newline at end of file diff --git a/OpenSim/Data/MySQL/Resources/008_UserStore.sql b/OpenSim/Data/MySQL/Resources/008_UserStore.sql deleted file mode 100644 index 4500bd5d7b..0000000000 --- a/OpenSim/Data/MySQL/Resources/008_UserStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -ALTER TABLE users add scopeID char(36) not null default '00000000-0000-0000-0000-000000000000'; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/009_RegionStore.sql b/OpenSim/Data/MySQL/Resources/009_RegionStore.sql deleted file mode 100644 index 284732aa6f..0000000000 --- a/OpenSim/Data/MySQL/Resources/009_RegionStore.sql +++ /dev/null @@ -1,31 +0,0 @@ -BEGIN; - -ALTER TABLE primitems change itemID itemIDold varchar(255); -ALTER TABLE primitems change primID primIDold varchar(255); -ALTER TABLE primitems change assetID assetIDold varchar(255); -ALTER TABLE primitems change parentFolderID parentFolderIDold varchar(255); -ALTER TABLE primitems change creatorID creatorIDold varchar(255); -ALTER TABLE primitems change ownerID ownerIDold varchar(255); -ALTER TABLE primitems change groupID groupIDold varchar(255); -ALTER TABLE primitems change lastOwnerID lastOwnerIDold varchar(255); -ALTER TABLE primitems add itemID char(36); -ALTER TABLE primitems add primID char(36); -ALTER TABLE primitems add assetID char(36); -ALTER TABLE primitems add parentFolderID char(36); -ALTER TABLE primitems add creatorID char(36); -ALTER TABLE primitems add ownerID char(36); -ALTER TABLE primitems add groupID char(36); -ALTER TABLE primitems add lastOwnerID char(36); -UPDATE primitems set itemID = itemIDold, primID = primIDold, assetID = assetIDold, parentFolderID = parentFolderIDold, creatorID = creatorIDold, ownerID = ownerIDold, groupID = groupIDold, lastOwnerID = lastOwnerIDold; -ALTER TABLE primitems drop itemIDold; -ALTER TABLE primitems drop primIDold; -ALTER TABLE primitems drop assetIDold; -ALTER TABLE primitems drop parentFolderIDold; -ALTER TABLE primitems drop creatorIDold; -ALTER TABLE primitems drop ownerIDold; -ALTER TABLE primitems drop groupIDold; -ALTER TABLE primitems drop lastOwnerIDold; -ALTER TABLE primitems add constraint primary key(itemID); -ALTER TABLE primitems add index primitems_primid(primID); - -COMMIT; \ No newline at end of file diff --git a/OpenSim/Data/MySQL/Resources/010_RegionStore.sql b/OpenSim/Data/MySQL/Resources/010_RegionStore.sql deleted file mode 100644 index 031a746aeb..0000000000 --- a/OpenSim/Data/MySQL/Resources/010_RegionStore.sql +++ /dev/null @@ -1,9 +0,0 @@ -# 1 "010_RegionStore.sql" -# 1 "" -# 1 "" -# 1 "010_RegionStore.sql" -BEGIN; - -DELETE FROM regionsettings; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/011_RegionStore.sql b/OpenSim/Data/MySQL/Resources/011_RegionStore.sql deleted file mode 100644 index ab0196934a..0000000000 --- a/OpenSim/Data/MySQL/Resources/011_RegionStore.sql +++ /dev/null @@ -1,9 +0,0 @@ -BEGIN; - -ALTER TABLE prims change SceneGroupID SceneGroupIDold varchar(255); -ALTER TABLE prims add SceneGroupID char(36); -UPDATE prims set SceneGroupID = SceneGroupIDold; -ALTER TABLE prims drop SceneGroupIDold; -ALTER TABLE prims add index prims_scenegroupid(SceneGroupID); - -COMMIT; \ No newline at end of file diff --git a/OpenSim/Data/MySQL/Resources/012_RegionStore.sql b/OpenSim/Data/MySQL/Resources/012_RegionStore.sql deleted file mode 100644 index 95c27573de..0000000000 --- a/OpenSim/Data/MySQL/Resources/012_RegionStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -ALTER TABLE prims add index prims_parentid(ParentID); - -COMMIT; \ No newline at end of file diff --git a/OpenSim/Data/MySQL/Resources/013_RegionStore.sql b/OpenSim/Data/MySQL/Resources/013_RegionStore.sql deleted file mode 100644 index a6bd30da50..0000000000 --- a/OpenSim/Data/MySQL/Resources/013_RegionStore.sql +++ /dev/null @@ -1,103 +0,0 @@ -begin; - -drop table regionsettings; - -CREATE TABLE `regionsettings` ( - `regionUUID` char(36) NOT NULL, - `block_terraform` int(11) NOT NULL, - `block_fly` int(11) NOT NULL, - `allow_damage` int(11) NOT NULL, - `restrict_pushing` int(11) NOT NULL, - `allow_land_resell` int(11) NOT NULL, - `allow_land_join_divide` int(11) NOT NULL, - `block_show_in_search` int(11) NOT NULL, - `agent_limit` int(11) NOT NULL, - `object_bonus` float NOT NULL, - `maturity` int(11) NOT NULL, - `disable_scripts` int(11) NOT NULL, - `disable_collisions` int(11) NOT NULL, - `disable_physics` int(11) NOT NULL, - `terrain_texture_1` char(36) NOT NULL, - `terrain_texture_2` char(36) NOT NULL, - `terrain_texture_3` char(36) NOT NULL, - `terrain_texture_4` char(36) NOT NULL, - `elevation_1_nw` float NOT NULL, - `elevation_2_nw` float NOT NULL, - `elevation_1_ne` float NOT NULL, - `elevation_2_ne` float NOT NULL, - `elevation_1_se` float NOT NULL, - `elevation_2_se` float NOT NULL, - `elevation_1_sw` float NOT NULL, - `elevation_2_sw` float NOT NULL, - `water_height` float NOT NULL, - `terrain_raise_limit` float NOT NULL, - `terrain_lower_limit` float NOT NULL, - `use_estate_sun` int(11) NOT NULL, - `fixed_sun` int(11) NOT NULL, - `sun_position` float NOT NULL, - `covenant` char(36) default NULL, - `Sandbox` tinyint(4) NOT NULL, - PRIMARY KEY (`regionUUID`) -) ENGINE=InnoDB; - -CREATE TABLE `estate_managers` ( - `EstateID` int(10) unsigned NOT NULL, - `uuid` char(36) NOT NULL, - KEY `EstateID` (`EstateID`) -) ENGINE=InnoDB; - -CREATE TABLE `estate_groups` ( - `EstateID` int(10) unsigned NOT NULL, - `uuid` char(36) NOT NULL, - KEY `EstateID` (`EstateID`) -) ENGINE=InnoDB; - -CREATE TABLE `estate_users` ( - `EstateID` int(10) unsigned NOT NULL, - `uuid` char(36) NOT NULL, - KEY `EstateID` (`EstateID`) -) ENGINE=InnoDB; - -CREATE TABLE `estateban` ( - `EstateID` int(10) unsigned NOT NULL, - `bannedUUID` varchar(36) NOT NULL, - `bannedIp` varchar(16) NOT NULL, - `bannedIpHostMask` varchar(16) NOT NULL, - `bannedNameMask` varchar(64) default NULL, - KEY `estateban_EstateID` (`EstateID`) -) ENGINE=InnoDB; - -CREATE TABLE `estate_settings` ( - `EstateID` int(10) unsigned NOT NULL auto_increment, - `EstateName` varchar(64) default NULL, - `AbuseEmailToEstateOwner` tinyint(4) NOT NULL, - `DenyAnonymous` tinyint(4) NOT NULL, - `ResetHomeOnTeleport` tinyint(4) NOT NULL, - `FixedSun` tinyint(4) NOT NULL, - `DenyTransacted` tinyint(4) NOT NULL, - `BlockDwell` tinyint(4) NOT NULL, - `DenyIdentified` tinyint(4) NOT NULL, - `AllowVoice` tinyint(4) NOT NULL, - `UseGlobalTime` tinyint(4) NOT NULL, - `PricePerMeter` int(11) NOT NULL, - `TaxFree` tinyint(4) NOT NULL, - `AllowDirectTeleport` tinyint(4) NOT NULL, - `RedirectGridX` int(11) NOT NULL, - `RedirectGridY` int(11) NOT NULL, - `ParentEstateID` int(10) unsigned NOT NULL, - `SunPosition` double NOT NULL, - `EstateSkipScripts` tinyint(4) NOT NULL, - `BillableFactor` float NOT NULL, - `PublicAccess` tinyint(4) NOT NULL, - PRIMARY KEY (`EstateID`) -) ENGINE=InnoDB AUTO_INCREMENT=100; - -CREATE TABLE `estate_map` ( - `RegionID` char(36) NOT NULL default '00000000-0000-0000-0000-000000000000', - `EstateID` int(11) NOT NULL, - PRIMARY KEY (`RegionID`), - KEY `EstateID` (`EstateID`) -) ENGINE=InnoDB; - -commit; - diff --git a/OpenSim/Data/MySQL/Resources/014_RegionStore.sql b/OpenSim/Data/MySQL/Resources/014_RegionStore.sql deleted file mode 100644 index 788fd63c42..0000000000 --- a/OpenSim/Data/MySQL/Resources/014_RegionStore.sql +++ /dev/null @@ -1,8 +0,0 @@ -begin; - -alter table estate_settings add column AbuseEmail varchar(255) not null; - -alter table estate_settings add column EstateOwner varchar(36) not null; - -commit; - diff --git a/OpenSim/Data/MySQL/Resources/015_RegionStore.sql b/OpenSim/Data/MySQL/Resources/015_RegionStore.sql deleted file mode 100644 index 6d4f9f332f..0000000000 --- a/OpenSim/Data/MySQL/Resources/015_RegionStore.sql +++ /dev/null @@ -1,6 +0,0 @@ -begin; - -alter table estate_settings add column DenyMinors tinyint not null; - -commit; - diff --git a/OpenSim/Data/MySQL/Resources/016_RegionStore.sql b/OpenSim/Data/MySQL/Resources/016_RegionStore.sql deleted file mode 100644 index 9bc265e5ff..0000000000 --- a/OpenSim/Data/MySQL/Resources/016_RegionStore.sql +++ /dev/null @@ -1,27 +0,0 @@ -BEGIN; - -ALTER TABLE prims ADD COLUMN PayPrice integer not null default 0; -ALTER TABLE prims ADD COLUMN PayButton1 integer not null default 0; -ALTER TABLE prims ADD COLUMN PayButton2 integer not null default 0; -ALTER TABLE prims ADD COLUMN PayButton3 integer not null default 0; -ALTER TABLE prims ADD COLUMN PayButton4 integer not null default 0; -ALTER TABLE prims ADD COLUMN LoopedSound char(36) not null default '00000000-0000-0000-0000-000000000000'; -ALTER TABLE prims ADD COLUMN LoopedSoundGain float not null default 0.0; -ALTER TABLE prims ADD COLUMN TextureAnimation blob; -ALTER TABLE prims ADD COLUMN OmegaX float not null default 0.0; -ALTER TABLE prims ADD COLUMN OmegaY float not null default 0.0; -ALTER TABLE prims ADD COLUMN OmegaZ float not null default 0.0; -ALTER TABLE prims ADD COLUMN CameraEyeOffsetX float not null default 0.0; -ALTER TABLE prims ADD COLUMN CameraEyeOffsetY float not null default 0.0; -ALTER TABLE prims ADD COLUMN CameraEyeOffsetZ float not null default 0.0; -ALTER TABLE prims ADD COLUMN CameraAtOffsetX float not null default 0.0; -ALTER TABLE prims ADD COLUMN CameraAtOffsetY float not null default 0.0; -ALTER TABLE prims ADD COLUMN CameraAtOffsetZ float not null default 0.0; -ALTER TABLE prims ADD COLUMN ForceMouselook tinyint not null default 0; -ALTER TABLE prims ADD COLUMN ScriptAccessPin integer not null default 0; -ALTER TABLE prims ADD COLUMN AllowedDrop tinyint not null default 0; -ALTER TABLE prims ADD COLUMN DieAtEdge tinyint not null default 0; -ALTER TABLE prims ADD COLUMN SalePrice integer not null default 10; -ALTER TABLE prims ADD COLUMN SaleType tinyint not null default 0; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/017_RegionStore.sql b/OpenSim/Data/MySQL/Resources/017_RegionStore.sql deleted file mode 100644 index 0304f30b72..0000000000 --- a/OpenSim/Data/MySQL/Resources/017_RegionStore.sql +++ /dev/null @@ -1,9 +0,0 @@ -BEGIN; - -ALTER TABLE prims ADD COLUMN ColorR integer not null default 0; -ALTER TABLE prims ADD COLUMN ColorG integer not null default 0; -ALTER TABLE prims ADD COLUMN ColorB integer not null default 0; -ALTER TABLE prims ADD COLUMN ColorA integer not null default 0; -ALTER TABLE prims ADD COLUMN ParticleSystem blob; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/018_RegionStore.sql b/OpenSim/Data/MySQL/Resources/018_RegionStore.sql deleted file mode 100644 index 68c489c7bf..0000000000 --- a/OpenSim/Data/MySQL/Resources/018_RegionStore.sql +++ /dev/null @@ -1,6 +0,0 @@ -begin; - -ALTER TABLE prims ADD COLUMN ClickAction tinyint NOT NULL default 0; - -commit; - diff --git a/OpenSim/Data/MySQL/Resources/019_RegionStore.sql b/OpenSim/Data/MySQL/Resources/019_RegionStore.sql deleted file mode 100644 index 4c14f2a5f4..0000000000 --- a/OpenSim/Data/MySQL/Resources/019_RegionStore.sql +++ /dev/null @@ -1,6 +0,0 @@ -begin; - -ALTER TABLE prims ADD COLUMN Material tinyint NOT NULL default 3; - -commit; - diff --git a/OpenSim/Data/MySQL/Resources/020_RegionStore.sql b/OpenSim/Data/MySQL/Resources/020_RegionStore.sql deleted file mode 100644 index 814ef48bb6..0000000000 --- a/OpenSim/Data/MySQL/Resources/020_RegionStore.sql +++ /dev/null @@ -1,7 +0,0 @@ -begin; - -ALTER TABLE land ADD COLUMN OtherCleanTime integer NOT NULL default 0; -ALTER TABLE land ADD COLUMN Dwell integer NOT NULL default 0; - -commit; - diff --git a/OpenSim/Data/MySQL/Resources/021_RegionStore.sql b/OpenSim/Data/MySQL/Resources/021_RegionStore.sql deleted file mode 100644 index c59b27e745..0000000000 --- a/OpenSim/Data/MySQL/Resources/021_RegionStore.sql +++ /dev/null @@ -1,8 +0,0 @@ -begin; - -ALTER TABLE regionsettings ADD COLUMN sunvectorx double NOT NULL default 0; -ALTER TABLE regionsettings ADD COLUMN sunvectory double NOT NULL default 0; -ALTER TABLE regionsettings ADD COLUMN sunvectorz double NOT NULL default 0; - -commit; - diff --git a/OpenSim/Data/MySQL/Resources/022_RegionStore.sql b/OpenSim/Data/MySQL/Resources/022_RegionStore.sql deleted file mode 100644 index df0bb7dac9..0000000000 --- a/OpenSim/Data/MySQL/Resources/022_RegionStore.sql +++ /dev/null @@ -1,6 +0,0 @@ -BEGIN; - -ALTER TABLE prims ADD COLUMN CollisionSound char(36) not null default '00000000-0000-0000-0000-000000000000'; -ALTER TABLE prims ADD COLUMN CollisionSoundVolume float not null default 0.0; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/023_RegionStore.sql b/OpenSim/Data/MySQL/Resources/023_RegionStore.sql deleted file mode 100644 index 559591fba5..0000000000 --- a/OpenSim/Data/MySQL/Resources/023_RegionStore.sql +++ /dev/null @@ -1,6 +0,0 @@ -BEGIN; - -ALTER TABLE prims ADD COLUMN LinkNumber integer not null default 0; - -COMMIT; - diff --git a/OpenSim/Data/MySQL/Resources/024_RegionStore.sql b/OpenSim/Data/MySQL/Resources/024_RegionStore.sql deleted file mode 100644 index defbf5cbb1..0000000000 --- a/OpenSim/Data/MySQL/Resources/024_RegionStore.sql +++ /dev/null @@ -1,18 +0,0 @@ -BEGIN; - -alter table regionsettings change column `object_bonus` `object_bonus` double NOT NULL; -alter table regionsettings change column `elevation_1_nw` `elevation_1_nw` double NOT NULL; -alter table regionsettings change column `elevation_2_nw` `elevation_2_nw` double NOT NULL; -alter table regionsettings change column `elevation_1_ne` `elevation_1_ne` double NOT NULL; -alter table regionsettings change column `elevation_2_ne` `elevation_2_ne` double NOT NULL; -alter table regionsettings change column `elevation_1_se` `elevation_1_se` double NOT NULL; -alter table regionsettings change column `elevation_2_se` `elevation_2_se` double NOT NULL; -alter table regionsettings change column `elevation_1_sw` `elevation_1_sw` double NOT NULL; -alter table regionsettings change column `elevation_2_sw` `elevation_2_sw` double NOT NULL; -alter table regionsettings change column `water_height` `water_height` double NOT NULL; -alter table regionsettings change column `terrain_raise_limit` `terrain_raise_limit` double NOT NULL; -alter table regionsettings change column `terrain_lower_limit` `terrain_lower_limit` double NOT NULL; -alter table regionsettings change column `sun_position` `sun_position` double NOT NULL; - -COMMIT; - diff --git a/OpenSim/Data/MySQL/Resources/025_RegionStore.sql b/OpenSim/Data/MySQL/Resources/025_RegionStore.sql deleted file mode 100644 index e8f5d70e47..0000000000 --- a/OpenSim/Data/MySQL/Resources/025_RegionStore.sql +++ /dev/null @@ -1,46 +0,0 @@ -BEGIN; - -alter table prims change column `PositionX` `PositionX` double default NULL; -alter table prims change column `PositionY` `PositionY` double default NULL; -alter table prims change column `PositionZ` `PositionZ` double default NULL; -alter table prims change column `GroupPositionX` `GroupPositionX` double default NULL; -alter table prims change column `GroupPositionY` `GroupPositionY` double default NULL; -alter table prims change column `GroupPositionZ` `GroupPositionZ` double default NULL; -alter table prims change column `VelocityX` `VelocityX` double default NULL; -alter table prims change column `VelocityY` `VelocityY` double default NULL; -alter table prims change column `VelocityZ` `VelocityZ` double default NULL; -alter table prims change column `AngularVelocityX` `AngularVelocityX` double default NULL; -alter table prims change column `AngularVelocityY` `AngularVelocityY` double default NULL; -alter table prims change column `AngularVelocityZ` `AngularVelocityZ` double default NULL; -alter table prims change column `AccelerationX` `AccelerationX` double default NULL; -alter table prims change column `AccelerationY` `AccelerationY` double default NULL; -alter table prims change column `AccelerationZ` `AccelerationZ` double default NULL; -alter table prims change column `RotationX` `RotationX` double default NULL; -alter table prims change column `RotationY` `RotationY` double default NULL; -alter table prims change column `RotationZ` `RotationZ` double default NULL; -alter table prims change column `RotationW` `RotationW` double default NULL; -alter table prims change column `SitTargetOffsetX` `SitTargetOffsetX` double default NULL; -alter table prims change column `SitTargetOffsetY` `SitTargetOffsetY` double default NULL; -alter table prims change column `SitTargetOffsetZ` `SitTargetOffsetZ` double default NULL; -alter table prims change column `SitTargetOrientW` `SitTargetOrientW` double default NULL; -alter table prims change column `SitTargetOrientX` `SitTargetOrientX` double default NULL; -alter table prims change column `SitTargetOrientY` `SitTargetOrientY` double default NULL; -alter table prims change column `SitTargetOrientZ` `SitTargetOrientZ` double default NULL; -alter table prims change column `LoopedSoundGain` `LoopedSoundGain` double NOT NULL default '0'; -alter table prims change column `OmegaX` `OmegaX` double NOT NULL default '0'; -alter table prims change column `OmegaY` `OmegaY` double NOT NULL default '0'; -alter table prims change column `OmegaZ` `OmegaZ` double NOT NULL default '0'; -alter table prims change column `CameraEyeOffsetX` `CameraEyeOffsetX` double NOT NULL default '0'; -alter table prims change column `CameraEyeOffsetY` `CameraEyeOffsetY` double NOT NULL default '0'; -alter table prims change column `CameraEyeOffsetZ` `CameraEyeOffsetZ` double NOT NULL default '0'; -alter table prims change column `CameraAtOffsetX` `CameraAtOffsetX` double NOT NULL default '0'; -alter table prims change column `CameraAtOffsetY` `CameraAtOffsetY` double NOT NULL default '0'; -alter table prims change column `CameraAtOffsetZ` `CameraAtOffsetZ` double NOT NULL default '0'; -alter table prims change column `CollisionSoundVolume` `CollisionSoundVolume` double NOT NULL default '0'; - -alter table primshapes change column `ScaleX` `ScaleX` double NOT NULL default '0'; -alter table primshapes change column `ScaleY` `ScaleY` double NOT NULL default '0'; -alter table primshapes change column `ScaleZ` `ScaleZ` double NOT NULL default '0'; - -COMMIT; - diff --git a/OpenSim/Data/MySQL/Resources/026_RegionStore.sql b/OpenSim/Data/MySQL/Resources/026_RegionStore.sql deleted file mode 100644 index 91af8a84c8..0000000000 --- a/OpenSim/Data/MySQL/Resources/026_RegionStore.sql +++ /dev/null @@ -1,41 +0,0 @@ -begin; - -alter table prims change column `PositionX` `PositionX` double default NULL; -alter table prims change column `PositionY` `PositionY` double default NULL; -alter table prims change column `PositionZ` `PositionZ` double default NULL; -alter table prims change column `GroupPositionX` `GroupPositionX` double default NULL; -alter table prims change column `GroupPositionY` `GroupPositionY` double default NULL; -alter table prims change column `GroupPositionZ` `GroupPositionZ` double default NULL; -alter table prims change column `VelocityX` `VelocityX` double default NULL; -alter table prims change column `VelocityY` `VelocityY` double default NULL; -alter table prims change column `VelocityZ` `VelocityZ` double default NULL; -alter table prims change column `AngularVelocityX` `AngularVelocityX` double default NULL; -alter table prims change column `AngularVelocityY` `AngularVelocityY` double default NULL; -alter table prims change column `AngularVelocityZ` `AngularVelocityZ` double default NULL; -alter table prims change column `AccelerationX` `AccelerationX` double default NULL; -alter table prims change column `AccelerationY` `AccelerationY` double default NULL; -alter table prims change column `AccelerationZ` `AccelerationZ` double default NULL; -alter table prims change column `RotationX` `RotationX` double default NULL; -alter table prims change column `RotationY` `RotationY` double default NULL; -alter table prims change column `RotationZ` `RotationZ` double default NULL; -alter table prims change column `RotationW` `RotationW` double default NULL; -alter table prims change column `SitTargetOffsetX` `SitTargetOffsetX` double default NULL; -alter table prims change column `SitTargetOffsetY` `SitTargetOffsetY` double default NULL; -alter table prims change column `SitTargetOffsetZ` `SitTargetOffsetZ` double default NULL; -alter table prims change column `SitTargetOrientW` `SitTargetOrientW` double default NULL; -alter table prims change column `SitTargetOrientX` `SitTargetOrientX` double default NULL; -alter table prims change column `SitTargetOrientY` `SitTargetOrientY` double default NULL; -alter table prims change column `SitTargetOrientZ` `SitTargetOrientZ` double default NULL; -alter table prims change column `LoopedSoundGain` `LoopedSoundGain` double NOT NULL default '0'; -alter table prims change column `OmegaX` `OmegaX` double NOT NULL default '0'; -alter table prims change column `OmegaY` `OmegaY` double NOT NULL default '0'; -alter table prims change column `OmegaZ` `OmegaZ` double NOT NULL default '0'; -alter table prims change column `CameraEyeOffsetX` `CameraEyeOffsetX` double NOT NULL default '0'; -alter table prims change column `CameraEyeOffsetY` `CameraEyeOffsetY` double NOT NULL default '0'; -alter table prims change column `CameraEyeOffsetZ` `CameraEyeOffsetZ` double NOT NULL default '0'; -alter table prims change column `CameraAtOffsetX` `CameraAtOffsetX` double NOT NULL default '0'; -alter table prims change column `CameraAtOffsetY` `CameraAtOffsetY` double NOT NULL default '0'; -alter table prims change column `CameraAtOffsetZ` `CameraAtOffsetZ` double NOT NULL default '0'; -alter table prims change column `CollisionSoundVolume` `CollisionSoundVolume` double NOT NULL default '0'; - -commit; diff --git a/OpenSim/Data/MySQL/Resources/027_RegionStore.sql b/OpenSim/Data/MySQL/Resources/027_RegionStore.sql deleted file mode 100644 index e1efab31c1..0000000000 --- a/OpenSim/Data/MySQL/Resources/027_RegionStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -ALTER TABLE prims DROP COLUMN ParentID; - -COMMIT; \ No newline at end of file diff --git a/OpenSim/Data/MySQL/Resources/028_RegionStore.sql b/OpenSim/Data/MySQL/Resources/028_RegionStore.sql deleted file mode 100644 index 078394f80d..0000000000 --- a/OpenSim/Data/MySQL/Resources/028_RegionStore.sql +++ /dev/null @@ -1,79 +0,0 @@ -BEGIN; - -update terrain - set RegionUUID = concat(substr(RegionUUID, 1, 8), "-", substr(RegionUUID, 9, 4), "-", substr(RegionUUID, 13, 4), "-", substr(RegionUUID, 17, 4), "-", substr(RegionUUID, 21, 12)) - where RegionUUID not like '%-%'; - - -update landaccesslist - set LandUUID = concat(substr(LandUUID, 1, 8), "-", substr(LandUUID, 9, 4), "-", substr(LandUUID, 13, 4), "-", substr(LandUUID, 17, 4), "-", substr(LandUUID, 21, 12)) - where LandUUID not like '%-%'; - -update landaccesslist - set AccessUUID = concat(substr(AccessUUID, 1, 8), "-", substr(AccessUUID, 9, 4), "-", substr(AccessUUID, 13, 4), "-", substr(AccessUUID, 17, 4), "-", substr(AccessUUID, 21, 12)) - where AccessUUID not like '%-%'; - - -update prims - set UUID = concat(substr(UUID, 1, 8), "-", substr(UUID, 9, 4), "-", substr(UUID, 13, 4), "-", substr(UUID, 17, 4), "-", substr(UUID, 21, 12)) - where UUID not like '%-%'; - -update prims - set RegionUUID = concat(substr(RegionUUID, 1, 8), "-", substr(RegionUUID, 9, 4), "-", substr(RegionUUID, 13, 4), "-", substr(RegionUUID, 17, 4), "-", substr(RegionUUID, 21, 12)) - where RegionUUID not like '%-%'; - -update prims - set SceneGroupID = concat(substr(SceneGroupID, 1, 8), "-", substr(SceneGroupID, 9, 4), "-", substr(SceneGroupID, 13, 4), "-", substr(SceneGroupID, 17, 4), "-", substr(SceneGroupID, 21, 12)) - where SceneGroupID not like '%-%'; - -update prims - set CreatorID = concat(substr(CreatorID, 1, 8), "-", substr(CreatorID, 9, 4), "-", substr(CreatorID, 13, 4), "-", substr(CreatorID, 17, 4), "-", substr(CreatorID, 21, 12)) - where CreatorID not like '%-%'; - -update prims - set OwnerID = concat(substr(OwnerID, 1, 8), "-", substr(OwnerID, 9, 4), "-", substr(OwnerID, 13, 4), "-", substr(OwnerID, 17, 4), "-", substr(OwnerID, 21, 12)) - where OwnerID not like '%-%'; - -update prims - set GroupID = concat(substr(GroupID, 1, 8), "-", substr(GroupID, 9, 4), "-", substr(GroupID, 13, 4), "-", substr(GroupID, 17, 4), "-", substr(GroupID, 21, 12)) - where GroupID not like '%-%'; - -update prims - set LastOwnerID = concat(substr(LastOwnerID, 1, 8), "-", substr(LastOwnerID, 9, 4), "-", substr(LastOwnerID, 13, 4), "-", substr(LastOwnerID, 17, 4), "-", substr(LastOwnerID, 21, 12)) - where LastOwnerID not like '%-%'; - - -update primshapes - set UUID = concat(substr(UUID, 1, 8), "-", substr(UUID, 9, 4), "-", substr(UUID, 13, 4), "-", substr(UUID, 17, 4), "-", substr(UUID, 21, 12)) - where UUID not like '%-%'; - - -update land - set UUID = concat(substr(UUID, 1, 8), "-", substr(UUID, 9, 4), "-", substr(UUID, 13, 4), "-", substr(UUID, 17, 4), "-", substr(UUID, 21, 12)) - where UUID not like '%-%'; - -update land - set RegionUUID = concat(substr(RegionUUID, 1, 8), "-", substr(RegionUUID, 9, 4), "-", substr(RegionUUID, 13, 4), "-", substr(RegionUUID, 17, 4), "-", substr(RegionUUID, 21, 12)) - where RegionUUID not like '%-%'; - -update land - set OwnerUUID = concat(substr(OwnerUUID, 1, 8), "-", substr(OwnerUUID, 9, 4), "-", substr(OwnerUUID, 13, 4), "-", substr(OwnerUUID, 17, 4), "-", substr(OwnerUUID, 21, 12)) - where OwnerUUID not like '%-%'; - -update land - set GroupUUID = concat(substr(GroupUUID, 1, 8), "-", substr(GroupUUID, 9, 4), "-", substr(GroupUUID, 13, 4), "-", substr(GroupUUID, 17, 4), "-", substr(GroupUUID, 21, 12)) - where GroupUUID not like '%-%'; - -update land - set MediaTextureUUID = concat(substr(MediaTextureUUID, 1, 8), "-", substr(MediaTextureUUID, 9, 4), "-", substr(MediaTextureUUID, 13, 4), "-", substr(MediaTextureUUID, 17, 4), "-", substr(MediaTextureUUID, 21, 12)) - where MediaTextureUUID not like '%-%'; - -update land - set SnapshotUUID = concat(substr(SnapshotUUID, 1, 8), "-", substr(SnapshotUUID, 9, 4), "-", substr(SnapshotUUID, 13, 4), "-", substr(SnapshotUUID, 17, 4), "-", substr(SnapshotUUID, 21, 12)) - where SnapshotUUID not like '%-%'; - -update land - set AuthbuyerID = concat(substr(AuthbuyerID, 1, 8), "-", substr(AuthbuyerID, 9, 4), "-", substr(AuthbuyerID, 13, 4), "-", substr(AuthbuyerID, 17, 4), "-", substr(AuthbuyerID, 21, 12)) - where AuthbuyerID not like '%-%'; - -COMMIT; \ No newline at end of file diff --git a/OpenSim/Data/MySQL/Resources/029_RegionStore.sql b/OpenSim/Data/MySQL/Resources/029_RegionStore.sql deleted file mode 100644 index b5962a2e10..0000000000 --- a/OpenSim/Data/MySQL/Resources/029_RegionStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -ALTER TABLE prims ADD COLUMN PassTouches tinyint not null default 0; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/030_RegionStore.sql b/OpenSim/Data/MySQL/Resources/030_RegionStore.sql deleted file mode 100644 index dfdcf6d710..0000000000 --- a/OpenSim/Data/MySQL/Resources/030_RegionStore.sql +++ /dev/null @@ -1,7 +0,0 @@ -BEGIN; - -ALTER TABLE regionsettings ADD COLUMN loaded_creation_date varchar(20) default NULL; -ALTER TABLE regionsettings ADD COLUMN loaded_creation_time varchar(20) default NULL; -ALTER TABLE regionsettings ADD COLUMN loaded_creation_id varchar(64) default NULL; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/031_RegionStore.sql b/OpenSim/Data/MySQL/Resources/031_RegionStore.sql deleted file mode 100644 index d069296039..0000000000 --- a/OpenSim/Data/MySQL/Resources/031_RegionStore.sql +++ /dev/null @@ -1,7 +0,0 @@ -BEGIN; - -ALTER TABLE regionsettings DROP COLUMN loaded_creation_date; -ALTER TABLE regionsettings DROP COLUMN loaded_creation_time; -ALTER TABLE regionsettings ADD COLUMN loaded_creation_datetime int unsigned NOT NULL default 0; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/032_RegionStore.sql b/OpenSim/Data/MySQL/Resources/032_RegionStore.sql deleted file mode 100644 index dca5de7144..0000000000 --- a/OpenSim/Data/MySQL/Resources/032_RegionStore.sql +++ /dev/null @@ -1,3 +0,0 @@ -BEGIN; -ALTER TABLE estate_settings AUTO_INCREMENT = 100; -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/AssetStore.migrations b/OpenSim/Data/MySQL/Resources/AssetStore.migrations new file mode 100644 index 0000000000..b9595f0f47 --- /dev/null +++ b/OpenSim/Data/MySQL/Resources/AssetStore.migrations @@ -0,0 +1,69 @@ +# ----------------- +:VERSION 1 + +BEGIN; + +CREATE TABLE `assets` ( + `id` binary(16) NOT NULL, + `name` varchar(64) NOT NULL, + `description` varchar(64) NOT NULL, + `assetType` tinyint(4) NOT NULL, + `invType` tinyint(4) NOT NULL, + `local` tinyint(1) NOT NULL, + `temporary` tinyint(1) NOT NULL, + `data` longblob NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Rev. 1'; + +COMMIT; + +# ----------------- +:VERSION 2 + +BEGIN; + +ALTER TABLE assets change id oldid binary(16); +ALTER TABLE assets add id varchar(36) not null default ''; +UPDATE assets set id = concat(substr(hex(oldid),1,8),"-",substr(hex(oldid),9,4),"-",substr(hex(oldid),13,4),"-",substr(hex(oldid),17,4),"-",substr(hex(oldid),21,12)); +ALTER TABLE assets drop oldid; +ALTER TABLE assets add constraint primary key(id); + +COMMIT; + +# ----------------- +:VERSION 3 + +BEGIN; + +ALTER TABLE assets change id oldid varchar(36); +ALTER TABLE assets add id char(36) not null default '00000000-0000-0000-0000-000000000000'; +UPDATE assets set id = oldid; +ALTER TABLE assets drop oldid; +ALTER TABLE assets add constraint primary key(id); + +COMMIT; + +# ----------------- +:VERSION 4 + +BEGIN; + +ALTER TABLE assets drop InvType; + +COMMIT; + +# ----------------- +:VERSION 5 + +BEGIN; + +ALTER TABLE assets add create_time integer default 0; +ALTER TABLE assets add access_time integer default 0; + +COMMIT; + +# ----------------- +:VERSION 6 + +DELETE FROM assets WHERE id = 'dc4b9f0b-d008-45c6-96a4-01dd947ac621' + diff --git a/OpenSim/Data/MySQL/Resources/001_AuthStore.sql b/OpenSim/Data/MySQL/Resources/AuthStore.migrations similarity index 51% rename from OpenSim/Data/MySQL/Resources/001_AuthStore.sql rename to OpenSim/Data/MySQL/Resources/AuthStore.migrations index c7e16fbdfb..023c786aa5 100644 --- a/OpenSim/Data/MySQL/Resources/001_AuthStore.sql +++ b/OpenSim/Data/MySQL/Resources/AuthStore.migrations @@ -1,3 +1,5 @@ +:VERSION 1 # ------------------------------- + begin; CREATE TABLE `auth` ( @@ -19,3 +21,19 @@ CREATE TABLE `tokens` ( ) ENGINE=InnoDB; commit; + +:VERSION 2 # ------------------------------- + +BEGIN; + +INSERT INTO auth (UUID, passwordHash, passwordSalt, webLoginKey) SELECT `UUID` AS UUID, `passwordHash` AS passwordHash, `passwordSalt` AS passwordSalt, `webLoginKey` AS webLoginKey FROM users; + +COMMIT; + +:VERSION 3 # ------------------------------- + +BEGIN; + +ALTER TABLE `auth` ADD COLUMN `accountType` VARCHAR(32) NOT NULL DEFAULT 'UserAccount'; + +COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/Avatar.migrations b/OpenSim/Data/MySQL/Resources/Avatar.migrations new file mode 100644 index 0000000000..8d0eee68a1 --- /dev/null +++ b/OpenSim/Data/MySQL/Resources/Avatar.migrations @@ -0,0 +1,12 @@ +:VERSION 1 + +BEGIN; + +CREATE TABLE Avatars ( + PrincipalID CHAR(36) NOT NULL, + Name VARCHAR(32) NOT NULL, + Value VARCHAR(255) NOT NULL DEFAULT '', + PRIMARY KEY(PrincipalID, Name), + KEY(PrincipalID)); + +COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/FriendsStore.migrations b/OpenSim/Data/MySQL/Resources/FriendsStore.migrations new file mode 100644 index 0000000000..ce713bdb89 --- /dev/null +++ b/OpenSim/Data/MySQL/Resources/FriendsStore.migrations @@ -0,0 +1,25 @@ +:VERSION 1 # ------------------------- + +BEGIN; + +CREATE TABLE `Friends` ( + `PrincipalID` CHAR(36) NOT NULL, + `Friend` VARCHAR(255) NOT NULL, + `Flags` VARCHAR(16) NOT NULL DEFAULT 0, + `Offered` VARCHAR(32) NOT NULL DEFAULT 0, + PRIMARY KEY(`PrincipalID`, `Friend`), + KEY(`PrincipalID`) +); + +COMMIT; + +:VERSION 2 # ------------------------- + +BEGIN; + +INSERT INTO `Friends` SELECT `ownerID`, `friendID`, `friendPerms`, 0 FROM `userfriends`; + +COMMIT; + + + diff --git a/OpenSim/Data/MySQL/Resources/001_GridStore.sql b/OpenSim/Data/MySQL/Resources/GridStore.migrations similarity index 64% rename from OpenSim/Data/MySQL/Resources/001_GridStore.sql rename to OpenSim/Data/MySQL/Resources/GridStore.migrations index cb0f9bd2cd..523a8ac7dc 100644 --- a/OpenSim/Data/MySQL/Resources/001_GridStore.sql +++ b/OpenSim/Data/MySQL/Resources/GridStore.migrations @@ -1,3 +1,5 @@ +:VERSION 1 + CREATE TABLE `regions` ( `uuid` varchar(36) NOT NULL, `regionHandle` bigint(20) unsigned NOT NULL, @@ -30,3 +32,58 @@ CREATE TABLE `regions` ( KEY `regionHandle` (`regionHandle`), KEY `overrideHandles` (`eastOverrideHandle`,`westOverrideHandle`,`southOverrideHandle`,`northOverrideHandle`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Rev. 3'; + +:VERSION 2 + +BEGIN; + +ALTER TABLE regions add column access integer unsigned default 1; + +COMMIT; + +:VERSION 3 + +BEGIN; + +ALTER TABLE regions add column ScopeID char(36) not null default '00000000-0000-0000-0000-000000000000'; + +create index ScopeID on regions(ScopeID); + +COMMIT; + +:VERSION 4 + +BEGIN; + +ALTER TABLE regions add column sizeX integer not null default 0; +ALTER TABLE regions add column sizeY integer not null default 0; + +COMMIT; + +:VERSION 5 + +BEGIN; + +ALTER TABLE `regions` ADD COLUMN `flags` integer NOT NULL DEFAULT 0; +CREATE INDEX flags ON regions(flags); + +COMMIT; + +:VERSION 6 + +BEGIN; + +ALTER TABLE `regions` ADD COLUMN `last_seen` integer NOT NULL DEFAULT 0; + +COMMIT; + +:VERSION 7 + +BEGIN; + +ALTER TABLE `regions` ADD COLUMN `PrincipalID` char(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000'; +ALTER TABLE `regions` ADD COLUMN `Token` varchar(255) NOT NULL; + +COMMIT; + + diff --git a/OpenSim/Data/MySQL/Resources/InventoryStore.migrations b/OpenSim/Data/MySQL/Resources/InventoryStore.migrations new file mode 100644 index 0000000000..8c5864e97d --- /dev/null +++ b/OpenSim/Data/MySQL/Resources/InventoryStore.migrations @@ -0,0 +1,93 @@ +:VERSION 1 # ------------ +BEGIN; + +CREATE TABLE `inventoryfolders` ( + `folderID` varchar(36) NOT NULL default '', + `agentID` varchar(36) default NULL, + `parentFolderID` varchar(36) default NULL, + `folderName` varchar(64) default NULL, + `type` smallint NOT NULL default 0, + `version` int NOT NULL default 0, + PRIMARY KEY (`folderID`), + KEY `owner` (`agentID`), + KEY `parent` (`parentFolderID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `inventoryitems` ( + `inventoryID` varchar(36) NOT NULL default '', + `assetID` varchar(36) default NULL, + `assetType` int(11) default NULL, + `parentFolderID` varchar(36) default NULL, + `avatarID` varchar(36) default NULL, + `inventoryName` varchar(64) default NULL, + `inventoryDescription` varchar(128) default NULL, + `inventoryNextPermissions` int(10) unsigned default NULL, + `inventoryCurrentPermissions` int(10) unsigned default NULL, + `invType` int(11) default NULL, + `creatorID` varchar(36) default NULL, + `inventoryBasePermissions` int(10) unsigned NOT NULL default 0, + `inventoryEveryOnePermissions` int(10) unsigned NOT NULL default 0, + `salePrice` int(11) NOT NULL default 0, + `saleType` tinyint(4) NOT NULL default 0, + `creationDate` int(11) NOT NULL default 0, + `groupID` varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000', + `groupOwned` tinyint(4) NOT NULL default 0, + `flags` int(11) unsigned NOT NULL default 0, + PRIMARY KEY (`inventoryID`), + KEY `owner` (`avatarID`), + KEY `folder` (`parentFolderID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +COMMIT; + +:VERSION 2 # ------------ + +BEGIN; + +ALTER TABLE inventoryfolders change folderID folderIDold varchar(36); +ALTER TABLE inventoryfolders change agentID agentIDold varchar(36); +ALTER TABLE inventoryfolders change parentFolderID parentFolderIDold varchar(36); +ALTER TABLE inventoryfolders add folderID char(36) not null default '00000000-0000-0000-0000-000000000000'; +ALTER TABLE inventoryfolders add agentID char(36) default NULL; +ALTER TABLE inventoryfolders add parentFolderID char(36) default NULL; +UPDATE inventoryfolders set folderID = folderIDold, agentID = agentIDold, parentFolderID = parentFolderIDold; +ALTER TABLE inventoryfolders drop folderIDold; +ALTER TABLE inventoryfolders drop agentIDold; +ALTER TABLE inventoryfolders drop parentFolderIDold; +ALTER TABLE inventoryfolders add constraint primary key(folderID); +ALTER TABLE inventoryfolders add index inventoryfolders_agentid(agentID); +ALTER TABLE inventoryfolders add index inventoryfolders_parentFolderid(parentFolderID); + +ALTER TABLE inventoryitems change inventoryID inventoryIDold varchar(36); +ALTER TABLE inventoryitems change avatarID avatarIDold varchar(36); +ALTER TABLE inventoryitems change parentFolderID parentFolderIDold varchar(36); +ALTER TABLE inventoryitems add inventoryID char(36) not null default '00000000-0000-0000-0000-000000000000'; +ALTER TABLE inventoryitems add avatarID char(36) default NULL; +ALTER TABLE inventoryitems add parentFolderID char(36) default NULL; +UPDATE inventoryitems set inventoryID = inventoryIDold, avatarID = avatarIDold, parentFolderID = parentFolderIDold; +ALTER TABLE inventoryitems drop inventoryIDold; +ALTER TABLE inventoryitems drop avatarIDold; +ALTER TABLE inventoryitems drop parentFolderIDold; +ALTER TABLE inventoryitems add constraint primary key(inventoryID); +ALTER TABLE inventoryitems add index inventoryitems_avatarid(avatarID); +ALTER TABLE inventoryitems add index inventoryitems_parentFolderid(parentFolderID); + +COMMIT; + +:VERSION 3 # ------------ + +BEGIN; + +alter table inventoryitems add column inventoryGroupPermissions integer unsigned not null default 0; + +COMMIT; + +:VERSION 4 # ------------ + +BEGIN; + +update inventoryitems set creatorID = '00000000-0000-0000-0000-000000000000' where creatorID is NULL; +update inventoryitems set creatorID = '00000000-0000-0000-0000-000000000000' where creatorID = ''; +alter table inventoryitems modify column creatorID varchar(36) not NULL default '00000000-0000-0000-0000-000000000000'; + +COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/001_LogStore.sql b/OpenSim/Data/MySQL/Resources/LogStore.migrations similarity index 95% rename from OpenSim/Data/MySQL/Resources/001_LogStore.sql rename to OpenSim/Data/MySQL/Resources/LogStore.migrations index b4c29fbef5..9ac26ac722 100644 --- a/OpenSim/Data/MySQL/Resources/001_LogStore.sql +++ b/OpenSim/Data/MySQL/Resources/LogStore.migrations @@ -1,3 +1,6 @@ + +:VERSION 1 + CREATE TABLE `logs` ( `logID` int(10) unsigned NOT NULL auto_increment, `target` varchar(36) default NULL, diff --git a/OpenSim/Data/MySQL/Resources/Presence.migrations b/OpenSim/Data/MySQL/Resources/Presence.migrations new file mode 100644 index 0000000000..d513024987 --- /dev/null +++ b/OpenSim/Data/MySQL/Resources/Presence.migrations @@ -0,0 +1,36 @@ +:VERSION 1 # -------------------------- + +BEGIN; + +CREATE TABLE `Presence` ( + `UserID` VARCHAR(255) NOT NULL, + `RegionID` CHAR(36) NOT NULL, + `SessionID` CHAR(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000', + `SecureSessionID` CHAR(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000', + `Online` CHAR(5) NOT NULL DEFAULT 'false', + `Login` CHAR(16) NOT NULL DEFAULT '0', + `Logout` CHAR(16) NOT NULL DEFAULT '0', + `Position` CHAR(64) NOT NULL DEFAULT '<0,0,0>', + `LookAt` CHAR(64) NOT NULL DEFAULT '<0,0,0>' +) ENGINE=InnoDB; + +COMMIT; + +:VERSION 2 # -------------------------- + +BEGIN; + +ALTER TABLE Presence ADD COLUMN `HomeRegionID` CHAR(36) NOT NULL; +ALTER TABLE Presence ADD COLUMN `HomePosition` CHAR(64) NOT NULL DEFAULT '<0,0,0>'; +ALTER TABLE Presence ADD COLUMN `HomeLookAt` CHAR(64) NOT NULL DEFAULT '<0,0,0>'; + +COMMIT; + +:VERSION 3 # -------------------------- + +BEGIN; + +CREATE UNIQUE INDEX SessionID ON Presence(SessionID); +CREATE INDEX UserID ON Presence(UserID); + +COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/RegionStore.migrations b/OpenSim/Data/MySQL/Resources/RegionStore.migrations new file mode 100644 index 0000000000..3dab67e58e --- /dev/null +++ b/OpenSim/Data/MySQL/Resources/RegionStore.migrations @@ -0,0 +1,806 @@ + +:VERSION 1 #--------------------- + +BEGIN; + +CREATE TABLE `prims` ( + `UUID` varchar(255) NOT NULL, + `RegionUUID` varchar(255) default NULL, + `ParentID` int(11) default NULL, + `CreationDate` int(11) default NULL, + `Name` varchar(255) default NULL, + `SceneGroupID` varchar(255) default NULL, + `Text` varchar(255) default NULL, + `Description` varchar(255) default NULL, + `SitName` varchar(255) default NULL, + `TouchName` varchar(255) default NULL, + `ObjectFlags` int(11) default NULL, + `CreatorID` varchar(255) default NULL, + `OwnerID` varchar(255) default NULL, + `GroupID` varchar(255) default NULL, + `LastOwnerID` varchar(255) default NULL, + `OwnerMask` int(11) default NULL, + `NextOwnerMask` int(11) default NULL, + `GroupMask` int(11) default NULL, + `EveryoneMask` int(11) default NULL, + `BaseMask` int(11) default NULL, + `PositionX` float default NULL, + `PositionY` float default NULL, + `PositionZ` float default NULL, + `GroupPositionX` float default NULL, + `GroupPositionY` float default NULL, + `GroupPositionZ` float default NULL, + `VelocityX` float default NULL, + `VelocityY` float default NULL, + `VelocityZ` float default NULL, + `AngularVelocityX` float default NULL, + `AngularVelocityY` float default NULL, + `AngularVelocityZ` float default NULL, + `AccelerationX` float default NULL, + `AccelerationY` float default NULL, + `AccelerationZ` float default NULL, + `RotationX` float default NULL, + `RotationY` float default NULL, + `RotationZ` float default NULL, + `RotationW` float default NULL, + `SitTargetOffsetX` float default NULL, + `SitTargetOffsetY` float default NULL, + `SitTargetOffsetZ` float default NULL, + `SitTargetOrientW` float default NULL, + `SitTargetOrientX` float default NULL, + `SitTargetOrientY` float default NULL, + `SitTargetOrientZ` float default NULL, + PRIMARY KEY (`UUID`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1; + +CREATE TABLE `primshapes` ( + `UUID` varchar(255) NOT NULL, + `Shape` int(11) default NULL, + `ScaleX` float default NULL, + `ScaleY` float default NULL, + `ScaleZ` float default NULL, + `PCode` int(11) default NULL, + `PathBegin` int(11) default NULL, + `PathEnd` int(11) default NULL, + `PathScaleX` int(11) default NULL, + `PathScaleY` int(11) default NULL, + `PathShearX` int(11) default NULL, + `PathShearY` int(11) default NULL, + `PathSkew` int(11) default NULL, + `PathCurve` int(11) default NULL, + `PathRadiusOffset` int(11) default NULL, + `PathRevolutions` int(11) default NULL, + `PathTaperX` int(11) default NULL, + `PathTaperY` int(11) default NULL, + `PathTwist` int(11) default NULL, + `PathTwistBegin` int(11) default NULL, + `ProfileBegin` int(11) default NULL, + `ProfileEnd` int(11) default NULL, + `ProfileCurve` int(11) default NULL, + `ProfileHollow` int(11) default NULL, + `State` int(11) default NULL, + `Texture` longblob, + `ExtraParams` longblob, + PRIMARY KEY (`UUID`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1; + +CREATE TABLE `primitems` ( + `itemID` varchar(255) NOT NULL, + `primID` varchar(255) default NULL, + `assetID` varchar(255) default NULL, + `parentFolderID` varchar(255) default NULL, + `invType` int(11) default NULL, + `assetType` int(11) default NULL, + `name` varchar(255) default NULL, + `description` varchar(255) default NULL, + `creationDate` bigint(20) default NULL, + `creatorID` varchar(255) default NULL, + `ownerID` varchar(255) default NULL, + `lastOwnerID` varchar(255) default NULL, + `groupID` varchar(255) default NULL, + `nextPermissions` int(11) default NULL, + `currentPermissions` int(11) default NULL, + `basePermissions` int(11) default NULL, + `everyonePermissions` int(11) default NULL, + `groupPermissions` int(11) default NULL, + PRIMARY KEY (`itemID`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1; + +CREATE TABLE `terrain` ( + `RegionUUID` varchar(255) default NULL, + `Revision` int(11) default NULL, + `Heightfield` longblob +) ENGINE=MyISAM DEFAULT CHARSET=latin1; + +CREATE TABLE `land` ( + `UUID` varchar(255) NOT NULL, + `RegionUUID` varchar(255) default NULL, + `LocalLandID` int(11) default NULL, + `Bitmap` longblob, + `Name` varchar(255) default NULL, + `Description` varchar(255) default NULL, + `OwnerUUID` varchar(255) default NULL, + `IsGroupOwned` int(11) default NULL, + `Area` int(11) default NULL, + `AuctionID` int(11) default NULL, + `Category` int(11) default NULL, + `ClaimDate` int(11) default NULL, + `ClaimPrice` int(11) default NULL, + `GroupUUID` varchar(255) default NULL, + `SalePrice` int(11) default NULL, + `LandStatus` int(11) default NULL, + `LandFlags` int(11) default NULL, + `LandingType` int(11) default NULL, + `MediaAutoScale` int(11) default NULL, + `MediaTextureUUID` varchar(255) default NULL, + `MediaURL` varchar(255) default NULL, + `MusicURL` varchar(255) default NULL, + `PassHours` float default NULL, + `PassPrice` int(11) default NULL, + `SnapshotUUID` varchar(255) default NULL, + `UserLocationX` float default NULL, + `UserLocationY` float default NULL, + `UserLocationZ` float default NULL, + `UserLookAtX` float default NULL, + `UserLookAtY` float default NULL, + `UserLookAtZ` float default NULL, + `AuthbuyerID` varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000', + PRIMARY KEY (`UUID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `landaccesslist` ( + `LandUUID` varchar(255) default NULL, + `AccessUUID` varchar(255) default NULL, + `Flags` int(11) default NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1; + +COMMIT; + +:VERSION 2 #--------------------- + +BEGIN; + +CREATE index prims_regionuuid on prims(RegionUUID); +CREATE index primitems_primid on primitems(primID); + +COMMIT; + +:VERSION 3 #--------------------- + +BEGIN; + CREATE TABLE regionban (regionUUID VARCHAR(36) NOT NULL, bannedUUID VARCHAR(36) NOT NULL, bannedIp VARCHAR(16) NOT NULL, bannedIpHostMask VARCHAR(16) NOT NULL) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='Rev. 1'; +COMMIT; + +:VERSION 4 #--------------------- + +BEGIN; + +ALTER TABLE primitems add flags integer not null default 0; + +COMMIT; + +:VERSION 5 #--------------------- +BEGIN; + +create table regionsettings ( + regionUUID char(36) not null, + block_terraform integer not null, + block_fly integer not null, + allow_damage integer not null, + restrict_pushing integer not null, + allow_land_resell integer not null, + allow_land_join_divide integer not null, + block_show_in_search integer not null, + agent_limit integer not null, + object_bonus float not null, + maturity integer not null, + disable_scripts integer not null, + disable_collisions integer not null, + disable_physics integer not null, + terrain_texture_1 char(36) not null, + terrain_texture_2 char(36) not null, + terrain_texture_3 char(36) not null, + terrain_texture_4 char(36) not null, + elevation_1_nw float not null, + elevation_2_nw float not null, + elevation_1_ne float not null, + elevation_2_ne float not null, + elevation_1_se float not null, + elevation_2_se float not null, + elevation_1_sw float not null, + elevation_2_sw float not null, + water_height float not null, + terrain_raise_limit float not null, + terrain_lower_limit float not null, + use_estate_sun integer not null, + fixed_sun integer not null, + sun_position float not null, + covenant char(36), + primary key(regionUUID) +); + +COMMIT; + + +:VERSION 6 #--------------------- + +BEGIN; + +alter table landaccesslist ENGINE = InnoDB; +alter table migrations ENGINE = InnoDB; +alter table primitems ENGINE = InnoDB; +alter table prims ENGINE = InnoDB; +alter table primshapes ENGINE = InnoDB; +alter table regionsettings ENGINE = InnoDB; +alter table terrain ENGINE = InnoDB; + +COMMIT; + +:VERSION 7 #--------------------- + +BEGIN; + +ALTER TABLE prims change UUID UUIDold varchar(255); +ALTER TABLE prims change RegionUUID RegionUUIDold varchar(255); +ALTER TABLE prims change CreatorID CreatorIDold varchar(255); +ALTER TABLE prims change OwnerID OwnerIDold varchar(255); +ALTER TABLE prims change GroupID GroupIDold varchar(255); +ALTER TABLE prims change LastOwnerID LastOwnerIDold varchar(255); +ALTER TABLE prims add UUID char(36); +ALTER TABLE prims add RegionUUID char(36); +ALTER TABLE prims add CreatorID char(36); +ALTER TABLE prims add OwnerID char(36); +ALTER TABLE prims add GroupID char(36); +ALTER TABLE prims add LastOwnerID char(36); +UPDATE prims set UUID = UUIDold, RegionUUID = RegionUUIDold, CreatorID = CreatorIDold, OwnerID = OwnerIDold, GroupID = GroupIDold, LastOwnerID = LastOwnerIDold; +ALTER TABLE prims drop UUIDold; +ALTER TABLE prims drop RegionUUIDold; +ALTER TABLE prims drop CreatorIDold; +ALTER TABLE prims drop OwnerIDold; +ALTER TABLE prims drop GroupIDold; +ALTER TABLE prims drop LastOwnerIDold; +ALTER TABLE prims add constraint primary key(UUID); +ALTER TABLE prims add index prims_regionuuid(RegionUUID); + +COMMIT; + +:VERSION 8 #--------------------- + +BEGIN; + +ALTER TABLE primshapes change UUID UUIDold varchar(255); +ALTER TABLE primshapes add UUID char(36); +UPDATE primshapes set UUID = UUIDold; +ALTER TABLE primshapes drop UUIDold; +ALTER TABLE primshapes add constraint primary key(UUID); + +COMMIT; + +:VERSION 9 #--------------------- + +BEGIN; + +ALTER TABLE primitems change itemID itemIDold varchar(255); +ALTER TABLE primitems change primID primIDold varchar(255); +ALTER TABLE primitems change assetID assetIDold varchar(255); +ALTER TABLE primitems change parentFolderID parentFolderIDold varchar(255); +ALTER TABLE primitems change creatorID creatorIDold varchar(255); +ALTER TABLE primitems change ownerID ownerIDold varchar(255); +ALTER TABLE primitems change groupID groupIDold varchar(255); +ALTER TABLE primitems change lastOwnerID lastOwnerIDold varchar(255); +ALTER TABLE primitems add itemID char(36); +ALTER TABLE primitems add primID char(36); +ALTER TABLE primitems add assetID char(36); +ALTER TABLE primitems add parentFolderID char(36); +ALTER TABLE primitems add creatorID char(36); +ALTER TABLE primitems add ownerID char(36); +ALTER TABLE primitems add groupID char(36); +ALTER TABLE primitems add lastOwnerID char(36); +UPDATE primitems set itemID = itemIDold, primID = primIDold, assetID = assetIDold, parentFolderID = parentFolderIDold, creatorID = creatorIDold, ownerID = ownerIDold, groupID = groupIDold, lastOwnerID = lastOwnerIDold; +ALTER TABLE primitems drop itemIDold; +ALTER TABLE primitems drop primIDold; +ALTER TABLE primitems drop assetIDold; +ALTER TABLE primitems drop parentFolderIDold; +ALTER TABLE primitems drop creatorIDold; +ALTER TABLE primitems drop ownerIDold; +ALTER TABLE primitems drop groupIDold; +ALTER TABLE primitems drop lastOwnerIDold; +ALTER TABLE primitems add constraint primary key(itemID); +ALTER TABLE primitems add index primitems_primid(primID); + +COMMIT; + +:VERSION 10 #--------------------- + +# 1 "010_RegionStore.sql" +# 1 "" +# 1 "" +# 1 "010_RegionStore.sql" +BEGIN; + +DELETE FROM regionsettings; + +COMMIT; + + +:VERSION 11 #--------------------- + +BEGIN; + +ALTER TABLE prims change SceneGroupID SceneGroupIDold varchar(255); +ALTER TABLE prims add SceneGroupID char(36); +UPDATE prims set SceneGroupID = SceneGroupIDold; +ALTER TABLE prims drop SceneGroupIDold; +ALTER TABLE prims add index prims_scenegroupid(SceneGroupID); + +COMMIT; + +:VERSION 12 #--------------------- + +BEGIN; + +ALTER TABLE prims add index prims_parentid(ParentID); + +COMMIT; + +:VERSION 13 #--------------------- +begin; + +drop table regionsettings; + +CREATE TABLE `regionsettings` ( + `regionUUID` char(36) NOT NULL, + `block_terraform` int(11) NOT NULL, + `block_fly` int(11) NOT NULL, + `allow_damage` int(11) NOT NULL, + `restrict_pushing` int(11) NOT NULL, + `allow_land_resell` int(11) NOT NULL, + `allow_land_join_divide` int(11) NOT NULL, + `block_show_in_search` int(11) NOT NULL, + `agent_limit` int(11) NOT NULL, + `object_bonus` float NOT NULL, + `maturity` int(11) NOT NULL, + `disable_scripts` int(11) NOT NULL, + `disable_collisions` int(11) NOT NULL, + `disable_physics` int(11) NOT NULL, + `terrain_texture_1` char(36) NOT NULL, + `terrain_texture_2` char(36) NOT NULL, + `terrain_texture_3` char(36) NOT NULL, + `terrain_texture_4` char(36) NOT NULL, + `elevation_1_nw` float NOT NULL, + `elevation_2_nw` float NOT NULL, + `elevation_1_ne` float NOT NULL, + `elevation_2_ne` float NOT NULL, + `elevation_1_se` float NOT NULL, + `elevation_2_se` float NOT NULL, + `elevation_1_sw` float NOT NULL, + `elevation_2_sw` float NOT NULL, + `water_height` float NOT NULL, + `terrain_raise_limit` float NOT NULL, + `terrain_lower_limit` float NOT NULL, + `use_estate_sun` int(11) NOT NULL, + `fixed_sun` int(11) NOT NULL, + `sun_position` float NOT NULL, + `covenant` char(36) default NULL, + `Sandbox` tinyint(4) NOT NULL, + PRIMARY KEY (`regionUUID`) +) ENGINE=InnoDB; + +CREATE TABLE `estate_managers` ( + `EstateID` int(10) unsigned NOT NULL, + `uuid` char(36) NOT NULL, + KEY `EstateID` (`EstateID`) +) ENGINE=InnoDB; + +CREATE TABLE `estate_groups` ( + `EstateID` int(10) unsigned NOT NULL, + `uuid` char(36) NOT NULL, + KEY `EstateID` (`EstateID`) +) ENGINE=InnoDB; + +CREATE TABLE `estate_users` ( + `EstateID` int(10) unsigned NOT NULL, + `uuid` char(36) NOT NULL, + KEY `EstateID` (`EstateID`) +) ENGINE=InnoDB; + +CREATE TABLE `estateban` ( + `EstateID` int(10) unsigned NOT NULL, + `bannedUUID` varchar(36) NOT NULL, + `bannedIp` varchar(16) NOT NULL, + `bannedIpHostMask` varchar(16) NOT NULL, + `bannedNameMask` varchar(64) default NULL, + KEY `estateban_EstateID` (`EstateID`) +) ENGINE=InnoDB; + +CREATE TABLE `estate_settings` ( + `EstateID` int(10) unsigned NOT NULL auto_increment, + `EstateName` varchar(64) default NULL, + `AbuseEmailToEstateOwner` tinyint(4) NOT NULL, + `DenyAnonymous` tinyint(4) NOT NULL, + `ResetHomeOnTeleport` tinyint(4) NOT NULL, + `FixedSun` tinyint(4) NOT NULL, + `DenyTransacted` tinyint(4) NOT NULL, + `BlockDwell` tinyint(4) NOT NULL, + `DenyIdentified` tinyint(4) NOT NULL, + `AllowVoice` tinyint(4) NOT NULL, + `UseGlobalTime` tinyint(4) NOT NULL, + `PricePerMeter` int(11) NOT NULL, + `TaxFree` tinyint(4) NOT NULL, + `AllowDirectTeleport` tinyint(4) NOT NULL, + `RedirectGridX` int(11) NOT NULL, + `RedirectGridY` int(11) NOT NULL, + `ParentEstateID` int(10) unsigned NOT NULL, + `SunPosition` double NOT NULL, + `EstateSkipScripts` tinyint(4) NOT NULL, + `BillableFactor` float NOT NULL, + `PublicAccess` tinyint(4) NOT NULL, + PRIMARY KEY (`EstateID`) +) ENGINE=InnoDB AUTO_INCREMENT=100; + +CREATE TABLE `estate_map` ( + `RegionID` char(36) NOT NULL default '00000000-0000-0000-0000-000000000000', + `EstateID` int(11) NOT NULL, + PRIMARY KEY (`RegionID`), + KEY `EstateID` (`EstateID`) +) ENGINE=InnoDB; + +commit; + +:VERSION 14 #--------------------- + +begin; + +alter table estate_settings add column AbuseEmail varchar(255) not null; + +alter table estate_settings add column EstateOwner varchar(36) not null; + +commit; + + +:VERSION 15 #--------------------- + +begin; + +alter table estate_settings add column DenyMinors tinyint not null; + +commit; + +:VERSION 16 #--------------------- + +BEGIN; + +ALTER TABLE prims ADD COLUMN PayPrice integer not null default 0; +ALTER TABLE prims ADD COLUMN PayButton1 integer not null default 0; +ALTER TABLE prims ADD COLUMN PayButton2 integer not null default 0; +ALTER TABLE prims ADD COLUMN PayButton3 integer not null default 0; +ALTER TABLE prims ADD COLUMN PayButton4 integer not null default 0; +ALTER TABLE prims ADD COLUMN LoopedSound char(36) not null default '00000000-0000-0000-0000-000000000000'; +ALTER TABLE prims ADD COLUMN LoopedSoundGain float not null default 0.0; +ALTER TABLE prims ADD COLUMN TextureAnimation blob; +ALTER TABLE prims ADD COLUMN OmegaX float not null default 0.0; +ALTER TABLE prims ADD COLUMN OmegaY float not null default 0.0; +ALTER TABLE prims ADD COLUMN OmegaZ float not null default 0.0; +ALTER TABLE prims ADD COLUMN CameraEyeOffsetX float not null default 0.0; +ALTER TABLE prims ADD COLUMN CameraEyeOffsetY float not null default 0.0; +ALTER TABLE prims ADD COLUMN CameraEyeOffsetZ float not null default 0.0; +ALTER TABLE prims ADD COLUMN CameraAtOffsetX float not null default 0.0; +ALTER TABLE prims ADD COLUMN CameraAtOffsetY float not null default 0.0; +ALTER TABLE prims ADD COLUMN CameraAtOffsetZ float not null default 0.0; +ALTER TABLE prims ADD COLUMN ForceMouselook tinyint not null default 0; +ALTER TABLE prims ADD COLUMN ScriptAccessPin integer not null default 0; +ALTER TABLE prims ADD COLUMN AllowedDrop tinyint not null default 0; +ALTER TABLE prims ADD COLUMN DieAtEdge tinyint not null default 0; +ALTER TABLE prims ADD COLUMN SalePrice integer not null default 10; +ALTER TABLE prims ADD COLUMN SaleType tinyint not null default 0; + +COMMIT; + + +:VERSION 17 #--------------------- + +BEGIN; + +ALTER TABLE prims ADD COLUMN ColorR integer not null default 0; +ALTER TABLE prims ADD COLUMN ColorG integer not null default 0; +ALTER TABLE prims ADD COLUMN ColorB integer not null default 0; +ALTER TABLE prims ADD COLUMN ColorA integer not null default 0; +ALTER TABLE prims ADD COLUMN ParticleSystem blob; + +COMMIT; + + +:VERSION 18 #--------------------- + +begin; + +ALTER TABLE prims ADD COLUMN ClickAction tinyint NOT NULL default 0; + +commit; + +:VERSION 19 #--------------------- + +begin; + +ALTER TABLE prims ADD COLUMN Material tinyint NOT NULL default 3; + +commit; + + +:VERSION 20 #--------------------- + +begin; + +ALTER TABLE land ADD COLUMN OtherCleanTime integer NOT NULL default 0; +ALTER TABLE land ADD COLUMN Dwell integer NOT NULL default 0; + +commit; + +:VERSION 21 #--------------------- + +begin; + +ALTER TABLE regionsettings ADD COLUMN sunvectorx double NOT NULL default 0; +ALTER TABLE regionsettings ADD COLUMN sunvectory double NOT NULL default 0; +ALTER TABLE regionsettings ADD COLUMN sunvectorz double NOT NULL default 0; + +commit; + + +:VERSION 22 #--------------------- + +BEGIN; + +ALTER TABLE prims ADD COLUMN CollisionSound char(36) not null default '00000000-0000-0000-0000-000000000000'; +ALTER TABLE prims ADD COLUMN CollisionSoundVolume float not null default 0.0; + +COMMIT; + +:VERSION 23 #--------------------- + +BEGIN; + +ALTER TABLE prims ADD COLUMN LinkNumber integer not null default 0; + +COMMIT; + +:VERSION 24 #--------------------- + +BEGIN; + +alter table regionsettings change column `object_bonus` `object_bonus` double NOT NULL; +alter table regionsettings change column `elevation_1_nw` `elevation_1_nw` double NOT NULL; +alter table regionsettings change column `elevation_2_nw` `elevation_2_nw` double NOT NULL; +alter table regionsettings change column `elevation_1_ne` `elevation_1_ne` double NOT NULL; +alter table regionsettings change column `elevation_2_ne` `elevation_2_ne` double NOT NULL; +alter table regionsettings change column `elevation_1_se` `elevation_1_se` double NOT NULL; +alter table regionsettings change column `elevation_2_se` `elevation_2_se` double NOT NULL; +alter table regionsettings change column `elevation_1_sw` `elevation_1_sw` double NOT NULL; +alter table regionsettings change column `elevation_2_sw` `elevation_2_sw` double NOT NULL; +alter table regionsettings change column `water_height` `water_height` double NOT NULL; +alter table regionsettings change column `terrain_raise_limit` `terrain_raise_limit` double NOT NULL; +alter table regionsettings change column `terrain_lower_limit` `terrain_lower_limit` double NOT NULL; +alter table regionsettings change column `sun_position` `sun_position` double NOT NULL; + +COMMIT; + + +:VERSION 25 #--------------------- + +BEGIN; + +alter table prims change column `PositionX` `PositionX` double default NULL; +alter table prims change column `PositionY` `PositionY` double default NULL; +alter table prims change column `PositionZ` `PositionZ` double default NULL; +alter table prims change column `GroupPositionX` `GroupPositionX` double default NULL; +alter table prims change column `GroupPositionY` `GroupPositionY` double default NULL; +alter table prims change column `GroupPositionZ` `GroupPositionZ` double default NULL; +alter table prims change column `VelocityX` `VelocityX` double default NULL; +alter table prims change column `VelocityY` `VelocityY` double default NULL; +alter table prims change column `VelocityZ` `VelocityZ` double default NULL; +alter table prims change column `AngularVelocityX` `AngularVelocityX` double default NULL; +alter table prims change column `AngularVelocityY` `AngularVelocityY` double default NULL; +alter table prims change column `AngularVelocityZ` `AngularVelocityZ` double default NULL; +alter table prims change column `AccelerationX` `AccelerationX` double default NULL; +alter table prims change column `AccelerationY` `AccelerationY` double default NULL; +alter table prims change column `AccelerationZ` `AccelerationZ` double default NULL; +alter table prims change column `RotationX` `RotationX` double default NULL; +alter table prims change column `RotationY` `RotationY` double default NULL; +alter table prims change column `RotationZ` `RotationZ` double default NULL; +alter table prims change column `RotationW` `RotationW` double default NULL; +alter table prims change column `SitTargetOffsetX` `SitTargetOffsetX` double default NULL; +alter table prims change column `SitTargetOffsetY` `SitTargetOffsetY` double default NULL; +alter table prims change column `SitTargetOffsetZ` `SitTargetOffsetZ` double default NULL; +alter table prims change column `SitTargetOrientW` `SitTargetOrientW` double default NULL; +alter table prims change column `SitTargetOrientX` `SitTargetOrientX` double default NULL; +alter table prims change column `SitTargetOrientY` `SitTargetOrientY` double default NULL; +alter table prims change column `SitTargetOrientZ` `SitTargetOrientZ` double default NULL; +alter table prims change column `LoopedSoundGain` `LoopedSoundGain` double NOT NULL default '0'; +alter table prims change column `OmegaX` `OmegaX` double NOT NULL default '0'; +alter table prims change column `OmegaY` `OmegaY` double NOT NULL default '0'; +alter table prims change column `OmegaZ` `OmegaZ` double NOT NULL default '0'; +alter table prims change column `CameraEyeOffsetX` `CameraEyeOffsetX` double NOT NULL default '0'; +alter table prims change column `CameraEyeOffsetY` `CameraEyeOffsetY` double NOT NULL default '0'; +alter table prims change column `CameraEyeOffsetZ` `CameraEyeOffsetZ` double NOT NULL default '0'; +alter table prims change column `CameraAtOffsetX` `CameraAtOffsetX` double NOT NULL default '0'; +alter table prims change column `CameraAtOffsetY` `CameraAtOffsetY` double NOT NULL default '0'; +alter table prims change column `CameraAtOffsetZ` `CameraAtOffsetZ` double NOT NULL default '0'; +alter table prims change column `CollisionSoundVolume` `CollisionSoundVolume` double NOT NULL default '0'; + +alter table primshapes change column `ScaleX` `ScaleX` double NOT NULL default '0'; +alter table primshapes change column `ScaleY` `ScaleY` double NOT NULL default '0'; +alter table primshapes change column `ScaleZ` `ScaleZ` double NOT NULL default '0'; + +COMMIT; + +:VERSION 26 #--------------------- + +begin; + +alter table prims change column `PositionX` `PositionX` double default NULL; +alter table prims change column `PositionY` `PositionY` double default NULL; +alter table prims change column `PositionZ` `PositionZ` double default NULL; +alter table prims change column `GroupPositionX` `GroupPositionX` double default NULL; +alter table prims change column `GroupPositionY` `GroupPositionY` double default NULL; +alter table prims change column `GroupPositionZ` `GroupPositionZ` double default NULL; +alter table prims change column `VelocityX` `VelocityX` double default NULL; +alter table prims change column `VelocityY` `VelocityY` double default NULL; +alter table prims change column `VelocityZ` `VelocityZ` double default NULL; +alter table prims change column `AngularVelocityX` `AngularVelocityX` double default NULL; +alter table prims change column `AngularVelocityY` `AngularVelocityY` double default NULL; +alter table prims change column `AngularVelocityZ` `AngularVelocityZ` double default NULL; +alter table prims change column `AccelerationX` `AccelerationX` double default NULL; +alter table prims change column `AccelerationY` `AccelerationY` double default NULL; +alter table prims change column `AccelerationZ` `AccelerationZ` double default NULL; +alter table prims change column `RotationX` `RotationX` double default NULL; +alter table prims change column `RotationY` `RotationY` double default NULL; +alter table prims change column `RotationZ` `RotationZ` double default NULL; +alter table prims change column `RotationW` `RotationW` double default NULL; +alter table prims change column `SitTargetOffsetX` `SitTargetOffsetX` double default NULL; +alter table prims change column `SitTargetOffsetY` `SitTargetOffsetY` double default NULL; +alter table prims change column `SitTargetOffsetZ` `SitTargetOffsetZ` double default NULL; +alter table prims change column `SitTargetOrientW` `SitTargetOrientW` double default NULL; +alter table prims change column `SitTargetOrientX` `SitTargetOrientX` double default NULL; +alter table prims change column `SitTargetOrientY` `SitTargetOrientY` double default NULL; +alter table prims change column `SitTargetOrientZ` `SitTargetOrientZ` double default NULL; +alter table prims change column `LoopedSoundGain` `LoopedSoundGain` double NOT NULL default '0'; +alter table prims change column `OmegaX` `OmegaX` double NOT NULL default '0'; +alter table prims change column `OmegaY` `OmegaY` double NOT NULL default '0'; +alter table prims change column `OmegaZ` `OmegaZ` double NOT NULL default '0'; +alter table prims change column `CameraEyeOffsetX` `CameraEyeOffsetX` double NOT NULL default '0'; +alter table prims change column `CameraEyeOffsetY` `CameraEyeOffsetY` double NOT NULL default '0'; +alter table prims change column `CameraEyeOffsetZ` `CameraEyeOffsetZ` double NOT NULL default '0'; +alter table prims change column `CameraAtOffsetX` `CameraAtOffsetX` double NOT NULL default '0'; +alter table prims change column `CameraAtOffsetY` `CameraAtOffsetY` double NOT NULL default '0'; +alter table prims change column `CameraAtOffsetZ` `CameraAtOffsetZ` double NOT NULL default '0'; +alter table prims change column `CollisionSoundVolume` `CollisionSoundVolume` double NOT NULL default '0'; + +commit; + +:VERSION 27 #--------------------- + +BEGIN; + +ALTER TABLE prims DROP COLUMN ParentID; + +COMMIT; + +:VERSION 28 #--------------------- + +BEGIN; + +update terrain + set RegionUUID = concat(substr(RegionUUID, 1, 8), "-", substr(RegionUUID, 9, 4), "-", substr(RegionUUID, 13, 4), "-", substr(RegionUUID, 17, 4), "-", substr(RegionUUID, 21, 12)) + where RegionUUID not like '%-%'; + + +update landaccesslist + set LandUUID = concat(substr(LandUUID, 1, 8), "-", substr(LandUUID, 9, 4), "-", substr(LandUUID, 13, 4), "-", substr(LandUUID, 17, 4), "-", substr(LandUUID, 21, 12)) + where LandUUID not like '%-%'; + +update landaccesslist + set AccessUUID = concat(substr(AccessUUID, 1, 8), "-", substr(AccessUUID, 9, 4), "-", substr(AccessUUID, 13, 4), "-", substr(AccessUUID, 17, 4), "-", substr(AccessUUID, 21, 12)) + where AccessUUID not like '%-%'; + + +update prims + set UUID = concat(substr(UUID, 1, 8), "-", substr(UUID, 9, 4), "-", substr(UUID, 13, 4), "-", substr(UUID, 17, 4), "-", substr(UUID, 21, 12)) + where UUID not like '%-%'; + +update prims + set RegionUUID = concat(substr(RegionUUID, 1, 8), "-", substr(RegionUUID, 9, 4), "-", substr(RegionUUID, 13, 4), "-", substr(RegionUUID, 17, 4), "-", substr(RegionUUID, 21, 12)) + where RegionUUID not like '%-%'; + +update prims + set SceneGroupID = concat(substr(SceneGroupID, 1, 8), "-", substr(SceneGroupID, 9, 4), "-", substr(SceneGroupID, 13, 4), "-", substr(SceneGroupID, 17, 4), "-", substr(SceneGroupID, 21, 12)) + where SceneGroupID not like '%-%'; + +update prims + set CreatorID = concat(substr(CreatorID, 1, 8), "-", substr(CreatorID, 9, 4), "-", substr(CreatorID, 13, 4), "-", substr(CreatorID, 17, 4), "-", substr(CreatorID, 21, 12)) + where CreatorID not like '%-%'; + +update prims + set OwnerID = concat(substr(OwnerID, 1, 8), "-", substr(OwnerID, 9, 4), "-", substr(OwnerID, 13, 4), "-", substr(OwnerID, 17, 4), "-", substr(OwnerID, 21, 12)) + where OwnerID not like '%-%'; + +update prims + set GroupID = concat(substr(GroupID, 1, 8), "-", substr(GroupID, 9, 4), "-", substr(GroupID, 13, 4), "-", substr(GroupID, 17, 4), "-", substr(GroupID, 21, 12)) + where GroupID not like '%-%'; + +update prims + set LastOwnerID = concat(substr(LastOwnerID, 1, 8), "-", substr(LastOwnerID, 9, 4), "-", substr(LastOwnerID, 13, 4), "-", substr(LastOwnerID, 17, 4), "-", substr(LastOwnerID, 21, 12)) + where LastOwnerID not like '%-%'; + + +update primshapes + set UUID = concat(substr(UUID, 1, 8), "-", substr(UUID, 9, 4), "-", substr(UUID, 13, 4), "-", substr(UUID, 17, 4), "-", substr(UUID, 21, 12)) + where UUID not like '%-%'; + + +update land + set UUID = concat(substr(UUID, 1, 8), "-", substr(UUID, 9, 4), "-", substr(UUID, 13, 4), "-", substr(UUID, 17, 4), "-", substr(UUID, 21, 12)) + where UUID not like '%-%'; + +update land + set RegionUUID = concat(substr(RegionUUID, 1, 8), "-", substr(RegionUUID, 9, 4), "-", substr(RegionUUID, 13, 4), "-", substr(RegionUUID, 17, 4), "-", substr(RegionUUID, 21, 12)) + where RegionUUID not like '%-%'; + +update land + set OwnerUUID = concat(substr(OwnerUUID, 1, 8), "-", substr(OwnerUUID, 9, 4), "-", substr(OwnerUUID, 13, 4), "-", substr(OwnerUUID, 17, 4), "-", substr(OwnerUUID, 21, 12)) + where OwnerUUID not like '%-%'; + +update land + set GroupUUID = concat(substr(GroupUUID, 1, 8), "-", substr(GroupUUID, 9, 4), "-", substr(GroupUUID, 13, 4), "-", substr(GroupUUID, 17, 4), "-", substr(GroupUUID, 21, 12)) + where GroupUUID not like '%-%'; + +update land + set MediaTextureUUID = concat(substr(MediaTextureUUID, 1, 8), "-", substr(MediaTextureUUID, 9, 4), "-", substr(MediaTextureUUID, 13, 4), "-", substr(MediaTextureUUID, 17, 4), "-", substr(MediaTextureUUID, 21, 12)) + where MediaTextureUUID not like '%-%'; + +update land + set SnapshotUUID = concat(substr(SnapshotUUID, 1, 8), "-", substr(SnapshotUUID, 9, 4), "-", substr(SnapshotUUID, 13, 4), "-", substr(SnapshotUUID, 17, 4), "-", substr(SnapshotUUID, 21, 12)) + where SnapshotUUID not like '%-%'; + +update land + set AuthbuyerID = concat(substr(AuthbuyerID, 1, 8), "-", substr(AuthbuyerID, 9, 4), "-", substr(AuthbuyerID, 13, 4), "-", substr(AuthbuyerID, 17, 4), "-", substr(AuthbuyerID, 21, 12)) + where AuthbuyerID not like '%-%'; + +COMMIT; + +:VERSION 29 #--------------------- + +BEGIN; + +ALTER TABLE prims ADD COLUMN PassTouches tinyint not null default 0; + +COMMIT; + +:VERSION 30 #--------------------- + +BEGIN; + +ALTER TABLE regionsettings ADD COLUMN loaded_creation_date varchar(20) default NULL; +ALTER TABLE regionsettings ADD COLUMN loaded_creation_time varchar(20) default NULL; +ALTER TABLE regionsettings ADD COLUMN loaded_creation_id varchar(64) default NULL; + +COMMIT; + +:VERSION 31 #--------------------- + +BEGIN; + +ALTER TABLE regionsettings DROP COLUMN loaded_creation_date; +ALTER TABLE regionsettings DROP COLUMN loaded_creation_time; +ALTER TABLE regionsettings ADD COLUMN loaded_creation_datetime int unsigned NOT NULL default 0; + +COMMIT; + +:VERSION 32 #--------------------- + +BEGIN; +ALTER TABLE estate_settings AUTO_INCREMENT = 100; +COMMIT; + + + + diff --git a/OpenSim/Data/MySQL/Resources/UserAccount.migrations b/OpenSim/Data/MySQL/Resources/UserAccount.migrations new file mode 100644 index 0000000000..84011e6e49 --- /dev/null +++ b/OpenSim/Data/MySQL/Resources/UserAccount.migrations @@ -0,0 +1,47 @@ +:VERSION 1 # ------------------------- + +BEGIN; + +CREATE TABLE `UserAccounts` ( + `PrincipalID` CHAR(36) NOT NULL, + `ScopeID` CHAR(36) NOT NULL, + `FirstName` VARCHAR(64) NOT NULL, + `LastName` VARCHAR(64) NOT NULL, + `Email` VARCHAR(64), + `ServiceURLs` TEXT, + `Created` INT(11) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +COMMIT; + +:VERSION 2 # ------------------------- + +BEGIN; + +INSERT INTO UserAccounts (PrincipalID, ScopeID, FirstName, LastName, Email, ServiceURLs, Created) SELECT `UUID` AS PrincipalID, '00000000-0000-0000-0000-000000000000' AS ScopeID, username AS FirstName, lastname AS LastName, email as Email, CONCAT('AssetServerURI=', userAssetURI, ' InventoryServerURI=', userInventoryURI, ' GatewayURI= HomeURI=') AS ServiceURLs, created as Created FROM users; + +COMMIT; + +:VERSION 3 # ------------------------- + +BEGIN; + +CREATE UNIQUE INDEX PrincipalID ON UserAccounts(PrincipalID); +CREATE INDEX Email ON UserAccounts(Email); +CREATE INDEX FirstName ON UserAccounts(FirstName); +CREATE INDEX LastName ON UserAccounts(LastName); +CREATE INDEX Name ON UserAccounts(FirstName,LastName); + +COMMIT; + +:VERSION 4 # ------------------------- + +BEGIN; + +ALTER TABLE UserAccounts ADD COLUMN UserLevel integer NOT NULL DEFAULT 0; +ALTER TABLE UserAccounts ADD COLUMN UserFlags integer NOT NULL DEFAULT 0; +ALTER TABLE UserAccounts ADD COLUMN UserTitle varchar(64) NOT NULL DEFAULT ''; + +COMMIT; + + diff --git a/OpenSim/Data/MySQL/Resources/001_UserStore.sql b/OpenSim/Data/MySQL/Resources/UserStore.migrations similarity index 72% rename from OpenSim/Data/MySQL/Resources/001_UserStore.sql rename to OpenSim/Data/MySQL/Resources/UserStore.migrations index 29ebc7d88b..f054611f04 100644 --- a/OpenSim/Data/MySQL/Resources/001_UserStore.sql +++ b/OpenSim/Data/MySQL/Resources/UserStore.migrations @@ -1,3 +1,5 @@ +:VERSION 1 # ----------------------------- + BEGIN; SET FOREIGN_KEY_CHECKS=0; @@ -104,4 +106,63 @@ CREATE TABLE `users` ( -- ---------------------------- -- Records -- ---------------------------- -COMMIT; \ No newline at end of file +COMMIT; + +:VERSION 2 # ----------------------------- + +BEGIN; + +ALTER TABLE users add homeRegionID char(36) NOT NULL default '00000000-0000-0000-0000-000000000000'; + +COMMIT; + +:VERSION 3 # ----------------------------- + +BEGIN; + +ALTER TABLE users add userFlags integer NOT NULL default 0; +ALTER TABLE users add godLevel integer NOT NULL default 0; + +COMMIT; + +:VERSION 4 # ----------------------------- + +BEGIN; + +ALTER TABLE users add customType varchar(32) not null default ''; +ALTER TABLE users add partner char(36) not null default '00000000-0000-0000-0000-000000000000'; + +COMMIT; + +:VERSION 5 # ----------------------------- + +BEGIN; + +CREATE TABLE `avatarattachments` (`UUID` char(36) NOT NULL, `attachpoint` int(11) NOT NULL, `item` char(36) NOT NULL, `asset` char(36) NOT NULL) ENGINE=InnoDB; + +COMMIT; + +:VERSION 6 # ----------------------------- + +BEGIN; + +ALTER TABLE agents add currentLookAt varchar(36) not null default ''; + +COMMIT; + +:VERSION 7 # ----------------------------- + +BEGIN; + +ALTER TABLE users add email varchar(250); + +COMMIT; + +:VERSION 8 # ----------------------------- + +BEGIN; + +ALTER TABLE users add scopeID char(36) not null default '00000000-0000-0000-0000-000000000000'; + +COMMIT; + From 6e7b3950d70b0dbe3b765d596adc534a6ca3a2a9 Mon Sep 17 00:00:00 2001 From: AlexRa Date: Thu, 6 May 2010 22:44:57 +0300 Subject: [PATCH 17/46] Migrations for SQLite converted to new format --- .../Data/SQLite/Resources/001_AssetStore.sql | 12 - .../SQLite/Resources/001_InventoryStore.sql | 32 -- .../Data/SQLite/Resources/001_RegionStore.sql | 144 ----- .../Data/SQLite/Resources/001_UserStore.sql | 39 -- .../Data/SQLite/Resources/002_AssetStore.sql | 10 - .../Data/SQLite/Resources/002_AuthStore.sql | 5 - .../SQLite/Resources/002_FriendsStore.sql | 5 - .../SQLite/Resources/002_InventoryStore.sql | 8 - .../Data/SQLite/Resources/002_RegionStore.sql | 10 - .../Data/SQLite/Resources/002_UserAccount.sql | 5 - .../Data/SQLite/Resources/002_UserStore.sql | 5 - .../Data/SQLite/Resources/003_AssetStore.sql | 1 - .../SQLite/Resources/003_InventoryStore.sql | 5 - .../Data/SQLite/Resources/003_RegionStore.sql | 5 - .../Data/SQLite/Resources/003_UserStore.sql | 6 - .../Data/SQLite/Resources/004_AssetStore.sql | 7 - .../Data/SQLite/Resources/004_RegionStore.sql | 38 -- .../Data/SQLite/Resources/004_UserStore.sql | 6 - .../Data/SQLite/Resources/005_RegionStore.sql | 5 - .../Data/SQLite/Resources/005_UserStore.sql | 5 - .../Data/SQLite/Resources/006_RegionStore.sql | 102 ---- .../Data/SQLite/Resources/006_UserStore.sql | 20 - .../Data/SQLite/Resources/007_RegionStore.sql | 8 - .../Data/SQLite/Resources/007_UserStore.sql | 7 - .../Data/SQLite/Resources/008_RegionStore.sql | 6 - .../Data/SQLite/Resources/008_UserStore.sql | 5 - .../Data/SQLite/Resources/009_RegionStore.sql | 8 - .../Data/SQLite/Resources/009_UserStore.sql | 11 - .../Data/SQLite/Resources/010_RegionStore.sql | 5 - .../Data/SQLite/Resources/010_UserStore.sql | 37 -- .../Data/SQLite/Resources/011_RegionStore.sql | 28 - .../Data/SQLite/Resources/012_RegionStore.sql | 5 - .../Data/SQLite/Resources/013_RegionStore.sql | 6 - .../Data/SQLite/Resources/014_RegionStore.sql | 8 - .../Data/SQLite/Resources/015_RegionStore.sql | 6 - .../Data/SQLite/Resources/016_RegionStore.sql | 5 - .../Data/SQLite/Resources/017_RegionStore.sql | 8 - .../Data/SQLite/Resources/018_RegionStore.sql | 79 --- .../SQLite/Resources/AssetStore.migrations | 42 ++ ...001_AuthStore.sql => AuthStore.migrations} | 11 + .../{001_Avatar.sql => Avatar.migrations} | 2 + ...iendsStore.sql => FriendsStore.migrations} | 10 + ...oryStore.sql => InventoryStore.migrations} | 56 ++ .../SQLite/Resources/RegionStore.migrations | 526 ++++++++++++++++++ ...UserAccount.sql => UserAccount.migrations} | 14 +- .../SQLite/Resources/UserStore.migrations | 169 ++++++ 46 files changed, 828 insertions(+), 709 deletions(-) delete mode 100644 OpenSim/Data/SQLite/Resources/001_AssetStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/001_InventoryStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/001_RegionStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/001_UserStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/002_AssetStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/002_AuthStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/002_FriendsStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/002_InventoryStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/002_RegionStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/002_UserAccount.sql delete mode 100644 OpenSim/Data/SQLite/Resources/002_UserStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/003_AssetStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/003_InventoryStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/003_RegionStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/003_UserStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/004_AssetStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/004_RegionStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/004_UserStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/005_RegionStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/005_UserStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/006_RegionStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/006_UserStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/007_RegionStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/007_UserStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/008_RegionStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/008_UserStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/009_RegionStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/009_UserStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/010_RegionStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/010_UserStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/011_RegionStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/012_RegionStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/013_RegionStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/014_RegionStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/015_RegionStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/016_RegionStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/017_RegionStore.sql delete mode 100644 OpenSim/Data/SQLite/Resources/018_RegionStore.sql create mode 100644 OpenSim/Data/SQLite/Resources/AssetStore.migrations rename OpenSim/Data/SQLite/Resources/{001_AuthStore.sql => AuthStore.migrations} (62%) rename OpenSim/Data/SQLite/Resources/{001_Avatar.sql => Avatar.migrations} (92%) rename OpenSim/Data/SQLite/Resources/{001_FriendsStore.sql => FriendsStore.migrations} (63%) rename OpenSim/Data/SQLite/Resources/{004_InventoryStore.sql => InventoryStore.migrations} (55%) create mode 100644 OpenSim/Data/SQLite/Resources/RegionStore.migrations rename OpenSim/Data/SQLite/Resources/{001_UserAccount.sql => UserAccount.migrations} (51%) create mode 100644 OpenSim/Data/SQLite/Resources/UserStore.migrations diff --git a/OpenSim/Data/SQLite/Resources/001_AssetStore.sql b/OpenSim/Data/SQLite/Resources/001_AssetStore.sql deleted file mode 100644 index 2e026cad19..0000000000 --- a/OpenSim/Data/SQLite/Resources/001_AssetStore.sql +++ /dev/null @@ -1,12 +0,0 @@ -BEGIN TRANSACTION; -CREATE TABLE assets( - UUID varchar(255) primary key, - Name varchar(255), - Description varchar(255), - Type integer, - InvType integer, - Local integer, - Temporary integer, - Data blob); - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/001_InventoryStore.sql b/OpenSim/Data/SQLite/Resources/001_InventoryStore.sql deleted file mode 100644 index 554d5c2ec8..0000000000 --- a/OpenSim/Data/SQLite/Resources/001_InventoryStore.sql +++ /dev/null @@ -1,32 +0,0 @@ -BEGIN TRANSACTION; - -CREATE TABLE inventoryfolders( - UUID varchar(255) primary key, - name varchar(255), - agentID varchar(255), - parentID varchar(255), - type integer, - version integer); - -CREATE TABLE inventoryitems( - UUID varchar(255) primary key, - assetID varchar(255), - assetType integer, - invType integer, - parentFolderID varchar(255), - avatarID varchar(255), - creatorsID varchar(255), - inventoryName varchar(255), - inventoryDescription varchar(255), - inventoryNextPermissions integer, - inventoryCurrentPermissions integer, - inventoryBasePermissions integer, - inventoryEveryOnePermissions integer, - salePrice integer default 99, - saleType integer default 0, - creationDate integer default 2000, - groupID varchar(255) default '00000000-0000-0000-0000-000000000000', - groupOwned integer default 0, - flags integer default 0); - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/001_RegionStore.sql b/OpenSim/Data/SQLite/Resources/001_RegionStore.sql deleted file mode 100644 index 39e8180cdc..0000000000 --- a/OpenSim/Data/SQLite/Resources/001_RegionStore.sql +++ /dev/null @@ -1,144 +0,0 @@ -BEGIN TRANSACTION; - -CREATE TABLE prims( - UUID varchar(255) primary key, - RegionUUID varchar(255), - ParentID integer, - CreationDate integer, - Name varchar(255), - SceneGroupID varchar(255), - Text varchar(255), - Description varchar(255), - SitName varchar(255), - TouchName varchar(255), - CreatorID varchar(255), - OwnerID varchar(255), - GroupID varchar(255), - LastOwnerID varchar(255), - OwnerMask integer, - NextOwnerMask integer, - GroupMask integer, - EveryoneMask integer, - BaseMask integer, - PositionX float, - PositionY float, - PositionZ float, - GroupPositionX float, - GroupPositionY float, - GroupPositionZ float, - VelocityX float, - VelocityY float, - VelocityZ float, - AngularVelocityX float, - AngularVelocityY float, - AngularVelocityZ float, - AccelerationX float, - AccelerationY float, - AccelerationZ float, - RotationX float, - RotationY float, - RotationZ float, - RotationW float, - ObjectFlags integer, - SitTargetOffsetX float NOT NULL default 0, - SitTargetOffsetY float NOT NULL default 0, - SitTargetOffsetZ float NOT NULL default 0, - SitTargetOrientW float NOT NULL default 0, - SitTargetOrientX float NOT NULL default 0, - SitTargetOrientY float NOT NULL default 0, - SitTargetOrientZ float NOT NULL default 0); - -CREATE TABLE primshapes( - UUID varchar(255) primary key, - Shape integer, - ScaleX float, - ScaleY float, - ScaleZ float, - PCode integer, - PathBegin integer, - PathEnd integer, - PathScaleX integer, - PathScaleY integer, - PathShearX integer, - PathShearY integer, - PathSkew integer, - PathCurve integer, - PathRadiusOffset integer, - PathRevolutions integer, - PathTaperX integer, - PathTaperY integer, - PathTwist integer, - PathTwistBegin integer, - ProfileBegin integer, - ProfileEnd integer, - ProfileCurve integer, - ProfileHollow integer, - Texture blob, - ExtraParams blob, - State Integer NOT NULL default 0); - -CREATE TABLE primitems( - itemID varchar(255) primary key, - primID varchar(255), - assetID varchar(255), - parentFolderID varchar(255), - invType integer, - assetType integer, - name varchar(255), - description varchar(255), - creationDate integer, - creatorID varchar(255), - ownerID varchar(255), - lastOwnerID varchar(255), - groupID varchar(255), - nextPermissions string, - currentPermissions string, - basePermissions string, - everyonePermissions string, - groupPermissions string); - -CREATE TABLE terrain( - RegionUUID varchar(255), - Revision integer, - Heightfield blob); - -CREATE TABLE land( - UUID varchar(255) primary key, - RegionUUID varchar(255), - LocalLandID string, - Bitmap blob, - Name varchar(255), - Desc varchar(255), - OwnerUUID varchar(255), - IsGroupOwned string, - Area integer, - AuctionID integer, - Category integer, - ClaimDate integer, - ClaimPrice integer, - GroupUUID varchar(255), - SalePrice integer, - LandStatus integer, - LandFlags string, - LandingType string, - MediaAutoScale string, - MediaTextureUUID varchar(255), - MediaURL varchar(255), - MusicURL varchar(255), - PassHours float, - PassPrice string, - SnapshotUUID varchar(255), - UserLocationX float, - UserLocationY float, - UserLocationZ float, - UserLookAtX float, - UserLookAtY float, - UserLookAtZ float, - AuthbuyerID varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000'); - -CREATE TABLE landaccesslist( - LandUUID varchar(255), - AccessUUID varchar(255), - Flags string); - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/001_UserStore.sql b/OpenSim/Data/SQLite/Resources/001_UserStore.sql deleted file mode 100644 index b584594ced..0000000000 --- a/OpenSim/Data/SQLite/Resources/001_UserStore.sql +++ /dev/null @@ -1,39 +0,0 @@ -BEGIN TRANSACTION; - --- users table -CREATE TABLE users( - UUID varchar(255) primary key, - username varchar(255), - surname varchar(255), - passwordHash varchar(255), - passwordSalt varchar(255), - homeRegionX integer, - homeRegionY integer, - homeLocationX float, - homeLocationY float, - homeLocationZ float, - homeLookAtX float, - homeLookAtY float, - homeLookAtZ float, - created integer, - lastLogin integer, - rootInventoryFolderID varchar(255), - userInventoryURI varchar(255), - userAssetURI varchar(255), - profileCanDoMask integer, - profileWantDoMask integer, - profileAboutText varchar(255), - profileFirstText varchar(255), - profileImage varchar(255), - profileFirstImage varchar(255), - webLoginKey text default '00000000-0000-0000-0000-000000000000'); --- friends table -CREATE TABLE userfriends( - ownerID varchar(255), - friendID varchar(255), - friendPerms integer, - ownerPerms integer, - datetimestamp integer); - -COMMIT; - diff --git a/OpenSim/Data/SQLite/Resources/002_AssetStore.sql b/OpenSim/Data/SQLite/Resources/002_AssetStore.sql deleted file mode 100644 index 5339b84dfd..0000000000 --- a/OpenSim/Data/SQLite/Resources/002_AssetStore.sql +++ /dev/null @@ -1,10 +0,0 @@ -BEGIN TRANSACTION; - -CREATE TEMPORARY TABLE assets_backup(UUID,Name,Description,Type,Local,Temporary,Data); -INSERT INTO assets_backup SELECT UUID,Name,Description,Type,Local,Temporary,Data FROM assets; -DROP TABLE assets; -CREATE TABLE assets(UUID,Name,Description,Type,Local,Temporary,Data); -INSERT INTO assets SELECT UUID,Name,Description,Type,Local,Temporary,Data FROM assets_backup; -DROP TABLE assets_backup; - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/002_AuthStore.sql b/OpenSim/Data/SQLite/Resources/002_AuthStore.sql deleted file mode 100644 index 3237b68fd6..0000000000 --- a/OpenSim/Data/SQLite/Resources/002_AuthStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN TRANSACTION; - -INSERT INTO auth (UUID, passwordHash, passwordSalt, webLoginKey) SELECT `UUID` AS UUID, `passwordHash` AS passwordHash, `passwordSalt` AS passwordSalt, `webLoginKey` AS webLoginKey FROM users; - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/002_FriendsStore.sql b/OpenSim/Data/SQLite/Resources/002_FriendsStore.sql deleted file mode 100644 index 6733502224..0000000000 --- a/OpenSim/Data/SQLite/Resources/002_FriendsStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN TRANSACTION; - -INSERT INTO `Friends` SELECT `ownerID`, `friendID`, `friendPerms`, 0 FROM `userfriends`; - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/002_InventoryStore.sql b/OpenSim/Data/SQLite/Resources/002_InventoryStore.sql deleted file mode 100644 index 01951d6582..0000000000 --- a/OpenSim/Data/SQLite/Resources/002_InventoryStore.sql +++ /dev/null @@ -1,8 +0,0 @@ -BEGIN TRANSACTION; - -create index inventoryfolders_agentid on inventoryfolders(agentid); -create index inventoryfolders_parentid on inventoryfolders(parentid); -create index inventoryitems_parentfolderid on inventoryitems(parentfolderid); -create index inventoryitems_avatarid on inventoryitems(avatarid); - -COMMIT; \ No newline at end of file diff --git a/OpenSim/Data/SQLite/Resources/002_RegionStore.sql b/OpenSim/Data/SQLite/Resources/002_RegionStore.sql deleted file mode 100644 index c5c7c99455..0000000000 --- a/OpenSim/Data/SQLite/Resources/002_RegionStore.sql +++ /dev/null @@ -1,10 +0,0 @@ -BEGIN TRANSACTION; - -CREATE TABLE regionban( - regionUUID varchar (255), - bannedUUID varchar (255), - bannedIp varchar (255), - bannedIpHostMask varchar (255) - ); - -COMMIT; \ No newline at end of file diff --git a/OpenSim/Data/SQLite/Resources/002_UserAccount.sql b/OpenSim/Data/SQLite/Resources/002_UserAccount.sql deleted file mode 100644 index c7a62932ac..0000000000 --- a/OpenSim/Data/SQLite/Resources/002_UserAccount.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN TRANSACTION; - -INSERT INTO UserAccounts (PrincipalID, ScopeID, FirstName, LastName, Email, ServiceURLs, Created) SELECT `UUID` AS PrincipalID, '00000000-0000-0000-0000-000000000000' AS ScopeID, username AS FirstName, surname AS LastName, '' as Email, '' AS ServiceURLs, created as Created FROM users; - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/002_UserStore.sql b/OpenSim/Data/SQLite/Resources/002_UserStore.sql deleted file mode 100644 index 48fc680b33..0000000000 --- a/OpenSim/Data/SQLite/Resources/002_UserStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -ALTER TABLE users add homeRegionID varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000'; - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/003_AssetStore.sql b/OpenSim/Data/SQLite/Resources/003_AssetStore.sql deleted file mode 100644 index f54f8d98a2..0000000000 --- a/OpenSim/Data/SQLite/Resources/003_AssetStore.sql +++ /dev/null @@ -1 +0,0 @@ -DELETE FROM assets WHERE UUID = 'dc4b9f0bd00845c696a401dd947ac621' diff --git a/OpenSim/Data/SQLite/Resources/003_InventoryStore.sql b/OpenSim/Data/SQLite/Resources/003_InventoryStore.sql deleted file mode 100644 index 4c6da91aab..0000000000 --- a/OpenSim/Data/SQLite/Resources/003_InventoryStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -alter table inventoryitems add column inventoryGroupPermissions integer unsigned not null default 0; - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/003_RegionStore.sql b/OpenSim/Data/SQLite/Resources/003_RegionStore.sql deleted file mode 100644 index 4db2f7587d..0000000000 --- a/OpenSim/Data/SQLite/Resources/003_RegionStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -ALTER TABLE primitems add flags integer not null default 0; - -COMMIT; \ No newline at end of file diff --git a/OpenSim/Data/SQLite/Resources/003_UserStore.sql b/OpenSim/Data/SQLite/Resources/003_UserStore.sql deleted file mode 100644 index 6f890eeec1..0000000000 --- a/OpenSim/Data/SQLite/Resources/003_UserStore.sql +++ /dev/null @@ -1,6 +0,0 @@ -BEGIN; - -ALTER TABLE users add userFlags integer NOT NULL default 0; -ALTER TABLE users add godLevel integer NOT NULL default 0; - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/004_AssetStore.sql b/OpenSim/Data/SQLite/Resources/004_AssetStore.sql deleted file mode 100644 index 39421c4434..0000000000 --- a/OpenSim/Data/SQLite/Resources/004_AssetStore.sql +++ /dev/null @@ -1,7 +0,0 @@ -BEGIN; - -update assets - set UUID = substr(UUID, 1, 8) || "-" || substr(UUID, 9, 4) || "-" || substr(UUID, 13, 4) || "-" || substr(UUID, 17, 4) || "-" || substr(UUID, 21, 12) - where UUID not like '%-%'; - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/004_RegionStore.sql b/OpenSim/Data/SQLite/Resources/004_RegionStore.sql deleted file mode 100644 index de328cb47a..0000000000 --- a/OpenSim/Data/SQLite/Resources/004_RegionStore.sql +++ /dev/null @@ -1,38 +0,0 @@ -BEGIN; - -create table regionsettings ( - regionUUID char(36) not null, - block_terraform integer not null, - block_fly integer not null, - allow_damage integer not null, - restrict_pushing integer not null, - allow_land_resell integer not null, - allow_land_join_divide integer not null, - block_show_in_search integer not null, - agent_limit integer not null, - object_bonus float not null, - maturity integer not null, - disable_scripts integer not null, - disable_collisions integer not null, - disable_physics integer not null, - terrain_texture_1 char(36) not null, - terrain_texture_2 char(36) not null, - terrain_texture_3 char(36) not null, - terrain_texture_4 char(36) not null, - elevation_1_nw float not null, - elevation_2_nw float not null, - elevation_1_ne float not null, - elevation_2_ne float not null, - elevation_1_se float not null, - elevation_2_se float not null, - elevation_1_sw float not null, - elevation_2_sw float not null, - water_height float not null, - terrain_raise_limit float not null, - terrain_lower_limit float not null, - use_estate_sun integer not null, - fixed_sun integer not null, - sun_position float not null, - covenant char(36)); - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/004_UserStore.sql b/OpenSim/Data/SQLite/Resources/004_UserStore.sql deleted file mode 100644 index 03142afa37..0000000000 --- a/OpenSim/Data/SQLite/Resources/004_UserStore.sql +++ /dev/null @@ -1,6 +0,0 @@ -BEGIN; - -ALTER TABLE users add customType varchar(32) not null default ''; -ALTER TABLE users add partner char(36) not null default '00000000-0000-0000-0000-000000000000'; - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/005_RegionStore.sql b/OpenSim/Data/SQLite/Resources/005_RegionStore.sql deleted file mode 100644 index 1f6d1bd271..0000000000 --- a/OpenSim/Data/SQLite/Resources/005_RegionStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -delete from regionsettings; - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/005_UserStore.sql b/OpenSim/Data/SQLite/Resources/005_UserStore.sql deleted file mode 100644 index e45c09a493..0000000000 --- a/OpenSim/Data/SQLite/Resources/005_UserStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -CREATE TABLE `avatarattachments` (`UUID` char(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000', `attachpoint` int(11) NOT NULL DEFAULT 0, `item` char(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000', `asset` char(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000'); - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/006_RegionStore.sql b/OpenSim/Data/SQLite/Resources/006_RegionStore.sql deleted file mode 100644 index 94ed8181cd..0000000000 --- a/OpenSim/Data/SQLite/Resources/006_RegionStore.sql +++ /dev/null @@ -1,102 +0,0 @@ -BEGIN TRANSACTION; - -CREATE TABLE estate_groups ( - EstateID int(10) NOT NULL, - uuid char(36) NOT NULL -); - -CREATE TABLE estate_managers ( - EstateID int(10) NOT NULL, - uuid char(36) NOT NULL -); - -CREATE TABLE estate_map ( - RegionID char(36) NOT NULL default '00000000-0000-0000-0000-000000000000', - EstateID int(11) NOT NULL -); - -CREATE TABLE estate_settings ( - EstateID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - EstateName varchar(64) default NULL, - AbuseEmailToEstateOwner tinyint(4) NOT NULL, - DenyAnonymous tinyint(4) NOT NULL, - ResetHomeOnTeleport tinyint(4) NOT NULL, - FixedSun tinyint(4) NOT NULL, - DenyTransacted tinyint(4) NOT NULL, - BlockDwell tinyint(4) NOT NULL, - DenyIdentified tinyint(4) NOT NULL, - AllowVoice tinyint(4) NOT NULL, - UseGlobalTime tinyint(4) NOT NULL, - PricePerMeter int(11) NOT NULL, - TaxFree tinyint(4) NOT NULL, - AllowDirectTeleport tinyint(4) NOT NULL, - RedirectGridX int(11) NOT NULL, - RedirectGridY int(11) NOT NULL, - ParentEstateID int(10) NOT NULL, - SunPosition double NOT NULL, - EstateSkipScripts tinyint(4) NOT NULL, - BillableFactor float NOT NULL, - PublicAccess tinyint(4) NOT NULL -); -insert into estate_settings (EstateID,EstateName,AbuseEmailToEstateOwner,DenyAnonymous,ResetHomeOnTeleport,FixedSun,DenyTransacted,BlockDwell,DenyIdentified,AllowVoice,UseGlobalTime,PricePerMeter,TaxFree,AllowDirectTeleport,RedirectGridX,RedirectGridY,ParentEstateID,SunPosition,PublicAccess,EstateSkipScripts,BillableFactor) values ( 99, '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''); -delete from estate_settings; -CREATE TABLE estate_users ( - EstateID int(10) NOT NULL, - uuid char(36) NOT NULL -); - -CREATE TABLE estateban ( - EstateID int(10) NOT NULL, - bannedUUID varchar(36) NOT NULL, - bannedIp varchar(16) NOT NULL, - bannedIpHostMask varchar(16) NOT NULL, - bannedNameMask varchar(64) default NULL -); - -drop table regionsettings; -CREATE TABLE regionsettings ( - regionUUID char(36) NOT NULL, - block_terraform int(11) NOT NULL, - block_fly int(11) NOT NULL, - allow_damage int(11) NOT NULL, - restrict_pushing int(11) NOT NULL, - allow_land_resell int(11) NOT NULL, - allow_land_join_divide int(11) NOT NULL, - block_show_in_search int(11) NOT NULL, - agent_limit int(11) NOT NULL, - object_bonus float NOT NULL, - maturity int(11) NOT NULL, - disable_scripts int(11) NOT NULL, - disable_collisions int(11) NOT NULL, - disable_physics int(11) NOT NULL, - terrain_texture_1 char(36) NOT NULL, - terrain_texture_2 char(36) NOT NULL, - terrain_texture_3 char(36) NOT NULL, - terrain_texture_4 char(36) NOT NULL, - elevation_1_nw float NOT NULL, - elevation_2_nw float NOT NULL, - elevation_1_ne float NOT NULL, - elevation_2_ne float NOT NULL, - elevation_1_se float NOT NULL, - elevation_2_se float NOT NULL, - elevation_1_sw float NOT NULL, - elevation_2_sw float NOT NULL, - water_height float NOT NULL, - terrain_raise_limit float NOT NULL, - terrain_lower_limit float NOT NULL, - use_estate_sun int(11) NOT NULL, - fixed_sun int(11) NOT NULL, - sun_position float NOT NULL, - covenant char(36) default NULL, - Sandbox tinyint(4) NOT NULL, - PRIMARY KEY (regionUUID) -); - -CREATE INDEX estate_ban_estate_id on estateban(EstateID); -CREATE INDEX estate_groups_estate_id on estate_groups(EstateID); -CREATE INDEX estate_managers_estate_id on estate_managers(EstateID); -CREATE INDEX estate_map_estate_id on estate_map(EstateID); -CREATE UNIQUE INDEX estate_map_region_id on estate_map(RegionID); -CREATE INDEX estate_users_estate_id on estate_users(EstateID); - -COMMIT; \ No newline at end of file diff --git a/OpenSim/Data/SQLite/Resources/006_UserStore.sql b/OpenSim/Data/SQLite/Resources/006_UserStore.sql deleted file mode 100644 index f9454c55cf..0000000000 --- a/OpenSim/Data/SQLite/Resources/006_UserStore.sql +++ /dev/null @@ -1,20 +0,0 @@ -BEGIN TRANSACTION; - --- usersagents table -CREATE TABLE IF NOT EXISTS useragents( - UUID varchar(255) primary key, - agentIP varchar(255), - agentPort integer, - agentOnline boolean, - sessionID varchar(255), - secureSessionID varchar(255), - regionID varchar(255), - loginTime integer, - logoutTime integer, - currentRegion varchar(255), - currentHandle varchar(255), - currentPosX float, - currentPosY float, - currentPosZ float); - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/007_RegionStore.sql b/OpenSim/Data/SQLite/Resources/007_RegionStore.sql deleted file mode 100644 index 1c813a0d40..0000000000 --- a/OpenSim/Data/SQLite/Resources/007_RegionStore.sql +++ /dev/null @@ -1,8 +0,0 @@ -begin; - -alter table estate_settings add column AbuseEmail varchar(255) not null default ''; - -alter table estate_settings add column EstateOwner varchar(36) not null default ''; - -commit; - diff --git a/OpenSim/Data/SQLite/Resources/007_UserStore.sql b/OpenSim/Data/SQLite/Resources/007_UserStore.sql deleted file mode 100644 index 8b0cd285c7..0000000000 --- a/OpenSim/Data/SQLite/Resources/007_UserStore.sql +++ /dev/null @@ -1,7 +0,0 @@ -BEGIN TRANSACTION; - -ALTER TABLE useragents add currentLookAtX float not null default 128; -ALTER TABLE useragents add currentLookAtY float not null default 128; -ALTER TABLE useragents add currentLookAtZ float not null default 70; - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/008_RegionStore.sql b/OpenSim/Data/SQLite/Resources/008_RegionStore.sql deleted file mode 100644 index 28bfbf59c3..0000000000 --- a/OpenSim/Data/SQLite/Resources/008_RegionStore.sql +++ /dev/null @@ -1,6 +0,0 @@ -begin; - -alter table estate_settings add column DenyMinors tinyint not null default 0; - -commit; - diff --git a/OpenSim/Data/SQLite/Resources/008_UserStore.sql b/OpenSim/Data/SQLite/Resources/008_UserStore.sql deleted file mode 100644 index 97da81848c..0000000000 --- a/OpenSim/Data/SQLite/Resources/008_UserStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN TRANSACTION; - -ALTER TABLE users add email varchar(250); - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/009_RegionStore.sql b/OpenSim/Data/SQLite/Resources/009_RegionStore.sql deleted file mode 100644 index 1f40548f36..0000000000 --- a/OpenSim/Data/SQLite/Resources/009_RegionStore.sql +++ /dev/null @@ -1,8 +0,0 @@ -BEGIN; - -ALTER TABLE prims ADD COLUMN ColorR integer not null default 0; -ALTER TABLE prims ADD COLUMN ColorG integer not null default 0; -ALTER TABLE prims ADD COLUMN ColorB integer not null default 0; -ALTER TABLE prims ADD COLUMN ColorA integer not null default 0; - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/009_UserStore.sql b/OpenSim/Data/SQLite/Resources/009_UserStore.sql deleted file mode 100644 index 8ab03ef897..0000000000 --- a/OpenSim/Data/SQLite/Resources/009_UserStore.sql +++ /dev/null @@ -1,11 +0,0 @@ -BEGIN; - -update users - set UUID = substr(UUID, 1, 8) || "-" || substr(UUID, 9, 4) || "-" || substr(UUID, 13, 4) || "-" || substr(UUID, 17, 4) || "-" || substr(UUID, 21, 12) - where UUID not like '%-%'; - -update useragents - set UUID = substr(UUID, 1, 8) || "-" || substr(UUID, 9, 4) || "-" || substr(UUID, 13, 4) || "-" || substr(UUID, 17, 4) || "-" || substr(UUID, 21, 12) - where UUID not like '%-%'; - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/010_RegionStore.sql b/OpenSim/Data/SQLite/Resources/010_RegionStore.sql deleted file mode 100644 index b91ccf0a8d..0000000000 --- a/OpenSim/Data/SQLite/Resources/010_RegionStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -ALTER TABLE prims ADD COLUMN ClickAction INTEGER NOT NULL default 0; - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/010_UserStore.sql b/OpenSim/Data/SQLite/Resources/010_UserStore.sql deleted file mode 100644 index 5f956dadfd..0000000000 --- a/OpenSim/Data/SQLite/Resources/010_UserStore.sql +++ /dev/null @@ -1,37 +0,0 @@ -BEGIN TRANSACTION; - -CREATE TABLE IF NOT EXISTS avatarappearance( - Owner varchar(36) NOT NULL primary key, - BodyItem varchar(36) DEFAULT NULL, - BodyAsset varchar(36) DEFAULT NULL, - SkinItem varchar(36) DEFAULT NULL, - SkinAsset varchar(36) DEFAULT NULL, - HairItem varchar(36) DEFAULT NULL, - HairAsset varchar(36) DEFAULT NULL, - EyesItem varchar(36) DEFAULT NULL, - EyesAsset varchar(36) DEFAULT NULL, - ShirtItem varchar(36) DEFAULT NULL, - ShirtAsset varchar(36) DEFAULT NULL, - PantsItem varchar(36) DEFAULT NULL, - PantsAsset varchar(36) DEFAULT NULL, - ShoesItem varchar(36) DEFAULT NULL, - ShoesAsset varchar(36) DEFAULT NULL, - SocksItem varchar(36) DEFAULT NULL, - SocksAsset varchar(36) DEFAULT NULL, - JacketItem varchar(36) DEFAULT NULL, - JacketAsset varchar(36) DEFAULT NULL, - GlovesItem varchar(36) DEFAULT NULL, - GlovesAsset varchar(36) DEFAULT NULL, - UnderShirtItem varchar(36) DEFAULT NULL, - UnderShirtAsset varchar(36) DEFAULT NULL, - UnderPantsItem varchar(36) DEFAULT NULL, - UnderPantsAsset varchar(36) DEFAULT NULL, - SkirtItem varchar(36) DEFAULT NULL, - SkirtAsset varchar(36) DEFAULT NULL, - Texture blob, - VisualParams blob, - Serial int DEFAULT NULL, - AvatarHeight float DEFAULT NULL -); - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/011_RegionStore.sql b/OpenSim/Data/SQLite/Resources/011_RegionStore.sql deleted file mode 100644 index 42bef89616..0000000000 --- a/OpenSim/Data/SQLite/Resources/011_RegionStore.sql +++ /dev/null @@ -1,28 +0,0 @@ -BEGIN; - -ALTER TABLE prims ADD COLUMN PayPrice INTEGER NOT NULL default 0; -ALTER TABLE prims ADD COLUMN PayButton1 INTEGER NOT NULL default 0; -ALTER TABLE prims ADD COLUMN PayButton2 INTEGER NOT NULL default 0; -ALTER TABLE prims ADD COLUMN PayButton3 INTEGER NOT NULL default 0; -ALTER TABLE prims ADD COLUMN PayButton4 INTEGER NOT NULL default 0; -ALTER TABLE prims ADD COLUMN LoopedSound varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000'; -ALTER TABLE prims ADD COLUMN LoopedSoundGain float NOT NULL default 0; -ALTER TABLE prims ADD COLUMN TextureAnimation string; -ALTER TABLE prims ADD COLUMN ParticleSystem string; -ALTER TABLE prims ADD COLUMN OmegaX float NOT NULL default 0; -ALTER TABLE prims ADD COLUMN OmegaY float NOT NULL default 0; -ALTER TABLE prims ADD COLUMN OmegaZ float NOT NULL default 0; -ALTER TABLE prims ADD COLUMN CameraEyeOffsetX float NOT NULL default 0; -ALTER TABLE prims ADD COLUMN CameraEyeOffsetY float NOT NULL default 0; -ALTER TABLE prims ADD COLUMN CameraEyeOffsetZ float NOT NULL default 0; -ALTER TABLE prims ADD COLUMN CameraAtOffsetX float NOT NULL default 0; -ALTER TABLE prims ADD COLUMN CameraAtOffsetY float NOT NULL default 0; -ALTER TABLE prims ADD COLUMN CameraAtOffsetZ float NOT NULL default 0; -ALTER TABLE prims ADD COLUMN ForceMouselook string NOT NULL default 0; -ALTER TABLE prims ADD COLUMN ScriptAccessPin INTEGER NOT NULL default 0; -ALTER TABLE prims ADD COLUMN AllowedDrop INTEGER NOT NULL default 0; -ALTER TABLE prims ADD COLUMN DieAtEdge string NOT NULL default 0; -ALTER TABLE prims ADD COLUMN SalePrice INTEGER NOT NULL default 0; -ALTER TABLE prims ADD COLUMN SaleType string NOT NULL default 0; - -COMMIT; \ No newline at end of file diff --git a/OpenSim/Data/SQLite/Resources/012_RegionStore.sql b/OpenSim/Data/SQLite/Resources/012_RegionStore.sql deleted file mode 100644 index d952b78bd2..0000000000 --- a/OpenSim/Data/SQLite/Resources/012_RegionStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -ALTER TABLE prims ADD COLUMN Material INTEGER NOT NULL default 3; - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/013_RegionStore.sql b/OpenSim/Data/SQLite/Resources/013_RegionStore.sql deleted file mode 100644 index 11529cd3f1..0000000000 --- a/OpenSim/Data/SQLite/Resources/013_RegionStore.sql +++ /dev/null @@ -1,6 +0,0 @@ -BEGIN; - -ALTER TABLE land ADD COLUMN OtherCleanTime INTEGER NOT NULL default 0; -ALTER TABLE land ADD COLUMN Dwell INTEGER NOT NULL default 0; - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/014_RegionStore.sql b/OpenSim/Data/SQLite/Resources/014_RegionStore.sql deleted file mode 100644 index c59b27e745..0000000000 --- a/OpenSim/Data/SQLite/Resources/014_RegionStore.sql +++ /dev/null @@ -1,8 +0,0 @@ -begin; - -ALTER TABLE regionsettings ADD COLUMN sunvectorx double NOT NULL default 0; -ALTER TABLE regionsettings ADD COLUMN sunvectory double NOT NULL default 0; -ALTER TABLE regionsettings ADD COLUMN sunvectorz double NOT NULL default 0; - -commit; - diff --git a/OpenSim/Data/SQLite/Resources/015_RegionStore.sql b/OpenSim/Data/SQLite/Resources/015_RegionStore.sql deleted file mode 100644 index c43f356be3..0000000000 --- a/OpenSim/Data/SQLite/Resources/015_RegionStore.sql +++ /dev/null @@ -1,6 +0,0 @@ -BEGIN; - -ALTER TABLE prims ADD COLUMN CollisionSound varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000'; -ALTER TABLE prims ADD COLUMN CollisionSoundVolume float NOT NULL default 0; - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/016_RegionStore.sql b/OpenSim/Data/SQLite/Resources/016_RegionStore.sql deleted file mode 100644 index 52f160cdbc..0000000000 --- a/OpenSim/Data/SQLite/Resources/016_RegionStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -ALTER TABLE prims ADD COLUMN VolumeDetect INTEGER NOT NULL DEFAULT 0; - -COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/017_RegionStore.sql b/OpenSim/Data/SQLite/Resources/017_RegionStore.sql deleted file mode 100644 index 6c6b7b5d40..0000000000 --- a/OpenSim/Data/SQLite/Resources/017_RegionStore.sql +++ /dev/null @@ -1,8 +0,0 @@ -BEGIN; -CREATE TEMPORARY TABLE prims_backup(UUID,RegionUUID,CreationDate,Name,SceneGroupID,Text,Description,SitName,TouchName,CreatorID,OwnerID,GroupID,LastOwnerID,OwnerMask,NextOwnerMask,GroupMask,EveryoneMask,BaseMask,PositionX,PositionY,PositionZ,GroupPositionX,GroupPositionY,GroupPositionZ,VelocityX,VelocityY,VelocityZ,AngularVelocityX,AngularVelocityY,AngularVelocityZ,AccelerationX,AccelerationY,AccelerationZ,RotationX,RotationY,RotationZ,RotationW,ObjectFlags,SitTargetOffsetX,SitTargetOffsetY,SitTargetOffsetZ,SitTargetOrientW,SitTargetOrientX,SitTargetOrientY,SitTargetOrientZ,ColorR,ColorG,ColorB,ColorA,ClickAction,PayPrice,PayButton1,PayButton2,PayButton3,PayButton4,LoopedSound,LoopedSoundGain,TextureAnimation,ParticleSystem,OmegaX,OmegaY,OmegaZ,CameraEyeOffsetX,CameraEyeOffsetY,CameraEyeOffsetZ,CameraAtOffsetX,CameraAtOffsetY,CameraAtOffsetZ,ForceMouselook,ScriptAccessPin,AllowedDrop,DieAtEdge,SalePrice,SaleType,Material,CollisionSound,CollisionSoundVolume,VolumeDetect); -INSERT INTO prims_backup SELECT UUID,RegionUUID,CreationDate,Name,SceneGroupID,Text,Description,SitName,TouchName,CreatorID,OwnerID,GroupID,LastOwnerID,OwnerMask,NextOwnerMask,GroupMask,EveryoneMask,BaseMask,PositionX,PositionY,PositionZ,GroupPositionX,GroupPositionY,GroupPositionZ,VelocityX,VelocityY,VelocityZ,AngularVelocityX,AngularVelocityY,AngularVelocityZ,AccelerationX,AccelerationY,AccelerationZ,RotationX,RotationY,RotationZ,RotationW,ObjectFlags,SitTargetOffsetX,SitTargetOffsetY,SitTargetOffsetZ,SitTargetOrientW,SitTargetOrientX,SitTargetOrientY,SitTargetOrientZ,ColorR,ColorG,ColorB,ColorA,ClickAction,PayPrice,PayButton1,PayButton2,PayButton3,PayButton4,LoopedSound,LoopedSoundGain,TextureAnimation,ParticleSystem,OmegaX,OmegaY,OmegaZ,CameraEyeOffsetX,CameraEyeOffsetY,CameraEyeOffsetZ,CameraAtOffsetX,CameraAtOffsetY,CameraAtOffsetZ,ForceMouselook,ScriptAccessPin,AllowedDrop,DieAtEdge,SalePrice,SaleType,Material,CollisionSound,CollisionSoundVolume,VolumeDetect FROM prims; -DROP TABLE prims; -CREATE TABLE prims(UUID,RegionUUID,CreationDate,Name,SceneGroupID,Text,Description,SitName,TouchName,CreatorID,OwnerID,GroupID,LastOwnerID,OwnerMask,NextOwnerMask,GroupMask,EveryoneMask,BaseMask,PositionX,PositionY,PositionZ,GroupPositionX,GroupPositionY,GroupPositionZ,VelocityX,VelocityY,VelocityZ,AngularVelocityX,AngularVelocityY,AngularVelocityZ,AccelerationX,AccelerationY,AccelerationZ,RotationX,RotationY,RotationZ,RotationW,ObjectFlags,SitTargetOffsetX,SitTargetOffsetY,SitTargetOffsetZ,SitTargetOrientW,SitTargetOrientX,SitTargetOrientY,SitTargetOrientZ,ColorR,ColorG,ColorB,ColorA,ClickAction,PayPrice,PayButton1,PayButton2,PayButton3,PayButton4,LoopedSound,LoopedSoundGain,TextureAnimation,ParticleSystem,OmegaX,OmegaY,OmegaZ,CameraEyeOffsetX,CameraEyeOffsetY,CameraEyeOffsetZ,CameraAtOffsetX,CameraAtOffsetY,CameraAtOffsetZ,ForceMouselook,ScriptAccessPin,AllowedDrop,DieAtEdge,SalePrice,SaleType,Material,CollisionSound,CollisionSoundVolume,VolumeDetect); -INSERT INTO prims SELECT UUID,RegionUUID,CreationDate,Name,SceneGroupID,Text,Description,SitName,TouchName,CreatorID,OwnerID,GroupID,LastOwnerID,OwnerMask,NextOwnerMask,GroupMask,EveryoneMask,BaseMask,PositionX,PositionY,PositionZ,GroupPositionX,GroupPositionY,GroupPositionZ,VelocityX,VelocityY,VelocityZ,AngularVelocityX,AngularVelocityY,AngularVelocityZ,AccelerationX,AccelerationY,AccelerationZ,RotationX,RotationY,RotationZ,RotationW,ObjectFlags,SitTargetOffsetX,SitTargetOffsetY,SitTargetOffsetZ,SitTargetOrientW,SitTargetOrientX,SitTargetOrientY,SitTargetOrientZ,ColorR,ColorG,ColorB,ColorA,ClickAction,PayPrice,PayButton1,PayButton2,PayButton3,PayButton4,LoopedSound,LoopedSoundGain,TextureAnimation,ParticleSystem,OmegaX,OmegaY,OmegaZ,CameraEyeOffsetX,CameraEyeOffsetY,CameraEyeOffsetZ,CameraAtOffsetX,CameraAtOffsetY,CameraAtOffsetZ,ForceMouselook,ScriptAccessPin,AllowedDrop,DieAtEdge,SalePrice,SaleType,Material,CollisionSound,CollisionSoundVolume,VolumeDetect FROM prims_backup; -DROP TABLE prims_backup; -COMMIT; \ No newline at end of file diff --git a/OpenSim/Data/SQLite/Resources/018_RegionStore.sql b/OpenSim/Data/SQLite/Resources/018_RegionStore.sql deleted file mode 100644 index 6a390c2161..0000000000 --- a/OpenSim/Data/SQLite/Resources/018_RegionStore.sql +++ /dev/null @@ -1,79 +0,0 @@ -BEGIN; - -update terrain - set RegionUUID = substr(RegionUUID, 1, 8) || "-" || substr(RegionUUID, 9, 4) || "-" || substr(RegionUUID, 13, 4) || "-" || substr(RegionUUID, 17, 4) || "-" || substr(RegionUUID, 21, 12) - where RegionUUID not like '%-%'; - - -update landaccesslist - set LandUUID = substr(LandUUID, 1, 8) || "-" || substr(LandUUID, 9, 4) || "-" || substr(LandUUID, 13, 4) || "-" || substr(LandUUID, 17, 4) || "-" || substr(LandUUID, 21, 12) - where LandUUID not like '%-%'; - -update landaccesslist - set AccessUUID = substr(AccessUUID, 1, 8) || "-" || substr(AccessUUID, 9, 4) || "-" || substr(AccessUUID, 13, 4) || "-" || substr(AccessUUID, 17, 4) || "-" || substr(AccessUUID, 21, 12) - where AccessUUID not like '%-%'; - - -update prims - set UUID = substr(UUID, 1, 8) || "-" || substr(UUID, 9, 4) || "-" || substr(UUID, 13, 4) || "-" || substr(UUID, 17, 4) || "-" || substr(UUID, 21, 12) - where UUID not like '%-%'; - -update prims - set RegionUUID = substr(RegionUUID, 1, 8) || "-" || substr(RegionUUID, 9, 4) || "-" || substr(RegionUUID, 13, 4) || "-" || substr(RegionUUID, 17, 4) || "-" || substr(RegionUUID, 21, 12) - where RegionUUID not like '%-%'; - -update prims - set SceneGroupID = substr(SceneGroupID, 1, 8) || "-" || substr(SceneGroupID, 9, 4) || "-" || substr(SceneGroupID, 13, 4) || "-" || substr(SceneGroupID, 17, 4) || "-" || substr(SceneGroupID, 21, 12) - where SceneGroupID not like '%-%'; - -update prims - set CreatorID = substr(CreatorID, 1, 8) || "-" || substr(CreatorID, 9, 4) || "-" || substr(CreatorID, 13, 4) || "-" || substr(CreatorID, 17, 4) || "-" || substr(CreatorID, 21, 12) - where CreatorID not like '%-%'; - -update prims - set OwnerID = substr(OwnerID, 1, 8) || "-" || substr(OwnerID, 9, 4) || "-" || substr(OwnerID, 13, 4) || "-" || substr(OwnerID, 17, 4) || "-" || substr(OwnerID, 21, 12) - where OwnerID not like '%-%'; - -update prims - set GroupID = substr(GroupID, 1, 8) || "-" || substr(GroupID, 9, 4) || "-" || substr(GroupID, 13, 4) || "-" || substr(GroupID, 17, 4) || "-" || substr(GroupID, 21, 12) - where GroupID not like '%-%'; - -update prims - set LastOwnerID = substr(LastOwnerID, 1, 8) || "-" || substr(LastOwnerID, 9, 4) || "-" || substr(LastOwnerID, 13, 4) || "-" || substr(LastOwnerID, 17, 4) || "-" || substr(LastOwnerID, 21, 12) - where LastOwnerID not like '%-%'; - - -update primshapes - set UUID = substr(UUID, 1, 8) || "-" || substr(UUID, 9, 4) || "-" || substr(UUID, 13, 4) || "-" || substr(UUID, 17, 4) || "-" || substr(UUID, 21, 12) - where UUID not like '%-%'; - - -update land - set UUID = substr(UUID, 1, 8) || "-" || substr(UUID, 9, 4) || "-" || substr(UUID, 13, 4) || "-" || substr(UUID, 17, 4) || "-" || substr(UUID, 21, 12) - where UUID not like '%-%'; - -update land - set RegionUUID = substr(RegionUUID, 1, 8) || "-" || substr(RegionUUID, 9, 4) || "-" || substr(RegionUUID, 13, 4) || "-" || substr(RegionUUID, 17, 4) || "-" || substr(RegionUUID, 21, 12) - where RegionUUID not like '%-%'; - -update land - set OwnerUUID = substr(OwnerUUID, 1, 8) || "-" || substr(OwnerUUID, 9, 4) || "-" || substr(OwnerUUID, 13, 4) || "-" || substr(OwnerUUID, 17, 4) || "-" || substr(OwnerUUID, 21, 12) - where OwnerUUID not like '%-%'; - -update land - set GroupUUID = substr(GroupUUID, 1, 8) || "-" || substr(GroupUUID, 9, 4) || "-" || substr(GroupUUID, 13, 4) || "-" || substr(GroupUUID, 17, 4) || "-" || substr(GroupUUID, 21, 12) - where GroupUUID not like '%-%'; - -update land - set MediaTextureUUID = substr(MediaTextureUUID, 1, 8) || "-" || substr(MediaTextureUUID, 9, 4) || "-" || substr(MediaTextureUUID, 13, 4) || "-" || substr(MediaTextureUUID, 17, 4) || "-" || substr(MediaTextureUUID, 21, 12) - where MediaTextureUUID not like '%-%'; - -update land - set SnapshotUUID = substr(SnapshotUUID, 1, 8) || "-" || substr(SnapshotUUID, 9, 4) || "-" || substr(SnapshotUUID, 13, 4) || "-" || substr(SnapshotUUID, 17, 4) || "-" || substr(SnapshotUUID, 21, 12) - where SnapshotUUID not like '%-%'; - -update land - set AuthbuyerID = substr(AuthbuyerID, 1, 8) || "-" || substr(AuthbuyerID, 9, 4) || "-" || substr(AuthbuyerID, 13, 4) || "-" || substr(AuthbuyerID, 17, 4) || "-" || substr(AuthbuyerID, 21, 12) - where AuthbuyerID not like '%-%'; - -COMMIT; \ No newline at end of file diff --git a/OpenSim/Data/SQLite/Resources/AssetStore.migrations b/OpenSim/Data/SQLite/Resources/AssetStore.migrations new file mode 100644 index 0000000000..fb72b91af9 --- /dev/null +++ b/OpenSim/Data/SQLite/Resources/AssetStore.migrations @@ -0,0 +1,42 @@ +:VERSION 1 + +BEGIN TRANSACTION; +CREATE TABLE assets( + UUID varchar(255) primary key, + Name varchar(255), + Description varchar(255), + Type integer, + InvType integer, + Local integer, + Temporary integer, + Data blob); + +COMMIT; + +:VERSION 2 + +BEGIN TRANSACTION; + +CREATE TEMPORARY TABLE assets_backup(UUID,Name,Description,Type,Local,Temporary,Data); +INSERT INTO assets_backup SELECT UUID,Name,Description,Type,Local,Temporary,Data FROM assets; +DROP TABLE assets; +CREATE TABLE assets(UUID,Name,Description,Type,Local,Temporary,Data); +INSERT INTO assets SELECT UUID,Name,Description,Type,Local,Temporary,Data FROM assets_backup; +DROP TABLE assets_backup; + +COMMIT; + +:VERSION 3 + +DELETE FROM assets WHERE UUID = 'dc4b9f0bd00845c696a401dd947ac621' + +:VERSION 4 + +BEGIN; + +update assets + set UUID = substr(UUID, 1, 8) || "-" || substr(UUID, 9, 4) || "-" || substr(UUID, 13, 4) || "-" || substr(UUID, 17, 4) || "-" || substr(UUID, 21, 12) + where UUID not like '%-%'; + +COMMIT; + diff --git a/OpenSim/Data/SQLite/Resources/001_AuthStore.sql b/OpenSim/Data/SQLite/Resources/AuthStore.migrations similarity index 62% rename from OpenSim/Data/SQLite/Resources/001_AuthStore.sql rename to OpenSim/Data/SQLite/Resources/AuthStore.migrations index 468567dcc2..ca6bdf55a5 100644 --- a/OpenSim/Data/SQLite/Resources/001_AuthStore.sql +++ b/OpenSim/Data/SQLite/Resources/AuthStore.migrations @@ -1,3 +1,5 @@ +:VERSION 1 + BEGIN TRANSACTION; CREATE TABLE auth ( @@ -16,3 +18,12 @@ CREATE TABLE tokens ( ); COMMIT; + +:VERSION 2 + +BEGIN TRANSACTION; + +INSERT INTO auth (UUID, passwordHash, passwordSalt, webLoginKey) SELECT `UUID` AS UUID, `passwordHash` AS passwordHash, `passwordSalt` AS passwordSalt, `webLoginKey` AS webLoginKey FROM users; + +COMMIT; + diff --git a/OpenSim/Data/SQLite/Resources/001_Avatar.sql b/OpenSim/Data/SQLite/Resources/Avatar.migrations similarity index 92% rename from OpenSim/Data/SQLite/Resources/001_Avatar.sql rename to OpenSim/Data/SQLite/Resources/Avatar.migrations index 7ec906b48a..13b41969ec 100644 --- a/OpenSim/Data/SQLite/Resources/001_Avatar.sql +++ b/OpenSim/Data/SQLite/Resources/Avatar.migrations @@ -1,3 +1,5 @@ +:VERSION 1 + BEGIN TRANSACTION; CREATE TABLE Avatars ( diff --git a/OpenSim/Data/SQLite/Resources/001_FriendsStore.sql b/OpenSim/Data/SQLite/Resources/FriendsStore.migrations similarity index 63% rename from OpenSim/Data/SQLite/Resources/001_FriendsStore.sql rename to OpenSim/Data/SQLite/Resources/FriendsStore.migrations index f1b9ab9902..3eb4352a0c 100644 --- a/OpenSim/Data/SQLite/Resources/001_FriendsStore.sql +++ b/OpenSim/Data/SQLite/Resources/FriendsStore.migrations @@ -1,3 +1,5 @@ +:VERSION 1 + BEGIN TRANSACTION; CREATE TABLE `Friends` ( @@ -8,3 +10,11 @@ CREATE TABLE `Friends` ( PRIMARY KEY(`PrincipalID`, `Friend`)); COMMIT; + +:VERSION 2 + +BEGIN TRANSACTION; + +INSERT INTO `Friends` SELECT `ownerID`, `friendID`, `friendPerms`, 0 FROM `userfriends`; + +COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/004_InventoryStore.sql b/OpenSim/Data/SQLite/Resources/InventoryStore.migrations similarity index 55% rename from OpenSim/Data/SQLite/Resources/004_InventoryStore.sql rename to OpenSim/Data/SQLite/Resources/InventoryStore.migrations index e8f4d46333..585ac498e6 100644 --- a/OpenSim/Data/SQLite/Resources/004_InventoryStore.sql +++ b/OpenSim/Data/SQLite/Resources/InventoryStore.migrations @@ -1,3 +1,59 @@ +:VERSION 1 + +BEGIN TRANSACTION; + +CREATE TABLE inventoryfolders( + UUID varchar(255) primary key, + name varchar(255), + agentID varchar(255), + parentID varchar(255), + type integer, + version integer); + +CREATE TABLE inventoryitems( + UUID varchar(255) primary key, + assetID varchar(255), + assetType integer, + invType integer, + parentFolderID varchar(255), + avatarID varchar(255), + creatorsID varchar(255), + inventoryName varchar(255), + inventoryDescription varchar(255), + inventoryNextPermissions integer, + inventoryCurrentPermissions integer, + inventoryBasePermissions integer, + inventoryEveryOnePermissions integer, + salePrice integer default 99, + saleType integer default 0, + creationDate integer default 2000, + groupID varchar(255) default '00000000-0000-0000-0000-000000000000', + groupOwned integer default 0, + flags integer default 0); + +COMMIT; + +:VERSION 2 + +BEGIN TRANSACTION; + +create index inventoryfolders_agentid on inventoryfolders(agentid); +create index inventoryfolders_parentid on inventoryfolders(parentid); +create index inventoryitems_parentfolderid on inventoryitems(parentfolderid); +create index inventoryitems_avatarid on inventoryitems(avatarid); + +COMMIT; + +:VERSION 3 + +BEGIN; + +alter table inventoryitems add column inventoryGroupPermissions integer unsigned not null default 0; + +COMMIT; + +:VERSION 4 + BEGIN; update inventoryitems diff --git a/OpenSim/Data/SQLite/Resources/RegionStore.migrations b/OpenSim/Data/SQLite/Resources/RegionStore.migrations new file mode 100644 index 0000000000..7b27378139 --- /dev/null +++ b/OpenSim/Data/SQLite/Resources/RegionStore.migrations @@ -0,0 +1,526 @@ +:VERSION 1 + +BEGIN TRANSACTION; + +CREATE TABLE prims( + UUID varchar(255) primary key, + RegionUUID varchar(255), + ParentID integer, + CreationDate integer, + Name varchar(255), + SceneGroupID varchar(255), + Text varchar(255), + Description varchar(255), + SitName varchar(255), + TouchName varchar(255), + CreatorID varchar(255), + OwnerID varchar(255), + GroupID varchar(255), + LastOwnerID varchar(255), + OwnerMask integer, + NextOwnerMask integer, + GroupMask integer, + EveryoneMask integer, + BaseMask integer, + PositionX float, + PositionY float, + PositionZ float, + GroupPositionX float, + GroupPositionY float, + GroupPositionZ float, + VelocityX float, + VelocityY float, + VelocityZ float, + AngularVelocityX float, + AngularVelocityY float, + AngularVelocityZ float, + AccelerationX float, + AccelerationY float, + AccelerationZ float, + RotationX float, + RotationY float, + RotationZ float, + RotationW float, + ObjectFlags integer, + SitTargetOffsetX float NOT NULL default 0, + SitTargetOffsetY float NOT NULL default 0, + SitTargetOffsetZ float NOT NULL default 0, + SitTargetOrientW float NOT NULL default 0, + SitTargetOrientX float NOT NULL default 0, + SitTargetOrientY float NOT NULL default 0, + SitTargetOrientZ float NOT NULL default 0); + +CREATE TABLE primshapes( + UUID varchar(255) primary key, + Shape integer, + ScaleX float, + ScaleY float, + ScaleZ float, + PCode integer, + PathBegin integer, + PathEnd integer, + PathScaleX integer, + PathScaleY integer, + PathShearX integer, + PathShearY integer, + PathSkew integer, + PathCurve integer, + PathRadiusOffset integer, + PathRevolutions integer, + PathTaperX integer, + PathTaperY integer, + PathTwist integer, + PathTwistBegin integer, + ProfileBegin integer, + ProfileEnd integer, + ProfileCurve integer, + ProfileHollow integer, + Texture blob, + ExtraParams blob, + State Integer NOT NULL default 0); + +CREATE TABLE primitems( + itemID varchar(255) primary key, + primID varchar(255), + assetID varchar(255), + parentFolderID varchar(255), + invType integer, + assetType integer, + name varchar(255), + description varchar(255), + creationDate integer, + creatorID varchar(255), + ownerID varchar(255), + lastOwnerID varchar(255), + groupID varchar(255), + nextPermissions string, + currentPermissions string, + basePermissions string, + everyonePermissions string, + groupPermissions string); + +CREATE TABLE terrain( + RegionUUID varchar(255), + Revision integer, + Heightfield blob); + +CREATE TABLE land( + UUID varchar(255) primary key, + RegionUUID varchar(255), + LocalLandID string, + Bitmap blob, + Name varchar(255), + Desc varchar(255), + OwnerUUID varchar(255), + IsGroupOwned string, + Area integer, + AuctionID integer, + Category integer, + ClaimDate integer, + ClaimPrice integer, + GroupUUID varchar(255), + SalePrice integer, + LandStatus integer, + LandFlags string, + LandingType string, + MediaAutoScale string, + MediaTextureUUID varchar(255), + MediaURL varchar(255), + MusicURL varchar(255), + PassHours float, + PassPrice string, + SnapshotUUID varchar(255), + UserLocationX float, + UserLocationY float, + UserLocationZ float, + UserLookAtX float, + UserLookAtY float, + UserLookAtZ float, + AuthbuyerID varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000'); + +CREATE TABLE landaccesslist( + LandUUID varchar(255), + AccessUUID varchar(255), + Flags string); + +COMMIT; + +:VERSION 2 + +BEGIN TRANSACTION; + +CREATE TABLE regionban( + regionUUID varchar (255), + bannedUUID varchar (255), + bannedIp varchar (255), + bannedIpHostMask varchar (255) + ); + +COMMIT; + +:VERSION 3 + +BEGIN; + +ALTER TABLE primitems add flags integer not null default 0; + +COMMIT; + +:VERSION 4 + +BEGIN; + +create table regionsettings ( + regionUUID char(36) not null, + block_terraform integer not null, + block_fly integer not null, + allow_damage integer not null, + restrict_pushing integer not null, + allow_land_resell integer not null, + allow_land_join_divide integer not null, + block_show_in_search integer not null, + agent_limit integer not null, + object_bonus float not null, + maturity integer not null, + disable_scripts integer not null, + disable_collisions integer not null, + disable_physics integer not null, + terrain_texture_1 char(36) not null, + terrain_texture_2 char(36) not null, + terrain_texture_3 char(36) not null, + terrain_texture_4 char(36) not null, + elevation_1_nw float not null, + elevation_2_nw float not null, + elevation_1_ne float not null, + elevation_2_ne float not null, + elevation_1_se float not null, + elevation_2_se float not null, + elevation_1_sw float not null, + elevation_2_sw float not null, + water_height float not null, + terrain_raise_limit float not null, + terrain_lower_limit float not null, + use_estate_sun integer not null, + fixed_sun integer not null, + sun_position float not null, + covenant char(36)); + +COMMIT; + +:VERSION 5 + +BEGIN; + +delete from regionsettings; + +COMMIT; + +:VERSION 6 + +BEGIN TRANSACTION; + +CREATE TABLE estate_groups ( + EstateID int(10) NOT NULL, + uuid char(36) NOT NULL +); + +CREATE TABLE estate_managers ( + EstateID int(10) NOT NULL, + uuid char(36) NOT NULL +); + +CREATE TABLE estate_map ( + RegionID char(36) NOT NULL default '00000000-0000-0000-0000-000000000000', + EstateID int(11) NOT NULL +); + +CREATE TABLE estate_settings ( + EstateID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + EstateName varchar(64) default NULL, + AbuseEmailToEstateOwner tinyint(4) NOT NULL, + DenyAnonymous tinyint(4) NOT NULL, + ResetHomeOnTeleport tinyint(4) NOT NULL, + FixedSun tinyint(4) NOT NULL, + DenyTransacted tinyint(4) NOT NULL, + BlockDwell tinyint(4) NOT NULL, + DenyIdentified tinyint(4) NOT NULL, + AllowVoice tinyint(4) NOT NULL, + UseGlobalTime tinyint(4) NOT NULL, + PricePerMeter int(11) NOT NULL, + TaxFree tinyint(4) NOT NULL, + AllowDirectTeleport tinyint(4) NOT NULL, + RedirectGridX int(11) NOT NULL, + RedirectGridY int(11) NOT NULL, + ParentEstateID int(10) NOT NULL, + SunPosition double NOT NULL, + EstateSkipScripts tinyint(4) NOT NULL, + BillableFactor float NOT NULL, + PublicAccess tinyint(4) NOT NULL +); +insert into estate_settings (EstateID,EstateName,AbuseEmailToEstateOwner,DenyAnonymous,ResetHomeOnTeleport,FixedSun,DenyTransacted,BlockDwell,DenyIdentified,AllowVoice,UseGlobalTime,PricePerMeter,TaxFree,AllowDirectTeleport,RedirectGridX,RedirectGridY,ParentEstateID,SunPosition,PublicAccess,EstateSkipScripts,BillableFactor) values ( 99, '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''); +delete from estate_settings; +CREATE TABLE estate_users ( + EstateID int(10) NOT NULL, + uuid char(36) NOT NULL +); + +CREATE TABLE estateban ( + EstateID int(10) NOT NULL, + bannedUUID varchar(36) NOT NULL, + bannedIp varchar(16) NOT NULL, + bannedIpHostMask varchar(16) NOT NULL, + bannedNameMask varchar(64) default NULL +); + +drop table regionsettings; +CREATE TABLE regionsettings ( + regionUUID char(36) NOT NULL, + block_terraform int(11) NOT NULL, + block_fly int(11) NOT NULL, + allow_damage int(11) NOT NULL, + restrict_pushing int(11) NOT NULL, + allow_land_resell int(11) NOT NULL, + allow_land_join_divide int(11) NOT NULL, + block_show_in_search int(11) NOT NULL, + agent_limit int(11) NOT NULL, + object_bonus float NOT NULL, + maturity int(11) NOT NULL, + disable_scripts int(11) NOT NULL, + disable_collisions int(11) NOT NULL, + disable_physics int(11) NOT NULL, + terrain_texture_1 char(36) NOT NULL, + terrain_texture_2 char(36) NOT NULL, + terrain_texture_3 char(36) NOT NULL, + terrain_texture_4 char(36) NOT NULL, + elevation_1_nw float NOT NULL, + elevation_2_nw float NOT NULL, + elevation_1_ne float NOT NULL, + elevation_2_ne float NOT NULL, + elevation_1_se float NOT NULL, + elevation_2_se float NOT NULL, + elevation_1_sw float NOT NULL, + elevation_2_sw float NOT NULL, + water_height float NOT NULL, + terrain_raise_limit float NOT NULL, + terrain_lower_limit float NOT NULL, + use_estate_sun int(11) NOT NULL, + fixed_sun int(11) NOT NULL, + sun_position float NOT NULL, + covenant char(36) default NULL, + Sandbox tinyint(4) NOT NULL, + PRIMARY KEY (regionUUID) +); + +CREATE INDEX estate_ban_estate_id on estateban(EstateID); +CREATE INDEX estate_groups_estate_id on estate_groups(EstateID); +CREATE INDEX estate_managers_estate_id on estate_managers(EstateID); +CREATE INDEX estate_map_estate_id on estate_map(EstateID); +CREATE UNIQUE INDEX estate_map_region_id on estate_map(RegionID); +CREATE INDEX estate_users_estate_id on estate_users(EstateID); + +COMMIT; + +:VERSION 7 + +begin; + +alter table estate_settings add column AbuseEmail varchar(255) not null default ''; + +alter table estate_settings add column EstateOwner varchar(36) not null default ''; + +commit; + +:VERSION 8 + +begin; + +alter table estate_settings add column DenyMinors tinyint not null default 0; + +commit; + +:VERSION 9 + +BEGIN; + +ALTER TABLE prims ADD COLUMN ColorR integer not null default 0; +ALTER TABLE prims ADD COLUMN ColorG integer not null default 0; +ALTER TABLE prims ADD COLUMN ColorB integer not null default 0; +ALTER TABLE prims ADD COLUMN ColorA integer not null default 0; + +COMMIT; + +:VERSION 10 + +BEGIN; + +ALTER TABLE prims ADD COLUMN ClickAction INTEGER NOT NULL default 0; + +COMMIT; + +:VERSION 11 + +BEGIN; + +ALTER TABLE prims ADD COLUMN PayPrice INTEGER NOT NULL default 0; +ALTER TABLE prims ADD COLUMN PayButton1 INTEGER NOT NULL default 0; +ALTER TABLE prims ADD COLUMN PayButton2 INTEGER NOT NULL default 0; +ALTER TABLE prims ADD COLUMN PayButton3 INTEGER NOT NULL default 0; +ALTER TABLE prims ADD COLUMN PayButton4 INTEGER NOT NULL default 0; +ALTER TABLE prims ADD COLUMN LoopedSound varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000'; +ALTER TABLE prims ADD COLUMN LoopedSoundGain float NOT NULL default 0; +ALTER TABLE prims ADD COLUMN TextureAnimation string; +ALTER TABLE prims ADD COLUMN ParticleSystem string; +ALTER TABLE prims ADD COLUMN OmegaX float NOT NULL default 0; +ALTER TABLE prims ADD COLUMN OmegaY float NOT NULL default 0; +ALTER TABLE prims ADD COLUMN OmegaZ float NOT NULL default 0; +ALTER TABLE prims ADD COLUMN CameraEyeOffsetX float NOT NULL default 0; +ALTER TABLE prims ADD COLUMN CameraEyeOffsetY float NOT NULL default 0; +ALTER TABLE prims ADD COLUMN CameraEyeOffsetZ float NOT NULL default 0; +ALTER TABLE prims ADD COLUMN CameraAtOffsetX float NOT NULL default 0; +ALTER TABLE prims ADD COLUMN CameraAtOffsetY float NOT NULL default 0; +ALTER TABLE prims ADD COLUMN CameraAtOffsetZ float NOT NULL default 0; +ALTER TABLE prims ADD COLUMN ForceMouselook string NOT NULL default 0; +ALTER TABLE prims ADD COLUMN ScriptAccessPin INTEGER NOT NULL default 0; +ALTER TABLE prims ADD COLUMN AllowedDrop INTEGER NOT NULL default 0; +ALTER TABLE prims ADD COLUMN DieAtEdge string NOT NULL default 0; +ALTER TABLE prims ADD COLUMN SalePrice INTEGER NOT NULL default 0; +ALTER TABLE prims ADD COLUMN SaleType string NOT NULL default 0; + +COMMIT; + +:VERSION 12 + +BEGIN; + +ALTER TABLE prims ADD COLUMN Material INTEGER NOT NULL default 3; + +COMMIT; + +:VERSION 13 + +BEGIN; + +ALTER TABLE land ADD COLUMN OtherCleanTime INTEGER NOT NULL default 0; +ALTER TABLE land ADD COLUMN Dwell INTEGER NOT NULL default 0; + +COMMIT; + +:VERSION 14 + +begin; + +ALTER TABLE regionsettings ADD COLUMN sunvectorx double NOT NULL default 0; +ALTER TABLE regionsettings ADD COLUMN sunvectory double NOT NULL default 0; +ALTER TABLE regionsettings ADD COLUMN sunvectorz double NOT NULL default 0; + +commit; + +:VERSION 15 + +BEGIN; + +ALTER TABLE prims ADD COLUMN CollisionSound varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000'; +ALTER TABLE prims ADD COLUMN CollisionSoundVolume float NOT NULL default 0; + +COMMIT; + +:VERSION 16 + +BEGIN; + +ALTER TABLE prims ADD COLUMN VolumeDetect INTEGER NOT NULL DEFAULT 0; + +COMMIT; + +:VERSION 17 + +BEGIN; +CREATE TEMPORARY TABLE prims_backup(UUID,RegionUUID,CreationDate,Name,SceneGroupID,Text,Description,SitName,TouchName,CreatorID,OwnerID,GroupID,LastOwnerID,OwnerMask,NextOwnerMask,GroupMask,EveryoneMask,BaseMask,PositionX,PositionY,PositionZ,GroupPositionX,GroupPositionY,GroupPositionZ,VelocityX,VelocityY,VelocityZ,AngularVelocityX,AngularVelocityY,AngularVelocityZ,AccelerationX,AccelerationY,AccelerationZ,RotationX,RotationY,RotationZ,RotationW,ObjectFlags,SitTargetOffsetX,SitTargetOffsetY,SitTargetOffsetZ,SitTargetOrientW,SitTargetOrientX,SitTargetOrientY,SitTargetOrientZ,ColorR,ColorG,ColorB,ColorA,ClickAction,PayPrice,PayButton1,PayButton2,PayButton3,PayButton4,LoopedSound,LoopedSoundGain,TextureAnimation,ParticleSystem,OmegaX,OmegaY,OmegaZ,CameraEyeOffsetX,CameraEyeOffsetY,CameraEyeOffsetZ,CameraAtOffsetX,CameraAtOffsetY,CameraAtOffsetZ,ForceMouselook,ScriptAccessPin,AllowedDrop,DieAtEdge,SalePrice,SaleType,Material,CollisionSound,CollisionSoundVolume,VolumeDetect); +INSERT INTO prims_backup SELECT UUID,RegionUUID,CreationDate,Name,SceneGroupID,Text,Description,SitName,TouchName,CreatorID,OwnerID,GroupID,LastOwnerID,OwnerMask,NextOwnerMask,GroupMask,EveryoneMask,BaseMask,PositionX,PositionY,PositionZ,GroupPositionX,GroupPositionY,GroupPositionZ,VelocityX,VelocityY,VelocityZ,AngularVelocityX,AngularVelocityY,AngularVelocityZ,AccelerationX,AccelerationY,AccelerationZ,RotationX,RotationY,RotationZ,RotationW,ObjectFlags,SitTargetOffsetX,SitTargetOffsetY,SitTargetOffsetZ,SitTargetOrientW,SitTargetOrientX,SitTargetOrientY,SitTargetOrientZ,ColorR,ColorG,ColorB,ColorA,ClickAction,PayPrice,PayButton1,PayButton2,PayButton3,PayButton4,LoopedSound,LoopedSoundGain,TextureAnimation,ParticleSystem,OmegaX,OmegaY,OmegaZ,CameraEyeOffsetX,CameraEyeOffsetY,CameraEyeOffsetZ,CameraAtOffsetX,CameraAtOffsetY,CameraAtOffsetZ,ForceMouselook,ScriptAccessPin,AllowedDrop,DieAtEdge,SalePrice,SaleType,Material,CollisionSound,CollisionSoundVolume,VolumeDetect FROM prims; +DROP TABLE prims; +CREATE TABLE prims(UUID,RegionUUID,CreationDate,Name,SceneGroupID,Text,Description,SitName,TouchName,CreatorID,OwnerID,GroupID,LastOwnerID,OwnerMask,NextOwnerMask,GroupMask,EveryoneMask,BaseMask,PositionX,PositionY,PositionZ,GroupPositionX,GroupPositionY,GroupPositionZ,VelocityX,VelocityY,VelocityZ,AngularVelocityX,AngularVelocityY,AngularVelocityZ,AccelerationX,AccelerationY,AccelerationZ,RotationX,RotationY,RotationZ,RotationW,ObjectFlags,SitTargetOffsetX,SitTargetOffsetY,SitTargetOffsetZ,SitTargetOrientW,SitTargetOrientX,SitTargetOrientY,SitTargetOrientZ,ColorR,ColorG,ColorB,ColorA,ClickAction,PayPrice,PayButton1,PayButton2,PayButton3,PayButton4,LoopedSound,LoopedSoundGain,TextureAnimation,ParticleSystem,OmegaX,OmegaY,OmegaZ,CameraEyeOffsetX,CameraEyeOffsetY,CameraEyeOffsetZ,CameraAtOffsetX,CameraAtOffsetY,CameraAtOffsetZ,ForceMouselook,ScriptAccessPin,AllowedDrop,DieAtEdge,SalePrice,SaleType,Material,CollisionSound,CollisionSoundVolume,VolumeDetect); +INSERT INTO prims SELECT UUID,RegionUUID,CreationDate,Name,SceneGroupID,Text,Description,SitName,TouchName,CreatorID,OwnerID,GroupID,LastOwnerID,OwnerMask,NextOwnerMask,GroupMask,EveryoneMask,BaseMask,PositionX,PositionY,PositionZ,GroupPositionX,GroupPositionY,GroupPositionZ,VelocityX,VelocityY,VelocityZ,AngularVelocityX,AngularVelocityY,AngularVelocityZ,AccelerationX,AccelerationY,AccelerationZ,RotationX,RotationY,RotationZ,RotationW,ObjectFlags,SitTargetOffsetX,SitTargetOffsetY,SitTargetOffsetZ,SitTargetOrientW,SitTargetOrientX,SitTargetOrientY,SitTargetOrientZ,ColorR,ColorG,ColorB,ColorA,ClickAction,PayPrice,PayButton1,PayButton2,PayButton3,PayButton4,LoopedSound,LoopedSoundGain,TextureAnimation,ParticleSystem,OmegaX,OmegaY,OmegaZ,CameraEyeOffsetX,CameraEyeOffsetY,CameraEyeOffsetZ,CameraAtOffsetX,CameraAtOffsetY,CameraAtOffsetZ,ForceMouselook,ScriptAccessPin,AllowedDrop,DieAtEdge,SalePrice,SaleType,Material,CollisionSound,CollisionSoundVolume,VolumeDetect FROM prims_backup; +DROP TABLE prims_backup; +COMMIT; + +:VERSION 18 + +BEGIN; + +update terrain + set RegionUUID = substr(RegionUUID, 1, 8) || "-" || substr(RegionUUID, 9, 4) || "-" || substr(RegionUUID, 13, 4) || "-" || substr(RegionUUID, 17, 4) || "-" || substr(RegionUUID, 21, 12) + where RegionUUID not like '%-%'; + + +update landaccesslist + set LandUUID = substr(LandUUID, 1, 8) || "-" || substr(LandUUID, 9, 4) || "-" || substr(LandUUID, 13, 4) || "-" || substr(LandUUID, 17, 4) || "-" || substr(LandUUID, 21, 12) + where LandUUID not like '%-%'; + +update landaccesslist + set AccessUUID = substr(AccessUUID, 1, 8) || "-" || substr(AccessUUID, 9, 4) || "-" || substr(AccessUUID, 13, 4) || "-" || substr(AccessUUID, 17, 4) || "-" || substr(AccessUUID, 21, 12) + where AccessUUID not like '%-%'; + + +update prims + set UUID = substr(UUID, 1, 8) || "-" || substr(UUID, 9, 4) || "-" || substr(UUID, 13, 4) || "-" || substr(UUID, 17, 4) || "-" || substr(UUID, 21, 12) + where UUID not like '%-%'; + +update prims + set RegionUUID = substr(RegionUUID, 1, 8) || "-" || substr(RegionUUID, 9, 4) || "-" || substr(RegionUUID, 13, 4) || "-" || substr(RegionUUID, 17, 4) || "-" || substr(RegionUUID, 21, 12) + where RegionUUID not like '%-%'; + +update prims + set SceneGroupID = substr(SceneGroupID, 1, 8) || "-" || substr(SceneGroupID, 9, 4) || "-" || substr(SceneGroupID, 13, 4) || "-" || substr(SceneGroupID, 17, 4) || "-" || substr(SceneGroupID, 21, 12) + where SceneGroupID not like '%-%'; + +update prims + set CreatorID = substr(CreatorID, 1, 8) || "-" || substr(CreatorID, 9, 4) || "-" || substr(CreatorID, 13, 4) || "-" || substr(CreatorID, 17, 4) || "-" || substr(CreatorID, 21, 12) + where CreatorID not like '%-%'; + +update prims + set OwnerID = substr(OwnerID, 1, 8) || "-" || substr(OwnerID, 9, 4) || "-" || substr(OwnerID, 13, 4) || "-" || substr(OwnerID, 17, 4) || "-" || substr(OwnerID, 21, 12) + where OwnerID not like '%-%'; + +update prims + set GroupID = substr(GroupID, 1, 8) || "-" || substr(GroupID, 9, 4) || "-" || substr(GroupID, 13, 4) || "-" || substr(GroupID, 17, 4) || "-" || substr(GroupID, 21, 12) + where GroupID not like '%-%'; + +update prims + set LastOwnerID = substr(LastOwnerID, 1, 8) || "-" || substr(LastOwnerID, 9, 4) || "-" || substr(LastOwnerID, 13, 4) || "-" || substr(LastOwnerID, 17, 4) || "-" || substr(LastOwnerID, 21, 12) + where LastOwnerID not like '%-%'; + + +update primshapes + set UUID = substr(UUID, 1, 8) || "-" || substr(UUID, 9, 4) || "-" || substr(UUID, 13, 4) || "-" || substr(UUID, 17, 4) || "-" || substr(UUID, 21, 12) + where UUID not like '%-%'; + + +update land + set UUID = substr(UUID, 1, 8) || "-" || substr(UUID, 9, 4) || "-" || substr(UUID, 13, 4) || "-" || substr(UUID, 17, 4) || "-" || substr(UUID, 21, 12) + where UUID not like '%-%'; + +update land + set RegionUUID = substr(RegionUUID, 1, 8) || "-" || substr(RegionUUID, 9, 4) || "-" || substr(RegionUUID, 13, 4) || "-" || substr(RegionUUID, 17, 4) || "-" || substr(RegionUUID, 21, 12) + where RegionUUID not like '%-%'; + +update land + set OwnerUUID = substr(OwnerUUID, 1, 8) || "-" || substr(OwnerUUID, 9, 4) || "-" || substr(OwnerUUID, 13, 4) || "-" || substr(OwnerUUID, 17, 4) || "-" || substr(OwnerUUID, 21, 12) + where OwnerUUID not like '%-%'; + +update land + set GroupUUID = substr(GroupUUID, 1, 8) || "-" || substr(GroupUUID, 9, 4) || "-" || substr(GroupUUID, 13, 4) || "-" || substr(GroupUUID, 17, 4) || "-" || substr(GroupUUID, 21, 12) + where GroupUUID not like '%-%'; + +update land + set MediaTextureUUID = substr(MediaTextureUUID, 1, 8) || "-" || substr(MediaTextureUUID, 9, 4) || "-" || substr(MediaTextureUUID, 13, 4) || "-" || substr(MediaTextureUUID, 17, 4) || "-" || substr(MediaTextureUUID, 21, 12) + where MediaTextureUUID not like '%-%'; + +update land + set SnapshotUUID = substr(SnapshotUUID, 1, 8) || "-" || substr(SnapshotUUID, 9, 4) || "-" || substr(SnapshotUUID, 13, 4) || "-" || substr(SnapshotUUID, 17, 4) || "-" || substr(SnapshotUUID, 21, 12) + where SnapshotUUID not like '%-%'; + +update land + set AuthbuyerID = substr(AuthbuyerID, 1, 8) || "-" || substr(AuthbuyerID, 9, 4) || "-" || substr(AuthbuyerID, 13, 4) || "-" || substr(AuthbuyerID, 17, 4) || "-" || substr(AuthbuyerID, 21, 12) + where AuthbuyerID not like '%-%'; + +COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/001_UserAccount.sql b/OpenSim/Data/SQLite/Resources/UserAccount.migrations similarity index 51% rename from OpenSim/Data/SQLite/Resources/001_UserAccount.sql rename to OpenSim/Data/SQLite/Resources/UserAccount.migrations index c38d9a762f..854fe694c2 100644 --- a/OpenSim/Data/SQLite/Resources/001_UserAccount.sql +++ b/OpenSim/Data/SQLite/Resources/UserAccount.migrations @@ -1,4 +1,6 @@ -BEGIN TRANSACTION; +:VERSION 1 + +BEGIN TRANSACTION; -- useraccounts table CREATE TABLE UserAccounts ( @@ -14,4 +16,12 @@ CREATE TABLE UserAccounts ( UserTitle varchar(64) NOT NULL DEFAULT '' ); -COMMIT; \ No newline at end of file +COMMIT; + +:VERSION 2 + +BEGIN TRANSACTION; + +INSERT INTO UserAccounts (PrincipalID, ScopeID, FirstName, LastName, Email, ServiceURLs, Created) SELECT `UUID` AS PrincipalID, '00000000-0000-0000-0000-000000000000' AS ScopeID, username AS FirstName, surname AS LastName, '' as Email, '' AS ServiceURLs, created as Created FROM users; + +COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/UserStore.migrations b/OpenSim/Data/SQLite/Resources/UserStore.migrations new file mode 100644 index 0000000000..73d35e83c3 --- /dev/null +++ b/OpenSim/Data/SQLite/Resources/UserStore.migrations @@ -0,0 +1,169 @@ +:VERSION 1 + +BEGIN TRANSACTION; + +-- users table +CREATE TABLE users( + UUID varchar(255) primary key, + username varchar(255), + surname varchar(255), + passwordHash varchar(255), + passwordSalt varchar(255), + homeRegionX integer, + homeRegionY integer, + homeLocationX float, + homeLocationY float, + homeLocationZ float, + homeLookAtX float, + homeLookAtY float, + homeLookAtZ float, + created integer, + lastLogin integer, + rootInventoryFolderID varchar(255), + userInventoryURI varchar(255), + userAssetURI varchar(255), + profileCanDoMask integer, + profileWantDoMask integer, + profileAboutText varchar(255), + profileFirstText varchar(255), + profileImage varchar(255), + profileFirstImage varchar(255), + webLoginKey text default '00000000-0000-0000-0000-000000000000'); +-- friends table +CREATE TABLE userfriends( + ownerID varchar(255), + friendID varchar(255), + friendPerms integer, + ownerPerms integer, + datetimestamp integer); + +COMMIT; + +:VERSION 2 + +BEGIN; + +ALTER TABLE users add homeRegionID varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000'; + +COMMIT; + +:VERSION 3 + +BEGIN; + +ALTER TABLE users add userFlags integer NOT NULL default 0; +ALTER TABLE users add godLevel integer NOT NULL default 0; + +COMMIT; + +:VERSION 4 + +BEGIN; + +ALTER TABLE users add customType varchar(32) not null default ''; +ALTER TABLE users add partner char(36) not null default '00000000-0000-0000-0000-000000000000'; + +COMMIT; + +:VERSION 5 + +BEGIN; + +CREATE TABLE `avatarattachments` (`UUID` char(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000', `attachpoint` int(11) NOT NULL DEFAULT 0, `item` char(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000', `asset` char(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000'); + +COMMIT; + +:VERSION 6 + +BEGIN TRANSACTION; + +-- usersagents table +CREATE TABLE IF NOT EXISTS useragents( + UUID varchar(255) primary key, + agentIP varchar(255), + agentPort integer, + agentOnline boolean, + sessionID varchar(255), + secureSessionID varchar(255), + regionID varchar(255), + loginTime integer, + logoutTime integer, + currentRegion varchar(255), + currentHandle varchar(255), + currentPosX float, + currentPosY float, + currentPosZ float); + +COMMIT; + +:VERSION 7 + +BEGIN TRANSACTION; + +ALTER TABLE useragents add currentLookAtX float not null default 128; +ALTER TABLE useragents add currentLookAtY float not null default 128; +ALTER TABLE useragents add currentLookAtZ float not null default 70; + +COMMIT; + +:VERSION 8 + +BEGIN TRANSACTION; + +ALTER TABLE users add email varchar(250); + +COMMIT; + +:VERSION 9 + +BEGIN; + +update users + set UUID = substr(UUID, 1, 8) || "-" || substr(UUID, 9, 4) || "-" || substr(UUID, 13, 4) || "-" || substr(UUID, 17, 4) || "-" || substr(UUID, 21, 12) + where UUID not like '%-%'; + +update useragents + set UUID = substr(UUID, 1, 8) || "-" || substr(UUID, 9, 4) || "-" || substr(UUID, 13, 4) || "-" || substr(UUID, 17, 4) || "-" || substr(UUID, 21, 12) + where UUID not like '%-%'; + +COMMIT; + +:VERSION 10 + +BEGIN TRANSACTION; + +CREATE TABLE IF NOT EXISTS avatarappearance( + Owner varchar(36) NOT NULL primary key, + BodyItem varchar(36) DEFAULT NULL, + BodyAsset varchar(36) DEFAULT NULL, + SkinItem varchar(36) DEFAULT NULL, + SkinAsset varchar(36) DEFAULT NULL, + HairItem varchar(36) DEFAULT NULL, + HairAsset varchar(36) DEFAULT NULL, + EyesItem varchar(36) DEFAULT NULL, + EyesAsset varchar(36) DEFAULT NULL, + ShirtItem varchar(36) DEFAULT NULL, + ShirtAsset varchar(36) DEFAULT NULL, + PantsItem varchar(36) DEFAULT NULL, + PantsAsset varchar(36) DEFAULT NULL, + ShoesItem varchar(36) DEFAULT NULL, + ShoesAsset varchar(36) DEFAULT NULL, + SocksItem varchar(36) DEFAULT NULL, + SocksAsset varchar(36) DEFAULT NULL, + JacketItem varchar(36) DEFAULT NULL, + JacketAsset varchar(36) DEFAULT NULL, + GlovesItem varchar(36) DEFAULT NULL, + GlovesAsset varchar(36) DEFAULT NULL, + UnderShirtItem varchar(36) DEFAULT NULL, + UnderShirtAsset varchar(36) DEFAULT NULL, + UnderPantsItem varchar(36) DEFAULT NULL, + UnderPantsAsset varchar(36) DEFAULT NULL, + SkirtItem varchar(36) DEFAULT NULL, + SkirtAsset varchar(36) DEFAULT NULL, + Texture blob, + VisualParams blob, + Serial int DEFAULT NULL, + AvatarHeight float DEFAULT NULL +); + +COMMIT; From 020f38774fbe8e0f53b0cb28ab49b378b9dcd325 Mon Sep 17 00:00:00 2001 From: AlexRa Date: Thu, 6 May 2010 23:16:36 +0300 Subject: [PATCH 18/46] MS SQL migrations converted to the new format --- .../Data/MSSQL/Resources/001_AssetStore.sql | 13 - .../Data/MSSQL/Resources/001_EstateStore.sql | 85 -- .../Data/MSSQL/Resources/001_GridStore.sql | 37 - .../MSSQL/Resources/001_InventoryStore.sql | 64 -- .../Data/MSSQL/Resources/001_RegionStore.sql | 161 --- .../Data/MSSQL/Resources/001_UserAccount.sql | 14 - .../Data/MSSQL/Resources/001_UserStore.sql | 112 --- .../Data/MSSQL/Resources/002_AssetStore.sql | 29 - .../Data/MSSQL/Resources/002_AuthStore.sql | 6 - .../Data/MSSQL/Resources/002_EstateStore.sql | 25 - .../Data/MSSQL/Resources/002_FriendsStore.sql | 6 - .../Data/MSSQL/Resources/002_GridStore.sql | 49 - .../MSSQL/Resources/002_InventoryStore.sql | 5 - .../Data/MSSQL/Resources/002_RegionStore.sql | 50 - .../Data/MSSQL/Resources/002_UserAccount.sql | 12 - .../Data/MSSQL/Resources/002_UserStore.sql | 9 - .../Data/MSSQL/Resources/003_AssetStore.sql | 6 - .../Data/MSSQL/Resources/003_EstateStore.sql | 25 - .../Data/MSSQL/Resources/003_GridStore.sql | 22 - .../MSSQL/Resources/003_InventoryStore.sql | 38 - .../Data/MSSQL/Resources/003_RegionStore.sql | 67 -- .../Data/MSSQL/Resources/003_UserAccount.sql | 9 - .../Data/MSSQL/Resources/003_UserStore.sql | 15 - .../Data/MSSQL/Resources/004_AssetStore.sql | 31 - .../Data/MSSQL/Resources/004_EstateStore.sql | 22 - .../Data/MSSQL/Resources/004_GridStore.sql | 68 -- .../MSSQL/Resources/004_InventoryStore.sql | 52 - .../Data/MSSQL/Resources/004_RegionStore.sql | 40 - .../Data/MSSQL/Resources/004_UserAccount.sql | 7 - .../Data/MSSQL/Resources/004_UserStore.sql | 29 - .../Data/MSSQL/Resources/005_AssetStore.sql | 1 - .../Data/MSSQL/Resources/005_EstateStore.sql | 22 - .../Data/MSSQL/Resources/005_GridStore.sql | 5 - .../Data/MSSQL/Resources/005_RegionStore.sql | 49 - .../Data/MSSQL/Resources/005_UserStore.sql | 5 - .../Data/MSSQL/Resources/006_EstateStore.sql | 22 - .../Data/MSSQL/Resources/006_GridStore.sql | 8 - .../Data/MSSQL/Resources/006_RegionStore.sql | 36 - .../Data/MSSQL/Resources/006_UserStore.sql | 57 -- .../Data/MSSQL/Resources/007_EstateStore.sql | 25 - .../Data/MSSQL/Resources/007_GridStore.sql | 9 - .../Data/MSSQL/Resources/007_RegionStore.sql | 10 - .../Data/MSSQL/Resources/007_UserStore.sql | 42 - .../Data/MSSQL/Resources/008_EstateStore.sql | 49 - .../Data/MSSQL/Resources/008_RegionStore.sql | 7 - .../Data/MSSQL/Resources/008_UserStore.sql | 29 - .../Data/MSSQL/Resources/009_EstateStore.sql | 24 - .../Data/MSSQL/Resources/009_RegionStore.sql | 5 - .../Data/MSSQL/Resources/009_UserStore.sql | 53 - .../Data/MSSQL/Resources/010_RegionStore.sql | 7 - .../Data/MSSQL/Resources/010_UserStore.sql | 24 - .../Data/MSSQL/Resources/011_RegionStore.sql | 6 - .../Data/MSSQL/Resources/011_UserStore.sql | 5 - .../Data/MSSQL/Resources/012_RegionStore.sql | 5 - .../Data/MSSQL/Resources/013_RegionStore.sql | 112 --- .../Data/MSSQL/Resources/014_RegionStore.sql | 49 - .../Data/MSSQL/Resources/015_RegionStore.sql | 45 - .../Data/MSSQL/Resources/016_RegionStore.sql | 19 - .../Data/MSSQL/Resources/017_RegionStore.sql | 56 -- .../Data/MSSQL/Resources/018_RegionStore.sql | 18 - .../Data/MSSQL/Resources/019_RegionStore.sql | 19 - .../Data/MSSQL/Resources/020_RegionStore.sql | 58 -- .../Data/MSSQL/Resources/021_RegionStore.sql | 5 - .../Data/MSSQL/Resources/022_RegionStore.sql | 7 - .../Data/MSSQL/Resources/023_RegionStore.sql | 7 - .../MSSQL/Resources/AssetStore.migrations | 100 ++ ...001_AuthStore.sql => AuthStore.migrations} | 11 + .../{001_Avatar.sql => Avatar.migrations} | 2 + .../MSSQL/Resources/EstateStore.migrations | 334 +++++++ ...iendsStore.sql => FriendsStore.migrations} | 9 + .../Data/MSSQL/Resources/GridStore.migrations | 225 +++++ .../MSSQL/Resources/InventoryStore.migrations | 174 ++++ .../{001_LogStore.sql => LogStore.migrations} | 2 + .../{001_Presence.sql => Presence.migrations} | 11 + .../MSSQL/Resources/RegionStore.migrations | 929 ++++++++++++++++++ .../MSSQL/Resources/UserAccount.migrations | 55 ++ .../Data/MSSQL/Resources/UserStore.migrations | 421 ++++++++ 77 files changed, 2273 insertions(+), 2008 deletions(-) delete mode 100644 OpenSim/Data/MSSQL/Resources/001_AssetStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/001_EstateStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/001_GridStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/001_InventoryStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/001_RegionStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/001_UserAccount.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/001_UserStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/002_AssetStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/002_AuthStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/002_EstateStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/002_FriendsStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/002_GridStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/002_InventoryStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/002_RegionStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/002_UserAccount.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/002_UserStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/003_AssetStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/003_EstateStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/003_GridStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/003_InventoryStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/003_RegionStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/003_UserAccount.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/003_UserStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/004_AssetStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/004_EstateStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/004_GridStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/004_InventoryStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/004_RegionStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/004_UserAccount.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/004_UserStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/005_AssetStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/005_EstateStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/005_GridStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/005_RegionStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/005_UserStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/006_EstateStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/006_GridStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/006_RegionStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/006_UserStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/007_EstateStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/007_GridStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/007_RegionStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/007_UserStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/008_EstateStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/008_RegionStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/008_UserStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/009_EstateStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/009_RegionStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/009_UserStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/010_RegionStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/010_UserStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/011_RegionStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/011_UserStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/012_RegionStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/013_RegionStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/014_RegionStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/015_RegionStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/016_RegionStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/017_RegionStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/018_RegionStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/019_RegionStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/020_RegionStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/021_RegionStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/022_RegionStore.sql delete mode 100644 OpenSim/Data/MSSQL/Resources/023_RegionStore.sql create mode 100644 OpenSim/Data/MSSQL/Resources/AssetStore.migrations rename OpenSim/Data/MSSQL/Resources/{001_AuthStore.sql => AuthStore.migrations} (63%) rename OpenSim/Data/MSSQL/Resources/{001_Avatar.sql => Avatar.migrations} (94%) create mode 100644 OpenSim/Data/MSSQL/Resources/EstateStore.migrations rename OpenSim/Data/MSSQL/Resources/{001_FriendsStore.sql => FriendsStore.migrations} (54%) create mode 100644 OpenSim/Data/MSSQL/Resources/GridStore.migrations create mode 100644 OpenSim/Data/MSSQL/Resources/InventoryStore.migrations rename OpenSim/Data/MSSQL/Resources/{001_LogStore.sql => LogStore.migrations} (96%) rename OpenSim/Data/MSSQL/Resources/{001_Presence.sql => Presence.migrations} (81%) create mode 100644 OpenSim/Data/MSSQL/Resources/RegionStore.migrations create mode 100644 OpenSim/Data/MSSQL/Resources/UserAccount.migrations create mode 100644 OpenSim/Data/MSSQL/Resources/UserStore.migrations diff --git a/OpenSim/Data/MSSQL/Resources/001_AssetStore.sql b/OpenSim/Data/MSSQL/Resources/001_AssetStore.sql deleted file mode 100644 index 2b293c7636..0000000000 --- a/OpenSim/Data/MSSQL/Resources/001_AssetStore.sql +++ /dev/null @@ -1,13 +0,0 @@ -CREATE TABLE [assets] ( - [id] [varchar](36) NOT NULL, - [name] [varchar](64) NOT NULL, - [description] [varchar](64) NOT NULL, - [assetType] [tinyint] NOT NULL, - [local] [tinyint] NOT NULL, - [temporary] [tinyint] NOT NULL, - [data] [image] NOT NULL, -PRIMARY KEY CLUSTERED -( - [id] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] -) ON [PRIMARY] diff --git a/OpenSim/Data/MSSQL/Resources/001_EstateStore.sql b/OpenSim/Data/MSSQL/Resources/001_EstateStore.sql deleted file mode 100644 index 9bb2f75965..0000000000 --- a/OpenSim/Data/MSSQL/Resources/001_EstateStore.sql +++ /dev/null @@ -1,85 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE [dbo].[estate_managers]( - [EstateID] [int] NOT NULL, - [uuid] [varchar](36) NOT NULL, - CONSTRAINT [PK_estate_managers] PRIMARY KEY CLUSTERED -( - [EstateID] ASC -)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] -) ON [PRIMARY]; - -CREATE TABLE [dbo].[estate_groups]( - [EstateID] [int] NOT NULL, - [uuid] [varchar](36) NOT NULL, - CONSTRAINT [PK_estate_groups] PRIMARY KEY CLUSTERED -( - [EstateID] ASC -)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] -) ON [PRIMARY]; - - -CREATE TABLE [dbo].[estate_users]( - [EstateID] [int] NOT NULL, - [uuid] [varchar](36) NOT NULL, - CONSTRAINT [PK_estate_users] PRIMARY KEY CLUSTERED -( - [EstateID] ASC -)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] -) ON [PRIMARY]; - - -CREATE TABLE [dbo].[estateban]( - [EstateID] [int] NOT NULL, - [bannedUUID] [varchar](36) NOT NULL, - [bannedIp] [varchar](16) NOT NULL, - [bannedIpHostMask] [varchar](16) NOT NULL, - [bannedNameMask] [varchar](64) NULL DEFAULT (NULL), - CONSTRAINT [PK_estateban] PRIMARY KEY CLUSTERED -( - [EstateID] ASC -)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] -) ON [PRIMARY]; - -CREATE TABLE [dbo].[estate_settings]( - [EstateID] [int] IDENTITY(1,100) NOT NULL, - [EstateName] [varchar](64) NULL DEFAULT (NULL), - [AbuseEmailToEstateOwner] [bit] NOT NULL, - [DenyAnonymous] [bit] NOT NULL, - [ResetHomeOnTeleport] [bit] NOT NULL, - [FixedSun] [bit] NOT NULL, - [DenyTransacted] [bit] NOT NULL, - [BlockDwell] [bit] NOT NULL, - [DenyIdentified] [bit] NOT NULL, - [AllowVoice] [bit] NOT NULL, - [UseGlobalTime] [bit] NOT NULL, - [PricePerMeter] [int] NOT NULL, - [TaxFree] [bit] NOT NULL, - [AllowDirectTeleport] [bit] NOT NULL, - [RedirectGridX] [int] NOT NULL, - [RedirectGridY] [int] NOT NULL, - [ParentEstateID] [int] NOT NULL, - [SunPosition] [float] NOT NULL, - [EstateSkipScripts] [bit] NOT NULL, - [BillableFactor] [float] NOT NULL, - [PublicAccess] [bit] NOT NULL, - [AbuseEmail] [varchar](255) NOT NULL, - [EstateOwner] [varchar](36) NOT NULL, - [DenyMinors] [bit] NOT NULL, - CONSTRAINT [PK_estate_settings] PRIMARY KEY CLUSTERED -( - [EstateID] ASC -)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] -) ON [PRIMARY]; - - -CREATE TABLE [dbo].[estate_map]( - [RegionID] [varchar](36) NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'), - [EstateID] [int] NOT NULL, - CONSTRAINT [PK_estate_map] PRIMARY KEY CLUSTERED -( - [RegionID] ASC -)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] -) ON [PRIMARY]; - -COMMIT \ No newline at end of file diff --git a/OpenSim/Data/MSSQL/Resources/001_GridStore.sql b/OpenSim/Data/MSSQL/Resources/001_GridStore.sql deleted file mode 100644 index ff15f54c07..0000000000 --- a/OpenSim/Data/MSSQL/Resources/001_GridStore.sql +++ /dev/null @@ -1,37 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE [dbo].[regions]( - [regionHandle] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [regionName] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [uuid] [varchar](255) COLLATE Latin1_General_CI_AS NOT NULL, - [regionRecvKey] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [regionSecret] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [regionSendKey] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [regionDataURI] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [serverIP] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [serverPort] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [serverURI] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [locX] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [locY] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [locZ] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [eastOverrideHandle] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [westOverrideHandle] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [southOverrideHandle] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [northOverrideHandle] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [regionAssetURI] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [regionAssetRecvKey] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [regionAssetSendKey] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [regionUserURI] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [regionUserRecvKey] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [regionUserSendKey] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [regionMapTexture] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [serverHttpPort] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [serverRemotingPort] [varchar](255) COLLATE Latin1_General_CI_AS NULL, - [owner_uuid] [varchar](36) COLLATE Latin1_General_CI_AS NULL, -PRIMARY KEY CLUSTERED -( - [uuid] ASC -)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] -) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/001_InventoryStore.sql b/OpenSim/Data/MSSQL/Resources/001_InventoryStore.sql deleted file mode 100644 index 836d2d1e2b..0000000000 --- a/OpenSim/Data/MSSQL/Resources/001_InventoryStore.sql +++ /dev/null @@ -1,64 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE [inventoryfolders] ( - [folderID] [varchar](36) NOT NULL default '', - [agentID] [varchar](36) default NULL, - [parentFolderID] [varchar](36) default NULL, - [folderName] [varchar](64) default NULL, - [type] [smallint] NOT NULL default 0, - [version] [int] NOT NULL default 0, - PRIMARY KEY CLUSTERED -( - [folderID] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] -) ON [PRIMARY] - -CREATE NONCLUSTERED INDEX [owner] ON [inventoryfolders] -( - [agentID] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -CREATE NONCLUSTERED INDEX [parent] ON [inventoryfolders] -( - [parentFolderID] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - - -CREATE TABLE [inventoryitems] ( - [inventoryID] [varchar](36) NOT NULL default '', - [assetID] [varchar](36) default NULL, - [assetType] [int] default NULL, - [parentFolderID] [varchar](36) default NULL, - [avatarID] [varchar](36) default NULL, - [inventoryName] [varchar](64) default NULL, - [inventoryDescription] [varchar](128) default NULL, - [inventoryNextPermissions] [int] default NULL, - [inventoryCurrentPermissions] [int] default NULL, - [invType] [int] default NULL, - [creatorID] [varchar](36) default NULL, - [inventoryBasePermissions] [int] NOT NULL default 0, - [inventoryEveryOnePermissions] [int] NOT NULL default 0, - [salePrice] [int] default NULL, - [saleType] [tinyint] default NULL, - [creationDate] [int] default NULL, - [groupID] [varchar](36) default NULL, - [groupOwned] [bit] default NULL, - [flags] [int] default NULL, - PRIMARY KEY CLUSTERED -( - [inventoryID] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] -) ON [PRIMARY] - - -CREATE NONCLUSTERED INDEX [owner] ON [inventoryitems] -( - [avatarID] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -CREATE NONCLUSTERED INDEX [folder] ON [inventoryitems] -( - [parentFolderID] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/001_RegionStore.sql b/OpenSim/Data/MSSQL/Resources/001_RegionStore.sql deleted file mode 100644 index fe7c58f8ed..0000000000 --- a/OpenSim/Data/MSSQL/Resources/001_RegionStore.sql +++ /dev/null @@ -1,161 +0,0 @@ -CREATE TABLE [dbo].[prims]( - [UUID] [varchar](255) NOT NULL, - [RegionUUID] [varchar](255) NULL, - [ParentID] [int] NULL, - [CreationDate] [int] NULL, - [Name] [varchar](255) NULL, - [SceneGroupID] [varchar](255) NULL, - [Text] [varchar](255) NULL, - [Description] [varchar](255) NULL, - [SitName] [varchar](255) NULL, - [TouchName] [varchar](255) NULL, - [ObjectFlags] [int] NULL, - [CreatorID] [varchar](255) NULL, - [OwnerID] [varchar](255) NULL, - [GroupID] [varchar](255) NULL, - [LastOwnerID] [varchar](255) NULL, - [OwnerMask] [int] NULL, - [NextOwnerMask] [int] NULL, - [GroupMask] [int] NULL, - [EveryoneMask] [int] NULL, - [BaseMask] [int] NULL, - [PositionX] [float] NULL, - [PositionY] [float] NULL, - [PositionZ] [float] NULL, - [GroupPositionX] [float] NULL, - [GroupPositionY] [float] NULL, - [GroupPositionZ] [float] NULL, - [VelocityX] [float] NULL, - [VelocityY] [float] NULL, - [VelocityZ] [float] NULL, - [AngularVelocityX] [float] NULL, - [AngularVelocityY] [float] NULL, - [AngularVelocityZ] [float] NULL, - [AccelerationX] [float] NULL, - [AccelerationY] [float] NULL, - [AccelerationZ] [float] NULL, - [RotationX] [float] NULL, - [RotationY] [float] NULL, - [RotationZ] [float] NULL, - [RotationW] [float] NULL, - [SitTargetOffsetX] [float] NULL, - [SitTargetOffsetY] [float] NULL, - [SitTargetOffsetZ] [float] NULL, - [SitTargetOrientW] [float] NULL, - [SitTargetOrientX] [float] NULL, - [SitTargetOrientY] [float] NULL, - [SitTargetOrientZ] [float] NULL, -PRIMARY KEY CLUSTERED -( - [UUID] ASC -)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] -) ON [PRIMARY] - -CREATE TABLE [dbo].[primshapes]( - [UUID] [varchar](255) NOT NULL, - [Shape] [int] NULL, - [ScaleX] [float] NULL, - [ScaleY] [float] NULL, - [ScaleZ] [float] NULL, - [PCode] [int] NULL, - [PathBegin] [int] NULL, - [PathEnd] [int] NULL, - [PathScaleX] [int] NULL, - [PathScaleY] [int] NULL, - [PathShearX] [int] NULL, - [PathShearY] [int] NULL, - [PathSkew] [int] NULL, - [PathCurve] [int] NULL, - [PathRadiusOffset] [int] NULL, - [PathRevolutions] [int] NULL, - [PathTaperX] [int] NULL, - [PathTaperY] [int] NULL, - [PathTwist] [int] NULL, - [PathTwistBegin] [int] NULL, - [ProfileBegin] [int] NULL, - [ProfileEnd] [int] NULL, - [ProfileCurve] [int] NULL, - [ProfileHollow] [int] NULL, - [State] [int] NULL, - [Texture] [image] NULL, - [ExtraParams] [image] NULL, -PRIMARY KEY CLUSTERED -( - [UUID] ASC -)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] -) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] - -CREATE TABLE [dbo].[primitems]( - [itemID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, - [primID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, - [assetID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, - [parentFolderID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, - [invType] [int] NULL, - [assetType] [int] NULL, - [name] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, - [description] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, - [creationDate] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, - [creatorID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, - [ownerID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, - [lastOwnerID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, - [groupID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, - [nextPermissions] [int] NULL, - [currentPermissions] [int] NULL, - [basePermissions] [int] NULL, - [everyonePermissions] [int] NULL, - [groupPermissions] [int] NULL, -PRIMARY KEY CLUSTERED -( - [itemID] ASC -)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] -) ON [PRIMARY] - -CREATE TABLE [dbo].[terrain]( - [RegionUUID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, - [Revision] [int] NULL, - [Heightfield] [image] NULL -) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] - -CREATE TABLE [dbo].[land]( - [UUID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, - [RegionUUID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, - [LocalLandID] [int] NULL, - [Bitmap] [image] NULL, - [Name] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, - [Description] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, - [OwnerUUID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, - [IsGroupOwned] [int] NULL, - [Area] [int] NULL, - [AuctionID] [int] NULL, - [Category] [int] NULL, - [ClaimDate] [int] NULL, - [ClaimPrice] [int] NULL, - [GroupUUID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, - [SalePrice] [int] NULL, - [LandStatus] [int] NULL, - [LandFlags] [int] NULL, - [LandingType] [int] NULL, - [MediaAutoScale] [int] NULL, - [MediaTextureUUID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, - [MediaURL] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, - [MusicURL] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, - [PassHours] [float] NULL, - [PassPrice] [int] NULL, - [SnapshotUUID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, - [UserLocationX] [float] NULL, - [UserLocationY] [float] NULL, - [UserLocationZ] [float] NULL, - [UserLookAtX] [float] NULL, - [UserLookAtY] [float] NULL, - [UserLookAtZ] [float] NULL, -PRIMARY KEY CLUSTERED -( - [UUID] ASC -)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] -) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] - -CREATE TABLE [dbo].[landaccesslist]( - [LandUUID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, - [AccessUUID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, - [Flags] [int] NULL -) ON [PRIMARY] \ No newline at end of file diff --git a/OpenSim/Data/MSSQL/Resources/001_UserAccount.sql b/OpenSim/Data/MSSQL/Resources/001_UserAccount.sql deleted file mode 100644 index 3dbf8a4925..0000000000 --- a/OpenSim/Data/MSSQL/Resources/001_UserAccount.sql +++ /dev/null @@ -1,14 +0,0 @@ -CREATE TABLE [UserAccounts] ( - [PrincipalID] uniqueidentifier NOT NULL, - [ScopeID] uniqueidentifier NOT NULL, - [FirstName] [varchar](64) NOT NULL, - [LastName] [varchar](64) NOT NULL, - [Email] [varchar](64) NULL, - [ServiceURLs] [text] NULL, - [Created] [int] default NULL, - - PRIMARY KEY CLUSTERED -( - [PrincipalID] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] -) ON [PRIMARY] diff --git a/OpenSim/Data/MSSQL/Resources/001_UserStore.sql b/OpenSim/Data/MSSQL/Resources/001_UserStore.sql deleted file mode 100644 index 160c457dad..0000000000 --- a/OpenSim/Data/MSSQL/Resources/001_UserStore.sql +++ /dev/null @@ -1,112 +0,0 @@ -CREATE TABLE [users] ( - [UUID] [varchar](36) NOT NULL default '', - [username] [varchar](32) NOT NULL, - [lastname] [varchar](32) NOT NULL, - [passwordHash] [varchar](32) NOT NULL, - [passwordSalt] [varchar](32) NOT NULL, - [homeRegion] [bigint] default NULL, - [homeLocationX] [float] default NULL, - [homeLocationY] [float] default NULL, - [homeLocationZ] [float] default NULL, - [homeLookAtX] [float] default NULL, - [homeLookAtY] [float] default NULL, - [homeLookAtZ] [float] default NULL, - [created] [int] NOT NULL, - [lastLogin] [int] NOT NULL, - [userInventoryURI] [varchar](255) default NULL, - [userAssetURI] [varchar](255) default NULL, - [profileCanDoMask] [int] default NULL, - [profileWantDoMask] [int] default NULL, - [profileAboutText] [ntext], - [profileFirstText] [ntext], - [profileImage] [varchar](36) default NULL, - [profileFirstImage] [varchar](36) default NULL, - [webLoginKey] [varchar](36) default NULL, - PRIMARY KEY CLUSTERED -( - [UUID] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] -) ON [PRIMARY] - - -CREATE NONCLUSTERED INDEX [usernames] ON [users] -( - [username] ASC, - [lastname] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - - -CREATE TABLE [agents] ( - [UUID] [varchar](36) NOT NULL, - [sessionID] [varchar](36) NOT NULL, - [secureSessionID] [varchar](36) NOT NULL, - [agentIP] [varchar](16) NOT NULL, - [agentPort] [int] NOT NULL, - [agentOnline] [tinyint] NOT NULL, - [loginTime] [int] NOT NULL, - [logoutTime] [int] NOT NULL, - [currentRegion] [varchar](36) NOT NULL, - [currentHandle] [bigint] NOT NULL, - [currentPos] [varchar](64) NOT NULL, - PRIMARY KEY CLUSTERED -( - [UUID] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] -) ON [PRIMARY] - - -CREATE NONCLUSTERED INDEX [session] ON [agents] -( - [sessionID] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -CREATE NONCLUSTERED INDEX [ssession] ON [agents] -( - [secureSessionID] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - - -CREATE TABLE [dbo].[userfriends]( - [ownerID] [varchar](50) COLLATE Latin1_General_CI_AS NOT NULL, - [friendID] [varchar](50) COLLATE Latin1_General_CI_AS NOT NULL, - [friendPerms] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, - [datetimestamp] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL -) ON [PRIMARY] - -CREATE TABLE [avatarappearance] ( - [Owner] [varchar](36) NOT NULL, - [Serial] int NOT NULL, - [Visual_Params] [image] NOT NULL, - [Texture] [image] NOT NULL, - [Avatar_Height] float NOT NULL, - [Body_Item] [varchar](36) NOT NULL, - [Body_Asset] [varchar](36) NOT NULL, - [Skin_Item] [varchar](36) NOT NULL, - [Skin_Asset] [varchar](36) NOT NULL, - [Hair_Item] [varchar](36) NOT NULL, - [Hair_Asset] [varchar](36) NOT NULL, - [Eyes_Item] [varchar](36) NOT NULL, - [Eyes_Asset] [varchar](36) NOT NULL, - [Shirt_Item] [varchar](36) NOT NULL, - [Shirt_Asset] [varchar](36) NOT NULL, - [Pants_Item] [varchar](36) NOT NULL, - [Pants_Asset] [varchar](36) NOT NULL, - [Shoes_Item] [varchar](36) NOT NULL, - [Shoes_Asset] [varchar](36) NOT NULL, - [Socks_Item] [varchar](36) NOT NULL, - [Socks_Asset] [varchar](36) NOT NULL, - [Jacket_Item] [varchar](36) NOT NULL, - [Jacket_Asset] [varchar](36) NOT NULL, - [Gloves_Item] [varchar](36) NOT NULL, - [Gloves_Asset] [varchar](36) NOT NULL, - [Undershirt_Item] [varchar](36) NOT NULL, - [Undershirt_Asset] [varchar](36) NOT NULL, - [Underpants_Item] [varchar](36) NOT NULL, - [Underpants_Asset] [varchar](36) NOT NULL, - [Skirt_Item] [varchar](36) NOT NULL, - [Skirt_Asset] [varchar](36) NOT NULL, - - PRIMARY KEY CLUSTERED ( - [Owner] - ) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] -) ON [PRIMARY] diff --git a/OpenSim/Data/MSSQL/Resources/002_AssetStore.sql b/OpenSim/Data/MSSQL/Resources/002_AssetStore.sql deleted file mode 100644 index 3e245432bf..0000000000 --- a/OpenSim/Data/MSSQL/Resources/002_AssetStore.sql +++ /dev/null @@ -1,29 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE Tmp_assets - ( - id varchar(36) NOT NULL, - name varchar(64) NOT NULL, - description varchar(64) NOT NULL, - assetType tinyint NOT NULL, - local bit NOT NULL, - temporary bit NOT NULL, - data image NOT NULL - ) ON [PRIMARY] - TEXTIMAGE_ON [PRIMARY] - -IF EXISTS(SELECT * FROM assets) - EXEC('INSERT INTO Tmp_assets (id, name, description, assetType, local, temporary, data) - SELECT id, name, description, assetType, CONVERT(bit, local), CONVERT(bit, temporary), data FROM assets WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE assets - -EXECUTE sp_rename N'Tmp_assets', N'assets', 'OBJECT' - -ALTER TABLE dbo.assets ADD CONSTRAINT - PK__assets__id PRIMARY KEY CLUSTERED - ( - id - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/002_AuthStore.sql b/OpenSim/Data/MSSQL/Resources/002_AuthStore.sql deleted file mode 100644 index daed955932..0000000000 --- a/OpenSim/Data/MSSQL/Resources/002_AuthStore.sql +++ /dev/null @@ -1,6 +0,0 @@ -BEGIN TRANSACTION - -INSERT INTO auth (UUID, passwordHash, passwordSalt, webLoginKey, accountType) SELECT [UUID] AS UUID, [passwordHash] AS passwordHash, [passwordSalt] AS passwordSalt, [webLoginKey] AS webLoginKey, 'UserAccount' as [accountType] FROM users; - - -COMMIT \ No newline at end of file diff --git a/OpenSim/Data/MSSQL/Resources/002_EstateStore.sql b/OpenSim/Data/MSSQL/Resources/002_EstateStore.sql deleted file mode 100644 index 18c12c097c..0000000000 --- a/OpenSim/Data/MSSQL/Resources/002_EstateStore.sql +++ /dev/null @@ -1,25 +0,0 @@ -BEGIN TRANSACTION - -ALTER TABLE dbo.estate_managers DROP CONSTRAINT PK_estate_managers - -CREATE NONCLUSTERED INDEX IX_estate_managers ON dbo.estate_managers - ( - EstateID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -ALTER TABLE dbo.estate_groups DROP CONSTRAINT PK_estate_groups - -CREATE NONCLUSTERED INDEX IX_estate_groups ON dbo.estate_groups - ( - EstateID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - - -ALTER TABLE dbo.estate_users DROP CONSTRAINT PK_estate_users - -CREATE NONCLUSTERED INDEX IX_estate_users ON dbo.estate_users - ( - EstateID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/002_FriendsStore.sql b/OpenSim/Data/MSSQL/Resources/002_FriendsStore.sql deleted file mode 100644 index e67d20e4b7..0000000000 --- a/OpenSim/Data/MSSQL/Resources/002_FriendsStore.sql +++ /dev/null @@ -1,6 +0,0 @@ -BEGIN TRANSACTION - -INSERT INTO Friends (PrincipalID, Friend, Flags, Offered) SELECT [ownerID], [friendID], [friendPerms], 0 FROM userfriends; - - -COMMIT \ No newline at end of file diff --git a/OpenSim/Data/MSSQL/Resources/002_GridStore.sql b/OpenSim/Data/MSSQL/Resources/002_GridStore.sql deleted file mode 100644 index f5901cb527..0000000000 --- a/OpenSim/Data/MSSQL/Resources/002_GridStore.sql +++ /dev/null @@ -1,49 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE Tmp_regions - ( - uuid varchar(36) COLLATE Latin1_General_CI_AS NOT NULL, - regionHandle bigint NULL, - regionName varchar(20) NULL, - regionRecvKey varchar(128) NULL, - regionSendKey varchar(128) NULL, - regionSecret varchar(128) NULL, - regionDataURI varchar(128) NULL, - serverIP varchar(64) NULL, - serverPort int NULL, - serverURI varchar(255) NULL, - locX int NULL, - locY int NULL, - locZ int NULL, - eastOverrideHandle bigint NULL, - westOverrideHandle bigint NULL, - southOverrideHandle bigint NULL, - northOverrideHandle bigint NULL, - regionAssetURI varchar(255) NULL, - regionAssetRecvKey varchar(128) NULL, - regionAssetSendKey varchar(128) NULL, - regionUserURI varchar(255) NULL, - regionUserRecvKey varchar(128) NULL, - regionUserSendKey varchar(128) NULL, - regionMapTexture varchar(36) NULL, - serverHttpPort int NULL, - serverRemotingPort int NULL, - owner_uuid varchar(36) NULL, - originUUID varchar(36) NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000') - ) ON [PRIMARY] - -IF EXISTS(SELECT * FROM regions) - EXEC('INSERT INTO Tmp_regions (uuid, regionHandle, regionName, regionRecvKey, regionSendKey, regionSecret, regionDataURI, serverIP, serverPort, serverURI, locX, locY, locZ, eastOverrideHandle, westOverrideHandle, southOverrideHandle, northOverrideHandle, regionAssetURI, regionAssetRecvKey, regionAssetSendKey, regionUserURI, regionUserRecvKey, regionUserSendKey, regionMapTexture, serverHttpPort, serverRemotingPort, owner_uuid) - SELECT CONVERT(varchar(36), uuid), CONVERT(bigint, regionHandle), CONVERT(varchar(20), regionName), CONVERT(varchar(128), regionRecvKey), CONVERT(varchar(128), regionSendKey), CONVERT(varchar(128), regionSecret), CONVERT(varchar(128), regionDataURI), CONVERT(varchar(64), serverIP), CONVERT(int, serverPort), serverURI, CONVERT(int, locX), CONVERT(int, locY), CONVERT(int, locZ), CONVERT(bigint, eastOverrideHandle), CONVERT(bigint, westOverrideHandle), CONVERT(bigint, southOverrideHandle), CONVERT(bigint, northOverrideHandle), regionAssetURI, CONVERT(varchar(128), regionAssetRecvKey), CONVERT(varchar(128), regionAssetSendKey), regionUserURI, CONVERT(varchar(128), regionUserRecvKey), CONVERT(varchar(128), regionUserSendKey), CONVERT(varchar(36), regionMapTexture), CONVERT(int, serverHttpPort), CONVERT(int, serverRemotingPort), owner_uuid FROM regions') - -DROP TABLE regions - -EXECUTE sp_rename N'Tmp_regions', N'regions', 'OBJECT' - -ALTER TABLE regions ADD CONSTRAINT - PK__regions__uuid PRIMARY KEY CLUSTERED - ( - uuid - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT \ No newline at end of file diff --git a/OpenSim/Data/MSSQL/Resources/002_InventoryStore.sql b/OpenSim/Data/MSSQL/Resources/002_InventoryStore.sql deleted file mode 100644 index bcc26b88c8..0000000000 --- a/OpenSim/Data/MSSQL/Resources/002_InventoryStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN TRANSACTION - -ALTER TABLE inventoryitems ADD inventoryGroupPermissions INTEGER NOT NULL default 0 - -COMMIT \ No newline at end of file diff --git a/OpenSim/Data/MSSQL/Resources/002_RegionStore.sql b/OpenSim/Data/MSSQL/Resources/002_RegionStore.sql deleted file mode 100644 index 1801035206..0000000000 --- a/OpenSim/Data/MSSQL/Resources/002_RegionStore.sql +++ /dev/null @@ -1,50 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE regionban ( - [regionUUID] VARCHAR(36) NOT NULL, - [bannedUUID] VARCHAR(36) NOT NULL, - [bannedIp] VARCHAR(16) NOT NULL, - [bannedIpHostMask] VARCHAR(16) NOT NULL) - -create table [dbo].[regionsettings] ( - [regionUUID] [varchar](36) not null, - [block_terraform] [bit] not null, - [block_fly] [bit] not null, - [allow_damage] [bit] not null, - [restrict_pushing] [bit] not null, - [allow_land_resell] [bit] not null, - [allow_land_join_divide] [bit] not null, - [block_show_in_search] [bit] not null, - [agent_limit] [int] not null, - [object_bonus] [float] not null, - [maturity] [int] not null, - [disable_scripts] [bit] not null, - [disable_collisions] [bit] not null, - [disable_physics] [bit] not null, - [terrain_texture_1] [varchar](36) not null, - [terrain_texture_2] [varchar](36) not null, - [terrain_texture_3] [varchar](36) not null, - [terrain_texture_4] [varchar](36) not null, - [elevation_1_nw] [float] not null, - [elevation_2_nw] [float] not null, - [elevation_1_ne] [float] not null, - [elevation_2_ne] [float] not null, - [elevation_1_se] [float] not null, - [elevation_2_se] [float] not null, - [elevation_1_sw] [float] not null, - [elevation_2_sw] [float] not null, - [water_height] [float] not null, - [terrain_raise_limit] [float] not null, - [terrain_lower_limit] [float] not null, - [use_estate_sun] [bit] not null, - [fixed_sun] [bit] not null, - [sun_position] [float] not null, - [covenant] [varchar](36) default NULL, - [Sandbox] [bit] NOT NULL, -PRIMARY KEY CLUSTERED -( - [regionUUID] ASC -)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] -) ON [PRIMARY] - -COMMIT \ No newline at end of file diff --git a/OpenSim/Data/MSSQL/Resources/002_UserAccount.sql b/OpenSim/Data/MSSQL/Resources/002_UserAccount.sql deleted file mode 100644 index 89d1f3495a..0000000000 --- a/OpenSim/Data/MSSQL/Resources/002_UserAccount.sql +++ /dev/null @@ -1,12 +0,0 @@ -BEGIN TRANSACTION - -INSERT INTO UserAccounts (PrincipalID, ScopeID, FirstName, LastName, Email, ServiceURLs, Created) SELECT [UUID] AS PrincipalID, '00000000-0000-0000-0000-000000000000' AS ScopeID, -username AS FirstName, -lastname AS LastName, -email as Email, ( -'AssetServerURI=' + -userAssetURI + ' InventoryServerURI=' + userInventoryURI + ' GatewayURI= HomeURI=') AS ServiceURLs, -created as Created FROM users; - - -COMMIT \ No newline at end of file diff --git a/OpenSim/Data/MSSQL/Resources/002_UserStore.sql b/OpenSim/Data/MSSQL/Resources/002_UserStore.sql deleted file mode 100644 index 402eddf15c..0000000000 --- a/OpenSim/Data/MSSQL/Resources/002_UserStore.sql +++ /dev/null @@ -1,9 +0,0 @@ -BEGIN TRANSACTION - -ALTER TABLE users ADD homeRegionID varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000'; -ALTER TABLE users ADD userFlags int NOT NULL default 0; -ALTER TABLE users ADD godLevel int NOT NULL default 0; -ALTER TABLE users ADD customType varchar(32) not null default ''; -ALTER TABLE users ADD partner varchar(36) not null default '00000000-0000-0000-0000-000000000000'; - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/003_AssetStore.sql b/OpenSim/Data/MSSQL/Resources/003_AssetStore.sql deleted file mode 100644 index 1434330739..0000000000 --- a/OpenSim/Data/MSSQL/Resources/003_AssetStore.sql +++ /dev/null @@ -1,6 +0,0 @@ -BEGIN TRANSACTION - -ALTER TABLE assets add create_time integer default 0 -ALTER TABLE assets add access_time integer default 0 - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/003_EstateStore.sql b/OpenSim/Data/MSSQL/Resources/003_EstateStore.sql deleted file mode 100644 index 120966ae1d..0000000000 --- a/OpenSim/Data/MSSQL/Resources/003_EstateStore.sql +++ /dev/null @@ -1,25 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_estateban - ( - EstateID int NOT NULL, - bannedUUID varchar(36) NOT NULL, - bannedIp varchar(16) NULL, - bannedIpHostMask varchar(16) NULL, - bannedNameMask varchar(64) NULL - ) ON [PRIMARY] - -IF EXISTS(SELECT * FROM dbo.estateban) - EXEC('INSERT INTO dbo.Tmp_estateban (EstateID, bannedUUID, bannedIp, bannedIpHostMask, bannedNameMask) - SELECT EstateID, bannedUUID, bannedIp, bannedIpHostMask, bannedNameMask FROM dbo.estateban') - -DROP TABLE dbo.estateban - -EXECUTE sp_rename N'dbo.Tmp_estateban', N'estateban', 'OBJECT' - -CREATE NONCLUSTERED INDEX IX_estateban ON dbo.estateban - ( - EstateID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/003_GridStore.sql b/OpenSim/Data/MSSQL/Resources/003_GridStore.sql deleted file mode 100644 index e080947665..0000000000 --- a/OpenSim/Data/MSSQL/Resources/003_GridStore.sql +++ /dev/null @@ -1,22 +0,0 @@ -BEGIN TRANSACTION - -CREATE NONCLUSTERED INDEX IX_regions_name ON dbo.regions - ( - regionName - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -CREATE NONCLUSTERED INDEX IX_regions_handle ON dbo.regions - ( - regionHandle - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - - -CREATE NONCLUSTERED INDEX IX_regions_override ON dbo.regions - ( - eastOverrideHandle, - westOverrideHandle, - southOverrideHandle, - northOverrideHandle - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/003_InventoryStore.sql b/OpenSim/Data/MSSQL/Resources/003_InventoryStore.sql deleted file mode 100644 index 2f623ec911..0000000000 --- a/OpenSim/Data/MSSQL/Resources/003_InventoryStore.sql +++ /dev/null @@ -1,38 +0,0 @@ -/* To prevent any potential data loss issues, you should review this script in detail before running it outside the context of the database designer.*/ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_inventoryfolders - ( - folderID uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'), - agentID uniqueidentifier NULL DEFAULT (NULL), - parentFolderID uniqueidentifier NULL DEFAULT (NULL), - folderName varchar(64) NULL DEFAULT (NULL), - type smallint NOT NULL DEFAULT ((0)), - version int NOT NULL DEFAULT ((0)) - ) ON [PRIMARY] - -IF EXISTS(SELECT * FROM dbo.inventoryfolders) - EXEC('INSERT INTO dbo.Tmp_inventoryfolders (folderID, agentID, parentFolderID, folderName, type, version) - SELECT CONVERT(uniqueidentifier, folderID), CONVERT(uniqueidentifier, agentID), CONVERT(uniqueidentifier, parentFolderID), folderName, type, version FROM dbo.inventoryfolders WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE dbo.inventoryfolders - -EXECUTE sp_rename N'dbo.Tmp_inventoryfolders', N'inventoryfolders', 'OBJECT' - -ALTER TABLE dbo.inventoryfolders ADD CONSTRAINT - PK__inventor__C2FABFB3173876EA PRIMARY KEY CLUSTERED - ( - folderID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -CREATE NONCLUSTERED INDEX owner ON dbo.inventoryfolders - ( - agentID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -CREATE NONCLUSTERED INDEX parent ON dbo.inventoryfolders - ( - parentFolderID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/003_RegionStore.sql b/OpenSim/Data/MSSQL/Resources/003_RegionStore.sql deleted file mode 100644 index a8f40c2a86..0000000000 --- a/OpenSim/Data/MSSQL/Resources/003_RegionStore.sql +++ /dev/null @@ -1,67 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_prims - ( - UUID varchar(36) NOT NULL, - RegionUUID varchar(36) NULL, - ParentID int NULL, - CreationDate int NULL, - Name varchar(255) NULL, - SceneGroupID varchar(36) NULL, - Text varchar(255) NULL, - Description varchar(255) NULL, - SitName varchar(255) NULL, - TouchName varchar(255) NULL, - ObjectFlags int NULL, - CreatorID varchar(36) NULL, - OwnerID varchar(36) NULL, - GroupID varchar(36) NULL, - LastOwnerID varchar(36) NULL, - OwnerMask int NULL, - NextOwnerMask int NULL, - GroupMask int NULL, - EveryoneMask int NULL, - BaseMask int NULL, - PositionX float(53) NULL, - PositionY float(53) NULL, - PositionZ float(53) NULL, - GroupPositionX float(53) NULL, - GroupPositionY float(53) NULL, - GroupPositionZ float(53) NULL, - VelocityX float(53) NULL, - VelocityY float(53) NULL, - VelocityZ float(53) NULL, - AngularVelocityX float(53) NULL, - AngularVelocityY float(53) NULL, - AngularVelocityZ float(53) NULL, - AccelerationX float(53) NULL, - AccelerationY float(53) NULL, - AccelerationZ float(53) NULL, - RotationX float(53) NULL, - RotationY float(53) NULL, - RotationZ float(53) NULL, - RotationW float(53) NULL, - SitTargetOffsetX float(53) NULL, - SitTargetOffsetY float(53) NULL, - SitTargetOffsetZ float(53) NULL, - SitTargetOrientW float(53) NULL, - SitTargetOrientX float(53) NULL, - SitTargetOrientY float(53) NULL, - SitTargetOrientZ float(53) NULL - ) ON [PRIMARY] - -IF EXISTS(SELECT * FROM dbo.prims) - EXEC('INSERT INTO dbo.Tmp_prims (UUID, RegionUUID, ParentID, CreationDate, Name, SceneGroupID, Text, Description, SitName, TouchName, ObjectFlags, CreatorID, OwnerID, GroupID, LastOwnerID, OwnerMask, NextOwnerMask, GroupMask, EveryoneMask, BaseMask, PositionX, PositionY, PositionZ, GroupPositionX, GroupPositionY, GroupPositionZ, VelocityX, VelocityY, VelocityZ, AngularVelocityX, AngularVelocityY, AngularVelocityZ, AccelerationX, AccelerationY, AccelerationZ, RotationX, RotationY, RotationZ, RotationW, SitTargetOffsetX, SitTargetOffsetY, SitTargetOffsetZ, SitTargetOrientW, SitTargetOrientX, SitTargetOrientY, SitTargetOrientZ) - SELECT CONVERT(varchar(36), UUID), CONVERT(varchar(36), RegionUUID), ParentID, CreationDate, Name, CONVERT(varchar(36), SceneGroupID), Text, Description, SitName, TouchName, ObjectFlags, CONVERT(varchar(36), CreatorID), CONVERT(varchar(36), OwnerID), CONVERT(varchar(36), GroupID), CONVERT(varchar(36), LastOwnerID), OwnerMask, NextOwnerMask, GroupMask, EveryoneMask, BaseMask, PositionX, PositionY, PositionZ, GroupPositionX, GroupPositionY, GroupPositionZ, VelocityX, VelocityY, VelocityZ, AngularVelocityX, AngularVelocityY, AngularVelocityZ, AccelerationX, AccelerationY, AccelerationZ, RotationX, RotationY, RotationZ, RotationW, SitTargetOffsetX, SitTargetOffsetY, SitTargetOffsetZ, SitTargetOrientW, SitTargetOrientX, SitTargetOrientY, SitTargetOrientZ FROM dbo.prims WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE dbo.prims - -EXECUTE sp_rename N'dbo.Tmp_prims', N'prims', 'OBJECT' - -ALTER TABLE dbo.prims ADD CONSTRAINT - PK__prims__10566F31 PRIMARY KEY CLUSTERED - ( - UUID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT \ No newline at end of file diff --git a/OpenSim/Data/MSSQL/Resources/003_UserAccount.sql b/OpenSim/Data/MSSQL/Resources/003_UserAccount.sql deleted file mode 100644 index da0395b49c..0000000000 --- a/OpenSim/Data/MSSQL/Resources/003_UserAccount.sql +++ /dev/null @@ -1,9 +0,0 @@ -BEGIN TRANSACTION - -CREATE UNIQUE INDEX PrincipalID ON UserAccounts(PrincipalID); -CREATE INDEX Email ON UserAccounts(Email); -CREATE INDEX FirstName ON UserAccounts(FirstName); -CREATE INDEX LastName ON UserAccounts(LastName); -CREATE INDEX Name ON UserAccounts(FirstName,LastName); - -COMMIT \ No newline at end of file diff --git a/OpenSim/Data/MSSQL/Resources/003_UserStore.sql b/OpenSim/Data/MSSQL/Resources/003_UserStore.sql deleted file mode 100644 index cb507c9630..0000000000 --- a/OpenSim/Data/MSSQL/Resources/003_UserStore.sql +++ /dev/null @@ -1,15 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE [avatarattachments] ( - [UUID] varchar(36) NOT NULL - , [attachpoint] int NOT NULL - , [item] varchar(36) NOT NULL - , [asset] varchar(36) NOT NULL) - -CREATE NONCLUSTERED INDEX IX_avatarattachments ON dbo.avatarattachments - ( - UUID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/004_AssetStore.sql b/OpenSim/Data/MSSQL/Resources/004_AssetStore.sql deleted file mode 100644 index 215cf3a14e..0000000000 --- a/OpenSim/Data/MSSQL/Resources/004_AssetStore.sql +++ /dev/null @@ -1,31 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_assets - ( - id uniqueidentifier NOT NULL, - name varchar(64) NOT NULL, - description varchar(64) NOT NULL, - assetType tinyint NOT NULL, - local bit NOT NULL, - temporary bit NOT NULL, - data image NOT NULL, - create_time int NULL, - access_time int NULL - ) ON [PRIMARY] - TEXTIMAGE_ON [PRIMARY] - -IF EXISTS(SELECT * FROM dbo.assets) - EXEC('INSERT INTO dbo.Tmp_assets (id, name, description, assetType, local, temporary, data, create_time, access_time) - SELECT CONVERT(uniqueidentifier, id), name, description, assetType, local, temporary, data, create_time, access_time FROM dbo.assets WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE assets - -EXECUTE sp_rename N'Tmp_assets', N'assets', 'OBJECT' - -ALTER TABLE dbo.assets ADD CONSTRAINT - PK__assets__id PRIMARY KEY CLUSTERED - ( - id - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/004_EstateStore.sql b/OpenSim/Data/MSSQL/Resources/004_EstateStore.sql deleted file mode 100644 index 0a132c110e..0000000000 --- a/OpenSim/Data/MSSQL/Resources/004_EstateStore.sql +++ /dev/null @@ -1,22 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_estate_managers - ( - EstateID int NOT NULL, - uuid uniqueidentifier NOT NULL - ) ON [PRIMARY] - -IF EXISTS(SELECT * FROM dbo.estate_managers) - EXEC('INSERT INTO dbo.Tmp_estate_managers (EstateID, uuid) - SELECT EstateID, CONVERT(uniqueidentifier, uuid) FROM dbo.estate_managers WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE dbo.estate_managers - -EXECUTE sp_rename N'dbo.Tmp_estate_managers', N'estate_managers', 'OBJECT' - -CREATE NONCLUSTERED INDEX IX_estate_managers ON dbo.estate_managers - ( - EstateID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/004_GridStore.sql b/OpenSim/Data/MSSQL/Resources/004_GridStore.sql deleted file mode 100644 index 6456c95f83..0000000000 --- a/OpenSim/Data/MSSQL/Resources/004_GridStore.sql +++ /dev/null @@ -1,68 +0,0 @@ -/* To prevent any potential data loss issues, you should review this script in detail before running it outside the context of the database designer.*/ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_regions - ( - uuid uniqueidentifier NOT NULL, - regionHandle bigint NULL, - regionName varchar(20) NULL, - regionRecvKey varchar(128) NULL, - regionSendKey varchar(128) NULL, - regionSecret varchar(128) NULL, - regionDataURI varchar(128) NULL, - serverIP varchar(64) NULL, - serverPort int NULL, - serverURI varchar(255) NULL, - locX int NULL, - locY int NULL, - locZ int NULL, - eastOverrideHandle bigint NULL, - westOverrideHandle bigint NULL, - southOverrideHandle bigint NULL, - northOverrideHandle bigint NULL, - regionAssetURI varchar(255) NULL, - regionAssetRecvKey varchar(128) NULL, - regionAssetSendKey varchar(128) NULL, - regionUserURI varchar(255) NULL, - regionUserRecvKey varchar(128) NULL, - regionUserSendKey varchar(128) NULL, - regionMapTexture uniqueidentifier NULL, - serverHttpPort int NULL, - serverRemotingPort int NULL, - owner_uuid uniqueidentifier NOT NULL, - originUUID uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000') - ) ON [PRIMARY] - -IF EXISTS(SELECT * FROM dbo.regions) - EXEC('INSERT INTO dbo.Tmp_regions (uuid, regionHandle, regionName, regionRecvKey, regionSendKey, regionSecret, regionDataURI, serverIP, serverPort, serverURI, locX, locY, locZ, eastOverrideHandle, westOverrideHandle, southOverrideHandle, northOverrideHandle, regionAssetURI, regionAssetRecvKey, regionAssetSendKey, regionUserURI, regionUserRecvKey, regionUserSendKey, regionMapTexture, serverHttpPort, serverRemotingPort, owner_uuid, originUUID) - SELECT CONVERT(uniqueidentifier, uuid), regionHandle, regionName, regionRecvKey, regionSendKey, regionSecret, regionDataURI, serverIP, serverPort, serverURI, locX, locY, locZ, eastOverrideHandle, westOverrideHandle, southOverrideHandle, northOverrideHandle, regionAssetURI, regionAssetRecvKey, regionAssetSendKey, regionUserURI, regionUserRecvKey, regionUserSendKey, CONVERT(uniqueidentifier, regionMapTexture), serverHttpPort, serverRemotingPort, CONVERT(uniqueidentifier, owner_uuid), CONVERT(uniqueidentifier, originUUID) FROM dbo.regions WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE dbo.regions - -EXECUTE sp_rename N'dbo.Tmp_regions', N'regions', 'OBJECT' - -ALTER TABLE dbo.regions ADD CONSTRAINT - PK__regions__uuid PRIMARY KEY CLUSTERED - ( - uuid - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -CREATE NONCLUSTERED INDEX IX_regions_name ON dbo.regions - ( - regionName - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -CREATE NONCLUSTERED INDEX IX_regions_handle ON dbo.regions - ( - regionHandle - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -CREATE NONCLUSTERED INDEX IX_regions_override ON dbo.regions - ( - eastOverrideHandle, - westOverrideHandle, - southOverrideHandle, - northOverrideHandle - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/004_InventoryStore.sql b/OpenSim/Data/MSSQL/Resources/004_InventoryStore.sql deleted file mode 100644 index 96ef1c0c90..0000000000 --- a/OpenSim/Data/MSSQL/Resources/004_InventoryStore.sql +++ /dev/null @@ -1,52 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_inventoryitems - ( - inventoryID uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'), - assetID uniqueidentifier NULL DEFAULT (NULL), - assetType int NULL DEFAULT (NULL), - parentFolderID uniqueidentifier NULL DEFAULT (NULL), - avatarID uniqueidentifier NULL DEFAULT (NULL), - inventoryName varchar(64) NULL DEFAULT (NULL), - inventoryDescription varchar(128) NULL DEFAULT (NULL), - inventoryNextPermissions int NULL DEFAULT (NULL), - inventoryCurrentPermissions int NULL DEFAULT (NULL), - invType int NULL DEFAULT (NULL), - creatorID uniqueidentifier NULL DEFAULT (NULL), - inventoryBasePermissions int NOT NULL DEFAULT ((0)), - inventoryEveryOnePermissions int NOT NULL DEFAULT ((0)), - salePrice int NULL DEFAULT (NULL), - saleType tinyint NULL DEFAULT (NULL), - creationDate int NULL DEFAULT (NULL), - groupID uniqueidentifier NULL DEFAULT (NULL), - groupOwned bit NULL DEFAULT (NULL), - flags int NULL DEFAULT (NULL), - inventoryGroupPermissions int NOT NULL DEFAULT ((0)) - ) ON [PRIMARY] - -IF EXISTS(SELECT * FROM dbo.inventoryitems) - EXEC('INSERT INTO dbo.Tmp_inventoryitems (inventoryID, assetID, assetType, parentFolderID, avatarID, inventoryName, inventoryDescription, inventoryNextPermissions, inventoryCurrentPermissions, invType, creatorID, inventoryBasePermissions, inventoryEveryOnePermissions, salePrice, saleType, creationDate, groupID, groupOwned, flags, inventoryGroupPermissions) - SELECT CONVERT(uniqueidentifier, inventoryID), CONVERT(uniqueidentifier, assetID), assetType, CONVERT(uniqueidentifier, parentFolderID), CONVERT(uniqueidentifier, avatarID), inventoryName, inventoryDescription, inventoryNextPermissions, inventoryCurrentPermissions, invType, CONVERT(uniqueidentifier, creatorID), inventoryBasePermissions, inventoryEveryOnePermissions, salePrice, saleType, creationDate, CONVERT(uniqueidentifier, groupID), groupOwned, flags, inventoryGroupPermissions FROM dbo.inventoryitems WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE dbo.inventoryitems - -EXECUTE sp_rename N'dbo.Tmp_inventoryitems', N'inventoryitems', 'OBJECT' - -ALTER TABLE dbo.inventoryitems ADD CONSTRAINT - PK__inventor__C4B7BC2220C1E124 PRIMARY KEY CLUSTERED - ( - inventoryID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - - -CREATE NONCLUSTERED INDEX owner ON dbo.inventoryitems - ( - avatarID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -CREATE NONCLUSTERED INDEX folder ON dbo.inventoryitems - ( - parentFolderID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/004_RegionStore.sql b/OpenSim/Data/MSSQL/Resources/004_RegionStore.sql deleted file mode 100644 index 15b39a7fcf..0000000000 --- a/OpenSim/Data/MSSQL/Resources/004_RegionStore.sql +++ /dev/null @@ -1,40 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE Tmp_primitems - ( - itemID varchar(36) NOT NULL, - primID varchar(36) NULL, - assetID varchar(36) NULL, - parentFolderID varchar(36) NULL, - invType int NULL, - assetType int NULL, - name varchar(255) NULL, - description varchar(255) NULL, - creationDate varchar(255) NULL, - creatorID varchar(36) NULL, - ownerID varchar(36) NULL, - lastOwnerID varchar(36) NULL, - groupID varchar(36) NULL, - nextPermissions int NULL, - currentPermissions int NULL, - basePermissions int NULL, - everyonePermissions int NULL, - groupPermissions int NULL - ) ON [PRIMARY] - -IF EXISTS(SELECT * FROM primitems) - EXEC('INSERT INTO Tmp_primitems (itemID, primID, assetID, parentFolderID, invType, assetType, name, description, creationDate, creatorID, ownerID, lastOwnerID, groupID, nextPermissions, currentPermissions, basePermissions, everyonePermissions, groupPermissions) - SELECT CONVERT(varchar(36), itemID), CONVERT(varchar(36), primID), CONVERT(varchar(36), assetID), CONVERT(varchar(36), parentFolderID), invType, assetType, name, description, creationDate, CONVERT(varchar(36), creatorID), CONVERT(varchar(36), ownerID), CONVERT(varchar(36), lastOwnerID), CONVERT(varchar(36), groupID), nextPermissions, currentPermissions, basePermissions, everyonePermissions, groupPermissions') - -DROP TABLE primitems - -EXECUTE sp_rename N'Tmp_primitems', N'primitems', 'OBJECT' - -ALTER TABLE primitems ADD CONSTRAINT - PK__primitems__0A688BB1 PRIMARY KEY CLUSTERED - ( - itemID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/004_UserAccount.sql b/OpenSim/Data/MSSQL/Resources/004_UserAccount.sql deleted file mode 100644 index a9a9021cc7..0000000000 --- a/OpenSim/Data/MSSQL/Resources/004_UserAccount.sql +++ /dev/null @@ -1,7 +0,0 @@ -BEGIN TRANSACTION - -ALTER TABLE UserAccounts ADD UserLevel integer NOT NULL DEFAULT 0; -ALTER TABLE UserAccounts ADD UserFlags integer NOT NULL DEFAULT 0; -ALTER TABLE UserAccounts ADD UserTitle varchar(64) NOT NULL DEFAULT ''; - -COMMIT \ No newline at end of file diff --git a/OpenSim/Data/MSSQL/Resources/004_UserStore.sql b/OpenSim/Data/MSSQL/Resources/004_UserStore.sql deleted file mode 100644 index 08f1a1d182..0000000000 --- a/OpenSim/Data/MSSQL/Resources/004_UserStore.sql +++ /dev/null @@ -1,29 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE Tmp_userfriends - ( - ownerID varchar(36) NOT NULL, - friendID varchar(36) NOT NULL, - friendPerms int NOT NULL, - datetimestamp int NOT NULL - ) ON [PRIMARY] - -IF EXISTS(SELECT * FROM userfriends) - EXEC('INSERT INTO dbo.Tmp_userfriends (ownerID, friendID, friendPerms, datetimestamp) - SELECT CONVERT(varchar(36), ownerID), CONVERT(varchar(36), friendID), CONVERT(int, friendPerms), CONVERT(int, datetimestamp) FROM dbo.userfriends WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE dbo.userfriends - -EXECUTE sp_rename N'Tmp_userfriends', N'userfriends', 'OBJECT' - -CREATE NONCLUSTERED INDEX IX_userfriends_ownerID ON userfriends - ( - ownerID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -CREATE NONCLUSTERED INDEX IX_userfriends_friendID ON userfriends - ( - friendID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/005_AssetStore.sql b/OpenSim/Data/MSSQL/Resources/005_AssetStore.sql deleted file mode 100644 index 4e95b2b693..0000000000 --- a/OpenSim/Data/MSSQL/Resources/005_AssetStore.sql +++ /dev/null @@ -1 +0,0 @@ -DELETE FROM assets WHERE id = 'dc4b9f0b-d008-45c6-96a4-01dd947ac621'; diff --git a/OpenSim/Data/MSSQL/Resources/005_EstateStore.sql b/OpenSim/Data/MSSQL/Resources/005_EstateStore.sql deleted file mode 100644 index ba93b39ff4..0000000000 --- a/OpenSim/Data/MSSQL/Resources/005_EstateStore.sql +++ /dev/null @@ -1,22 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_estate_groups - ( - EstateID int NOT NULL, - uuid uniqueidentifier NOT NULL - ) ON [PRIMARY] - -IF EXISTS(SELECT * FROM dbo.estate_groups) - EXEC('INSERT INTO dbo.Tmp_estate_groups (EstateID, uuid) - SELECT EstateID, CONVERT(uniqueidentifier, uuid) FROM dbo.estate_groups WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE dbo.estate_groups - -EXECUTE sp_rename N'dbo.Tmp_estate_groups', N'estate_groups', 'OBJECT' - -CREATE NONCLUSTERED INDEX IX_estate_groups ON dbo.estate_groups - ( - EstateID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/005_GridStore.sql b/OpenSim/Data/MSSQL/Resources/005_GridStore.sql deleted file mode 100644 index aa04a33019..0000000000 --- a/OpenSim/Data/MSSQL/Resources/005_GridStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN TRANSACTION - -ALTER TABLE regions ADD access int default 0; - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/005_RegionStore.sql b/OpenSim/Data/MSSQL/Resources/005_RegionStore.sql deleted file mode 100644 index eb0862c9bd..0000000000 --- a/OpenSim/Data/MSSQL/Resources/005_RegionStore.sql +++ /dev/null @@ -1,49 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE Tmp_primshapes - ( - UUID varchar(36) NOT NULL, - Shape int NULL, - ScaleX float(53) NULL, - ScaleY float(53) NULL, - ScaleZ float(53) NULL, - PCode int NULL, - PathBegin int NULL, - PathEnd int NULL, - PathScaleX int NULL, - PathScaleY int NULL, - PathShearX int NULL, - PathShearY int NULL, - PathSkew int NULL, - PathCurve int NULL, - PathRadiusOffset int NULL, - PathRevolutions int NULL, - PathTaperX int NULL, - PathTaperY int NULL, - PathTwist int NULL, - PathTwistBegin int NULL, - ProfileBegin int NULL, - ProfileEnd int NULL, - ProfileCurve int NULL, - ProfileHollow int NULL, - State int NULL, - Texture image NULL, - ExtraParams image NULL - ) ON [PRIMARY] - TEXTIMAGE_ON [PRIMARY] - -IF EXISTS(SELECT * FROM primshapes) - EXEC('INSERT INTO Tmp_primshapes (UUID, Shape, ScaleX, ScaleY, ScaleZ, PCode, PathBegin, PathEnd, PathScaleX, PathScaleY, PathShearX, PathShearY, PathSkew, PathCurve, PathRadiusOffset, PathRevolutions, PathTaperX, PathTaperY, PathTwist, PathTwistBegin, ProfileBegin, ProfileEnd, ProfileCurve, ProfileHollow, State, Texture, ExtraParams) - SELECT CONVERT(varchar(36), UUID), Shape, ScaleX, ScaleY, ScaleZ, PCode, PathBegin, PathEnd, PathScaleX, PathScaleY, PathShearX, PathShearY, PathSkew, PathCurve, PathRadiusOffset, PathRevolutions, PathTaperX, PathTaperY, PathTwist, PathTwistBegin, ProfileBegin, ProfileEnd, ProfileCurve, ProfileHollow, State, Texture, ExtraParams FROM primshapes WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE primshapes - -EXECUTE sp_rename N'Tmp_primshapes', N'primshapes', 'OBJECT' - -ALTER TABLE primshapes ADD CONSTRAINT - PK__primshapes__0880433F PRIMARY KEY CLUSTERED - ( - UUID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/005_UserStore.sql b/OpenSim/Data/MSSQL/Resources/005_UserStore.sql deleted file mode 100644 index 1b6ab8f7da..0000000000 --- a/OpenSim/Data/MSSQL/Resources/005_UserStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN TRANSACTION - - ALTER TABLE users add email varchar(250); - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/006_EstateStore.sql b/OpenSim/Data/MSSQL/Resources/006_EstateStore.sql deleted file mode 100644 index f7df8fda18..0000000000 --- a/OpenSim/Data/MSSQL/Resources/006_EstateStore.sql +++ /dev/null @@ -1,22 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_estate_users - ( - EstateID int NOT NULL, - uuid uniqueidentifier NOT NULL - ) ON [PRIMARY] - -IF EXISTS(SELECT * FROM dbo.estate_users) - EXEC('INSERT INTO dbo.Tmp_estate_users (EstateID, uuid) - SELECT EstateID, CONVERT(uniqueidentifier, uuid) FROM dbo.estate_users WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE dbo.estate_users - -EXECUTE sp_rename N'dbo.Tmp_estate_users', N'estate_users', 'OBJECT' - -CREATE NONCLUSTERED INDEX IX_estate_users ON dbo.estate_users - ( - EstateID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/006_GridStore.sql b/OpenSim/Data/MSSQL/Resources/006_GridStore.sql deleted file mode 100644 index 42010ce657..0000000000 --- a/OpenSim/Data/MSSQL/Resources/006_GridStore.sql +++ /dev/null @@ -1,8 +0,0 @@ -BEGIN TRANSACTION - -ALTER TABLE regions ADD scopeid uniqueidentifier default '00000000-0000-0000-0000-000000000000'; -ALTER TABLE regions ADD DEFAULT ('00000000-0000-0000-0000-000000000000') FOR [owner_uuid]; -ALTER TABLE regions ADD sizeX integer not null default 0; -ALTER TABLE regions ADD sizeY integer not null default 0; - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/006_RegionStore.sql b/OpenSim/Data/MSSQL/Resources/006_RegionStore.sql deleted file mode 100644 index 0419c0c8a6..0000000000 --- a/OpenSim/Data/MSSQL/Resources/006_RegionStore.sql +++ /dev/null @@ -1,36 +0,0 @@ -BEGIN TRANSACTION - -ALTER TABLE prims ADD PayPrice int not null default 0 -ALTER TABLE prims ADD PayButton1 int not null default 0 -ALTER TABLE prims ADD PayButton2 int not null default 0 -ALTER TABLE prims ADD PayButton3 int not null default 0 -ALTER TABLE prims ADD PayButton4 int not null default 0 -ALTER TABLE prims ADD LoopedSound varchar(36) not null default '00000000-0000-0000-0000-000000000000'; -ALTER TABLE prims ADD LoopedSoundGain float not null default 0.0; -ALTER TABLE prims ADD TextureAnimation image -ALTER TABLE prims ADD OmegaX float not null default 0.0 -ALTER TABLE prims ADD OmegaY float not null default 0.0 -ALTER TABLE prims ADD OmegaZ float not null default 0.0 -ALTER TABLE prims ADD CameraEyeOffsetX float not null default 0.0 -ALTER TABLE prims ADD CameraEyeOffsetY float not null default 0.0 -ALTER TABLE prims ADD CameraEyeOffsetZ float not null default 0.0 -ALTER TABLE prims ADD CameraAtOffsetX float not null default 0.0 -ALTER TABLE prims ADD CameraAtOffsetY float not null default 0.0 -ALTER TABLE prims ADD CameraAtOffsetZ float not null default 0.0 -ALTER TABLE prims ADD ForceMouselook tinyint not null default 0 -ALTER TABLE prims ADD ScriptAccessPin int not null default 0 -ALTER TABLE prims ADD AllowedDrop tinyint not null default 0 -ALTER TABLE prims ADD DieAtEdge tinyint not null default 0 -ALTER TABLE prims ADD SalePrice int not null default 10 -ALTER TABLE prims ADD SaleType tinyint not null default 0 - -ALTER TABLE primitems add flags integer not null default 0 - -ALTER TABLE land ADD AuthbuyerID varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000' - -CREATE index prims_regionuuid on prims(RegionUUID) -CREATE index prims_parentid on prims(ParentID) - -CREATE index primitems_primid on primitems(primID) - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/006_UserStore.sql b/OpenSim/Data/MSSQL/Resources/006_UserStore.sql deleted file mode 100644 index 67fe5818a8..0000000000 --- a/OpenSim/Data/MSSQL/Resources/006_UserStore.sql +++ /dev/null @@ -1,57 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_users - ( - UUID uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'), - username varchar(32) NOT NULL, - lastname varchar(32) NOT NULL, - passwordHash varchar(32) NOT NULL, - passwordSalt varchar(32) NOT NULL, - homeRegion bigint NULL DEFAULT (NULL), - homeLocationX float(53) NULL DEFAULT (NULL), - homeLocationY float(53) NULL DEFAULT (NULL), - homeLocationZ float(53) NULL DEFAULT (NULL), - homeLookAtX float(53) NULL DEFAULT (NULL), - homeLookAtY float(53) NULL DEFAULT (NULL), - homeLookAtZ float(53) NULL DEFAULT (NULL), - created int NOT NULL, - lastLogin int NOT NULL, - userInventoryURI varchar(255) NULL DEFAULT (NULL), - userAssetURI varchar(255) NULL DEFAULT (NULL), - profileCanDoMask int NULL DEFAULT (NULL), - profileWantDoMask int NULL DEFAULT (NULL), - profileAboutText ntext NULL, - profileFirstText ntext NULL, - profileImage uniqueidentifier NULL DEFAULT (NULL), - profileFirstImage uniqueidentifier NULL DEFAULT (NULL), - webLoginKey uniqueidentifier NULL DEFAULT (NULL), - homeRegionID uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'), - userFlags int NOT NULL DEFAULT ((0)), - godLevel int NOT NULL DEFAULT ((0)), - customType varchar(32) NOT NULL DEFAULT (''), - partner uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'), - email varchar(250) NULL - ) ON [PRIMARY] - TEXTIMAGE_ON [PRIMARY] - -IF EXISTS(SELECT * FROM dbo.users) - EXEC('INSERT INTO dbo.Tmp_users (UUID, username, lastname, passwordHash, passwordSalt, homeRegion, homeLocationX, homeLocationY, homeLocationZ, homeLookAtX, homeLookAtY, homeLookAtZ, created, lastLogin, userInventoryURI, userAssetURI, profileCanDoMask, profileWantDoMask, profileAboutText, profileFirstText, profileImage, profileFirstImage, webLoginKey, homeRegionID, userFlags, godLevel, customType, partner, email) - SELECT CONVERT(uniqueidentifier, UUID), username, lastname, passwordHash, passwordSalt, homeRegion, homeLocationX, homeLocationY, homeLocationZ, homeLookAtX, homeLookAtY, homeLookAtZ, created, lastLogin, userInventoryURI, userAssetURI, profileCanDoMask, profileWantDoMask, profileAboutText, profileFirstText, CONVERT(uniqueidentifier, profileImage), CONVERT(uniqueidentifier, profileFirstImage), CONVERT(uniqueidentifier, webLoginKey), CONVERT(uniqueidentifier, homeRegionID), userFlags, godLevel, customType, CONVERT(uniqueidentifier, partner), email FROM dbo.users WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE dbo.users - -EXECUTE sp_rename N'dbo.Tmp_users', N'users', 'OBJECT' - -ALTER TABLE dbo.users ADD CONSTRAINT - PK__users__65A475E737A5467C PRIMARY KEY CLUSTERED - ( - UUID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -CREATE NONCLUSTERED INDEX usernames ON dbo.users - ( - username, - lastname - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/007_EstateStore.sql b/OpenSim/Data/MSSQL/Resources/007_EstateStore.sql deleted file mode 100644 index c9165b0c6d..0000000000 --- a/OpenSim/Data/MSSQL/Resources/007_EstateStore.sql +++ /dev/null @@ -1,25 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_estateban - ( - EstateID int NOT NULL, - bannedUUID uniqueidentifier NOT NULL, - bannedIp varchar(16) NULL, - bannedIpHostMask varchar(16) NULL, - bannedNameMask varchar(64) NULL - ) ON [PRIMARY] - -IF EXISTS(SELECT * FROM dbo.estateban) - EXEC('INSERT INTO dbo.Tmp_estateban (EstateID, bannedUUID, bannedIp, bannedIpHostMask, bannedNameMask) - SELECT EstateID, CONVERT(uniqueidentifier, bannedUUID), bannedIp, bannedIpHostMask, bannedNameMask FROM dbo.estateban WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE dbo.estateban - -EXECUTE sp_rename N'dbo.Tmp_estateban', N'estateban', 'OBJECT' - -CREATE NONCLUSTERED INDEX IX_estateban ON dbo.estateban - ( - EstateID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/007_GridStore.sql b/OpenSim/Data/MSSQL/Resources/007_GridStore.sql deleted file mode 100644 index 0b66d40b47..0000000000 --- a/OpenSim/Data/MSSQL/Resources/007_GridStore.sql +++ /dev/null @@ -1,9 +0,0 @@ -BEGIN TRANSACTION - -ALTER TABLE regions ADD [flags] integer NOT NULL DEFAULT 0; -CREATE INDEX [flags] ON regions(flags); -ALTER TABLE [regions] ADD [last_seen] integer NOT NULL DEFAULT 0; -ALTER TABLE [regions] ADD [PrincipalID] uniqueidentifier NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000'; -ALTER TABLE [regions] ADD [Token] varchar(255) NOT NULL DEFAULT 0; - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/007_RegionStore.sql b/OpenSim/Data/MSSQL/Resources/007_RegionStore.sql deleted file mode 100644 index 684f937334..0000000000 --- a/OpenSim/Data/MSSQL/Resources/007_RegionStore.sql +++ /dev/null @@ -1,10 +0,0 @@ -BEGIN TRANSACTION - -ALTER TABLE prims ADD ColorR int not null default 0; -ALTER TABLE prims ADD ColorG int not null default 0; -ALTER TABLE prims ADD ColorB int not null default 0; -ALTER TABLE prims ADD ColorA int not null default 0; -ALTER TABLE prims ADD ParticleSystem IMAGE; -ALTER TABLE prims ADD ClickAction tinyint NOT NULL default 0; - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/007_UserStore.sql b/OpenSim/Data/MSSQL/Resources/007_UserStore.sql deleted file mode 100644 index 92a8fc572a..0000000000 --- a/OpenSim/Data/MSSQL/Resources/007_UserStore.sql +++ /dev/null @@ -1,42 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_agents - ( - UUID uniqueidentifier NOT NULL, - sessionID uniqueidentifier NOT NULL, - secureSessionID uniqueidentifier NOT NULL, - agentIP varchar(16) NOT NULL, - agentPort int NOT NULL, - agentOnline tinyint NOT NULL, - loginTime int NOT NULL, - logoutTime int NOT NULL, - currentRegion uniqueidentifier NOT NULL, - currentHandle bigint NOT NULL, - currentPos varchar(64) NOT NULL - ) ON [PRIMARY] - -IF EXISTS(SELECT * FROM dbo.agents) - EXEC('INSERT INTO dbo.Tmp_agents (UUID, sessionID, secureSessionID, agentIP, agentPort, agentOnline, loginTime, logoutTime, currentRegion, currentHandle, currentPos) - SELECT CONVERT(uniqueidentifier, UUID), CONVERT(uniqueidentifier, sessionID), CONVERT(uniqueidentifier, secureSessionID), agentIP, agentPort, agentOnline, loginTime, logoutTime, CONVERT(uniqueidentifier, currentRegion), currentHandle, currentPos FROM dbo.agents WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE dbo.agents - -EXECUTE sp_rename N'dbo.Tmp_agents', N'agents', 'OBJECT' - -ALTER TABLE dbo.agents ADD CONSTRAINT - PK__agents__65A475E749C3F6B7 PRIMARY KEY CLUSTERED - ( - UUID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -CREATE NONCLUSTERED INDEX session ON dbo.agents - ( - sessionID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -CREATE NONCLUSTERED INDEX ssession ON dbo.agents - ( - secureSessionID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/008_EstateStore.sql b/OpenSim/Data/MSSQL/Resources/008_EstateStore.sql deleted file mode 100644 index 9c5355eac7..0000000000 --- a/OpenSim/Data/MSSQL/Resources/008_EstateStore.sql +++ /dev/null @@ -1,49 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_estate_settings - ( - EstateID int NOT NULL IDENTITY (1, 100), - EstateName varchar(64) NULL DEFAULT (NULL), - AbuseEmailToEstateOwner bit NOT NULL, - DenyAnonymous bit NOT NULL, - ResetHomeOnTeleport bit NOT NULL, - FixedSun bit NOT NULL, - DenyTransacted bit NOT NULL, - BlockDwell bit NOT NULL, - DenyIdentified bit NOT NULL, - AllowVoice bit NOT NULL, - UseGlobalTime bit NOT NULL, - PricePerMeter int NOT NULL, - TaxFree bit NOT NULL, - AllowDirectTeleport bit NOT NULL, - RedirectGridX int NOT NULL, - RedirectGridY int NOT NULL, - ParentEstateID int NOT NULL, - SunPosition float(53) NOT NULL, - EstateSkipScripts bit NOT NULL, - BillableFactor float(53) NOT NULL, - PublicAccess bit NOT NULL, - AbuseEmail varchar(255) NOT NULL, - EstateOwner uniqueidentifier NOT NULL, - DenyMinors bit NOT NULL - ) ON [PRIMARY] - -SET IDENTITY_INSERT dbo.Tmp_estate_settings ON - -IF EXISTS(SELECT * FROM dbo.estate_settings) - EXEC('INSERT INTO dbo.Tmp_estate_settings (EstateID, EstateName, AbuseEmailToEstateOwner, DenyAnonymous, ResetHomeOnTeleport, FixedSun, DenyTransacted, BlockDwell, DenyIdentified, AllowVoice, UseGlobalTime, PricePerMeter, TaxFree, AllowDirectTeleport, RedirectGridX, RedirectGridY, ParentEstateID, SunPosition, EstateSkipScripts, BillableFactor, PublicAccess, AbuseEmail, EstateOwner, DenyMinors) - SELECT EstateID, EstateName, AbuseEmailToEstateOwner, DenyAnonymous, ResetHomeOnTeleport, FixedSun, DenyTransacted, BlockDwell, DenyIdentified, AllowVoice, UseGlobalTime, PricePerMeter, TaxFree, AllowDirectTeleport, RedirectGridX, RedirectGridY, ParentEstateID, SunPosition, EstateSkipScripts, BillableFactor, PublicAccess, AbuseEmail, CONVERT(uniqueidentifier, EstateOwner), DenyMinors FROM dbo.estate_settings WITH (HOLDLOCK TABLOCKX)') - -SET IDENTITY_INSERT dbo.Tmp_estate_settings OFF - -DROP TABLE dbo.estate_settings - -EXECUTE sp_rename N'dbo.Tmp_estate_settings', N'estate_settings', 'OBJECT' - -ALTER TABLE dbo.estate_settings ADD CONSTRAINT - PK_estate_settings PRIMARY KEY CLUSTERED - ( - EstateID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/008_RegionStore.sql b/OpenSim/Data/MSSQL/Resources/008_RegionStore.sql deleted file mode 100644 index 87d6d80005..0000000000 --- a/OpenSim/Data/MSSQL/Resources/008_RegionStore.sql +++ /dev/null @@ -1,7 +0,0 @@ -BEGIN TRANSACTION - -ALTER TABLE land ADD OtherCleanTime integer NOT NULL default 0; -ALTER TABLE land ADD Dwell integer NOT NULL default 0; - -COMMIT - diff --git a/OpenSim/Data/MSSQL/Resources/008_UserStore.sql b/OpenSim/Data/MSSQL/Resources/008_UserStore.sql deleted file mode 100644 index 505252ba42..0000000000 --- a/OpenSim/Data/MSSQL/Resources/008_UserStore.sql +++ /dev/null @@ -1,29 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_userfriends - ( - ownerID uniqueidentifier NOT NULL, - friendID uniqueidentifier NOT NULL, - friendPerms int NOT NULL, - datetimestamp int NOT NULL - ) ON [PRIMARY] - -IF EXISTS(SELECT * FROM dbo.userfriends) - EXEC('INSERT INTO dbo.Tmp_userfriends (ownerID, friendID, friendPerms, datetimestamp) - SELECT CONVERT(uniqueidentifier, ownerID), CONVERT(uniqueidentifier, friendID), friendPerms, datetimestamp FROM dbo.userfriends WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE dbo.userfriends - -EXECUTE sp_rename N'dbo.Tmp_userfriends', N'userfriends', 'OBJECT' - -CREATE NONCLUSTERED INDEX IX_userfriends_ownerID ON dbo.userfriends - ( - ownerID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -CREATE NONCLUSTERED INDEX IX_userfriends_friendID ON dbo.userfriends - ( - friendID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/009_EstateStore.sql b/OpenSim/Data/MSSQL/Resources/009_EstateStore.sql deleted file mode 100644 index f91557c805..0000000000 --- a/OpenSim/Data/MSSQL/Resources/009_EstateStore.sql +++ /dev/null @@ -1,24 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_estate_map - ( - RegionID uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'), - EstateID int NOT NULL - ) ON [PRIMARY] - -IF EXISTS(SELECT * FROM dbo.estate_map) - EXEC('INSERT INTO dbo.Tmp_estate_map (RegionID, EstateID) - SELECT CONVERT(uniqueidentifier, RegionID), EstateID FROM dbo.estate_map WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE dbo.estate_map - -EXECUTE sp_rename N'dbo.Tmp_estate_map', N'estate_map', 'OBJECT' - -ALTER TABLE dbo.estate_map ADD CONSTRAINT - PK_estate_map PRIMARY KEY CLUSTERED - ( - RegionID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/009_RegionStore.sql b/OpenSim/Data/MSSQL/Resources/009_RegionStore.sql deleted file mode 100644 index 4ef3b3f125..0000000000 --- a/OpenSim/Data/MSSQL/Resources/009_RegionStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN TRANSACTION - -ALTER TABLE prims ADD Material tinyint NOT NULL default 3 - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/009_UserStore.sql b/OpenSim/Data/MSSQL/Resources/009_UserStore.sql deleted file mode 100644 index b1ab8ba69b..0000000000 --- a/OpenSim/Data/MSSQL/Resources/009_UserStore.sql +++ /dev/null @@ -1,53 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_avatarappearance - ( - Owner uniqueidentifier NOT NULL, - Serial int NOT NULL, - Visual_Params image NOT NULL, - Texture image NOT NULL, - Avatar_Height float(53) NOT NULL, - Body_Item uniqueidentifier NOT NULL, - Body_Asset uniqueidentifier NOT NULL, - Skin_Item uniqueidentifier NOT NULL, - Skin_Asset uniqueidentifier NOT NULL, - Hair_Item uniqueidentifier NOT NULL, - Hair_Asset uniqueidentifier NOT NULL, - Eyes_Item uniqueidentifier NOT NULL, - Eyes_Asset uniqueidentifier NOT NULL, - Shirt_Item uniqueidentifier NOT NULL, - Shirt_Asset uniqueidentifier NOT NULL, - Pants_Item uniqueidentifier NOT NULL, - Pants_Asset uniqueidentifier NOT NULL, - Shoes_Item uniqueidentifier NOT NULL, - Shoes_Asset uniqueidentifier NOT NULL, - Socks_Item uniqueidentifier NOT NULL, - Socks_Asset uniqueidentifier NOT NULL, - Jacket_Item uniqueidentifier NOT NULL, - Jacket_Asset uniqueidentifier NOT NULL, - Gloves_Item uniqueidentifier NOT NULL, - Gloves_Asset uniqueidentifier NOT NULL, - Undershirt_Item uniqueidentifier NOT NULL, - Undershirt_Asset uniqueidentifier NOT NULL, - Underpants_Item uniqueidentifier NOT NULL, - Underpants_Asset uniqueidentifier NOT NULL, - Skirt_Item uniqueidentifier NOT NULL, - Skirt_Asset uniqueidentifier NOT NULL - ) ON [PRIMARY] - TEXTIMAGE_ON [PRIMARY] - -IF EXISTS(SELECT * FROM dbo.avatarappearance) - EXEC('INSERT INTO dbo.Tmp_avatarappearance (Owner, Serial, Visual_Params, Texture, Avatar_Height, Body_Item, Body_Asset, Skin_Item, Skin_Asset, Hair_Item, Hair_Asset, Eyes_Item, Eyes_Asset, Shirt_Item, Shirt_Asset, Pants_Item, Pants_Asset, Shoes_Item, Shoes_Asset, Socks_Item, Socks_Asset, Jacket_Item, Jacket_Asset, Gloves_Item, Gloves_Asset, Undershirt_Item, Undershirt_Asset, Underpants_Item, Underpants_Asset, Skirt_Item, Skirt_Asset) - SELECT CONVERT(uniqueidentifier, Owner), Serial, Visual_Params, Texture, Avatar_Height, CONVERT(uniqueidentifier, Body_Item), CONVERT(uniqueidentifier, Body_Asset), CONVERT(uniqueidentifier, Skin_Item), CONVERT(uniqueidentifier, Skin_Asset), CONVERT(uniqueidentifier, Hair_Item), CONVERT(uniqueidentifier, Hair_Asset), CONVERT(uniqueidentifier, Eyes_Item), CONVERT(uniqueidentifier, Eyes_Asset), CONVERT(uniqueidentifier, Shirt_Item), CONVERT(uniqueidentifier, Shirt_Asset), CONVERT(uniqueidentifier, Pants_Item), CONVERT(uniqueidentifier, Pants_Asset), CONVERT(uniqueidentifier, Shoes_Item), CONVERT(uniqueidentifier, Shoes_Asset), CONVERT(uniqueidentifier, Socks_Item), CONVERT(uniqueidentifier, Socks_Asset), CONVERT(uniqueidentifier, Jacket_Item), CONVERT(uniqueidentifier, Jacket_Asset), CONVERT(uniqueidentifier, Gloves_Item), CONVERT(uniqueidentifier, Gloves_Asset), CONVERT(uniqueidentifier, Undershirt_Item), CONVERT(uniqueidentifier, Undershirt_Asset), CONVERT(uniqueidentifier, Underpants_Item), CONVERT(uniqueidentifier, Underpants_Asset), CONVERT(uniqueidentifier, Skirt_Item), CONVERT(uniqueidentifier, Skirt_Asset) FROM dbo.avatarappearance WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE dbo.avatarappearance - -EXECUTE sp_rename N'dbo.Tmp_avatarappearance', N'avatarappearance', 'OBJECT' - -ALTER TABLE dbo.avatarappearance ADD CONSTRAINT - PK__avatarap__7DD115CC4E88ABD4 PRIMARY KEY CLUSTERED - ( - Owner - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/010_RegionStore.sql b/OpenSim/Data/MSSQL/Resources/010_RegionStore.sql deleted file mode 100644 index 74ad9c2e28..0000000000 --- a/OpenSim/Data/MSSQL/Resources/010_RegionStore.sql +++ /dev/null @@ -1,7 +0,0 @@ -BEGIN TRANSACTION - -ALTER TABLE regionsettings ADD sunvectorx float NOT NULL default 0; -ALTER TABLE regionsettings ADD sunvectory float NOT NULL default 0; -ALTER TABLE regionsettings ADD sunvectorz float NOT NULL default 0; - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/010_UserStore.sql b/OpenSim/Data/MSSQL/Resources/010_UserStore.sql deleted file mode 100644 index 0af008aa13..0000000000 --- a/OpenSim/Data/MSSQL/Resources/010_UserStore.sql +++ /dev/null @@ -1,24 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_avatarattachments - ( - UUID uniqueidentifier NOT NULL, - attachpoint int NOT NULL, - item uniqueidentifier NOT NULL, - asset uniqueidentifier NOT NULL - ) ON [PRIMARY] - -IF EXISTS(SELECT * FROM dbo.avatarattachments) - EXEC('INSERT INTO dbo.Tmp_avatarattachments (UUID, attachpoint, item, asset) - SELECT CONVERT(uniqueidentifier, UUID), attachpoint, CONVERT(uniqueidentifier, item), CONVERT(uniqueidentifier, asset) FROM dbo.avatarattachments WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE dbo.avatarattachments - -EXECUTE sp_rename N'dbo.Tmp_avatarattachments', N'avatarattachments', 'OBJECT' - -CREATE NONCLUSTERED INDEX IX_avatarattachments ON dbo.avatarattachments - ( - UUID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/011_RegionStore.sql b/OpenSim/Data/MSSQL/Resources/011_RegionStore.sql deleted file mode 100644 index 14c71a3737..0000000000 --- a/OpenSim/Data/MSSQL/Resources/011_RegionStore.sql +++ /dev/null @@ -1,6 +0,0 @@ -BEGIN TRANSACTION - -ALTER TABLE prims ADD CollisionSound char(36) not null default '00000000-0000-0000-0000-000000000000' -ALTER TABLE prims ADD CollisionSoundVolume float not null default 0.0 - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/011_UserStore.sql b/OpenSim/Data/MSSQL/Resources/011_UserStore.sql deleted file mode 100644 index 5aa064fac8..0000000000 --- a/OpenSim/Data/MSSQL/Resources/011_UserStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN TRANSACTION - -ALTER TABLE users ADD scopeID uniqueidentifier not null default '00000000-0000-0000-0000-000000000000' - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/012_RegionStore.sql b/OpenSim/Data/MSSQL/Resources/012_RegionStore.sql deleted file mode 100644 index eef8d9075c..0000000000 --- a/OpenSim/Data/MSSQL/Resources/012_RegionStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN TRANSACTION - -ALTER TABLE prims ADD LinkNumber integer not null default 0 - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/013_RegionStore.sql b/OpenSim/Data/MSSQL/Resources/013_RegionStore.sql deleted file mode 100644 index ef5d4c035c..0000000000 --- a/OpenSim/Data/MSSQL/Resources/013_RegionStore.sql +++ /dev/null @@ -1,112 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_prims - ( - UUID uniqueidentifier NOT NULL, - RegionUUID uniqueidentifier NULL, - ParentID int NULL, - CreationDate int NULL, - Name varchar(255) NULL, - SceneGroupID uniqueidentifier NULL, - Text varchar(255) NULL, - Description varchar(255) NULL, - SitName varchar(255) NULL, - TouchName varchar(255) NULL, - ObjectFlags int NULL, - CreatorID uniqueidentifier NULL, - OwnerID uniqueidentifier NULL, - GroupID uniqueidentifier NULL, - LastOwnerID uniqueidentifier NULL, - OwnerMask int NULL, - NextOwnerMask int NULL, - GroupMask int NULL, - EveryoneMask int NULL, - BaseMask int NULL, - PositionX float(53) NULL, - PositionY float(53) NULL, - PositionZ float(53) NULL, - GroupPositionX float(53) NULL, - GroupPositionY float(53) NULL, - GroupPositionZ float(53) NULL, - VelocityX float(53) NULL, - VelocityY float(53) NULL, - VelocityZ float(53) NULL, - AngularVelocityX float(53) NULL, - AngularVelocityY float(53) NULL, - AngularVelocityZ float(53) NULL, - AccelerationX float(53) NULL, - AccelerationY float(53) NULL, - AccelerationZ float(53) NULL, - RotationX float(53) NULL, - RotationY float(53) NULL, - RotationZ float(53) NULL, - RotationW float(53) NULL, - SitTargetOffsetX float(53) NULL, - SitTargetOffsetY float(53) NULL, - SitTargetOffsetZ float(53) NULL, - SitTargetOrientW float(53) NULL, - SitTargetOrientX float(53) NULL, - SitTargetOrientY float(53) NULL, - SitTargetOrientZ float(53) NULL, - PayPrice int NOT NULL DEFAULT ((0)), - PayButton1 int NOT NULL DEFAULT ((0)), - PayButton2 int NOT NULL DEFAULT ((0)), - PayButton3 int NOT NULL DEFAULT ((0)), - PayButton4 int NOT NULL DEFAULT ((0)), - LoopedSound uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'), - LoopedSoundGain float(53) NOT NULL DEFAULT ((0.0)), - TextureAnimation image NULL, - OmegaX float(53) NOT NULL DEFAULT ((0.0)), - OmegaY float(53) NOT NULL DEFAULT ((0.0)), - OmegaZ float(53) NOT NULL DEFAULT ((0.0)), - CameraEyeOffsetX float(53) NOT NULL DEFAULT ((0.0)), - CameraEyeOffsetY float(53) NOT NULL DEFAULT ((0.0)), - CameraEyeOffsetZ float(53) NOT NULL DEFAULT ((0.0)), - CameraAtOffsetX float(53) NOT NULL DEFAULT ((0.0)), - CameraAtOffsetY float(53) NOT NULL DEFAULT ((0.0)), - CameraAtOffsetZ float(53) NOT NULL DEFAULT ((0.0)), - ForceMouselook tinyint NOT NULL DEFAULT ((0)), - ScriptAccessPin int NOT NULL DEFAULT ((0)), - AllowedDrop tinyint NOT NULL DEFAULT ((0)), - DieAtEdge tinyint NOT NULL DEFAULT ((0)), - SalePrice int NOT NULL DEFAULT ((10)), - SaleType tinyint NOT NULL DEFAULT ((0)), - ColorR int NOT NULL DEFAULT ((0)), - ColorG int NOT NULL DEFAULT ((0)), - ColorB int NOT NULL DEFAULT ((0)), - ColorA int NOT NULL DEFAULT ((0)), - ParticleSystem image NULL, - ClickAction tinyint NOT NULL DEFAULT ((0)), - Material tinyint NOT NULL DEFAULT ((3)), - CollisionSound uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'), - CollisionSoundVolume float(53) NOT NULL DEFAULT ((0.0)), - LinkNumber int NOT NULL DEFAULT ((0)) - ) ON [PRIMARY] - TEXTIMAGE_ON [PRIMARY] - -IF EXISTS(SELECT * FROM dbo.prims) - EXEC('INSERT INTO dbo.Tmp_prims (UUID, RegionUUID, ParentID, CreationDate, Name, SceneGroupID, Text, Description, SitName, TouchName, ObjectFlags, CreatorID, OwnerID, GroupID, LastOwnerID, OwnerMask, NextOwnerMask, GroupMask, EveryoneMask, BaseMask, PositionX, PositionY, PositionZ, GroupPositionX, GroupPositionY, GroupPositionZ, VelocityX, VelocityY, VelocityZ, AngularVelocityX, AngularVelocityY, AngularVelocityZ, AccelerationX, AccelerationY, AccelerationZ, RotationX, RotationY, RotationZ, RotationW, SitTargetOffsetX, SitTargetOffsetY, SitTargetOffsetZ, SitTargetOrientW, SitTargetOrientX, SitTargetOrientY, SitTargetOrientZ, PayPrice, PayButton1, PayButton2, PayButton3, PayButton4, LoopedSound, LoopedSoundGain, TextureAnimation, OmegaX, OmegaY, OmegaZ, CameraEyeOffsetX, CameraEyeOffsetY, CameraEyeOffsetZ, CameraAtOffsetX, CameraAtOffsetY, CameraAtOffsetZ, ForceMouselook, ScriptAccessPin, AllowedDrop, DieAtEdge, SalePrice, SaleType, ColorR, ColorG, ColorB, ColorA, ParticleSystem, ClickAction, Material, CollisionSound, CollisionSoundVolume, LinkNumber) - SELECT CONVERT(uniqueidentifier, UUID), CONVERT(uniqueidentifier, RegionUUID), ParentID, CreationDate, Name, CONVERT(uniqueidentifier, SceneGroupID), Text, Description, SitName, TouchName, ObjectFlags, CONVERT(uniqueidentifier, CreatorID), CONVERT(uniqueidentifier, OwnerID), CONVERT(uniqueidentifier, GroupID), CONVERT(uniqueidentifier, LastOwnerID), OwnerMask, NextOwnerMask, GroupMask, EveryoneMask, BaseMask, PositionX, PositionY, PositionZ, GroupPositionX, GroupPositionY, GroupPositionZ, VelocityX, VelocityY, VelocityZ, AngularVelocityX, AngularVelocityY, AngularVelocityZ, AccelerationX, AccelerationY, AccelerationZ, RotationX, RotationY, RotationZ, RotationW, SitTargetOffsetX, SitTargetOffsetY, SitTargetOffsetZ, SitTargetOrientW, SitTargetOrientX, SitTargetOrientY, SitTargetOrientZ, PayPrice, PayButton1, PayButton2, PayButton3, PayButton4, CONVERT(uniqueidentifier, LoopedSound), LoopedSoundGain, TextureAnimation, OmegaX, OmegaY, OmegaZ, CameraEyeOffsetX, CameraEyeOffsetY, CameraEyeOffsetZ, CameraAtOffsetX, CameraAtOffsetY, CameraAtOffsetZ, ForceMouselook, ScriptAccessPin, AllowedDrop, DieAtEdge, SalePrice, SaleType, ColorR, ColorG, ColorB, ColorA, ParticleSystem, ClickAction, Material, CONVERT(uniqueidentifier, CollisionSound), CollisionSoundVolume, LinkNumber FROM dbo.prims WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE dbo.prims - -EXECUTE sp_rename N'dbo.Tmp_prims', N'prims', 'OBJECT' - -ALTER TABLE dbo.prims ADD CONSTRAINT - PK__prims__10566F31 PRIMARY KEY CLUSTERED - ( - UUID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - - -CREATE NONCLUSTERED INDEX prims_regionuuid ON dbo.prims - ( - RegionUUID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -CREATE NONCLUSTERED INDEX prims_parentid ON dbo.prims - ( - ParentID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/014_RegionStore.sql b/OpenSim/Data/MSSQL/Resources/014_RegionStore.sql deleted file mode 100644 index 02f6f55b86..0000000000 --- a/OpenSim/Data/MSSQL/Resources/014_RegionStore.sql +++ /dev/null @@ -1,49 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_primshapes - ( - UUID uniqueidentifier NOT NULL, - Shape int NULL, - ScaleX float(53) NULL, - ScaleY float(53) NULL, - ScaleZ float(53) NULL, - PCode int NULL, - PathBegin int NULL, - PathEnd int NULL, - PathScaleX int NULL, - PathScaleY int NULL, - PathShearX int NULL, - PathShearY int NULL, - PathSkew int NULL, - PathCurve int NULL, - PathRadiusOffset int NULL, - PathRevolutions int NULL, - PathTaperX int NULL, - PathTaperY int NULL, - PathTwist int NULL, - PathTwistBegin int NULL, - ProfileBegin int NULL, - ProfileEnd int NULL, - ProfileCurve int NULL, - ProfileHollow int NULL, - State int NULL, - Texture image NULL, - ExtraParams image NULL - ) ON [PRIMARY] - TEXTIMAGE_ON [PRIMARY] - -IF EXISTS(SELECT * FROM dbo.primshapes) - EXEC('INSERT INTO dbo.Tmp_primshapes (UUID, Shape, ScaleX, ScaleY, ScaleZ, PCode, PathBegin, PathEnd, PathScaleX, PathScaleY, PathShearX, PathShearY, PathSkew, PathCurve, PathRadiusOffset, PathRevolutions, PathTaperX, PathTaperY, PathTwist, PathTwistBegin, ProfileBegin, ProfileEnd, ProfileCurve, ProfileHollow, State, Texture, ExtraParams) - SELECT CONVERT(uniqueidentifier, UUID), Shape, ScaleX, ScaleY, ScaleZ, PCode, PathBegin, PathEnd, PathScaleX, PathScaleY, PathShearX, PathShearY, PathSkew, PathCurve, PathRadiusOffset, PathRevolutions, PathTaperX, PathTaperY, PathTwist, PathTwistBegin, ProfileBegin, ProfileEnd, ProfileCurve, ProfileHollow, State, Texture, ExtraParams FROM dbo.primshapes WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE dbo.primshapes - -EXECUTE sp_rename N'dbo.Tmp_primshapes', N'primshapes', 'OBJECT' - -ALTER TABLE dbo.primshapes ADD CONSTRAINT - PK__primshapes__0880433F PRIMARY KEY CLUSTERED - ( - UUID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/015_RegionStore.sql b/OpenSim/Data/MSSQL/Resources/015_RegionStore.sql deleted file mode 100644 index cbaaf88bb9..0000000000 --- a/OpenSim/Data/MSSQL/Resources/015_RegionStore.sql +++ /dev/null @@ -1,45 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_primitems - ( - itemID uniqueidentifier NOT NULL, - primID uniqueidentifier NULL, - assetID uniqueidentifier NULL, - parentFolderID uniqueidentifier NULL, - invType int NULL, - assetType int NULL, - name varchar(255) NULL, - description varchar(255) NULL, - creationDate varchar(255) NULL, - creatorID uniqueidentifier NULL, - ownerID uniqueidentifier NULL, - lastOwnerID uniqueidentifier NULL, - groupID uniqueidentifier NULL, - nextPermissions int NULL, - currentPermissions int NULL, - basePermissions int NULL, - everyonePermissions int NULL, - groupPermissions int NULL, - flags int NOT NULL DEFAULT ((0)) - ) ON [PRIMARY] - -IF EXISTS(SELECT * FROM dbo.primitems) - EXEC('INSERT INTO dbo.Tmp_primitems (itemID, primID, assetID, parentFolderID, invType, assetType, name, description, creationDate, creatorID, ownerID, lastOwnerID, groupID, nextPermissions, currentPermissions, basePermissions, everyonePermissions, groupPermissions, flags) - SELECT CONVERT(uniqueidentifier, itemID), CONVERT(uniqueidentifier, primID), CONVERT(uniqueidentifier, assetID), CONVERT(uniqueidentifier, parentFolderID), invType, assetType, name, description, creationDate, CONVERT(uniqueidentifier, creatorID), CONVERT(uniqueidentifier, ownerID), CONVERT(uniqueidentifier, lastOwnerID), CONVERT(uniqueidentifier, groupID), nextPermissions, currentPermissions, basePermissions, everyonePermissions, groupPermissions, flags FROM dbo.primitems WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE dbo.primitems - -EXECUTE sp_rename N'dbo.Tmp_primitems', N'primitems', 'OBJECT' - -ALTER TABLE dbo.primitems ADD CONSTRAINT - PK__primitems__0A688BB1 PRIMARY KEY CLUSTERED - ( - itemID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -CREATE NONCLUSTERED INDEX primitems_primid ON dbo.primitems - ( - primID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/016_RegionStore.sql b/OpenSim/Data/MSSQL/Resources/016_RegionStore.sql deleted file mode 100644 index e91da19b12..0000000000 --- a/OpenSim/Data/MSSQL/Resources/016_RegionStore.sql +++ /dev/null @@ -1,19 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_terrain - ( - RegionUUID uniqueidentifier NULL, - Revision int NULL, - Heightfield image NULL - ) ON [PRIMARY] - TEXTIMAGE_ON [PRIMARY] - -IF EXISTS(SELECT * FROM dbo.terrain) - EXEC('INSERT INTO dbo.Tmp_terrain (RegionUUID, Revision, Heightfield) - SELECT CONVERT(uniqueidentifier, RegionUUID), Revision, Heightfield FROM dbo.terrain WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE dbo.terrain - -EXECUTE sp_rename N'dbo.Tmp_terrain', N'terrain', 'OBJECT' - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/017_RegionStore.sql b/OpenSim/Data/MSSQL/Resources/017_RegionStore.sql deleted file mode 100644 index 3d3dbc0ee7..0000000000 --- a/OpenSim/Data/MSSQL/Resources/017_RegionStore.sql +++ /dev/null @@ -1,56 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_land - ( - UUID uniqueidentifier NOT NULL, - RegionUUID uniqueidentifier NULL, - LocalLandID int NULL, - Bitmap image NULL, - Name varchar(255) NULL, - Description varchar(255) NULL, - OwnerUUID uniqueidentifier NULL, - IsGroupOwned int NULL, - Area int NULL, - AuctionID int NULL, - Category int NULL, - ClaimDate int NULL, - ClaimPrice int NULL, - GroupUUID uniqueidentifier NULL, - SalePrice int NULL, - LandStatus int NULL, - LandFlags int NULL, - LandingType int NULL, - MediaAutoScale int NULL, - MediaTextureUUID uniqueidentifier NULL, - MediaURL varchar(255) NULL, - MusicURL varchar(255) NULL, - PassHours float(53) NULL, - PassPrice int NULL, - SnapshotUUID uniqueidentifier NULL, - UserLocationX float(53) NULL, - UserLocationY float(53) NULL, - UserLocationZ float(53) NULL, - UserLookAtX float(53) NULL, - UserLookAtY float(53) NULL, - UserLookAtZ float(53) NULL, - AuthbuyerID uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'), - OtherCleanTime int NOT NULL DEFAULT ((0)), - Dwell int NOT NULL DEFAULT ((0)) - ) ON [PRIMARY] - TEXTIMAGE_ON [PRIMARY] - -IF EXISTS(SELECT * FROM dbo.land) - EXEC('INSERT INTO dbo.Tmp_land (UUID, RegionUUID, LocalLandID, Bitmap, Name, Description, OwnerUUID, IsGroupOwned, Area, AuctionID, Category, ClaimDate, ClaimPrice, GroupUUID, SalePrice, LandStatus, LandFlags, LandingType, MediaAutoScale, MediaTextureUUID, MediaURL, MusicURL, PassHours, PassPrice, SnapshotUUID, UserLocationX, UserLocationY, UserLocationZ, UserLookAtX, UserLookAtY, UserLookAtZ, AuthbuyerID, OtherCleanTime, Dwell) - SELECT CONVERT(uniqueidentifier, UUID), CONVERT(uniqueidentifier, RegionUUID), LocalLandID, Bitmap, Name, Description, CONVERT(uniqueidentifier, OwnerUUID), IsGroupOwned, Area, AuctionID, Category, ClaimDate, ClaimPrice, CONVERT(uniqueidentifier, GroupUUID), SalePrice, LandStatus, LandFlags, LandingType, MediaAutoScale, CONVERT(uniqueidentifier, MediaTextureUUID), MediaURL, MusicURL, PassHours, PassPrice, CONVERT(uniqueidentifier, SnapshotUUID), UserLocationX, UserLocationY, UserLocationZ, UserLookAtX, UserLookAtY, UserLookAtZ, CONVERT(uniqueidentifier, AuthbuyerID), OtherCleanTime, Dwell FROM dbo.land WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE dbo.land - -EXECUTE sp_rename N'dbo.Tmp_land', N'land', 'OBJECT' - -ALTER TABLE dbo.land ADD CONSTRAINT - PK__land__65A475E71BFD2C07 PRIMARY KEY CLUSTERED - ( - UUID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/018_RegionStore.sql b/OpenSim/Data/MSSQL/Resources/018_RegionStore.sql deleted file mode 100644 index 6157e3536e..0000000000 --- a/OpenSim/Data/MSSQL/Resources/018_RegionStore.sql +++ /dev/null @@ -1,18 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_landaccesslist - ( - LandUUID uniqueidentifier NULL, - AccessUUID uniqueidentifier NULL, - Flags int NULL - ) ON [PRIMARY] - -IF EXISTS(SELECT * FROM dbo.landaccesslist) - EXEC('INSERT INTO dbo.Tmp_landaccesslist (LandUUID, AccessUUID, Flags) - SELECT CONVERT(uniqueidentifier, LandUUID), CONVERT(uniqueidentifier, AccessUUID), Flags FROM dbo.landaccesslist WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE dbo.landaccesslist - -EXECUTE sp_rename N'dbo.Tmp_landaccesslist', N'landaccesslist', 'OBJECT' - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/019_RegionStore.sql b/OpenSim/Data/MSSQL/Resources/019_RegionStore.sql deleted file mode 100644 index 8e613b9d09..0000000000 --- a/OpenSim/Data/MSSQL/Resources/019_RegionStore.sql +++ /dev/null @@ -1,19 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_regionban - ( - regionUUID uniqueidentifier NOT NULL, - bannedUUID uniqueidentifier NOT NULL, - bannedIp varchar(16) NOT NULL, - bannedIpHostMask varchar(16) NOT NULL - ) ON [PRIMARY] - -IF EXISTS(SELECT * FROM dbo.regionban) - EXEC('INSERT INTO dbo.Tmp_regionban (regionUUID, bannedUUID, bannedIp, bannedIpHostMask) - SELECT CONVERT(uniqueidentifier, regionUUID), CONVERT(uniqueidentifier, bannedUUID), bannedIp, bannedIpHostMask FROM dbo.regionban WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE dbo.regionban - -EXECUTE sp_rename N'dbo.Tmp_regionban', N'regionban', 'OBJECT' - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/020_RegionStore.sql b/OpenSim/Data/MSSQL/Resources/020_RegionStore.sql deleted file mode 100644 index 2ce91f6dca..0000000000 --- a/OpenSim/Data/MSSQL/Resources/020_RegionStore.sql +++ /dev/null @@ -1,58 +0,0 @@ -BEGIN TRANSACTION - -CREATE TABLE dbo.Tmp_regionsettings - ( - regionUUID uniqueidentifier NOT NULL, - block_terraform bit NOT NULL, - block_fly bit NOT NULL, - allow_damage bit NOT NULL, - restrict_pushing bit NOT NULL, - allow_land_resell bit NOT NULL, - allow_land_join_divide bit NOT NULL, - block_show_in_search bit NOT NULL, - agent_limit int NOT NULL, - object_bonus float(53) NOT NULL, - maturity int NOT NULL, - disable_scripts bit NOT NULL, - disable_collisions bit NOT NULL, - disable_physics bit NOT NULL, - terrain_texture_1 uniqueidentifier NOT NULL, - terrain_texture_2 uniqueidentifier NOT NULL, - terrain_texture_3 uniqueidentifier NOT NULL, - terrain_texture_4 uniqueidentifier NOT NULL, - elevation_1_nw float(53) NOT NULL, - elevation_2_nw float(53) NOT NULL, - elevation_1_ne float(53) NOT NULL, - elevation_2_ne float(53) NOT NULL, - elevation_1_se float(53) NOT NULL, - elevation_2_se float(53) NOT NULL, - elevation_1_sw float(53) NOT NULL, - elevation_2_sw float(53) NOT NULL, - water_height float(53) NOT NULL, - terrain_raise_limit float(53) NOT NULL, - terrain_lower_limit float(53) NOT NULL, - use_estate_sun bit NOT NULL, - fixed_sun bit NOT NULL, - sun_position float(53) NOT NULL, - covenant uniqueidentifier NULL DEFAULT (NULL), - Sandbox bit NOT NULL, - sunvectorx float(53) NOT NULL DEFAULT ((0)), - sunvectory float(53) NOT NULL DEFAULT ((0)), - sunvectorz float(53) NOT NULL DEFAULT ((0)) - ) ON [PRIMARY] - -IF EXISTS(SELECT * FROM dbo.regionsettings) - EXEC('INSERT INTO dbo.Tmp_regionsettings (regionUUID, block_terraform, block_fly, allow_damage, restrict_pushing, allow_land_resell, allow_land_join_divide, block_show_in_search, agent_limit, object_bonus, maturity, disable_scripts, disable_collisions, disable_physics, terrain_texture_1, 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_sw, water_height, terrain_raise_limit, terrain_lower_limit, use_estate_sun, fixed_sun, sun_position, covenant, Sandbox, sunvectorx, sunvectory, sunvectorz) - SELECT CONVERT(uniqueidentifier, regionUUID), block_terraform, block_fly, allow_damage, restrict_pushing, allow_land_resell, allow_land_join_divide, block_show_in_search, agent_limit, object_bonus, maturity, disable_scripts, disable_collisions, disable_physics, CONVERT(uniqueidentifier, terrain_texture_1), CONVERT(uniqueidentifier, terrain_texture_2), CONVERT(uniqueidentifier, terrain_texture_3), CONVERT(uniqueidentifier, 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_sw, water_height, terrain_raise_limit, terrain_lower_limit, use_estate_sun, fixed_sun, sun_position, CONVERT(uniqueidentifier, covenant), Sandbox, sunvectorx, sunvectory, sunvectorz FROM dbo.regionsettings WITH (HOLDLOCK TABLOCKX)') - -DROP TABLE dbo.regionsettings - -EXECUTE sp_rename N'dbo.Tmp_regionsettings', N'regionsettings', 'OBJECT' - -ALTER TABLE dbo.regionsettings ADD CONSTRAINT - PK__regionse__5B35159D21B6055D PRIMARY KEY CLUSTERED - ( - regionUUID - ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/021_RegionStore.sql b/OpenSim/Data/MSSQL/Resources/021_RegionStore.sql deleted file mode 100644 index ac59182abc..0000000000 --- a/OpenSim/Data/MSSQL/Resources/021_RegionStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN TRANSACTION - -ALTER TABLE prims ADD PassTouches bit not null default 0 - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/022_RegionStore.sql b/OpenSim/Data/MSSQL/Resources/022_RegionStore.sql deleted file mode 100644 index 421e8d3dc7..0000000000 --- a/OpenSim/Data/MSSQL/Resources/022_RegionStore.sql +++ /dev/null @@ -1,7 +0,0 @@ -BEGIN TRANSACTION - -ALTER TABLE regionsettings ADD loaded_creation_date varchar(20) -ALTER TABLE regionsettings ADD loaded_creation_time varchar(20) -ALTER TABLE regionsettings ADD loaded_creation_id varchar(64) - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/023_RegionStore.sql b/OpenSim/Data/MSSQL/Resources/023_RegionStore.sql deleted file mode 100644 index 75a16f3fb0..0000000000 --- a/OpenSim/Data/MSSQL/Resources/023_RegionStore.sql +++ /dev/null @@ -1,7 +0,0 @@ -BEGIN TRANSACTION - -ALTER TABLE regionsettings DROP COLUMN loaded_creation_date -ALTER TABLE regionsettings DROP COLUMN loaded_creation_time -ALTER TABLE regionsettings ADD loaded_creation_datetime int NOT NULL default 0 - -COMMIT diff --git a/OpenSim/Data/MSSQL/Resources/AssetStore.migrations b/OpenSim/Data/MSSQL/Resources/AssetStore.migrations new file mode 100644 index 0000000000..beb82b9fc2 --- /dev/null +++ b/OpenSim/Data/MSSQL/Resources/AssetStore.migrations @@ -0,0 +1,100 @@ +:VERSION 1 + +CREATE TABLE [assets] ( + [id] [varchar](36) NOT NULL, + [name] [varchar](64) NOT NULL, + [description] [varchar](64) NOT NULL, + [assetType] [tinyint] NOT NULL, + [local] [tinyint] NOT NULL, + [temporary] [tinyint] NOT NULL, + [data] [image] NOT NULL, +PRIMARY KEY CLUSTERED +( + [id] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] + + +:VERSION 2 + +BEGIN TRANSACTION + +CREATE TABLE Tmp_assets + ( + id varchar(36) NOT NULL, + name varchar(64) NOT NULL, + description varchar(64) NOT NULL, + assetType tinyint NOT NULL, + local bit NOT NULL, + temporary bit NOT NULL, + data image NOT NULL + ) ON [PRIMARY] + TEXTIMAGE_ON [PRIMARY] + +IF EXISTS(SELECT * FROM assets) + EXEC('INSERT INTO Tmp_assets (id, name, description, assetType, local, temporary, data) + SELECT id, name, description, assetType, CONVERT(bit, local), CONVERT(bit, temporary), data FROM assets WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE assets + +EXECUTE sp_rename N'Tmp_assets', N'assets', 'OBJECT' + +ALTER TABLE dbo.assets ADD CONSTRAINT + PK__assets__id PRIMARY KEY CLUSTERED + ( + id + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + +:VERSION 3 + +BEGIN TRANSACTION + +ALTER TABLE assets add create_time integer default 0 +ALTER TABLE assets add access_time integer default 0 + +COMMIT + + +:VERSION 4 + +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_assets + ( + id uniqueidentifier NOT NULL, + name varchar(64) NOT NULL, + description varchar(64) NOT NULL, + assetType tinyint NOT NULL, + local bit NOT NULL, + temporary bit NOT NULL, + data image NOT NULL, + create_time int NULL, + access_time int NULL + ) ON [PRIMARY] + TEXTIMAGE_ON [PRIMARY] + +IF EXISTS(SELECT * FROM dbo.assets) + EXEC('INSERT INTO dbo.Tmp_assets (id, name, description, assetType, local, temporary, data, create_time, access_time) + SELECT CONVERT(uniqueidentifier, id), name, description, assetType, local, temporary, data, create_time, access_time FROM dbo.assets WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE assets + +EXECUTE sp_rename N'Tmp_assets', N'assets', 'OBJECT' + +ALTER TABLE dbo.assets ADD CONSTRAINT + PK__assets__id PRIMARY KEY CLUSTERED + ( + id + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + +:VERSION 5 + +DELETE FROM assets WHERE id = 'dc4b9f0b-d008-45c6-96a4-01dd947ac621'; + + diff --git a/OpenSim/Data/MSSQL/Resources/001_AuthStore.sql b/OpenSim/Data/MSSQL/Resources/AuthStore.migrations similarity index 63% rename from OpenSim/Data/MSSQL/Resources/001_AuthStore.sql rename to OpenSim/Data/MSSQL/Resources/AuthStore.migrations index c70a19319b..5b90ca3d36 100644 --- a/OpenSim/Data/MSSQL/Resources/001_AuthStore.sql +++ b/OpenSim/Data/MSSQL/Resources/AuthStore.migrations @@ -1,3 +1,5 @@ +:VERSION 1 + BEGIN TRANSACTION CREATE TABLE [auth] ( @@ -14,4 +16,13 @@ CREATE TABLE [tokens] ( [validity] [datetime] NOT NULL ) ON [PRIMARY] +COMMIT + +:VERSION 2 + +BEGIN TRANSACTION + +INSERT INTO auth (UUID, passwordHash, passwordSalt, webLoginKey, accountType) SELECT [UUID] AS UUID, [passwordHash] AS passwordHash, [passwordSalt] AS passwordSalt, [webLoginKey] AS webLoginKey, 'UserAccount' as [accountType] FROM users; + + COMMIT \ No newline at end of file diff --git a/OpenSim/Data/MSSQL/Resources/001_Avatar.sql b/OpenSim/Data/MSSQL/Resources/Avatar.migrations similarity index 94% rename from OpenSim/Data/MSSQL/Resources/001_Avatar.sql rename to OpenSim/Data/MSSQL/Resources/Avatar.migrations index 48f4c00669..759e939caf 100644 --- a/OpenSim/Data/MSSQL/Resources/001_Avatar.sql +++ b/OpenSim/Data/MSSQL/Resources/Avatar.migrations @@ -1,3 +1,5 @@ +:VERSION 1 + BEGIN TRANSACTION CREATE TABLE [Avatars] ( diff --git a/OpenSim/Data/MSSQL/Resources/EstateStore.migrations b/OpenSim/Data/MSSQL/Resources/EstateStore.migrations new file mode 100644 index 0000000000..64b2d2bdb2 --- /dev/null +++ b/OpenSim/Data/MSSQL/Resources/EstateStore.migrations @@ -0,0 +1,334 @@ +:VERSION 1 + +BEGIN TRANSACTION + +CREATE TABLE [dbo].[estate_managers]( + [EstateID] [int] NOT NULL, + [uuid] [varchar](36) NOT NULL, + CONSTRAINT [PK_estate_managers] PRIMARY KEY CLUSTERED +( + [EstateID] ASC +)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] +) ON [PRIMARY]; + +CREATE TABLE [dbo].[estate_groups]( + [EstateID] [int] NOT NULL, + [uuid] [varchar](36) NOT NULL, + CONSTRAINT [PK_estate_groups] PRIMARY KEY CLUSTERED +( + [EstateID] ASC +)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] +) ON [PRIMARY]; + + +CREATE TABLE [dbo].[estate_users]( + [EstateID] [int] NOT NULL, + [uuid] [varchar](36) NOT NULL, + CONSTRAINT [PK_estate_users] PRIMARY KEY CLUSTERED +( + [EstateID] ASC +)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] +) ON [PRIMARY]; + + +CREATE TABLE [dbo].[estateban]( + [EstateID] [int] NOT NULL, + [bannedUUID] [varchar](36) NOT NULL, + [bannedIp] [varchar](16) NOT NULL, + [bannedIpHostMask] [varchar](16) NOT NULL, + [bannedNameMask] [varchar](64) NULL DEFAULT (NULL), + CONSTRAINT [PK_estateban] PRIMARY KEY CLUSTERED +( + [EstateID] ASC +)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] +) ON [PRIMARY]; + +CREATE TABLE [dbo].[estate_settings]( + [EstateID] [int] IDENTITY(1,100) NOT NULL, + [EstateName] [varchar](64) NULL DEFAULT (NULL), + [AbuseEmailToEstateOwner] [bit] NOT NULL, + [DenyAnonymous] [bit] NOT NULL, + [ResetHomeOnTeleport] [bit] NOT NULL, + [FixedSun] [bit] NOT NULL, + [DenyTransacted] [bit] NOT NULL, + [BlockDwell] [bit] NOT NULL, + [DenyIdentified] [bit] NOT NULL, + [AllowVoice] [bit] NOT NULL, + [UseGlobalTime] [bit] NOT NULL, + [PricePerMeter] [int] NOT NULL, + [TaxFree] [bit] NOT NULL, + [AllowDirectTeleport] [bit] NOT NULL, + [RedirectGridX] [int] NOT NULL, + [RedirectGridY] [int] NOT NULL, + [ParentEstateID] [int] NOT NULL, + [SunPosition] [float] NOT NULL, + [EstateSkipScripts] [bit] NOT NULL, + [BillableFactor] [float] NOT NULL, + [PublicAccess] [bit] NOT NULL, + [AbuseEmail] [varchar](255) NOT NULL, + [EstateOwner] [varchar](36) NOT NULL, + [DenyMinors] [bit] NOT NULL, + CONSTRAINT [PK_estate_settings] PRIMARY KEY CLUSTERED +( + [EstateID] ASC +)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] +) ON [PRIMARY]; + + +CREATE TABLE [dbo].[estate_map]( + [RegionID] [varchar](36) NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'), + [EstateID] [int] NOT NULL, + CONSTRAINT [PK_estate_map] PRIMARY KEY CLUSTERED +( + [RegionID] ASC +)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] +) ON [PRIMARY]; + +COMMIT + +:VERSION 2 + +BEGIN TRANSACTION + +ALTER TABLE dbo.estate_managers DROP CONSTRAINT PK_estate_managers + +CREATE NONCLUSTERED INDEX IX_estate_managers ON dbo.estate_managers + ( + EstateID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +ALTER TABLE dbo.estate_groups DROP CONSTRAINT PK_estate_groups + +CREATE NONCLUSTERED INDEX IX_estate_groups ON dbo.estate_groups + ( + EstateID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + + +ALTER TABLE dbo.estate_users DROP CONSTRAINT PK_estate_users + +CREATE NONCLUSTERED INDEX IX_estate_users ON dbo.estate_users + ( + EstateID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + +:VERSION 3 + +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_estateban + ( + EstateID int NOT NULL, + bannedUUID varchar(36) NOT NULL, + bannedIp varchar(16) NULL, + bannedIpHostMask varchar(16) NULL, + bannedNameMask varchar(64) NULL + ) ON [PRIMARY] + +IF EXISTS(SELECT * FROM dbo.estateban) + EXEC('INSERT INTO dbo.Tmp_estateban (EstateID, bannedUUID, bannedIp, bannedIpHostMask, bannedNameMask) + SELECT EstateID, bannedUUID, bannedIp, bannedIpHostMask, bannedNameMask FROM dbo.estateban') + +DROP TABLE dbo.estateban + +EXECUTE sp_rename N'dbo.Tmp_estateban', N'estateban', 'OBJECT' + +CREATE NONCLUSTERED INDEX IX_estateban ON dbo.estateban + ( + EstateID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + +:VERSION 4 + +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_estate_managers + ( + EstateID int NOT NULL, + uuid uniqueidentifier NOT NULL + ) ON [PRIMARY] + +IF EXISTS(SELECT * FROM dbo.estate_managers) + EXEC('INSERT INTO dbo.Tmp_estate_managers (EstateID, uuid) + SELECT EstateID, CONVERT(uniqueidentifier, uuid) FROM dbo.estate_managers WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE dbo.estate_managers + +EXECUTE sp_rename N'dbo.Tmp_estate_managers', N'estate_managers', 'OBJECT' + +CREATE NONCLUSTERED INDEX IX_estate_managers ON dbo.estate_managers + ( + EstateID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + +:VERSION 5 + +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_estate_groups + ( + EstateID int NOT NULL, + uuid uniqueidentifier NOT NULL + ) ON [PRIMARY] + +IF EXISTS(SELECT * FROM dbo.estate_groups) + EXEC('INSERT INTO dbo.Tmp_estate_groups (EstateID, uuid) + SELECT EstateID, CONVERT(uniqueidentifier, uuid) FROM dbo.estate_groups WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE dbo.estate_groups + +EXECUTE sp_rename N'dbo.Tmp_estate_groups', N'estate_groups', 'OBJECT' + +CREATE NONCLUSTERED INDEX IX_estate_groups ON dbo.estate_groups + ( + EstateID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + +:VERSION 6 + +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_estate_users + ( + EstateID int NOT NULL, + uuid uniqueidentifier NOT NULL + ) ON [PRIMARY] + +IF EXISTS(SELECT * FROM dbo.estate_users) + EXEC('INSERT INTO dbo.Tmp_estate_users (EstateID, uuid) + SELECT EstateID, CONVERT(uniqueidentifier, uuid) FROM dbo.estate_users WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE dbo.estate_users + +EXECUTE sp_rename N'dbo.Tmp_estate_users', N'estate_users', 'OBJECT' + +CREATE NONCLUSTERED INDEX IX_estate_users ON dbo.estate_users + ( + EstateID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + +:VERSION 7 + +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_estateban + ( + EstateID int NOT NULL, + bannedUUID uniqueidentifier NOT NULL, + bannedIp varchar(16) NULL, + bannedIpHostMask varchar(16) NULL, + bannedNameMask varchar(64) NULL + ) ON [PRIMARY] + +IF EXISTS(SELECT * FROM dbo.estateban) + EXEC('INSERT INTO dbo.Tmp_estateban (EstateID, bannedUUID, bannedIp, bannedIpHostMask, bannedNameMask) + SELECT EstateID, CONVERT(uniqueidentifier, bannedUUID), bannedIp, bannedIpHostMask, bannedNameMask FROM dbo.estateban WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE dbo.estateban + +EXECUTE sp_rename N'dbo.Tmp_estateban', N'estateban', 'OBJECT' + +CREATE NONCLUSTERED INDEX IX_estateban ON dbo.estateban + ( + EstateID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + +:VERSION 8 + +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_estate_settings + ( + EstateID int NOT NULL IDENTITY (1, 100), + EstateName varchar(64) NULL DEFAULT (NULL), + AbuseEmailToEstateOwner bit NOT NULL, + DenyAnonymous bit NOT NULL, + ResetHomeOnTeleport bit NOT NULL, + FixedSun bit NOT NULL, + DenyTransacted bit NOT NULL, + BlockDwell bit NOT NULL, + DenyIdentified bit NOT NULL, + AllowVoice bit NOT NULL, + UseGlobalTime bit NOT NULL, + PricePerMeter int NOT NULL, + TaxFree bit NOT NULL, + AllowDirectTeleport bit NOT NULL, + RedirectGridX int NOT NULL, + RedirectGridY int NOT NULL, + ParentEstateID int NOT NULL, + SunPosition float(53) NOT NULL, + EstateSkipScripts bit NOT NULL, + BillableFactor float(53) NOT NULL, + PublicAccess bit NOT NULL, + AbuseEmail varchar(255) NOT NULL, + EstateOwner uniqueidentifier NOT NULL, + DenyMinors bit NOT NULL + ) ON [PRIMARY] + +SET IDENTITY_INSERT dbo.Tmp_estate_settings ON + +IF EXISTS(SELECT * FROM dbo.estate_settings) + EXEC('INSERT INTO dbo.Tmp_estate_settings (EstateID, EstateName, AbuseEmailToEstateOwner, DenyAnonymous, ResetHomeOnTeleport, FixedSun, DenyTransacted, BlockDwell, DenyIdentified, AllowVoice, UseGlobalTime, PricePerMeter, TaxFree, AllowDirectTeleport, RedirectGridX, RedirectGridY, ParentEstateID, SunPosition, EstateSkipScripts, BillableFactor, PublicAccess, AbuseEmail, EstateOwner, DenyMinors) + SELECT EstateID, EstateName, AbuseEmailToEstateOwner, DenyAnonymous, ResetHomeOnTeleport, FixedSun, DenyTransacted, BlockDwell, DenyIdentified, AllowVoice, UseGlobalTime, PricePerMeter, TaxFree, AllowDirectTeleport, RedirectGridX, RedirectGridY, ParentEstateID, SunPosition, EstateSkipScripts, BillableFactor, PublicAccess, AbuseEmail, CONVERT(uniqueidentifier, EstateOwner), DenyMinors FROM dbo.estate_settings WITH (HOLDLOCK TABLOCKX)') + +SET IDENTITY_INSERT dbo.Tmp_estate_settings OFF + +DROP TABLE dbo.estate_settings + +EXECUTE sp_rename N'dbo.Tmp_estate_settings', N'estate_settings', 'OBJECT' + +ALTER TABLE dbo.estate_settings ADD CONSTRAINT + PK_estate_settings PRIMARY KEY CLUSTERED + ( + EstateID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + +:VERSION 9 + +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_estate_map + ( + RegionID uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'), + EstateID int NOT NULL + ) ON [PRIMARY] + +IF EXISTS(SELECT * FROM dbo.estate_map) + EXEC('INSERT INTO dbo.Tmp_estate_map (RegionID, EstateID) + SELECT CONVERT(uniqueidentifier, RegionID), EstateID FROM dbo.estate_map WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE dbo.estate_map + +EXECUTE sp_rename N'dbo.Tmp_estate_map', N'estate_map', 'OBJECT' + +ALTER TABLE dbo.estate_map ADD CONSTRAINT + PK_estate_map PRIMARY KEY CLUSTERED + ( + RegionID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + + +COMMIT + + diff --git a/OpenSim/Data/MSSQL/Resources/001_FriendsStore.sql b/OpenSim/Data/MSSQL/Resources/FriendsStore.migrations similarity index 54% rename from OpenSim/Data/MSSQL/Resources/001_FriendsStore.sql rename to OpenSim/Data/MSSQL/Resources/FriendsStore.migrations index 94d240b512..f981a91999 100644 --- a/OpenSim/Data/MSSQL/Resources/001_FriendsStore.sql +++ b/OpenSim/Data/MSSQL/Resources/FriendsStore.migrations @@ -1,3 +1,5 @@ +:VERSION 1 + BEGIN TRANSACTION CREATE TABLE [Friends] ( @@ -7,5 +9,12 @@ CREATE TABLE [Friends] ( [Offered] varchar(32) NOT NULL DEFAULT 0) ON [PRIMARY] +COMMIT + +:VERSION 2 + +BEGIN TRANSACTION + +INSERT INTO Friends (PrincipalID, Friend, Flags, Offered) SELECT [ownerID], [friendID], [friendPerms], 0 FROM userfriends; COMMIT \ No newline at end of file diff --git a/OpenSim/Data/MSSQL/Resources/GridStore.migrations b/OpenSim/Data/MSSQL/Resources/GridStore.migrations new file mode 100644 index 0000000000..d2ca27a071 --- /dev/null +++ b/OpenSim/Data/MSSQL/Resources/GridStore.migrations @@ -0,0 +1,225 @@ +:VERSION 1 + +BEGIN TRANSACTION + +CREATE TABLE [dbo].[regions]( + [regionHandle] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [regionName] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [uuid] [varchar](255) COLLATE Latin1_General_CI_AS NOT NULL, + [regionRecvKey] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [regionSecret] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [regionSendKey] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [regionDataURI] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [serverIP] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [serverPort] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [serverURI] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [locX] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [locY] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [locZ] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [eastOverrideHandle] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [westOverrideHandle] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [southOverrideHandle] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [northOverrideHandle] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [regionAssetURI] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [regionAssetRecvKey] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [regionAssetSendKey] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [regionUserURI] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [regionUserRecvKey] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [regionUserSendKey] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [regionMapTexture] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [serverHttpPort] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [serverRemotingPort] [varchar](255) COLLATE Latin1_General_CI_AS NULL, + [owner_uuid] [varchar](36) COLLATE Latin1_General_CI_AS NULL, +PRIMARY KEY CLUSTERED +( + [uuid] ASC +)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] +) ON [PRIMARY] + +COMMIT + + +:VERSION 2 + +BEGIN TRANSACTION + +CREATE TABLE Tmp_regions + ( + uuid varchar(36) COLLATE Latin1_General_CI_AS NOT NULL, + regionHandle bigint NULL, + regionName varchar(20) NULL, + regionRecvKey varchar(128) NULL, + regionSendKey varchar(128) NULL, + regionSecret varchar(128) NULL, + regionDataURI varchar(128) NULL, + serverIP varchar(64) NULL, + serverPort int NULL, + serverURI varchar(255) NULL, + locX int NULL, + locY int NULL, + locZ int NULL, + eastOverrideHandle bigint NULL, + westOverrideHandle bigint NULL, + southOverrideHandle bigint NULL, + northOverrideHandle bigint NULL, + regionAssetURI varchar(255) NULL, + regionAssetRecvKey varchar(128) NULL, + regionAssetSendKey varchar(128) NULL, + regionUserURI varchar(255) NULL, + regionUserRecvKey varchar(128) NULL, + regionUserSendKey varchar(128) NULL, + regionMapTexture varchar(36) NULL, + serverHttpPort int NULL, + serverRemotingPort int NULL, + owner_uuid varchar(36) NULL, + originUUID varchar(36) NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000') + ) ON [PRIMARY] + +IF EXISTS(SELECT * FROM regions) + EXEC('INSERT INTO Tmp_regions (uuid, regionHandle, regionName, regionRecvKey, regionSendKey, regionSecret, regionDataURI, serverIP, serverPort, serverURI, locX, locY, locZ, eastOverrideHandle, westOverrideHandle, southOverrideHandle, northOverrideHandle, regionAssetURI, regionAssetRecvKey, regionAssetSendKey, regionUserURI, regionUserRecvKey, regionUserSendKey, regionMapTexture, serverHttpPort, serverRemotingPort, owner_uuid) + SELECT CONVERT(varchar(36), uuid), CONVERT(bigint, regionHandle), CONVERT(varchar(20), regionName), CONVERT(varchar(128), regionRecvKey), CONVERT(varchar(128), regionSendKey), CONVERT(varchar(128), regionSecret), CONVERT(varchar(128), regionDataURI), CONVERT(varchar(64), serverIP), CONVERT(int, serverPort), serverURI, CONVERT(int, locX), CONVERT(int, locY), CONVERT(int, locZ), CONVERT(bigint, eastOverrideHandle), CONVERT(bigint, westOverrideHandle), CONVERT(bigint, southOverrideHandle), CONVERT(bigint, northOverrideHandle), regionAssetURI, CONVERT(varchar(128), regionAssetRecvKey), CONVERT(varchar(128), regionAssetSendKey), regionUserURI, CONVERT(varchar(128), regionUserRecvKey), CONVERT(varchar(128), regionUserSendKey), CONVERT(varchar(36), regionMapTexture), CONVERT(int, serverHttpPort), CONVERT(int, serverRemotingPort), owner_uuid FROM regions') + +DROP TABLE regions + +EXECUTE sp_rename N'Tmp_regions', N'regions', 'OBJECT' + +ALTER TABLE regions ADD CONSTRAINT + PK__regions__uuid PRIMARY KEY CLUSTERED + ( + uuid + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + +:VERSION 3 + +BEGIN TRANSACTION + +CREATE NONCLUSTERED INDEX IX_regions_name ON dbo.regions + ( + regionName + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +CREATE NONCLUSTERED INDEX IX_regions_handle ON dbo.regions + ( + regionHandle + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + + +CREATE NONCLUSTERED INDEX IX_regions_override ON dbo.regions + ( + eastOverrideHandle, + westOverrideHandle, + southOverrideHandle, + northOverrideHandle + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + +:VERSION 4 + +/* To prevent any potential data loss issues, you should review this script in detail before running it outside the context of the database designer.*/ +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_regions + ( + uuid uniqueidentifier NOT NULL, + regionHandle bigint NULL, + regionName varchar(20) NULL, + regionRecvKey varchar(128) NULL, + regionSendKey varchar(128) NULL, + regionSecret varchar(128) NULL, + regionDataURI varchar(128) NULL, + serverIP varchar(64) NULL, + serverPort int NULL, + serverURI varchar(255) NULL, + locX int NULL, + locY int NULL, + locZ int NULL, + eastOverrideHandle bigint NULL, + westOverrideHandle bigint NULL, + southOverrideHandle bigint NULL, + northOverrideHandle bigint NULL, + regionAssetURI varchar(255) NULL, + regionAssetRecvKey varchar(128) NULL, + regionAssetSendKey varchar(128) NULL, + regionUserURI varchar(255) NULL, + regionUserRecvKey varchar(128) NULL, + regionUserSendKey varchar(128) NULL, + regionMapTexture uniqueidentifier NULL, + serverHttpPort int NULL, + serverRemotingPort int NULL, + owner_uuid uniqueidentifier NOT NULL, + originUUID uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000') + ) ON [PRIMARY] + +IF EXISTS(SELECT * FROM dbo.regions) + EXEC('INSERT INTO dbo.Tmp_regions (uuid, regionHandle, regionName, regionRecvKey, regionSendKey, regionSecret, regionDataURI, serverIP, serverPort, serverURI, locX, locY, locZ, eastOverrideHandle, westOverrideHandle, southOverrideHandle, northOverrideHandle, regionAssetURI, regionAssetRecvKey, regionAssetSendKey, regionUserURI, regionUserRecvKey, regionUserSendKey, regionMapTexture, serverHttpPort, serverRemotingPort, owner_uuid, originUUID) + SELECT CONVERT(uniqueidentifier, uuid), regionHandle, regionName, regionRecvKey, regionSendKey, regionSecret, regionDataURI, serverIP, serverPort, serverURI, locX, locY, locZ, eastOverrideHandle, westOverrideHandle, southOverrideHandle, northOverrideHandle, regionAssetURI, regionAssetRecvKey, regionAssetSendKey, regionUserURI, regionUserRecvKey, regionUserSendKey, CONVERT(uniqueidentifier, regionMapTexture), serverHttpPort, serverRemotingPort, CONVERT(uniqueidentifier, owner_uuid), CONVERT(uniqueidentifier, originUUID) FROM dbo.regions WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE dbo.regions + +EXECUTE sp_rename N'dbo.Tmp_regions', N'regions', 'OBJECT' + +ALTER TABLE dbo.regions ADD CONSTRAINT + PK__regions__uuid PRIMARY KEY CLUSTERED + ( + uuid + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +CREATE NONCLUSTERED INDEX IX_regions_name ON dbo.regions + ( + regionName + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +CREATE NONCLUSTERED INDEX IX_regions_handle ON dbo.regions + ( + regionHandle + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +CREATE NONCLUSTERED INDEX IX_regions_override ON dbo.regions + ( + eastOverrideHandle, + westOverrideHandle, + southOverrideHandle, + northOverrideHandle + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + +:VERSION 5 + +BEGIN TRANSACTION + +ALTER TABLE regions ADD access int default 0; + +COMMIT + + +:VERSION 6 + +BEGIN TRANSACTION + +ALTER TABLE regions ADD scopeid uniqueidentifier default '00000000-0000-0000-0000-000000000000'; +ALTER TABLE regions ADD DEFAULT ('00000000-0000-0000-0000-000000000000') FOR [owner_uuid]; +ALTER TABLE regions ADD sizeX integer not null default 0; +ALTER TABLE regions ADD sizeY integer not null default 0; + +COMMIT + + +:VERSION 7 + +BEGIN TRANSACTION + +ALTER TABLE regions ADD [flags] integer NOT NULL DEFAULT 0; +CREATE INDEX [flags] ON regions(flags); +ALTER TABLE [regions] ADD [last_seen] integer NOT NULL DEFAULT 0; +ALTER TABLE [regions] ADD [PrincipalID] uniqueidentifier NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000'; +ALTER TABLE [regions] ADD [Token] varchar(255) NOT NULL DEFAULT 0; + +COMMIT + + diff --git a/OpenSim/Data/MSSQL/Resources/InventoryStore.migrations b/OpenSim/Data/MSSQL/Resources/InventoryStore.migrations new file mode 100644 index 0000000000..cd5dfdc1ca --- /dev/null +++ b/OpenSim/Data/MSSQL/Resources/InventoryStore.migrations @@ -0,0 +1,174 @@ +:VERSION 1 + +BEGIN TRANSACTION + +CREATE TABLE [inventoryfolders] ( + [folderID] [varchar](36) NOT NULL default '', + [agentID] [varchar](36) default NULL, + [parentFolderID] [varchar](36) default NULL, + [folderName] [varchar](64) default NULL, + [type] [smallint] NOT NULL default 0, + [version] [int] NOT NULL default 0, + PRIMARY KEY CLUSTERED +( + [folderID] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] + +CREATE NONCLUSTERED INDEX [owner] ON [inventoryfolders] +( + [agentID] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +CREATE NONCLUSTERED INDEX [parent] ON [inventoryfolders] +( + [parentFolderID] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + + +CREATE TABLE [inventoryitems] ( + [inventoryID] [varchar](36) NOT NULL default '', + [assetID] [varchar](36) default NULL, + [assetType] [int] default NULL, + [parentFolderID] [varchar](36) default NULL, + [avatarID] [varchar](36) default NULL, + [inventoryName] [varchar](64) default NULL, + [inventoryDescription] [varchar](128) default NULL, + [inventoryNextPermissions] [int] default NULL, + [inventoryCurrentPermissions] [int] default NULL, + [invType] [int] default NULL, + [creatorID] [varchar](36) default NULL, + [inventoryBasePermissions] [int] NOT NULL default 0, + [inventoryEveryOnePermissions] [int] NOT NULL default 0, + [salePrice] [int] default NULL, + [saleType] [tinyint] default NULL, + [creationDate] [int] default NULL, + [groupID] [varchar](36) default NULL, + [groupOwned] [bit] default NULL, + [flags] [int] default NULL, + PRIMARY KEY CLUSTERED +( + [inventoryID] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] + + +CREATE NONCLUSTERED INDEX [owner] ON [inventoryitems] +( + [avatarID] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +CREATE NONCLUSTERED INDEX [folder] ON [inventoryitems] +( + [parentFolderID] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + +:VERSION 2 + +BEGIN TRANSACTION + +ALTER TABLE inventoryitems ADD inventoryGroupPermissions INTEGER NOT NULL default 0 + +COMMIT + +:VERSION 3 + +/* To prevent any potential data loss issues, you should review this script in detail before running it outside the context of the database designer.*/ +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_inventoryfolders + ( + folderID uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'), + agentID uniqueidentifier NULL DEFAULT (NULL), + parentFolderID uniqueidentifier NULL DEFAULT (NULL), + folderName varchar(64) NULL DEFAULT (NULL), + type smallint NOT NULL DEFAULT ((0)), + version int NOT NULL DEFAULT ((0)) + ) ON [PRIMARY] + +IF EXISTS(SELECT * FROM dbo.inventoryfolders) + EXEC('INSERT INTO dbo.Tmp_inventoryfolders (folderID, agentID, parentFolderID, folderName, type, version) + SELECT CONVERT(uniqueidentifier, folderID), CONVERT(uniqueidentifier, agentID), CONVERT(uniqueidentifier, parentFolderID), folderName, type, version FROM dbo.inventoryfolders WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE dbo.inventoryfolders + +EXECUTE sp_rename N'dbo.Tmp_inventoryfolders', N'inventoryfolders', 'OBJECT' + +ALTER TABLE dbo.inventoryfolders ADD CONSTRAINT + PK__inventor__C2FABFB3173876EA PRIMARY KEY CLUSTERED + ( + folderID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +CREATE NONCLUSTERED INDEX owner ON dbo.inventoryfolders + ( + agentID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +CREATE NONCLUSTERED INDEX parent ON dbo.inventoryfolders + ( + parentFolderID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + +:VERSION 4 + +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_inventoryitems + ( + inventoryID uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'), + assetID uniqueidentifier NULL DEFAULT (NULL), + assetType int NULL DEFAULT (NULL), + parentFolderID uniqueidentifier NULL DEFAULT (NULL), + avatarID uniqueidentifier NULL DEFAULT (NULL), + inventoryName varchar(64) NULL DEFAULT (NULL), + inventoryDescription varchar(128) NULL DEFAULT (NULL), + inventoryNextPermissions int NULL DEFAULT (NULL), + inventoryCurrentPermissions int NULL DEFAULT (NULL), + invType int NULL DEFAULT (NULL), + creatorID uniqueidentifier NULL DEFAULT (NULL), + inventoryBasePermissions int NOT NULL DEFAULT ((0)), + inventoryEveryOnePermissions int NOT NULL DEFAULT ((0)), + salePrice int NULL DEFAULT (NULL), + saleType tinyint NULL DEFAULT (NULL), + creationDate int NULL DEFAULT (NULL), + groupID uniqueidentifier NULL DEFAULT (NULL), + groupOwned bit NULL DEFAULT (NULL), + flags int NULL DEFAULT (NULL), + inventoryGroupPermissions int NOT NULL DEFAULT ((0)) + ) ON [PRIMARY] + +IF EXISTS(SELECT * FROM dbo.inventoryitems) + EXEC('INSERT INTO dbo.Tmp_inventoryitems (inventoryID, assetID, assetType, parentFolderID, avatarID, inventoryName, inventoryDescription, inventoryNextPermissions, inventoryCurrentPermissions, invType, creatorID, inventoryBasePermissions, inventoryEveryOnePermissions, salePrice, saleType, creationDate, groupID, groupOwned, flags, inventoryGroupPermissions) + SELECT CONVERT(uniqueidentifier, inventoryID), CONVERT(uniqueidentifier, assetID), assetType, CONVERT(uniqueidentifier, parentFolderID), CONVERT(uniqueidentifier, avatarID), inventoryName, inventoryDescription, inventoryNextPermissions, inventoryCurrentPermissions, invType, CONVERT(uniqueidentifier, creatorID), inventoryBasePermissions, inventoryEveryOnePermissions, salePrice, saleType, creationDate, CONVERT(uniqueidentifier, groupID), groupOwned, flags, inventoryGroupPermissions FROM dbo.inventoryitems WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE dbo.inventoryitems + +EXECUTE sp_rename N'dbo.Tmp_inventoryitems', N'inventoryitems', 'OBJECT' + +ALTER TABLE dbo.inventoryitems ADD CONSTRAINT + PK__inventor__C4B7BC2220C1E124 PRIMARY KEY CLUSTERED + ( + inventoryID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + + +CREATE NONCLUSTERED INDEX owner ON dbo.inventoryitems + ( + avatarID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +CREATE NONCLUSTERED INDEX folder ON dbo.inventoryitems + ( + parentFolderID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + diff --git a/OpenSim/Data/MSSQL/Resources/001_LogStore.sql b/OpenSim/Data/MSSQL/Resources/LogStore.migrations similarity index 96% rename from OpenSim/Data/MSSQL/Resources/001_LogStore.sql rename to OpenSim/Data/MSSQL/Resources/LogStore.migrations index 9ece6274dd..1430d8d0ee 100644 --- a/OpenSim/Data/MSSQL/Resources/001_LogStore.sql +++ b/OpenSim/Data/MSSQL/Resources/LogStore.migrations @@ -1,3 +1,5 @@ +:VERSION 1 + BEGIN TRANSACTION CREATE TABLE [logs] ( diff --git a/OpenSim/Data/MSSQL/Resources/001_Presence.sql b/OpenSim/Data/MSSQL/Resources/Presence.migrations similarity index 81% rename from OpenSim/Data/MSSQL/Resources/001_Presence.sql rename to OpenSim/Data/MSSQL/Resources/Presence.migrations index 877881c859..35f78e1f52 100644 --- a/OpenSim/Data/MSSQL/Resources/001_Presence.sql +++ b/OpenSim/Data/MSSQL/Resources/Presence.migrations @@ -1,3 +1,5 @@ +:VERSION 1 + BEGIN TRANSACTION CREATE TABLE [Presence] ( @@ -16,4 +18,13 @@ CREATE TABLE [Presence] ( ) ON [PRIMARY] +COMMIT + +:VERSION 2 + +BEGIN TRANSACTION + +CREATE UNIQUE INDEX SessionID ON Presence(SessionID); +CREATE INDEX UserID ON Presence(UserID); + COMMIT \ No newline at end of file diff --git a/OpenSim/Data/MSSQL/Resources/RegionStore.migrations b/OpenSim/Data/MSSQL/Resources/RegionStore.migrations new file mode 100644 index 0000000000..e912d646a0 --- /dev/null +++ b/OpenSim/Data/MSSQL/Resources/RegionStore.migrations @@ -0,0 +1,929 @@ + +:VERSION 1 + +CREATE TABLE [dbo].[prims]( + [UUID] [varchar](255) NOT NULL, + [RegionUUID] [varchar](255) NULL, + [ParentID] [int] NULL, + [CreationDate] [int] NULL, + [Name] [varchar](255) NULL, + [SceneGroupID] [varchar](255) NULL, + [Text] [varchar](255) NULL, + [Description] [varchar](255) NULL, + [SitName] [varchar](255) NULL, + [TouchName] [varchar](255) NULL, + [ObjectFlags] [int] NULL, + [CreatorID] [varchar](255) NULL, + [OwnerID] [varchar](255) NULL, + [GroupID] [varchar](255) NULL, + [LastOwnerID] [varchar](255) NULL, + [OwnerMask] [int] NULL, + [NextOwnerMask] [int] NULL, + [GroupMask] [int] NULL, + [EveryoneMask] [int] NULL, + [BaseMask] [int] NULL, + [PositionX] [float] NULL, + [PositionY] [float] NULL, + [PositionZ] [float] NULL, + [GroupPositionX] [float] NULL, + [GroupPositionY] [float] NULL, + [GroupPositionZ] [float] NULL, + [VelocityX] [float] NULL, + [VelocityY] [float] NULL, + [VelocityZ] [float] NULL, + [AngularVelocityX] [float] NULL, + [AngularVelocityY] [float] NULL, + [AngularVelocityZ] [float] NULL, + [AccelerationX] [float] NULL, + [AccelerationY] [float] NULL, + [AccelerationZ] [float] NULL, + [RotationX] [float] NULL, + [RotationY] [float] NULL, + [RotationZ] [float] NULL, + [RotationW] [float] NULL, + [SitTargetOffsetX] [float] NULL, + [SitTargetOffsetY] [float] NULL, + [SitTargetOffsetZ] [float] NULL, + [SitTargetOrientW] [float] NULL, + [SitTargetOrientX] [float] NULL, + [SitTargetOrientY] [float] NULL, + [SitTargetOrientZ] [float] NULL, +PRIMARY KEY CLUSTERED +( + [UUID] ASC +)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] +) ON [PRIMARY] + +CREATE TABLE [dbo].[primshapes]( + [UUID] [varchar](255) NOT NULL, + [Shape] [int] NULL, + [ScaleX] [float] NULL, + [ScaleY] [float] NULL, + [ScaleZ] [float] NULL, + [PCode] [int] NULL, + [PathBegin] [int] NULL, + [PathEnd] [int] NULL, + [PathScaleX] [int] NULL, + [PathScaleY] [int] NULL, + [PathShearX] [int] NULL, + [PathShearY] [int] NULL, + [PathSkew] [int] NULL, + [PathCurve] [int] NULL, + [PathRadiusOffset] [int] NULL, + [PathRevolutions] [int] NULL, + [PathTaperX] [int] NULL, + [PathTaperY] [int] NULL, + [PathTwist] [int] NULL, + [PathTwistBegin] [int] NULL, + [ProfileBegin] [int] NULL, + [ProfileEnd] [int] NULL, + [ProfileCurve] [int] NULL, + [ProfileHollow] [int] NULL, + [State] [int] NULL, + [Texture] [image] NULL, + [ExtraParams] [image] NULL, +PRIMARY KEY CLUSTERED +( + [UUID] ASC +)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] +) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] + +CREATE TABLE [dbo].[primitems]( + [itemID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [primID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [assetID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [parentFolderID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [invType] [int] NULL, + [assetType] [int] NULL, + [name] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [description] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [creationDate] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [creatorID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [ownerID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [lastOwnerID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [groupID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [nextPermissions] [int] NULL, + [currentPermissions] [int] NULL, + [basePermissions] [int] NULL, + [everyonePermissions] [int] NULL, + [groupPermissions] [int] NULL, +PRIMARY KEY CLUSTERED +( + [itemID] ASC +)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] +) ON [PRIMARY] + +CREATE TABLE [dbo].[terrain]( + [RegionUUID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [Revision] [int] NULL, + [Heightfield] [image] NULL +) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] + +CREATE TABLE [dbo].[land]( + [UUID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [RegionUUID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [LocalLandID] [int] NULL, + [Bitmap] [image] NULL, + [Name] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [Description] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [OwnerUUID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [IsGroupOwned] [int] NULL, + [Area] [int] NULL, + [AuctionID] [int] NULL, + [Category] [int] NULL, + [ClaimDate] [int] NULL, + [ClaimPrice] [int] NULL, + [GroupUUID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [SalePrice] [int] NULL, + [LandStatus] [int] NULL, + [LandFlags] [int] NULL, + [LandingType] [int] NULL, + [MediaAutoScale] [int] NULL, + [MediaTextureUUID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [MediaURL] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [MusicURL] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [PassHours] [float] NULL, + [PassPrice] [int] NULL, + [SnapshotUUID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [UserLocationX] [float] NULL, + [UserLocationY] [float] NULL, + [UserLocationZ] [float] NULL, + [UserLookAtX] [float] NULL, + [UserLookAtY] [float] NULL, + [UserLookAtZ] [float] NULL, +PRIMARY KEY CLUSTERED +( + [UUID] ASC +)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] +) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] + +CREATE TABLE [dbo].[landaccesslist]( + [LandUUID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [AccessUUID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [Flags] [int] NULL +) ON [PRIMARY] + +:VERSION 2 + +BEGIN TRANSACTION + +CREATE TABLE regionban ( + [regionUUID] VARCHAR(36) NOT NULL, + [bannedUUID] VARCHAR(36) NOT NULL, + [bannedIp] VARCHAR(16) NOT NULL, + [bannedIpHostMask] VARCHAR(16) NOT NULL) + +create table [dbo].[regionsettings] ( + [regionUUID] [varchar](36) not null, + [block_terraform] [bit] not null, + [block_fly] [bit] not null, + [allow_damage] [bit] not null, + [restrict_pushing] [bit] not null, + [allow_land_resell] [bit] not null, + [allow_land_join_divide] [bit] not null, + [block_show_in_search] [bit] not null, + [agent_limit] [int] not null, + [object_bonus] [float] not null, + [maturity] [int] not null, + [disable_scripts] [bit] not null, + [disable_collisions] [bit] not null, + [disable_physics] [bit] not null, + [terrain_texture_1] [varchar](36) not null, + [terrain_texture_2] [varchar](36) not null, + [terrain_texture_3] [varchar](36) not null, + [terrain_texture_4] [varchar](36) not null, + [elevation_1_nw] [float] not null, + [elevation_2_nw] [float] not null, + [elevation_1_ne] [float] not null, + [elevation_2_ne] [float] not null, + [elevation_1_se] [float] not null, + [elevation_2_se] [float] not null, + [elevation_1_sw] [float] not null, + [elevation_2_sw] [float] not null, + [water_height] [float] not null, + [terrain_raise_limit] [float] not null, + [terrain_lower_limit] [float] not null, + [use_estate_sun] [bit] not null, + [fixed_sun] [bit] not null, + [sun_position] [float] not null, + [covenant] [varchar](36) default NULL, + [Sandbox] [bit] NOT NULL, +PRIMARY KEY CLUSTERED +( + [regionUUID] ASC +)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] +) ON [PRIMARY] + +COMMIT + +:VERSION 3 + +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_prims + ( + UUID varchar(36) NOT NULL, + RegionUUID varchar(36) NULL, + ParentID int NULL, + CreationDate int NULL, + Name varchar(255) NULL, + SceneGroupID varchar(36) NULL, + Text varchar(255) NULL, + Description varchar(255) NULL, + SitName varchar(255) NULL, + TouchName varchar(255) NULL, + ObjectFlags int NULL, + CreatorID varchar(36) NULL, + OwnerID varchar(36) NULL, + GroupID varchar(36) NULL, + LastOwnerID varchar(36) NULL, + OwnerMask int NULL, + NextOwnerMask int NULL, + GroupMask int NULL, + EveryoneMask int NULL, + BaseMask int NULL, + PositionX float(53) NULL, + PositionY float(53) NULL, + PositionZ float(53) NULL, + GroupPositionX float(53) NULL, + GroupPositionY float(53) NULL, + GroupPositionZ float(53) NULL, + VelocityX float(53) NULL, + VelocityY float(53) NULL, + VelocityZ float(53) NULL, + AngularVelocityX float(53) NULL, + AngularVelocityY float(53) NULL, + AngularVelocityZ float(53) NULL, + AccelerationX float(53) NULL, + AccelerationY float(53) NULL, + AccelerationZ float(53) NULL, + RotationX float(53) NULL, + RotationY float(53) NULL, + RotationZ float(53) NULL, + RotationW float(53) NULL, + SitTargetOffsetX float(53) NULL, + SitTargetOffsetY float(53) NULL, + SitTargetOffsetZ float(53) NULL, + SitTargetOrientW float(53) NULL, + SitTargetOrientX float(53) NULL, + SitTargetOrientY float(53) NULL, + SitTargetOrientZ float(53) NULL + ) ON [PRIMARY] + +IF EXISTS(SELECT * FROM dbo.prims) + EXEC('INSERT INTO dbo.Tmp_prims (UUID, RegionUUID, ParentID, CreationDate, Name, SceneGroupID, Text, Description, SitName, TouchName, ObjectFlags, CreatorID, OwnerID, GroupID, LastOwnerID, OwnerMask, NextOwnerMask, GroupMask, EveryoneMask, BaseMask, PositionX, PositionY, PositionZ, GroupPositionX, GroupPositionY, GroupPositionZ, VelocityX, VelocityY, VelocityZ, AngularVelocityX, AngularVelocityY, AngularVelocityZ, AccelerationX, AccelerationY, AccelerationZ, RotationX, RotationY, RotationZ, RotationW, SitTargetOffsetX, SitTargetOffsetY, SitTargetOffsetZ, SitTargetOrientW, SitTargetOrientX, SitTargetOrientY, SitTargetOrientZ) + SELECT CONVERT(varchar(36), UUID), CONVERT(varchar(36), RegionUUID), ParentID, CreationDate, Name, CONVERT(varchar(36), SceneGroupID), Text, Description, SitName, TouchName, ObjectFlags, CONVERT(varchar(36), CreatorID), CONVERT(varchar(36), OwnerID), CONVERT(varchar(36), GroupID), CONVERT(varchar(36), LastOwnerID), OwnerMask, NextOwnerMask, GroupMask, EveryoneMask, BaseMask, PositionX, PositionY, PositionZ, GroupPositionX, GroupPositionY, GroupPositionZ, VelocityX, VelocityY, VelocityZ, AngularVelocityX, AngularVelocityY, AngularVelocityZ, AccelerationX, AccelerationY, AccelerationZ, RotationX, RotationY, RotationZ, RotationW, SitTargetOffsetX, SitTargetOffsetY, SitTargetOffsetZ, SitTargetOrientW, SitTargetOrientX, SitTargetOrientY, SitTargetOrientZ FROM dbo.prims WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE dbo.prims + +EXECUTE sp_rename N'dbo.Tmp_prims', N'prims', 'OBJECT' + +ALTER TABLE dbo.prims ADD CONSTRAINT + PK__prims__10566F31 PRIMARY KEY CLUSTERED + ( + UUID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + +:VERSION 4 + +BEGIN TRANSACTION + +CREATE TABLE Tmp_primitems + ( + itemID varchar(36) NOT NULL, + primID varchar(36) NULL, + assetID varchar(36) NULL, + parentFolderID varchar(36) NULL, + invType int NULL, + assetType int NULL, + name varchar(255) NULL, + description varchar(255) NULL, + creationDate varchar(255) NULL, + creatorID varchar(36) NULL, + ownerID varchar(36) NULL, + lastOwnerID varchar(36) NULL, + groupID varchar(36) NULL, + nextPermissions int NULL, + currentPermissions int NULL, + basePermissions int NULL, + everyonePermissions int NULL, + groupPermissions int NULL + ) ON [PRIMARY] + +IF EXISTS(SELECT * FROM primitems) + EXEC('INSERT INTO Tmp_primitems (itemID, primID, assetID, parentFolderID, invType, assetType, name, description, creationDate, creatorID, ownerID, lastOwnerID, groupID, nextPermissions, currentPermissions, basePermissions, everyonePermissions, groupPermissions) + SELECT CONVERT(varchar(36), itemID), CONVERT(varchar(36), primID), CONVERT(varchar(36), assetID), CONVERT(varchar(36), parentFolderID), invType, assetType, name, description, creationDate, CONVERT(varchar(36), creatorID), CONVERT(varchar(36), ownerID), CONVERT(varchar(36), lastOwnerID), CONVERT(varchar(36), groupID), nextPermissions, currentPermissions, basePermissions, everyonePermissions, groupPermissions') + +DROP TABLE primitems + +EXECUTE sp_rename N'Tmp_primitems', N'primitems', 'OBJECT' + +ALTER TABLE primitems ADD CONSTRAINT + PK__primitems__0A688BB1 PRIMARY KEY CLUSTERED + ( + itemID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + + +COMMIT + + +:VERSION 5 + +BEGIN TRANSACTION + +CREATE TABLE Tmp_primshapes + ( + UUID varchar(36) NOT NULL, + Shape int NULL, + ScaleX float(53) NULL, + ScaleY float(53) NULL, + ScaleZ float(53) NULL, + PCode int NULL, + PathBegin int NULL, + PathEnd int NULL, + PathScaleX int NULL, + PathScaleY int NULL, + PathShearX int NULL, + PathShearY int NULL, + PathSkew int NULL, + PathCurve int NULL, + PathRadiusOffset int NULL, + PathRevolutions int NULL, + PathTaperX int NULL, + PathTaperY int NULL, + PathTwist int NULL, + PathTwistBegin int NULL, + ProfileBegin int NULL, + ProfileEnd int NULL, + ProfileCurve int NULL, + ProfileHollow int NULL, + State int NULL, + Texture image NULL, + ExtraParams image NULL + ) ON [PRIMARY] + TEXTIMAGE_ON [PRIMARY] + +IF EXISTS(SELECT * FROM primshapes) + EXEC('INSERT INTO Tmp_primshapes (UUID, Shape, ScaleX, ScaleY, ScaleZ, PCode, PathBegin, PathEnd, PathScaleX, PathScaleY, PathShearX, PathShearY, PathSkew, PathCurve, PathRadiusOffset, PathRevolutions, PathTaperX, PathTaperY, PathTwist, PathTwistBegin, ProfileBegin, ProfileEnd, ProfileCurve, ProfileHollow, State, Texture, ExtraParams) + SELECT CONVERT(varchar(36), UUID), Shape, ScaleX, ScaleY, ScaleZ, PCode, PathBegin, PathEnd, PathScaleX, PathScaleY, PathShearX, PathShearY, PathSkew, PathCurve, PathRadiusOffset, PathRevolutions, PathTaperX, PathTaperY, PathTwist, PathTwistBegin, ProfileBegin, ProfileEnd, ProfileCurve, ProfileHollow, State, Texture, ExtraParams FROM primshapes WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE primshapes + +EXECUTE sp_rename N'Tmp_primshapes', N'primshapes', 'OBJECT' + +ALTER TABLE primshapes ADD CONSTRAINT + PK__primshapes__0880433F PRIMARY KEY CLUSTERED + ( + UUID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + +:VERSION 6 + +BEGIN TRANSACTION + +ALTER TABLE prims ADD PayPrice int not null default 0 +ALTER TABLE prims ADD PayButton1 int not null default 0 +ALTER TABLE prims ADD PayButton2 int not null default 0 +ALTER TABLE prims ADD PayButton3 int not null default 0 +ALTER TABLE prims ADD PayButton4 int not null default 0 +ALTER TABLE prims ADD LoopedSound varchar(36) not null default '00000000-0000-0000-0000-000000000000'; +ALTER TABLE prims ADD LoopedSoundGain float not null default 0.0; +ALTER TABLE prims ADD TextureAnimation image +ALTER TABLE prims ADD OmegaX float not null default 0.0 +ALTER TABLE prims ADD OmegaY float not null default 0.0 +ALTER TABLE prims ADD OmegaZ float not null default 0.0 +ALTER TABLE prims ADD CameraEyeOffsetX float not null default 0.0 +ALTER TABLE prims ADD CameraEyeOffsetY float not null default 0.0 +ALTER TABLE prims ADD CameraEyeOffsetZ float not null default 0.0 +ALTER TABLE prims ADD CameraAtOffsetX float not null default 0.0 +ALTER TABLE prims ADD CameraAtOffsetY float not null default 0.0 +ALTER TABLE prims ADD CameraAtOffsetZ float not null default 0.0 +ALTER TABLE prims ADD ForceMouselook tinyint not null default 0 +ALTER TABLE prims ADD ScriptAccessPin int not null default 0 +ALTER TABLE prims ADD AllowedDrop tinyint not null default 0 +ALTER TABLE prims ADD DieAtEdge tinyint not null default 0 +ALTER TABLE prims ADD SalePrice int not null default 10 +ALTER TABLE prims ADD SaleType tinyint not null default 0 + +ALTER TABLE primitems add flags integer not null default 0 + +ALTER TABLE land ADD AuthbuyerID varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000' + +CREATE index prims_regionuuid on prims(RegionUUID) +CREATE index prims_parentid on prims(ParentID) + +CREATE index primitems_primid on primitems(primID) + +COMMIT + + +:VERSION 7 + +BEGIN TRANSACTION + +ALTER TABLE prims ADD ColorR int not null default 0; +ALTER TABLE prims ADD ColorG int not null default 0; +ALTER TABLE prims ADD ColorB int not null default 0; +ALTER TABLE prims ADD ColorA int not null default 0; +ALTER TABLE prims ADD ParticleSystem IMAGE; +ALTER TABLE prims ADD ClickAction tinyint NOT NULL default 0; + +COMMIT + + +:VERSION 8 + +BEGIN TRANSACTION + +ALTER TABLE land ADD OtherCleanTime integer NOT NULL default 0; +ALTER TABLE land ADD Dwell integer NOT NULL default 0; + +COMMIT + +:VERSION 9 + +BEGIN TRANSACTION + +ALTER TABLE prims ADD Material tinyint NOT NULL default 3 + +COMMIT + + +:VERSION 10 + +BEGIN TRANSACTION + +ALTER TABLE regionsettings ADD sunvectorx float NOT NULL default 0; +ALTER TABLE regionsettings ADD sunvectory float NOT NULL default 0; +ALTER TABLE regionsettings ADD sunvectorz float NOT NULL default 0; + +COMMIT + + +:VERSION 11 + +BEGIN TRANSACTION + +ALTER TABLE prims ADD CollisionSound char(36) not null default '00000000-0000-0000-0000-000000000000' +ALTER TABLE prims ADD CollisionSoundVolume float not null default 0.0 + +COMMIT + + +:VERSION 12 + +BEGIN TRANSACTION + +ALTER TABLE prims ADD LinkNumber integer not null default 0 + +COMMIT + + +:VERSION 13 + +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_prims + ( + UUID uniqueidentifier NOT NULL, + RegionUUID uniqueidentifier NULL, + ParentID int NULL, + CreationDate int NULL, + Name varchar(255) NULL, + SceneGroupID uniqueidentifier NULL, + Text varchar(255) NULL, + Description varchar(255) NULL, + SitName varchar(255) NULL, + TouchName varchar(255) NULL, + ObjectFlags int NULL, + CreatorID uniqueidentifier NULL, + OwnerID uniqueidentifier NULL, + GroupID uniqueidentifier NULL, + LastOwnerID uniqueidentifier NULL, + OwnerMask int NULL, + NextOwnerMask int NULL, + GroupMask int NULL, + EveryoneMask int NULL, + BaseMask int NULL, + PositionX float(53) NULL, + PositionY float(53) NULL, + PositionZ float(53) NULL, + GroupPositionX float(53) NULL, + GroupPositionY float(53) NULL, + GroupPositionZ float(53) NULL, + VelocityX float(53) NULL, + VelocityY float(53) NULL, + VelocityZ float(53) NULL, + AngularVelocityX float(53) NULL, + AngularVelocityY float(53) NULL, + AngularVelocityZ float(53) NULL, + AccelerationX float(53) NULL, + AccelerationY float(53) NULL, + AccelerationZ float(53) NULL, + RotationX float(53) NULL, + RotationY float(53) NULL, + RotationZ float(53) NULL, + RotationW float(53) NULL, + SitTargetOffsetX float(53) NULL, + SitTargetOffsetY float(53) NULL, + SitTargetOffsetZ float(53) NULL, + SitTargetOrientW float(53) NULL, + SitTargetOrientX float(53) NULL, + SitTargetOrientY float(53) NULL, + SitTargetOrientZ float(53) NULL, + PayPrice int NOT NULL DEFAULT ((0)), + PayButton1 int NOT NULL DEFAULT ((0)), + PayButton2 int NOT NULL DEFAULT ((0)), + PayButton3 int NOT NULL DEFAULT ((0)), + PayButton4 int NOT NULL DEFAULT ((0)), + LoopedSound uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'), + LoopedSoundGain float(53) NOT NULL DEFAULT ((0.0)), + TextureAnimation image NULL, + OmegaX float(53) NOT NULL DEFAULT ((0.0)), + OmegaY float(53) NOT NULL DEFAULT ((0.0)), + OmegaZ float(53) NOT NULL DEFAULT ((0.0)), + CameraEyeOffsetX float(53) NOT NULL DEFAULT ((0.0)), + CameraEyeOffsetY float(53) NOT NULL DEFAULT ((0.0)), + CameraEyeOffsetZ float(53) NOT NULL DEFAULT ((0.0)), + CameraAtOffsetX float(53) NOT NULL DEFAULT ((0.0)), + CameraAtOffsetY float(53) NOT NULL DEFAULT ((0.0)), + CameraAtOffsetZ float(53) NOT NULL DEFAULT ((0.0)), + ForceMouselook tinyint NOT NULL DEFAULT ((0)), + ScriptAccessPin int NOT NULL DEFAULT ((0)), + AllowedDrop tinyint NOT NULL DEFAULT ((0)), + DieAtEdge tinyint NOT NULL DEFAULT ((0)), + SalePrice int NOT NULL DEFAULT ((10)), + SaleType tinyint NOT NULL DEFAULT ((0)), + ColorR int NOT NULL DEFAULT ((0)), + ColorG int NOT NULL DEFAULT ((0)), + ColorB int NOT NULL DEFAULT ((0)), + ColorA int NOT NULL DEFAULT ((0)), + ParticleSystem image NULL, + ClickAction tinyint NOT NULL DEFAULT ((0)), + Material tinyint NOT NULL DEFAULT ((3)), + CollisionSound uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'), + CollisionSoundVolume float(53) NOT NULL DEFAULT ((0.0)), + LinkNumber int NOT NULL DEFAULT ((0)) + ) ON [PRIMARY] + TEXTIMAGE_ON [PRIMARY] + +IF EXISTS(SELECT * FROM dbo.prims) + EXEC('INSERT INTO dbo.Tmp_prims (UUID, RegionUUID, ParentID, CreationDate, Name, SceneGroupID, Text, Description, SitName, TouchName, ObjectFlags, CreatorID, OwnerID, GroupID, LastOwnerID, OwnerMask, NextOwnerMask, GroupMask, EveryoneMask, BaseMask, PositionX, PositionY, PositionZ, GroupPositionX, GroupPositionY, GroupPositionZ, VelocityX, VelocityY, VelocityZ, AngularVelocityX, AngularVelocityY, AngularVelocityZ, AccelerationX, AccelerationY, AccelerationZ, RotationX, RotationY, RotationZ, RotationW, SitTargetOffsetX, SitTargetOffsetY, SitTargetOffsetZ, SitTargetOrientW, SitTargetOrientX, SitTargetOrientY, SitTargetOrientZ, PayPrice, PayButton1, PayButton2, PayButton3, PayButton4, LoopedSound, LoopedSoundGain, TextureAnimation, OmegaX, OmegaY, OmegaZ, CameraEyeOffsetX, CameraEyeOffsetY, CameraEyeOffsetZ, CameraAtOffsetX, CameraAtOffsetY, CameraAtOffsetZ, ForceMouselook, ScriptAccessPin, AllowedDrop, DieAtEdge, SalePrice, SaleType, ColorR, ColorG, ColorB, ColorA, ParticleSystem, ClickAction, Material, CollisionSound, CollisionSoundVolume, LinkNumber) + SELECT CONVERT(uniqueidentifier, UUID), CONVERT(uniqueidentifier, RegionUUID), ParentID, CreationDate, Name, CONVERT(uniqueidentifier, SceneGroupID), Text, Description, SitName, TouchName, ObjectFlags, CONVERT(uniqueidentifier, CreatorID), CONVERT(uniqueidentifier, OwnerID), CONVERT(uniqueidentifier, GroupID), CONVERT(uniqueidentifier, LastOwnerID), OwnerMask, NextOwnerMask, GroupMask, EveryoneMask, BaseMask, PositionX, PositionY, PositionZ, GroupPositionX, GroupPositionY, GroupPositionZ, VelocityX, VelocityY, VelocityZ, AngularVelocityX, AngularVelocityY, AngularVelocityZ, AccelerationX, AccelerationY, AccelerationZ, RotationX, RotationY, RotationZ, RotationW, SitTargetOffsetX, SitTargetOffsetY, SitTargetOffsetZ, SitTargetOrientW, SitTargetOrientX, SitTargetOrientY, SitTargetOrientZ, PayPrice, PayButton1, PayButton2, PayButton3, PayButton4, CONVERT(uniqueidentifier, LoopedSound), LoopedSoundGain, TextureAnimation, OmegaX, OmegaY, OmegaZ, CameraEyeOffsetX, CameraEyeOffsetY, CameraEyeOffsetZ, CameraAtOffsetX, CameraAtOffsetY, CameraAtOffsetZ, ForceMouselook, ScriptAccessPin, AllowedDrop, DieAtEdge, SalePrice, SaleType, ColorR, ColorG, ColorB, ColorA, ParticleSystem, ClickAction, Material, CONVERT(uniqueidentifier, CollisionSound), CollisionSoundVolume, LinkNumber FROM dbo.prims WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE dbo.prims + +EXECUTE sp_rename N'dbo.Tmp_prims', N'prims', 'OBJECT' + +ALTER TABLE dbo.prims ADD CONSTRAINT + PK__prims__10566F31 PRIMARY KEY CLUSTERED + ( + UUID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + + +CREATE NONCLUSTERED INDEX prims_regionuuid ON dbo.prims + ( + RegionUUID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +CREATE NONCLUSTERED INDEX prims_parentid ON dbo.prims + ( + ParentID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + +:VERSION 14 + +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_primshapes + ( + UUID uniqueidentifier NOT NULL, + Shape int NULL, + ScaleX float(53) NULL, + ScaleY float(53) NULL, + ScaleZ float(53) NULL, + PCode int NULL, + PathBegin int NULL, + PathEnd int NULL, + PathScaleX int NULL, + PathScaleY int NULL, + PathShearX int NULL, + PathShearY int NULL, + PathSkew int NULL, + PathCurve int NULL, + PathRadiusOffset int NULL, + PathRevolutions int NULL, + PathTaperX int NULL, + PathTaperY int NULL, + PathTwist int NULL, + PathTwistBegin int NULL, + ProfileBegin int NULL, + ProfileEnd int NULL, + ProfileCurve int NULL, + ProfileHollow int NULL, + State int NULL, + Texture image NULL, + ExtraParams image NULL + ) ON [PRIMARY] + TEXTIMAGE_ON [PRIMARY] + +IF EXISTS(SELECT * FROM dbo.primshapes) + EXEC('INSERT INTO dbo.Tmp_primshapes (UUID, Shape, ScaleX, ScaleY, ScaleZ, PCode, PathBegin, PathEnd, PathScaleX, PathScaleY, PathShearX, PathShearY, PathSkew, PathCurve, PathRadiusOffset, PathRevolutions, PathTaperX, PathTaperY, PathTwist, PathTwistBegin, ProfileBegin, ProfileEnd, ProfileCurve, ProfileHollow, State, Texture, ExtraParams) + SELECT CONVERT(uniqueidentifier, UUID), Shape, ScaleX, ScaleY, ScaleZ, PCode, PathBegin, PathEnd, PathScaleX, PathScaleY, PathShearX, PathShearY, PathSkew, PathCurve, PathRadiusOffset, PathRevolutions, PathTaperX, PathTaperY, PathTwist, PathTwistBegin, ProfileBegin, ProfileEnd, ProfileCurve, ProfileHollow, State, Texture, ExtraParams FROM dbo.primshapes WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE dbo.primshapes + +EXECUTE sp_rename N'dbo.Tmp_primshapes', N'primshapes', 'OBJECT' + +ALTER TABLE dbo.primshapes ADD CONSTRAINT + PK__primshapes__0880433F PRIMARY KEY CLUSTERED + ( + UUID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + +:VERSION 15 + +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_primitems + ( + itemID uniqueidentifier NOT NULL, + primID uniqueidentifier NULL, + assetID uniqueidentifier NULL, + parentFolderID uniqueidentifier NULL, + invType int NULL, + assetType int NULL, + name varchar(255) NULL, + description varchar(255) NULL, + creationDate varchar(255) NULL, + creatorID uniqueidentifier NULL, + ownerID uniqueidentifier NULL, + lastOwnerID uniqueidentifier NULL, + groupID uniqueidentifier NULL, + nextPermissions int NULL, + currentPermissions int NULL, + basePermissions int NULL, + everyonePermissions int NULL, + groupPermissions int NULL, + flags int NOT NULL DEFAULT ((0)) + ) ON [PRIMARY] + +IF EXISTS(SELECT * FROM dbo.primitems) + EXEC('INSERT INTO dbo.Tmp_primitems (itemID, primID, assetID, parentFolderID, invType, assetType, name, description, creationDate, creatorID, ownerID, lastOwnerID, groupID, nextPermissions, currentPermissions, basePermissions, everyonePermissions, groupPermissions, flags) + SELECT CONVERT(uniqueidentifier, itemID), CONVERT(uniqueidentifier, primID), CONVERT(uniqueidentifier, assetID), CONVERT(uniqueidentifier, parentFolderID), invType, assetType, name, description, creationDate, CONVERT(uniqueidentifier, creatorID), CONVERT(uniqueidentifier, ownerID), CONVERT(uniqueidentifier, lastOwnerID), CONVERT(uniqueidentifier, groupID), nextPermissions, currentPermissions, basePermissions, everyonePermissions, groupPermissions, flags FROM dbo.primitems WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE dbo.primitems + +EXECUTE sp_rename N'dbo.Tmp_primitems', N'primitems', 'OBJECT' + +ALTER TABLE dbo.primitems ADD CONSTRAINT + PK__primitems__0A688BB1 PRIMARY KEY CLUSTERED + ( + itemID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +CREATE NONCLUSTERED INDEX primitems_primid ON dbo.primitems + ( + primID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + +:VERSION 16 + + +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_terrain + ( + RegionUUID uniqueidentifier NULL, + Revision int NULL, + Heightfield image NULL + ) ON [PRIMARY] + TEXTIMAGE_ON [PRIMARY] + +IF EXISTS(SELECT * FROM dbo.terrain) + EXEC('INSERT INTO dbo.Tmp_terrain (RegionUUID, Revision, Heightfield) + SELECT CONVERT(uniqueidentifier, RegionUUID), Revision, Heightfield FROM dbo.terrain WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE dbo.terrain + +EXECUTE sp_rename N'dbo.Tmp_terrain', N'terrain', 'OBJECT' + +COMMIT + + +:VERSION 17 + +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_land + ( + UUID uniqueidentifier NOT NULL, + RegionUUID uniqueidentifier NULL, + LocalLandID int NULL, + Bitmap image NULL, + Name varchar(255) NULL, + Description varchar(255) NULL, + OwnerUUID uniqueidentifier NULL, + IsGroupOwned int NULL, + Area int NULL, + AuctionID int NULL, + Category int NULL, + ClaimDate int NULL, + ClaimPrice int NULL, + GroupUUID uniqueidentifier NULL, + SalePrice int NULL, + LandStatus int NULL, + LandFlags int NULL, + LandingType int NULL, + MediaAutoScale int NULL, + MediaTextureUUID uniqueidentifier NULL, + MediaURL varchar(255) NULL, + MusicURL varchar(255) NULL, + PassHours float(53) NULL, + PassPrice int NULL, + SnapshotUUID uniqueidentifier NULL, + UserLocationX float(53) NULL, + UserLocationY float(53) NULL, + UserLocationZ float(53) NULL, + UserLookAtX float(53) NULL, + UserLookAtY float(53) NULL, + UserLookAtZ float(53) NULL, + AuthbuyerID uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'), + OtherCleanTime int NOT NULL DEFAULT ((0)), + Dwell int NOT NULL DEFAULT ((0)) + ) ON [PRIMARY] + TEXTIMAGE_ON [PRIMARY] + +IF EXISTS(SELECT * FROM dbo.land) + EXEC('INSERT INTO dbo.Tmp_land (UUID, RegionUUID, LocalLandID, Bitmap, Name, Description, OwnerUUID, IsGroupOwned, Area, AuctionID, Category, ClaimDate, ClaimPrice, GroupUUID, SalePrice, LandStatus, LandFlags, LandingType, MediaAutoScale, MediaTextureUUID, MediaURL, MusicURL, PassHours, PassPrice, SnapshotUUID, UserLocationX, UserLocationY, UserLocationZ, UserLookAtX, UserLookAtY, UserLookAtZ, AuthbuyerID, OtherCleanTime, Dwell) + SELECT CONVERT(uniqueidentifier, UUID), CONVERT(uniqueidentifier, RegionUUID), LocalLandID, Bitmap, Name, Description, CONVERT(uniqueidentifier, OwnerUUID), IsGroupOwned, Area, AuctionID, Category, ClaimDate, ClaimPrice, CONVERT(uniqueidentifier, GroupUUID), SalePrice, LandStatus, LandFlags, LandingType, MediaAutoScale, CONVERT(uniqueidentifier, MediaTextureUUID), MediaURL, MusicURL, PassHours, PassPrice, CONVERT(uniqueidentifier, SnapshotUUID), UserLocationX, UserLocationY, UserLocationZ, UserLookAtX, UserLookAtY, UserLookAtZ, CONVERT(uniqueidentifier, AuthbuyerID), OtherCleanTime, Dwell FROM dbo.land WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE dbo.land + +EXECUTE sp_rename N'dbo.Tmp_land', N'land', 'OBJECT' + +ALTER TABLE dbo.land ADD CONSTRAINT + PK__land__65A475E71BFD2C07 PRIMARY KEY CLUSTERED + ( + UUID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + + +:VERSION 18 + +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_landaccesslist + ( + LandUUID uniqueidentifier NULL, + AccessUUID uniqueidentifier NULL, + Flags int NULL + ) ON [PRIMARY] + +IF EXISTS(SELECT * FROM dbo.landaccesslist) + EXEC('INSERT INTO dbo.Tmp_landaccesslist (LandUUID, AccessUUID, Flags) + SELECT CONVERT(uniqueidentifier, LandUUID), CONVERT(uniqueidentifier, AccessUUID), Flags FROM dbo.landaccesslist WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE dbo.landaccesslist + +EXECUTE sp_rename N'dbo.Tmp_landaccesslist', N'landaccesslist', 'OBJECT' + +COMMIT + + + +:VERSION 19 + +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_regionban + ( + regionUUID uniqueidentifier NOT NULL, + bannedUUID uniqueidentifier NOT NULL, + bannedIp varchar(16) NOT NULL, + bannedIpHostMask varchar(16) NOT NULL + ) ON [PRIMARY] + +IF EXISTS(SELECT * FROM dbo.regionban) + EXEC('INSERT INTO dbo.Tmp_regionban (regionUUID, bannedUUID, bannedIp, bannedIpHostMask) + SELECT CONVERT(uniqueidentifier, regionUUID), CONVERT(uniqueidentifier, bannedUUID), bannedIp, bannedIpHostMask FROM dbo.regionban WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE dbo.regionban + +EXECUTE sp_rename N'dbo.Tmp_regionban', N'regionban', 'OBJECT' + +COMMIT + + +:VERSION 20 + +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_regionsettings + ( + regionUUID uniqueidentifier NOT NULL, + block_terraform bit NOT NULL, + block_fly bit NOT NULL, + allow_damage bit NOT NULL, + restrict_pushing bit NOT NULL, + allow_land_resell bit NOT NULL, + allow_land_join_divide bit NOT NULL, + block_show_in_search bit NOT NULL, + agent_limit int NOT NULL, + object_bonus float(53) NOT NULL, + maturity int NOT NULL, + disable_scripts bit NOT NULL, + disable_collisions bit NOT NULL, + disable_physics bit NOT NULL, + terrain_texture_1 uniqueidentifier NOT NULL, + terrain_texture_2 uniqueidentifier NOT NULL, + terrain_texture_3 uniqueidentifier NOT NULL, + terrain_texture_4 uniqueidentifier NOT NULL, + elevation_1_nw float(53) NOT NULL, + elevation_2_nw float(53) NOT NULL, + elevation_1_ne float(53) NOT NULL, + elevation_2_ne float(53) NOT NULL, + elevation_1_se float(53) NOT NULL, + elevation_2_se float(53) NOT NULL, + elevation_1_sw float(53) NOT NULL, + elevation_2_sw float(53) NOT NULL, + water_height float(53) NOT NULL, + terrain_raise_limit float(53) NOT NULL, + terrain_lower_limit float(53) NOT NULL, + use_estate_sun bit NOT NULL, + fixed_sun bit NOT NULL, + sun_position float(53) NOT NULL, + covenant uniqueidentifier NULL DEFAULT (NULL), + Sandbox bit NOT NULL, + sunvectorx float(53) NOT NULL DEFAULT ((0)), + sunvectory float(53) NOT NULL DEFAULT ((0)), + sunvectorz float(53) NOT NULL DEFAULT ((0)) + ) ON [PRIMARY] + +IF EXISTS(SELECT * FROM dbo.regionsettings) + EXEC('INSERT INTO dbo.Tmp_regionsettings (regionUUID, block_terraform, block_fly, allow_damage, restrict_pushing, allow_land_resell, allow_land_join_divide, block_show_in_search, agent_limit, object_bonus, maturity, disable_scripts, disable_collisions, disable_physics, terrain_texture_1, 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_sw, water_height, terrain_raise_limit, terrain_lower_limit, use_estate_sun, fixed_sun, sun_position, covenant, Sandbox, sunvectorx, sunvectory, sunvectorz) + SELECT CONVERT(uniqueidentifier, regionUUID), block_terraform, block_fly, allow_damage, restrict_pushing, allow_land_resell, allow_land_join_divide, block_show_in_search, agent_limit, object_bonus, maturity, disable_scripts, disable_collisions, disable_physics, CONVERT(uniqueidentifier, terrain_texture_1), CONVERT(uniqueidentifier, terrain_texture_2), CONVERT(uniqueidentifier, terrain_texture_3), CONVERT(uniqueidentifier, 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_sw, water_height, terrain_raise_limit, terrain_lower_limit, use_estate_sun, fixed_sun, sun_position, CONVERT(uniqueidentifier, covenant), Sandbox, sunvectorx, sunvectory, sunvectorz FROM dbo.regionsettings WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE dbo.regionsettings + +EXECUTE sp_rename N'dbo.Tmp_regionsettings', N'regionsettings', 'OBJECT' + +ALTER TABLE dbo.regionsettings ADD CONSTRAINT + PK__regionse__5B35159D21B6055D PRIMARY KEY CLUSTERED + ( + regionUUID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + +:VERSION 21 + +BEGIN TRANSACTION + +ALTER TABLE prims ADD PassTouches bit not null default 0 + +COMMIT + + +:VERSION 22 + +BEGIN TRANSACTION + +ALTER TABLE regionsettings ADD loaded_creation_date varchar(20) +ALTER TABLE regionsettings ADD loaded_creation_time varchar(20) +ALTER TABLE regionsettings ADD loaded_creation_id varchar(64) + +COMMIT + +:VERSION 23 + +BEGIN TRANSACTION + +ALTER TABLE regionsettings DROP COLUMN loaded_creation_date +ALTER TABLE regionsettings DROP COLUMN loaded_creation_time +ALTER TABLE regionsettings ADD loaded_creation_datetime int NOT NULL default 0 + +COMMIT + + + diff --git a/OpenSim/Data/MSSQL/Resources/UserAccount.migrations b/OpenSim/Data/MSSQL/Resources/UserAccount.migrations new file mode 100644 index 0000000000..8534e235c9 --- /dev/null +++ b/OpenSim/Data/MSSQL/Resources/UserAccount.migrations @@ -0,0 +1,55 @@ +:VERSION 1 + +CREATE TABLE [UserAccounts] ( + [PrincipalID] uniqueidentifier NOT NULL, + [ScopeID] uniqueidentifier NOT NULL, + [FirstName] [varchar](64) NOT NULL, + [LastName] [varchar](64) NOT NULL, + [Email] [varchar](64) NULL, + [ServiceURLs] [text] NULL, + [Created] [int] default NULL, + + PRIMARY KEY CLUSTERED +( + [PrincipalID] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] + + +:VERSION 2 + +BEGIN TRANSACTION + +INSERT INTO UserAccounts (PrincipalID, ScopeID, FirstName, LastName, Email, ServiceURLs, Created) SELECT [UUID] AS PrincipalID, '00000000-0000-0000-0000-000000000000' AS ScopeID, +username AS FirstName, +lastname AS LastName, +email as Email, ( +'AssetServerURI=' + +userAssetURI + ' InventoryServerURI=' + userInventoryURI + ' GatewayURI= HomeURI=') AS ServiceURLs, +created as Created FROM users; + + +COMMIT + +:VERSION 3 + +BEGIN TRANSACTION + +CREATE UNIQUE INDEX PrincipalID ON UserAccounts(PrincipalID); +CREATE INDEX Email ON UserAccounts(Email); +CREATE INDEX FirstName ON UserAccounts(FirstName); +CREATE INDEX LastName ON UserAccounts(LastName); +CREATE INDEX Name ON UserAccounts(FirstName,LastName); + +COMMIT + +:VERSION 4 + +BEGIN TRANSACTION + +ALTER TABLE UserAccounts ADD UserLevel integer NOT NULL DEFAULT 0; +ALTER TABLE UserAccounts ADD UserFlags integer NOT NULL DEFAULT 0; +ALTER TABLE UserAccounts ADD UserTitle varchar(64) NOT NULL DEFAULT ''; + +COMMIT + diff --git a/OpenSim/Data/MSSQL/Resources/UserStore.migrations b/OpenSim/Data/MSSQL/Resources/UserStore.migrations new file mode 100644 index 0000000000..050c544f64 --- /dev/null +++ b/OpenSim/Data/MSSQL/Resources/UserStore.migrations @@ -0,0 +1,421 @@ +:VERSION 1 + +CREATE TABLE [users] ( + [UUID] [varchar](36) NOT NULL default '', + [username] [varchar](32) NOT NULL, + [lastname] [varchar](32) NOT NULL, + [passwordHash] [varchar](32) NOT NULL, + [passwordSalt] [varchar](32) NOT NULL, + [homeRegion] [bigint] default NULL, + [homeLocationX] [float] default NULL, + [homeLocationY] [float] default NULL, + [homeLocationZ] [float] default NULL, + [homeLookAtX] [float] default NULL, + [homeLookAtY] [float] default NULL, + [homeLookAtZ] [float] default NULL, + [created] [int] NOT NULL, + [lastLogin] [int] NOT NULL, + [userInventoryURI] [varchar](255) default NULL, + [userAssetURI] [varchar](255) default NULL, + [profileCanDoMask] [int] default NULL, + [profileWantDoMask] [int] default NULL, + [profileAboutText] [ntext], + [profileFirstText] [ntext], + [profileImage] [varchar](36) default NULL, + [profileFirstImage] [varchar](36) default NULL, + [webLoginKey] [varchar](36) default NULL, + PRIMARY KEY CLUSTERED +( + [UUID] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] + + +CREATE NONCLUSTERED INDEX [usernames] ON [users] +( + [username] ASC, + [lastname] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + + +CREATE TABLE [agents] ( + [UUID] [varchar](36) NOT NULL, + [sessionID] [varchar](36) NOT NULL, + [secureSessionID] [varchar](36) NOT NULL, + [agentIP] [varchar](16) NOT NULL, + [agentPort] [int] NOT NULL, + [agentOnline] [tinyint] NOT NULL, + [loginTime] [int] NOT NULL, + [logoutTime] [int] NOT NULL, + [currentRegion] [varchar](36) NOT NULL, + [currentHandle] [bigint] NOT NULL, + [currentPos] [varchar](64) NOT NULL, + PRIMARY KEY CLUSTERED +( + [UUID] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] + + +CREATE NONCLUSTERED INDEX [session] ON [agents] +( + [sessionID] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +CREATE NONCLUSTERED INDEX [ssession] ON [agents] +( + [secureSessionID] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + + +CREATE TABLE [dbo].[userfriends]( + [ownerID] [varchar](50) COLLATE Latin1_General_CI_AS NOT NULL, + [friendID] [varchar](50) COLLATE Latin1_General_CI_AS NOT NULL, + [friendPerms] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [datetimestamp] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL +) ON [PRIMARY] + +CREATE TABLE [avatarappearance] ( + [Owner] [varchar](36) NOT NULL, + [Serial] int NOT NULL, + [Visual_Params] [image] NOT NULL, + [Texture] [image] NOT NULL, + [Avatar_Height] float NOT NULL, + [Body_Item] [varchar](36) NOT NULL, + [Body_Asset] [varchar](36) NOT NULL, + [Skin_Item] [varchar](36) NOT NULL, + [Skin_Asset] [varchar](36) NOT NULL, + [Hair_Item] [varchar](36) NOT NULL, + [Hair_Asset] [varchar](36) NOT NULL, + [Eyes_Item] [varchar](36) NOT NULL, + [Eyes_Asset] [varchar](36) NOT NULL, + [Shirt_Item] [varchar](36) NOT NULL, + [Shirt_Asset] [varchar](36) NOT NULL, + [Pants_Item] [varchar](36) NOT NULL, + [Pants_Asset] [varchar](36) NOT NULL, + [Shoes_Item] [varchar](36) NOT NULL, + [Shoes_Asset] [varchar](36) NOT NULL, + [Socks_Item] [varchar](36) NOT NULL, + [Socks_Asset] [varchar](36) NOT NULL, + [Jacket_Item] [varchar](36) NOT NULL, + [Jacket_Asset] [varchar](36) NOT NULL, + [Gloves_Item] [varchar](36) NOT NULL, + [Gloves_Asset] [varchar](36) NOT NULL, + [Undershirt_Item] [varchar](36) NOT NULL, + [Undershirt_Asset] [varchar](36) NOT NULL, + [Underpants_Item] [varchar](36) NOT NULL, + [Underpants_Asset] [varchar](36) NOT NULL, + [Skirt_Item] [varchar](36) NOT NULL, + [Skirt_Asset] [varchar](36) NOT NULL, + + PRIMARY KEY CLUSTERED ( + [Owner] + ) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] + +:VERSION 2 + +BEGIN TRANSACTION + +ALTER TABLE users ADD homeRegionID varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000'; +ALTER TABLE users ADD userFlags int NOT NULL default 0; +ALTER TABLE users ADD godLevel int NOT NULL default 0; +ALTER TABLE users ADD customType varchar(32) not null default ''; +ALTER TABLE users ADD partner varchar(36) not null default '00000000-0000-0000-0000-000000000000'; + +COMMIT + + +:VERSION 3 + +BEGIN TRANSACTION + +CREATE TABLE [avatarattachments] ( + [UUID] varchar(36) NOT NULL + , [attachpoint] int NOT NULL + , [item] varchar(36) NOT NULL + , [asset] varchar(36) NOT NULL) + +CREATE NONCLUSTERED INDEX IX_avatarattachments ON dbo.avatarattachments + ( + UUID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + + +COMMIT + + +:VERSION 4 + +BEGIN TRANSACTION + +CREATE TABLE Tmp_userfriends + ( + ownerID varchar(36) NOT NULL, + friendID varchar(36) NOT NULL, + friendPerms int NOT NULL, + datetimestamp int NOT NULL + ) ON [PRIMARY] + +IF EXISTS(SELECT * FROM userfriends) + EXEC('INSERT INTO dbo.Tmp_userfriends (ownerID, friendID, friendPerms, datetimestamp) + SELECT CONVERT(varchar(36), ownerID), CONVERT(varchar(36), friendID), CONVERT(int, friendPerms), CONVERT(int, datetimestamp) FROM dbo.userfriends WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE dbo.userfriends + +EXECUTE sp_rename N'Tmp_userfriends', N'userfriends', 'OBJECT' + +CREATE NONCLUSTERED INDEX IX_userfriends_ownerID ON userfriends + ( + ownerID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +CREATE NONCLUSTERED INDEX IX_userfriends_friendID ON userfriends + ( + friendID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + +:VERSION 5 + +BEGIN TRANSACTION + + ALTER TABLE users add email varchar(250); + +COMMIT + + +:VERSION 6 + +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_users + ( + UUID uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'), + username varchar(32) NOT NULL, + lastname varchar(32) NOT NULL, + passwordHash varchar(32) NOT NULL, + passwordSalt varchar(32) NOT NULL, + homeRegion bigint NULL DEFAULT (NULL), + homeLocationX float(53) NULL DEFAULT (NULL), + homeLocationY float(53) NULL DEFAULT (NULL), + homeLocationZ float(53) NULL DEFAULT (NULL), + homeLookAtX float(53) NULL DEFAULT (NULL), + homeLookAtY float(53) NULL DEFAULT (NULL), + homeLookAtZ float(53) NULL DEFAULT (NULL), + created int NOT NULL, + lastLogin int NOT NULL, + userInventoryURI varchar(255) NULL DEFAULT (NULL), + userAssetURI varchar(255) NULL DEFAULT (NULL), + profileCanDoMask int NULL DEFAULT (NULL), + profileWantDoMask int NULL DEFAULT (NULL), + profileAboutText ntext NULL, + profileFirstText ntext NULL, + profileImage uniqueidentifier NULL DEFAULT (NULL), + profileFirstImage uniqueidentifier NULL DEFAULT (NULL), + webLoginKey uniqueidentifier NULL DEFAULT (NULL), + homeRegionID uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'), + userFlags int NOT NULL DEFAULT ((0)), + godLevel int NOT NULL DEFAULT ((0)), + customType varchar(32) NOT NULL DEFAULT (''), + partner uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'), + email varchar(250) NULL + ) ON [PRIMARY] + TEXTIMAGE_ON [PRIMARY] + +IF EXISTS(SELECT * FROM dbo.users) + EXEC('INSERT INTO dbo.Tmp_users (UUID, username, lastname, passwordHash, passwordSalt, homeRegion, homeLocationX, homeLocationY, homeLocationZ, homeLookAtX, homeLookAtY, homeLookAtZ, created, lastLogin, userInventoryURI, userAssetURI, profileCanDoMask, profileWantDoMask, profileAboutText, profileFirstText, profileImage, profileFirstImage, webLoginKey, homeRegionID, userFlags, godLevel, customType, partner, email) + SELECT CONVERT(uniqueidentifier, UUID), username, lastname, passwordHash, passwordSalt, homeRegion, homeLocationX, homeLocationY, homeLocationZ, homeLookAtX, homeLookAtY, homeLookAtZ, created, lastLogin, userInventoryURI, userAssetURI, profileCanDoMask, profileWantDoMask, profileAboutText, profileFirstText, CONVERT(uniqueidentifier, profileImage), CONVERT(uniqueidentifier, profileFirstImage), CONVERT(uniqueidentifier, webLoginKey), CONVERT(uniqueidentifier, homeRegionID), userFlags, godLevel, customType, CONVERT(uniqueidentifier, partner), email FROM dbo.users WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE dbo.users + +EXECUTE sp_rename N'dbo.Tmp_users', N'users', 'OBJECT' + +ALTER TABLE dbo.users ADD CONSTRAINT + PK__users__65A475E737A5467C PRIMARY KEY CLUSTERED + ( + UUID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +CREATE NONCLUSTERED INDEX usernames ON dbo.users + ( + username, + lastname + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + +:VERSION 7 + +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_agents + ( + UUID uniqueidentifier NOT NULL, + sessionID uniqueidentifier NOT NULL, + secureSessionID uniqueidentifier NOT NULL, + agentIP varchar(16) NOT NULL, + agentPort int NOT NULL, + agentOnline tinyint NOT NULL, + loginTime int NOT NULL, + logoutTime int NOT NULL, + currentRegion uniqueidentifier NOT NULL, + currentHandle bigint NOT NULL, + currentPos varchar(64) NOT NULL + ) ON [PRIMARY] + +IF EXISTS(SELECT * FROM dbo.agents) + EXEC('INSERT INTO dbo.Tmp_agents (UUID, sessionID, secureSessionID, agentIP, agentPort, agentOnline, loginTime, logoutTime, currentRegion, currentHandle, currentPos) + SELECT CONVERT(uniqueidentifier, UUID), CONVERT(uniqueidentifier, sessionID), CONVERT(uniqueidentifier, secureSessionID), agentIP, agentPort, agentOnline, loginTime, logoutTime, CONVERT(uniqueidentifier, currentRegion), currentHandle, currentPos FROM dbo.agents WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE dbo.agents + +EXECUTE sp_rename N'dbo.Tmp_agents', N'agents', 'OBJECT' + +ALTER TABLE dbo.agents ADD CONSTRAINT + PK__agents__65A475E749C3F6B7 PRIMARY KEY CLUSTERED + ( + UUID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +CREATE NONCLUSTERED INDEX session ON dbo.agents + ( + sessionID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +CREATE NONCLUSTERED INDEX ssession ON dbo.agents + ( + secureSessionID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + +:VERSION 8 + +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_userfriends + ( + ownerID uniqueidentifier NOT NULL, + friendID uniqueidentifier NOT NULL, + friendPerms int NOT NULL, + datetimestamp int NOT NULL + ) ON [PRIMARY] + +IF EXISTS(SELECT * FROM dbo.userfriends) + EXEC('INSERT INTO dbo.Tmp_userfriends (ownerID, friendID, friendPerms, datetimestamp) + SELECT CONVERT(uniqueidentifier, ownerID), CONVERT(uniqueidentifier, friendID), friendPerms, datetimestamp FROM dbo.userfriends WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE dbo.userfriends + +EXECUTE sp_rename N'dbo.Tmp_userfriends', N'userfriends', 'OBJECT' + +CREATE NONCLUSTERED INDEX IX_userfriends_ownerID ON dbo.userfriends + ( + ownerID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +CREATE NONCLUSTERED INDEX IX_userfriends_friendID ON dbo.userfriends + ( + friendID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + +:VERSION 9 + +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_avatarappearance + ( + Owner uniqueidentifier NOT NULL, + Serial int NOT NULL, + Visual_Params image NOT NULL, + Texture image NOT NULL, + Avatar_Height float(53) NOT NULL, + Body_Item uniqueidentifier NOT NULL, + Body_Asset uniqueidentifier NOT NULL, + Skin_Item uniqueidentifier NOT NULL, + Skin_Asset uniqueidentifier NOT NULL, + Hair_Item uniqueidentifier NOT NULL, + Hair_Asset uniqueidentifier NOT NULL, + Eyes_Item uniqueidentifier NOT NULL, + Eyes_Asset uniqueidentifier NOT NULL, + Shirt_Item uniqueidentifier NOT NULL, + Shirt_Asset uniqueidentifier NOT NULL, + Pants_Item uniqueidentifier NOT NULL, + Pants_Asset uniqueidentifier NOT NULL, + Shoes_Item uniqueidentifier NOT NULL, + Shoes_Asset uniqueidentifier NOT NULL, + Socks_Item uniqueidentifier NOT NULL, + Socks_Asset uniqueidentifier NOT NULL, + Jacket_Item uniqueidentifier NOT NULL, + Jacket_Asset uniqueidentifier NOT NULL, + Gloves_Item uniqueidentifier NOT NULL, + Gloves_Asset uniqueidentifier NOT NULL, + Undershirt_Item uniqueidentifier NOT NULL, + Undershirt_Asset uniqueidentifier NOT NULL, + Underpants_Item uniqueidentifier NOT NULL, + Underpants_Asset uniqueidentifier NOT NULL, + Skirt_Item uniqueidentifier NOT NULL, + Skirt_Asset uniqueidentifier NOT NULL + ) ON [PRIMARY] + TEXTIMAGE_ON [PRIMARY] + +IF EXISTS(SELECT * FROM dbo.avatarappearance) + EXEC('INSERT INTO dbo.Tmp_avatarappearance (Owner, Serial, Visual_Params, Texture, Avatar_Height, Body_Item, Body_Asset, Skin_Item, Skin_Asset, Hair_Item, Hair_Asset, Eyes_Item, Eyes_Asset, Shirt_Item, Shirt_Asset, Pants_Item, Pants_Asset, Shoes_Item, Shoes_Asset, Socks_Item, Socks_Asset, Jacket_Item, Jacket_Asset, Gloves_Item, Gloves_Asset, Undershirt_Item, Undershirt_Asset, Underpants_Item, Underpants_Asset, Skirt_Item, Skirt_Asset) + SELECT CONVERT(uniqueidentifier, Owner), Serial, Visual_Params, Texture, Avatar_Height, CONVERT(uniqueidentifier, Body_Item), CONVERT(uniqueidentifier, Body_Asset), CONVERT(uniqueidentifier, Skin_Item), CONVERT(uniqueidentifier, Skin_Asset), CONVERT(uniqueidentifier, Hair_Item), CONVERT(uniqueidentifier, Hair_Asset), CONVERT(uniqueidentifier, Eyes_Item), CONVERT(uniqueidentifier, Eyes_Asset), CONVERT(uniqueidentifier, Shirt_Item), CONVERT(uniqueidentifier, Shirt_Asset), CONVERT(uniqueidentifier, Pants_Item), CONVERT(uniqueidentifier, Pants_Asset), CONVERT(uniqueidentifier, Shoes_Item), CONVERT(uniqueidentifier, Shoes_Asset), CONVERT(uniqueidentifier, Socks_Item), CONVERT(uniqueidentifier, Socks_Asset), CONVERT(uniqueidentifier, Jacket_Item), CONVERT(uniqueidentifier, Jacket_Asset), CONVERT(uniqueidentifier, Gloves_Item), CONVERT(uniqueidentifier, Gloves_Asset), CONVERT(uniqueidentifier, Undershirt_Item), CONVERT(uniqueidentifier, Undershirt_Asset), CONVERT(uniqueidentifier, Underpants_Item), CONVERT(uniqueidentifier, Underpants_Asset), CONVERT(uniqueidentifier, Skirt_Item), CONVERT(uniqueidentifier, Skirt_Asset) FROM dbo.avatarappearance WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE dbo.avatarappearance + +EXECUTE sp_rename N'dbo.Tmp_avatarappearance', N'avatarappearance', 'OBJECT' + +ALTER TABLE dbo.avatarappearance ADD CONSTRAINT + PK__avatarap__7DD115CC4E88ABD4 PRIMARY KEY CLUSTERED + ( + Owner + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + +:VERSION 10 + +BEGIN TRANSACTION + +CREATE TABLE dbo.Tmp_avatarattachments + ( + UUID uniqueidentifier NOT NULL, + attachpoint int NOT NULL, + item uniqueidentifier NOT NULL, + asset uniqueidentifier NOT NULL + ) ON [PRIMARY] + +IF EXISTS(SELECT * FROM dbo.avatarattachments) + EXEC('INSERT INTO dbo.Tmp_avatarattachments (UUID, attachpoint, item, asset) + SELECT CONVERT(uniqueidentifier, UUID), attachpoint, CONVERT(uniqueidentifier, item), CONVERT(uniqueidentifier, asset) FROM dbo.avatarattachments WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE dbo.avatarattachments + +EXECUTE sp_rename N'dbo.Tmp_avatarattachments', N'avatarattachments', 'OBJECT' + +CREATE NONCLUSTERED INDEX IX_avatarattachments ON dbo.avatarattachments + ( + UUID + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +COMMIT + + +:VERSION 11 + +BEGIN TRANSACTION + +ALTER TABLE users ADD scopeID uniqueidentifier not null default '00000000-0000-0000-0000-000000000000' + +COMMIT From df49756e7b8125595db20f63d5f9809a27642b77 Mon Sep 17 00:00:00 2001 From: Melanie Date: Tue, 18 May 2010 21:15:58 +0100 Subject: [PATCH 19/46] Looks like the new files were never added to prebuild.xml --- prebuild.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/prebuild.xml b/prebuild.xml index 329ef7b41b..f9608fbf92 100644 --- a/prebuild.xml +++ b/prebuild.xml @@ -2141,6 +2141,7 @@ + @@ -2247,6 +2248,7 @@ + From f253758c2e4e30c8e09f23135d79765c70198802 Mon Sep 17 00:00:00 2001 From: Melanie Date: Tue, 18 May 2010 21:29:02 +0100 Subject: [PATCH 20/46] Revert "Looks like the new files were never added to prebuild.xml" This reverts commit df49756e7b8125595db20f63d5f9809a27642b77. --- prebuild.xml | 2 -- 1 file changed, 2 deletions(-) diff --git a/prebuild.xml b/prebuild.xml index f9608fbf92..329ef7b41b 100644 --- a/prebuild.xml +++ b/prebuild.xml @@ -2141,7 +2141,6 @@ - @@ -2248,7 +2247,6 @@ - From a27d49b1887700d78498ee0a369c2b3d93d2642c Mon Sep 17 00:00:00 2001 From: AlexRa Date: Tue, 18 May 2010 14:19:19 +0300 Subject: [PATCH 21/46] Added DBGuids.cs (static func DBGuid.FromDB() This DBMS-independent function to be used converting UUIDs from whatever format used in the DB (string/binary/Guid). This is mostly needed for MySQL, as in MSSQL they are always UNIQUEIDENTIFIERs and in SQLite always strings (but would look better if we use it there anyway). --- OpenSim/Data/DBGuids.cs | 44 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 OpenSim/Data/DBGuids.cs diff --git a/OpenSim/Data/DBGuids.cs b/OpenSim/Data/DBGuids.cs new file mode 100644 index 0000000000..1a13e06f06 --- /dev/null +++ b/OpenSim/Data/DBGuids.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Text; +using OpenMetaverse; + +namespace OpenSim.Data +{ + + public static class DBGuid + { + /// This function converts a value returned from the database in one of the + /// supported formats into a UUID. This function is not actually DBMS-specific right + /// now + /// + /// + /// + /// + public static UUID FromDB(object id) + { + if( (id == null) || (id == DBNull.Value)) + return UUID.Zero; + + if (id.GetType() == typeof(Guid)) + return new UUID((Guid)id); + + if (id.GetType() == typeof(byte[])) + { + if (((byte[])id).Length == 0) + return UUID.Zero; + else if (((byte[])id).Length == 36) + return new UUID((byte[])id, 0); + } + else if (id.GetType() == typeof(string)) + { + if (((string)id).Length == 0) + return UUID.Zero; + else if (((string)id).Length == 36) + return new UUID((string)id); + } + + throw new Exception("Failed to convert db value to UUID: " + id.ToString()); + } + } +} From 8a0c5d14d45571c3e7529fdacea6f0483af482e5 Mon Sep 17 00:00:00 2001 From: AlexRa Date: Tue, 18 May 2010 14:28:12 +0300 Subject: [PATCH 22/46] All (?) MySQL stores fixed to use DBGuid.FromDB() This was needed if we want to update to the latest MySQL connector dll. It automatically converts CHAR(36) to Guids, so getting them as strings no longer works. By using DBGuid.FromDB(), we unlink from any particular storage format of GUIDs, could even make them BINARY(16) if we like. Actually not all MySql units are touched, but the remaining ones don't seem to be affected (they don't read GUIDs from DB) --- OpenSim/Data/MySQL/MySQLEstateData.cs | 24 ++---- .../Data/MySQL/MySQLGenericTableHandler.cs | 11 +-- OpenSim/Data/MySQL/MySQLInventoryData.cs | 33 +++----- OpenSim/Data/MySQL/MySQLLegacyRegionData.cs | 82 +++++++++---------- OpenSim/Data/MySQL/MySQLRegionData.cs | 10 +-- 5 files changed, 68 insertions(+), 92 deletions(-) diff --git a/OpenSim/Data/MySQL/MySQLEstateData.cs b/OpenSim/Data/MySQL/MySQLEstateData.cs index 08e21446f2..9158f7a427 100644 --- a/OpenSim/Data/MySQL/MySQLEstateData.cs +++ b/OpenSim/Data/MySQL/MySQLEstateData.cs @@ -34,6 +34,7 @@ using MySql.Data.MySqlClient; using OpenMetaverse; using OpenSim.Framework; using OpenSim.Region.Framework.Interfaces; +using OpenSim.Data; namespace OpenSim.Data.MySQL { @@ -156,20 +157,13 @@ namespace OpenSim.Data.MySQL foreach (string name in FieldList) { - if (m_FieldMap[name].GetValue(es) is bool) + if (m_FieldMap[name].FieldType == typeof(bool)) { - int v = Convert.ToInt32(r[name]); - if (v != 0) - m_FieldMap[name].SetValue(es, true); - else - m_FieldMap[name].SetValue(es, false); + m_FieldMap[name].SetValue(es, Convert.ToInt32(r[name]) != 0); } - else if (m_FieldMap[name].GetValue(es) is UUID) + else if (m_FieldMap[name].FieldType == typeof(UUID)) { - UUID uuid = UUID.Zero; - - UUID.TryParse(r[name].ToString(), out uuid); - m_FieldMap[name].SetValue(es, uuid); + m_FieldMap[name].SetValue(es, DBGuid.FromDB(r[name])); } else { @@ -385,11 +379,7 @@ namespace OpenSim.Data.MySQL while (r.Read()) { // EstateBan eb = new EstateBan(); - - UUID uuid = new UUID(); - UUID.TryParse(r["uuid"].ToString(), out uuid); - - uuids.Add(uuid); + uuids.Add(DBGuid.FromDB(r["uuid"])); } } } @@ -490,7 +480,7 @@ namespace OpenSim.Data.MySQL using (IDataReader reader = cmd.ExecuteReader()) { while(reader.Read()) - result.Add(new UUID(reader["RegionID"].ToString())); + result.Add(DBGuid.FromDB(reader["RegionID"])); reader.Close(); } } diff --git a/OpenSim/Data/MySQL/MySQLGenericTableHandler.cs b/OpenSim/Data/MySQL/MySQLGenericTableHandler.cs index 1253e0b455..6cbb2ee9a2 100644 --- a/OpenSim/Data/MySQL/MySQLGenericTableHandler.cs +++ b/OpenSim/Data/MySQL/MySQLGenericTableHandler.cs @@ -148,19 +148,16 @@ namespace OpenSim.Data.MySQL foreach (string name in m_Fields.Keys) { - if (m_Fields[name].GetValue(row) is bool) + if (m_Fields[name].FieldType == typeof(bool)) { int v = Convert.ToInt32(reader[name]); m_Fields[name].SetValue(row, v != 0 ? true : false); } - else if (m_Fields[name].GetValue(row) is UUID) + else if (m_Fields[name].FieldType == typeof(UUID)) { - UUID uuid = UUID.Zero; - - UUID.TryParse(reader[name].ToString(), out uuid); - m_Fields[name].SetValue(row, uuid); + m_Fields[name].SetValue(row, DBGuid.FromDB(reader[name])); } - else if (m_Fields[name].GetValue(row) is int) + else if (m_Fields[name].FieldType == typeof(int)) { int v = Convert.ToInt32(reader[name]); m_Fields[name].SetValue(row, v); diff --git a/OpenSim/Data/MySQL/MySQLInventoryData.cs b/OpenSim/Data/MySQL/MySQLInventoryData.cs index e0e9b9cc99..8fbe7a80ea 100644 --- a/OpenSim/Data/MySQL/MySQLInventoryData.cs +++ b/OpenSim/Data/MySQL/MySQLInventoryData.cs @@ -32,6 +32,7 @@ using log4net; using MySql.Data.MySqlClient; using OpenMetaverse; using OpenSim.Framework; +using OpenSim.Data; namespace OpenSim.Data.MySQL { @@ -285,31 +286,23 @@ namespace OpenSim.Data.MySQL InventoryItemBase item = new InventoryItemBase(); // TODO: this is to handle a case where NULLs creep in there, which we are not sure is endemic to the system, or legacy. It would be nice to live fix these. - if (reader["creatorID"] == null) - { - item.CreatorId = UUID.Zero.ToString(); - } - else - { - item.CreatorId = (string)reader["creatorID"]; - } + // ( DBGuid.FromDB() reads db NULLs as well, returns UUID.Zero ) + item.CreatorId = DBGuid.FromDB(reader["creatorID"]).ToString(); // Be a bit safer in parsing these because the // database doesn't enforce them to be not null, and // the inventory still works if these are weird in the // db - UUID Owner = UUID.Zero; - UUID GroupID = UUID.Zero; - UUID.TryParse((string)reader["avatarID"], out Owner); - UUID.TryParse((string)reader["groupID"], out GroupID); - item.Owner = Owner; - item.GroupID = GroupID; + + // (Empty is Ok, but "weird" will throw!) + item.Owner = DBGuid.FromDB(reader["avatarID"]); + item.GroupID = DBGuid.FromDB(reader["groupID"]); // Rest of the parsing. If these UUID's fail, we're dead anyway - item.ID = new UUID((string) reader["inventoryID"]); - item.AssetID = new UUID((string) reader["assetID"]); + item.ID = DBGuid.FromDB(reader["inventoryID"]); + item.AssetID = DBGuid.FromDB(reader["assetID"]); item.AssetType = (int) reader["assetType"]; - item.Folder = new UUID((string) reader["parentFolderID"]); + item.Folder = DBGuid.FromDB(reader["parentFolderID"]); item.Name = (string)(reader["inventoryName"] ?? String.Empty); item.Description = (string)(reader["inventoryDescription"] ?? String.Empty); item.NextPermissions = (uint) reader["inventoryNextPermissions"]; @@ -382,9 +375,9 @@ namespace OpenSim.Data.MySQL try { InventoryFolderBase folder = new InventoryFolderBase(); - folder.Owner = new UUID((string) reader["agentID"]); - folder.ParentID = new UUID((string) reader["parentFolderID"]); - folder.ID = new UUID((string) reader["folderID"]); + folder.Owner = DBGuid.FromDB(reader["agentID"]); + folder.ParentID = DBGuid.FromDB(reader["parentFolderID"]); + folder.ID = DBGuid.FromDB(reader["folderID"]); folder.Name = (string) reader["folderName"]; folder.Type = (short) reader["type"]; folder.Version = (ushort) ((int) reader["version"]); diff --git a/OpenSim/Data/MySQL/MySQLLegacyRegionData.cs b/OpenSim/Data/MySQL/MySQLLegacyRegionData.cs index 07371e7473..bfeae12385 100644 --- a/OpenSim/Data/MySQL/MySQLLegacyRegionData.cs +++ b/OpenSim/Data/MySQL/MySQLLegacyRegionData.cs @@ -38,6 +38,7 @@ using OpenMetaverse; using OpenSim.Framework; using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Scenes; +using OpenSim.Data; namespace OpenSim.Data.MySQL { @@ -269,7 +270,7 @@ namespace OpenSim.Data.MySQL using (IDataReader reader = ExecuteReader(cmd)) { while (reader.Read()) - uuids.Add(new UUID(reader["UUID"].ToString())); + uuids.Add(DBGuid.FromDB(reader["UUID"].ToString())); } // delete the main prims @@ -422,7 +423,7 @@ namespace OpenSim.Data.MySQL else prim.Shape = BuildShape(reader); - UUID parentID = new UUID(reader["SceneGroupID"].ToString()); + UUID parentID = DBGuid.FromDB(reader["SceneGroupID"].ToString()); if (parentID != prim.UUID) prim.ParentUUID = parentID; @@ -500,7 +501,7 @@ namespace OpenSim.Data.MySQL { if (!(itemReader["primID"] is DBNull)) { - UUID primID = new UUID(itemReader["primID"].ToString()); + UUID primID = DBGuid.FromDB(itemReader["primID"].ToString()); if (prims.ContainsKey(primID)) primsWithInventory.Add(prims[primID]); } @@ -738,7 +739,7 @@ namespace OpenSim.Data.MySQL } else { - UUID.TryParse(result["region_id"].ToString(), out nWP.regionID); + nWP.regionID = DBGuid.FromDB(result["region_id"]); nWP.waterColor.X = Convert.ToSingle(result["water_color_r"]); nWP.waterColor.Y = Convert.ToSingle(result["water_color_g"]); nWP.waterColor.Z = Convert.ToSingle(result["water_color_b"]); @@ -1055,7 +1056,14 @@ namespace OpenSim.Data.MySQL private SceneObjectPart BuildPrim(IDataReader row) { SceneObjectPart prim = new SceneObjectPart(); - prim.UUID = new UUID((string)row["UUID"]); + + // depending on the MySQL connector version, CHAR(36) may be already converted to Guid! + prim.UUID = DBGuid.FromDB(row["UUID"]); + prim.CreatorID = DBGuid.FromDB(row["CreatorID"]); + prim.OwnerID = DBGuid.FromDB(row["OwnerID"]); + prim.GroupID = DBGuid.FromDB(row["GroupID"]); + prim.LastOwnerID = DBGuid.FromDB(row["LastOwnerID"]); + // explicit conversion of integers is required, which sort // of sucks. No idea if there is a shortcut here or not. prim.CreationDate = (int)row["CreationDate"]; @@ -1074,15 +1082,12 @@ namespace OpenSim.Data.MySQL prim.TouchName = (string)row["TouchName"]; // Permissions prim.ObjectFlags = (uint)(int)row["ObjectFlags"]; - prim.CreatorID = new UUID((string)row["CreatorID"]); - prim.OwnerID = new UUID((string)row["OwnerID"]); - prim.GroupID = new UUID((string)row["GroupID"]); - prim.LastOwnerID = new UUID((string)row["LastOwnerID"]); prim.OwnerMask = (uint)(int)row["OwnerMask"]; prim.NextOwnerMask = (uint)(int)row["NextOwnerMask"]; prim.GroupMask = (uint)(int)row["GroupMask"]; prim.EveryoneMask = (uint)(int)row["EveryoneMask"]; prim.BaseMask = (uint)(int)row["BaseMask"]; + // Vectors prim.OffsetPosition = new Vector3( (float)(double)row["PositionX"], @@ -1134,7 +1139,7 @@ namespace OpenSim.Data.MySQL prim.PayPrice[3] = (int)row["PayButton3"]; prim.PayPrice[4] = (int)row["PayButton4"]; - prim.Sound = new UUID(row["LoopedSound"].ToString()); + prim.Sound = DBGuid.FromDB(row["LoopedSound"].ToString()); prim.SoundGain = (float)(double)row["LoopedSoundGain"]; prim.SoundFlags = 1; // If it's persisted at all, it's looped @@ -1161,16 +1166,10 @@ namespace OpenSim.Data.MySQL (float)(double)row["CameraAtOffsetZ"] )); - if ((sbyte)row["ForceMouselook"] != 0) - prim.SetForceMouselook(true); - + prim.SetForceMouselook((sbyte)row["ForceMouselook"] != 0); prim.ScriptAccessPin = (int)row["ScriptAccessPin"]; - - if ((sbyte)row["AllowedDrop"] != 0) - prim.AllowedDrop = true; - - if ((sbyte)row["DieAtEdge"] != 0) - prim.DIE_AT_EDGE = true; + prim.AllowedDrop = ((sbyte)row["AllowedDrop"] != 0); + prim.DIE_AT_EDGE = ((sbyte)row["DieAtEdge"] != 0); prim.SalePrice = (int)row["SalePrice"]; prim.ObjectSaleType = unchecked((byte)(sbyte)row["SaleType"]); @@ -1180,11 +1179,10 @@ namespace OpenSim.Data.MySQL if (!(row["ClickAction"] is DBNull)) prim.ClickAction = unchecked((byte)(sbyte)row["ClickAction"]); - prim.CollisionSound = new UUID(row["CollisionSound"].ToString()); + prim.CollisionSound = DBGuid.FromDB(row["CollisionSound"]); prim.CollisionSoundVolume = (float)(double)row["CollisionSoundVolume"]; - if ((sbyte)row["PassTouches"] != 0) - prim.PassTouches = true; + prim.PassTouches = ((sbyte)row["PassTouches"] != 0); prim.LinkNum = (int)row["LinkNumber"]; return prim; @@ -1200,10 +1198,10 @@ namespace OpenSim.Data.MySQL { TaskInventoryItem taskItem = new TaskInventoryItem(); - taskItem.ItemID = new UUID((String)row["itemID"]); - taskItem.ParentPartID = new UUID((String)row["primID"]); - taskItem.AssetID = new UUID((String)row["assetID"]); - taskItem.ParentID = new UUID((String)row["parentFolderID"]); + taskItem.ItemID = DBGuid.FromDB(row["itemID"]); + taskItem.ParentPartID = DBGuid.FromDB(row["primID"]); + taskItem.AssetID = DBGuid.FromDB(row["assetID"]); + taskItem.ParentID = DBGuid.FromDB(row["parentFolderID"]); taskItem.InvType = Convert.ToInt32(row["invType"]); taskItem.Type = Convert.ToInt32(row["assetType"]); @@ -1211,10 +1209,10 @@ namespace OpenSim.Data.MySQL taskItem.Name = (String)row["name"]; taskItem.Description = (String)row["description"]; taskItem.CreationDate = Convert.ToUInt32(row["creationDate"]); - taskItem.CreatorID = new UUID((String)row["creatorID"]); - taskItem.OwnerID = new UUID((String)row["ownerID"]); - taskItem.LastOwnerID = new UUID((String)row["lastOwnerID"]); - taskItem.GroupID = new UUID((String)row["groupID"]); + taskItem.CreatorID = DBGuid.FromDB(row["creatorID"]); + taskItem.OwnerID = DBGuid.FromDB(row["ownerID"]); + taskItem.LastOwnerID = DBGuid.FromDB(row["lastOwnerID"]); + taskItem.GroupID = DBGuid.FromDB(row["groupID"]); taskItem.NextPermissions = Convert.ToUInt32(row["nextPermissions"]); taskItem.CurrentPermissions = Convert.ToUInt32(row["currentPermissions"]); @@ -1230,7 +1228,7 @@ namespace OpenSim.Data.MySQL { RegionSettings newSettings = new RegionSettings(); - newSettings.RegionUUID = new UUID((string) row["regionUUID"]); + newSettings.RegionUUID = DBGuid.FromDB(row["regionUUID"]); newSettings.BlockTerraform = Convert.ToBoolean(row["block_terraform"]); newSettings.AllowDamage = Convert.ToBoolean(row["allow_damage"]); newSettings.BlockFly = Convert.ToBoolean(row["block_fly"]); @@ -1244,10 +1242,10 @@ namespace OpenSim.Data.MySQL newSettings.DisableScripts = Convert.ToBoolean(row["disable_scripts"]); newSettings.DisableCollisions = Convert.ToBoolean(row["disable_collisions"]); newSettings.DisablePhysics = Convert.ToBoolean(row["disable_physics"]); - newSettings.TerrainTexture1 = new UUID((String) row["terrain_texture_1"]); - newSettings.TerrainTexture2 = new UUID((String) row["terrain_texture_2"]); - newSettings.TerrainTexture3 = new UUID((String) row["terrain_texture_3"]); - newSettings.TerrainTexture4 = new UUID((String) row["terrain_texture_4"]); + newSettings.TerrainTexture1 = DBGuid.FromDB(row["terrain_texture_1"]); + newSettings.TerrainTexture2 = DBGuid.FromDB(row["terrain_texture_2"]); + newSettings.TerrainTexture3 = DBGuid.FromDB(row["terrain_texture_3"]); + newSettings.TerrainTexture4 = DBGuid.FromDB(row["terrain_texture_4"]); newSettings.Elevation1NW = Convert.ToDouble(row["elevation_1_nw"]); newSettings.Elevation2NW = Convert.ToDouble(row["elevation_2_nw"]); newSettings.Elevation1NE = Convert.ToDouble(row["elevation_1_ne"]); @@ -1268,7 +1266,7 @@ namespace OpenSim.Data.MySQL ); newSettings.FixedSun = Convert.ToBoolean(row["fixed_sun"]); newSettings.SunPosition = Convert.ToDouble(row["sun_position"]); - newSettings.Covenant = new UUID((String) row["covenant"]); + newSettings.Covenant = DBGuid.FromDB(row["covenant"]); newSettings.LoadedCreationDateTime = Convert.ToInt32(row["loaded_creation_datetime"]); @@ -1277,7 +1275,7 @@ namespace OpenSim.Data.MySQL else newSettings.LoadedCreationID = (String) row["loaded_creation_id"]; - newSettings.TerrainImageID = new UUID((String)row["map_tile_ID"]); + newSettings.TerrainImageID = DBGuid.FromDB(row["map_tile_ID"]); return newSettings; } @@ -1291,7 +1289,7 @@ namespace OpenSim.Data.MySQL { LandData newData = new LandData(); - newData.GlobalID = new UUID((String) row["UUID"]); + newData.GlobalID = DBGuid.FromDB(row["UUID"]); newData.LocalID = Convert.ToInt32(row["LocalLandID"]); // Bitmap is a byte[512] @@ -1299,7 +1297,7 @@ namespace OpenSim.Data.MySQL newData.Name = (String) row["Name"]; newData.Description = (String) row["Description"]; - newData.OwnerID = new UUID((String)row["OwnerUUID"]); + newData.OwnerID = DBGuid.FromDB(row["OwnerUUID"]); newData.IsGroupOwned = Convert.ToBoolean(row["IsGroupOwned"]); newData.Area = Convert.ToInt32(row["Area"]); newData.AuctionID = Convert.ToUInt32(row["AuctionID"]); //Unimplemented @@ -1307,14 +1305,14 @@ namespace OpenSim.Data.MySQL //Enum libsecondlife.Parcel.ParcelCategory newData.ClaimDate = Convert.ToInt32(row["ClaimDate"]); newData.ClaimPrice = Convert.ToInt32(row["ClaimPrice"]); - newData.GroupID = new UUID((String) row["GroupUUID"]); + newData.GroupID = DBGuid.FromDB(row["GroupUUID"]); newData.SalePrice = Convert.ToInt32(row["SalePrice"]); newData.Status = (ParcelStatus) Convert.ToInt32(row["LandStatus"]); //Enum. libsecondlife.Parcel.ParcelStatus newData.Flags = Convert.ToUInt32(row["LandFlags"]); newData.LandingType = Convert.ToByte(row["LandingType"]); newData.MediaAutoScale = Convert.ToByte(row["MediaAutoScale"]); - newData.MediaID = new UUID((String) row["MediaTextureUUID"]); + newData.MediaID = DBGuid.FromDB(row["MediaTextureUUID"]); newData.MediaURL = (String) row["MediaURL"]; newData.MusicURL = (String) row["MusicURL"]; newData.PassHours = Convert.ToSingle(row["PassHours"]); @@ -1358,7 +1356,7 @@ namespace OpenSim.Data.MySQL private static ParcelManager.ParcelAccessEntry BuildLandAccessData(IDataReader row) { ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry(); - entry.AgentID = new UUID((string) row["AccessUUID"]); + entry.AgentID = DBGuid.FromDB(row["AccessUUID"]); entry.Flags = (AccessList) Convert.ToInt32(row["Flags"]); entry.Time = new DateTime(); return entry; diff --git a/OpenSim/Data/MySQL/MySQLRegionData.cs b/OpenSim/Data/MySQL/MySQLRegionData.cs index aa9a104d78..c7bddacd16 100644 --- a/OpenSim/Data/MySQL/MySQLRegionData.cs +++ b/OpenSim/Data/MySQL/MySQLRegionData.cs @@ -31,6 +31,7 @@ using System.Collections.Generic; using System.Data; using OpenMetaverse; using OpenSim.Framework; +using OpenSim.Data; using MySql.Data.MySqlClient; namespace OpenSim.Data.MySQL @@ -143,12 +144,9 @@ namespace OpenSim.Data.MySQL 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.RegionID = DBGuid.FromDB(result["uuid"]); + ret.ScopeID = DBGuid.FromDB(result["ScopeID"]); + ret.RegionName = result["regionName"].ToString(); ret.posX = Convert.ToInt32(result["locX"]); ret.posY = Convert.ToInt32(result["locY"]); From deae0301456a169540aafc4ff1a574e1304e327d Mon Sep 17 00:00:00 2001 From: AlexRa Date: Wed, 19 May 2010 02:28:19 +0300 Subject: [PATCH 23/46] Some more corrections after MySQL connector update --- OpenSim/Data/MySQL/MySQLAssetData.cs | 3 ++- OpenSim/Data/MySQL/MySQLInventoryData.cs | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/OpenSim/Data/MySQL/MySQLAssetData.cs b/OpenSim/Data/MySQL/MySQLAssetData.cs index 13f5fa2ac6..ec18c28391 100644 --- a/OpenSim/Data/MySQL/MySQLAssetData.cs +++ b/OpenSim/Data/MySQL/MySQLAssetData.cs @@ -33,6 +33,7 @@ using log4net; using MySql.Data.MySqlClient; using OpenMetaverse; using OpenSim.Framework; +using OpenSim.Data; namespace OpenSim.Data.MySQL { @@ -320,7 +321,7 @@ namespace OpenSim.Data.MySQL metadata.Type = (sbyte)dbReader["assetType"]; metadata.Temporary = Convert.ToBoolean(dbReader["temporary"]); // Not sure if this is correct. metadata.Flags = (AssetFlags)Convert.ToInt32(dbReader["asset_flags"]); - metadata.FullID = new UUID((string)dbReader["id"]); + metadata.FullID = DBGuid.FromDB(dbReader["id"]); // Current SHA1s are not stored/computed. metadata.SHA1 = new byte[] { }; diff --git a/OpenSim/Data/MySQL/MySQLInventoryData.cs b/OpenSim/Data/MySQL/MySQLInventoryData.cs index 8fbe7a80ea..0aea30ffb9 100644 --- a/OpenSim/Data/MySQL/MySQLInventoryData.cs +++ b/OpenSim/Data/MySQL/MySQLInventoryData.cs @@ -287,7 +287,7 @@ namespace OpenSim.Data.MySQL // TODO: this is to handle a case where NULLs creep in there, which we are not sure is endemic to the system, or legacy. It would be nice to live fix these. // ( DBGuid.FromDB() reads db NULLs as well, returns UUID.Zero ) - item.CreatorId = DBGuid.FromDB(reader["creatorID"]).ToString(); + item.CreatorId = reader["creatorID"].ToString(); // Be a bit safer in parsing these because the // database doesn't enforce them to be not null, and From 4fee3f9548307ce3017f4744ce419447eaa31b37 Mon Sep 17 00:00:00 2001 From: Melanie Date: Tue, 18 May 2010 23:15:29 +0100 Subject: [PATCH 24/46] Revert a revert? Am i mad? Don't answer that....! Revert "Revert "Looks like the new files were never added to prebuild.xml"" This reverts commit f253758c2e4e30c8e09f23135d79765c70198802. --- prebuild.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/prebuild.xml b/prebuild.xml index 329ef7b41b..f9608fbf92 100644 --- a/prebuild.xml +++ b/prebuild.xml @@ -2141,6 +2141,7 @@ + @@ -2247,6 +2248,7 @@ + From caf61ab7d814232d3da87e21e409fd9e3916d5c1 Mon Sep 17 00:00:00 2001 From: Melanie Date: Tue, 18 May 2010 23:22:30 +0100 Subject: [PATCH 25/46] Binary Guids are 16 chars long. Fix parser. --- OpenSim/Data/DBGuids.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Data/DBGuids.cs b/OpenSim/Data/DBGuids.cs index 1a13e06f06..fb6832b8d1 100644 --- a/OpenSim/Data/DBGuids.cs +++ b/OpenSim/Data/DBGuids.cs @@ -27,7 +27,7 @@ namespace OpenSim.Data { if (((byte[])id).Length == 0) return UUID.Zero; - else if (((byte[])id).Length == 36) + else if (((byte[])id).Length == 16) return new UUID((byte[])id, 0); } else if (id.GetType() == typeof(string)) From d2bc6736675f0418903f70a649808ccabbfb3fd9 Mon Sep 17 00:00:00 2001 From: Melanie Date: Tue, 18 May 2010 23:33:05 +0100 Subject: [PATCH 26/46] Make m_log in migrations private. Define new m_log in derived class --- OpenSim/Data/Migration.cs | 2 +- OpenSim/Data/MySQL/MySQLMigrations.cs | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/OpenSim/Data/Migration.cs b/OpenSim/Data/Migration.cs index 7980c35ba0..e43d7c1feb 100644 --- a/OpenSim/Data/Migration.cs +++ b/OpenSim/Data/Migration.cs @@ -70,7 +70,7 @@ namespace OpenSim.Data public class Migration { - protected static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); protected string _type; protected DbConnection _conn; diff --git a/OpenSim/Data/MySQL/MySQLMigrations.cs b/OpenSim/Data/MySQL/MySQLMigrations.cs index b16655d1cb..959b5d0a7b 100644 --- a/OpenSim/Data/MySQL/MySQLMigrations.cs +++ b/OpenSim/Data/MySQL/MySQLMigrations.cs @@ -43,6 +43,8 @@ namespace OpenSim.Data.MySQL ///
public class MySqlMigration : Migration { + private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + public MySqlMigration() : base() { From 167db502593de5f535d8c322005c63ef263940ed Mon Sep 17 00:00:00 2001 From: Melanie Date: Wed, 19 May 2010 02:33:23 +0100 Subject: [PATCH 27/46] Allow migration steps to fail again without bringing down the house --- OpenSim/Data/MySQL/MySQLMigrations.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Data/MySQL/MySQLMigrations.cs b/OpenSim/Data/MySQL/MySQLMigrations.cs index 959b5d0a7b..a1f7844845 100644 --- a/OpenSim/Data/MySQL/MySQLMigrations.cs +++ b/OpenSim/Data/MySQL/MySQLMigrations.cs @@ -77,7 +77,7 @@ namespace OpenSim.Data.MySQL { m_log.ErrorFormat("[MySQL MIGRATION]: Error {0}", args.Exception.Message); m_log.ErrorFormat("[MySQL MIGRATION]: In SQL: {0}", args.StatementText); - throw args.Exception; + m_log.Error("[MySQL MIGRATION]: The above migration failed to complete. This may cause errors in your install, but could also be normal. Continuing."); }; scr.Execute(); } From dedc0c0bd4ebdf6f8af056c63c7aeeed70b39627 Mon Sep 17 00:00:00 2001 From: Melanie Date: Wed, 19 May 2010 02:47:31 +0100 Subject: [PATCH 28/46] Revert "Allow migration steps to fail again without bringing down the house" This reverts commit 167db502593de5f535d8c322005c63ef263940ed. --- OpenSim/Data/MySQL/MySQLMigrations.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Data/MySQL/MySQLMigrations.cs b/OpenSim/Data/MySQL/MySQLMigrations.cs index a1f7844845..959b5d0a7b 100644 --- a/OpenSim/Data/MySQL/MySQLMigrations.cs +++ b/OpenSim/Data/MySQL/MySQLMigrations.cs @@ -77,7 +77,7 @@ namespace OpenSim.Data.MySQL { m_log.ErrorFormat("[MySQL MIGRATION]: Error {0}", args.Exception.Message); m_log.ErrorFormat("[MySQL MIGRATION]: In SQL: {0}", args.StatementText); - m_log.Error("[MySQL MIGRATION]: The above migration failed to complete. This may cause errors in your install, but could also be normal. Continuing."); + throw args.Exception; }; scr.Execute(); } From 9fa8013ca5e788862a3afa8fa7a354e492d51c7e Mon Sep 17 00:00:00 2001 From: Melanie Date: Wed, 19 May 2010 03:07:31 +0100 Subject: [PATCH 29/46] Remove the return that was inserted in the last merge to allow migrations to continue in the face of an error --- OpenSim/Data/Migration.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/OpenSim/Data/Migration.cs b/OpenSim/Data/Migration.cs index e43d7c1feb..ddf8078d0a 100644 --- a/OpenSim/Data/Migration.cs +++ b/OpenSim/Data/Migration.cs @@ -202,7 +202,6 @@ namespace OpenSim.Data m_log.DebugFormat("[MIGRATIONS] Cmd was {0}", kvp.Value.ToString()); m_log.DebugFormat("[MIGRATIONS]: An error has occurred in the migration {0}.\n This may mean you could see errors trying to run OpenSim. If you see database related errors, you will need to fix the issue manually. Migration aborted.", e.Message); ExecuteScript("ROLLBACK;"); - return; } if (version == 0) From 20642f2f212d46a97bd48575dc059da327450520 Mon Sep 17 00:00:00 2001 From: Melanie Date: Wed, 19 May 2010 03:26:37 +0100 Subject: [PATCH 30/46] Fix the migration message to say "Continuing" again. Remove line feed, which prevented the full message from displaying. --- OpenSim/Data/Migration.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Data/Migration.cs b/OpenSim/Data/Migration.cs index ddf8078d0a..987eab58bc 100644 --- a/OpenSim/Data/Migration.cs +++ b/OpenSim/Data/Migration.cs @@ -200,7 +200,7 @@ namespace OpenSim.Data catch (Exception e) { m_log.DebugFormat("[MIGRATIONS] Cmd was {0}", kvp.Value.ToString()); - m_log.DebugFormat("[MIGRATIONS]: An error has occurred in the migration {0}.\n This may mean you could see errors trying to run OpenSim. If you see database related errors, you will need to fix the issue manually. Migration aborted.", e.Message); + m_log.DebugFormat("[MIGRATIONS]: An error has occurred in the migration {0}. This may mean you could see errors trying to run OpenSim. If you see database related errors, you will need to fix the issue manually. Continuing.", e.Message); ExecuteScript("ROLLBACK;"); } From 0c209a469b54a52ac7d54a7bddd2bdcf02a80522 Mon Sep 17 00:00:00 2001 From: Melanie Date: Wed, 19 May 2010 03:48:03 +0100 Subject: [PATCH 31/46] Clean up output a bit --- OpenSim/Data/Migration.cs | 13 ++++++++++--- OpenSim/Data/MySQL/MySQLMigrations.cs | 6 +----- OpenSim/Framework/Console/OpenSimAppender.cs | 2 +- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/OpenSim/Data/Migration.cs b/OpenSim/Data/Migration.cs index 987eab58bc..e54296deea 100644 --- a/OpenSim/Data/Migration.cs +++ b/OpenSim/Data/Migration.cs @@ -146,7 +146,14 @@ namespace OpenSim.Data foreach (string sql in script) { cmd.CommandText = sql; - cmd.ExecuteNonQuery(); + try + { + cmd.ExecuteNonQuery(); + } + catch + { + throw new Exception(sql); + } } } } @@ -199,8 +206,8 @@ namespace OpenSim.Data } catch (Exception e) { - m_log.DebugFormat("[MIGRATIONS] Cmd was {0}", kvp.Value.ToString()); - m_log.DebugFormat("[MIGRATIONS]: An error has occurred in the migration {0}. This may mean you could see errors trying to run OpenSim. If you see database related errors, you will need to fix the issue manually. Continuing.", e.Message); + m_log.DebugFormat("[MIGRATIONS] Cmd was {0}", e.Message); + m_log.Debug("[MIGRATIONS]: An error has occurred in the migration. This may mean you could see errors trying to run OpenSim. If you see database related errors, you will need to fix the issue manually. Continuing."); ExecuteScript("ROLLBACK;"); } diff --git a/OpenSim/Data/MySQL/MySQLMigrations.cs b/OpenSim/Data/MySQL/MySQLMigrations.cs index 959b5d0a7b..81a0e837ea 100644 --- a/OpenSim/Data/MySQL/MySQLMigrations.cs +++ b/OpenSim/Data/MySQL/MySQLMigrations.cs @@ -43,8 +43,6 @@ namespace OpenSim.Data.MySQL ///
public class MySqlMigration : Migration { - private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - public MySqlMigration() : base() { @@ -75,9 +73,7 @@ namespace OpenSim.Data.MySQL scr.Query = sql; scr.Error += delegate(object sender, MySqlScriptErrorEventArgs args) { - m_log.ErrorFormat("[MySQL MIGRATION]: Error {0}", args.Exception.Message); - m_log.ErrorFormat("[MySQL MIGRATION]: In SQL: {0}", args.StatementText); - throw args.Exception; + throw new Exception(sql); }; scr.Execute(); } diff --git a/OpenSim/Framework/Console/OpenSimAppender.cs b/OpenSim/Framework/Console/OpenSimAppender.cs index cd95506d29..282ad384b9 100644 --- a/OpenSim/Framework/Console/OpenSimAppender.cs +++ b/OpenSim/Framework/Console/OpenSimAppender.cs @@ -66,7 +66,7 @@ namespace OpenSim.Framework.Console } else { - System.Console.Write(loggingMessage); + System.Console.WriteLine(loggingMessage); } } catch (Exception e) From e4b8d76b108725fa83dd1e1f3eb909b39482e769 Mon Sep 17 00:00:00 2001 From: Melanie Date: Wed, 19 May 2010 04:17:56 +0100 Subject: [PATCH 32/46] Change appender to deal with line feeds more intelligently. Change migration error reporting to not truncate the statement when reporting. It's a bit messier than the old error reporting, but at least one gets an idea of what could be wrong again. And things look a lot neater now. --- OpenSim/Data/Migration.cs | 2 +- OpenSim/Framework/Console/OpenSimAppender.cs | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/OpenSim/Data/Migration.cs b/OpenSim/Data/Migration.cs index e54296deea..6d4807ff40 100644 --- a/OpenSim/Data/Migration.cs +++ b/OpenSim/Data/Migration.cs @@ -206,7 +206,7 @@ namespace OpenSim.Data } catch (Exception e) { - m_log.DebugFormat("[MIGRATIONS] Cmd was {0}", e.Message); + m_log.DebugFormat("[MIGRATIONS] Cmd was {0}", e.Message.Replace("\n", " ")); m_log.Debug("[MIGRATIONS]: An error has occurred in the migration. This may mean you could see errors trying to run OpenSim. If you see database related errors, you will need to fix the issue manually. Continuing."); ExecuteScript("ROLLBACK;"); } diff --git a/OpenSim/Framework/Console/OpenSimAppender.cs b/OpenSim/Framework/Console/OpenSimAppender.cs index 282ad384b9..72a251e9b1 100644 --- a/OpenSim/Framework/Console/OpenSimAppender.cs +++ b/OpenSim/Framework/Console/OpenSimAppender.cs @@ -66,7 +66,10 @@ namespace OpenSim.Framework.Console } else { - System.Console.WriteLine(loggingMessage); + if (!loggingMessage.EndsWith("\n")) + System.Console.WriteLine(loggingMessage); + else + System.Console.Write(loggingMessage); } } catch (Exception e) From 527a257b9fac15273ae232f66533f47b2112ec2e Mon Sep 17 00:00:00 2001 From: AlexRa Date: Wed, 19 May 2010 17:00:02 +0300 Subject: [PATCH 33/46] Kind of fixed Melanie's "Exception(sql)" correction Throwing an Ex. with SQL command in the message looks weird, this is a bit better, but I'm still not sure if that's the proper way to handle. Also, there is a catch one level up, so is this one necessary? --- OpenSim/Data/Migration.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenSim/Data/Migration.cs b/OpenSim/Data/Migration.cs index 6d4807ff40..4f113a2f49 100644 --- a/OpenSim/Data/Migration.cs +++ b/OpenSim/Data/Migration.cs @@ -150,9 +150,9 @@ namespace OpenSim.Data { cmd.ExecuteNonQuery(); } - catch + catch(Exception e) { - throw new Exception(sql); + throw new Exception(e.Message + " in SQL: " + sql); } } } From d71c483bf0669967d9b58aa3b70247ae800e566f Mon Sep 17 00:00:00 2001 From: AlexRa Date: Wed, 19 May 2010 10:28:37 +0300 Subject: [PATCH 34/46] Prebuild: added *.migrations as resources to MSSQL, SQLiteLegacy (just in case) --- prebuild.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/prebuild.xml b/prebuild.xml index f9608fbf92..870826cbaf 100644 --- a/prebuild.xml +++ b/prebuild.xml @@ -2175,6 +2175,7 @@ + @@ -2212,6 +2213,7 @@ + From ccee95552f07aeab003acf8dc8f5422209e41e7d Mon Sep 17 00:00:00 2001 From: AlexRa Date: Thu, 29 Apr 2010 12:42:52 +0300 Subject: [PATCH 35/46] A bit of harmless refactoring in SQLiteAssetData.cs --- OpenSim/Data/SQLite/SQLiteAssetData.cs | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/OpenSim/Data/SQLite/SQLiteAssetData.cs b/OpenSim/Data/SQLite/SQLiteAssetData.cs index 7081f99054..0fc1f2503b 100644 --- a/OpenSim/Data/SQLite/SQLiteAssetData.cs +++ b/OpenSim/Data/SQLite/SQLiteAssetData.cs @@ -194,16 +194,9 @@ namespace OpenSim.Data.SQLite cmd.Parameters.Add(new SqliteParameter(":UUID", uuid.ToString())); using (IDataReader reader = cmd.ExecuteReader()) { - if (reader.Read()) - { - reader.Close(); - return true; - } - else - { - reader.Close(); - return false; - } + bool ok = reader.Read(); + reader.Close(); + return ok; } } } From c6977cbd4d00159c034f66bfae40ee4984dea3f2 Mon Sep 17 00:00:00 2001 From: AlexRa Date: Thu, 29 Apr 2010 12:44:03 +0300 Subject: [PATCH 36/46] Added CreatorID to SQLite asset data --- OpenSim/Data/SQLite/SQLiteAssetData.cs | 42 +++++++++++++++++--------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/OpenSim/Data/SQLite/SQLiteAssetData.cs b/OpenSim/Data/SQLite/SQLiteAssetData.cs index 0fc1f2503b..40e51db42d 100644 --- a/OpenSim/Data/SQLite/SQLiteAssetData.cs +++ b/OpenSim/Data/SQLite/SQLiteAssetData.cs @@ -44,10 +44,10 @@ namespace OpenSim.Data.SQLite // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private const string SelectAssetSQL = "select * from assets where UUID=:UUID"; - private const string SelectAssetMetadataSQL = "select Name, Description, Type, Temporary, asset_flags, UUID from assets limit :start, :count"; + private const string SelectAssetMetadataSQL = "select Name, Description, Type, Temporary, asset_flags, UUID, CreatorID from assets limit :start, :count"; private const string DeleteAssetSQL = "delete from assets where UUID=:UUID"; - private const string InsertAssetSQL = "insert into assets(UUID, Name, Description, Type, Local, Temporary, asset_flags, Data) values(:UUID, :Name, :Description, :Type, :Local, :Temporary, :Flags, :Data)"; - private const string UpdateAssetSQL = "update assets set Name=:Name, Description=:Description, Type=:Type, Local=:Local, Temporary=:Temporary, asset_flags=:Flags, Data=:Data where UUID=:UUID"; + private const string InsertAssetSQL = "insert into assets(UUID, Name, Description, Type, Local, Temporary, asset_flags, CreatorID, Data) values(:UUID, :Name, :Description, :Type, :Local, :Temporary, :Flags, :CreatorID, :Data)"; + private const string UpdateAssetSQL = "update assets set Name=:Name, Description=:Description, Type=:Type, Local=:Local, Temporary=:Temporary, asset_flags=:Flags, CreatorID=:CreatorID, Data=:Data where UUID=:UUID"; private const string assetSelect = "select * from assets"; private SqliteConnection m_conn; @@ -137,6 +137,7 @@ namespace OpenSim.Data.SQLite cmd.Parameters.Add(new SqliteParameter(":Local", asset.Local)); cmd.Parameters.Add(new SqliteParameter(":Temporary", asset.Temporary)); cmd.Parameters.Add(new SqliteParameter(":Flags", asset.Flags)); + cmd.Parameters.Add(new SqliteParameter(":CreatorID", asset.Metadata.CreatorID)); cmd.Parameters.Add(new SqliteParameter(":Data", asset.Data)); cmd.ExecuteNonQuery(); @@ -156,6 +157,7 @@ namespace OpenSim.Data.SQLite cmd.Parameters.Add(new SqliteParameter(":Local", asset.Local)); cmd.Parameters.Add(new SqliteParameter(":Temporary", asset.Temporary)); cmd.Parameters.Add(new SqliteParameter(":Flags", asset.Flags)); + cmd.Parameters.Add(new SqliteParameter(":CreatorID", asset.Metadata.CreatorID)); cmd.Parameters.Add(new SqliteParameter(":Data", asset.Data)); cmd.ExecuteNonQuery(); @@ -216,7 +218,7 @@ namespace OpenSim.Data.SQLite new UUID((String)row["UUID"]), (String)row["Name"], Convert.ToSByte(row["Type"]), - UUID.Zero.ToString() + (String)row["CreatorID"] ); asset.Description = (String) row["Description"]; @@ -237,6 +239,7 @@ namespace OpenSim.Data.SQLite metadata.Type = Convert.ToSByte(row["Type"]); metadata.Temporary = Convert.ToBoolean(row["Temporary"]); // Not sure if this is correct. metadata.Flags = (AssetFlags)Convert.ToInt32(row["asset_flags"]); + metadata.CreatorID = row["CreatorID"].ToString(); // Current SHA1s are not stored/computed. metadata.SHA1 = new byte[] {}; @@ -321,6 +324,25 @@ namespace OpenSim.Data.SQLite get { return "SQLite Asset storage engine"; } } + // TODO: (AlexRa): one of these is to be removed eventually (?) + + /// + /// Delete an asset from database + /// + /// + public bool DeleteAsset(UUID uuid) + { + lock (this) + { + using (SqliteCommand cmd = new SqliteCommand(DeleteAssetSQL, m_conn)) + { + cmd.Parameters.Add(new SqliteParameter(":UUID", uuid.ToString())); + cmd.ExecuteNonQuery(); + } + } + return true; + } + public override bool Delete(string id) { UUID assetID; @@ -328,17 +350,7 @@ namespace OpenSim.Data.SQLite if (!UUID.TryParse(id, out assetID)) return false; - lock (this) - { - using (SqliteCommand cmd = new SqliteCommand(DeleteAssetSQL, m_conn)) - { - cmd.Parameters.Add(new SqliteParameter(":UUID", assetID.ToString())); - - cmd.ExecuteNonQuery(); - } - } - - return true; + return DeleteAsset(assetID); } #endregion From accf8c420de3b77f80e35c848291b2bb358f6a14 Mon Sep 17 00:00:00 2001 From: AlexRa Date: Wed, 19 May 2010 10:07:48 +0300 Subject: [PATCH 37/46] SQLite: CreatorID added (and asset_flags moved) to the migration script --- .../SQLite/Resources/AssetStore.migrations | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/OpenSim/Data/SQLite/Resources/AssetStore.migrations b/OpenSim/Data/SQLite/Resources/AssetStore.migrations index fb72b91af9..bc11e13d38 100644 --- a/OpenSim/Data/SQLite/Resources/AssetStore.migrations +++ b/OpenSim/Data/SQLite/Resources/AssetStore.migrations @@ -40,3 +40,27 @@ update assets COMMIT; +:VERSION 5 + +BEGIN TRANSACTION; + +CREATE TEMPORARY TABLE assets_backup(UUID,Name,Description,Type,Local,Temporary,Data); +INSERT INTO assets_backup SELECT UUID,Name,Description,Type,Local,Temporary,Data FROM assets; +DROP TABLE assets; +CREATE TABLE assets( + UUID NOT NULL PRIMARY KEY, + Name, + Description, + Type, + Local, + Temporary, + asset_flags INTEGER NOT NULL DEFAULT 0, + CreatorID varchar(36) default '', + Data); + +INSERT INTO assets(UUID,Name,Description,Type,Local,Temporary,Data) +SELECT UUID,Name,Description,Type,Local,Temporary,Data FROM assets_backup; +DROP TABLE assets_backup; + +COMMIT; + From eacd8d0263fa41c4d45c880b02f5be709eaab32f Mon Sep 17 00:00:00 2001 From: AlexRa Date: Wed, 19 May 2010 10:16:56 +0300 Subject: [PATCH 38/46] MySQL: added CreatorID, moved asset_flag to migration script --- OpenSim/Data/MySQL/Resources/AssetStore.migrations | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/OpenSim/Data/MySQL/Resources/AssetStore.migrations b/OpenSim/Data/MySQL/Resources/AssetStore.migrations index b9595f0f47..3fd58b772c 100644 --- a/OpenSim/Data/MySQL/Resources/AssetStore.migrations +++ b/OpenSim/Data/MySQL/Resources/AssetStore.migrations @@ -67,3 +67,11 @@ COMMIT; DELETE FROM assets WHERE id = 'dc4b9f0b-d008-45c6-96a4-01dd947ac621' +:VERSION 7 + +ALTER TABLE assets ADD COLUMN asset_flags INTEGER NOT NULL DEFAULT 0; + +:VERSION 8 + +alter table assets add CreatorID varchar(36) not null default '' + From 64fe823b9255f0314277f80926435d5525039a2d Mon Sep 17 00:00:00 2001 From: AlexRa Date: Wed, 19 May 2010 21:30:16 +0300 Subject: [PATCH 39/46] MySQLAssetData.cs now supports asset_flags, CreatorID --- OpenSim/Data/MySQL/MySQLAssetData.cs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/OpenSim/Data/MySQL/MySQLAssetData.cs b/OpenSim/Data/MySQL/MySQLAssetData.cs index ec18c28391..fe5152ad85 100644 --- a/OpenSim/Data/MySQL/MySQLAssetData.cs +++ b/OpenSim/Data/MySQL/MySQLAssetData.cs @@ -112,7 +112,7 @@ namespace OpenSim.Data.MySQL dbcon.Open(); using (MySqlCommand cmd = new MySqlCommand( - "SELECT name, description, assetType, local, temporary, asset_flags, data FROM assets WHERE id=?id", + "SELECT name, description, assetType, local, temporary, asset_flags, CreatorID, data FROM assets WHERE id=?id", dbcon)) { cmd.Parameters.AddWithValue("?id", assetID.ToString()); @@ -123,7 +123,7 @@ namespace OpenSim.Data.MySQL { if (dbReader.Read()) { - asset = new AssetBase(assetID, (string)dbReader["name"], (sbyte)dbReader["assetType"], UUID.Zero.ToString()); + asset = new AssetBase(assetID, (string)dbReader["name"], (sbyte)dbReader["assetType"], dbReader["CreatorID"].ToString()); asset.Data = (byte[])dbReader["data"]; asset.Description = (string)dbReader["description"]; @@ -163,8 +163,8 @@ namespace OpenSim.Data.MySQL MySqlCommand cmd = new MySqlCommand( - "replace INTO assets(id, name, description, assetType, local, temporary, create_time, access_time, asset_flags, data)" + - "VALUES(?id, ?name, ?description, ?assetType, ?local, ?temporary, ?create_time, ?access_time, ?asset_flags, ?data)", + "replace INTO assets(id, name, description, assetType, local, temporary, create_time, access_time, asset_flags, CreatorID, data)" + + "VALUES(?id, ?name, ?description, ?assetType, ?local, ?temporary, ?create_time, ?access_time, ?asset_flags, ?CreatorID, ?data)", dbcon); string assetName = asset.Name; @@ -196,6 +196,7 @@ namespace OpenSim.Data.MySQL cmd.Parameters.AddWithValue("?temporary", asset.Temporary); cmd.Parameters.AddWithValue("?create_time", now); cmd.Parameters.AddWithValue("?access_time", now); + cmd.Parameters.AddWithValue("?CreatorID", asset.Metadata.CreatorID); cmd.Parameters.AddWithValue("?asset_flags", (int)asset.Flags); cmd.Parameters.AddWithValue("?data", asset.Data); cmd.ExecuteNonQuery(); @@ -305,7 +306,7 @@ namespace OpenSim.Data.MySQL using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) { dbcon.Open(); - MySqlCommand cmd = new MySqlCommand("SELECT name,description,assetType,temporary,id,asset_flags FROM assets LIMIT ?start, ?count", dbcon); + MySqlCommand cmd = new MySqlCommand("SELECT name,description,assetType,temporary,id,asset_flags,CreatorID FROM assets LIMIT ?start, ?count", dbcon); cmd.Parameters.AddWithValue("?start", start); cmd.Parameters.AddWithValue("?count", count); @@ -322,6 +323,7 @@ namespace OpenSim.Data.MySQL metadata.Temporary = Convert.ToBoolean(dbReader["temporary"]); // Not sure if this is correct. metadata.Flags = (AssetFlags)Convert.ToInt32(dbReader["asset_flags"]); metadata.FullID = DBGuid.FromDB(dbReader["id"]); + metadata.CreatorID = dbReader["CreatorID"].ToString(); // Current SHA1s are not stored/computed. metadata.SHA1 = new byte[] { }; From d6a6668bd7230099b18e1c45556160fc36bcce8d Mon Sep 17 00:00:00 2001 From: AlexRa Date: Tue, 27 Apr 2010 09:53:01 +0300 Subject: [PATCH 40/46] Scrambled asset type in BasicAssetTest.cs! The asset type wasn't in the list of "DontScramble" fields, so the test assets were stored with randomized type, which caused exception on reading them. Also the scrambler was moved from local var to the class level, so it could be used in the new tests I've added (see the next commit). --- OpenSim/Data/Tests/BasicAssetTest.cs | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/OpenSim/Data/Tests/BasicAssetTest.cs b/OpenSim/Data/Tests/BasicAssetTest.cs index e80cff96b8..cd6903b08f 100644 --- a/OpenSim/Data/Tests/BasicAssetTest.cs +++ b/OpenSim/Data/Tests/BasicAssetTest.cs @@ -43,6 +43,7 @@ namespace OpenSim.Data.Tests public UUID uuid2; public UUID uuid3; public byte[] asset1; + PropertyScrambler scrambler; public void SuperInit() { @@ -53,6 +54,15 @@ namespace OpenSim.Data.Tests uuid3 = UUID.Random(); asset1 = new byte[100]; asset1.Initialize(); + + scrambler = new PropertyScrambler() + .DontScramble(x => x.ID) + .DontScramble(x => x.FullID) + .DontScramble(x => x.Metadata.ID) + .DontScramble(x => x.Metadata.Type) + .DontScramble(x => x.Metadata.CreatorID) + .DontScramble(x => x.Metadata.ContentType) + .DontScramble(x => x.Metadata.FullID); } [Test] @@ -73,15 +83,6 @@ namespace OpenSim.Data.Tests a2.Data = asset1; a3.Data = asset1; - PropertyScrambler scrambler = new PropertyScrambler() - .DontScramble(x => x.Data) - .DontScramble(x => x.ID) - .DontScramble(x => x.FullID) - .DontScramble(x => x.Metadata.ID) - .DontScramble(x => x.Metadata.CreatorID) - .DontScramble(x => x.Metadata.ContentType) - .DontScramble(x => x.Metadata.FullID); - scrambler.Scramble(a1); scrambler.Scramble(a2); scrambler.Scramble(a3); From ce787a4c413cbfc70f4e31e49510e19127c9b01b Mon Sep 17 00:00:00 2001 From: AlexRa Date: Wed, 19 May 2010 16:55:31 +0300 Subject: [PATCH 41/46] Series of patches to include creator ID in assets. Contains a migration. SQLite: May contain nuts. The SQLite migration copies the entire asset table. Be prepared for quite a wait. Don't interrupt it. Back up your assets db. BasicAssetTest checks CreatorID storage, new test for weird CreatorID (now also checks that non-GUID or empty CreatorID gets stored correctly) Signed-off-by: Melanie --- OpenSim/Data/Tests/BasicAssetTest.cs | 39 +++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/OpenSim/Data/Tests/BasicAssetTest.cs b/OpenSim/Data/Tests/BasicAssetTest.cs index cd6903b08f..71d6314690 100644 --- a/OpenSim/Data/Tests/BasicAssetTest.cs +++ b/OpenSim/Data/Tests/BasicAssetTest.cs @@ -42,6 +42,9 @@ namespace OpenSim.Data.Tests public UUID uuid1; public UUID uuid2; public UUID uuid3; + public string critter1 = UUID.Random().ToString(); + public string critter2 = UUID.Random().ToString(); + public string critter3 = UUID.Random().ToString(); public byte[] asset1; PropertyScrambler scrambler; @@ -54,6 +57,7 @@ namespace OpenSim.Data.Tests uuid3 = UUID.Random(); asset1 = new byte[100]; asset1.Initialize(); + scrambler = new PropertyScrambler() .DontScramble(x => x.ID) @@ -76,9 +80,9 @@ namespace OpenSim.Data.Tests [Test] public void T010_StoreSimpleAsset() { - AssetBase a1 = new AssetBase(uuid1, "asset one", (sbyte)AssetType.Texture, UUID.Zero.ToString()); - AssetBase a2 = new AssetBase(uuid2, "asset two", (sbyte)AssetType.Texture, UUID.Zero.ToString()); - AssetBase a3 = new AssetBase(uuid3, "asset three", (sbyte)AssetType.Texture, UUID.Zero.ToString()); + AssetBase a1 = new AssetBase(uuid1, "asset one", (sbyte)AssetType.Texture, critter1); + AssetBase a2 = new AssetBase(uuid2, "asset two", (sbyte)AssetType.Texture, critter2); + AssetBase a3 = new AssetBase(uuid3, "asset three", (sbyte)AssetType.Texture, critter3); a1.Data = asset1; a2.Data = asset1; a3.Data = asset1; @@ -87,7 +91,6 @@ namespace OpenSim.Data.Tests scrambler.Scramble(a2); scrambler.Scramble(a3); - db.StoreAsset(a1); db.StoreAsset(a2); db.StoreAsset(a3); @@ -131,5 +134,33 @@ namespace OpenSim.Data.Tests Assert.That(metadata.Temporary, Is.EqualTo(a1b.Temporary)); Assert.That(metadata.FullID, Is.EqualTo(a1b.FullID)); } + + + [Test] + public void T020_CheckForWeirdCreatorID() + { + // It is expected that eventually the CreatorID might be an arbitrary string (an URI) + // rather than a valid UUID (?). This test is to make sure that the database layer does not + // attempt to convert CreatorID to GUID, but just passes it both ways as a string. + AssetBase a1 = new AssetBase(uuid1, "asset one", (sbyte)AssetType.Texture, critter1); + AssetBase a2 = new AssetBase(uuid2, "asset two", (sbyte)AssetType.Texture, "This is not a GUID!"); + AssetBase a3 = new AssetBase(uuid3, "asset three", (sbyte)AssetType.Texture, ""); + a1.Data = asset1; + a2.Data = asset1; + a3.Data = asset1; + + db.StoreAsset(a1); + db.StoreAsset(a2); + db.StoreAsset(a3); + + AssetBase a1a = db.GetAsset(uuid1); + Assert.That(a1a, Constraints.PropertyCompareConstraint(a1)); + + AssetBase a2a = db.GetAsset(uuid2); + Assert.That(a2a, Constraints.PropertyCompareConstraint(a2)); + + AssetBase a3a = db.GetAsset(uuid3); + Assert.That(a3a, Constraints.PropertyCompareConstraint(a3)); + } } } From 859beaf830ecf554b82d150e6f805e096e927df7 Mon Sep 17 00:00:00 2001 From: Melanie Date: Thu, 20 May 2010 11:03:38 +0100 Subject: [PATCH 42/46] Revert one of the previous patches' hunks. The new code looked better, but was less efficient. --- OpenSim/Data/SQLite/SQLiteAssetData.cs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/OpenSim/Data/SQLite/SQLiteAssetData.cs b/OpenSim/Data/SQLite/SQLiteAssetData.cs index 40e51db42d..16e560c6df 100644 --- a/OpenSim/Data/SQLite/SQLiteAssetData.cs +++ b/OpenSim/Data/SQLite/SQLiteAssetData.cs @@ -196,9 +196,16 @@ namespace OpenSim.Data.SQLite cmd.Parameters.Add(new SqliteParameter(":UUID", uuid.ToString())); using (IDataReader reader = cmd.ExecuteReader()) { - bool ok = reader.Read(); - reader.Close(); - return ok; + if (reader.Read()) + { + reader.Close(); + return true; + } + else + { + reader.Close(); + return false; + } } } } From 59dec2f989474158c94a2383b150c25d132777aa Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 20 May 2010 11:51:57 -0700 Subject: [PATCH 43/46] * Added sessionID to IGridUserService.SetLastPosition(), as some connectors will want to track position against sessionID instead of userID * Updated SimianPresenceServiceConnector to use the new LoggedOut/SetHome/etc methods and only update session position on parcel crossing --- .../GridUser/ActivityDetector.cs | 4 +- .../GridUser/LocalGridUserServiceConnector.cs | 4 +- .../RemoteGridUserServiceConnector.cs | 4 +- .../GridUser/GridUserServerPostHandler.cs | 3 +- .../GridUser/GridUserServiceConnector.cs | 2 +- .../SimianGrid/SimianActivityDetector.cs | 113 +++++++++++ .../SimianPresenceServiceConnector.cs | 187 ++++++------------ .../Services/Interfaces/IGridUserService.cs | 2 +- .../UserAccountService/GridUserService.cs | 2 +- 9 files changed, 189 insertions(+), 132 deletions(-) create mode 100644 OpenSim/Services/Connectors/SimianGrid/SimianActivityDetector.cs diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/GridUser/ActivityDetector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/GridUser/ActivityDetector.cs index 6c01927c5e..7d2dc5a9cc 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/GridUser/ActivityDetector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/GridUser/ActivityDetector.cs @@ -72,7 +72,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.GridUser { m_log.DebugFormat("[ACTIVITY DETECTOR]: Detected root presence {0} in {1}", sp.UUID, sp.Scene.RegionInfo.RegionName); - m_GridUserService.SetLastPosition(sp.UUID.ToString(), sp.Scene.RegionInfo.RegionID, sp.AbsolutePosition, sp.Lookat); + m_GridUserService.SetLastPosition(sp.UUID.ToString(), sp.ControllingClient.SessionId, sp.Scene.RegionInfo.RegionID, sp.AbsolutePosition, sp.Lookat); } public void OnNewClient(IClientAPI client) @@ -109,7 +109,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.GridUser { // TODO: grab the parcel ID from ILandModule // and send that along - m_GridUserService.SetLastPosition(sp.UUID.ToString(), sp.Scene.RegionInfo.RegionID, sp.AbsolutePosition, sp.Lookat); + m_GridUserService.SetLastPosition(sp.UUID.ToString(), sp.ControllingClient.SessionId, sp.Scene.RegionInfo.RegionID, sp.AbsolutePosition, sp.Lookat); } } diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/GridUser/LocalGridUserServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/GridUser/LocalGridUserServiceConnector.cs index d914a576e1..76e030fea0 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/GridUser/LocalGridUserServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/GridUser/LocalGridUserServiceConnector.cs @@ -162,9 +162,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.GridUser return m_GridUserService.SetHome(userID, homeID, homePosition, homeLookAt); } - public bool SetLastPosition(string userID, UUID regionID, Vector3 lastPosition, Vector3 lastLookAt) + public bool SetLastPosition(string userID, UUID sessionID, UUID regionID, Vector3 lastPosition, Vector3 lastLookAt) { - return m_GridUserService.SetLastPosition(userID, regionID, lastPosition, lastLookAt); + return m_GridUserService.SetLastPosition(userID, sessionID, regionID, lastPosition, lastLookAt); } public GridUserInfo GetGridUserInfo(string userID) diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/GridUser/RemoteGridUserServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/GridUser/RemoteGridUserServiceConnector.cs index e3e2e619c1..fb11e9a454 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/GridUser/RemoteGridUserServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/GridUser/RemoteGridUserServiceConnector.cs @@ -137,9 +137,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.GridUser return m_RemoteConnector.SetHome(userID, regionID, position, lookAt); } - public bool SetLastPosition(string userID, UUID regionID, Vector3 position, Vector3 lookAt) + public bool SetLastPosition(string userID, UUID sessionID, UUID regionID, Vector3 position, Vector3 lookAt) { - return m_RemoteConnector.SetLastPosition(userID, regionID, position, lookAt); + return m_RemoteConnector.SetLastPosition(userID, sessionID, regionID, position, lookAt); } public GridUserInfo GetGridUserInfo(string userID) diff --git a/OpenSim/Server/Handlers/GridUser/GridUserServerPostHandler.cs b/OpenSim/Server/Handlers/GridUser/GridUserServerPostHandler.cs index f8fa42967f..b1e7eac41c 100644 --- a/OpenSim/Server/Handlers/GridUser/GridUserServerPostHandler.cs +++ b/OpenSim/Server/Handlers/GridUser/GridUserServerPostHandler.cs @@ -156,6 +156,7 @@ namespace OpenSim.Server.Handlers.GridUser byte[] SetPosition(Dictionary request) { string user = string.Empty; + UUID sessionID = UUID.Zero; UUID region = UUID.Zero; Vector3 position = new Vector3(128, 128, 70); Vector3 look = Vector3.Zero; @@ -166,7 +167,7 @@ namespace OpenSim.Server.Handlers.GridUser if (!UnpackArgs(request, out user, out region, out position, out look)) return FailureResult(); - if (m_GridUserService.SetLastPosition(user, region, position, look)) + if (m_GridUserService.SetLastPosition(user, sessionID, region, position, look)) return SuccessResult(); return FailureResult(); diff --git a/OpenSim/Services/Connectors/GridUser/GridUserServiceConnector.cs b/OpenSim/Services/Connectors/GridUser/GridUserServiceConnector.cs index b4500a5f55..f222e31cfa 100644 --- a/OpenSim/Services/Connectors/GridUser/GridUserServiceConnector.cs +++ b/OpenSim/Services/Connectors/GridUser/GridUserServiceConnector.cs @@ -123,7 +123,7 @@ namespace OpenSim.Services.Connectors return Set(sendData, userID, regionID, position, lookAt); } - public bool SetLastPosition(string userID, UUID regionID, Vector3 position, Vector3 lookAt) + public bool SetLastPosition(string userID, UUID sessionID, UUID regionID, Vector3 position, Vector3 lookAt) { Dictionary sendData = new Dictionary(); //sendData["SCOPEID"] = scopeID.ToString(); diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianActivityDetector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianActivityDetector.cs new file mode 100644 index 0000000000..8cc5671538 --- /dev/null +++ b/OpenSim/Services/Connectors/SimianGrid/SimianActivityDetector.cs @@ -0,0 +1,113 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections.Generic; +using System.Reflection; +using OpenSim.Framework; +using OpenSim.Region.Framework.Scenes; +using OpenSim.Services.Interfaces; +using OpenMetaverse; +using log4net; + +namespace OpenSim.Services.Connectors.SimianGrid +{ + public class SimianActivityDetector + { + private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + private IGridUserService m_GridUserService; + private Scene m_aScene; + + public SimianActivityDetector(IGridUserService guservice) + { + m_GridUserService = guservice; + m_log.DebugFormat("[SIMIAN ACTIVITY DETECTOR]: Started"); + } + + public void AddRegion(Scene scene) + { + // For now the only events we listen to are these + // But we could trigger the position update more often + scene.EventManager.OnMakeRootAgent += OnMakeRootAgent; + scene.EventManager.OnNewClient += OnNewClient; + scene.EventManager.OnAvatarEnteringNewParcel += OnEnteringNewParcel; + + if (m_aScene == null) + m_aScene = scene; + } + + public void RemoveRegion(Scene scene) + { + scene.EventManager.OnMakeRootAgent -= OnMakeRootAgent; + scene.EventManager.OnNewClient -= OnNewClient; + scene.EventManager.OnAvatarEnteringNewParcel -= OnEnteringNewParcel; + } + + public void OnMakeRootAgent(ScenePresence sp) + { + m_log.DebugFormat("[SIMIAN ACTIVITY DETECTOR]: Detected root presence {0} in {1}", sp.UUID, sp.Scene.RegionInfo.RegionName); + m_GridUserService.SetLastPosition(sp.UUID.ToString(), sp.ControllingClient.SessionId, sp.Scene.RegionInfo.RegionID, sp.AbsolutePosition, sp.Lookat); + } + + public void OnNewClient(IClientAPI client) + { + client.OnConnectionClosed += OnConnectionClose; + } + + public void OnConnectionClose(IClientAPI client) + { + if (client.IsLoggingOut) + { + object sp = null; + Vector3 position = new Vector3(128, 128, 0); + Vector3 lookat = new Vector3(0, 1, 0); + + if (client.Scene.TryGetScenePresence(client.AgentId, out sp)) + { + if (sp is ScenePresence) + { + if (((ScenePresence)sp).IsChildAgent) + return; + + position = ((ScenePresence)sp).AbsolutePosition; + lookat = ((ScenePresence)sp).Lookat; + } + } + + m_log.DebugFormat("[SIMIAN ACTIVITY DETECTOR]: Detected client logout {0} in {1}", client.AgentId, client.Scene.RegionInfo.RegionName); + m_GridUserService.LoggedOut(client.AgentId.ToString(), client.Scene.RegionInfo.RegionID, position, lookat); + } + + } + + void OnEnteringNewParcel(ScenePresence sp, int localLandID, UUID regionID) + { + m_GridUserService.SetLastPosition(sp.UUID.ToString(), sp.ControllingClient.SessionId, sp.Scene.RegionInfo.RegionID, sp.AbsolutePosition, sp.Lookat); + } + } +} diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianPresenceServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianPresenceServiceConnector.cs index b86c45c033..ec9cf6704f 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianPresenceServiceConnector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianPresenceServiceConnector.cs @@ -58,6 +58,7 @@ namespace OpenSim.Services.Connectors.SimianGrid MethodBase.GetCurrentMethod().DeclaringType); private string m_serverUrl = String.Empty; + private SimianActivityDetector m_activityDetector; #region ISharedRegionModule @@ -66,7 +67,7 @@ namespace OpenSim.Services.Connectors.SimianGrid public void PostInitialise() { } public void Close() { } - public SimianPresenceServiceConnector() { } + public SimianPresenceServiceConnector() { m_activityDetector = new SimianActivityDetector(this); } public string Name { get { return "SimianPresenceServiceConnector"; } } public void AddRegion(Scene scene) { @@ -75,9 +76,7 @@ namespace OpenSim.Services.Connectors.SimianGrid scene.RegisterModuleInterface(this); scene.RegisterModuleInterface(this); - scene.EventManager.OnMakeRootAgent += MakeRootAgentHandler; - scene.EventManager.OnNewClient += NewClientHandler; - scene.EventManager.OnSignificantClientMovement += SignificantClientMovementHandler; + m_activityDetector.AddRegion(scene); LogoutRegionAgents(scene.RegionInfo.RegionID); } @@ -89,9 +88,7 @@ namespace OpenSim.Services.Connectors.SimianGrid scene.UnregisterModuleInterface(this); scene.UnregisterModuleInterface(this); - scene.EventManager.OnMakeRootAgent -= MakeRootAgentHandler; - scene.EventManager.OnNewClient -= NewClientHandler; - scene.EventManager.OnSignificantClientMovement -= SignificantClientMovementHandler; + m_activityDetector.RemoveRegion(scene); LogoutRegionAgents(scene.RegionInfo.RegionID); } @@ -193,29 +190,8 @@ namespace OpenSim.Services.Connectors.SimianGrid public bool ReportAgent(UUID sessionID, UUID regionID) { - return ReportAgent(sessionID, regionID, Vector3.Zero, Vector3.Zero); - } - - protected bool ReportAgent(UUID sessionID, UUID regionID, Vector3 position, Vector3 lookAt) - { - //m_log.DebugFormat("[SIMIAN PRESENCE CONNECTOR]: Updating session data for agent with sessionID " + sessionID); - - NameValueCollection requestArgs = new NameValueCollection - { - { "RequestMethod", "UpdateSession" }, - { "SessionID", sessionID.ToString() }, - { "SceneID", regionID.ToString() }, - { "ScenePosition", position.ToString() }, - { "SceneLookAt", lookAt.ToString() } - }; - - OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); - bool success = response["Success"].AsBoolean(); - - if (!success) - m_log.Warn("[SIMIAN PRESENCE CONNECTOR]: Failed to update agent session " + sessionID + ": " + response["Message"].AsString()); - - return success; + // Not needed for SimianGrid + return true; } public PresenceInfo GetAgent(UUID sessionID) @@ -274,14 +250,27 @@ namespace OpenSim.Services.Connectors.SimianGrid public GridUserInfo LoggedIn(string userID) { - // never implemented at the sim + // Never implemented at the sim return null; } public bool LoggedOut(string userID, UUID regionID, Vector3 lastPosition, Vector3 lastLookAt) { - // Not needed for simian grid, event handler is doing it - return true; + // Save our last position as user data + NameValueCollection requestArgs = new NameValueCollection + { + { "RequestMethod", "AddUserData" }, + { "UserID", userID.ToString() }, + { "LastLocation", SerializeLocation(regionID, lastPosition, lastLookAt) } + }; + + OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); + bool success = response["Success"].AsBoolean(); + + if (!success) + m_log.Warn("[SIMIAN PRESENCE CONNECTOR]: Failed to set last location for " + userID + ": " + response["Message"].AsString()); + + return success; } public bool SetHome(string userID, UUID regionID, Vector3 position, Vector3 lookAt) @@ -304,10 +293,9 @@ namespace OpenSim.Services.Connectors.SimianGrid return success; } - public bool SetLastPosition(string userID, UUID regionID, Vector3 lastPosition, Vector3 lastLookAt) + public bool SetLastPosition(string userID, UUID sessionID, UUID regionID, Vector3 lastPosition, Vector3 lastLookAt) { - // Not needed for simian grid, presence detection is doing it - return true; + return UpdateSession(sessionID, regionID, lastPosition, lastLookAt); } public GridUserInfo GetGridUserInfo(string user) @@ -334,54 +322,6 @@ namespace OpenSim.Services.Connectors.SimianGrid #endregion - #region Presence Detection - - private void MakeRootAgentHandler(ScenePresence sp) - { - m_log.DebugFormat("[PRESENCE DETECTOR]: Detected root presence {0} in {1}", sp.UUID, sp.Scene.RegionInfo.RegionName); - - ReportAgent(sp.ControllingClient.SessionId, sp.Scene.RegionInfo.RegionID, sp.AbsolutePosition, sp.Lookat); - SetLastLocation(sp.UUID, sp.Scene.RegionInfo.RegionID, sp.AbsolutePosition, sp.Lookat); - } - - private void NewClientHandler(IClientAPI client) - { - client.OnConnectionClosed += LogoutHandler; - } - - private void SignificantClientMovementHandler(IClientAPI client) - { - ScenePresence sp; - if (client.Scene is Scene && ((Scene)client.Scene).TryGetScenePresence(client.AgentId, out sp)) - ReportAgent(sp.ControllingClient.SessionId, sp.Scene.RegionInfo.RegionID, sp.AbsolutePosition, sp.Lookat); - } - - private void LogoutHandler(IClientAPI client) - { - if (client.IsLoggingOut) - { - client.OnConnectionClosed -= LogoutHandler; - - object obj; - if (client.Scene.TryGetScenePresence(client.AgentId, out obj) && obj is ScenePresence) - { - // The avatar is still in the scene, we can get the exact logout position - ScenePresence sp = (ScenePresence)obj; - SetLastLocation(client.AgentId, client.Scene.RegionInfo.RegionID, sp.AbsolutePosition, sp.Lookat); - } - else - { - // The avatar was already removed from the scene, store LastLocation using the most recent session data - m_log.Warn("[PRESENCE]: " + client.Name + " has already been removed from the scene, storing approximate LastLocation"); - SetLastLocation(client.SessionId); - } - - LogoutAgent(client.SessionId); - } - } - - #endregion Presence Detection - #region Helpers private OSDMap GetUserData(UUID userID) @@ -453,57 +393,60 @@ namespace OpenSim.Services.Connectors.SimianGrid return presences; } - /// - /// Fetch the last known avatar location with GetSession and persist it - /// as user data with AddUserData - /// - private bool SetLastLocation(UUID sessionID) + private bool UpdateSession(UUID sessionID, UUID regionID, Vector3 lastPosition, Vector3 lastLookAt) { + // Save our current location as session data NameValueCollection requestArgs = new NameValueCollection { - { "RequestMethod", "GetSession" }, - { "SessionID", sessionID.ToString() } + { "RequestMethod", "UpdateSession" }, + { "SessionID", sessionID.ToString() }, + { "SceneID", regionID.ToString() }, + { "ScenePosition", lastPosition.ToString() }, + { "SceneLookAt", lastLookAt.ToString() } }; OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); bool success = response["Success"].AsBoolean(); - if (success) - { - UUID userID = response["UserID"].AsUUID(); - UUID sceneID = response["SceneID"].AsUUID(); - Vector3 position = response["ScenePosition"].AsVector3(); - Vector3 lookAt = response["SceneLookAt"].AsVector3(); - - return SetLastLocation(userID, sceneID, position, lookAt); - } - else - { - m_log.Warn("[SIMIAN PRESENCE CONNECTOR]: Failed to retrieve presence information for session " + sessionID + - " while saving last location: " + response["Message"].AsString()); - } - - return success; - } - - private bool SetLastLocation(UUID userID, UUID sceneID, Vector3 position, Vector3 lookAt) - { - NameValueCollection requestArgs = new NameValueCollection - { - { "RequestMethod", "AddUserData" }, - { "UserID", userID.ToString() }, - { "LastLocation", SerializeLocation(sceneID, position, lookAt) } - }; - - OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); - bool success = response["Success"].AsBoolean(); - if (!success) - m_log.Warn("[SIMIAN PRESENCE CONNECTOR]: Failed to set last location for " + userID + ": " + response["Message"].AsString()); + m_log.Warn("[SIMIAN PRESENCE CONNECTOR]: Failed to update agent session " + sessionID + ": " + response["Message"].AsString()); return success; } + ///// + ///// Fetch the last known avatar location with GetSession and persist it + ///// as user data with AddUserData + ///// + //private bool SetLastLocation(UUID sessionID) + //{ + // NameValueCollection requestArgs = new NameValueCollection + // { + // { "RequestMethod", "GetSession" }, + // { "SessionID", sessionID.ToString() } + // }; + + // OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); + // bool success = response["Success"].AsBoolean(); + + // if (success) + // { + // UUID userID = response["UserID"].AsUUID(); + // UUID sceneID = response["SceneID"].AsUUID(); + // Vector3 position = response["ScenePosition"].AsVector3(); + // Vector3 lookAt = response["SceneLookAt"].AsVector3(); + + // return SetLastLocation(userID, sceneID, position, lookAt); + // } + // else + // { + // m_log.Warn("[SIMIAN PRESENCE CONNECTOR]: Failed to retrieve presence information for session " + sessionID + + // " while saving last location: " + response["Message"].AsString()); + // } + + // return success; + //} + private PresenceInfo ResponseToPresenceInfo(OSDMap sessionResponse, OSDMap userResponse) { if (sessionResponse == null) diff --git a/OpenSim/Services/Interfaces/IGridUserService.cs b/OpenSim/Services/Interfaces/IGridUserService.cs index e629dffda4..3d11b3e16f 100644 --- a/OpenSim/Services/Interfaces/IGridUserService.cs +++ b/OpenSim/Services/Interfaces/IGridUserService.cs @@ -108,7 +108,7 @@ namespace OpenSim.Services.Interfaces bool LoggedOut(string userID, UUID regionID, Vector3 lastPosition, Vector3 lastLookAt); bool SetHome(string userID, UUID homeID, Vector3 homePosition, Vector3 homeLookAt); - bool SetLastPosition(string userID, UUID regionID, Vector3 lastPosition, Vector3 lastLookAt); + bool SetLastPosition(string userID, UUID sessionID, UUID regionID, Vector3 lastPosition, Vector3 lastLookAt); GridUserInfo GetGridUserInfo(string userID); } diff --git a/OpenSim/Services/UserAccountService/GridUserService.cs b/OpenSim/Services/UserAccountService/GridUserService.cs index 697ba639d2..00a1ae2e60 100644 --- a/OpenSim/Services/UserAccountService/GridUserService.cs +++ b/OpenSim/Services/UserAccountService/GridUserService.cs @@ -139,7 +139,7 @@ namespace OpenSim.Services.UserAccountService return m_Database.Store(d); } - public bool SetLastPosition(string userID, UUID regionID, Vector3 lastPosition, Vector3 lastLookAt) + public bool SetLastPosition(string userID, UUID sessionID, UUID regionID, Vector3 lastPosition, Vector3 lastLookAt) { //m_log.DebugFormat("[Grid User Service]: SetLastPosition for {0}", userID); GridUserData d = m_Database.Get(userID); From 56f3cb6da0ff48a9af0e11c5b1769788cc0a1a22 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 20 May 2010 12:04:12 -0700 Subject: [PATCH 44/46] * Don't send texture data for prims in ImprovedTerseObjectUpdate packets unless we were asked to --- OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index 11dca8db89..07c3a6a91b 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs @@ -4363,7 +4363,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP acceleration = part.Acceleration; angularVelocity = part.AngularVelocity; rotation = part.RotationOffset; - textureEntry = part.Shape.TextureEntry; + + if (sendTexture) + textureEntry = part.Shape.TextureEntry; + else + textureEntry = null; } #endregion ScenePresence/SOP Handling From 13c22015e588284df1b74b7f5edad0df97ca3d3c Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Thu, 20 May 2010 15:14:14 -0700 Subject: [PATCH 45/46] Removed sessionID from GridUserservice again. Removed parcel crossing detection from Robust connector. Fixed Simian to continue to send those location updates upon parcel crossing, without changing the interface. --- .../ServiceConnectorsOut/GridUser/ActivityDetector.cs | 10 +--------- .../GridUser/LocalGridUserServiceConnector.cs | 4 ++-- .../GridUser/RemoteGridUserServiceConnector.cs | 4 ++-- .../Handlers/GridUser/GridUserServerPostHandler.cs | 3 +-- .../Connectors/GridUser/GridUserServiceConnector.cs | 4 ++-- .../Connectors/SimianGrid/SimianActivityDetector.cs | 4 ++-- .../SimianGrid/SimianPresenceServiceConnector.cs | 6 ++++++ OpenSim/Services/Interfaces/IGridUserService.cs | 2 +- OpenSim/Services/UserAccountService/GridUserService.cs | 2 +- 9 files changed, 18 insertions(+), 21 deletions(-) diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/GridUser/ActivityDetector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/GridUser/ActivityDetector.cs index 7d2dc5a9cc..83c8eac8b3 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/GridUser/ActivityDetector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/GridUser/ActivityDetector.cs @@ -56,7 +56,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.GridUser // But we could trigger the position update more often scene.EventManager.OnMakeRootAgent += OnMakeRootAgent; scene.EventManager.OnNewClient += OnNewClient; - scene.EventManager.OnAvatarEnteringNewParcel += OnEnteringNewParcel; if (m_aScene == null) m_aScene = scene; @@ -72,7 +71,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.GridUser { m_log.DebugFormat("[ACTIVITY DETECTOR]: Detected root presence {0} in {1}", sp.UUID, sp.Scene.RegionInfo.RegionName); - m_GridUserService.SetLastPosition(sp.UUID.ToString(), sp.ControllingClient.SessionId, sp.Scene.RegionInfo.RegionID, sp.AbsolutePosition, sp.Lookat); + m_GridUserService.SetLastPosition(sp.UUID.ToString(), sp.Scene.RegionInfo.RegionID, sp.AbsolutePosition, sp.Lookat); } public void OnNewClient(IClientAPI client) @@ -105,12 +104,5 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.GridUser } - void OnEnteringNewParcel(ScenePresence sp, int localLandID, UUID regionID) - { - // TODO: grab the parcel ID from ILandModule - // and send that along - m_GridUserService.SetLastPosition(sp.UUID.ToString(), sp.ControllingClient.SessionId, sp.Scene.RegionInfo.RegionID, sp.AbsolutePosition, sp.Lookat); - } - } } diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/GridUser/LocalGridUserServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/GridUser/LocalGridUserServiceConnector.cs index 76e030fea0..d914a576e1 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/GridUser/LocalGridUserServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/GridUser/LocalGridUserServiceConnector.cs @@ -162,9 +162,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.GridUser return m_GridUserService.SetHome(userID, homeID, homePosition, homeLookAt); } - public bool SetLastPosition(string userID, UUID sessionID, UUID regionID, Vector3 lastPosition, Vector3 lastLookAt) + public bool SetLastPosition(string userID, UUID regionID, Vector3 lastPosition, Vector3 lastLookAt) { - return m_GridUserService.SetLastPosition(userID, sessionID, regionID, lastPosition, lastLookAt); + return m_GridUserService.SetLastPosition(userID, regionID, lastPosition, lastLookAt); } public GridUserInfo GetGridUserInfo(string userID) diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/GridUser/RemoteGridUserServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/GridUser/RemoteGridUserServiceConnector.cs index fb11e9a454..e3e2e619c1 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/GridUser/RemoteGridUserServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/GridUser/RemoteGridUserServiceConnector.cs @@ -137,9 +137,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.GridUser return m_RemoteConnector.SetHome(userID, regionID, position, lookAt); } - public bool SetLastPosition(string userID, UUID sessionID, UUID regionID, Vector3 position, Vector3 lookAt) + public bool SetLastPosition(string userID, UUID regionID, Vector3 position, Vector3 lookAt) { - return m_RemoteConnector.SetLastPosition(userID, sessionID, regionID, position, lookAt); + return m_RemoteConnector.SetLastPosition(userID, regionID, position, lookAt); } public GridUserInfo GetGridUserInfo(string userID) diff --git a/OpenSim/Server/Handlers/GridUser/GridUserServerPostHandler.cs b/OpenSim/Server/Handlers/GridUser/GridUserServerPostHandler.cs index b1e7eac41c..f8fa42967f 100644 --- a/OpenSim/Server/Handlers/GridUser/GridUserServerPostHandler.cs +++ b/OpenSim/Server/Handlers/GridUser/GridUserServerPostHandler.cs @@ -156,7 +156,6 @@ namespace OpenSim.Server.Handlers.GridUser byte[] SetPosition(Dictionary request) { string user = string.Empty; - UUID sessionID = UUID.Zero; UUID region = UUID.Zero; Vector3 position = new Vector3(128, 128, 70); Vector3 look = Vector3.Zero; @@ -167,7 +166,7 @@ namespace OpenSim.Server.Handlers.GridUser if (!UnpackArgs(request, out user, out region, out position, out look)) return FailureResult(); - if (m_GridUserService.SetLastPosition(user, sessionID, region, position, look)) + if (m_GridUserService.SetLastPosition(user, region, position, look)) return SuccessResult(); return FailureResult(); diff --git a/OpenSim/Services/Connectors/GridUser/GridUserServiceConnector.cs b/OpenSim/Services/Connectors/GridUser/GridUserServiceConnector.cs index f222e31cfa..600ddfdaf0 100644 --- a/OpenSim/Services/Connectors/GridUser/GridUserServiceConnector.cs +++ b/OpenSim/Services/Connectors/GridUser/GridUserServiceConnector.cs @@ -84,7 +84,7 @@ namespace OpenSim.Services.Connectors } - #region IPresenceService + #region IGridUserService public GridUserInfo LoggedIn(string userID) @@ -123,7 +123,7 @@ namespace OpenSim.Services.Connectors return Set(sendData, userID, regionID, position, lookAt); } - public bool SetLastPosition(string userID, UUID sessionID, UUID regionID, Vector3 position, Vector3 lookAt) + public bool SetLastPosition(string userID, UUID regionID, Vector3 position, Vector3 lookAt) { Dictionary sendData = new Dictionary(); //sendData["SCOPEID"] = scopeID.ToString(); diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianActivityDetector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianActivityDetector.cs index 8cc5671538..a871d07f16 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianActivityDetector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianActivityDetector.cs @@ -40,10 +40,10 @@ namespace OpenSim.Services.Connectors.SimianGrid { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - private IGridUserService m_GridUserService; + private SimianPresenceServiceConnector m_GridUserService; private Scene m_aScene; - public SimianActivityDetector(IGridUserService guservice) + public SimianActivityDetector(SimianPresenceServiceConnector guservice) { m_GridUserService = guservice; m_log.DebugFormat("[SIMIAN ACTIVITY DETECTOR]: Started"); diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianPresenceServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianPresenceServiceConnector.cs index ec9cf6704f..6f179317d2 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianPresenceServiceConnector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianPresenceServiceConnector.cs @@ -298,6 +298,12 @@ namespace OpenSim.Services.Connectors.SimianGrid return UpdateSession(sessionID, regionID, lastPosition, lastLookAt); } + public bool SetLastPosition(string userID, UUID regionID, Vector3 lastPosition, Vector3 lastLookAt) + { + // Never called + return false; + } + public GridUserInfo GetGridUserInfo(string user) { m_log.DebugFormat("[SIMIAN PRESENCE CONNECTOR]: Requesting session data for agent " + user); diff --git a/OpenSim/Services/Interfaces/IGridUserService.cs b/OpenSim/Services/Interfaces/IGridUserService.cs index 3d11b3e16f..e629dffda4 100644 --- a/OpenSim/Services/Interfaces/IGridUserService.cs +++ b/OpenSim/Services/Interfaces/IGridUserService.cs @@ -108,7 +108,7 @@ namespace OpenSim.Services.Interfaces bool LoggedOut(string userID, UUID regionID, Vector3 lastPosition, Vector3 lastLookAt); bool SetHome(string userID, UUID homeID, Vector3 homePosition, Vector3 homeLookAt); - bool SetLastPosition(string userID, UUID sessionID, UUID regionID, Vector3 lastPosition, Vector3 lastLookAt); + bool SetLastPosition(string userID, UUID regionID, Vector3 lastPosition, Vector3 lastLookAt); GridUserInfo GetGridUserInfo(string userID); } diff --git a/OpenSim/Services/UserAccountService/GridUserService.cs b/OpenSim/Services/UserAccountService/GridUserService.cs index 00a1ae2e60..697ba639d2 100644 --- a/OpenSim/Services/UserAccountService/GridUserService.cs +++ b/OpenSim/Services/UserAccountService/GridUserService.cs @@ -139,7 +139,7 @@ namespace OpenSim.Services.UserAccountService return m_Database.Store(d); } - public bool SetLastPosition(string userID, UUID sessionID, UUID regionID, Vector3 lastPosition, Vector3 lastLookAt) + public bool SetLastPosition(string userID, UUID regionID, Vector3 lastPosition, Vector3 lastLookAt) { //m_log.DebugFormat("[Grid User Service]: SetLastPosition for {0}", userID); GridUserData d = m_Database.Get(userID); From 213e372253eb8a59f0afb627e11b0a5b6f6b088f Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Thu, 20 May 2010 20:24:50 -0700 Subject: [PATCH 46/46] Cleaned up MySql migrations a bit more, got rid of all old-form migration files. Restored Presence table to its taboo-breaking form. --- .../Data/MySQL/Resources/007_AssetStore.sql | 5 ---- .../Data/MySQL/Resources/033_RegionStore.sql | 3 --- ...UserStore.sql => GridUserStore.migrations} | 2 ++ .../Data/MySQL/Resources/Presence.migrations | 25 ++----------------- .../MySQL/Resources/RegionStore.migrations | 5 +++- 5 files changed, 8 insertions(+), 32 deletions(-) delete mode 100644 OpenSim/Data/MySQL/Resources/007_AssetStore.sql delete mode 100644 OpenSim/Data/MySQL/Resources/033_RegionStore.sql rename OpenSim/Data/MySQL/Resources/{001_GridUserStore.sql => GridUserStore.migrations} (92%) diff --git a/OpenSim/Data/MySQL/Resources/007_AssetStore.sql b/OpenSim/Data/MySQL/Resources/007_AssetStore.sql deleted file mode 100644 index f06121abc1..0000000000 --- a/OpenSim/Data/MySQL/Resources/007_AssetStore.sql +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN; - -ALTER TABLE assets ADD COLUMN asset_flags INTEGER NOT NULL DEFAULT 0; - -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/033_RegionStore.sql b/OpenSim/Data/MySQL/Resources/033_RegionStore.sql deleted file mode 100644 index 2832b413ff..0000000000 --- a/OpenSim/Data/MySQL/Resources/033_RegionStore.sql +++ /dev/null @@ -1,3 +0,0 @@ -BEGIN; -ALTER TABLE regionsettings ADD map_tile_ID CHAR(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000'; -COMMIT; diff --git a/OpenSim/Data/MySQL/Resources/001_GridUserStore.sql b/OpenSim/Data/MySQL/Resources/GridUserStore.migrations similarity index 92% rename from OpenSim/Data/MySQL/Resources/001_GridUserStore.sql rename to OpenSim/Data/MySQL/Resources/GridUserStore.migrations index ce4ab96e97..32b85ee8c1 100644 --- a/OpenSim/Data/MySQL/Resources/001_GridUserStore.sql +++ b/OpenSim/Data/MySQL/Resources/GridUserStore.migrations @@ -1,3 +1,5 @@ +:VERSION 1 # -------------------------- + BEGIN; CREATE TABLE `GridUser` ( diff --git a/OpenSim/Data/MySQL/Resources/Presence.migrations b/OpenSim/Data/MySQL/Resources/Presence.migrations index d513024987..91f7de55f7 100644 --- a/OpenSim/Data/MySQL/Resources/Presence.migrations +++ b/OpenSim/Data/MySQL/Resources/Presence.migrations @@ -4,32 +4,11 @@ BEGIN; CREATE TABLE `Presence` ( `UserID` VARCHAR(255) NOT NULL, - `RegionID` CHAR(36) NOT NULL, + `RegionID` CHAR(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000', `SessionID` CHAR(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000', - `SecureSessionID` CHAR(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000', - `Online` CHAR(5) NOT NULL DEFAULT 'false', - `Login` CHAR(16) NOT NULL DEFAULT '0', - `Logout` CHAR(16) NOT NULL DEFAULT '0', - `Position` CHAR(64) NOT NULL DEFAULT '<0,0,0>', - `LookAt` CHAR(64) NOT NULL DEFAULT '<0,0,0>' + `SecureSessionID` CHAR(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000' ) ENGINE=InnoDB; -COMMIT; - -:VERSION 2 # -------------------------- - -BEGIN; - -ALTER TABLE Presence ADD COLUMN `HomeRegionID` CHAR(36) NOT NULL; -ALTER TABLE Presence ADD COLUMN `HomePosition` CHAR(64) NOT NULL DEFAULT '<0,0,0>'; -ALTER TABLE Presence ADD COLUMN `HomeLookAt` CHAR(64) NOT NULL DEFAULT '<0,0,0>'; - -COMMIT; - -:VERSION 3 # -------------------------- - -BEGIN; - CREATE UNIQUE INDEX SessionID ON Presence(SessionID); CREATE INDEX UserID ON Presence(UserID); diff --git a/OpenSim/Data/MySQL/Resources/RegionStore.migrations b/OpenSim/Data/MySQL/Resources/RegionStore.migrations index 3dab67e58e..baeeedd0c2 100644 --- a/OpenSim/Data/MySQL/Resources/RegionStore.migrations +++ b/OpenSim/Data/MySQL/Resources/RegionStore.migrations @@ -801,6 +801,9 @@ BEGIN; ALTER TABLE estate_settings AUTO_INCREMENT = 100; COMMIT; +:VERSION 33 #--------------------- - +BEGIN; +ALTER TABLE regionsettings ADD map_tile_ID CHAR(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000'; +COMMIT;