From 591e1704283330b0120e99819ff68404d1c92d76 Mon Sep 17 00:00:00 2001
From: MW
Date: Fri, 8 Jun 2007 16:55:44 +0000
Subject: Re-imported OpenGridServices from trunk
---
.../OpenGrid.Framework.Data.MySQL/MySQLGridData.cs | 258 +++++++++
.../MySQLInventoryData.cs | 309 +++++++++++
.../OpenGrid.Framework.Data.MySQL/MySQLLogData.cs | 107 ++++
.../OpenGrid.Framework.Data.MySQL/MySQLManager.cs | 581 +++++++++++++++++++++
.../OpenGrid.Framework.Data.MySQL/MySQLUserData.cs | 257 +++++++++
.../OpenGrid.Framework.Data.MySQL.csproj | 237 +++++++++
.../OpenGrid.Framework.Data.MySQL.csproj.mine | 117 +++++
.../OpenGrid.Framework.Data.MySQL.csproj.r858 | 114 ++++
.../OpenGrid.Framework.Data.MySQL.csproj.r921 | 117 +++++
.../OpenGrid.Framework.Data.MySQL.csproj.user | 12 +
.../OpenGrid.Framework.Data.MySQL.dll.build | 49 ++
.../Properties/AssemblyInfo.cs | 35 ++
12 files changed, 2193 insertions(+)
create mode 100644 OpenGridServices/OpenGrid.Framework.Data.MySQL/MySQLGridData.cs
create mode 100644 OpenGridServices/OpenGrid.Framework.Data.MySQL/MySQLInventoryData.cs
create mode 100644 OpenGridServices/OpenGrid.Framework.Data.MySQL/MySQLLogData.cs
create mode 100644 OpenGridServices/OpenGrid.Framework.Data.MySQL/MySQLManager.cs
create mode 100644 OpenGridServices/OpenGrid.Framework.Data.MySQL/MySQLUserData.cs
create mode 100644 OpenGridServices/OpenGrid.Framework.Data.MySQL/OpenGrid.Framework.Data.MySQL.csproj
create mode 100644 OpenGridServices/OpenGrid.Framework.Data.MySQL/OpenGrid.Framework.Data.MySQL.csproj.mine
create mode 100644 OpenGridServices/OpenGrid.Framework.Data.MySQL/OpenGrid.Framework.Data.MySQL.csproj.r858
create mode 100644 OpenGridServices/OpenGrid.Framework.Data.MySQL/OpenGrid.Framework.Data.MySQL.csproj.r921
create mode 100644 OpenGridServices/OpenGrid.Framework.Data.MySQL/OpenGrid.Framework.Data.MySQL.csproj.user
create mode 100644 OpenGridServices/OpenGrid.Framework.Data.MySQL/OpenGrid.Framework.Data.MySQL.dll.build
create mode 100644 OpenGridServices/OpenGrid.Framework.Data.MySQL/Properties/AssemblyInfo.cs
(limited to 'OpenGridServices/OpenGrid.Framework.Data.MySQL')
diff --git a/OpenGridServices/OpenGrid.Framework.Data.MySQL/MySQLGridData.cs b/OpenGridServices/OpenGrid.Framework.Data.MySQL/MySQLGridData.cs
new file mode 100644
index 0000000..d9a517d
--- /dev/null
+++ b/OpenGridServices/OpenGrid.Framework.Data.MySQL/MySQLGridData.cs
@@ -0,0 +1,258 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.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 System.Text;
+using OpenGrid.Framework.Data;
+
+namespace OpenGrid.Framework.Data.MySQL
+{
+ ///
+ /// A MySQL Interface for the Grid Server
+ ///
+ public class MySQLGridData : IGridData
+ {
+ ///
+ /// MySQL Database Manager
+ ///
+ private MySQLManager database;
+
+ ///
+ /// Initialises the Grid Interface
+ ///
+ public void Initialise()
+ {
+ IniFile GridDataMySqlFile = new IniFile("mysql_connection.ini");
+ string settingHostname = GridDataMySqlFile.ParseFileReadValue("hostname");
+ string settingDatabase = GridDataMySqlFile.ParseFileReadValue("database");
+ string settingUsername = GridDataMySqlFile.ParseFileReadValue("username");
+ string settingPassword = GridDataMySqlFile.ParseFileReadValue("password");
+ string settingPooling = GridDataMySqlFile.ParseFileReadValue("pooling");
+ string settingPort = GridDataMySqlFile.ParseFileReadValue("port");
+
+ database = new MySQLManager(settingHostname, settingDatabase, settingUsername, settingPassword, settingPooling, settingPort);
+ }
+
+ ///
+ /// Shuts down the grid interface
+ ///
+ public void Close()
+ {
+ database.Close();
+ }
+
+ ///
+ /// Returns the plugin name
+ ///
+ /// Plugin name
+ public string getName()
+ {
+ return "MySql OpenGridData";
+ }
+
+ ///
+ /// Returns the plugin version
+ ///
+ /// Plugin version
+ public string getVersion()
+ {
+ return "0.1";
+ }
+
+ ///
+ /// Returns all the specified region profiles within coordates -- coordinates are inclusive
+ ///
+ /// Minimum X coordinate
+ /// Minimum Y coordinate
+ /// Maximum X coordinate
+ /// Maximum Y coordinate
+ ///
+ public SimProfileData[] GetProfilesInRange(uint xmin, uint ymin, uint xmax, uint ymax)
+ {
+ try
+ {
+ lock (database)
+ {
+ Dictionary param = new Dictionary();
+ param["?xmin"] = xmin.ToString();
+ param["?ymin"] = ymin.ToString();
+ param["?xmax"] = xmax.ToString();
+ param["?ymax"] = ymax.ToString();
+
+ System.Data.IDbCommand result = database.Query("SELECT * FROM regions WHERE locX >= ?xmin AND locX <= ?xmax AND locY >= ?ymin AND locY <= ?ymax", param);
+ System.Data.IDataReader reader = result.ExecuteReader();
+
+ SimProfileData row;
+
+ List rows = new List();
+
+ while ((row = database.readSimRow(reader)) != null)
+ {
+ rows.Add(row);
+ }
+ reader.Close();
+ result.Dispose();
+
+ return rows.ToArray();
+
+ }
+ }
+ catch (Exception e)
+ {
+ database.Reconnect();
+ Console.WriteLine(e.ToString());
+ return null;
+ }
+ }
+
+ ///
+ /// Returns a sim profile from it's location
+ ///
+ /// Region location handle
+ /// Sim profile
+ public SimProfileData GetProfileByHandle(ulong handle)
+ {
+ try
+ {
+ lock (database)
+ {
+ Dictionary param = new Dictionary();
+ param["?handle"] = handle.ToString();
+
+ System.Data.IDbCommand result = database.Query("SELECT * FROM regions WHERE regionHandle = ?handle", param);
+ System.Data.IDataReader reader = result.ExecuteReader();
+
+ SimProfileData row = database.readSimRow(reader);
+ reader.Close();
+ result.Dispose();
+
+ return row;
+ }
+ }
+ catch (Exception e)
+ {
+ database.Reconnect();
+ Console.WriteLine(e.ToString());
+ return null;
+ }
+ }
+
+ ///
+ /// Returns a sim profile from it's UUID
+ ///
+ /// The region UUID
+ /// The sim profile
+ public SimProfileData GetProfileByLLUUID(libsecondlife.LLUUID uuid)
+ {
+ try
+ {
+ lock (database)
+ {
+ Dictionary param = new Dictionary();
+ param["?uuid"] = uuid.ToStringHyphenated();
+
+ System.Data.IDbCommand result = database.Query("SELECT * FROM regions WHERE uuid = ?uuid", param);
+ System.Data.IDataReader reader = result.ExecuteReader();
+
+ SimProfileData row = database.readSimRow(reader);
+ reader.Close();
+ result.Dispose();
+
+ return row;
+ }
+ }
+ catch (Exception e)
+ {
+ database.Reconnect();
+ Console.WriteLine(e.ToString());
+ return null;
+ }
+ }
+
+ ///
+ /// Adds a new profile to the database
+ ///
+ /// The profile to add
+ /// Successful?
+ public DataResponse AddProfile(SimProfileData profile)
+ {
+ lock (database)
+ {
+ if (database.insertRegion(profile))
+ {
+ return DataResponse.RESPONSE_OK;
+ }
+ else
+ {
+ return DataResponse.RESPONSE_ERROR;
+ }
+ }
+ }
+
+ ///
+ /// DEPRECIATED. Attempts to authenticate a region by comparing a shared secret.
+ ///
+ /// The UUID of the challenger
+ /// The attempted regionHandle of the challenger
+ /// The secret
+ /// Whether the secret and regionhandle match the database entry for UUID
+ public bool AuthenticateSim(libsecondlife.LLUUID uuid, ulong handle, string authkey)
+ {
+ bool throwHissyFit = false; // Should be true by 1.0
+
+ if (throwHissyFit)
+ throw new Exception("CRYPTOWEAK AUTHENTICATE: Refusing to authenticate due to replay potential.");
+
+ SimProfileData data = GetProfileByLLUUID(uuid);
+
+ return (handle == data.regionHandle && authkey == data.regionSecret);
+ }
+
+ ///
+ /// NOT YET FUNCTIONAL. Provides a cryptographic authentication of a region
+ ///
+ /// This requires a security audit.
+ ///
+ ///
+ ///
+ ///
+ ///
+ public bool AuthenticateSim(libsecondlife.LLUUID uuid, ulong handle, string authhash, string challenge)
+ {
+ System.Security.Cryptography.SHA512Managed HashProvider = new System.Security.Cryptography.SHA512Managed();
+ System.Text.ASCIIEncoding TextProvider = new ASCIIEncoding();
+
+ byte[] stream = TextProvider.GetBytes(uuid.ToStringHyphenated() + ":" + handle.ToString() + ":" + challenge);
+ byte[] hash = HashProvider.ComputeHash(stream);
+
+ return false;
+ }
+ }
+
+
+}
diff --git a/OpenGridServices/OpenGrid.Framework.Data.MySQL/MySQLInventoryData.cs b/OpenGridServices/OpenGrid.Framework.Data.MySQL/MySQLInventoryData.cs
new file mode 100644
index 0000000..fb429e4
--- /dev/null
+++ b/OpenGridServices/OpenGrid.Framework.Data.MySQL/MySQLInventoryData.cs
@@ -0,0 +1,309 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.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 System.Text;
+using libsecondlife;
+
+namespace OpenGrid.Framework.Data.MySQL
+{
+ ///
+ /// A MySQL interface for the inventory server
+ ///
+ class MySQLInventoryData : IInventoryData
+ {
+ ///
+ /// The database manager
+ ///
+ public MySQLManager database;
+
+ ///
+ /// Loads and initialises this database plugin
+ ///
+ public void Initialise()
+ {
+ IniFile GridDataMySqlFile = new IniFile("mysql_connection.ini");
+ string settingHostname = GridDataMySqlFile.ParseFileReadValue("hostname");
+ string settingDatabase = GridDataMySqlFile.ParseFileReadValue("database");
+ string settingUsername = GridDataMySqlFile.ParseFileReadValue("username");
+ string settingPassword = GridDataMySqlFile.ParseFileReadValue("password");
+ string settingPooling = GridDataMySqlFile.ParseFileReadValue("pooling");
+ string settingPort = GridDataMySqlFile.ParseFileReadValue("port");
+
+ database = new MySQLManager(settingHostname, settingDatabase, settingUsername, settingPassword, settingPooling, settingPort);
+ }
+
+ ///
+ /// The name of this DB provider
+ ///
+ /// Name of DB provider
+ public string getName()
+ {
+ return "MySQL Inventory Data Interface";
+ }
+
+ ///
+ /// Closes this DB provider
+ ///
+ public void Close()
+ {
+ // Do nothing.
+ }
+
+ ///
+ /// Returns the version of this DB provider
+ ///
+ /// A string containing the DB provider
+ public string getVersion()
+ {
+ return "0.1";
+ }
+
+ ///
+ /// Returns a list of items in a specified folder
+ ///
+ /// The folder to search
+ /// A list containing inventory items
+ public List getInventoryInFolder(LLUUID folderID)
+ {
+ try
+ {
+ lock (database)
+ {
+ Dictionary param = new Dictionary();
+ param["?uuid"] = folderID.ToStringHyphenated();
+
+ System.Data.IDbCommand result = database.Query("SELECT * FROM inventoryitems WHERE parentFolderID = ?uuid", param);
+ System.Data.IDataReader reader = result.ExecuteReader();
+
+ List items = database.readInventoryItems(reader);
+
+ reader.Close();
+ result.Dispose();
+
+ return items;
+ }
+ }
+ catch (Exception e)
+ {
+ database.Reconnect();
+ Console.WriteLine(e.ToString());
+ return null;
+ }
+ }
+
+ ///
+ /// Returns a list of the root folders within a users inventory
+ ///
+ /// The user whos inventory is to be searched
+ /// A list of folder objects
+ public List getUserRootFolders(LLUUID user)
+ {
+ try
+ {
+ lock (database)
+ {
+ Dictionary param = new Dictionary();
+ param["?uuid"] = user.ToStringHyphenated();
+ param["?zero"] = LLUUID.Zero.ToStringHyphenated();
+
+ System.Data.IDbCommand result = database.Query("SELECT * FROM inventoryfolders WHERE parentFolderID = ?zero AND agentID = ?uuid", param);
+ System.Data.IDataReader reader = result.ExecuteReader();
+
+ List items = database.readInventoryFolders(reader);
+
+ reader.Close();
+ result.Dispose();
+
+ return items;
+ }
+ }
+ catch (Exception e)
+ {
+ database.Reconnect();
+ Console.WriteLine(e.ToString());
+ return null;
+ }
+ }
+
+ ///
+ /// Returns a list of folders in a users inventory contained within the specified folder
+ ///
+ /// The folder to search
+ /// A list of inventory folders
+ public List getInventoryFolders(LLUUID parentID)
+ {
+ try
+ {
+ lock (database)
+ {
+ Dictionary param = new Dictionary();
+ param["?uuid"] = parentID.ToStringHyphenated();
+
+ System.Data.IDbCommand result = database.Query("SELECT * FROM inventoryfolders WHERE parentFolderID = ?uuid", param);
+ System.Data.IDataReader reader = result.ExecuteReader();
+
+ List items = database.readInventoryFolders(reader);
+
+ reader.Close();
+ result.Dispose();
+
+ return items;
+ }
+ }
+ catch (Exception e)
+ {
+ database.Reconnect();
+ Console.WriteLine(e.ToString());
+ return null;
+ }
+ }
+
+ ///
+ /// Returns a specified inventory item
+ ///
+ /// The item to return
+ /// An inventory item
+ public InventoryItemBase getInventoryItem(LLUUID item)
+ {
+ try
+ {
+ lock (database)
+ {
+ Dictionary param = new Dictionary();
+ param["?uuid"] = item.ToStringHyphenated();
+
+ System.Data.IDbCommand result = database.Query("SELECT * FROM inventoryitems WHERE inventoryID = ?uuid", param);
+ System.Data.IDataReader reader = result.ExecuteReader();
+
+ List items = database.readInventoryItems(reader);
+
+ reader.Close();
+ result.Dispose();
+
+ if (items.Count > 0)
+ {
+ return items[0];
+ }
+ else
+ {
+ return null;
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ database.Reconnect();
+ Console.WriteLine(e.ToString());
+ return null;
+ }
+ }
+
+ ///
+ /// Returns a specified inventory folder
+ ///
+ /// The folder to return
+ /// A folder class
+ public InventoryFolderBase getInventoryFolder(LLUUID folder)
+ {
+ try
+ {
+ lock (database)
+ {
+ Dictionary param = new Dictionary();
+ param["?uuid"] = folder.ToStringHyphenated();
+
+ System.Data.IDbCommand result = database.Query("SELECT * FROM inventoryfolders WHERE folderID = ?uuid", param);
+ System.Data.IDataReader reader = result.ExecuteReader();
+
+ List items = database.readInventoryFolders(reader);
+
+ reader.Close();
+ result.Dispose();
+
+ if (items.Count > 0)
+ {
+ return items[0];
+ }
+ else
+ {
+ return null;
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ database.Reconnect();
+ Console.WriteLine(e.ToString());
+ return null;
+ }
+ }
+
+ ///
+ /// Adds a specified item to the database
+ ///
+ /// The inventory item
+ public void addInventoryItem(InventoryItemBase item)
+ {
+ lock (database)
+ {
+ database.insertItem(item);
+ }
+ }
+
+ ///
+ /// Updates the specified inventory item
+ ///
+ /// Inventory item to update
+ public void updateInventoryItem(InventoryItemBase item)
+ {
+ addInventoryItem(item);
+ }
+
+ ///
+ /// Creates a new inventory folder
+ ///
+ /// Folder to create
+ public void addInventoryFolder(InventoryFolderBase folder)
+ {
+ lock (database)
+ {
+ database.insertFolder(folder);
+ }
+ }
+
+ ///
+ /// Updates an inventory folder
+ ///
+ /// Folder to update
+ public void updateInventoryFolder(InventoryFolderBase folder)
+ {
+ addInventoryFolder(folder);
+ }
+ }
+}
diff --git a/OpenGridServices/OpenGrid.Framework.Data.MySQL/MySQLLogData.cs b/OpenGridServices/OpenGrid.Framework.Data.MySQL/MySQLLogData.cs
new file mode 100644
index 0000000..c88b39f
--- /dev/null
+++ b/OpenGridServices/OpenGrid.Framework.Data.MySQL/MySQLLogData.cs
@@ -0,0 +1,107 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.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 System.Text;
+
+namespace OpenGrid.Framework.Data.MySQL
+{
+ ///
+ /// An interface to the log database for MySQL
+ ///
+ class MySQLLogData : ILogData
+ {
+ ///
+ /// The database manager
+ ///
+ public MySQLManager database;
+
+ ///
+ /// Artificial constructor called when the plugin is loaded
+ ///
+ public void Initialise()
+ {
+ IniFile GridDataMySqlFile = new IniFile("mysql_connection.ini");
+ string settingHostname = GridDataMySqlFile.ParseFileReadValue("hostname");
+ string settingDatabase = GridDataMySqlFile.ParseFileReadValue("database");
+ string settingUsername = GridDataMySqlFile.ParseFileReadValue("username");
+ string settingPassword = GridDataMySqlFile.ParseFileReadValue("password");
+ string settingPooling = GridDataMySqlFile.ParseFileReadValue("pooling");
+ string settingPort = GridDataMySqlFile.ParseFileReadValue("port");
+
+ database = new MySQLManager(settingHostname, settingDatabase, settingUsername, settingPassword, settingPooling, settingPort);
+ }
+
+ ///
+ /// Saves a log item to the database
+ ///
+ /// The daemon triggering the event
+ /// The target of the action (region / agent UUID, etc)
+ /// The method call where the problem occured
+ /// The arguments passed to the method
+ /// How critical is this?
+ /// The message to log
+ public void saveLog(string serverDaemon, string target, string methodCall, string arguments, int priority, string logMessage)
+ {
+ try
+ {
+ database.insertLogRow(serverDaemon, target, methodCall, arguments, priority, logMessage);
+ }
+ catch (Exception e)
+ {
+ database.Reconnect();
+ }
+ }
+
+ ///
+ /// Returns the name of this DB provider
+ ///
+ /// A string containing the DB provider name
+ public string getName()
+ {
+ return "MySQL Logdata Interface";
+ }
+
+ ///
+ /// Closes the database provider
+ ///
+ public void Close()
+ {
+ // Do nothing.
+ }
+
+ ///
+ /// Returns the version of this DB provider
+ ///
+ /// A string containing the provider version
+ public string getVersion()
+ {
+ return "0.1";
+ }
+ }
+}
diff --git a/OpenGridServices/OpenGrid.Framework.Data.MySQL/MySQLManager.cs b/OpenGridServices/OpenGrid.Framework.Data.MySQL/MySQLManager.cs
new file mode 100644
index 0000000..76d3faf
--- /dev/null
+++ b/OpenGridServices/OpenGrid.Framework.Data.MySQL/MySQLManager.cs
@@ -0,0 +1,581 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.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 System.Text;
+using System.Data;
+
+// MySQL Native
+using MySql;
+using MySql.Data;
+using MySql.Data.Types;
+using MySql.Data.MySqlClient;
+
+using OpenGrid.Framework.Data;
+
+namespace OpenGrid.Framework.Data.MySQL
+{
+ ///
+ /// A MySQL Database manager
+ ///
+ class MySQLManager
+ {
+ ///
+ /// The database connection object
+ ///
+ IDbConnection dbcon;
+ ///
+ /// Connection string for ADO.net
+ ///
+ string connectionString;
+
+ ///
+ /// Initialises and creates a new MySQL connection and maintains it.
+ ///
+ /// The MySQL server being connected to
+ /// The name of the MySQL database being used
+ /// The username logging into the database
+ /// The password for the user logging in
+ /// Whether to use connection pooling or not, can be one of the following: 'yes', 'true', 'no' or 'false', if unsure use 'false'.
+ public MySQLManager(string hostname, string database, string username, string password, string cpooling, string port)
+ {
+ try
+ {
+ connectionString = "Server=" + hostname + ";Port=" + port + ";Database=" + database + ";User ID=" + username + ";Password=" + password + ";Pooling=" + cpooling + ";";
+ dbcon = new MySqlConnection(connectionString);
+
+ dbcon.Open();
+
+ System.Console.WriteLine("MySQL connection established");
+ }
+ catch (Exception e)
+ {
+ throw new Exception("Error initialising MySql Database: " + e.ToString());
+ }
+ }
+
+ ///
+ /// Shuts down the database connection
+ ///
+ public void Close()
+ {
+ dbcon.Close();
+ dbcon = null;
+ }
+
+ ///
+ /// Reconnects to the database
+ ///
+ public void Reconnect()
+ {
+ lock (dbcon)
+ {
+ try
+ {
+ // Close the DB connection
+ dbcon.Close();
+ // Try reopen it
+ dbcon = new MySqlConnection(connectionString);
+ dbcon.Open();
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine("Unable to reconnect to database " + e.ToString());
+ }
+ }
+ }
+
+ ///
+ /// Runs a query with protection against SQL Injection by using parameterised input.
+ ///
+ /// The SQL string - replace any variables such as WHERE x = "y" with WHERE x = @y
+ /// The parameters - index so that @y is indexed as 'y'
+ /// A MySQL DB Command
+ public IDbCommand Query(string sql, Dictionary parameters)
+ {
+ try
+ {
+ MySqlCommand dbcommand = (MySqlCommand)dbcon.CreateCommand();
+ dbcommand.CommandText = sql;
+ foreach (KeyValuePair param in parameters)
+ {
+ dbcommand.Parameters.Add(param.Key, param.Value);
+ }
+
+ return (IDbCommand)dbcommand;
+ }
+ catch
+ {
+ lock (dbcon)
+ {
+ // Close the DB connection
+ try
+ {
+ dbcon.Close();
+ }
+ catch { }
+
+ // Try reopen it
+ try
+ {
+ dbcon = new MySqlConnection(connectionString);
+ dbcon.Open();
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine("Unable to reconnect to database " + e.ToString());
+ }
+
+ // Run the query again
+ try
+ {
+ MySqlCommand dbcommand = (MySqlCommand)dbcon.CreateCommand();
+ dbcommand.CommandText = sql;
+ foreach (KeyValuePair param in parameters)
+ {
+ dbcommand.Parameters.Add(param.Key, param.Value);
+ }
+
+ return (IDbCommand)dbcommand;
+ }
+ catch (Exception e)
+ {
+ // Return null if it fails.
+ Console.WriteLine("Failed during Query generation: " + e.ToString());
+ return null;
+ }
+ }
+ }
+ }
+
+ ///
+ /// Reads a region row from a database reader
+ ///
+ /// An active database reader
+ /// A region profile
+ public SimProfileData readSimRow(IDataReader reader)
+ {
+ SimProfileData retval = new SimProfileData();
+
+ if (reader.Read())
+ {
+ // Region Main
+ retval.regionHandle = Convert.ToUInt64(reader["regionHandle"].ToString());
+ retval.regionName = (string)reader["regionName"];
+ retval.UUID = new libsecondlife.LLUUID((string)reader["uuid"]);
+
+ // Secrets
+ retval.regionRecvKey = (string)reader["regionRecvKey"];
+ retval.regionSecret = (string)reader["regionSecret"];
+ retval.regionSendKey = (string)reader["regionSendKey"];
+
+ // Region Server
+ retval.regionDataURI = (string)reader["regionDataURI"];
+ retval.regionOnline = false; // Needs to be pinged before this can be set.
+ retval.serverIP = (string)reader["serverIP"];
+ retval.serverPort = (uint)reader["serverPort"];
+ retval.serverURI = (string)reader["serverURI"];
+
+ // Location
+ retval.regionLocX = Convert.ToUInt32(reader["locX"].ToString());
+ retval.regionLocY = Convert.ToUInt32(reader["locY"].ToString());
+ retval.regionLocZ = Convert.ToUInt32(reader["locZ"].ToString());
+
+ // Neighbours - 0 = No Override
+ retval.regionEastOverrideHandle = Convert.ToUInt64(reader["eastOverrideHandle"].ToString());
+ retval.regionWestOverrideHandle = Convert.ToUInt64(reader["westOverrideHandle"].ToString());
+ retval.regionSouthOverrideHandle = Convert.ToUInt64(reader["southOverrideHandle"].ToString());
+ retval.regionNorthOverrideHandle = Convert.ToUInt64(reader["northOverrideHandle"].ToString());
+
+ // Assets
+ retval.regionAssetURI = (string)reader["regionAssetURI"];
+ retval.regionAssetRecvKey = (string)reader["regionAssetRecvKey"];
+ retval.regionAssetSendKey = (string)reader["regionAssetSendKey"];
+
+ // Userserver
+ retval.regionUserURI = (string)reader["regionUserURI"];
+ retval.regionUserRecvKey = (string)reader["regionUserRecvKey"];
+ retval.regionUserSendKey = (string)reader["regionUserSendKey"];
+
+ // World Map Addition
+ string tempRegionMap = reader["regionMapTexture"].ToString();
+ if (tempRegionMap != "")
+ {
+ retval.regionMapTextureID = new libsecondlife.LLUUID(tempRegionMap);
+ }
+ else
+ {
+ retval.regionMapTextureID = new libsecondlife.LLUUID();
+ }
+ }
+ else
+ {
+ return null;
+ }
+ return retval;
+ }
+
+ ///
+ /// Reads an agent row from a database reader
+ ///
+ /// An active database reader
+ /// A user session agent
+ public UserAgentData readAgentRow(IDataReader reader)
+ {
+ UserAgentData retval = new UserAgentData();
+
+ if (reader.Read())
+ {
+ // Agent IDs
+ retval.UUID = new libsecondlife.LLUUID((string)reader["UUID"]);
+ retval.sessionID = new libsecondlife.LLUUID((string)reader["sessionID"]);
+ retval.secureSessionID = new libsecondlife.LLUUID((string)reader["secureSessionID"]);
+
+ // Agent Who?
+ retval.agentIP = (string)reader["agentIP"];
+ retval.agentPort = Convert.ToUInt32(reader["agentPort"].ToString());
+ retval.agentOnline = Convert.ToBoolean(reader["agentOnline"].ToString());
+
+ // Login/Logout times (UNIX Epoch)
+ retval.loginTime = Convert.ToInt32(reader["loginTime"].ToString());
+ retval.logoutTime = Convert.ToInt32(reader["logoutTime"].ToString());
+
+ // Current position
+ retval.currentRegion = (string)reader["currentRegion"];
+ retval.currentHandle = Convert.ToUInt64(reader["currentHandle"].ToString());
+ libsecondlife.LLVector3.TryParse((string)reader["currentPos"], out retval.currentPos);
+ }
+ else
+ {
+ return null;
+ }
+ return retval;
+ }
+
+ ///
+ /// Reads a user profile from an active data reader
+ ///
+ /// An active database reader
+ /// A user profile
+ public UserProfileData readUserRow(IDataReader reader)
+ {
+ UserProfileData retval = new UserProfileData();
+
+ if (reader.Read())
+ {
+ retval.UUID = new libsecondlife.LLUUID((string)reader["UUID"]);
+ retval.username = (string)reader["username"];
+ retval.surname = (string)reader["lastname"];
+
+ retval.passwordHash = (string)reader["passwordHash"];
+ retval.passwordSalt = (string)reader["passwordSalt"];
+
+ retval.homeRegion = Convert.ToUInt64(reader["homeRegion"].ToString());
+ retval.homeLocation = new libsecondlife.LLVector3(
+ Convert.ToSingle(reader["homeLocationX"].ToString()),
+ Convert.ToSingle(reader["homeLocationY"].ToString()),
+ Convert.ToSingle(reader["homeLocationZ"].ToString()));
+ retval.homeLookAt = new libsecondlife.LLVector3(
+ Convert.ToSingle(reader["homeLookAtX"].ToString()),
+ Convert.ToSingle(reader["homeLookAtY"].ToString()),
+ Convert.ToSingle(reader["homeLookAtZ"].ToString()));
+
+ retval.created = Convert.ToInt32(reader["created"].ToString());
+ retval.lastLogin = Convert.ToInt32(reader["lastLogin"].ToString());
+
+ retval.userInventoryURI = (string)reader["userInventoryURI"];
+ retval.userAssetURI = (string)reader["userAssetURI"];
+
+ retval.profileCanDoMask = Convert.ToUInt32(reader["profileCanDoMask"].ToString());
+ retval.profileWantDoMask = Convert.ToUInt32(reader["profileWantDoMask"].ToString());
+
+ retval.profileAboutText = (string)reader["profileAboutText"];
+ retval.profileFirstText = (string)reader["profileFirstText"];
+
+ retval.profileImage = new libsecondlife.LLUUID((string)reader["profileImage"]);
+ retval.profileFirstImage = new libsecondlife.LLUUID((string)reader["profileFirstImage"]);
+
+ }
+ else
+ {
+ return null;
+ }
+ return retval;
+ }
+
+ ///
+ /// Reads a list of inventory folders returned by a query.
+ ///
+ /// A MySQL Data Reader
+ /// A List containing inventory folders
+ public List readInventoryFolders(IDataReader reader)
+ {
+ List rows = new List();
+
+ while(reader.Read())
+ {
+ try
+ {
+ InventoryFolderBase folder = new InventoryFolderBase();
+
+ folder.agentID = new libsecondlife.LLUUID((string)reader["agentID"]);
+ folder.parentID = new libsecondlife.LLUUID((string)reader["parentFolderID"]);
+ folder.folderID = new libsecondlife.LLUUID((string)reader["folderID"]);
+ folder.name = (string)reader["folderName"];
+
+ rows.Add(folder);
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine(e.ToString());
+ }
+ }
+
+ return rows;
+ }
+
+ ///
+ /// Reads a collection of items from an SQL result
+ ///
+ /// The SQL Result
+ /// A List containing Inventory Items
+ public List readInventoryItems(IDataReader reader)
+ {
+ List rows = new List();
+
+ while (reader.Read())
+ {
+ try
+ {
+ InventoryItemBase item = new InventoryItemBase();
+
+ item.assetID = new libsecondlife.LLUUID((string)reader["assetID"]);
+ item.avatarID = new libsecondlife.LLUUID((string)reader["avatarID"]);
+ item.inventoryCurrentPermissions = Convert.ToUInt32(reader["inventoryCurrentPermissions"].ToString());
+ item.inventoryDescription = (string)reader["inventoryDescription"];
+ item.inventoryID = new libsecondlife.LLUUID((string)reader["inventoryID"]);
+ item.inventoryName = (string)reader["inventoryName"];
+ item.inventoryNextPermissions = Convert.ToUInt32(reader["inventoryNextPermissions"].ToString());
+ item.parentFolderID = new libsecondlife.LLUUID((string)reader["parentFolderID"]);
+ item.type = Convert.ToInt32(reader["type"].ToString());
+
+ rows.Add(item);
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine(e.ToString());
+ }
+ }
+
+ return rows;
+ }
+
+ ///
+ /// Inserts a new row into the log database
+ ///
+ /// The daemon which triggered this event
+ /// Who were we operating on when this occured (region UUID, user UUID, etc)
+ /// The method call where the problem occured
+ /// The arguments passed to the method
+ /// How critical is this?
+ /// Extra message info
+ /// Saved successfully?
+ public bool insertLogRow(string serverDaemon, string target, string methodCall, string arguments, int priority, string logMessage)
+ {
+ string sql = "INSERT INTO logs (`target`, `server`, `method`, `arguments`, `priority`, `message`) VALUES ";
+ sql += "(?target, ?server, ?method, ?arguments, ?priority, ?message)";
+
+ Dictionary parameters = new Dictionary();
+ parameters["?server"] = serverDaemon;
+ parameters["?target"] = target;
+ parameters["?method"] = methodCall;
+ parameters["?arguments"] = arguments;
+ parameters["?priority"] = priority.ToString();
+ parameters["?message"] = logMessage;
+
+ bool returnval = false;
+
+ try
+ {
+ IDbCommand result = Query(sql, parameters);
+
+ if (result.ExecuteNonQuery() == 1)
+ returnval = true;
+
+ result.Dispose();
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine(e.ToString());
+ return false;
+ }
+
+ return returnval;
+ }
+
+ ///
+ /// Inserts a new item into the database
+ ///
+ /// The item
+ /// Success?
+ public bool insertItem(InventoryItemBase item)
+ {
+ string sql = "REPLACE INTO inventoryitems (inventoryID, assetID, type, parentFolderID, avatarID, inventoryName, inventoryDescription, inventoryNextPermissions, inventoryCurrentPermissions) VALUES ";
+ sql += "(?inventoryID, ?assetID, ?type, ?parentFolderID, ?avatarID, ?inventoryName, ?inventoryDescription, ?inventoryNextPermissions, ?inventoryCurrentPermissions)";
+
+ Dictionary parameters = new Dictionary();
+ parameters["?inventoryID"] = item.inventoryID.ToStringHyphenated();
+ parameters["?assetID"] = item.assetID.ToStringHyphenated();
+ parameters["?type"] = item.type.ToString();
+ parameters["?parentFolderID"] = item.parentFolderID.ToStringHyphenated();
+ parameters["?avatarID"] = item.avatarID.ToStringHyphenated();
+ parameters["?inventoryName"] = item.inventoryName;
+ parameters["?inventoryDescription"] = item.inventoryDescription;
+ parameters["?inventoryNextPermissions"] = item.inventoryNextPermissions.ToString();
+ parameters["?inventoryCurrentPermissions"] = item.inventoryCurrentPermissions.ToString();
+
+ bool returnval = false;
+
+ try
+ {
+ IDbCommand result = Query(sql, parameters);
+
+ if (result.ExecuteNonQuery() == 1)
+ returnval = true;
+
+ result.Dispose();
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine(e.ToString());
+ return false;
+ }
+
+ return returnval;
+ }
+
+ ///
+ /// Inserts a new folder into the database
+ ///
+ /// The folder
+ /// Success?
+ public bool insertFolder(InventoryFolderBase folder)
+ {
+ string sql = "REPLACE INTO inventoryfolders (folderID, agentID, parentFolderID, folderName) VALUES ";
+ sql += "(?folderID, ?agentID, ?parentFolderID, ?folderName)";
+
+ Dictionary parameters = new Dictionary();
+ parameters["?folderID"] = folder.folderID.ToStringHyphenated();
+ parameters["?agentID"] = folder.agentID.ToStringHyphenated();
+ parameters["?parentFolderID"] = folder.parentID.ToStringHyphenated();
+ parameters["?folderName"] = folder.name;
+
+ bool returnval = false;
+ try
+ {
+ IDbCommand result = Query(sql, parameters);
+
+ if (result.ExecuteNonQuery() == 1)
+ returnval = true;
+
+ result.Dispose();
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine(e.ToString());
+ return false;
+ }
+ return returnval;
+ }
+
+ ///
+ /// Inserts a new region into the database
+ ///
+ /// The region to insert
+ /// Success?
+ public bool insertRegion(SimProfileData regiondata)
+ {
+ string sql = "REPLACE INTO regions (regionHandle, regionName, uuid, regionRecvKey, regionSecret, regionSendKey, regionDataURI, ";
+ sql += "serverIP, serverPort, serverURI, locX, locY, locZ, eastOverrideHandle, westOverrideHandle, southOverrideHandle, northOverrideHandle, regionAssetURI, regionAssetRecvKey, ";
+ sql += "regionAssetSendKey, regionUserURI, regionUserRecvKey, regionUserSendKey, regionMapTexture) VALUES ";
+
+ sql += "(?regionHandle, ?regionName, ?uuid, ?regionRecvKey, ?regionSecret, ?regionSendKey, ?regionDataURI, ";
+ sql += "?serverIP, ?serverPort, ?serverURI, ?locX, ?locY, ?locZ, ?eastOverrideHandle, ?westOverrideHandle, ?southOverrideHandle, ?northOverrideHandle, ?regionAssetURI, ?regionAssetRecvKey, ";
+ sql += "?regionAssetSendKey, ?regionUserURI, ?regionUserRecvKey, ?regionUserSendKey, ?regionMapTexture);";
+
+ Dictionary parameters = new Dictionary();
+
+ parameters["?regionHandle"] = regiondata.regionHandle.ToString();
+ parameters["?regionName"] = regiondata.regionName.ToString();
+ parameters["?uuid"] = regiondata.UUID.ToStringHyphenated();
+ parameters["?regionRecvKey"] = regiondata.regionRecvKey.ToString();
+ parameters["?regionSecret"] = regiondata.regionSecret.ToString();
+ parameters["?regionSendKey"] = regiondata.regionSendKey.ToString();
+ parameters["?regionDataURI"] = regiondata.regionDataURI.ToString();
+ parameters["?serverIP"] = regiondata.serverIP.ToString();
+ parameters["?serverPort"] = regiondata.serverPort.ToString();
+ parameters["?serverURI"] = regiondata.serverURI.ToString();
+ parameters["?locX"] = regiondata.regionLocX.ToString();
+ parameters["?locY"] = regiondata.regionLocY.ToString();
+ parameters["?locZ"] = regiondata.regionLocZ.ToString();
+ parameters["?eastOverrideHandle"] = regiondata.regionEastOverrideHandle.ToString();
+ parameters["?westOverrideHandle"] = regiondata.regionWestOverrideHandle.ToString();
+ parameters["?northOverrideHandle"] = regiondata.regionNorthOverrideHandle.ToString();
+ parameters["?southOverrideHandle"] = regiondata.regionSouthOverrideHandle.ToString();
+ parameters["?regionAssetURI"] = regiondata.regionAssetURI.ToString();
+ parameters["?regionAssetRecvKey"] = regiondata.regionAssetRecvKey.ToString();
+ parameters["?regionAssetSendKey"] = regiondata.regionAssetSendKey.ToString();
+ parameters["?regionUserURI"] = regiondata.regionUserURI.ToString();
+ parameters["?regionUserRecvKey"] = regiondata.regionUserRecvKey.ToString();
+ parameters["?regionUserSendKey"] = regiondata.regionUserSendKey.ToString();
+ parameters["?regionMapTexture"] = regiondata.regionMapTextureID.ToStringHyphenated();
+
+ bool returnval = false;
+
+ try
+ {
+
+ IDbCommand result = Query(sql, parameters);
+
+ //Console.WriteLine(result.CommandText);
+
+ if (result.ExecuteNonQuery() == 1)
+ returnval = true;
+
+ result.Dispose();
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine(e.ToString());
+ return false;
+ }
+
+ return returnval;
+ }
+ }
+}
diff --git a/OpenGridServices/OpenGrid.Framework.Data.MySQL/MySQLUserData.cs b/OpenGridServices/OpenGrid.Framework.Data.MySQL/MySQLUserData.cs
new file mode 100644
index 0000000..032a0e6
--- /dev/null
+++ b/OpenGridServices/OpenGrid.Framework.Data.MySQL/MySQLUserData.cs
@@ -0,0 +1,257 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.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 System.Text;
+using OpenGrid.Framework.Data;
+using libsecondlife;
+
+namespace OpenGrid.Framework.Data.MySQL
+{
+ ///
+ /// A database interface class to a user profile storage system
+ ///
+ class MySQLUserData : IUserData
+ {
+ ///
+ /// Database manager for MySQL
+ ///
+ public MySQLManager database;
+
+ ///
+ /// Loads and initialises the MySQL storage plugin
+ ///
+ public void Initialise()
+ {
+ // Load from an INI file connection details
+ // TODO: move this to XML?
+ IniFile GridDataMySqlFile = new IniFile("mysql_connection.ini");
+ string settingHostname = GridDataMySqlFile.ParseFileReadValue("hostname");
+ string settingDatabase = GridDataMySqlFile.ParseFileReadValue("database");
+ string settingUsername = GridDataMySqlFile.ParseFileReadValue("username");
+ string settingPassword = GridDataMySqlFile.ParseFileReadValue("password");
+ string settingPooling = GridDataMySqlFile.ParseFileReadValue("pooling");
+ string settingPort = GridDataMySqlFile.ParseFileReadValue("port");
+
+ database = new MySQLManager(settingHostname, settingDatabase, settingUsername, settingPassword, settingPooling, settingPort);
+ }
+
+ ///
+ /// Searches the database for a specified user profile
+ ///
+ /// The account name of the user
+ /// A user profile
+ public UserProfileData getUserByName(string name)
+ {
+ return getUserByName(name.Split(' ')[0], name.Split(' ')[1]);
+ }
+
+ ///
+ /// Searches the database for a specified user profile by name components
+ ///
+ /// The first part of the account name
+ /// The second part of the account name
+ /// A user profile
+ public UserProfileData getUserByName(string user, string last)
+ {
+ try
+ {
+ lock (database)
+ {
+ Dictionary param = new Dictionary();
+ param["?first"] = user;
+ param["?second"] = last;
+
+ System.Data.IDbCommand result = database.Query("SELECT * FROM users WHERE username = ?first AND lastname = ?second", param);
+ System.Data.IDataReader reader = result.ExecuteReader();
+
+ UserProfileData row = database.readUserRow(reader);
+
+ reader.Close();
+ result.Dispose();
+
+ return row;
+ }
+ }
+ catch (Exception e)
+ {
+ database.Reconnect();
+ Console.WriteLine(e.ToString());
+ return null;
+ }
+ }
+
+ ///
+ /// Searches the database for a specified user profile by UUID
+ ///
+ /// The account ID
+ /// The users profile
+ public UserProfileData getUserByUUID(LLUUID uuid)
+ {
+ try
+ {
+ lock (database)
+ {
+ Dictionary param = new Dictionary();
+ param["?uuid"] = uuid.ToStringHyphenated();
+
+ System.Data.IDbCommand result = database.Query("SELECT * FROM users WHERE UUID = ?uuid", param);
+ System.Data.IDataReader reader = result.ExecuteReader();
+
+ UserProfileData row = database.readUserRow(reader);
+
+ reader.Close();
+ result.Dispose();
+
+ return row;
+ }
+ }
+ catch (Exception e)
+ {
+ database.Reconnect();
+ Console.WriteLine(e.ToString());
+ return null;
+ }
+ }
+
+ ///
+ /// Returns a user session searching by name
+ ///
+ /// The account name
+ /// The users session
+ public UserAgentData getAgentByName(string name)
+ {
+ return getAgentByName(name.Split(' ')[0], name.Split(' ')[1]);
+ }
+
+ ///
+ /// Returns a user session by account name
+ ///
+ /// First part of the users account name
+ /// Second part of the users account name
+ /// The users session
+ public UserAgentData getAgentByName(string user, string last)
+ {
+ UserProfileData profile = getUserByName(user, last);
+ return getAgentByUUID(profile.UUID);
+ }
+
+ ///
+ /// Returns an agent session by account UUID
+ ///
+ /// The accounts UUID
+ /// The users session
+ public UserAgentData getAgentByUUID(LLUUID uuid)
+ {
+ try
+ {
+ lock (database)
+ {
+ Dictionary param = new Dictionary();
+ param["?uuid"] = uuid.ToStringHyphenated();
+
+ System.Data.IDbCommand result = database.Query("SELECT * FROM agents WHERE UUID = ?uuid", param);
+ System.Data.IDataReader reader = result.ExecuteReader();
+
+ UserAgentData row = database.readAgentRow(reader);
+
+ reader.Close();
+ result.Dispose();
+
+ return row;
+ }
+ }
+ catch (Exception e)
+ {
+ database.Reconnect();
+ Console.WriteLine(e.ToString());
+ return null;
+ }
+ }
+
+ ///
+ /// Creates a new users profile
+ ///
+ /// The user profile to create
+ public void addNewUserProfile(UserProfileData user)
+ {
+ }
+
+ ///
+ /// Creates a new agent
+ ///
+ /// The agent to create
+ public void addNewUserAgent(UserAgentData agent)
+ {
+ // Do nothing.
+ }
+
+ ///
+ /// Performs a money transfer request between two accounts
+ ///
+ /// The senders account ID
+ /// The recievers account ID
+ /// The amount to transfer
+ /// Success?
+ public bool moneyTransferRequest(LLUUID from, LLUUID to, uint amount)
+ {
+ return false;
+ }
+
+ ///
+ /// Performs an inventory transfer request between two accounts
+ ///
+ /// TODO: Move to inventory server
+ /// The senders account ID
+ /// The recievers account ID
+ /// The item to transfer
+ /// Success?
+ public bool inventoryTransferRequest(LLUUID from, LLUUID to, LLUUID item)
+ {
+ return false;
+ }
+
+ ///
+ /// Database provider name
+ ///
+ /// Provider name
+ public string getName()
+ {
+ return "MySQL Userdata Interface";
+ }
+
+ ///
+ /// Database provider version
+ ///
+ /// provider version
+ public string getVersion()
+ {
+ return "0.1";
+ }
+ }
+}
diff --git a/OpenGridServices/OpenGrid.Framework.Data.MySQL/OpenGrid.Framework.Data.MySQL.csproj b/OpenGridServices/OpenGrid.Framework.Data.MySQL/OpenGrid.Framework.Data.MySQL.csproj
new file mode 100644
index 0000000..351de2a
--- /dev/null
+++ b/OpenGridServices/OpenGrid.Framework.Data.MySQL/OpenGrid.Framework.Data.MySQL.csproj
@@ -0,0 +1,237 @@
+<<<<<<< .mine
+
+
+ Local
+ 8.0.50727
+ 2.0
+ {0F3C3AC1-0000-0000-0000-000000000000}
+ Debug
+ AnyCPU
+
+
+
+ OpenGrid.Framework.Data.MySQL
+ JScript
+ Grid
+ IE50
+ false
+ Library
+
+ OpenGrid.Framework.Data.MySQL
+
+
+
+
+
+ False
+ 285212672
+ False
+
+
+ TRACE;DEBUG
+
+ True
+ 4096
+ False
+ ..\..\bin\
+ False
+ False
+ False
+ 4
+
+
+
+ False
+ 285212672
+ False
+
+
+ TRACE
+
+ False
+ 4096
+ True
+ ..\..\bin\
+ False
+ False
+ False
+ 4
+
+
+
+
+ System.dll
+ False
+
+
+ System.Xml.dll
+ False
+
+
+ System.Data.dll
+ False
+
+
+ ..\..\bin\libsecondlife.dll
+ False
+
+
+ ..\..\bin\MySql.Data.dll
+ False
+
+
+
+
+ OpenGrid.Framework.Data
+ {62CDF671-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+
+
+
+
+
+
+
+
+=======
+
+
+ Local
+ 8.0.50727
+ 2.0
+ {0F3C3AC1-0000-0000-0000-000000000000}
+ Debug
+ AnyCPU
+
+
+
+ OpenGrid.Framework.Data.MySQL
+ JScript
+ Grid
+ IE50
+ false
+ Library
+
+ OpenGrid.Framework.Data.MySQL
+
+
+
+
+
+ False
+ 285212672
+ False
+
+
+ TRACE;DEBUG
+
+ True
+ 4096
+ False
+ ..\..\bin\
+ False
+ False
+ False
+ 4
+
+
+
+ False
+ 285212672
+ False
+
+
+ TRACE
+
+ False
+ 4096
+ True
+ ..\..\bin\
+ False
+ False
+ False
+ 4
+
+
+
+
+ System.dll
+ False
+
+
+ System.Xml.dll
+ False
+
+
+ System.Data.dll
+ False
+
+
+ ..\..\bin\libsecondlife.dll
+ False
+
+
+ ..\..\bin\MySql.Data.dll
+ False
+
+
+
+
+ OpenGrid.Framework.Data
+ {62CDF671-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+
+
+
+
+
+
+
+
+>>>>>>> .r921
diff --git a/OpenGridServices/OpenGrid.Framework.Data.MySQL/OpenGrid.Framework.Data.MySQL.csproj.mine b/OpenGridServices/OpenGrid.Framework.Data.MySQL/OpenGrid.Framework.Data.MySQL.csproj.mine
new file mode 100644
index 0000000..75ef149
--- /dev/null
+++ b/OpenGridServices/OpenGrid.Framework.Data.MySQL/OpenGrid.Framework.Data.MySQL.csproj.mine
@@ -0,0 +1,117 @@
+
+
+ Local
+ 8.0.50727
+ 2.0
+ {0F3C3AC1-0000-0000-0000-000000000000}
+ Debug
+ AnyCPU
+
+
+
+ OpenGrid.Framework.Data.MySQL
+ JScript
+ Grid
+ IE50
+ false
+ Library
+
+ OpenGrid.Framework.Data.MySQL
+
+
+
+
+
+ False
+ 285212672
+ False
+
+
+ TRACE;DEBUG
+
+ True
+ 4096
+ False
+ ..\..\bin\
+ False
+ False
+ False
+ 4
+
+
+
+ False
+ 285212672
+ False
+
+
+ TRACE
+
+ False
+ 4096
+ True
+ ..\..\bin\
+ False
+ False
+ False
+ 4
+
+
+
+
+ System.dll
+ False
+
+
+ System.Xml.dll
+ False
+
+
+ System.Data.dll
+ False
+
+
+ ..\..\bin\libsecondlife.dll
+ False
+
+
+ ..\..\bin\MySql.Data.dll
+ False
+
+
+
+
+ OpenGrid.Framework.Data
+ {62CDF671-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenGridServices/OpenGrid.Framework.Data.MySQL/OpenGrid.Framework.Data.MySQL.csproj.r858 b/OpenGridServices/OpenGrid.Framework.Data.MySQL/OpenGrid.Framework.Data.MySQL.csproj.r858
new file mode 100644
index 0000000..7a36be2
--- /dev/null
+++ b/OpenGridServices/OpenGrid.Framework.Data.MySQL/OpenGrid.Framework.Data.MySQL.csproj.r858
@@ -0,0 +1,114 @@
+
+
+ Local
+ 8.0.50727
+ 2.0
+ {C669E5AC-0000-0000-0000-000000000000}
+ Debug
+ AnyCPU
+
+
+
+ OpenGrid.Framework.Data.MySQL
+ JScript
+ Grid
+ IE50
+ false
+ Library
+
+ OpenGrid.Framework.Data.MySQL
+
+
+
+
+
+ False
+ 285212672
+ False
+
+
+ TRACE
+
+ False
+ 4096
+ True
+ ../../bin/
+ False
+ False
+ False
+ 4
+
+
+
+ False
+ 285212672
+ False
+
+
+ TRACE;DEBUG
+
+ True
+ 4096
+ False
+ ../../bin/
+ False
+ False
+ False
+ 4
+
+
+
+
+ System.dll
+ False
+
+
+ System.Xml.dll
+ False
+
+
+ System.Data.dll
+ False
+
+
+ ..\..\bin\libsecondlife.dll
+ False
+
+
+ ..\..\bin\MySql.Data.dll
+ False
+
+
+
+
+ OpenGrid.Framework.Data
+ {12DD8EB8-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenGridServices/OpenGrid.Framework.Data.MySQL/OpenGrid.Framework.Data.MySQL.csproj.r921 b/OpenGridServices/OpenGrid.Framework.Data.MySQL/OpenGrid.Framework.Data.MySQL.csproj.r921
new file mode 100644
index 0000000..5fe0cf7
--- /dev/null
+++ b/OpenGridServices/OpenGrid.Framework.Data.MySQL/OpenGrid.Framework.Data.MySQL.csproj.r921
@@ -0,0 +1,117 @@
+
+
+ Local
+ 8.0.50727
+ 2.0
+ {0F3C3AC1-0000-0000-0000-000000000000}
+ Debug
+ AnyCPU
+
+
+
+ OpenGrid.Framework.Data.MySQL
+ JScript
+ Grid
+ IE50
+ false
+ Library
+
+ OpenGrid.Framework.Data.MySQL
+
+
+
+
+
+ False
+ 285212672
+ False
+
+
+ TRACE;DEBUG
+
+ True
+ 4096
+ False
+ ..\..\bin\
+ False
+ False
+ False
+ 4
+
+
+
+ False
+ 285212672
+ False
+
+
+ TRACE
+
+ False
+ 4096
+ True
+ ..\..\bin\
+ False
+ False
+ False
+ 4
+
+
+
+
+ System.dll
+ False
+
+
+ System.Xml.dll
+ False
+
+
+ System.Data.dll
+ False
+
+
+ ..\..\bin\libsecondlife.dll
+ False
+
+
+ ..\..\bin\MySql.Data.dll
+ False
+
+
+
+
+ OpenGrid.Framework.Data
+ {62CDF671-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenGridServices/OpenGrid.Framework.Data.MySQL/OpenGrid.Framework.Data.MySQL.csproj.user b/OpenGridServices/OpenGrid.Framework.Data.MySQL/OpenGrid.Framework.Data.MySQL.csproj.user
new file mode 100644
index 0000000..1b6b14d
--- /dev/null
+++ b/OpenGridServices/OpenGrid.Framework.Data.MySQL/OpenGrid.Framework.Data.MySQL.csproj.user
@@ -0,0 +1,12 @@
+
+
+ Debug
+ AnyCPU
+ C:\New Folder\second-life-viewer\opensim-dailys2\opensim26-05\trunk\bin\
+ 8.0.50727
+ ProjectFiles
+ 0
+
+
+
+
diff --git a/OpenGridServices/OpenGrid.Framework.Data.MySQL/OpenGrid.Framework.Data.MySQL.dll.build b/OpenGridServices/OpenGrid.Framework.Data.MySQL/OpenGrid.Framework.Data.MySQL.dll.build
new file mode 100644
index 0000000..84d3d56
--- /dev/null
+++ b/OpenGridServices/OpenGrid.Framework.Data.MySQL/OpenGrid.Framework.Data.MySQL.dll.build
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenGridServices/OpenGrid.Framework.Data.MySQL/Properties/AssemblyInfo.cs b/OpenGridServices/OpenGrid.Framework.Data.MySQL/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..0bfd1d6
--- /dev/null
+++ b/OpenGridServices/OpenGrid.Framework.Data.MySQL/Properties/AssemblyInfo.cs
@@ -0,0 +1,35 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("OpenGrid.Framework.Data.MySQL")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("OpenGrid.Framework.Data.MySQL")]
+[assembly: AssemblyCopyright("Copyright © 2007")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("e49826b2-dcef-41be-a5bd-596733fa3304")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
--
cgit v1.1