From dde32f1130f83f9471fea474b1ebc9e0520be561 Mon Sep 17 00:00:00 2001 From: Justin Clarke Casey Date: Tue, 2 Dec 2008 15:22:58 +0000 Subject: * Reapply http://opensimulator.org/mantis/view.php?id=2710 * This patch gets NHibernate working *** PLEASE NOTE: This patch now requires the libmono-oracle2.0-cil library to be installed on Ubuntu (to stop the System.Data.Oracle missing failure) *** * Not sure what the dependency is on other distros. Adding this info to http://opensimulator.org/wiki/Build_Instructions would be most welcome * Adds Castle.* libraries that were missing last time (note, dlls have been added from http://downloads.sourceforge.net/nhibernate/NHibernate-2.0.1.GA-bin.zip) --- OpenSim/Data/Migration.cs | 10 +- OpenSim/Data/NHibernate/LLQuaternionUserType.cs | 6 +- OpenSim/Data/NHibernate/LLVector3UserType.cs | 7 +- OpenSim/Data/NHibernate/NHibernateAssetData.cs | 77 ++-------- OpenSim/Data/NHibernate/NHibernateInventoryData.cs | 107 +++++--------- OpenSim/Data/NHibernate/NHibernateManager.cs | 142 ++++++++++++++++--- OpenSim/Data/NHibernate/NHibernateRegionData.cs | 124 ++++++----------- OpenSim/Data/NHibernate/NHibernateUserData.cs | 155 ++++++++------------- .../Data/NHibernate/Resources/AssetBase.hbm.xml | 2 +- .../Resources/InventoryFolderBase.hbm.xml | 2 +- .../NHibernate/Resources/InventoryItemBase.hbm.xml | 10 +- .../Resources/MySQLDialect/002_RegionStore.sql | 4 +- .../Data/NHibernate/Resources/RegionStore.hbm.xml | 85 +++++++---- .../NHibernate/Resources/UserAgentData.hbm.xml | 8 +- .../NHibernate/Resources/UserProfileData.hbm.xml | 4 +- OpenSim/Data/NHibernate/Terrain.cs | 2 +- OpenSim/Data/RegionProfileData.cs | 151 ++++++++++++++++++++ 17 files changed, 509 insertions(+), 387 deletions(-) (limited to 'OpenSim/Data') diff --git a/OpenSim/Data/Migration.cs b/OpenSim/Data/Migration.cs index 8fbf789..332b8ec 100644 --- a/OpenSim/Data/Migration.cs +++ b/OpenSim/Data/Migration.cs @@ -82,6 +82,7 @@ namespace OpenSim.Data // 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'"; + public Migration(DbConnection conn, Assembly assem, string type) { _type = type; @@ -112,6 +113,7 @@ namespace OpenSim.Data DbCommand cmd = _conn.CreateCommand(); cmd.CommandText = _migrations_create; cmd.ExecuteNonQuery(); + cmd.Dispose(); InsertVersion("migrations", 1); } @@ -135,7 +137,7 @@ namespace OpenSim.Data int newversion = kvp.Key; cmd.CommandText = kvp.Value; // we need to up the command timeout to infinite as we might be doing long migrations. - cmd.CommandTimeout = 0; + //cmd.CommandTimeout = 0; cmd.ExecuteNonQuery(); if (version == 0) @@ -147,6 +149,7 @@ namespace OpenSim.Data UpdateVersion(_type, newversion); } version = newversion; + cmd.Dispose(); } } @@ -189,7 +192,7 @@ namespace OpenSim.Data DbCommand cmd = conn.CreateCommand(); try { - cmd.CommandText = "select version from migrations where name='" + type + "' limit 1"; + cmd.CommandText = "select version from migrations where name='" + type +"' order by version desc"; using (IDataReader reader = cmd.ExecuteReader()) { if (reader.Read()) @@ -203,6 +206,7 @@ namespace OpenSim.Data { // Something went wrong, so we're version 0 } + cmd.Dispose(); return version; } @@ -212,6 +216,7 @@ namespace OpenSim.Data cmd.CommandText = "insert into migrations(name, version) values('" + type + "', " + version + ")"; m_log.InfoFormat("[MIGRATIONS]: Creating {0} at version {1}", type, version); cmd.ExecuteNonQuery(); + cmd.Dispose(); } private void UpdateVersion(string type, int version) @@ -220,6 +225,7 @@ namespace OpenSim.Data cmd.CommandText = "update migrations set version=" + version + " where name='" + type + "'"; m_log.InfoFormat("[MIGRATIONS]: Updating {0} to version {1}", type, version); cmd.ExecuteNonQuery(); + cmd.Dispose(); } // private SortedList GetAllMigrations() diff --git a/OpenSim/Data/NHibernate/LLQuaternionUserType.cs b/OpenSim/Data/NHibernate/LLQuaternionUserType.cs index 7431433..0cd5c6f 100644 --- a/OpenSim/Data/NHibernate/LLQuaternionUserType.cs +++ b/OpenSim/Data/NHibernate/LLQuaternionUserType.cs @@ -78,7 +78,11 @@ namespace OpenSim.Data.NHibernate int w = rs.GetOrdinal(names[3]); if (!rs.IsDBNull(x)) { - quat = new Quaternion((Single)rs[x], (Single)rs[y], (Single)rs[z], (Single)rs[w]); + float X = (Single)Convert.ToDouble(rs[x].ToString()); + float Y = (Single)Convert.ToDouble(rs[y].ToString()); + float Z = (Single)Convert.ToDouble(rs[z].ToString()); + float W = (Single)Convert.ToDouble(rs[w].ToString()); + quat = new Quaternion(X, Y, Z, W); } return quat; } diff --git a/OpenSim/Data/NHibernate/LLVector3UserType.cs b/OpenSim/Data/NHibernate/LLVector3UserType.cs index cdd15ec..25a2bc6 100644 --- a/OpenSim/Data/NHibernate/LLVector3UserType.cs +++ b/OpenSim/Data/NHibernate/LLVector3UserType.cs @@ -74,9 +74,12 @@ namespace OpenSim.Data.NHibernate int x = rs.GetOrdinal(names[0]); int y = rs.GetOrdinal(names[1]); int z = rs.GetOrdinal(names[2]); - if (!rs.IsDBNull(x)) + if (!rs.IsDBNull(x) && !rs.IsDBNull(y) && !rs.IsDBNull(z)) { - vector = new Vector3((Single)rs[x], (Single)rs[y], (Single)rs[z]); + float X = (Single)Convert.ToDouble(rs[x].ToString()); + float Y = (Single)Convert.ToDouble(rs[y].ToString()); + float Z = (Single)Convert.ToDouble(rs[z].ToString()); + vector = new Vector3(X, Y, Z); } return vector; } diff --git a/OpenSim/Data/NHibernate/NHibernateAssetData.cs b/OpenSim/Data/NHibernate/NHibernateAssetData.cs index 6ee527e..90d41e3 100644 --- a/OpenSim/Data/NHibernate/NHibernateAssetData.cs +++ b/OpenSim/Data/NHibernate/NHibernateAssetData.cs @@ -33,10 +33,7 @@ using System.Text.RegularExpressions; using OpenMetaverse; using log4net; using NHibernate; -using NHibernate.Cfg; -using NHibernate.Expression; using NHibernate.Mapping.Attributes; -using NHibernate.Tool.hbm2ddl; using OpenSim.Framework; using Environment=NHibernate.Cfg.Environment; @@ -49,9 +46,7 @@ namespace OpenSim.Data.NHibernate { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - private Configuration cfg; - private ISessionFactory factory; - private ISession session; + private NHibernateManager manager; override public void Dispose() { } @@ -62,79 +57,23 @@ namespace OpenSim.Data.NHibernate public override void Initialise(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 + "'"); - } - - string dialect = parts[0]; - - // NHibernate setup - cfg = new Configuration(); - cfg.SetProperty(Environment.ConnectionProvider, - "NHibernate.Connection.DriverConnectionProvider"); - cfg.SetProperty(Environment.Dialect, - "NHibernate.Dialect." + dialect); - cfg.SetProperty(Environment.ConnectionDriver, - "NHibernate.Driver." + parts[1]); - cfg.SetProperty(Environment.ConnectionString, parts[2]); - cfg.AddAssembly("OpenSim.Data.NHibernate"); - - - HbmSerializer.Default.Validate = true; - using (MemoryStream stream = - HbmSerializer.Default.Serialize(Assembly.GetExecutingAssembly())) - cfg.AddInputStream(stream); - - factory = cfg.BuildSessionFactory(); - session = factory.OpenSession(); - - // This actually does the roll forward assembly stuff - Assembly assem = GetType().Assembly; - Migration m = new Migration((System.Data.Common.DbConnection)factory.ConnectionProvider.GetConnection(), assem, dialect, "AssetStore"); - m.Update(); + m_log.InfoFormat("[NHIBERNATE] Initializing NHibernateAssetData"); + manager = new NHibernateManager(connect, "AssetStore"); } override public AssetBase FetchAsset(UUID uuid) { - try - { - return session.Load(typeof(AssetBase), uuid) as AssetBase; - } - catch (ObjectNotFoundException) - { - m_log.ErrorFormat("[NHIBERNATE] no such asset {0}", uuid); - return null; - } - catch (Exception e) - { - m_log.Error("[NHIBERNATE] unexpected exception: ", e); - return null; - } + return (AssetBase)manager.Load(typeof(AssetBase), uuid); } private void Save(AssetBase asset) { - try + AssetBase temp = (AssetBase)manager.Load(typeof(AssetBase), asset.FullID); + if (temp == null) { - // a is not used anywhere? - // AssetBase a = session.Load(typeof(AssetBase), asset.FullID) as AssetBase; - session.Load(typeof(AssetBase), asset.FullID); - } - catch (ObjectNotFoundException) - { - session.Save(asset); - session.Flush(); - } - catch (Exception e) - { - m_log.Error("[NHIBERNATE] issue saving asset", e); + manager.Save(asset); } } @@ -147,7 +86,7 @@ namespace OpenSim.Data.NHibernate override public void UpdateAsset(AssetBase asset) { m_log.InfoFormat("[NHIBERNATE] updating asset {0}", asset.FullID); - Save(asset); + manager.Update(asset); } // private void LogAssetLoad(AssetBase asset) diff --git a/OpenSim/Data/NHibernate/NHibernateInventoryData.cs b/OpenSim/Data/NHibernate/NHibernateInventoryData.cs index bceb5d5..f7de8eb 100644 --- a/OpenSim/Data/NHibernate/NHibernateInventoryData.cs +++ b/OpenSim/Data/NHibernate/NHibernateInventoryData.cs @@ -33,10 +33,7 @@ using System.Text.RegularExpressions; using OpenMetaverse; using log4net; using NHibernate; -using NHibernate.Cfg; -using NHibernate.Expression; -using NHibernate.Mapping.Attributes; -using NHibernate.Tool.hbm2ddl; +using NHibernate.Criterion; using OpenSim.Framework; using Environment=NHibernate.Cfg.Environment; @@ -46,9 +43,7 @@ namespace OpenSim.Data.NHibernate { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - private Configuration cfg; - private ISessionFactory factory; - private ISession session; + private NHibernateManager manager; public void Initialise() { @@ -61,35 +56,8 @@ namespace OpenSim.Data.NHibernate /// public void Initialise(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 + "'"); - } - string dialect = parts[0]; - - // Establish NHibernate Connection - cfg = new Configuration(); - cfg.SetProperty(Environment.ConnectionProvider, - "NHibernate.Connection.DriverConnectionProvider"); - cfg.SetProperty(Environment.Dialect, - "NHibernate.Dialect." + parts[0]); - cfg.SetProperty(Environment.ConnectionDriver, - "NHibernate.Driver." + parts[1]); - cfg.SetProperty(Environment.ConnectionString, parts[2]); - cfg.AddAssembly("OpenSim.Data.NHibernate"); - - factory = cfg.BuildSessionFactory(); - session = factory.OpenSession(); - - // This actually does the roll forward assembly stuff - Assembly assem = GetType().Assembly; - Migration m = new Migration((System.Data.Common.DbConnection)factory.ConnectionProvider.GetConnection(), assem, dialect, "InventoryStore"); - m.Update(); - + m_log.InfoFormat("[NHIBERNATE] Initializing NHibernateInventoryData"); + manager = new NHibernateManager(connect, "InventoryStore"); } /***************************************************************** @@ -109,7 +77,8 @@ namespace OpenSim.Data.NHibernate { try { - return session.Load(typeof(InventoryItemBase), item) as InventoryItemBase; + m_log.InfoFormat("[NHIBERNATE] getInventoryItem {0}", item); + return (InventoryItemBase)manager.Load(typeof(InventoryItemBase), item); } catch { @@ -126,15 +95,11 @@ namespace OpenSim.Data.NHibernate { if (!ExistsItem(item.ID)) { - using (ITransaction transaction = session.BeginTransaction()) - { - session.Save(item); - transaction.Commit(); - } + manager.Save(item); } else { - m_log.ErrorFormat("Attempted to add Inventory Item {0} that already exists, updating instead", item.ID); + m_log.ErrorFormat("[NHIBERNATE] Attempted to add Inventory Item {0} that already exists, updating instead", item.ID); updateInventoryItem(item); } } @@ -147,15 +112,11 @@ namespace OpenSim.Data.NHibernate { if (ExistsItem(item.ID)) { - using (ITransaction transaction = session.BeginTransaction()) - { - session.Update(item); - transaction.Commit(); - } + manager.Update(item); } else { - m_log.ErrorFormat("Attempted to add Inventory Item {0} that already exists", item.ID); + m_log.ErrorFormat("[NHIBERNATE] Attempted to add Inventory Item {0} that already exists", item.ID); } } @@ -165,11 +126,16 @@ namespace OpenSim.Data.NHibernate /// public void deleteInventoryItem(UUID itemID) { - using (ITransaction transaction = session.BeginTransaction()) + InventoryItemBase item = (InventoryItemBase)manager.Load(typeof(InventoryItemBase), itemID); + if (item != null) { - session.Delete(itemID); - transaction.Commit(); + manager.Delete(item); } + else + { + m_log.ErrorFormat("[NHIBERNATE] Error deleting InventoryItemBase {0}", itemID); + } + } /// @@ -181,11 +147,11 @@ namespace OpenSim.Data.NHibernate { try { - return session.Load(typeof(InventoryFolderBase), folder) as InventoryFolderBase; + return (InventoryFolderBase)manager.Load(typeof(InventoryFolderBase), folder); } catch { - m_log.ErrorFormat("Couldn't find inventory item: {0}", folder); + m_log.ErrorFormat("[NHIBERNATE] Couldn't find inventory item: {0}", folder); return null; } } @@ -198,15 +164,11 @@ namespace OpenSim.Data.NHibernate { if (!ExistsFolder(folder.ID)) { - using (ITransaction transaction = session.BeginTransaction()) - { - session.Save(folder); - transaction.Commit(); - } + manager.Save(folder); } else { - m_log.ErrorFormat("Attempted to add Inventory Folder {0} that already exists, updating instead", folder.ID); + m_log.ErrorFormat("[NHIBERNATE] Attempted to add Inventory Folder {0} that already exists, updating instead", folder.ID); updateInventoryFolder(folder); } } @@ -219,15 +181,11 @@ namespace OpenSim.Data.NHibernate { if (ExistsFolder(folder.ID)) { - using (ITransaction transaction = session.BeginTransaction()) - { - session.Update(folder); - transaction.Commit(); - } + manager.Update(folder); } else { - m_log.ErrorFormat("Attempted to add Inventory Folder {0} that already exists", folder.ID); + m_log.ErrorFormat("[NHIBERNATE] Attempted to add Inventory Folder {0} that already exists", folder.ID); } } @@ -237,11 +195,16 @@ namespace OpenSim.Data.NHibernate /// public void deleteInventoryFolder(UUID folderID) { - using (ITransaction transaction = session.BeginTransaction()) + InventoryFolderBase item = (InventoryFolderBase)manager.Load(typeof(InventoryFolderBase), folderID); + if (item != null) + { + manager.Delete(item); + } + else { - session.Delete(folderID.ToString()); - transaction.Commit(); + m_log.ErrorFormat("[NHIBERNATE] Error deleting InventoryFolderBase {0}", folderID); } + manager.Delete(folderID); } // useful private methods @@ -317,7 +280,7 @@ namespace OpenSim.Data.NHibernate public List getInventoryInFolder(UUID folderID) { // try { - ICriteria criteria = session.CreateCriteria(typeof(InventoryItemBase)); + ICriteria criteria = manager.GetSession().CreateCriteria(typeof(InventoryItemBase)); criteria.Add(Expression.Eq("Folder", folderID)); List list = new List(); foreach (InventoryItemBase item in criteria.List()) @@ -340,7 +303,7 @@ namespace OpenSim.Data.NHibernate // see InventoryItemBase.getUserRootFolder public InventoryFolderBase getUserRootFolder(UUID user) { - ICriteria criteria = session.CreateCriteria(typeof(InventoryFolderBase)); + ICriteria criteria = manager.GetSession().CreateCriteria(typeof(InventoryFolderBase)); criteria.Add(Expression.Eq("ParentID", UUID.Zero)); criteria.Add(Expression.Eq("Owner", user)); foreach (InventoryFolderBase folder in criteria.List()) @@ -358,7 +321,7 @@ namespace OpenSim.Data.NHibernate /// ID of parent private void getInventoryFolders(ref List folders, UUID parentID) { - ICriteria criteria = session.CreateCriteria(typeof(InventoryFolderBase)); + ICriteria criteria = manager.GetSession().CreateCriteria(typeof(InventoryFolderBase)); criteria.Add(Expression.Eq("ParentID", parentID)); foreach (InventoryFolderBase item in criteria.List()) { diff --git a/OpenSim/Data/NHibernate/NHibernateManager.cs b/OpenSim/Data/NHibernate/NHibernateManager.cs index 161ec1d..36d84e2 100644 --- a/OpenSim/Data/NHibernate/NHibernateManager.cs +++ b/OpenSim/Data/NHibernate/NHibernateManager.cs @@ -25,35 +25,141 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +using System; using System.Reflection; +using System.IO; using log4net; using NHibernate; +using NHibernate.Cfg; +using NHibernate.Mapping.Attributes; +using NHibernate.Tool.hbm2ddl; +using OpenMetaverse; +using Environment = NHibernate.Cfg.Environment; namespace OpenSim.Data.NHibernate { - internal class NHibernateManager + public class NHibernateManager { - // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - // private ISessionFactory factory; - // private ISession session; - // private ITransaction transaction; + private string dialect; + private Configuration cfg; + private ISessionFactory factory; + private ISession session; - public NHibernateManager() + public NHibernateManager(string connect, string store) { - // This is stubbing for now, it will become dynamic later and support different db backends -// NHibernate.Cfg.Configuration cfg = new NHibernate.Cfg.Configuration(); -// cfg.Properties[NHibernate.Cfg.Environment.ConnectionProvider] = -// "NHibernate.Connection.DriverConnectionProvider"; -// cfg.Properties[NHibernate.Cfg.Environment.Dialect] = -// "NHibernate.Dialect.SQLite"; -// cfg.Properties[NHibernate.Cfg.Environment.ConnectionDriver] = -// "NHibernate.Driver.SqliteClientDriver"; -// cfg.Properties[NHibernate.Cfg.Environment.ConnectionString] = -// "URI=file:opensim-nh.db,version=3"; - -// factory = cfg.BuildSessionFactory(); + + // 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 + cfg = new Configuration(); + cfg.SetProperty(Environment.ConnectionProvider, + "NHibernate.Connection.DriverConnectionProvider"); + cfg.SetProperty(Environment.Dialect, + "NHibernate.Dialect." + dialect); + cfg.SetProperty(Environment.ConnectionDriver, + "NHibernate.Driver." + parts[1]); + cfg.SetProperty(Environment.ConnectionString, parts[2]); + cfg.AddAssembly("OpenSim.Data.NHibernate"); + + //To create sql file uncomment code below and write the name of the file + //SchemaExport exp = new SchemaExport(cfg); + //exp.SetOutputFile("nameofthefile.sql"); + //exp.Create(false, true); + + HbmSerializer.Default.Validate = true; + using (MemoryStream stream = + HbmSerializer.Default.Serialize(Assembly.GetExecutingAssembly())) + cfg.AddInputStream(stream); + + factory = cfg.BuildSessionFactory(); + session = factory.OpenSession(); + + Assembly assem = GetType().Assembly; + Migration m = new Migration((System.Data.Common.DbConnection)factory.ConnectionProvider.GetConnection(), assem, dialect, store); + m.Update(); } + public object Load(Type type, UUID uuid) + { + object obj = null; + try + { + obj = session.Load(type, uuid); + } + catch (Exception) + { + m_log.ErrorFormat("[NHIBERNATE] {0} not found with ID {1} ", type.Name, uuid); + } + return obj; + + } + + public bool Save(object obj) + { + try + { + session.BeginTransaction(); + session.Save(obj); + session.Transaction.Commit(); + session.Flush(); + return true; + } + catch (Exception e) + { + m_log.Error("[NHIBERNATE] issue saving object ", e); + } + return false; + } + + public bool Update(object obj) + { + try + { + session.BeginTransaction(); + session.Update(obj); + session.Transaction.Commit(); + session.Flush(); + return true; + } + catch (Exception e) + { + m_log.Error("[NHIBERNATE] issue updating object ", e); + } + return false; + } + + public bool Delete(object obj) + { + try + { + session.BeginTransaction(); + session.Delete(obj); + session.Transaction.Commit(); + session.Flush(); + return true; + } + catch (Exception e) + { + + m_log.Error("[NHIBERNATE] issue deleting object ", e); + } + return false; + } + + public ISession GetSession() + { + return session; + } } } diff --git a/OpenSim/Data/NHibernate/NHibernateRegionData.cs b/OpenSim/Data/NHibernate/NHibernateRegionData.cs index 475cd71..0aba58c 100644 --- a/OpenSim/Data/NHibernate/NHibernateRegionData.cs +++ b/OpenSim/Data/NHibernate/NHibernateRegionData.cs @@ -34,10 +34,7 @@ using System.Text.RegularExpressions; using OpenMetaverse; using log4net; using NHibernate; -using NHibernate.Cfg; -using NHibernate.Expression; -using NHibernate.Mapping.Attributes; -using NHibernate.Tool.hbm2ddl; +using NHibernate.Criterion; using OpenSim.Framework; using OpenSim.Region.Environment.Interfaces; using OpenSim.Region.Environment.Scenes; @@ -52,51 +49,12 @@ namespace OpenSim.Data.NHibernate { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - private Configuration cfg; - private ISessionFactory factory; - private ISession session; - - // public void Initialise() - // { - // Initialise("SQLiteDialect;SqliteClientDriver;URI=file:OpenSim.db,version=3", true); - // } + private NHibernateManager manager; public void Initialise(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 Region connection string '" + connect + "'"); - } - - string dialect = parts[0]; - - // NHibernate setup - cfg = new Configuration(); - cfg.SetProperty(Environment.ConnectionProvider, - "NHibernate.Connection.DriverConnectionProvider"); - cfg.SetProperty(Environment.Dialect, - "NHibernate.Dialect." + dialect); - cfg.SetProperty(Environment.ConnectionDriver, - "NHibernate.Driver." + parts[1]); - cfg.SetProperty(Environment.ConnectionString, parts[2]); - cfg.AddAssembly("OpenSim.Data.NHibernate"); - - HbmSerializer.Default.Validate = true; - using (MemoryStream stream = - HbmSerializer.Default.Serialize(Assembly.GetExecutingAssembly())) - cfg.AddInputStream(stream); - - factory = cfg.BuildSessionFactory(); - session = factory.OpenSession(); - - // This actually does the roll forward assembly stuff - Assembly assem = GetType().Assembly; - Migration m = new Migration((System.Data.Common.DbConnection)factory.ConnectionProvider.GetConnection(), assem, dialect, "RegionStore"); - m.Update(); + m_log.InfoFormat("[NHIBERNATE] Initializing NHibernateRegionData"); + manager = new NHibernateManager(connect, "RegionStore"); } /*********************************************************************** @@ -122,15 +80,18 @@ namespace OpenSim.Data.NHibernate { try { - SceneObjectPart old = session.Load(typeof(SceneObjectPart), p.UUID) as SceneObjectPart; - session.Evict(old); - session.Update(p); - m_log.InfoFormat("[NHIBERNATE] updating object {0}", p.UUID); - } - catch (ObjectNotFoundException) - { - m_log.InfoFormat("[NHIBERNATE] saving object {0}", p.UUID); - session.Save(p); + SceneObjectPart old = (SceneObjectPart)manager.Load(typeof(SceneObjectPart), p.UUID); + if (old != null) + { + m_log.InfoFormat("[NHIBERNATE] updating object {0}", p.UUID); + manager.Update(old); + } + else + { + m_log.InfoFormat("[NHIBERNATE] saving object {0}", p.UUID); + manager.Save(p); + } + } catch (Exception e) { @@ -142,15 +103,19 @@ namespace OpenSim.Data.NHibernate { try { - Terrain old = session.Load(typeof(Terrain), t.RegionID) as Terrain; - session.Evict(old); - session.Update(t); - session.Flush(); - } - catch (ObjectNotFoundException) - { - session.Save(t); - session.Flush(); + + Terrain old = (Terrain)manager.Load(typeof(Terrain), t.RegionID); + if (old != null) + { + m_log.InfoFormat("[NHIBERNATE] updating terrain {0}", t.RegionID); + manager.Update(old); + } + else + { + m_log.InfoFormat("[NHIBERNATE] saving terrain {0}", t.RegionID); + manager.Save(t); + } + } catch (Exception e) { @@ -173,7 +138,6 @@ namespace OpenSim.Data.NHibernate m_log.InfoFormat("Storing part {0}", part.UUID); SaveOrUpdate(part); } - session.Flush(); } catch (Exception e) { @@ -185,7 +149,7 @@ namespace OpenSim.Data.NHibernate { SceneObjectGroup group = new SceneObjectGroup(); - ICriteria criteria = session.CreateCriteria(typeof(SceneObjectPart)); + ICriteria criteria = manager.GetSession().CreateCriteria(typeof(SceneObjectPart)); criteria.Add(Expression.Eq("RegionID", region)); criteria.Add(Expression.Eq("ParentUUID", uuid)); criteria.AddOrder( Order.Asc("ParentID") ); @@ -216,9 +180,8 @@ namespace OpenSim.Data.NHibernate SceneObjectGroup g = LoadObject(obj, regionUUID); foreach (SceneObjectPart p in g.Children.Values) { - session.Delete(p); + manager.Delete(p); } - session.Flush(); m_log.InfoFormat("[REGION DB]: Removing obj: {0} from region: {1}", obj.Guid, regionUUID); @@ -234,7 +197,7 @@ namespace OpenSim.Data.NHibernate Dictionary SOG = new Dictionary(); List ret = new List(); - ICriteria criteria = session.CreateCriteria(typeof(SceneObjectPart)); + ICriteria criteria = manager.GetSession().CreateCriteria(typeof(SceneObjectPart)); criteria.Add(Expression.Eq("RegionID", regionUUID)); criteria.AddOrder( Order.Asc("ParentID") ); foreach (SceneObjectPart p in criteria.List()) @@ -252,7 +215,7 @@ namespace OpenSim.Data.NHibernate } // get the inventory - ICriteria InvCriteria = session.CreateCriteria(typeof(TaskInventoryItem)); + ICriteria InvCriteria = manager.GetSession().CreateCriteria(typeof(TaskInventoryItem)); InvCriteria.Add(Expression.Eq("ParentPartID", p.UUID)); IList inventory = new List(); foreach (TaskInventoryItem i in InvCriteria.List()) @@ -291,16 +254,14 @@ namespace OpenSim.Data.NHibernate /// Heightfield data public double[,] LoadTerrain(UUID regionID) { - try + Terrain t = (Terrain)manager.Load(typeof(Terrain), regionID); + if (t != null) { - Terrain t = session.Load(typeof(Terrain), regionID) as Terrain; return t.Doubles; } - catch (ObjectNotFoundException) - { - m_log.Info("No terrain yet"); - return null; - } + + m_log.Info("No terrain yet"); + return null; } /// @@ -339,7 +300,7 @@ namespace OpenSim.Data.NHibernate /// public void Shutdown() { - session.Flush(); + //session.Flush(); } /// @@ -397,21 +358,20 @@ namespace OpenSim.Data.NHibernate /// public void StorePrimInventory(UUID primID, ICollection items) { - ICriteria criteria = session.CreateCriteria(typeof(TaskInventoryItem)); + ICriteria criteria = manager.GetSession().CreateCriteria(typeof(TaskInventoryItem)); criteria.Add(Expression.Eq("ParentPartID", primID)); try { foreach (TaskInventoryItem i in criteria.List()) { - session.Delete(i); + manager.Delete(i); } foreach (TaskInventoryItem i in items) { - session.Save(i); + manager.Save(i); } - session.Flush(); } catch (Exception e) { diff --git a/OpenSim/Data/NHibernate/NHibernateUserData.cs b/OpenSim/Data/NHibernate/NHibernateUserData.cs index 3a22dc3..ee0d2b8 100644 --- a/OpenSim/Data/NHibernate/NHibernateUserData.cs +++ b/OpenSim/Data/NHibernate/NHibernateUserData.cs @@ -33,10 +33,7 @@ using System.Text.RegularExpressions; using OpenMetaverse; using log4net; using NHibernate; -using NHibernate.Cfg; -using NHibernate.Expression; -using NHibernate.Mapping.Attributes; -using NHibernate.Tool.hbm2ddl; +using NHibernate.Criterion; using OpenSim.Framework; using Environment=NHibernate.Cfg.Environment; @@ -49,9 +46,7 @@ namespace OpenSim.Data.NHibernate { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - private Configuration cfg; - private ISessionFactory factory; - private ISession session; + private NHibernateManager manager; public override void Initialise() { @@ -61,62 +56,40 @@ namespace OpenSim.Data.NHibernate public override void Initialise(string connect) { - 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 + "'"); - } - string dialect = parts[0]; - - // This is stubbing for now, it will become dynamic later and support different db backends - cfg = new Configuration(); - cfg.SetProperty(Environment.ConnectionProvider, - "NHibernate.Connection.DriverConnectionProvider"); - cfg.SetProperty(Environment.Dialect, - "NHibernate.Dialect." + parts[0]); - cfg.SetProperty(Environment.ConnectionDriver, - "NHibernate.Driver." + parts[1]); - cfg.SetProperty(Environment.ConnectionString, parts[2]); - cfg.AddAssembly("OpenSim.Data.NHibernate"); - - factory = cfg.BuildSessionFactory(); - session = factory.OpenSession(); - - // This actually does the roll forward assembly stuff - Assembly assem = GetType().Assembly; - Migration m = new Migration((System.Data.Common.DbConnection)factory.ConnectionProvider.GetConnection(), assem, dialect, "UserStore"); - m.Update(); + m_log.InfoFormat("[NHIBERNATE] Initializing NHibernateUserData"); + manager = new NHibernateManager(connect, "UserStore"); } private bool ExistsUser(UUID uuid) { UserProfileData user = null; - try - { - user = session.Load(typeof(UserProfileData), uuid) as UserProfileData; - } - catch (ObjectNotFoundException) + + m_log.InfoFormat("[NHIBERNATE] ExistsUser; {0}", uuid); + user = (UserProfileData)manager.Load(typeof(UserProfileData), uuid); + + if (user == null) { - user = null; + m_log.InfoFormat("[NHIBERNATE] User with given UUID does not exist {0} ", uuid); + return false; } - return (user != null); + return true; + } override public UserProfileData GetUserByUUID(UUID uuid) { UserProfileData user; - // TODO: I'm sure I'll have to do something silly here - try + m_log.InfoFormat("[NHIBERNATE] GetUserByUUID: {0} ", uuid); + + user = (UserProfileData)manager.Load(typeof(UserProfileData), uuid); + if (user != null) { - user = session.Load(typeof(UserProfileData), uuid) as UserProfileData; - user.CurrentAgent = GetAgentByUUID(uuid); - } - catch (ObjectNotFoundException) - { - user = null; + UserAgentData agent = GetAgentByUUID(uuid); + if (agent != null) + { + user.CurrentAgent = agent; + } } return user; @@ -126,33 +99,30 @@ namespace OpenSim.Data.NHibernate { if (!ExistsUser(profile.ID)) { - session.Save(profile); + m_log.InfoFormat("[NHIBERNATE] AddNewUserProfile {0}", profile.ID); + manager.Save(profile); SetAgentData(profile.ID, profile.CurrentAgent); + } else { - m_log.ErrorFormat("Attempted to add User {0} {1} that already exists, updating instead", profile.FirstName, profile.SurName); + m_log.ErrorFormat("[NHIBERNATE] Attempted to add User {0} {1} that already exists, updating instead", profile.FirstName, profile.SurName); UpdateUserProfile(profile); } } private void SetAgentData(UUID uuid, UserAgentData agent) { - if (agent == null) + UserAgentData old = (UserAgentData)manager.Load(typeof(UserAgentData), uuid); + if (old != null) { - // TODO: got to figure out how to do a delete right + m_log.InfoFormat("[NHIBERNATE] SetAgentData deleting old: {0} ",uuid); + manager.Delete(old); } - else + if (agent != null) { - try - { - UserAgentData old = session.Load(typeof(UserAgentData), uuid) as UserAgentData; - session.Delete(old); - } - catch (ObjectNotFoundException) - { - } - session.Save(agent); + m_log.InfoFormat("[NHIBERNATE] SetAgentData: {0} ", agent.ProfileID); + manager.Save(agent); } } @@ -160,13 +130,13 @@ namespace OpenSim.Data.NHibernate { if (ExistsUser(profile.ID)) { - session.Update(profile); + manager.Update(profile); SetAgentData(profile.ID, profile.CurrentAgent); return true; } else { - m_log.ErrorFormat("Attempted to update User {0} {1} that doesn't exist, updating instead", profile.FirstName, profile.SurName); + m_log.ErrorFormat("[NHIBERNATE] Attempted to update User {0} {1} that doesn't exist, updating instead", profile.FirstName, profile.SurName); AddNewUserProfile(profile); return true; } @@ -174,37 +144,32 @@ namespace OpenSim.Data.NHibernate override public void AddNewUserAgent(UserAgentData agent) { - try + UserAgentData old = (UserAgentData)manager.Load(typeof(UserAgentData), agent.ProfileID); + if (old != null) { - UserAgentData old = session.Load(typeof(UserAgentData), agent.ProfileID) as UserAgentData; - session.Delete(old); + manager.Delete(old); } - catch (ObjectNotFoundException) - { - } - session.Save(agent); + + manager.Save(agent); + } public void UpdateUserAgent(UserAgentData agent) { - session.Update(agent); + m_log.InfoFormat("[NHIBERNATE] UpdateUserAgent: {0} ", agent.ProfileID); + manager.Update(agent); } override public UserAgentData GetAgentByUUID(UUID uuid) { - try - { - return session.Load(typeof(UserAgentData), uuid) as UserAgentData; - } - catch - { - return null; - } + m_log.InfoFormat("[NHIBERNATE] GetAgentByUUID: {0} ", uuid); + return (UserAgentData)manager.Load(typeof(UserAgentData), uuid); } override public UserProfileData GetUserByName(string fname, string lname) { - ICriteria criteria = session.CreateCriteria(typeof(UserProfileData)); + m_log.InfoFormat("[NHIBERNATE] GetUserByName: {0} {1} ", fname, lname); + ICriteria criteria = manager.GetSession().CreateCriteria(typeof(UserProfileData)); criteria.Add(Expression.Eq("FirstName", fname)); criteria.Add(Expression.Eq("SurName", lname)); foreach (UserProfileData profile in criteria.List()) @@ -233,7 +198,7 @@ namespace OpenSim.Data.NHibernate if (querysplit.Length == 2) { - ICriteria criteria = session.CreateCriteria(typeof(UserProfileData)); + ICriteria criteria = manager.GetSession().CreateCriteria(typeof(UserProfileData)); criteria.Add(Expression.Like("FirstName", querysplit[0])); criteria.Add(Expression.Like("SurName", querysplit[1])); foreach (UserProfileData profile in criteria.List()) @@ -262,26 +227,18 @@ namespace OpenSim.Data.NHibernate /// TODO: stubs for now to get us to a compiling state gently public override AvatarAppearance GetUserAppearance(UUID user) { - AvatarAppearance appearance; - // TODO: I'm sure I'll have to do something silly here - try { - appearance = session.Load(typeof(AvatarAppearance), user) as AvatarAppearance; - } catch (ObjectNotFoundException) { - appearance = null; - } - return appearance; + return (AvatarAppearance)manager.Load(typeof(AvatarAppearance), user); } private bool ExistsAppearance(UUID uuid) { - AvatarAppearance appearance; - try { - appearance = session.Load(typeof(AvatarAppearance), uuid) as AvatarAppearance; - } catch (ObjectNotFoundException) { - appearance = null; + AvatarAppearance appearance = (AvatarAppearance)manager.Load(typeof(AvatarAppearance), uuid); + if (appearance == null) + { + return false; } - return (appearance == null) ? false : true; + return true; } @@ -295,11 +252,11 @@ namespace OpenSim.Data.NHibernate bool exists = ExistsAppearance(user); if (exists) { - session.Update(appearance); + manager.Update(appearance); } else { - session.Save(appearance); + manager.Save(appearance); } } diff --git a/OpenSim/Data/NHibernate/Resources/AssetBase.hbm.xml b/OpenSim/Data/NHibernate/Resources/AssetBase.hbm.xml index 7c3d8cf..7c42609 100644 --- a/OpenSim/Data/NHibernate/Resources/AssetBase.hbm.xml +++ b/OpenSim/Data/NHibernate/Resources/AssetBase.hbm.xml @@ -4,7 +4,7 @@ - + diff --git a/OpenSim/Data/NHibernate/Resources/InventoryFolderBase.hbm.xml b/OpenSim/Data/NHibernate/Resources/InventoryFolderBase.hbm.xml index 6afe9fa..c5f0115 100644 --- a/OpenSim/Data/NHibernate/Resources/InventoryFolderBase.hbm.xml +++ b/OpenSim/Data/NHibernate/Resources/InventoryFolderBase.hbm.xml @@ -5,7 +5,7 @@ - + diff --git a/OpenSim/Data/NHibernate/Resources/InventoryItemBase.hbm.xml b/OpenSim/Data/NHibernate/Resources/InventoryItemBase.hbm.xml index 9a4d7ca..f5e365b 100644 --- a/OpenSim/Data/NHibernate/Resources/InventoryItemBase.hbm.xml +++ b/OpenSim/Data/NHibernate/Resources/InventoryItemBase.hbm.xml @@ -12,15 +12,15 @@ - - - - + + + + - + diff --git a/OpenSim/Data/NHibernate/Resources/MySQLDialect/002_RegionStore.sql b/OpenSim/Data/NHibernate/Resources/MySQLDialect/002_RegionStore.sql index fc11e95..d34d44e 100644 --- a/OpenSim/Data/NHibernate/Resources/MySQLDialect/002_RegionStore.sql +++ b/OpenSim/Data/NHibernate/Resources/MySQLDialect/002_RegionStore.sql @@ -2,8 +2,8 @@ BEGIN; CREATE TABLE `Terrain` ( `RegionID` char(36) not null, - `Map` longblob, + `MapData` longblob, PRIMARY KEY (`RegionID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -COMMIT; \ No newline at end of file +COMMIT; diff --git a/OpenSim/Data/NHibernate/Resources/RegionStore.hbm.xml b/OpenSim/Data/NHibernate/Resources/RegionStore.hbm.xml index fe055bb..1851904 100644 --- a/OpenSim/Data/NHibernate/Resources/RegionStore.hbm.xml +++ b/OpenSim/Data/NHibernate/Resources/RegionStore.hbm.xml @@ -4,7 +4,7 @@ - + @@ -14,17 +14,17 @@ - + - - - - - + + + + + @@ -83,24 +83,24 @@ - - + + - + - + - - - - + + + + - - - + + + @@ -108,7 +108,8 @@ - + + @@ -121,15 +122,47 @@ - - - - - + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OpenSim/Data/NHibernate/Resources/UserAgentData.hbm.xml b/OpenSim/Data/NHibernate/Resources/UserAgentData.hbm.xml index 0beddaf..e10fb8f 100644 --- a/OpenSim/Data/NHibernate/Resources/UserAgentData.hbm.xml +++ b/OpenSim/Data/NHibernate/Resources/UserAgentData.hbm.xml @@ -5,7 +5,7 @@ - + @@ -13,9 +13,9 @@ - - + + diff --git a/OpenSim/Data/NHibernate/Resources/UserProfileData.hbm.xml b/OpenSim/Data/NHibernate/Resources/UserProfileData.hbm.xml index 873930b..740a9f1 100644 --- a/OpenSim/Data/NHibernate/Resources/UserProfileData.hbm.xml +++ b/OpenSim/Data/NHibernate/Resources/UserProfileData.hbm.xml @@ -9,8 +9,8 @@ - - + + diff --git a/OpenSim/Data/NHibernate/Terrain.cs b/OpenSim/Data/NHibernate/Terrain.cs index dd0da44..88be17f 100644 --- a/OpenSim/Data/NHibernate/Terrain.cs +++ b/OpenSim/Data/NHibernate/Terrain.cs @@ -60,7 +60,7 @@ namespace OpenSim.Data.NHibernate set { regionID = value; } } - public byte[] Map + public byte[] MapData { get { return serializeTerrain(map); } set { map = parseTerrain(value); } diff --git a/OpenSim/Data/RegionProfileData.cs b/OpenSim/Data/RegionProfileData.cs index a683bf1..5a3a42c 100644 --- a/OpenSim/Data/RegionProfileData.cs +++ b/OpenSim/Data/RegionProfileData.cs @@ -36,6 +36,7 @@ namespace OpenSim.Data /// /// A class which contains information known to the grid server about a region /// + [Serializable] public class RegionProfileData { /// @@ -210,5 +211,155 @@ namespace OpenSim.Data { return RequestSimData(gridserver_url, gridserver_sendkey, "region_name_search", regionName ); } + + + //Data Wrappers + public string RegionName + { + get { return regionName; } + set { regionName = value; } + } + public ulong RegionHandle + { + get { return regionHandle; } + set { regionHandle = value; } + } + public UUID Uuid + { + get { return UUID; } + set { UUID = value; } + } + public uint RegionLocX + { + get { return regionLocX; } + set { regionLocX = value; } + } + public uint RegionLocY + { + get { return regionLocY; } + set { regionLocY = value; } + } + public uint RegionLocZ + { + get { return regionLocZ; } + set { regionLocZ = value; } + } + public string RegionSendKey + { + get { return regionSendKey; } + set { regionSendKey = value; } + } + public string RegionRecvKey + { + get { return regionRecvKey; } + set { regionRecvKey = value; } + } + public string RegionSecret + { + get { return regionSecret; } + set { regionSecret = value; } + } + public bool RegionOnline + { + get { return regionOnline; } + set { regionOnline = value; } + } + public string ServerIP + { + get { return serverIP; } + set { serverIP = value; } + } + public uint ServerPort + { + get { return serverPort; } + set { serverPort = value; } + } + public string ServerURI + { + get { return serverURI; } + set { serverURI = value; } + } + public uint ServerHttpPort + { + get { return httpPort; } + set { httpPort = value; } + } + public uint ServerRemotingPort + { + get { return remotingPort; } + set { remotingPort = value; } + } + + public ulong NorthOverrideHandle + { + get { return regionNorthOverrideHandle; } + set { regionNorthOverrideHandle = value; } + } + public ulong SouthOverrideHandle + { + get { return regionSouthOverrideHandle; } + set { regionSouthOverrideHandle = value; } + } + public ulong EastOverrideHandle + { + get { return regionEastOverrideHandle; } + set { regionEastOverrideHandle = value; } + } + public ulong WestOverrideHandle + { + get { return regionWestOverrideHandle; } + set { regionWestOverrideHandle = value; } + } + public string RegionDataURI + { + get { return regionDataURI; } + set { regionDataURI = value; } + } + public string RegionAssetURI + { + get { return regionAssetURI; } + set { regionAssetURI = value; } + } + public string RegionAssetSendKey + { + get { return regionAssetSendKey; } + set { regionAssetSendKey = value; } + } + public string RegionAssetRecvKey + { + get { return regionAssetRecvKey; } + set { regionAssetRecvKey = value; } + } + public string RegionUserURI + { + get { return regionUserURI; } + set { regionUserURI = value; } + } + public string RegionUserSendKey + { + get { return regionUserSendKey; } + set { regionUserSendKey = value; } + } + public string RegionUserRecvKey + { + get { return regionUserRecvKey; } + set { regionUserRecvKey = value; } + } + public UUID RegionMapTextureID + { + get { return regionMapTextureID; } + set { regionMapTextureID = value; } + } + public UUID Owner_uuid + { + get { return owner_uuid; } + set { owner_uuid = value; } + } + public UUID OriginUUID + { + get { return originUUID; } + set { originUUID = value; } + } + } } -- cgit v1.1