found a better pattern for SaveOrUpdate with nhibernate

cleaned up the asset path a bit
0.6.0-stable
Sean Dague 2008-07-18 15:06:24 +00:00
parent f8721c3c1c
commit aec5f0ceed
2 changed files with 50 additions and 53 deletions

View File

@ -26,6 +26,7 @@
*/ */
using System; using System;
using System.Collections;
using System.IO; using System.IO;
using System.Reflection; using System.Reflection;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
@ -33,6 +34,7 @@ using libsecondlife;
using log4net; using log4net;
using NHibernate; using NHibernate;
using NHibernate.Cfg; using NHibernate.Cfg;
using NHibernate.Expression;
using NHibernate.Mapping.Attributes; using NHibernate.Mapping.Attributes;
using NHibernate.Tool.hbm2ddl; using NHibernate.Tool.hbm2ddl;
using OpenSim.Framework; using OpenSim.Framework;
@ -105,36 +107,45 @@ namespace OpenSim.Data.NHibernate
{ {
return session.Load(typeof(AssetBase), uuid) as AssetBase; return session.Load(typeof(AssetBase), uuid) as AssetBase;
} }
catch (ObjectNotFoundException e)
{
m_log.ErrorFormat("[NHIBERNATE] no such asset {0}", uuid);
return null;
}
catch (Exception e) catch (Exception e)
{ {
m_log.Error("[NHIBERNATE] issue loading asset", e); m_log.Error("[NHIBERNATE] unexpected exception: ", e);
return null; return null;
} }
} }
private void Save(AssetBase asset)
{
try
{
AssetBase a = session.Load(typeof(AssetBase), asset.FullID) as AssetBase;
}
catch (ObjectNotFoundException e)
{
session.Save(asset);
session.Flush();
}
catch (Exception e)
{
m_log.Error("[NHIBERNATE] issue saving asset", e);
}
}
override public void CreateAsset(AssetBase asset) override public void CreateAsset(AssetBase asset)
{ {
if (!ExistsAsset(asset.FullID)) m_log.InfoFormat("[NHIBERNATE] inserting asset {0}", asset.FullID);
{ Save(asset);
m_log.InfoFormat("[NHIBERNATE] inserting asset {0}", asset.FullID);
using (ITransaction transaction = session.BeginTransaction())
{
session.Save(asset);
transaction.Commit();
}
}
} }
override public void UpdateAsset(AssetBase asset) override public void UpdateAsset(AssetBase asset)
{ {
if (ExistsAsset(asset.FullID)) m_log.InfoFormat("[NHIBERNATE] updating asset {0}", asset.FullID);
{ Save(asset);
using (ITransaction transaction = session.BeginTransaction())
{
session.Update(asset);
transaction.Commit();
}
}
} }
// private void LogAssetLoad(AssetBase asset) // private void LogAssetLoad(AssetBase asset)

View File

@ -114,31 +114,25 @@ namespace OpenSim.Data.NHibernate
return null; return null;
} }
// This looks inefficient, but it turns out that it isn't
// based on trial runs with nhibernate 1.2
private void SaveOrUpdate(SceneObjectPart p) private void SaveOrUpdate(SceneObjectPart p)
{ {
try try
{ {
ICriteria criteria = session.CreateCriteria(typeof(SceneObjectPart)); SceneObjectPart old = session.Load(typeof(SceneObjectPart), p.UUID) as SceneObjectPart;
criteria.Add(Expression.Eq("UUID", p.UUID)); session.Evict(old);
ArrayList l = (ArrayList)criteria.List(); session.Update(p);
if (l.Count < 1) m_log.InfoFormat("[NHIBERNATE] updating object {0}", p.UUID);
{ }
session.Save(p); catch (ObjectNotFoundException e)
} {
else if (l.Count == 1) m_log.InfoFormat("[NHIBERNATE] saving object {0}", p.UUID);
{ session.Save(p);
SceneObjectPart old = (SceneObjectPart)l[0];
session.Evict(old);
session.Update(p);
}
else
{
m_log.Error("Not unique");
}
} }
catch (Exception e) catch (Exception e)
{ {
m_log.Error("[NHIBERNATE] issue saving prim", e); m_log.Error("[NHIBERNATE] issue saving part", e);
} }
} }
@ -146,23 +140,15 @@ namespace OpenSim.Data.NHibernate
{ {
try try
{ {
ICriteria criteria = session.CreateCriteria(typeof(Terrain)); Terrain old = session.Load(typeof(Terrain), t.RegionID) as Terrain;
criteria.Add(Expression.Eq("RegionID", t.RegionID)); session.Evict(old);
ArrayList l = (ArrayList)criteria.List(); session.Update(t);
if (l.Count < 1) session.Flush();
{ }
session.Save(t); catch (ObjectNotFoundException e)
} {
else if (l.Count == 1) session.Save(t);
{ session.Flush();
Terrain old = (Terrain)l[0];
session.Evict(old);
session.Update(t);
}
else
{
m_log.Error("Not unique");
}
} }
catch (Exception e) catch (Exception e)
{ {