From a583d8ad70daad8c755c2f43e2f2af7bc5b7ee4d Mon Sep 17 00:00:00 2001 From: Charles Krinke Date: Sat, 14 Feb 2009 19:47:02 +0000 Subject: Thank you kindly, TLaukkan (Tommil) for a patch that: * Created value object for EstateRegionLink for storing the estate region relationship. * Refactored slightly NHibernateManager and NHibernateXXXXData implementations for accesing nhibernate generated ID on insert. ** Changed NHibernateManager.Save method name to Insert as it does Insert. ** Changed NHibernateManager.Save return value object as ID can be both UUID and uint currently. ** Changed NHibernateManager.Load method Id parameter to object as it can be both UUID and uint. * Created NHibernateEstateData implementation. This is the actual estate storage. * Created NHibernate mapping files for both EstateSettings and EstateRegionLink * Created MigrationSyntaxDifferences.txt files to write notes about differences in migration scripts between different databases. * Created estate storage migration scripts for all four databases. * Created estate unit test classes for all four databases. * Updated one missing field to BasicEstateTest.cs * Tested NHibernate unit tests with NUnit GUI. Asset databases fail but that is not related to this patch. * Tested build with both Visual Studio and nant. * Executed build tests with nant succesfully. --- OpenSim/Data/NHibernate/EstateRegionLink.cs | 49 +++++++ OpenSim/Data/NHibernate/NHibernateAssetData.cs | 5 +- OpenSim/Data/NHibernate/NHibernateEstateData.cs | 161 +++++++++++++++++++++ OpenSim/Data/NHibernate/NHibernateGridData.cs | 2 +- OpenSim/Data/NHibernate/NHibernateInventoryData.cs | 74 +++++----- OpenSim/Data/NHibernate/NHibernateManager.cs | 14 +- OpenSim/Data/NHibernate/NHibernateRegionData.cs | 10 +- OpenSim/Data/NHibernate/NHibernateUserData.cs | 10 +- .../NHibernate/Resources/EstateRegionLink.hbm.xml | 12 ++ .../NHibernate/Resources/EstateSettings.hbm.xml | 39 +++++ .../Resources/MigrationSyntaxDifferences.txt | 14 ++ .../Resources/MsSql2005Dialect/001_EstateStore.sql | 40 +++++ .../Resources/MySQLDialect/001_EstateStore.sql | 40 +++++ .../PostgreSQLDialect/001_EstateStore.sql | 40 +++++ .../Resources/SQLiteDialect/001_EstateStore.sql | 40 +++++ .../NHibernate/Tests/NHibernateMsSqlEstateTest.cs | 77 ++++++++++ .../NHibernate/Tests/NHibernateMySqlEstateTest.cs | 76 ++++++++++ .../Tests/NHibernatePostgreSQLEstateTest.cs | 76 ++++++++++ .../NHibernate/Tests/NHibernateSQLiteEstateTest.cs | 78 ++++++++++ OpenSim/Data/Tests/BasicEstateTest.cs | 3 + 20 files changed, 803 insertions(+), 57 deletions(-) create mode 100644 OpenSim/Data/NHibernate/EstateRegionLink.cs create mode 100644 OpenSim/Data/NHibernate/NHibernateEstateData.cs create mode 100644 OpenSim/Data/NHibernate/Resources/EstateRegionLink.hbm.xml create mode 100644 OpenSim/Data/NHibernate/Resources/EstateSettings.hbm.xml create mode 100644 OpenSim/Data/NHibernate/Resources/MigrationSyntaxDifferences.txt create mode 100644 OpenSim/Data/NHibernate/Resources/MsSql2005Dialect/001_EstateStore.sql create mode 100644 OpenSim/Data/NHibernate/Resources/MySQLDialect/001_EstateStore.sql create mode 100644 OpenSim/Data/NHibernate/Resources/PostgreSQLDialect/001_EstateStore.sql create mode 100644 OpenSim/Data/NHibernate/Resources/SQLiteDialect/001_EstateStore.sql create mode 100644 OpenSim/Data/NHibernate/Tests/NHibernateMsSqlEstateTest.cs create mode 100644 OpenSim/Data/NHibernate/Tests/NHibernateMySqlEstateTest.cs create mode 100644 OpenSim/Data/NHibernate/Tests/NHibernatePostgreSQLEstateTest.cs create mode 100644 OpenSim/Data/NHibernate/Tests/NHibernateSQLiteEstateTest.cs diff --git a/OpenSim/Data/NHibernate/EstateRegionLink.cs b/OpenSim/Data/NHibernate/EstateRegionLink.cs new file mode 100644 index 0000000..cceced2 --- /dev/null +++ b/OpenSim/Data/NHibernate/EstateRegionLink.cs @@ -0,0 +1,49 @@ +?using System; +using System.Collections.Generic; +using System.Text; +using OpenMetaverse; + +namespace OpenSim.Data.NHibernate +{ + public class EstateRegionLink + { + private UUID estateRegionLinkID; + public UUID EstateRegionLinkID + { + get + { + return estateRegionLinkID; + } + set + { + estateRegionLinkID = value; + } + } + + private uint estateID; + public uint EstateID + { + get + { + return estateID; + } + set + { + estateID = value; + } + } + + private UUID regionID; + public UUID RegionID + { + get + { + return regionID; + } + set + { + regionID = value; + } + } + } +} diff --git a/OpenSim/Data/NHibernate/NHibernateAssetData.cs b/OpenSim/Data/NHibernate/NHibernateAssetData.cs index f4527bf..f8715cc 100644 --- a/OpenSim/Data/NHibernate/NHibernateAssetData.cs +++ b/OpenSim/Data/NHibernate/NHibernateAssetData.cs @@ -45,7 +45,8 @@ namespace OpenSim.Data.NHibernate public override void Initialise() { - Initialise("SQLiteDialect;SqliteClientDriver;URI=file:Asset.db,version=3"); + m_log.Info("[NHibernateGridData]: " + Name + " cannot be default-initialized!"); + throw new PluginNotInitialisedException(Name); } public override void Initialise(string connect) @@ -66,7 +67,7 @@ namespace OpenSim.Data.NHibernate AssetBase temp = (AssetBase)manager.Load(typeof(AssetBase), asset.Metadata.FullID); if (temp == null) { - manager.Save(asset); + manager.Insert(asset); } } diff --git a/OpenSim/Data/NHibernate/NHibernateEstateData.cs b/OpenSim/Data/NHibernate/NHibernateEstateData.cs new file mode 100644 index 0000000..59896dd --- /dev/null +++ b/OpenSim/Data/NHibernate/NHibernateEstateData.cs @@ -0,0 +1,161 @@ +/* + * 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 OpenSim 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.Reflection; +using log4net; +using OpenMetaverse; +using OpenSim.Framework; +using OpenSim.Region.Framework.Interfaces; +using NHibernate; +using NHibernate.Criterion; +using System.Collections; +using System; + +namespace OpenSim.Data.NHibernate +{ + /// + /// A User storage interface for the DB4o database system + /// + public class NHibernateEstateData : IEstateDataStore + { + + #region Fields + + private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + public NHibernateManager manager; + + public string Name + { + get { return "NHibernateEstateData"; } + } + + public string Version + { + get { return "0.1"; } + } + + #endregion + + #region Startup and shutdown. + + public void Initialise() + { + m_log.Info("[NHIBERNATE]: " + Name + " cannot be default-initialized!"); + throw new PluginNotInitialisedException(Name); + } + + public void Initialise(string connect) + { + + m_log.InfoFormat("[NHIBERNATE] Initializing " + Name + "."); + manager = new NHibernateManager(connect, "EstateStore"); + } + + public void Dispose() { } + + #endregion + + #region IEstateDataStore Members + + public EstateSettings LoadEstateSettings(UUID regionID) + { + EstateRegionLink link = LoadEstateRegionLink(regionID); + + // Ensure that estate settings exist for the link + if (link != null) + { + if (manager.Load(typeof(EstateSettings), link.EstateID) == null) + { + // Delete broken link + manager.Delete(link); + link = null; + } + } + + // If estate link does not exist create estate settings and link it to region. + if (link == null) + { + EstateSettings estateSettings = new EstateSettings(); + //estateSettings.EstateOwner = UUID.Random(); + //estateSettings.BlockDwell = false; + object identifier = manager.Insert(estateSettings); + + if (identifier == null) + { + // Saving failed. Error is logged in the manager. + return null; + } + + uint estateID = (uint)identifier; + link = new EstateRegionLink(); + link.EstateRegionLinkID = UUID.Random(); + link.RegionID = regionID; + link.EstateID = estateID; + manager.Insert(link); + } + + // Load estate settings according to the existing or created link. + return (EstateSettings)manager.Load(typeof(EstateSettings), link.EstateID); + } + + public void StoreEstateSettings(EstateSettings estateSettings) + { + // Estates are always updated when stored. + // Insert is always done via. load method as with the current API + // this is explicitly the only way to create region link. + manager.Update(estateSettings); + } + + #endregion + + #region Private Utility Methods + private EstateRegionLink LoadEstateRegionLink(UUID regionID) + { + ICriteria criteria = manager.GetSession().CreateCriteria(typeof(EstateRegionLink)); + criteria.Add(Expression.Eq("RegionID", regionID)); + IList links = criteria.List(); + + // Fail fast if more than one estate links exist + if (links.Count > 1) + { + m_log.Error("[NHIBERNATE]: Region had more than one estate linked: " + regionID); + throw new Exception("[NHIBERNATE]: Region had more than one estate linked: " + regionID); + } + + if (links.Count == 1) + { + return (EstateRegionLink)links[0]; + } + else + { + return null; + } + } + #endregion + } +} diff --git a/OpenSim/Data/NHibernate/NHibernateGridData.cs b/OpenSim/Data/NHibernate/NHibernateGridData.cs index 836c99e..e58d1ed 100644 --- a/OpenSim/Data/NHibernate/NHibernateGridData.cs +++ b/OpenSim/Data/NHibernate/NHibernateGridData.cs @@ -113,7 +113,7 @@ namespace OpenSim.Data.NHibernate { if (manager.Load(typeof(RegionProfileData), profile.Uuid) == null) { - manager.Save(profile); + manager.Insert(profile); return DataResponse.RESPONSE_OK; } else diff --git a/OpenSim/Data/NHibernate/NHibernateInventoryData.cs b/OpenSim/Data/NHibernate/NHibernateInventoryData.cs index 0129800..7657ae5 100644 --- a/OpenSim/Data/NHibernate/NHibernateInventoryData.cs +++ b/OpenSim/Data/NHibernate/NHibernateInventoryData.cs @@ -42,6 +42,34 @@ namespace OpenSim.Data.NHibernate public NHibernateManager manager; + /// + /// The plugin being loaded + /// + /// A string containing the plugin name + public string Name + { + get { return "NHibernate Inventory Data Interface"; } + } + + /// + /// The plugins version + /// + /// A string containing the plugin version + public string Version + { + get + { + Module module = GetType().Module; + // string dllName = module.Assembly.ManifestModule.Name; + Version dllVersion = module.Assembly.GetName().Version; + + + return + string.Format("{0}.{1}.{2}.{3}", dllVersion.Major, dllVersion.Minor, dllVersion.Build, + dllVersion.Revision); + } + } + public void Initialise() { m_log.Info("[NHibernateInventoryData]: " + Name + " cannot be default-initialized!"); @@ -57,6 +85,13 @@ namespace OpenSim.Data.NHibernate manager = new NHibernateManager(connect, "InventoryStore"); } + /// + /// Closes the interface + /// + public void Dispose() + { + } + /***************************************************************** * * Basic CRUD operations on Data @@ -92,7 +127,7 @@ namespace OpenSim.Data.NHibernate { if (!ExistsItem(item.ID)) { - manager.Save(item); + manager.Insert(item); } else { @@ -161,7 +196,7 @@ namespace OpenSim.Data.NHibernate { if (!ExistsFolder(folder.ID)) { - manager.Save(folder); + manager.Insert(folder); } else { @@ -220,41 +255,6 @@ namespace OpenSim.Data.NHibernate // TODO: DataSet commit } - /// - /// Closes the interface - /// - public void Dispose() - { - } - - /// - /// The plugin being loaded - /// - /// A string containing the plugin name - public string Name - { - get { return "NHibernate Inventory Data Interface"; } - } - - /// - /// The plugins version - /// - /// A string containing the plugin version - public string Version - { - get - { - Module module = GetType().Module; - // string dllName = module.Assembly.ManifestModule.Name; - Version dllVersion = module.Assembly.GetName().Version; - - - return - string.Format("{0}.{1}.{2}.{3}", dllVersion.Major, dllVersion.Minor, dllVersion.Build, - dllVersion.Revision); - } - } - // Move seems to be just update public void moveInventoryFolder(InventoryFolderBase folder) diff --git a/OpenSim/Data/NHibernate/NHibernateManager.cs b/OpenSim/Data/NHibernate/NHibernateManager.cs index 51467da..26bc219 100644 --- a/OpenSim/Data/NHibernate/NHibernateManager.cs +++ b/OpenSim/Data/NHibernate/NHibernateManager.cs @@ -131,25 +131,25 @@ namespace OpenSim.Data.NHibernate RunMigration(dialect, assembly, store); } - public object Load(Type type, UUID uuid) + public object Load(Type type, Object id) { using (IStatelessSession session = sessionFactory.OpenStatelessSession()) { object obj = null; try { - obj = session.Get(type.FullName, uuid); + obj = session.Get(type.FullName, id); } catch (Exception e) { - m_log.ErrorFormat("[NHIBERNATE] {0} of id {1} loading threw exception: "+ e.ToString(), type.Name, uuid); + m_log.ErrorFormat("[NHIBERNATE] {0} of id {1} loading threw exception: " + e.ToString(), type.Name, id); } return obj; } } - public bool Save(object obj) + public object Insert(object obj) { try { @@ -157,16 +157,16 @@ namespace OpenSim.Data.NHibernate { using (ITransaction transaction=session.BeginTransaction()) { - session.Insert(obj); + Object identifier=session.Insert(obj); transaction.Commit(); - return true; + return identifier; } } } catch (Exception e) { m_log.Error("[NHIBERNATE] issue inserting object ", e); - return false; + return null; } } diff --git a/OpenSim/Data/NHibernate/NHibernateRegionData.cs b/OpenSim/Data/NHibernate/NHibernateRegionData.cs index 0cd3969..78db52d 100644 --- a/OpenSim/Data/NHibernate/NHibernateRegionData.cs +++ b/OpenSim/Data/NHibernate/NHibernateRegionData.cs @@ -70,7 +70,7 @@ namespace OpenSim.Data.NHibernate } else { - manager.Save(rs); + manager.Insert(rs); } } @@ -82,7 +82,7 @@ namespace OpenSim.Data.NHibernate { regionSettings = new RegionSettings(); regionSettings.RegionUUID = regionUUID; - manager.Save(regionSettings); + manager.Insert(regionSettings); } regionSettings.OnSave += StoreRegionSettings; @@ -105,7 +105,7 @@ namespace OpenSim.Data.NHibernate else { m_log.InfoFormat("[NHIBERNATE] saving object {0}", p.UUID); - manager.Save(p); + manager.Insert(p); } } @@ -129,7 +129,7 @@ namespace OpenSim.Data.NHibernate else { m_log.InfoFormat("[NHIBERNATE] saving terrain {0}", t.RegionID); - manager.Save(t); + manager.Insert(t); } } @@ -394,7 +394,7 @@ namespace OpenSim.Data.NHibernate foreach (TaskInventoryItem i in items) { - manager.Save(i); + manager.Insert(i); } } diff --git a/OpenSim/Data/NHibernate/NHibernateUserData.cs b/OpenSim/Data/NHibernate/NHibernateUserData.cs index 7dfdcb5..3f1f260 100644 --- a/OpenSim/Data/NHibernate/NHibernateUserData.cs +++ b/OpenSim/Data/NHibernate/NHibernateUserData.cs @@ -102,7 +102,7 @@ namespace OpenSim.Data.NHibernate if (!ExistsUser(profile.ID)) { m_log.InfoFormat("[NHIBERNATE] AddNewUserProfile {0}", profile.ID); - manager.Save(profile); + manager.Insert(profile); // Agent should not be saved according to BasicUserTest.T015_UserPersistency() // SetAgentData(profile.ID, profile.CurrentAgent); @@ -169,7 +169,7 @@ namespace OpenSim.Data.NHibernate manager.Delete(old); } - manager.Save(agent); + manager.Insert(agent); } @@ -245,11 +245,11 @@ namespace OpenSim.Data.NHibernate { if (!FriendRelationExists(ownerId,friendId)) { - manager.Save(new UserFriend(UUID.Random(), ownerId, friendId, perms)); + manager.Insert(new UserFriend(UUID.Random(), ownerId, friendId, perms)); } if (!FriendRelationExists(friendId, ownerId)) { - manager.Save(new UserFriend(UUID.Random(), friendId, ownerId, perms)); + manager.Insert(new UserFriend(UUID.Random(), friendId, ownerId, perms)); } return; } @@ -426,7 +426,7 @@ namespace OpenSim.Data.NHibernate } else { - manager.Save(appearance); + manager.Insert(appearance); } } diff --git a/OpenSim/Data/NHibernate/Resources/EstateRegionLink.hbm.xml b/OpenSim/Data/NHibernate/Resources/EstateRegionLink.hbm.xml new file mode 100644 index 0000000..91bddee --- /dev/null +++ b/OpenSim/Data/NHibernate/Resources/EstateRegionLink.hbm.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/OpenSim/Data/NHibernate/Resources/EstateSettings.hbm.xml b/OpenSim/Data/NHibernate/Resources/EstateSettings.hbm.xml new file mode 100644 index 0000000..1ff0f10 --- /dev/null +++ b/OpenSim/Data/NHibernate/Resources/EstateSettings.hbm.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OpenSim/Data/NHibernate/Resources/MigrationSyntaxDifferences.txt b/OpenSim/Data/NHibernate/Resources/MigrationSyntaxDifferences.txt new file mode 100644 index 0000000..f3d86df --- /dev/null +++ b/OpenSim/Data/NHibernate/Resources/MigrationSyntaxDifferences.txt @@ -0,0 +1,14 @@ +?This file describes the differences in schema creation and migration scripts. + +MySQL is used as reference script against which differences are listed. + +Generally MySQL create table options should be removed for other databases. + +_PostgreSQL_ +* DOUBLE->DOUBLE PRECISION +* BIT->BOOLEAN + +_MsSql_ +* VARCHAR->NVARCHAR +* Remove DEFAULT-keywords +* DOUBLE->REAL diff --git a/OpenSim/Data/NHibernate/Resources/MsSql2005Dialect/001_EstateStore.sql b/OpenSim/Data/NHibernate/Resources/MsSql2005Dialect/001_EstateStore.sql new file mode 100644 index 0000000..893e2a2 --- /dev/null +++ b/OpenSim/Data/NHibernate/Resources/MsSql2005Dialect/001_EstateStore.sql @@ -0,0 +1,40 @@ +CREATE TABLE EstateSettings ( + EstateID INT NOT NULL, + ParentEstateID INT NULL, + EstateOwnerID NVARCHAR(36) NULL, + Name NVARCHAR(64) NULL, + RedirectGridX INT NULL, + RedirectGridY INT NULL, + BillableFactor REAL NULL, + PricePerMeter INT NULL, + SunPosition REAL NULL, + + UseGlobalTime BIT NULL, + FixedSun BIT NULL, + AllowVoice BIT NULL, + AllowDirectTeleport BIT NULL, + ResetHomeOnTeleport BIT NULL, + PublicAccess BIT NULL, + DenyAnonymous BIT NULL, + DenyIdentified BIT NULL, + DenyTransacted BIT NULL, + DenyMinors BIT NULL, + BlockDwell BIT NULL, + EstateSkipScripts BIT NULL, + TaxFree BIT NULL, + AbuseEmailToEstateOwner BIT NULL, + + AbuseEmail NVARCHAR(255) NULL, + + PRIMARY KEY (EstateID) +); + +CREATE TABLE EstateRegionLink ( + EstateRegionLinkID NVARCHAR(36) NOT NULL, + EstateID INT NULL, + RegionID NVARCHAR(36) NULL, + PRIMARY KEY (EstateRegionLinkID) +); + +CREATE INDEX EstateRegionLinkEstateIDIndex ON EstateRegionLink (EstateID); +CREATE INDEX EstateRegionLinkERegionIDIndex ON EstateRegionLink (RegionID); diff --git a/OpenSim/Data/NHibernate/Resources/MySQLDialect/001_EstateStore.sql b/OpenSim/Data/NHibernate/Resources/MySQLDialect/001_EstateStore.sql new file mode 100644 index 0000000..a791bc6 --- /dev/null +++ b/OpenSim/Data/NHibernate/Resources/MySQLDialect/001_EstateStore.sql @@ -0,0 +1,40 @@ +CREATE TABLE EstateSettings ( + EstateID INT NOT NULL, + ParentEstateID INT DEFAULT NULL, + EstateOwnerID VARCHAR(36) DEFAULT NULL, + Name VARCHAR(64) DEFAULT NULL, + RedirectGridX INT DEFAULT NULL, + RedirectGridY INT DEFAULT NULL, + BillableFactor DOUBLE DEFAULT NULL, + PricePerMeter INT DEFAULT NULL, + SunPosition DOUBLE DEFAULT NULL, + + UseGlobalTime BIT DEFAULT NULL, + FixedSun BIT DEFAULT NULL, + AllowVoice BIT DEFAULT NULL, + AllowDirectTeleport BIT DEFAULT NULL, + ResetHomeOnTeleport BIT DEFAULT NULL, + PublicAccess BIT DEFAULT NULL, + DenyAnonymous BIT DEFAULT NULL, + DenyIdentified BIT DEFAULT NULL, + DenyTransacted BIT DEFAULT NULL, + DenyMinors BIT DEFAULT NULL, + BlockDwell BIT DEFAULT NULL, + EstateSkipScripts BIT DEFAULT NULL, + TaxFree BIT DEFAULT NULL, + AbuseEmailToEstateOwner BIT DEFAULT NULL, + + AbuseEmail VARCHAR(255) DEFAULT NULL, + + PRIMARY KEY (EstateID) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Rev. 1'; + +CREATE TABLE EstateRegionLink ( + EstateRegionLinkID VARCHAR(36) NOT NULL, + EstateID INT DEFAULT NULL, + RegionID VARCHAR(36) DEFAULT NULL, + PRIMARY KEY (EstateRegionLinkID) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Rev. 1'; + +CREATE INDEX EstateRegionLinkEstateIDIndex ON EstateRegionLink (EstateID); +CREATE INDEX EstateRegionLinkERegionIDIndex ON EstateRegionLink (RegionID); diff --git a/OpenSim/Data/NHibernate/Resources/PostgreSQLDialect/001_EstateStore.sql b/OpenSim/Data/NHibernate/Resources/PostgreSQLDialect/001_EstateStore.sql new file mode 100644 index 0000000..421a0c4 --- /dev/null +++ b/OpenSim/Data/NHibernate/Resources/PostgreSQLDialect/001_EstateStore.sql @@ -0,0 +1,40 @@ +CREATE TABLE EstateSettings ( + EstateID INT NOT NULL, + ParentEstateID INT DEFAULT NULL, + EstateOwnerID VARCHAR(36) DEFAULT NULL, + Name VARCHAR(64) DEFAULT NULL, + RedirectGridX INT DEFAULT NULL, + RedirectGridY INT DEFAULT NULL, + BillableFactor DOUBLE PRECISION DEFAULT NULL, + PricePerMeter INT DEFAULT NULL, + SunPosition DOUBLE PRECISION DEFAULT NULL, + + UseGlobalTime BOOLEAN DEFAULT NULL, + FixedSun BOOLEAN DEFAULT NULL, + AllowVoice BOOLEAN DEFAULT NULL, + AllowDirectTeleport BOOLEAN DEFAULT NULL, + ResetHomeOnTeleport BOOLEAN DEFAULT NULL, + PublicAccess BOOLEAN DEFAULT NULL, + DenyAnonymous BOOLEAN DEFAULT NULL, + DenyIdentified BOOLEAN DEFAULT NULL, + DenyTransacted BOOLEAN DEFAULT NULL, + DenyMinors BOOLEAN DEFAULT NULL, + BlockDwell BOOLEAN DEFAULT NULL, + EstateSkipScripts BOOLEAN DEFAULT NULL, + TaxFree BOOLEAN DEFAULT NULL, + AbuseEmailToEstateOwner BOOLEAN DEFAULT NULL, + + AbuseEmail VARCHAR(255) DEFAULT NULL, + + PRIMARY KEY (EstateID) +); + +CREATE TABLE EstateRegionLink ( + EstateRegionLinkID VARCHAR(36) NOT NULL, + EstateID INT DEFAULT NULL, + RegionID VARCHAR(36) DEFAULT NULL, + PRIMARY KEY (EstateRegionLinkID) +); + +CREATE INDEX EstateRegionLinkEstateIDIndex ON EstateRegionLink (EstateID); +CREATE INDEX EstateRegionLinkERegionIDIndex ON EstateRegionLink (RegionID); diff --git a/OpenSim/Data/NHibernate/Resources/SQLiteDialect/001_EstateStore.sql b/OpenSim/Data/NHibernate/Resources/SQLiteDialect/001_EstateStore.sql new file mode 100644 index 0000000..b16ae82 --- /dev/null +++ b/OpenSim/Data/NHibernate/Resources/SQLiteDialect/001_EstateStore.sql @@ -0,0 +1,40 @@ +CREATE TABLE EstateSettings ( + EstateID INT NOT NULL, + ParentEstateID INT DEFAULT NULL, + EstateOwnerID VARCHAR(36) DEFAULT NULL, + Name VARCHAR(64) DEFAULT NULL, + RedirectGridX INT DEFAULT NULL, + RedirectGridY INT DEFAULT NULL, + BillableFactor DOUBLE DEFAULT NULL, + PricePerMeter INT DEFAULT NULL, + SunPosition DOUBLE DEFAULT NULL, + + UseGlobalTime BIT DEFAULT NULL, + FixedSun BIT DEFAULT NULL, + AllowVoice BIT DEFAULT NULL, + AllowDirectTeleport BIT DEFAULT NULL, + ResetHomeOnTeleport BIT DEFAULT NULL, + PublicAccess BIT DEFAULT NULL, + DenyAnonymous BIT DEFAULT NULL, + DenyIdentified BIT DEFAULT NULL, + DenyTransacted BIT DEFAULT NULL, + DenyMinors BIT DEFAULT NULL, + BlockDwell BIT DEFAULT NULL, + EstateSkipScripts BIT DEFAULT NULL, + TaxFree BIT DEFAULT NULL, + AbuseEmailToEstateOwner BIT DEFAULT NULL, + + AbuseEmail VARCHAR(255) DEFAULT NULL, + + PRIMARY KEY (EstateID) +); + +CREATE TABLE EstateRegionLink ( + EstateRegionLinkID VARCHAR(36) NOT NULL, + EstateID INT DEFAULT NULL, + RegionID VARCHAR(36) DEFAULT NULL, + PRIMARY KEY (EstateRegionLinkID) +); + +CREATE INDEX EstateRegionLinkEstateIDIndex ON EstateRegionLink (EstateID); +CREATE INDEX EstateRegionLinkERegionIDIndex ON EstateRegionLink (RegionID); diff --git a/OpenSim/Data/NHibernate/Tests/NHibernateMsSqlEstateTest.cs b/OpenSim/Data/NHibernate/Tests/NHibernateMsSqlEstateTest.cs new file mode 100644 index 0000000..ea3c1eb --- /dev/null +++ b/OpenSim/Data/NHibernate/Tests/NHibernateMsSqlEstateTest.cs @@ -0,0 +1,77 @@ +/* + * 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 OpenSim 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 NUnit.Framework; +using OpenSim.Data.Tests; + +namespace OpenSim.Data.NHibernate.Tests +{ + [TestFixture] + public class NHibernateMsSqlEstateTest : BasicEstateTest + { + public string file; + public NHibernateManager database; + + [TestFixtureSetUp] + public void Init() + { + SuperInit(); + // If we manage to connect to the database with the user + // and password above it is our test database, and run + // these tests. If anything goes wrong, ignore these + // tests. + try + { + string connect = "MsSql2005Dialect;SqlClientDriver;Data Source=127.0.0.1;Network Library=DBMSSOCN;Initial Catalog=opensim-nunit;User ID=opensim-nunit;Password=opensim-nunit"; + + db = new NHibernateEstateData(); + db.Initialise(connect); + database = ((NHibernateEstateData)db).manager; + } + catch (Exception e) + { + Console.WriteLine("Exception {0}", e); + Assert.Ignore(); + } + } + + [TestFixtureTearDown] + public void Cleanup() + { + if (db != null) + { + ((NHibernateEstateData)db).Dispose(); + } + if (database != null) + { + database.DropSchema(); + } + } + + } +} diff --git a/OpenSim/Data/NHibernate/Tests/NHibernateMySqlEstateTest.cs b/OpenSim/Data/NHibernate/Tests/NHibernateMySqlEstateTest.cs new file mode 100644 index 0000000..651ff4e --- /dev/null +++ b/OpenSim/Data/NHibernate/Tests/NHibernateMySqlEstateTest.cs @@ -0,0 +1,76 @@ +/* + * 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 OpenSim 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 NUnit.Framework; +using OpenSim.Data.Tests; + +namespace OpenSim.Data.NHibernate.Tests +{ + [TestFixture] + public class NHibernateMySQLEstateTest : BasicEstateTest + { + public string file; + public NHibernateManager database; + public string connect = "MySQL5Dialect;MySqlDataDriver;Server=localhost;Database=opensim-nunit;User ID=opensim-nunit;Password=opensim-nunit"; + + [TestFixtureSetUp] + public void Init() + { + SuperInit(); + // If we manage to connect to the database with the user + // and password above it is our test database, and run + // these tests. If anything goes wrong, ignore these + // tests. + try + { + db = new NHibernateEstateData(); + db.Initialise(connect); + database = ((NHibernateEstateData)db).manager; + } + catch (Exception e) + { + Console.WriteLine("Exception {0}", e); + Assert.Ignore(); + } + } + + [TestFixtureTearDown] + public void Cleanup() + { + if (db != null) + { + ((NHibernateEstateData)db).Dispose(); + } + if (database != null) + { + database.DropSchema(); + } + } + + } +} diff --git a/OpenSim/Data/NHibernate/Tests/NHibernatePostgreSQLEstateTest.cs b/OpenSim/Data/NHibernate/Tests/NHibernatePostgreSQLEstateTest.cs new file mode 100644 index 0000000..1d113c7 --- /dev/null +++ b/OpenSim/Data/NHibernate/Tests/NHibernatePostgreSQLEstateTest.cs @@ -0,0 +1,76 @@ +/* + * 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 OpenSim 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 NUnit.Framework; +using OpenSim.Data.Tests; + +namespace OpenSim.Data.NHibernate.Tests +{ + [TestFixture] + public class NHibernatePostgreSQLEstateTest : BasicEstateTest + { + public string file; + public NHibernateManager database; + public string connect = "PostgreSQLDialect;NpgsqlDriver;Server=localhost;Database=opensim-nunit;User ID=opensim-nunit;Password=opensim-nunit;"; + + [TestFixtureSetUp] + public void Init() + { + SuperInit(); + // If we manage to connect to the database with the user + // and password above it is our test database, and run + // these tests. If anything goes wrong, ignore these + // tests. + try + { + db = new NHibernateEstateData(); + db.Initialise(connect); + database = ((NHibernateEstateData)db).manager; + } + catch (Exception e) + { + Console.WriteLine("Exception {0}", e); + Assert.Ignore(); + } + } + + [TestFixtureTearDown] + public void Cleanup() + { + if (db != null) + { + ((NHibernateEstateData)db).Dispose(); + } + if (database != null) + { + database.DropSchema(); + } + } + + } +} diff --git a/OpenSim/Data/NHibernate/Tests/NHibernateSQLiteEstateTest.cs b/OpenSim/Data/NHibernate/Tests/NHibernateSQLiteEstateTest.cs new file mode 100644 index 0000000..86fb573 --- /dev/null +++ b/OpenSim/Data/NHibernate/Tests/NHibernateSQLiteEstateTest.cs @@ -0,0 +1,78 @@ +/* + * 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 OpenSim 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.IO; +using NUnit.Framework; +using OpenSim.Data.Tests; + +namespace OpenSim.Data.NHibernate.Tests +{ + [TestFixture] + public class NHibernateSQLiteEstateTest : BasicEstateTest + { + public string file; + public NHibernateManager database; + + [TestFixtureSetUp] + public void Init() + { + SuperInit(); + // If we manage to connect to the database with the user + // and password above it is our test database, and run + // these tests. If anything goes wrong, ignore these + // tests. + try + { + string connect = "SQLiteDialect;SQLite20Driver;Data Source=" + Path.GetTempFileName() + ".db;Version=3"; + + db = new NHibernateEstateData(); + db.Initialise(connect); + database = ((NHibernateEstateData)db).manager; + } + catch (Exception e) + { + Console.WriteLine("Exception {0}", e); + Assert.Ignore(); + } + } + + [TestFixtureTearDown] + public void Cleanup() + { + if (db != null) + { + ((NHibernateEstateData)db).Dispose(); + } + if (database != null) + { + database.DropSchema(); + } + } + + } +} diff --git a/OpenSim/Data/Tests/BasicEstateTest.cs b/OpenSim/Data/Tests/BasicEstateTest.cs index 24c25ec..d0f7a8b 100644 --- a/OpenSim/Data/Tests/BasicEstateTest.cs +++ b/OpenSim/Data/Tests/BasicEstateTest.cs @@ -73,6 +73,7 @@ namespace OpenSim.Data.Tests double sunPosition = 7; bool allowVoice = true; bool allowDirectTeleport = true; + bool resetHomeOnTeleport = true; bool denyAnonymous = true; bool denyIdentified = true; bool denyTransacted = true; @@ -103,6 +104,7 @@ namespace OpenSim.Data.Tests es.SunPosition = sunPosition; es.AllowVoice = allowVoice; es.AllowDirectTeleport = allowDirectTeleport; + es.ResetHomeOnTeleport = resetHomeOnTeleport; es.DenyAnonymous = denyAnonymous; es.DenyIdentified = denyIdentified; es.DenyTransacted = denyTransacted; @@ -133,6 +135,7 @@ namespace OpenSim.Data.Tests Assert.That(sunPosition, Is.EqualTo(nes.SunPosition)); Assert.That(allowVoice, Is.EqualTo(nes.AllowVoice)); Assert.That(allowDirectTeleport, Is.EqualTo(nes.AllowDirectTeleport)); + Assert.That(resetHomeOnTeleport, Is.EqualTo(nes.ResetHomeOnTeleport)); Assert.That(denyAnonymous, Is.EqualTo(nes.DenyAnonymous)); Assert.That(denyIdentified, Is.EqualTo(nes.DenyIdentified)); Assert.That(denyTransacted, Is.EqualTo(nes.DenyTransacted)); -- cgit v1.1