diff --git a/OpenSim/Data/Migration.cs b/OpenSim/Data/Migration.cs index 332b8eca61..8fbf7899e1 100644 --- a/OpenSim/Data/Migration.cs +++ b/OpenSim/Data/Migration.cs @@ -82,7 +82,6 @@ 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; @@ -113,7 +112,6 @@ namespace OpenSim.Data DbCommand cmd = _conn.CreateCommand(); cmd.CommandText = _migrations_create; cmd.ExecuteNonQuery(); - cmd.Dispose(); InsertVersion("migrations", 1); } @@ -137,7 +135,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) @@ -149,7 +147,6 @@ namespace OpenSim.Data UpdateVersion(_type, newversion); } version = newversion; - cmd.Dispose(); } } @@ -192,7 +189,7 @@ namespace OpenSim.Data DbCommand cmd = conn.CreateCommand(); try { - cmd.CommandText = "select version from migrations where name='" + type +"' order by version desc"; + cmd.CommandText = "select version from migrations where name='" + type + "' limit 1"; using (IDataReader reader = cmd.ExecuteReader()) { if (reader.Read()) @@ -206,7 +203,6 @@ namespace OpenSim.Data { // Something went wrong, so we're version 0 } - cmd.Dispose(); return version; } @@ -216,7 +212,6 @@ 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) @@ -225,7 +220,6 @@ 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 0cd5c6f957..7431433135 100644 --- a/OpenSim/Data/NHibernate/LLQuaternionUserType.cs +++ b/OpenSim/Data/NHibernate/LLQuaternionUserType.cs @@ -78,11 +78,7 @@ namespace OpenSim.Data.NHibernate int w = rs.GetOrdinal(names[3]); if (!rs.IsDBNull(x)) { - 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); + quat = new Quaternion((Single)rs[x], (Single)rs[y], (Single)rs[z], (Single)rs[w]); } return quat; } diff --git a/OpenSim/Data/NHibernate/LLVector3UserType.cs b/OpenSim/Data/NHibernate/LLVector3UserType.cs index 25a2bc6e9a..cdd15eca37 100644 --- a/OpenSim/Data/NHibernate/LLVector3UserType.cs +++ b/OpenSim/Data/NHibernate/LLVector3UserType.cs @@ -74,12 +74,9 @@ 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) && !rs.IsDBNull(y) && !rs.IsDBNull(z)) + if (!rs.IsDBNull(x)) { - 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); + vector = new Vector3((Single)rs[x], (Single)rs[y], (Single)rs[z]); } return vector; } diff --git a/OpenSim/Data/NHibernate/NHibernateAssetData.cs b/OpenSim/Data/NHibernate/NHibernateAssetData.cs index 90d41e3bb0..6ee527e1a9 100644 --- a/OpenSim/Data/NHibernate/NHibernateAssetData.cs +++ b/OpenSim/Data/NHibernate/NHibernateAssetData.cs @@ -33,7 +33,10 @@ 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; @@ -46,7 +49,9 @@ namespace OpenSim.Data.NHibernate { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - private NHibernateManager manager; + private Configuration cfg; + private ISessionFactory factory; + private ISession session; override public void Dispose() { } @@ -57,23 +62,79 @@ 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 + "'"); + } - m_log.InfoFormat("[NHIBERNATE] Initializing NHibernateAssetData"); - manager = new NHibernateManager(connect, "AssetStore"); + 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(); } override public AssetBase FetchAsset(UUID uuid) { - return (AssetBase)manager.Load(typeof(AssetBase), 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; + } } private void Save(AssetBase asset) { - AssetBase temp = (AssetBase)manager.Load(typeof(AssetBase), asset.FullID); - if (temp == null) + try { - manager.Save(asset); + // 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); } } @@ -86,7 +147,7 @@ namespace OpenSim.Data.NHibernate override public void UpdateAsset(AssetBase asset) { m_log.InfoFormat("[NHIBERNATE] updating asset {0}", asset.FullID); - manager.Update(asset); + Save(asset); } // private void LogAssetLoad(AssetBase asset) diff --git a/OpenSim/Data/NHibernate/NHibernateInventoryData.cs b/OpenSim/Data/NHibernate/NHibernateInventoryData.cs index f7de8eb6a2..bceb5d5ecf 100644 --- a/OpenSim/Data/NHibernate/NHibernateInventoryData.cs +++ b/OpenSim/Data/NHibernate/NHibernateInventoryData.cs @@ -33,7 +33,10 @@ using System.Text.RegularExpressions; using OpenMetaverse; using log4net; using NHibernate; -using NHibernate.Criterion; +using NHibernate.Cfg; +using NHibernate.Expression; +using NHibernate.Mapping.Attributes; +using NHibernate.Tool.hbm2ddl; using OpenSim.Framework; using Environment=NHibernate.Cfg.Environment; @@ -43,7 +46,9 @@ namespace OpenSim.Data.NHibernate { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - private NHibernateManager manager; + private Configuration cfg; + private ISessionFactory factory; + private ISession session; public void Initialise() { @@ -56,8 +61,35 @@ namespace OpenSim.Data.NHibernate /// public void Initialise(string connect) { - m_log.InfoFormat("[NHIBERNATE] Initializing NHibernateInventoryData"); - manager = new NHibernateManager(connect, "InventoryStore"); + // 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(); + } /***************************************************************** @@ -77,8 +109,7 @@ namespace OpenSim.Data.NHibernate { try { - m_log.InfoFormat("[NHIBERNATE] getInventoryItem {0}", item); - return (InventoryItemBase)manager.Load(typeof(InventoryItemBase), item); + return session.Load(typeof(InventoryItemBase), item) as InventoryItemBase; } catch { @@ -95,11 +126,15 @@ namespace OpenSim.Data.NHibernate { if (!ExistsItem(item.ID)) { - manager.Save(item); + using (ITransaction transaction = session.BeginTransaction()) + { + session.Save(item); + transaction.Commit(); + } } else { - m_log.ErrorFormat("[NHIBERNATE] Attempted to add Inventory Item {0} that already exists, updating instead", item.ID); + m_log.ErrorFormat("Attempted to add Inventory Item {0} that already exists, updating instead", item.ID); updateInventoryItem(item); } } @@ -112,11 +147,15 @@ namespace OpenSim.Data.NHibernate { if (ExistsItem(item.ID)) { - manager.Update(item); + using (ITransaction transaction = session.BeginTransaction()) + { + session.Update(item); + transaction.Commit(); + } } else { - m_log.ErrorFormat("[NHIBERNATE] Attempted to add Inventory Item {0} that already exists", item.ID); + m_log.ErrorFormat("Attempted to add Inventory Item {0} that already exists", item.ID); } } @@ -126,16 +165,11 @@ namespace OpenSim.Data.NHibernate /// public void deleteInventoryItem(UUID itemID) { - InventoryItemBase item = (InventoryItemBase)manager.Load(typeof(InventoryItemBase), itemID); - if (item != null) + using (ITransaction transaction = session.BeginTransaction()) { - manager.Delete(item); + session.Delete(itemID); + transaction.Commit(); } - else - { - m_log.ErrorFormat("[NHIBERNATE] Error deleting InventoryItemBase {0}", itemID); - } - } /// @@ -147,11 +181,11 @@ namespace OpenSim.Data.NHibernate { try { - return (InventoryFolderBase)manager.Load(typeof(InventoryFolderBase), folder); + return session.Load(typeof(InventoryFolderBase), folder) as InventoryFolderBase; } catch { - m_log.ErrorFormat("[NHIBERNATE] Couldn't find inventory item: {0}", folder); + m_log.ErrorFormat("Couldn't find inventory item: {0}", folder); return null; } } @@ -164,11 +198,15 @@ namespace OpenSim.Data.NHibernate { if (!ExistsFolder(folder.ID)) { - manager.Save(folder); + using (ITransaction transaction = session.BeginTransaction()) + { + session.Save(folder); + transaction.Commit(); + } } else { - m_log.ErrorFormat("[NHIBERNATE] Attempted to add Inventory Folder {0} that already exists, updating instead", folder.ID); + m_log.ErrorFormat("Attempted to add Inventory Folder {0} that already exists, updating instead", folder.ID); updateInventoryFolder(folder); } } @@ -181,11 +219,15 @@ namespace OpenSim.Data.NHibernate { if (ExistsFolder(folder.ID)) { - manager.Update(folder); + using (ITransaction transaction = session.BeginTransaction()) + { + session.Update(folder); + transaction.Commit(); + } } else { - m_log.ErrorFormat("[NHIBERNATE] Attempted to add Inventory Folder {0} that already exists", folder.ID); + m_log.ErrorFormat("Attempted to add Inventory Folder {0} that already exists", folder.ID); } } @@ -195,16 +237,11 @@ namespace OpenSim.Data.NHibernate /// public void deleteInventoryFolder(UUID folderID) { - InventoryFolderBase item = (InventoryFolderBase)manager.Load(typeof(InventoryFolderBase), folderID); - if (item != null) + using (ITransaction transaction = session.BeginTransaction()) { - manager.Delete(item); + session.Delete(folderID.ToString()); + transaction.Commit(); } - else - { - m_log.ErrorFormat("[NHIBERNATE] Error deleting InventoryFolderBase {0}", folderID); - } - manager.Delete(folderID); } // useful private methods @@ -280,7 +317,7 @@ namespace OpenSim.Data.NHibernate public List getInventoryInFolder(UUID folderID) { // try { - ICriteria criteria = manager.GetSession().CreateCriteria(typeof(InventoryItemBase)); + ICriteria criteria = session.CreateCriteria(typeof(InventoryItemBase)); criteria.Add(Expression.Eq("Folder", folderID)); List list = new List(); foreach (InventoryItemBase item in criteria.List()) @@ -303,7 +340,7 @@ namespace OpenSim.Data.NHibernate // see InventoryItemBase.getUserRootFolder public InventoryFolderBase getUserRootFolder(UUID user) { - ICriteria criteria = manager.GetSession().CreateCriteria(typeof(InventoryFolderBase)); + ICriteria criteria = session.CreateCriteria(typeof(InventoryFolderBase)); criteria.Add(Expression.Eq("ParentID", UUID.Zero)); criteria.Add(Expression.Eq("Owner", user)); foreach (InventoryFolderBase folder in criteria.List()) @@ -321,7 +358,7 @@ namespace OpenSim.Data.NHibernate /// ID of parent private void getInventoryFolders(ref List folders, UUID parentID) { - ICriteria criteria = manager.GetSession().CreateCriteria(typeof(InventoryFolderBase)); + ICriteria criteria = session.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 36d84e2e02..161ec1d65c 100644 --- a/OpenSim/Data/NHibernate/NHibernateManager.cs +++ b/OpenSim/Data/NHibernate/NHibernateManager.cs @@ -25,141 +25,35 @@ * 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 { - public class NHibernateManager + internal 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 string dialect; - private Configuration cfg; - private ISessionFactory factory; - private ISession session; + // private ISessionFactory factory; + // private ISession session; + // private ITransaction transaction; - public NHibernateManager(string connect, string store) + public NHibernateManager() { + // 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"; - // 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(); +// factory = cfg.BuildSessionFactory(); } - 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 0aba58c117..475cd71920 100644 --- a/OpenSim/Data/NHibernate/NHibernateRegionData.cs +++ b/OpenSim/Data/NHibernate/NHibernateRegionData.cs @@ -34,7 +34,10 @@ using System.Text.RegularExpressions; using OpenMetaverse; using log4net; using NHibernate; -using NHibernate.Criterion; +using NHibernate.Cfg; +using NHibernate.Expression; +using NHibernate.Mapping.Attributes; +using NHibernate.Tool.hbm2ddl; using OpenSim.Framework; using OpenSim.Region.Environment.Interfaces; using OpenSim.Region.Environment.Scenes; @@ -49,12 +52,51 @@ namespace OpenSim.Data.NHibernate { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - private NHibernateManager manager; + private Configuration cfg; + private ISessionFactory factory; + private ISession session; + + // public void Initialise() + // { + // Initialise("SQLiteDialect;SqliteClientDriver;URI=file:OpenSim.db,version=3", true); + // } public void Initialise(string connect) { - m_log.InfoFormat("[NHIBERNATE] Initializing NHibernateRegionData"); - manager = new NHibernateManager(connect, "RegionStore"); + // 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(); } /*********************************************************************** @@ -80,18 +122,15 @@ namespace OpenSim.Data.NHibernate { try { - 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); - } - + 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); } catch (Exception e) { @@ -103,19 +142,15 @@ namespace OpenSim.Data.NHibernate { try { - - 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); - } - + 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(); } catch (Exception e) { @@ -138,6 +173,7 @@ namespace OpenSim.Data.NHibernate m_log.InfoFormat("Storing part {0}", part.UUID); SaveOrUpdate(part); } + session.Flush(); } catch (Exception e) { @@ -149,7 +185,7 @@ namespace OpenSim.Data.NHibernate { SceneObjectGroup group = new SceneObjectGroup(); - ICriteria criteria = manager.GetSession().CreateCriteria(typeof(SceneObjectPart)); + ICriteria criteria = session.CreateCriteria(typeof(SceneObjectPart)); criteria.Add(Expression.Eq("RegionID", region)); criteria.Add(Expression.Eq("ParentUUID", uuid)); criteria.AddOrder( Order.Asc("ParentID") ); @@ -180,8 +216,9 @@ namespace OpenSim.Data.NHibernate SceneObjectGroup g = LoadObject(obj, regionUUID); foreach (SceneObjectPart p in g.Children.Values) { - manager.Delete(p); + session.Delete(p); } + session.Flush(); m_log.InfoFormat("[REGION DB]: Removing obj: {0} from region: {1}", obj.Guid, regionUUID); @@ -197,7 +234,7 @@ namespace OpenSim.Data.NHibernate Dictionary SOG = new Dictionary(); List ret = new List(); - ICriteria criteria = manager.GetSession().CreateCriteria(typeof(SceneObjectPart)); + ICriteria criteria = session.CreateCriteria(typeof(SceneObjectPart)); criteria.Add(Expression.Eq("RegionID", regionUUID)); criteria.AddOrder( Order.Asc("ParentID") ); foreach (SceneObjectPart p in criteria.List()) @@ -215,7 +252,7 @@ namespace OpenSim.Data.NHibernate } // get the inventory - ICriteria InvCriteria = manager.GetSession().CreateCriteria(typeof(TaskInventoryItem)); + ICriteria InvCriteria = session.CreateCriteria(typeof(TaskInventoryItem)); InvCriteria.Add(Expression.Eq("ParentPartID", p.UUID)); IList inventory = new List(); foreach (TaskInventoryItem i in InvCriteria.List()) @@ -254,14 +291,16 @@ namespace OpenSim.Data.NHibernate /// Heightfield data public double[,] LoadTerrain(UUID regionID) { - Terrain t = (Terrain)manager.Load(typeof(Terrain), regionID); - if (t != null) + try { + Terrain t = session.Load(typeof(Terrain), regionID) as Terrain; return t.Doubles; } - - m_log.Info("No terrain yet"); - return null; + catch (ObjectNotFoundException) + { + m_log.Info("No terrain yet"); + return null; + } } /// @@ -300,7 +339,7 @@ namespace OpenSim.Data.NHibernate /// public void Shutdown() { - //session.Flush(); + session.Flush(); } /// @@ -358,20 +397,21 @@ namespace OpenSim.Data.NHibernate /// public void StorePrimInventory(UUID primID, ICollection items) { - ICriteria criteria = manager.GetSession().CreateCriteria(typeof(TaskInventoryItem)); + ICriteria criteria = session.CreateCriteria(typeof(TaskInventoryItem)); criteria.Add(Expression.Eq("ParentPartID", primID)); try { foreach (TaskInventoryItem i in criteria.List()) { - manager.Delete(i); + session.Delete(i); } foreach (TaskInventoryItem i in items) { - manager.Save(i); + session.Save(i); } + session.Flush(); } catch (Exception e) { diff --git a/OpenSim/Data/NHibernate/NHibernateUserData.cs b/OpenSim/Data/NHibernate/NHibernateUserData.cs index ee0d2b8637..3a22dc3124 100644 --- a/OpenSim/Data/NHibernate/NHibernateUserData.cs +++ b/OpenSim/Data/NHibernate/NHibernateUserData.cs @@ -33,7 +33,10 @@ using System.Text.RegularExpressions; using OpenMetaverse; using log4net; using NHibernate; -using NHibernate.Criterion; +using NHibernate.Cfg; +using NHibernate.Expression; +using NHibernate.Mapping.Attributes; +using NHibernate.Tool.hbm2ddl; using OpenSim.Framework; using Environment=NHibernate.Cfg.Environment; @@ -46,7 +49,9 @@ namespace OpenSim.Data.NHibernate { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - private NHibernateManager manager; + private Configuration cfg; + private ISessionFactory factory; + private ISession session; public override void Initialise() { @@ -56,40 +61,62 @@ namespace OpenSim.Data.NHibernate public override void Initialise(string connect) { - m_log.InfoFormat("[NHIBERNATE] Initializing NHibernateUserData"); - manager = new NHibernateManager(connect, "UserStore"); + 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(); } private bool ExistsUser(UUID uuid) { UserProfileData user = null; - - m_log.InfoFormat("[NHIBERNATE] ExistsUser; {0}", uuid); - user = (UserProfileData)manager.Load(typeof(UserProfileData), uuid); - - if (user == null) + try { - m_log.InfoFormat("[NHIBERNATE] User with given UUID does not exist {0} ", uuid); - return false; + user = session.Load(typeof(UserProfileData), uuid) as UserProfileData; + } + catch (ObjectNotFoundException) + { + user = null; } - return true; - + return (user != null); } override public UserProfileData GetUserByUUID(UUID uuid) { UserProfileData user; - m_log.InfoFormat("[NHIBERNATE] GetUserByUUID: {0} ", uuid); - - user = (UserProfileData)manager.Load(typeof(UserProfileData), uuid); - if (user != null) + // TODO: I'm sure I'll have to do something silly here + try { - UserAgentData agent = GetAgentByUUID(uuid); - if (agent != null) - { - user.CurrentAgent = agent; - } + user = session.Load(typeof(UserProfileData), uuid) as UserProfileData; + user.CurrentAgent = GetAgentByUUID(uuid); + } + catch (ObjectNotFoundException) + { + user = null; } return user; @@ -99,30 +126,33 @@ namespace OpenSim.Data.NHibernate { if (!ExistsUser(profile.ID)) { - m_log.InfoFormat("[NHIBERNATE] AddNewUserProfile {0}", profile.ID); - manager.Save(profile); + session.Save(profile); SetAgentData(profile.ID, profile.CurrentAgent); - } else { - m_log.ErrorFormat("[NHIBERNATE] Attempted to add User {0} {1} that already exists, updating instead", profile.FirstName, profile.SurName); + m_log.ErrorFormat("Attempted to add User {0} {1} that already exists, updating instead", profile.FirstName, profile.SurName); UpdateUserProfile(profile); } } private void SetAgentData(UUID uuid, UserAgentData agent) { - UserAgentData old = (UserAgentData)manager.Load(typeof(UserAgentData), uuid); - if (old != null) + if (agent == null) { - m_log.InfoFormat("[NHIBERNATE] SetAgentData deleting old: {0} ",uuid); - manager.Delete(old); + // TODO: got to figure out how to do a delete right } - if (agent != null) + else { - m_log.InfoFormat("[NHIBERNATE] SetAgentData: {0} ", agent.ProfileID); - manager.Save(agent); + try + { + UserAgentData old = session.Load(typeof(UserAgentData), uuid) as UserAgentData; + session.Delete(old); + } + catch (ObjectNotFoundException) + { + } + session.Save(agent); } } @@ -130,13 +160,13 @@ namespace OpenSim.Data.NHibernate { if (ExistsUser(profile.ID)) { - manager.Update(profile); + session.Update(profile); SetAgentData(profile.ID, profile.CurrentAgent); return true; } else { - m_log.ErrorFormat("[NHIBERNATE] Attempted to update User {0} {1} that doesn't exist, updating instead", profile.FirstName, profile.SurName); + m_log.ErrorFormat("Attempted to update User {0} {1} that doesn't exist, updating instead", profile.FirstName, profile.SurName); AddNewUserProfile(profile); return true; } @@ -144,32 +174,37 @@ namespace OpenSim.Data.NHibernate override public void AddNewUserAgent(UserAgentData agent) { - UserAgentData old = (UserAgentData)manager.Load(typeof(UserAgentData), agent.ProfileID); - if (old != null) + try { - manager.Delete(old); + UserAgentData old = session.Load(typeof(UserAgentData), agent.ProfileID) as UserAgentData; + session.Delete(old); } - - manager.Save(agent); - + catch (ObjectNotFoundException) + { + } + session.Save(agent); } public void UpdateUserAgent(UserAgentData agent) { - m_log.InfoFormat("[NHIBERNATE] UpdateUserAgent: {0} ", agent.ProfileID); - manager.Update(agent); + session.Update(agent); } override public UserAgentData GetAgentByUUID(UUID uuid) { - m_log.InfoFormat("[NHIBERNATE] GetAgentByUUID: {0} ", uuid); - return (UserAgentData)manager.Load(typeof(UserAgentData), uuid); + try + { + return session.Load(typeof(UserAgentData), uuid) as UserAgentData; + } + catch + { + return null; + } } override public UserProfileData GetUserByName(string fname, string lname) { - m_log.InfoFormat("[NHIBERNATE] GetUserByName: {0} {1} ", fname, lname); - ICriteria criteria = manager.GetSession().CreateCriteria(typeof(UserProfileData)); + ICriteria criteria = session.CreateCriteria(typeof(UserProfileData)); criteria.Add(Expression.Eq("FirstName", fname)); criteria.Add(Expression.Eq("SurName", lname)); foreach (UserProfileData profile in criteria.List()) @@ -198,7 +233,7 @@ namespace OpenSim.Data.NHibernate if (querysplit.Length == 2) { - ICriteria criteria = manager.GetSession().CreateCriteria(typeof(UserProfileData)); + ICriteria criteria = session.CreateCriteria(typeof(UserProfileData)); criteria.Add(Expression.Like("FirstName", querysplit[0])); criteria.Add(Expression.Like("SurName", querysplit[1])); foreach (UserProfileData profile in criteria.List()) @@ -227,18 +262,26 @@ 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); + 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; } private bool ExistsAppearance(UUID uuid) { - AvatarAppearance appearance = (AvatarAppearance)manager.Load(typeof(AvatarAppearance), uuid); - if (appearance == null) - { - return false; + AvatarAppearance appearance; + try { + appearance = session.Load(typeof(AvatarAppearance), uuid) as AvatarAppearance; + } catch (ObjectNotFoundException) { + appearance = null; } - return true; + return (appearance == null) ? false : true; } @@ -252,11 +295,11 @@ namespace OpenSim.Data.NHibernate bool exists = ExistsAppearance(user); if (exists) { - manager.Update(appearance); + session.Update(appearance); } else { - manager.Save(appearance); + session.Save(appearance); } } diff --git a/OpenSim/Data/NHibernate/Resources/AssetBase.hbm.xml b/OpenSim/Data/NHibernate/Resources/AssetBase.hbm.xml index 7c42609eeb..7c3d8cfefa 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 c5f0115f33..6afe9fa576 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 f5e365b35e..9a4d7cafdb 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 d34d44e72b..fc11e95d3d 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, - `MapData` longblob, + `Map` longblob, PRIMARY KEY (`RegionID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -COMMIT; +COMMIT; \ No newline at end of file diff --git a/OpenSim/Data/NHibernate/Resources/RegionStore.hbm.xml b/OpenSim/Data/NHibernate/Resources/RegionStore.hbm.xml index 1851904db0..fe055bbcac 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,8 +108,7 @@ - - + @@ -122,47 +121,15 @@ - - - - - + + + + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/OpenSim/Data/NHibernate/Resources/UserAgentData.hbm.xml b/OpenSim/Data/NHibernate/Resources/UserAgentData.hbm.xml index e10fb8ff7f..0beddafcb2 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 740a9f1a82..873930bc3a 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 88be17f1d3..dd0da44631 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[] MapData + public byte[] Map { get { return serializeTerrain(map); } set { map = parseTerrain(value); } diff --git a/OpenSim/Data/RegionProfileData.cs b/OpenSim/Data/RegionProfileData.cs index 5a3a42c579..a683bf1d8b 100644 --- a/OpenSim/Data/RegionProfileData.cs +++ b/OpenSim/Data/RegionProfileData.cs @@ -36,7 +36,6 @@ namespace OpenSim.Data /// /// A class which contains information known to the grid server about a region /// - [Serializable] public class RegionProfileData { /// @@ -211,155 +210,5 @@ 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; } - } - } } diff --git a/bin/Iesi.Collections.dll b/bin/Iesi.Collections.dll index 107c362ce0..f078c5a5fb 100644 Binary files a/bin/Iesi.Collections.dll and b/bin/Iesi.Collections.dll differ diff --git a/bin/NHibernate.Mapping.Attributes.dll b/bin/NHibernate.Mapping.Attributes.dll index 81ddbd16a0..4e965a423d 100644 Binary files a/bin/NHibernate.Mapping.Attributes.dll and b/bin/NHibernate.Mapping.Attributes.dll differ diff --git a/bin/OpenSim.32BitLaunch.exe.config b/bin/OpenSim.32BitLaunch.exe.config index 70d179f749..61f0859c84 100644 --- a/bin/OpenSim.32BitLaunch.exe.config +++ b/bin/OpenSim.32BitLaunch.exe.config @@ -19,12 +19,6 @@ - - - - - - diff --git a/prebuild.xml b/prebuild.xml index 1320ff3a21..030ea1caa5 100644 --- a/prebuild.xml +++ b/prebuild.xml @@ -1867,11 +1867,9 @@ - -