From e46454afa6d048379bf5cdb26e05023d4bc22206 Mon Sep 17 00:00:00 2001
From: Sean Dague
Date: Fri, 11 Apr 2008 23:10:12 +0000
Subject: first drop of user storage implementation for nhibernate. This surely
doesn't work yet, but it compiles, and I'm getting close to a stopping point
for the day.
---
OpenSim/Data/NHibernate/NHibernateUserData.cs | 269 +++++++++++++++++++++
.../NHibernate/Resources/UserProfileData.hbm.xml | 4 +-
2 files changed, 271 insertions(+), 2 deletions(-)
create mode 100644 OpenSim/Data/NHibernate/NHibernateUserData.cs
diff --git a/OpenSim/Data/NHibernate/NHibernateUserData.cs b/OpenSim/Data/NHibernate/NHibernateUserData.cs
new file mode 100644
index 0000000..0bbebaa
--- /dev/null
+++ b/OpenSim/Data/NHibernate/NHibernateUserData.cs
@@ -0,0 +1,269 @@
+/*
+ * 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 System.Collections.Generic;
+using libsecondlife;
+using NHibernate;
+using NHibernate.Cfg;
+using NHibernate.Expression;
+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
+{
+ ///
+ /// A User storage interface for the DB4o database system
+ ///
+ public class NHibernateUserData : UserDataBase
+ {
+ private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
+
+ private Configuration cfg;
+ 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
+ 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:User.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();
+ }
+
+ private bool ExistsUser(LLUUID uuid)
+ {
+ UserProfileData user;
+ using(ISession session = factory.OpenSession()) {
+ user = session.Load(typeof(UserProfileData), uuid) as UserProfileData;
+ }
+ return (user == null) ? false : true;
+ }
+
+ override public UserProfileData GetUserByUUID(LLUUID uuid)
+ {
+ UserProfileData user;
+ // TODO: I'm sure I'll have to do something silly here
+ using(ISession session = factory.OpenSession()) {
+ user = session.Load(typeof(UserProfileData), uuid) as UserProfileData;
+ user.CurrentAgent = GetAgentByUUID(uuid);
+ }
+ return user;
+ }
+
+ override public void AddNewUserProfile(UserProfileData profile)
+ {
+ if (!ExistsUser(profile.ID)) {
+ using(ISession session = factory.OpenSession()) {
+ using(ITransaction transaction = session.BeginTransaction()) {
+ session.Save(profile);
+ SetAgentData(profile.ID, profile.CurrentAgent, session);
+ // TODO: save agent
+ transaction.Commit();
+ }
+ }
+ } else {
+ m_log.ErrorFormat("Attempted to add User {0} {1} that already exists, updating instead", profile.FirstName, profile.SurName);
+ UpdateUserProfile(profile);
+ }
+ }
+
+ private void SetAgentData(LLUUID uuid, UserAgentData agent, ISession session)
+ {
+ if (agent == null)
+ {
+ // TODO: got to figure out how to do a delete right
+ }
+ else
+ {
+ UserAgentData old = session.Load(typeof(UserAgentData), uuid) as UserAgentData;
+ if (old == null)
+ {
+ session.Save(agent);
+ }
+ else
+ {
+ session.Update(agent);
+ }
+ }
+
+ }
+ override public bool UpdateUserProfile(UserProfileData profile)
+ {
+ if (ExistsUser(profile.ID)) {
+ using(ISession session = factory.OpenSession()) {
+ using(ITransaction transaction = session.BeginTransaction()) {
+ session.Update(profile);
+ SetAgentData(profile.ID, profile.CurrentAgent, session);
+ transaction.Commit();
+ return true;
+ }
+ }
+ } else {
+ m_log.ErrorFormat("Attempted to update User {0} {1} that doesn't exist, updating instead", profile.FirstName, profile.SurName);
+ AddNewUserProfile(profile);
+ return true;
+ }
+ }
+
+ override public void AddNewUserAgent(UserAgentData agent)
+ {
+ using(ISession session = factory.OpenSession()) {
+ using(ITransaction transaction = session.BeginTransaction()) {
+ session.Save(agent);
+ transaction.Commit();
+ }
+ }
+ }
+
+ public void UpdateUserAgent(UserAgentData agent)
+ {
+ using(ISession session = factory.OpenSession()) {
+ using(ITransaction transaction = session.BeginTransaction()) {
+ session.Update(agent);
+ transaction.Commit();
+ }
+ }
+ }
+
+
+
+ override public UserAgentData GetAgentByUUID(LLUUID uuid)
+ {
+ using(ISession session = factory.OpenSession()) {
+ return session.Load(typeof(UserAgentData), uuid) as UserAgentData;
+ }
+ }
+
+ override public UserProfileData GetUserByName(string fname, string lname)
+ {
+ using(ISession session = factory.OpenSession()) {
+ ICriteria criteria = session.CreateCriteria(typeof(UserProfileData));
+ criteria.Add(Expression.Eq("FirstName", fname));
+ criteria.Add(Expression.Eq("SurName", lname));
+ foreach (UserProfileData profile in criteria.List())
+ {
+ profile.CurrentAgent = GetAgentByUUID(profile.ID);
+ return profile;
+ }
+ return null;
+ }
+ }
+
+ override public UserAgentData GetAgentByName(string fname, string lname)
+ {
+ return GetUserByName(fname, lname).CurrentAgent;
+ }
+
+ override public UserAgentData GetAgentByName(string name)
+ {
+ return GetAgentByName(name.Split(' ')[0], name.Split(' ')[1]);
+ }
+
+ override public List GeneratePickerResults(LLUUID queryID, string query)
+ {
+ List results = new List();
+ string[] querysplit;
+ querysplit = query.Split(' ');
+
+ if (querysplit.Length == 2)
+ {
+ using(ISession session = factory.OpenSession()) {
+ 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())
+ {
+ AvatarPickerAvatar user = new AvatarPickerAvatar();
+ user.AvatarID = profile.ID;
+ user.firstName = profile.FirstName;
+ user.lastName = profile.SurName;
+ results.Add(user);
+ }
+ }
+ }
+ return results;
+ }
+
+ // TODO: actually implement these
+ public override void UpdateUserCurrentRegion(LLUUID avatarid, LLUUID regionuuid) {return;}
+ public override void StoreWebLoginKey(LLUUID agentID, LLUUID webLoginKey) {return;}
+ public override void AddNewUserFriend(LLUUID friendlistowner, LLUUID friend, uint perms) {return;}
+ public override void RemoveUserFriend(LLUUID friendlistowner, LLUUID friend) {return;}
+ public override void UpdateUserFriendPerms(LLUUID friendlistowner, LLUUID friend, uint perms) {return;}
+ public override List GetUserFriendList(LLUUID friendlistowner) {return new List();}
+ public override bool MoneyTransferRequest(LLUUID from, LLUUID to, uint amount) {return true;}
+ public override bool InventoryTransferRequest(LLUUID from, LLUUID to, LLUUID inventory) {return true;}
+
+
+ public override string getName()
+ {
+ return Name;
+ }
+
+ public string Name {
+ get { return "NHibernate"; }
+ }
+
+ public override string GetVersion()
+ {
+ return Version;
+ }
+
+ public string Version {
+ get { return "0.1"; }
+ }
+
+ public void Dispose()
+ {
+
+ }
+ }
+}
diff --git a/OpenSim/Data/NHibernate/Resources/UserProfileData.hbm.xml b/OpenSim/Data/NHibernate/Resources/UserProfileData.hbm.xml
index 25e073a..0dede95 100644
--- a/OpenSim/Data/NHibernate/Resources/UserProfileData.hbm.xml
+++ b/OpenSim/Data/NHibernate/Resources/UserProfileData.hbm.xml
@@ -4,8 +4,8 @@
-
-
+
+
--
cgit v1.1