point in time update of NHibernate Asset Mapping code

0.6.0-stable
Sean Dague 2008-04-03 12:29:25 +00:00
parent 2d33bf854f
commit fe14d65f07
3 changed files with 180 additions and 10 deletions

View File

@ -0,0 +1,154 @@
/*
* Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSim Project nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
using System;
using System.Data;
using System.Reflection;
using libsecondlife;
using NHibernate;
using NHibernate.Cfg;
using NHibernate.Tool.hbm2ddl;
using NHibernate.Mapping.Attributes;
using OpenSim.Data;
using OpenSim.Framework;
using OpenSim.Framework.Console;
using Environment = NHibernate.Cfg.Environment;
namespace OpenSim.Data.NHibernate
{
/// <summary>
/// A User storage interface for the DB4o database system
/// </summary>
public class NHibernateAssetData : AssetDataBase, IDisposable
{
private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
private ISessionFactory factory;
public override void Initialise()
{
// TODO: hard coding for sqlite based stuff to begin with, just making it easier to test
// This is stubbing for now, it will become dynamic later and support different db backends
Configuration cfg = new Configuration();
cfg.SetProperty(Environment.ConnectionProvider,
"NHibernate.Connection.DriverConnectionProvider");
cfg.SetProperty(Environment.Dialect,
"NHibernate.Dialect.SQLiteDialect");
cfg.SetProperty(Environment.ConnectionDriver,
"NHibernate.Driver.SqliteClientDriver");
cfg.SetProperty(Environment.ConnectionString,
"URI=file:Asset.db,version=3");
cfg.AddAssembly("OpenSim.Data.NHibernate");
// HbmSerializer.Default.Validate = true;
// using ( System.IO.MemoryStream stream =
// HbmSerializer.Default.Serialize(System.Reflection.Assembly.GetExecutingAssembly()))
// cfg.AddInputStream(stream);
// new SchemaExport(cfg).Create(true, true);
factory = cfg.BuildSessionFactory();
}
override public AssetBase FetchAsset(LLUUID uuid)
{
return null;
}
override public void CreateAsset(AssetBase asset)
{
ISession session = null;
ITransaction transaction = null;
try {
session = factory.OpenSession();
transaction = session.BeginTransaction();
session.SaveOrUpdate(asset);
// CRUD operations here (with the session)
transaction.Commit();
}
catch {
if(transaction != null)
transaction.Rollback();
throw; // Don't trap the exception
}
finally {
if(session != null)
session.Close();
}
}
override public void UpdateAsset(AssetBase asset)
{
}
private void LogAssetLoad(AssetBase asset)
{
string temporary = asset.Temporary ? "Temporary" : "Stored";
string local = asset.Local ? "Local" : "Remote";
int assetLength = (asset.Data != null) ? asset.Data.Length : 0;
m_log.Info("[SQLITE]: " +
string.Format("Loaded {6} {5} Asset: [{0}][{3}/{4}] \"{1}\":{2} ({7} bytes)",
asset.FullID, asset.Name, asset.Description, asset.Type,
asset.InvType, temporary, local, assetLength));
}
override public bool ExistsAsset(LLUUID uuid)
{
return false;
}
public void DeleteAsset(LLUUID uuid)
{
}
override public void CommitAssets() // force a sync to the database
{
m_log.Info("[SQLITE]: Attempting commit");
}
public override string Name {
get { return "NHibernate"; }
}
public override string Version {
get { return "0.1"; }
}
public void Dispose()
{
}
}
}

View File

@ -45,17 +45,17 @@ namespace OpenSim.Data.NHibernate
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";
// 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();
// factory = cfg.BuildSessionFactory();
}
}

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="OpenSim.Framework.AssetBase, OpenSim.Framework" table="Assets">
<id name="ID" column="UUID" type="String" length="36" >
<generator class="assigned" />
</id>
<property name="Type" type="integer" />
<property name="InvType" type="integer" />
<property name="Name" type="String" length="50" />
<property name="Description" type="String" length="50" />
<property name="Local" type="boolean" />
<property name="Temporary" type="boolean" />
<property name="Data" type="binary" />
</class>
</hibernate-mapping>