From 16fa7f516a484e9f21fac34262214b3d9d761823 Mon Sep 17 00:00:00 2001
From: Mike Mazur
Date: Mon, 16 Feb 2009 02:25:44 +0000
Subject: Converted to Linux newlines.
---
.../Plugins/OpenSim/OpenSimAssetFrontendPlugin.cs | 480 ++++++-------
.../Plugins/OpenSim/OpenSimAssetStoragePlugin.cs | 740 ++++++++++-----------
2 files changed, 610 insertions(+), 610 deletions(-)
(limited to 'OpenSim/Grid/AssetInventoryServer/Plugins')
diff --git a/OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/OpenSimAssetFrontendPlugin.cs b/OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/OpenSimAssetFrontendPlugin.cs
index e76c8ee..1abd3f5 100644
--- a/OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/OpenSimAssetFrontendPlugin.cs
+++ b/OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/OpenSimAssetFrontendPlugin.cs
@@ -1,240 +1,240 @@
-/*
- * Copyright (c) 2008 Intel Corporation
- * All rights reserved.
- * 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 Intel Corporation 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 COPYRIGHT HOLDERS AND CONTRIBUTORS
- * ``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 INTEL OR ITS
- * 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.Net;
-using System.IO;
-using System.Xml;
-using ExtensionLoader;
-using OpenMetaverse;
-using HttpServer;
-using OpenSim.Framework;
-
-namespace OpenSim.Grid.AssetInventoryServer.Plugins
-{
- public class OpenSimAssetFrontendPlugin : IAssetInventoryServerPlugin
- {
- AssetInventoryServer server;
-
- public OpenSimAssetFrontendPlugin()
- {
- }
-
- #region IPlugin implementation
-
- public void Initialise(AssetInventoryServer server)
- {
- this.server = server;
-
- // Asset request
- server.HttpServer.AddHandler("get", null, @"^/assets/", AssetRequestHandler);
-
- // Asset creation
- server.HttpServer.AddHandler("post", null, @"^/assets/", AssetPostHandler);
- }
-
- ///
- /// Initialises asset interface
- ///
- public void Initialise()
- {
- Logger.Log.InfoFormat("[ASSET]: {0} cannot be default-initialized!", Name);
- throw new PluginNotInitialisedException(Name);
- }
-
- public void Dispose()
- {
- }
-
- public string Version
- {
- // TODO: this should be something meaningful and not hardcoded?
- get { return "0.1"; }
- }
-
- public string Name
- {
- get { return "AssetInventoryServer OpenSim asset frontend"; }
- }
-
- #endregion IPlugin implementation
-
- bool AssetRequestHandler(IHttpClientContext client, IHttpRequest request, IHttpResponse response)
- {
- UUID assetID;
- // Split the URL up to get the asset ID out
- string[] rawUrl = request.Uri.PathAndQuery.Split('/');
-
- if (rawUrl.Length >= 3 && rawUrl[2].Length >= 36 && UUID.TryParse(rawUrl[2].Substring(0, 36), out assetID))
- {
- Metadata metadata;
- byte[] assetData;
- BackendResponse dataResponse;
-
- if ((dataResponse = server.StorageProvider.TryFetchDataMetadata(assetID, out metadata, out assetData)) == BackendResponse.Success)
- {
- MemoryStream stream = new MemoryStream();
-
- XmlWriterSettings settings = new XmlWriterSettings();
- settings.Indent = true;
- XmlWriter writer = XmlWriter.Create(stream, settings);
-
- writer.WriteStartDocument();
- writer.WriteStartElement("AssetBase");
- writer.WriteAttributeString("xmlns", "xsi", null, "http://www.w3.org/2001/XMLSchema-instance");
- writer.WriteAttributeString("xmlns", "xsd", null, "http://www.w3.org/2001/XMLSchema");
- writer.WriteStartElement("FullID");
- writer.WriteStartElement("Guid");
- writer.WriteString(assetID.ToString());
- writer.WriteEndElement();
- writer.WriteEndElement();
- writer.WriteStartElement("ID");
- writer.WriteString(assetID.ToString());
- writer.WriteEndElement();
- writer.WriteStartElement("Data");
- writer.WriteBase64(assetData, 0, assetData.Length);
- writer.WriteEndElement();
- writer.WriteStartElement("Type");
- writer.WriteValue(Utils.ContentTypeToSLAssetType(metadata.ContentType));
- writer.WriteEndElement();
- writer.WriteStartElement("Name");
- writer.WriteString(metadata.Name);
- writer.WriteEndElement();
- writer.WriteStartElement("Description");
- writer.WriteString(metadata.Description);
- writer.WriteEndElement();
- writer.WriteStartElement("Local");
- writer.WriteValue(false);
- writer.WriteEndElement();
- writer.WriteStartElement("Temporary");
- writer.WriteValue(metadata.Temporary);
- writer.WriteEndElement();
- writer.WriteEndElement();
- writer.WriteEndDocument();
-
- writer.Flush();
- byte[] buffer = stream.GetBuffer();
-
- response.Status = HttpStatusCode.OK;
- response.ContentType = "application/xml";
- response.ContentLength = stream.Length;
- response.Body.Write(buffer, 0, (int)stream.Length);
- response.Body.Flush();
- }
- else
- {
- Logger.Log.WarnFormat("Failed to fetch asset data or metadata for {0}: {1}", assetID, dataResponse);
- response.Status = HttpStatusCode.NotFound;
- }
- }
- else
- {
- Logger.Log.Warn("Unrecognized OpenSim asset request: " + request.Uri.PathAndQuery);
- }
-
- return true;
- }
-
- bool AssetPostHandler(IHttpClientContext client, IHttpRequest request, IHttpResponse response)
- {
- byte[] assetData = null;
- Metadata metadata = new Metadata();
-
- Logger.Log.Debug("Handling OpenSim asset upload");
-
- try
- {
- using (XmlReader reader = XmlReader.Create(request.Body))
- {
- reader.MoveToContent();
- reader.ReadStartElement("AssetBase");
-
- reader.ReadStartElement("FullID");
- UUID.TryParse(reader.ReadElementContentAsString("Guid", String.Empty), out metadata.ID);
- reader.ReadEndElement();
- reader.ReadStartElement("ID");
- reader.Skip();
- reader.ReadEndElement();
-
- // HACK: Broken on Mono. https://bugzilla.novell.com/show_bug.cgi?id=464229
- //int readBytes = 0;
- //byte[] buffer = new byte[1024];
- //MemoryStream stream = new MemoryStream();
- //BinaryWriter writer = new BinaryWriter(stream);
- //while ((readBytes = reader.ReadElementContentAsBase64(buffer, 0, buffer.Length)) > 0)
- // writer.Write(buffer, 0, readBytes);
- //writer.Flush();
- //assetData = stream.GetBuffer();
- //Array.Resize(ref assetData, (int)stream.Length);
-
- assetData = Convert.FromBase64String(reader.ReadElementContentAsString());
-
- int type;
- Int32.TryParse(reader.ReadElementContentAsString("Type", String.Empty), out type);
- metadata.ContentType = Utils.SLAssetTypeToContentType(type);
- metadata.Name = reader.ReadElementContentAsString("Name", String.Empty);
- metadata.Description = reader.ReadElementContentAsString("Description", String.Empty);
- Boolean.TryParse(reader.ReadElementContentAsString("Local", String.Empty), out metadata.Temporary);
- Boolean.TryParse(reader.ReadElementContentAsString("Temporary", String.Empty), out metadata.Temporary);
-
- reader.ReadEndElement();
- }
-
- if (assetData != null && assetData.Length > 0)
- {
- metadata.SHA1 = OpenMetaverse.Utils.SHA1(assetData);
- metadata.CreationDate = DateTime.Now;
-
- BackendResponse storageResponse = server.StorageProvider.TryCreateAsset(metadata, assetData);
-
- if (storageResponse == BackendResponse.Success)
- response.Status = HttpStatusCode.Created;
- else if (storageResponse == BackendResponse.NotFound)
- response.Status = HttpStatusCode.NotFound;
- else
- response.Status = HttpStatusCode.InternalServerError;
- }
- else
- {
- Logger.Log.Warn("AssetPostHandler called with no asset data");
- response.Status = HttpStatusCode.BadRequest;
- }
- }
- catch (Exception ex)
- {
- Logger.Log.Warn("Failed to parse POST data (expecting AssetBase): " + ex.Message);
- response.Status = HttpStatusCode.BadRequest;
- }
-
- Logger.Log.Debug("Finished handling OpenSim asset upload, Status: " + response.Status.ToString());
- return true;
- }
- }
-}
+/*
+ * Copyright (c) 2008 Intel Corporation
+ * All rights reserved.
+ * 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 Intel Corporation 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 COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``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 INTEL OR ITS
+ * 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.Net;
+using System.IO;
+using System.Xml;
+using ExtensionLoader;
+using OpenMetaverse;
+using HttpServer;
+using OpenSim.Framework;
+
+namespace OpenSim.Grid.AssetInventoryServer.Plugins
+{
+ public class OpenSimAssetFrontendPlugin : IAssetInventoryServerPlugin
+ {
+ AssetInventoryServer server;
+
+ public OpenSimAssetFrontendPlugin()
+ {
+ }
+
+ #region IPlugin implementation
+
+ public void Initialise(AssetInventoryServer server)
+ {
+ this.server = server;
+
+ // Asset request
+ server.HttpServer.AddHandler("get", null, @"^/assets/", AssetRequestHandler);
+
+ // Asset creation
+ server.HttpServer.AddHandler("post", null, @"^/assets/", AssetPostHandler);
+ }
+
+ ///
+ /// Initialises asset interface
+ ///
+ public void Initialise()
+ {
+ Logger.Log.InfoFormat("[ASSET]: {0} cannot be default-initialized!", Name);
+ throw new PluginNotInitialisedException(Name);
+ }
+
+ public void Dispose()
+ {
+ }
+
+ public string Version
+ {
+ // TODO: this should be something meaningful and not hardcoded?
+ get { return "0.1"; }
+ }
+
+ public string Name
+ {
+ get { return "AssetInventoryServer OpenSim asset frontend"; }
+ }
+
+ #endregion IPlugin implementation
+
+ bool AssetRequestHandler(IHttpClientContext client, IHttpRequest request, IHttpResponse response)
+ {
+ UUID assetID;
+ // Split the URL up to get the asset ID out
+ string[] rawUrl = request.Uri.PathAndQuery.Split('/');
+
+ if (rawUrl.Length >= 3 && rawUrl[2].Length >= 36 && UUID.TryParse(rawUrl[2].Substring(0, 36), out assetID))
+ {
+ Metadata metadata;
+ byte[] assetData;
+ BackendResponse dataResponse;
+
+ if ((dataResponse = server.StorageProvider.TryFetchDataMetadata(assetID, out metadata, out assetData)) == BackendResponse.Success)
+ {
+ MemoryStream stream = new MemoryStream();
+
+ XmlWriterSettings settings = new XmlWriterSettings();
+ settings.Indent = true;
+ XmlWriter writer = XmlWriter.Create(stream, settings);
+
+ writer.WriteStartDocument();
+ writer.WriteStartElement("AssetBase");
+ writer.WriteAttributeString("xmlns", "xsi", null, "http://www.w3.org/2001/XMLSchema-instance");
+ writer.WriteAttributeString("xmlns", "xsd", null, "http://www.w3.org/2001/XMLSchema");
+ writer.WriteStartElement("FullID");
+ writer.WriteStartElement("Guid");
+ writer.WriteString(assetID.ToString());
+ writer.WriteEndElement();
+ writer.WriteEndElement();
+ writer.WriteStartElement("ID");
+ writer.WriteString(assetID.ToString());
+ writer.WriteEndElement();
+ writer.WriteStartElement("Data");
+ writer.WriteBase64(assetData, 0, assetData.Length);
+ writer.WriteEndElement();
+ writer.WriteStartElement("Type");
+ writer.WriteValue(Utils.ContentTypeToSLAssetType(metadata.ContentType));
+ writer.WriteEndElement();
+ writer.WriteStartElement("Name");
+ writer.WriteString(metadata.Name);
+ writer.WriteEndElement();
+ writer.WriteStartElement("Description");
+ writer.WriteString(metadata.Description);
+ writer.WriteEndElement();
+ writer.WriteStartElement("Local");
+ writer.WriteValue(false);
+ writer.WriteEndElement();
+ writer.WriteStartElement("Temporary");
+ writer.WriteValue(metadata.Temporary);
+ writer.WriteEndElement();
+ writer.WriteEndElement();
+ writer.WriteEndDocument();
+
+ writer.Flush();
+ byte[] buffer = stream.GetBuffer();
+
+ response.Status = HttpStatusCode.OK;
+ response.ContentType = "application/xml";
+ response.ContentLength = stream.Length;
+ response.Body.Write(buffer, 0, (int)stream.Length);
+ response.Body.Flush();
+ }
+ else
+ {
+ Logger.Log.WarnFormat("Failed to fetch asset data or metadata for {0}: {1}", assetID, dataResponse);
+ response.Status = HttpStatusCode.NotFound;
+ }
+ }
+ else
+ {
+ Logger.Log.Warn("Unrecognized OpenSim asset request: " + request.Uri.PathAndQuery);
+ }
+
+ return true;
+ }
+
+ bool AssetPostHandler(IHttpClientContext client, IHttpRequest request, IHttpResponse response)
+ {
+ byte[] assetData = null;
+ Metadata metadata = new Metadata();
+
+ Logger.Log.Debug("Handling OpenSim asset upload");
+
+ try
+ {
+ using (XmlReader reader = XmlReader.Create(request.Body))
+ {
+ reader.MoveToContent();
+ reader.ReadStartElement("AssetBase");
+
+ reader.ReadStartElement("FullID");
+ UUID.TryParse(reader.ReadElementContentAsString("Guid", String.Empty), out metadata.ID);
+ reader.ReadEndElement();
+ reader.ReadStartElement("ID");
+ reader.Skip();
+ reader.ReadEndElement();
+
+ // HACK: Broken on Mono. https://bugzilla.novell.com/show_bug.cgi?id=464229
+ //int readBytes = 0;
+ //byte[] buffer = new byte[1024];
+ //MemoryStream stream = new MemoryStream();
+ //BinaryWriter writer = new BinaryWriter(stream);
+ //while ((readBytes = reader.ReadElementContentAsBase64(buffer, 0, buffer.Length)) > 0)
+ // writer.Write(buffer, 0, readBytes);
+ //writer.Flush();
+ //assetData = stream.GetBuffer();
+ //Array.Resize(ref assetData, (int)stream.Length);
+
+ assetData = Convert.FromBase64String(reader.ReadElementContentAsString());
+
+ int type;
+ Int32.TryParse(reader.ReadElementContentAsString("Type", String.Empty), out type);
+ metadata.ContentType = Utils.SLAssetTypeToContentType(type);
+ metadata.Name = reader.ReadElementContentAsString("Name", String.Empty);
+ metadata.Description = reader.ReadElementContentAsString("Description", String.Empty);
+ Boolean.TryParse(reader.ReadElementContentAsString("Local", String.Empty), out metadata.Temporary);
+ Boolean.TryParse(reader.ReadElementContentAsString("Temporary", String.Empty), out metadata.Temporary);
+
+ reader.ReadEndElement();
+ }
+
+ if (assetData != null && assetData.Length > 0)
+ {
+ metadata.SHA1 = OpenMetaverse.Utils.SHA1(assetData);
+ metadata.CreationDate = DateTime.Now;
+
+ BackendResponse storageResponse = server.StorageProvider.TryCreateAsset(metadata, assetData);
+
+ if (storageResponse == BackendResponse.Success)
+ response.Status = HttpStatusCode.Created;
+ else if (storageResponse == BackendResponse.NotFound)
+ response.Status = HttpStatusCode.NotFound;
+ else
+ response.Status = HttpStatusCode.InternalServerError;
+ }
+ else
+ {
+ Logger.Log.Warn("AssetPostHandler called with no asset data");
+ response.Status = HttpStatusCode.BadRequest;
+ }
+ }
+ catch (Exception ex)
+ {
+ Logger.Log.Warn("Failed to parse POST data (expecting AssetBase): " + ex.Message);
+ response.Status = HttpStatusCode.BadRequest;
+ }
+
+ Logger.Log.Debug("Finished handling OpenSim asset upload, Status: " + response.Status.ToString());
+ return true;
+ }
+ }
+}
diff --git a/OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/OpenSimAssetStoragePlugin.cs b/OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/OpenSimAssetStoragePlugin.cs
index 148b401..a5e4c95 100644
--- a/OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/OpenSimAssetStoragePlugin.cs
+++ b/OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/OpenSimAssetStoragePlugin.cs
@@ -1,370 +1,370 @@
-/*
- * Copyright (c) 2008 Intel Corporation
- * All rights reserved.
- * 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 Intel Corporation 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 COPYRIGHT HOLDERS AND CONTRIBUTORS
- * ``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 INTEL OR ITS
- * 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.Net;
-using System.Data;
-using MySql.Data.MySqlClient;
-using ExtensionLoader;
-using ExtensionLoader.Config;
-using OpenMetaverse;
-using OpenMetaverse.StructuredData;
-using OpenSim.Framework;
-using OpenSim.Grid.AssetInventoryServer.Extensions;
-
-namespace OpenSim.Grid.AssetInventoryServer.Plugins
-{
- public class OpenSimAssetStoragePlugin : IAssetStorageProvider
- {
- const string EXTENSION_NAME = "OpenSimAssetStorage"; // Used in metrics reporting
-
- private AssetInventoryServer server;
- private IAssetProviderPlugin m_assetProvider;
-
- public OpenSimAssetStoragePlugin()
- {
- }
-
- #region IAssetStorageProvider implementation
-
- public BackendResponse TryFetchMetadata(UUID assetID, out Metadata metadata)
- {
- metadata = null;
- BackendResponse ret;
-
- using (MySqlConnection dbConnection = new MySqlConnection(DBConnString.GetConnectionString(server.ConfigFile)))
- {
- IDataReader reader;
-
- try
- {
- dbConnection.Open();
-
- IDbCommand command = dbConnection.CreateCommand();
- command.CommandText = String.Format("SELECT name,description,assetType,temporary FROM assets WHERE id='{0}'", assetID.ToString());
- reader = command.ExecuteReader();
-
- if (reader.Read())
- {
- metadata = new Metadata();
- metadata.CreationDate = OpenMetaverse.Utils.Epoch;
- metadata.SHA1 = null;
- metadata.ID = assetID;
- metadata.Name = reader.GetString(0);
- metadata.Description = reader.GetString(1);
- metadata.ContentType = Utils.SLAssetTypeToContentType(reader.GetInt32(2));
- metadata.Temporary = reader.GetBoolean(3);
-
- ret = BackendResponse.Success;
- }
- else
- {
- ret = BackendResponse.NotFound;
- }
- }
- catch (MySqlException ex)
- {
- Logger.Log.Error("Connection to MySQL backend failed: " + ex.Message);
- ret = BackendResponse.Failure;
- }
- }
-
- server.MetricsProvider.LogAssetMetadataFetch(EXTENSION_NAME, ret, assetID, DateTime.Now);
- return ret;
- }
-
- public BackendResponse TryFetchData(UUID assetID, out byte[] assetData)
- {
- assetData = null;
- BackendResponse ret;
-
- using (MySqlConnection dbConnection = new MySqlConnection(DBConnString.GetConnectionString(server.ConfigFile)))
- {
- IDataReader reader;
-
- try
- {
- dbConnection.Open();
-
- IDbCommand command = dbConnection.CreateCommand();
- command.CommandText = String.Format("SELECT data FROM assets WHERE id='{0}'", assetID.ToString());
- reader = command.ExecuteReader();
-
- if (reader.Read())
- {
- assetData = (byte[])reader.GetValue(0);
- ret = BackendResponse.Success;
- }
- else
- {
- ret = BackendResponse.NotFound;
- }
- }
- catch (MySqlException ex)
- {
- Logger.Log.Error("Connection to MySQL backend failed: " + ex.Message);
- ret = BackendResponse.Failure;
- }
- }
-
- server.MetricsProvider.LogAssetDataFetch(EXTENSION_NAME, ret, assetID, (assetData != null ? assetData.Length : 0), DateTime.Now);
- return ret;
- }
-
- public BackendResponse TryFetchDataMetadata(UUID assetID, out Metadata metadata, out byte[] assetData)
- {
- metadata = null;
- assetData = null;
- //BackendResponse ret;
-
- AssetBase asset_base = m_assetProvider.FetchAsset(assetID);
-
- if (asset_base != null)
- {
- metadata = new Metadata();
- metadata.CreationDate = OpenMetaverse.Utils.Epoch;
- metadata.SHA1 = null;
- metadata.Name = asset_base.Name;
- metadata.Description = asset_base.Description;
- metadata.ContentType = Utils.SLAssetTypeToContentType(asset_base.Type);
- metadata.Temporary = asset_base.Temporary;
-
- assetData = asset_base.Data;
- }
- else return BackendResponse.NotFound;
-
- return BackendResponse.Success;
-
- //using (MySqlConnection dbConnection = new MySqlConnection(DBConnString.GetConnectionString(server.ConfigFile)))
- //{
- // IDataReader reader;
-
- // try
- // {
- // dbConnection.Open();
-
- // IDbCommand command = dbConnection.CreateCommand();
- // command.CommandText = String.Format("SELECT name,description,assetType,temporary,data FROM assets WHERE id='{0}'", assetID.ToString());
- // reader = command.ExecuteReader();
-
- // if (reader.Read())
- // {
- // metadata = new Metadata();
- // metadata.CreationDate = OpenMetaverse.Utils.Epoch;
- // metadata.SHA1 = null;
- // metadata.ID = assetID;
- // metadata.Name = reader.GetString(0);
- // metadata.Description = reader.GetString(1);
- // metadata.ContentType = Utils.SLAssetTypeToContentType(reader.GetInt32(2));
- // metadata.Temporary = reader.GetBoolean(3);
-
- // assetData = (byte[])reader.GetValue(4);
-
- // ret = BackendResponse.Success;
- // }
- // else
- // {
- // ret = BackendResponse.NotFound;
- // }
- // }
- // catch (MySqlException ex)
- // {
- // Logger.Log.Error("Connection to MySQL backend failed: " + ex.Message);
- // ret = BackendResponse.Failure;
- // }
- //}
-
- //server.MetricsProvider.LogAssetMetadataFetch(EXTENSION_NAME, ret, assetID, DateTime.Now);
- //server.MetricsProvider.LogAssetDataFetch(EXTENSION_NAME, ret, assetID, (assetData != null ? assetData.Length : 0), DateTime.Now);
- //return ret;
- }
-
- public BackendResponse TryCreateAsset(Metadata metadata, byte[] assetData, out UUID assetID)
- {
- assetID = metadata.ID = UUID.Random();
- return TryCreateAsset(metadata, assetData);
- }
-
- public BackendResponse TryCreateAsset(Metadata metadata, byte[] assetData)
- {
- BackendResponse ret;
-
- using (MySqlConnection dbConnection = new MySqlConnection(DBConnString.GetConnectionString(server.ConfigFile)))
- {
- try
- {
- dbConnection.Open();
-
- MySqlCommand command = new MySqlCommand(
- "REPLACE INTO assets (name,description,assetType,local,temporary,data,id) VALUES " +
- "(?name,?description,?assetType,?local,?temporary,?data,?id)", dbConnection);
-
- command.Parameters.AddWithValue("?name", metadata.Name);
- command.Parameters.AddWithValue("?description", metadata.Description);
- command.Parameters.AddWithValue("?assetType", Utils.ContentTypeToSLAssetType(metadata.ContentType));
- command.Parameters.AddWithValue("?local", 0);
- command.Parameters.AddWithValue("?temporary", metadata.Temporary);
- command.Parameters.AddWithValue("?data", assetData);
- command.Parameters.AddWithValue("?id", metadata.ID.ToString());
-
- int rowsAffected = command.ExecuteNonQuery();
- if (rowsAffected == 1)
- {
- ret = BackendResponse.Success;
- }
- else if (rowsAffected == 2)
- {
- Logger.Log.Info("Replaced asset " + metadata.ID.ToString());
- ret = BackendResponse.Success;
- }
- else
- {
- Logger.Log.ErrorFormat("MySQL REPLACE query affected {0} rows", rowsAffected);
- ret = BackendResponse.Failure;
- }
- }
- catch (MySqlException ex)
- {
- Logger.Log.Error("Connection to MySQL backend failed: " + ex.Message);
- ret = BackendResponse.Failure;
- }
- }
-
- server.MetricsProvider.LogAssetCreate(EXTENSION_NAME, ret, metadata.ID, assetData.Length, DateTime.Now);
- return ret;
- }
-
- public int ForEach(Action action, int start, int count)
- {
- int rowCount = 0;
-
- using (MySqlConnection dbConnection = new MySqlConnection(DBConnString.GetConnectionString(server.ConfigFile)))
- {
- MySqlDataReader reader;
-
- try
- {
- dbConnection.Open();
-
- MySqlCommand command = dbConnection.CreateCommand();
- command.CommandText = String.Format("SELECT name,description,assetType,temporary,data,id FROM assets LIMIT {0}, {1}",
- start, count);
- reader = command.ExecuteReader();
- }
- catch (MySqlException ex)
- {
- Logger.Log.Error("Connection to MySQL backend failed: " + ex.Message);
- return 0;
- }
-
- while (reader.Read())
- {
- Metadata metadata = new Metadata();
- metadata.CreationDate = OpenMetaverse.Utils.Epoch;
- metadata.Description = reader.GetString(1);
- metadata.ID = UUID.Parse(reader.GetString(5));
- metadata.Name = reader.GetString(0);
- metadata.SHA1 = OpenMetaverse.Utils.SHA1((byte[])reader.GetValue(4));
- metadata.Temporary = reader.GetBoolean(3);
- metadata.ContentType = Utils.SLAssetTypeToContentType(reader.GetInt32(2));
-
- action(metadata);
- ++rowCount;
- }
-
- reader.Close();
- }
-
- return rowCount;
- }
-
- #endregion IAssetStorageProvider implementation
-
- #region IPlugin implementation
-
- public void Initialise(AssetInventoryServer server)
- {
- this.server = server;
-
- try
- {
- m_assetProvider = LoadDatabasePlugin("OpenSim.Data.MySQL.dll", server.ConfigFile.Configs["MySQL"].GetString("database_connect", null));
- if (m_assetProvider == null)
- {
- Logger.Log.Error("[ASSET]: Failed to load a database plugin, server halting.");
- Environment.Exit(-1);
- }
- else
- Logger.Log.InfoFormat("[ASSET]: Loaded storage backend: {0}", Version);
- }
- catch (Exception e)
- {
- Logger.Log.WarnFormat("[ASSET]: Failure loading data plugin: {0}", e.ToString());
- }
- }
-
- ///
- /// Initialises asset interface
- ///
- public void Initialise()
- {
- Logger.Log.InfoFormat("[ASSET]: {0} cannot be default-initialized!", Name);
- throw new PluginNotInitialisedException(Name);
- }
-
- public void Dispose()
- {
- }
-
- public string Version
- {
- get { return m_assetProvider.Version; }
- }
-
- public string Name
- {
- get { return "AssetInventoryServer OpenSim asset storage provider"; }
- }
-
- #endregion IPlugin implementation
-
- private IAssetProviderPlugin LoadDatabasePlugin(string provider, string connect)
- {
- PluginLoader loader = new PluginLoader(new AssetDataInitialiser(connect));
-
- // Loader will try to load all providers (MySQL, MSSQL, etc)
- // unless it is constrainted to the correct "Provider" entry in the addin.xml
- loader.Add("/OpenSim/AssetData", new PluginProviderFilter (provider));
- loader.Load();
-
- return loader.Plugin;
- }
- }
-}
+/*
+ * Copyright (c) 2008 Intel Corporation
+ * All rights reserved.
+ * 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 Intel Corporation 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 COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``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 INTEL OR ITS
+ * 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.Net;
+using System.Data;
+using MySql.Data.MySqlClient;
+using ExtensionLoader;
+using ExtensionLoader.Config;
+using OpenMetaverse;
+using OpenMetaverse.StructuredData;
+using OpenSim.Framework;
+using OpenSim.Grid.AssetInventoryServer.Extensions;
+
+namespace OpenSim.Grid.AssetInventoryServer.Plugins
+{
+ public class OpenSimAssetStoragePlugin : IAssetStorageProvider
+ {
+ const string EXTENSION_NAME = "OpenSimAssetStorage"; // Used in metrics reporting
+
+ private AssetInventoryServer server;
+ private IAssetProviderPlugin m_assetProvider;
+
+ public OpenSimAssetStoragePlugin()
+ {
+ }
+
+ #region IAssetStorageProvider implementation
+
+ public BackendResponse TryFetchMetadata(UUID assetID, out Metadata metadata)
+ {
+ metadata = null;
+ BackendResponse ret;
+
+ using (MySqlConnection dbConnection = new MySqlConnection(DBConnString.GetConnectionString(server.ConfigFile)))
+ {
+ IDataReader reader;
+
+ try
+ {
+ dbConnection.Open();
+
+ IDbCommand command = dbConnection.CreateCommand();
+ command.CommandText = String.Format("SELECT name,description,assetType,temporary FROM assets WHERE id='{0}'", assetID.ToString());
+ reader = command.ExecuteReader();
+
+ if (reader.Read())
+ {
+ metadata = new Metadata();
+ metadata.CreationDate = OpenMetaverse.Utils.Epoch;
+ metadata.SHA1 = null;
+ metadata.ID = assetID;
+ metadata.Name = reader.GetString(0);
+ metadata.Description = reader.GetString(1);
+ metadata.ContentType = Utils.SLAssetTypeToContentType(reader.GetInt32(2));
+ metadata.Temporary = reader.GetBoolean(3);
+
+ ret = BackendResponse.Success;
+ }
+ else
+ {
+ ret = BackendResponse.NotFound;
+ }
+ }
+ catch (MySqlException ex)
+ {
+ Logger.Log.Error("Connection to MySQL backend failed: " + ex.Message);
+ ret = BackendResponse.Failure;
+ }
+ }
+
+ server.MetricsProvider.LogAssetMetadataFetch(EXTENSION_NAME, ret, assetID, DateTime.Now);
+ return ret;
+ }
+
+ public BackendResponse TryFetchData(UUID assetID, out byte[] assetData)
+ {
+ assetData = null;
+ BackendResponse ret;
+
+ using (MySqlConnection dbConnection = new MySqlConnection(DBConnString.GetConnectionString(server.ConfigFile)))
+ {
+ IDataReader reader;
+
+ try
+ {
+ dbConnection.Open();
+
+ IDbCommand command = dbConnection.CreateCommand();
+ command.CommandText = String.Format("SELECT data FROM assets WHERE id='{0}'", assetID.ToString());
+ reader = command.ExecuteReader();
+
+ if (reader.Read())
+ {
+ assetData = (byte[])reader.GetValue(0);
+ ret = BackendResponse.Success;
+ }
+ else
+ {
+ ret = BackendResponse.NotFound;
+ }
+ }
+ catch (MySqlException ex)
+ {
+ Logger.Log.Error("Connection to MySQL backend failed: " + ex.Message);
+ ret = BackendResponse.Failure;
+ }
+ }
+
+ server.MetricsProvider.LogAssetDataFetch(EXTENSION_NAME, ret, assetID, (assetData != null ? assetData.Length : 0), DateTime.Now);
+ return ret;
+ }
+
+ public BackendResponse TryFetchDataMetadata(UUID assetID, out Metadata metadata, out byte[] assetData)
+ {
+ metadata = null;
+ assetData = null;
+ //BackendResponse ret;
+
+ AssetBase asset_base = m_assetProvider.FetchAsset(assetID);
+
+ if (asset_base != null)
+ {
+ metadata = new Metadata();
+ metadata.CreationDate = OpenMetaverse.Utils.Epoch;
+ metadata.SHA1 = null;
+ metadata.Name = asset_base.Name;
+ metadata.Description = asset_base.Description;
+ metadata.ContentType = Utils.SLAssetTypeToContentType(asset_base.Type);
+ metadata.Temporary = asset_base.Temporary;
+
+ assetData = asset_base.Data;
+ }
+ else return BackendResponse.NotFound;
+
+ return BackendResponse.Success;
+
+ //using (MySqlConnection dbConnection = new MySqlConnection(DBConnString.GetConnectionString(server.ConfigFile)))
+ //{
+ // IDataReader reader;
+
+ // try
+ // {
+ // dbConnection.Open();
+
+ // IDbCommand command = dbConnection.CreateCommand();
+ // command.CommandText = String.Format("SELECT name,description,assetType,temporary,data FROM assets WHERE id='{0}'", assetID.ToString());
+ // reader = command.ExecuteReader();
+
+ // if (reader.Read())
+ // {
+ // metadata = new Metadata();
+ // metadata.CreationDate = OpenMetaverse.Utils.Epoch;
+ // metadata.SHA1 = null;
+ // metadata.ID = assetID;
+ // metadata.Name = reader.GetString(0);
+ // metadata.Description = reader.GetString(1);
+ // metadata.ContentType = Utils.SLAssetTypeToContentType(reader.GetInt32(2));
+ // metadata.Temporary = reader.GetBoolean(3);
+
+ // assetData = (byte[])reader.GetValue(4);
+
+ // ret = BackendResponse.Success;
+ // }
+ // else
+ // {
+ // ret = BackendResponse.NotFound;
+ // }
+ // }
+ // catch (MySqlException ex)
+ // {
+ // Logger.Log.Error("Connection to MySQL backend failed: " + ex.Message);
+ // ret = BackendResponse.Failure;
+ // }
+ //}
+
+ //server.MetricsProvider.LogAssetMetadataFetch(EXTENSION_NAME, ret, assetID, DateTime.Now);
+ //server.MetricsProvider.LogAssetDataFetch(EXTENSION_NAME, ret, assetID, (assetData != null ? assetData.Length : 0), DateTime.Now);
+ //return ret;
+ }
+
+ public BackendResponse TryCreateAsset(Metadata metadata, byte[] assetData, out UUID assetID)
+ {
+ assetID = metadata.ID = UUID.Random();
+ return TryCreateAsset(metadata, assetData);
+ }
+
+ public BackendResponse TryCreateAsset(Metadata metadata, byte[] assetData)
+ {
+ BackendResponse ret;
+
+ using (MySqlConnection dbConnection = new MySqlConnection(DBConnString.GetConnectionString(server.ConfigFile)))
+ {
+ try
+ {
+ dbConnection.Open();
+
+ MySqlCommand command = new MySqlCommand(
+ "REPLACE INTO assets (name,description,assetType,local,temporary,data,id) VALUES " +
+ "(?name,?description,?assetType,?local,?temporary,?data,?id)", dbConnection);
+
+ command.Parameters.AddWithValue("?name", metadata.Name);
+ command.Parameters.AddWithValue("?description", metadata.Description);
+ command.Parameters.AddWithValue("?assetType", Utils.ContentTypeToSLAssetType(metadata.ContentType));
+ command.Parameters.AddWithValue("?local", 0);
+ command.Parameters.AddWithValue("?temporary", metadata.Temporary);
+ command.Parameters.AddWithValue("?data", assetData);
+ command.Parameters.AddWithValue("?id", metadata.ID.ToString());
+
+ int rowsAffected = command.ExecuteNonQuery();
+ if (rowsAffected == 1)
+ {
+ ret = BackendResponse.Success;
+ }
+ else if (rowsAffected == 2)
+ {
+ Logger.Log.Info("Replaced asset " + metadata.ID.ToString());
+ ret = BackendResponse.Success;
+ }
+ else
+ {
+ Logger.Log.ErrorFormat("MySQL REPLACE query affected {0} rows", rowsAffected);
+ ret = BackendResponse.Failure;
+ }
+ }
+ catch (MySqlException ex)
+ {
+ Logger.Log.Error("Connection to MySQL backend failed: " + ex.Message);
+ ret = BackendResponse.Failure;
+ }
+ }
+
+ server.MetricsProvider.LogAssetCreate(EXTENSION_NAME, ret, metadata.ID, assetData.Length, DateTime.Now);
+ return ret;
+ }
+
+ public int ForEach(Action action, int start, int count)
+ {
+ int rowCount = 0;
+
+ using (MySqlConnection dbConnection = new MySqlConnection(DBConnString.GetConnectionString(server.ConfigFile)))
+ {
+ MySqlDataReader reader;
+
+ try
+ {
+ dbConnection.Open();
+
+ MySqlCommand command = dbConnection.CreateCommand();
+ command.CommandText = String.Format("SELECT name,description,assetType,temporary,data,id FROM assets LIMIT {0}, {1}",
+ start, count);
+ reader = command.ExecuteReader();
+ }
+ catch (MySqlException ex)
+ {
+ Logger.Log.Error("Connection to MySQL backend failed: " + ex.Message);
+ return 0;
+ }
+
+ while (reader.Read())
+ {
+ Metadata metadata = new Metadata();
+ metadata.CreationDate = OpenMetaverse.Utils.Epoch;
+ metadata.Description = reader.GetString(1);
+ metadata.ID = UUID.Parse(reader.GetString(5));
+ metadata.Name = reader.GetString(0);
+ metadata.SHA1 = OpenMetaverse.Utils.SHA1((byte[])reader.GetValue(4));
+ metadata.Temporary = reader.GetBoolean(3);
+ metadata.ContentType = Utils.SLAssetTypeToContentType(reader.GetInt32(2));
+
+ action(metadata);
+ ++rowCount;
+ }
+
+ reader.Close();
+ }
+
+ return rowCount;
+ }
+
+ #endregion IAssetStorageProvider implementation
+
+ #region IPlugin implementation
+
+ public void Initialise(AssetInventoryServer server)
+ {
+ this.server = server;
+
+ try
+ {
+ m_assetProvider = LoadDatabasePlugin("OpenSim.Data.MySQL.dll", server.ConfigFile.Configs["MySQL"].GetString("database_connect", null));
+ if (m_assetProvider == null)
+ {
+ Logger.Log.Error("[ASSET]: Failed to load a database plugin, server halting.");
+ Environment.Exit(-1);
+ }
+ else
+ Logger.Log.InfoFormat("[ASSET]: Loaded storage backend: {0}", Version);
+ }
+ catch (Exception e)
+ {
+ Logger.Log.WarnFormat("[ASSET]: Failure loading data plugin: {0}", e.ToString());
+ }
+ }
+
+ ///
+ /// Initialises asset interface
+ ///
+ public void Initialise()
+ {
+ Logger.Log.InfoFormat("[ASSET]: {0} cannot be default-initialized!", Name);
+ throw new PluginNotInitialisedException(Name);
+ }
+
+ public void Dispose()
+ {
+ }
+
+ public string Version
+ {
+ get { return m_assetProvider.Version; }
+ }
+
+ public string Name
+ {
+ get { return "AssetInventoryServer OpenSim asset storage provider"; }
+ }
+
+ #endregion IPlugin implementation
+
+ private IAssetProviderPlugin LoadDatabasePlugin(string provider, string connect)
+ {
+ PluginLoader loader = new PluginLoader(new AssetDataInitialiser(connect));
+
+ // Loader will try to load all providers (MySQL, MSSQL, etc)
+ // unless it is constrainted to the correct "Provider" entry in the addin.xml
+ loader.Add("/OpenSim/AssetData", new PluginProviderFilter (provider));
+ loader.Load();
+
+ return loader.Plugin;
+ }
+ }
+}
--
cgit v1.1