From 80759f708b1766b6fd36bbdb6ce69f292e64e2f0 Mon Sep 17 00:00:00 2001 From: Justin Clarke Casey Date: Mon, 16 Feb 2009 19:33:11 +0000 Subject: [PATCH] * Apply http://opensimulator.org/mantis/view.php?id=3166 * Adds estate access list supports to NHibernate data module * Thanks Tommil --- .../Data/NHibernate/NHibernateAssetData.cs | 4 +- .../Data/NHibernate/NHibernateEstateData.cs | 8 +- OpenSim/Data/NHibernate/NHibernateGridData.cs | 8 +- .../NHibernate/NHibernateInventoryData.cs | 8 +- OpenSim/Data/NHibernate/NHibernateManager.cs | 229 +++++++++++++----- .../Data/NHibernate/NHibernateRegionData.cs | 10 +- OpenSim/Data/NHibernate/NHibernateUserData.cs | 12 +- .../Resources/EstateSettings.hbm.xml | 18 ++ .../MsSql2005Dialect/001_EstateStore.sql | 22 ++ .../MySQLDialect/001_EstateStore.sql | 22 ++ .../PostgreSQLDialect/001_EstateStore.sql | 22 ++ .../SQLiteDialect/001_EstateStore.sql | 21 ++ 12 files changed, 301 insertions(+), 83 deletions(-) diff --git a/OpenSim/Data/NHibernate/NHibernateAssetData.cs b/OpenSim/Data/NHibernate/NHibernateAssetData.cs index f8715cc416..8f4877d434 100644 --- a/OpenSim/Data/NHibernate/NHibernateAssetData.cs +++ b/OpenSim/Data/NHibernate/NHibernateAssetData.cs @@ -59,12 +59,12 @@ namespace OpenSim.Data.NHibernate override public AssetBase FetchAsset(UUID uuid) { - return (AssetBase)manager.Load(typeof(AssetBase), uuid); + return (AssetBase)manager.Get(typeof(AssetBase), uuid); } private void Save(AssetBase asset) { - AssetBase temp = (AssetBase)manager.Load(typeof(AssetBase), asset.Metadata.FullID); + AssetBase temp = (AssetBase)manager.Get(typeof(AssetBase), asset.Metadata.FullID); if (temp == null) { manager.Insert(asset); diff --git a/OpenSim/Data/NHibernate/NHibernateEstateData.cs b/OpenSim/Data/NHibernate/NHibernateEstateData.cs index 3d74135c3b..b16f6e14e3 100644 --- a/OpenSim/Data/NHibernate/NHibernateEstateData.cs +++ b/OpenSim/Data/NHibernate/NHibernateEstateData.cs @@ -89,7 +89,7 @@ namespace OpenSim.Data.NHibernate // Ensure that estate settings exist for the link if (link != null) { - if (manager.Load(typeof(EstateSettings), link.EstateID) == null) + if (manager.GetWithStatefullSession(typeof(EstateSettings), link.EstateID) == null) { // Delete broken link manager.Delete(link); @@ -116,11 +116,11 @@ namespace OpenSim.Data.NHibernate link.EstateRegionLinkID = UUID.Random(); link.RegionID = regionID; link.EstateID = estateID; - manager.Insert(link); + manager.InsertWithStatefullSession(link); } // Load estate settings according to the existing or created link. - return (EstateSettings)manager.Load(typeof(EstateSettings), link.EstateID); + return (EstateSettings)manager.GetWithStatefullSession(typeof(EstateSettings), link.EstateID); } public void StoreEstateSettings(EstateSettings estateSettings) @@ -128,7 +128,7 @@ namespace OpenSim.Data.NHibernate // 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); + manager.UpdateWithStatefullSession(estateSettings); } #endregion diff --git a/OpenSim/Data/NHibernate/NHibernateGridData.cs b/OpenSim/Data/NHibernate/NHibernateGridData.cs index e58d1edc9d..b89cefc5ec 100644 --- a/OpenSim/Data/NHibernate/NHibernateGridData.cs +++ b/OpenSim/Data/NHibernate/NHibernateGridData.cs @@ -111,7 +111,7 @@ namespace OpenSim.Data.NHibernate public override DataResponse AddProfile(RegionProfileData profile) { - if (manager.Load(typeof(RegionProfileData), profile.Uuid) == null) + if (manager.Get(typeof(RegionProfileData), profile.Uuid) == null) { manager.Insert(profile); return DataResponse.RESPONSE_OK; @@ -124,7 +124,7 @@ namespace OpenSim.Data.NHibernate public override DataResponse UpdateProfile(RegionProfileData profile) { - if (manager.Load(typeof(RegionProfileData), profile.Uuid) != null) + if (manager.Get(typeof(RegionProfileData), profile.Uuid) != null) { manager.Update(profile); return DataResponse.RESPONSE_OK; @@ -137,7 +137,7 @@ namespace OpenSim.Data.NHibernate public override DataResponse DeleteProfile(string uuid) { - RegionProfileData regionProfileData = (RegionProfileData)manager.Load(typeof(RegionProfileData), new UUID(uuid)); + RegionProfileData regionProfileData = (RegionProfileData)manager.Get(typeof(RegionProfileData), new UUID(uuid)); if (regionProfileData != null) { manager.Delete(regionProfileData); @@ -148,7 +148,7 @@ namespace OpenSim.Data.NHibernate public override RegionProfileData GetProfileByUUID(UUID UUID) { - return (RegionProfileData)manager.Load(typeof(RegionProfileData), UUID); + return (RegionProfileData)manager.Get(typeof(RegionProfileData), UUID); } public override RegionProfileData GetProfileByHandle(ulong regionHandle) diff --git a/OpenSim/Data/NHibernate/NHibernateInventoryData.cs b/OpenSim/Data/NHibernate/NHibernateInventoryData.cs index 7657ae56fb..3e04417cf1 100644 --- a/OpenSim/Data/NHibernate/NHibernateInventoryData.cs +++ b/OpenSim/Data/NHibernate/NHibernateInventoryData.cs @@ -110,7 +110,7 @@ namespace OpenSim.Data.NHibernate try { m_log.InfoFormat("[NHIBERNATE] getInventoryItem {0}", item); - return (InventoryItemBase)manager.Load(typeof(InventoryItemBase), item); + return (InventoryItemBase)manager.Get(typeof(InventoryItemBase), item); } catch { @@ -158,7 +158,7 @@ namespace OpenSim.Data.NHibernate /// public void deleteInventoryItem(UUID itemID) { - InventoryItemBase item = (InventoryItemBase)manager.Load(typeof(InventoryItemBase), itemID); + InventoryItemBase item = (InventoryItemBase)manager.Get(typeof(InventoryItemBase), itemID); if (item != null) { manager.Delete(item); @@ -179,7 +179,7 @@ namespace OpenSim.Data.NHibernate { try { - return (InventoryFolderBase)manager.Load(typeof(InventoryFolderBase), folder); + return (InventoryFolderBase)manager.Get(typeof(InventoryFolderBase), folder); } catch { @@ -227,7 +227,7 @@ namespace OpenSim.Data.NHibernate /// public void deleteInventoryFolder(UUID folderID) { - InventoryFolderBase item = (InventoryFolderBase)manager.Load(typeof(InventoryFolderBase), folderID); + InventoryFolderBase item = (InventoryFolderBase)manager.Get(typeof(InventoryFolderBase), folderID); if (item != null) { manager.Delete(item); diff --git a/OpenSim/Data/NHibernate/NHibernateManager.cs b/OpenSim/Data/NHibernate/NHibernateManager.cs index 26bc21933c..cef98f2296 100644 --- a/OpenSim/Data/NHibernate/NHibernateManager.cs +++ b/OpenSim/Data/NHibernate/NHibernateManager.cs @@ -45,56 +45,7 @@ namespace OpenSim.Data.NHibernate private Configuration configuration; private ISessionFactory sessionFactory; - /// - /// Parses the connection string and creates the NHibernate configuration - /// - /// NHibernate dialect, driver and connection string separated by ';' - private void ParseConnectionString(string connect) - { - // Split out the dialect, driver, and connect string - char[] split = { ';' }; - string[] parts = connect.Split(split, 3); - if (parts.Length != 3) - { - // TODO: make this a real exception type - throw new Exception("Malformed Inventory connection string '" + connect + "'"); - } - - dialect = parts[0]; - - // NHibernate setup - configuration = new Configuration(); - configuration.SetProperty(Environment.ConnectionProvider, - "NHibernate.Connection.DriverConnectionProvider"); - configuration.SetProperty(Environment.Dialect, - "NHibernate.Dialect." + dialect); - configuration.SetProperty(Environment.ConnectionDriver, - "NHibernate.Driver." + parts[1]); - configuration.SetProperty(Environment.ConnectionString, parts[2]); - configuration.AddAssembly("OpenSim.Data.NHibernate"); - - } - - /// - /// Runs migration for the the store in assembly - /// - /// Dialect in use - /// Assembly where migration files exist - /// Name of the store in use - private void RunMigration(string dialect, Assembly assembly, string store) - { - // Migration subtype is the folder name under which migrations are stored. For mysql this folder is - // MySQLDialect instead of MySQL5Dialect which is the dialect currently in use. To avoid renaming - // this folder each time the mysql version changes creating simple mapping: - String migrationSubType = dialect; - if (dialect.StartsWith("MySQL")) - { - migrationSubType = "MySQLDialect"; - } - - Migration migration = new Migration((DbConnection)sessionFactory.ConnectionProvider.GetConnection(), assembly, migrationSubType, store); - migration.Update(); - } + #region Initialization /// /// Initiate NHibernate Manager @@ -131,7 +82,66 @@ namespace OpenSim.Data.NHibernate RunMigration(dialect, assembly, store); } - public object Load(Type type, Object id) + /// + /// Parses the connection string and creates the NHibernate configuration + /// + /// NHibernate dialect, driver and connection string separated by ';' + private void ParseConnectionString(string connect) + { + // Split out the dialect, driver, and connect string + char[] split = { ';' }; + string[] parts = connect.Split(split, 3); + if (parts.Length != 3) + { + // TODO: make this a real exception type + throw new Exception("Malformed Inventory connection string '" + connect + "'"); + } + + dialect = parts[0]; + + // NHibernate setup + configuration = new Configuration(); + configuration.SetProperty(Environment.ConnectionProvider, + "NHibernate.Connection.DriverConnectionProvider"); + configuration.SetProperty(Environment.Dialect, + "NHibernate.Dialect." + dialect); + configuration.SetProperty(Environment.ConnectionDriver, + "NHibernate.Driver." + parts[1]); + configuration.SetProperty(Environment.ConnectionString, parts[2]); + configuration.AddAssembly("OpenSim.Data.NHibernate"); + } + + /// + /// Runs migration for the the store in assembly + /// + /// Dialect in use + /// Assembly where migration files exist + /// Name of the store in use + private void RunMigration(string dialect, Assembly assembly, string store) + { + // Migration subtype is the folder name under which migrations are stored. For mysql this folder is + // MySQLDialect instead of MySQL5Dialect which is the dialect currently in use. To avoid renaming + // this folder each time the mysql version changes creating simple mapping: + String migrationSubType = dialect; + if (dialect.StartsWith("MySQL")) + { + migrationSubType = "MySQLDialect"; + } + + Migration migration = new Migration((DbConnection)sessionFactory.ConnectionProvider.GetConnection(), assembly, migrationSubType, store); + migration.Update(); + } + + #endregion + + /// + /// Gets object of given type from database with given id. + /// Uses stateless session for efficiency. + /// + /// Type of the object. + /// Id of the object. + /// The object or null if object was not found. + public object Get(Type type, Object id) { using (IStatelessSession session = sessionFactory.OpenStatelessSession()) { @@ -145,10 +155,40 @@ namespace OpenSim.Data.NHibernate m_log.ErrorFormat("[NHIBERNATE] {0} of id {1} loading threw exception: " + e.ToString(), type.Name, id); } return obj; - } - + } } + /// + /// Gets object of given type from database with given id. + /// Use this method for objects containing collections. For flat objects stateless mode is more efficient. + /// + /// Type of the object. + /// Id of the object. + /// The object or null if object was not found. + public object GetWithStatefullSession(Type type, Object id) + { + using (ISession session = sessionFactory.OpenSession()) + { + object obj = null; + try + { + obj = session.Get(type.FullName, id); + } + catch (Exception e) + { + m_log.ErrorFormat("[NHIBERNATE] {0} of id {1} loading threw exception: " + e.ToString(), type.Name, id); + } + return obj; + } + + } + + /// + /// Inserts given object to database. + /// Uses stateless session for efficiency. + /// + /// Object to be insterted. + /// Identifier of the object. Useful for situations when NHibernate generates the identifier. public object Insert(object obj) { try @@ -170,6 +210,39 @@ namespace OpenSim.Data.NHibernate } } + /// + /// Inserts given object to database. + /// Use this method for objects containing collections. For flat objects stateless mode is more efficient. + /// + /// Object to be insterted. + /// Identifier of the object. Useful for situations when NHibernate generates the identifier. + public object InsertWithStatefullSession(object obj) + { + try + { + using (ISession session = sessionFactory.OpenSession()) + { + using (ITransaction transaction = session.BeginTransaction()) + { + Object identifier = session.Save(obj); + transaction.Commit(); + return identifier; + } + } + } + catch (Exception e) + { + m_log.Error("[NHIBERNATE] issue inserting object ", e); + return null; + } + } + + /// + /// Updates given object to database. + /// Uses stateless session for efficiency. + /// + /// Object to be updated. + /// True if operation was succesful. public bool Update(object obj) { try @@ -191,6 +264,38 @@ namespace OpenSim.Data.NHibernate } } + /// + /// Updates given object to database. + /// Use this method for objects containing collections. For flat objects stateless mode is more efficient. + /// + /// Object to be updated. + /// True if operation was succesful. + public bool UpdateWithStatefullSession(object obj) + { + try + { + using (ISession session = sessionFactory.OpenSession()) + { + using (ITransaction transaction = session.BeginTransaction()) + { + session.Update(obj); + transaction.Commit(); + return true; + } + } + } + catch (Exception e) + { + m_log.Error("[NHIBERNATE] issue updating object ", e); + return false; + } + } + + /// + /// Deletes given object from database. + /// + /// Object to be deleted. + /// True if operation was succesful. public bool Delete(object obj) { try @@ -212,6 +317,18 @@ namespace OpenSim.Data.NHibernate } } + /// + /// Returns statefull session which can be used to execute custom nhibernate or sql queries. + /// + /// Statefull session + public ISession GetSession() + { + return sessionFactory.OpenSession(); + } + + /// + /// Drops the database schema. This exist for unit tests. It should not be invoked from other than test teardown. + /// public void DropSchema() { SchemaExport export = new SchemaExport(this.configuration); @@ -219,14 +336,10 @@ namespace OpenSim.Data.NHibernate using (ISession session = sessionFactory.OpenSession()) { - ISQLQuery sqlQuery=session.CreateSQLQuery("drop table migrations"); + ISQLQuery sqlQuery = session.CreateSQLQuery("drop table migrations"); sqlQuery.ExecuteUpdate(); } } - public ISession GetSession() - { - return sessionFactory.OpenSession(); - } } } diff --git a/OpenSim/Data/NHibernate/NHibernateRegionData.cs b/OpenSim/Data/NHibernate/NHibernateRegionData.cs index 78db52d33b..5af3d1ab1c 100644 --- a/OpenSim/Data/NHibernate/NHibernateRegionData.cs +++ b/OpenSim/Data/NHibernate/NHibernateRegionData.cs @@ -63,7 +63,7 @@ namespace OpenSim.Data.NHibernate public void StoreRegionSettings(RegionSettings rs) { - RegionSettings oldRegionSettings = (RegionSettings)manager.Load(typeof(RegionSettings), rs.RegionUUID); + RegionSettings oldRegionSettings = (RegionSettings)manager.Get(typeof(RegionSettings), rs.RegionUUID); if (oldRegionSettings != null) { manager.Update(rs); @@ -76,7 +76,7 @@ namespace OpenSim.Data.NHibernate public RegionSettings LoadRegionSettings(UUID regionUUID) { - RegionSettings regionSettings = (RegionSettings) manager.Load(typeof(RegionSettings), regionUUID); + RegionSettings regionSettings = (RegionSettings) manager.Get(typeof(RegionSettings), regionUUID); if (regionSettings == null) { @@ -96,7 +96,7 @@ namespace OpenSim.Data.NHibernate { try { - SceneObjectPart old = (SceneObjectPart)manager.Load(typeof(SceneObjectPart), p.UUID); + SceneObjectPart old = (SceneObjectPart)manager.Get(typeof(SceneObjectPart), p.UUID); if (old != null) { m_log.InfoFormat("[NHIBERNATE] updating object {0}", p.UUID); @@ -120,7 +120,7 @@ namespace OpenSim.Data.NHibernate try { - Terrain old = (Terrain)manager.Load(typeof(Terrain), t.RegionID); + Terrain old = (Terrain)manager.Get(typeof(Terrain), t.RegionID); if (old != null) { m_log.InfoFormat("[NHIBERNATE] updating terrain {0}", t.RegionID); @@ -279,7 +279,7 @@ namespace OpenSim.Data.NHibernate /// Heightfield data public double[,] LoadTerrain(UUID regionID) { - Terrain t = (Terrain)manager.Load(typeof(Terrain), regionID); + Terrain t = (Terrain)manager.Get(typeof(Terrain), regionID); if (t != null) { return t.Doubles; diff --git a/OpenSim/Data/NHibernate/NHibernateUserData.cs b/OpenSim/Data/NHibernate/NHibernateUserData.cs index 3f1f260af2..8aa4aa2ae8 100644 --- a/OpenSim/Data/NHibernate/NHibernateUserData.cs +++ b/OpenSim/Data/NHibernate/NHibernateUserData.cs @@ -61,7 +61,7 @@ namespace OpenSim.Data.NHibernate UserProfileData user = null; m_log.InfoFormat("[NHIBERNATE] ExistsUser; {0}", uuid); - user = (UserProfileData)manager.Load(typeof(UserProfileData), uuid); + user = (UserProfileData)manager.Get(typeof(UserProfileData), uuid); if (user == null) { @@ -78,7 +78,7 @@ namespace OpenSim.Data.NHibernate UserProfileData user; m_log.InfoFormat("[NHIBERNATE] GetUserByUUID: {0} ", uuid); - user = (UserProfileData)manager.Load(typeof(UserProfileData), uuid); + user = (UserProfileData)manager.Get(typeof(UserProfileData), uuid); if (user != null) { UserAgentData agent = GetAgentByUUID(uuid); @@ -163,7 +163,7 @@ namespace OpenSim.Data.NHibernate } - UserAgentData old = (UserAgentData)manager.Load(typeof(UserAgentData), agent.ProfileID); + UserAgentData old = (UserAgentData)manager.Get(typeof(UserAgentData), agent.ProfileID); if (old != null) { manager.Delete(old); @@ -182,7 +182,7 @@ namespace OpenSim.Data.NHibernate override public UserAgentData GetAgentByUUID(UUID uuid) { m_log.InfoFormat("[NHIBERNATE] GetAgentByUUID: {0} ", uuid); - return (UserAgentData)manager.Load(typeof(UserAgentData), uuid); + return (UserAgentData)manager.Get(typeof(UserAgentData), uuid); } override public UserProfileData GetUserByName(string fname, string lname) @@ -397,12 +397,12 @@ namespace OpenSim.Data.NHibernate /// TODO: stubs for now to get us to a compiling state gently public override AvatarAppearance GetUserAppearance(UUID user) { - return (AvatarAppearance)manager.Load(typeof(AvatarAppearance), user); + return (AvatarAppearance)manager.Get(typeof(AvatarAppearance), user); } private bool ExistsAppearance(UUID uuid) { - AvatarAppearance appearance = (AvatarAppearance)manager.Load(typeof(AvatarAppearance), uuid); + AvatarAppearance appearance = (AvatarAppearance)manager.Get(typeof(AvatarAppearance), uuid); if (appearance == null) { return false; diff --git a/OpenSim/Data/NHibernate/Resources/EstateSettings.hbm.xml b/OpenSim/Data/NHibernate/Resources/EstateSettings.hbm.xml index 2dc3949ba3..d8c8975b67 100644 --- a/OpenSim/Data/NHibernate/Resources/EstateSettings.hbm.xml +++ b/OpenSim/Data/NHibernate/Resources/EstateSettings.hbm.xml @@ -35,5 +35,23 @@ + + + + + + + + + + + + + + + + + + diff --git a/OpenSim/Data/NHibernate/Resources/MsSql2005Dialect/001_EstateStore.sql b/OpenSim/Data/NHibernate/Resources/MsSql2005Dialect/001_EstateStore.sql index 4ca51bef79..b852cbc2b5 100644 --- a/OpenSim/Data/NHibernate/Resources/MsSql2005Dialect/001_EstateStore.sql +++ b/OpenSim/Data/NHibernate/Resources/MsSql2005Dialect/001_EstateStore.sql @@ -38,3 +38,25 @@ CREATE TABLE EstateRegionLink ( CREATE INDEX EstateRegionLinkEstateIDIndex ON EstateRegionLink (EstateID); CREATE INDEX EstateRegionLinkERegionIDIndex ON EstateRegionLink (RegionID); + + +CREATE TABLE EstateManagers ( + EstateID INT NOT NULL, + ManagerID NVARCHAR(36) NOT NULL, + ArrayIndex INT NOT NULL, + PRIMARY KEY (EstateID,ArrayIndex) +); + +CREATE TABLE EstateUsers ( + EstateID INT NOT NULL, + UserID NVARCHAR(36) NOT NULL, + ArrayIndex INT NOT NULL, + PRIMARY KEY (EstateID,ArrayIndex) +); + +CREATE TABLE EstateGroups ( + EstateID INT NOT NULL, + GroupID NVARCHAR(36) NOT NULL, + ArrayIndex INT NOT NULL, + PRIMARY KEY (EstateID,ArrayIndex) +); \ No newline at end of file diff --git a/OpenSim/Data/NHibernate/Resources/MySQLDialect/001_EstateStore.sql b/OpenSim/Data/NHibernate/Resources/MySQLDialect/001_EstateStore.sql index 21141866a1..69635d87f5 100644 --- a/OpenSim/Data/NHibernate/Resources/MySQLDialect/001_EstateStore.sql +++ b/OpenSim/Data/NHibernate/Resources/MySQLDialect/001_EstateStore.sql @@ -38,3 +38,25 @@ CREATE TABLE EstateRegionLink ( CREATE INDEX EstateRegionLinkEstateIDIndex ON EstateRegionLink (EstateID); CREATE INDEX EstateRegionLinkERegionIDIndex ON EstateRegionLink (RegionID); + +CREATE TABLE EstateManagers ( + EstateID INT NOT NULL, + ManagerID VARCHAR(36) NOT NULL, + ArrayIndex INT NOT NULL, + PRIMARY KEY (EstateID,ArrayIndex) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Rev. 1'; + +CREATE TABLE EstateUsers ( + EstateID INT NOT NULL, + UserID VARCHAR(36) NOT NULL, + ArrayIndex INT NOT NULL, + PRIMARY KEY (EstateID,ArrayIndex) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Rev. 1'; + +CREATE TABLE EstateGroups ( + EstateID INT NOT NULL, + GroupID VARCHAR(36) NOT NULL, + ArrayIndex INT NOT NULL, + PRIMARY KEY (EstateID,ArrayIndex) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Rev. 1'; + diff --git a/OpenSim/Data/NHibernate/Resources/PostgreSQLDialect/001_EstateStore.sql b/OpenSim/Data/NHibernate/Resources/PostgreSQLDialect/001_EstateStore.sql index e43fd8634f..d13a4d3826 100644 --- a/OpenSim/Data/NHibernate/Resources/PostgreSQLDialect/001_EstateStore.sql +++ b/OpenSim/Data/NHibernate/Resources/PostgreSQLDialect/001_EstateStore.sql @@ -38,3 +38,25 @@ CREATE TABLE EstateRegionLink ( CREATE INDEX EstateRegionLinkEstateIDIndex ON EstateRegionLink (EstateID); CREATE INDEX EstateRegionLinkERegionIDIndex ON EstateRegionLink (RegionID); + + +CREATE TABLE EstateManagers ( + EstateID INT NOT NULL, + ManagerID VARCHAR(36) NOT NULL, + ArrayIndex INT NOT NULL, + PRIMARY KEY (EstateID,ArrayIndex) +); + +CREATE TABLE EstateUsers ( + EstateID INT NOT NULL, + UserID VARCHAR(36) NOT NULL, + ArrayIndex INT NOT NULL, + PRIMARY KEY (EstateID,ArrayIndex) +); + +CREATE TABLE EstateGroups ( + EstateID INT NOT NULL, + GroupID VARCHAR(36) NOT NULL, + ArrayIndex INT NOT NULL, + PRIMARY KEY (EstateID,ArrayIndex) +); \ No newline at end of file diff --git a/OpenSim/Data/NHibernate/Resources/SQLiteDialect/001_EstateStore.sql b/OpenSim/Data/NHibernate/Resources/SQLiteDialect/001_EstateStore.sql index b540bc6cb4..6e67630192 100644 --- a/OpenSim/Data/NHibernate/Resources/SQLiteDialect/001_EstateStore.sql +++ b/OpenSim/Data/NHibernate/Resources/SQLiteDialect/001_EstateStore.sql @@ -38,3 +38,24 @@ CREATE TABLE EstateRegionLink ( CREATE INDEX EstateRegionLinkEstateIDIndex ON EstateRegionLink (EstateID); CREATE INDEX EstateRegionLinkERegionIDIndex ON EstateRegionLink (RegionID); + +CREATE TABLE EstateManagers ( + EstateID INT NOT NULL, + ManagerID VARCHAR(36) NOT NULL, + ArrayIndex INT NOT NULL, + PRIMARY KEY (EstateID,ArrayIndex) +); + +CREATE TABLE EstateUsers ( + EstateID INT NOT NULL, + UserID VARCHAR(36) NOT NULL, + ArrayIndex INT NOT NULL, + PRIMARY KEY (EstateID,ArrayIndex) +); + +CREATE TABLE EstateGroups ( + EstateID INT NOT NULL, + GroupID VARCHAR(36) NOT NULL, + ArrayIndex INT NOT NULL, + PRIMARY KEY (EstateID,ArrayIndex) +);