* DB4o Storage provider is now well documented

* Added try/catch over user creation (should allow multiple logins on Db4o)
zircon^2
Adam Frisby 2007-06-01 23:48:52 +00:00
parent a7fe1b63f3
commit 17e422bc67
3 changed files with 237 additions and 2 deletions

View File

@ -1,3 +1,30 @@
/*
* Copyright (c) OpenSim project, http://sim.opensecondlife.org/
*
* 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 <organization> 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 <copyright holder> 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;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
@ -7,19 +34,41 @@ using libsecondlife;
namespace OpenGrid.Framework.Data.DB4o namespace OpenGrid.Framework.Data.DB4o
{ {
/// <summary>
/// A grid server storage mechanism employing the DB4o database system
/// </summary>
class DB4oGridData : IGridData class DB4oGridData : IGridData
{ {
/// <summary>
/// The database manager object
/// </summary>
DB4oGridManager manager; DB4oGridManager manager;
/// <summary>
/// Called when the plugin is first loaded (as constructors are not called)
/// </summary>
public void Initialise() { public void Initialise() {
manager = new DB4oGridManager("gridserver.yap"); manager = new DB4oGridManager("gridserver.yap");
} }
/// <summary>
/// Returns a list of regions within the specified ranges
/// </summary>
/// <param name="a">minimum X coordinate</param>
/// <param name="b">minimum Y coordinate</param>
/// <param name="c">maximum X coordinate</param>
/// <param name="d">maximum Y coordinate</param>
/// <returns>An array of region profiles</returns>
public SimProfileData[] GetProfilesInRange(uint a, uint b, uint c, uint d) public SimProfileData[] GetProfilesInRange(uint a, uint b, uint c, uint d)
{ {
return null; return null;
} }
/// <summary>
/// Returns a region located at the specified regionHandle (warning multiple regions may occupy the one spot, first found is returned)
/// </summary>
/// <param name="handle">The handle to search for</param>
/// <returns>A region profile</returns>
public SimProfileData GetProfileByHandle(ulong handle) { public SimProfileData GetProfileByHandle(ulong handle) {
lock (manager.simProfiles) lock (manager.simProfiles)
{ {
@ -34,6 +83,11 @@ namespace OpenGrid.Framework.Data.DB4o
throw new Exception("Unable to find profile with handle (" + handle.ToString() + ")"); throw new Exception("Unable to find profile with handle (" + handle.ToString() + ")");
} }
/// <summary>
/// Returns a specific region
/// </summary>
/// <param name="uuid">The region ID code</param>
/// <returns>A region profile</returns>
public SimProfileData GetProfileByLLUUID(LLUUID uuid) public SimProfileData GetProfileByLLUUID(LLUUID uuid)
{ {
lock (manager.simProfiles) lock (manager.simProfiles)
@ -44,6 +98,11 @@ namespace OpenGrid.Framework.Data.DB4o
throw new Exception("Unable to find profile with UUID (" + uuid.ToStringHyphenated() + ")"); throw new Exception("Unable to find profile with UUID (" + uuid.ToStringHyphenated() + ")");
} }
/// <summary>
/// Adds a new specified region to the database
/// </summary>
/// <param name="profile">The profile to add</param>
/// <returns>A dataresponse enum indicating success</returns>
public DataResponse AddProfile(SimProfileData profile) public DataResponse AddProfile(SimProfileData profile)
{ {
lock (manager.simProfiles) lock (manager.simProfiles)
@ -59,22 +118,40 @@ namespace OpenGrid.Framework.Data.DB4o
} }
} }
/// <summary>
/// Authenticates a new region using the shared secrets. NOT SECURE.
/// </summary>
/// <param name="uuid">The UUID the region is authenticating with</param>
/// <param name="handle">The location the region is logging into (unused in Db4o)</param>
/// <param name="key">The shared secret</param>
/// <returns>Authenticated?</returns>
public bool AuthenticateSim(LLUUID uuid, ulong handle, string key) { public bool AuthenticateSim(LLUUID uuid, ulong handle, string key) {
if (manager.simProfiles[uuid].regionRecvKey == key) if (manager.simProfiles[uuid].regionRecvKey == key)
return true; return true;
return false; return false;
} }
/// <summary>
/// Shuts down the database
/// </summary>
public void Close() public void Close()
{ {
manager = null; manager = null;
} }
/// <summary>
/// Returns the providers name
/// </summary>
/// <returns>The name of the storage system</returns>
public string getName() public string getName()
{ {
return "DB4o Grid Provider"; return "DB4o Grid Provider";
} }
/// <summary>
/// Returns the providers version
/// </summary>
/// <returns>The version of the storage system</returns>
public string getVersion() public string getVersion()
{ {
return "0.1"; return "0.1";

View File

@ -1,3 +1,29 @@
/*
* Copyright (c) OpenSim project, http://sim.opensecondlife.org/
*
* 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 <organization> 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 <copyright holder> 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;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
@ -7,17 +33,31 @@ using libsecondlife;
namespace OpenGrid.Framework.Data.DB4o namespace OpenGrid.Framework.Data.DB4o
{ {
/// <summary>
/// A Database manager for Db4o
/// </summary>
class DB4oGridManager class DB4oGridManager
{ {
/// <summary>
/// A list of the current regions connected (in-memory cache)
/// </summary>
public Dictionary<LLUUID, SimProfileData> simProfiles = new Dictionary<LLUUID, SimProfileData>(); public Dictionary<LLUUID, SimProfileData> simProfiles = new Dictionary<LLUUID, SimProfileData>();
/// <summary>
/// Database File Name
/// </summary>
string dbfl; string dbfl;
/// <summary>
/// Creates a new grid storage manager
/// </summary>
/// <param name="db4odb">Filename to the database file</param>
public DB4oGridManager(string db4odb) public DB4oGridManager(string db4odb)
{ {
dbfl = db4odb; dbfl = db4odb;
IObjectContainer database; IObjectContainer database;
database = Db4oFactory.OpenFile(dbfl); database = Db4oFactory.OpenFile(dbfl);
IObjectSet result = database.Get(typeof(SimProfileData)); IObjectSet result = database.Get(typeof(SimProfileData));
// Loads the file into the in-memory cache
foreach(SimProfileData row in result) { foreach(SimProfileData row in result) {
simProfiles.Add(row.UUID, row); simProfiles.Add(row.UUID, row);
} }
@ -57,16 +97,30 @@ namespace OpenGrid.Framework.Data.DB4o
} }
/// <summary>
/// A manager for the DB4o database (user profiles)
/// </summary>
class DB4oUserManager class DB4oUserManager
{ {
/// <summary>
/// A list of the user profiles (in memory cache)
/// </summary>
public Dictionary<LLUUID, UserProfileData> userProfiles = new Dictionary<LLUUID, UserProfileData>(); public Dictionary<LLUUID, UserProfileData> userProfiles = new Dictionary<LLUUID, UserProfileData>();
/// <summary>
/// Database filename
/// </summary>
string dbfl; string dbfl;
/// <summary>
/// Initialises a new DB manager
/// </summary>
/// <param name="db4odb">The filename to the database</param>
public DB4oUserManager(string db4odb) public DB4oUserManager(string db4odb)
{ {
dbfl = db4odb; dbfl = db4odb;
IObjectContainer database; IObjectContainer database;
database = Db4oFactory.OpenFile(dbfl); database = Db4oFactory.OpenFile(dbfl);
// Load to cache
IObjectSet result = database.Get(typeof(UserProfileData)); IObjectSet result = database.Get(typeof(UserProfileData));
foreach (UserProfileData row in result) foreach (UserProfileData row in result)
{ {

View File

@ -1,3 +1,29 @@
/*
* Copyright (c) OpenSim project, http://sim.opensecondlife.org/
*
* 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 <organization> 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 <copyright holder> 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;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
@ -6,15 +32,29 @@ using libsecondlife;
namespace OpenGrid.Framework.Data.DB4o namespace OpenGrid.Framework.Data.DB4o
{ {
/// <summary>
/// A User storage interface for the DB4o database system
/// </summary>
public class DB4oUserData : IUserData public class DB4oUserData : IUserData
{ {
/// <summary>
/// The database manager
/// </summary>
DB4oUserManager manager; DB4oUserManager manager;
/// <summary>
/// Artificial constructor called upon plugin load
/// </summary>
public void Initialise() public void Initialise()
{ {
manager = new DB4oUserManager("userprofiles.yap"); manager = new DB4oUserManager("userprofiles.yap");
} }
/// <summary>
/// Loads a specified user profile from a UUID
/// </summary>
/// <param name="uuid">The users UUID</param>
/// <returns>A user profile</returns>
public UserProfileData getUserByUUID(LLUUID uuid) public UserProfileData getUserByUUID(LLUUID uuid)
{ {
if(manager.userProfiles.ContainsKey(uuid)) if(manager.userProfiles.ContainsKey(uuid))
@ -22,11 +62,22 @@ namespace OpenGrid.Framework.Data.DB4o
return null; return null;
} }
/// <summary>
/// Returns a user by searching for its name
/// </summary>
/// <param name="name">The users account name</param>
/// <returns>A matching users profile</returns>
public UserProfileData getUserByName(string name) public UserProfileData getUserByName(string name)
{ {
return getUserByName(name.Split(' ')[0], name.Split(' ')[1]); return getUserByName(name.Split(' ')[0], name.Split(' ')[1]);
} }
/// <summary>
/// Returns a user by searching for its name
/// </summary>
/// <param name="fname">The first part of the users account name</param>
/// <param name="lname">The second part of the users account name</param>
/// <returns>A matching users profile</returns>
public UserProfileData getUserByName(string fname, string lname) public UserProfileData getUserByName(string fname, string lname)
{ {
foreach (UserProfileData profile in manager.userProfiles.Values) foreach (UserProfileData profile in manager.userProfiles.Values)
@ -37,6 +88,11 @@ namespace OpenGrid.Framework.Data.DB4o
return null; return null;
} }
/// <summary>
/// Returns a user by UUID direct
/// </summary>
/// <param name="uuid">The users account ID</param>
/// <returns>A matching users profile</returns>
public UserAgentData getAgentByUUID(LLUUID uuid) public UserAgentData getAgentByUUID(LLUUID uuid)
{ {
try try
@ -49,11 +105,22 @@ namespace OpenGrid.Framework.Data.DB4o
} }
} }
/// <summary>
/// Returns a session by account name
/// </summary>
/// <param name="name">The account name</param>
/// <returns>The users session agent</returns>
public UserAgentData getAgentByName(string name) public UserAgentData getAgentByName(string name)
{ {
return getAgentByName(name.Split(' ')[0], name.Split(' ')[1]); return getAgentByName(name.Split(' ')[0], name.Split(' ')[1]);
} }
/// <summary>
/// Returns a session by account name
/// </summary>
/// <param name="fname">The first part of the users account name</param>
/// <param name="lname">The second part of the users account name</param>
/// <returns>A user agent</returns>
public UserAgentData getAgentByName(string fname, string lname) public UserAgentData getAgentByName(string fname, string lname)
{ {
try try
@ -66,32 +133,69 @@ namespace OpenGrid.Framework.Data.DB4o
} }
} }
/// <summary>
/// Creates a new user profile
/// </summary>
/// <param name="user">The profile to add to the database</param>
public void addNewUserProfile(UserProfileData user) public void addNewUserProfile(UserProfileData user)
{ {
manager.AddRow(user); try
{
manager.AddRow(user);
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
} }
/// <summary>
/// Creates a new user agent
/// </summary>
/// <param name="agent">The agent to add to the database</param>
public void addNewUserAgent(UserAgentData agent) public void addNewUserAgent(UserAgentData agent)
{ {
// Do nothing. yet. // Do nothing. yet.
} }
/// <summary>
/// Transfers money between two user accounts
/// </summary>
/// <param name="from">Starting account</param>
/// <param name="to">End account</param>
/// <param name="amount">The amount to move</param>
/// <returns>Success?</returns>
public bool moneyTransferRequest(LLUUID from, LLUUID to, uint amount) public bool moneyTransferRequest(LLUUID from, LLUUID to, uint amount)
{ {
return true; return true;
} }
/// <summary>
/// Transfers inventory between two accounts
/// </summary>
/// <remarks>Move to inventory server</remarks>
/// <param name="from">Senders account</param>
/// <param name="to">Recievers account</param>
/// <param name="item">Inventory item</param>
/// <returns>Success?</returns>
public bool inventoryTransferRequest(LLUUID from, LLUUID to, LLUUID item) public bool inventoryTransferRequest(LLUUID from, LLUUID to, LLUUID item)
{ {
return true; return true;
} }
/// <summary>
/// Returns the name of the storage provider
/// </summary>
/// <returns>Storage provider name</returns>
public string getName() public string getName()
{ {
return "DB4o Userdata"; return "DB4o Userdata";
} }
/// <summary>
/// Returns the version of the storage provider
/// </summary>
/// <returns>Storage provider version</returns>
public string getVersion() public string getVersion()
{ {
return "0.1"; return "0.1";