/*
* 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.Collections.Generic;
using Db4objects.Db4o;
using libsecondlife;
using OpenSim.Framework;
namespace OpenSim.Framework.Data.DB4o
{
///
/// A Database manager for Db4o
///
class DB4oGridManager
{
///
/// A list of the current regions connected (in-memory cache)
///
public Dictionary simProfiles = new Dictionary();
///
/// Database File Name
///
string dbfl;
///
/// Creates a new grid storage manager
///
/// Filename to the database file
public DB4oGridManager(string db4odb)
{
dbfl = db4odb;
IObjectContainer database;
database = Db4oFactory.OpenFile(dbfl);
IObjectSet result = database.Get(typeof(RegionProfileData));
// Loads the file into the in-memory cache
foreach (RegionProfileData row in result)
{
simProfiles.Add(row.UUID, row);
}
database.Close();
}
///
/// Adds a new profile to the database (Warning: Probably slow.)
///
/// The profile to add
/// Successful?
public bool AddRow(RegionProfileData row)
{
if (simProfiles.ContainsKey(row.UUID))
{
simProfiles[row.UUID] = row;
}
else
{
simProfiles.Add(row.UUID, row);
}
try
{
IObjectContainer database;
database = Db4oFactory.OpenFile(dbfl);
database.Set(row);
database.Close();
return true;
}
catch (Exception)
{
return false;
}
}
}
///
/// A manager for the DB4o database (user profiles)
///
class DB4oUserManager
{
///
/// A list of the user profiles (in memory cache)
///
public Dictionary userProfiles = new Dictionary();
///
/// Database filename
///
string dbfl;
///
/// Initialises a new DB manager
///
/// The filename to the database
public DB4oUserManager(string db4odb)
{
dbfl = db4odb;
IObjectContainer database;
database = Db4oFactory.OpenFile(dbfl);
// Load to cache
IObjectSet result = database.Get(typeof(UserProfileData));
foreach (UserProfileData row in result)
{
if (userProfiles.ContainsKey(row.UUID))
userProfiles[row.UUID] = row;
else
userProfiles.Add(row.UUID, row);
}
database.Close();
}
///
/// Adds or updates a record to the user database. Do this when changes are needed
/// in the user profile that need to be persistant.
///
/// TODO: the logic here is not ACID, the local cache will be
/// updated even if the persistant data is not. This may lead
/// to unexpected results.
///
/// The profile to update
/// true on success, false on fail to persist to db
public bool UpdateRecord(UserProfileData record)
{
if (userProfiles.ContainsKey(record.UUID))
{
userProfiles[record.UUID] = record;
}
else
{
userProfiles.Add(record.UUID, record);
}
try
{
IObjectContainer database;
database = Db4oFactory.OpenFile(dbfl);
database.Set(record);
database.Close();
return true;
}
catch (Exception)
{
return false;
}
}
}
}