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)
+);