Compare commits
79 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e29b80cd3d | ||
|
|
d926f5b757 | ||
|
|
2cef09e9b6 | ||
|
|
07cb6268d9 | ||
|
|
60cf1d14cd | ||
|
|
fce63e1cfa | ||
|
|
712cee6967 | ||
|
|
c9825a646b | ||
|
|
7e5e5d7eda | ||
|
|
3f2c01c522 | ||
|
|
82685c4117 | ||
|
|
e07ed7b569 | ||
|
|
5b2a0e74ed | ||
|
|
565e72deda | ||
|
|
57f9c35e77 | ||
|
|
91281b2b0b | ||
|
|
acce61c48f | ||
|
|
8b096d9ad8 | ||
|
|
a3eb5bd8ad | ||
|
|
e8272ab138 | ||
|
|
98cef2a961 | ||
|
|
2d065bd327 | ||
|
|
81c484d713 | ||
|
|
335687c846 | ||
|
|
cdbf39ddba | ||
|
|
269e20ca11 | ||
|
|
0bcd3860cf | ||
|
|
94b5ea1b5a | ||
|
|
9106d82382 | ||
|
|
5d3d600b2e | ||
|
|
31a43c7fbc | ||
|
|
82fd8c46ea | ||
|
|
0ce8a5f76a | ||
|
|
34114c4e28 | ||
|
|
f839385af9 | ||
|
|
a6bce45692 | ||
|
|
7615d12148 | ||
|
|
0365fec926 | ||
|
|
53d21bcb50 | ||
|
|
c45392c17e | ||
|
|
7ac437987a | ||
|
|
9e17b07e8b | ||
|
|
8600ea2763 | ||
|
|
cd6fe5c4e6 | ||
|
|
64884bf65c | ||
|
|
c01db95f48 | ||
|
|
3fbadb79ba | ||
|
|
6eeba80d2a | ||
|
|
04431fcb01 | ||
|
|
bbe9af5576 | ||
|
|
6b4e4da89e | ||
|
|
b6e963c830 | ||
|
|
8ea08cf4b4 | ||
|
|
d92fc1dfb3 | ||
|
|
83c018ebcd | ||
|
|
cf763b8306 | ||
|
|
5cda6ab754 | ||
|
|
6f6e05d775 | ||
|
|
c07fdc6ac4 | ||
|
|
2e6f5f6bcd | ||
|
|
705b3fe414 | ||
|
|
55aaea8b91 | ||
|
|
f4e32350ed | ||
|
|
58f5e4b47a | ||
|
|
ddacc87617 | ||
|
|
c5d1d6c47b | ||
|
|
23ebe65add | ||
|
|
c611966828 | ||
|
|
b9fa9a801e | ||
|
|
ec38593674 | ||
|
|
f018047460 | ||
|
|
60a0395837 | ||
|
|
d27ed42897 | ||
|
|
8bdc238ca4 | ||
|
|
6903b60a0f | ||
|
|
46dec8666c | ||
|
|
352774d5bf | ||
|
|
34c0bd212a | ||
|
|
3032b49ec4 |
@@ -121,7 +121,7 @@ namespace OpenSim.Data.Null
|
||||
m_DataByUUID[data.PrincipalID] = data;
|
||||
m_DataByName[data.FirstName + " " + data.LastName] = data;
|
||||
if (data.Data.ContainsKey("Email") && data.Data["Email"] != null && data.Data["Email"] != string.Empty)
|
||||
m_DataByEmail[data.Data["Email"]] = data;
|
||||
m_DataByEmail[data.Data["Email"].ToString()] = data;
|
||||
|
||||
// m_log.DebugFormat("m_DataByUUID count is {0}, m_DataByName count is {1}", m_DataByUUID.Count, m_DataByName.Count);
|
||||
|
||||
@@ -184,8 +184,8 @@ namespace OpenSim.Data.Null
|
||||
m_DataByUUID.Remove(uuid);
|
||||
if (m_DataByName.ContainsKey(account.FirstName + " " + account.LastName))
|
||||
m_DataByName.Remove(account.FirstName + " " + account.LastName);
|
||||
if (account.Data.ContainsKey("Email") && account.Data["Email"] != string.Empty && m_DataByEmail.ContainsKey(account.Data["Email"]))
|
||||
m_DataByEmail.Remove(account.Data["Email"]);
|
||||
if (account.Data.ContainsKey("Email") && account.Data["Email"] != string.Empty && m_DataByEmail.ContainsKey(account.Data["Email"].ToString()))
|
||||
m_DataByEmail.Remove(account.Data["Email"].ToString());
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
290
OpenSim/Data/PGSQL/PGSQLAssetData.cs
Normal file
290
OpenSim/Data/PGSQL/PGSQLAssetData.cs
Normal file
@@ -0,0 +1,290 @@
|
||||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Data;
|
||||
using System.Reflection;
|
||||
using System.Collections.Generic;
|
||||
using OpenMetaverse;
|
||||
using log4net;
|
||||
using OpenSim.Framework;
|
||||
using Npgsql;
|
||||
using NpgsqlTypes;
|
||||
|
||||
namespace OpenSim.Data.PGSQL
|
||||
{
|
||||
/// <summary>
|
||||
/// A PGSQL Interface for the Asset server
|
||||
/// </summary>
|
||||
public class PGSQLAssetData : AssetDataBase
|
||||
{
|
||||
private const string _migrationStore = "AssetStore";
|
||||
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
private long m_ticksToEpoch;
|
||||
/// <summary>
|
||||
/// Database manager
|
||||
/// </summary>
|
||||
private PGSQLManager m_database;
|
||||
private string m_connectionString;
|
||||
|
||||
#region IPlugin Members
|
||||
|
||||
override public void Dispose() { }
|
||||
|
||||
/// <summary>
|
||||
/// <para>Initialises asset interface</para>
|
||||
/// </summary>
|
||||
// [Obsolete("Cannot be default-initialized!")]
|
||||
override public void Initialise()
|
||||
{
|
||||
m_log.Info("[PGSQLAssetData]: " + Name + " cannot be default-initialized!");
|
||||
throw new PluginNotInitialisedException(Name);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initialises asset interface
|
||||
/// </summary>
|
||||
/// <para>
|
||||
/// a string instead of file, if someone writes the support
|
||||
/// </para>
|
||||
/// <param name="connectionString">connect string</param>
|
||||
override public void Initialise(string connectionString)
|
||||
{
|
||||
m_ticksToEpoch = new System.DateTime(1970, 1, 1).Ticks;
|
||||
|
||||
m_database = new PGSQLManager(connectionString);
|
||||
m_connectionString = connectionString;
|
||||
|
||||
//New migration to check for DB changes
|
||||
m_database.CheckMigration(_migrationStore);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Database provider version.
|
||||
/// </summary>
|
||||
override public string Version
|
||||
{
|
||||
get { return m_database.getVersion(); }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The name of this DB provider.
|
||||
/// </summary>
|
||||
override public string Name
|
||||
{
|
||||
get { return "PGSQL Asset storage engine"; }
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region IAssetDataPlugin Members
|
||||
|
||||
/// <summary>
|
||||
/// Fetch Asset from m_database
|
||||
/// </summary>
|
||||
/// <param name="assetID">the asset UUID</param>
|
||||
/// <returns></returns>
|
||||
override public AssetBase GetAsset(UUID assetID)
|
||||
{
|
||||
string sql = "SELECT * FROM assets WHERE id = :id";
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
|
||||
{
|
||||
cmd.Parameters.Add(m_database.CreateParameter("id", assetID));
|
||||
conn.Open();
|
||||
using (NpgsqlDataReader reader = cmd.ExecuteReader())
|
||||
{
|
||||
if (reader.Read())
|
||||
{
|
||||
AssetBase asset = new AssetBase(
|
||||
DBGuid.FromDB(reader["id"]),
|
||||
(string)reader["name"],
|
||||
Convert.ToSByte(reader["assetType"]),
|
||||
reader["creatorid"].ToString()
|
||||
);
|
||||
// Region Main
|
||||
asset.Description = (string)reader["description"];
|
||||
asset.Local = Convert.ToBoolean(reader["local"]);
|
||||
asset.Temporary = Convert.ToBoolean(reader["temporary"]);
|
||||
asset.Flags = (AssetFlags)(Convert.ToInt32(reader["asset_flags"]));
|
||||
asset.Data = (byte[])reader["data"];
|
||||
return asset;
|
||||
}
|
||||
return null; // throw new Exception("No rows to return");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Create asset in m_database
|
||||
/// </summary>
|
||||
/// <param name="asset">the asset</param>
|
||||
override public void StoreAsset(AssetBase asset)
|
||||
{
|
||||
|
||||
string sql =
|
||||
@"UPDATE assets set name = :name, description = :description, assetType = :assetType,
|
||||
local = :local, temporary = :temporary, creatorid = :creatorid, data = :data
|
||||
WHERE id=:id;
|
||||
|
||||
INSERT INTO assets
|
||||
(id, name, description, assetType, local,
|
||||
temporary, create_time, access_time, creatorid, asset_flags, data)
|
||||
Select :id, :name, :description, :assetType, :local,
|
||||
:temporary, :create_time, :access_time, :creatorid, :asset_flags, :data
|
||||
Where not EXISTS(SELECT * FROM assets WHERE id=:id)
|
||||
";
|
||||
|
||||
string assetName = asset.Name;
|
||||
if (asset.Name.Length > 64)
|
||||
{
|
||||
assetName = asset.Name.Substring(0, 64);
|
||||
m_log.WarnFormat(
|
||||
"[ASSET DB]: Name '{0}' for asset {1} truncated from {2} to {3} characters on add",
|
||||
asset.Name, asset.ID, asset.Name.Length, assetName.Length);
|
||||
}
|
||||
|
||||
string assetDescription = asset.Description;
|
||||
if (asset.Description.Length > 64)
|
||||
{
|
||||
assetDescription = asset.Description.Substring(0, 64);
|
||||
m_log.WarnFormat(
|
||||
"[ASSET DB]: Description '{0}' for asset {1} truncated from {2} to {3} characters on add",
|
||||
asset.Description, asset.ID, asset.Description.Length, assetDescription.Length);
|
||||
}
|
||||
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
|
||||
using (NpgsqlCommand command = new NpgsqlCommand(sql, conn))
|
||||
{
|
||||
int now = (int)((System.DateTime.Now.Ticks - m_ticksToEpoch) / 10000000);
|
||||
command.Parameters.Add(m_database.CreateParameter("id", asset.FullID));
|
||||
command.Parameters.Add(m_database.CreateParameter("name", assetName));
|
||||
command.Parameters.Add(m_database.CreateParameter("description", assetDescription));
|
||||
command.Parameters.Add(m_database.CreateParameter("assetType", asset.Type));
|
||||
command.Parameters.Add(m_database.CreateParameter("local", asset.Local));
|
||||
command.Parameters.Add(m_database.CreateParameter("temporary", asset.Temporary));
|
||||
command.Parameters.Add(m_database.CreateParameter("access_time", now));
|
||||
command.Parameters.Add(m_database.CreateParameter("create_time", now));
|
||||
command.Parameters.Add(m_database.CreateParameter("asset_flags", (int)asset.Flags));
|
||||
command.Parameters.Add(m_database.CreateParameter("creatorid", asset.Metadata.CreatorID));
|
||||
command.Parameters.Add(m_database.CreateParameter("data", asset.Data));
|
||||
conn.Open();
|
||||
try
|
||||
{
|
||||
command.ExecuteNonQuery();
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
m_log.Error("[ASSET DB]: Error storing item :" + e.Message + " sql "+sql);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Commented out since currently unused - this probably should be called in GetAsset()
|
||||
// private void UpdateAccessTime(AssetBase asset)
|
||||
// {
|
||||
// using (AutoClosingSqlCommand cmd = m_database.Query("UPDATE assets SET access_time = :access_time WHERE id=:id"))
|
||||
// {
|
||||
// int now = (int)((System.DateTime.Now.Ticks - m_ticksToEpoch) / 10000000);
|
||||
// cmd.Parameters.AddWithValue(":id", asset.FullID.ToString());
|
||||
// cmd.Parameters.AddWithValue(":access_time", now);
|
||||
// try
|
||||
// {
|
||||
// cmd.ExecuteNonQuery();
|
||||
// }
|
||||
// catch (Exception e)
|
||||
// {
|
||||
// m_log.Error(e.ToString());
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
/// <summary>
|
||||
/// Check if asset exist in m_database
|
||||
/// </summary>
|
||||
/// <param name="uuid"></param>
|
||||
/// <returns>true if exist.</returns>
|
||||
override public bool ExistsAsset(UUID uuid)
|
||||
{
|
||||
if (GetAsset(uuid) != null)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns a list of AssetMetadata objects. The list is a subset of
|
||||
/// the entire data set offset by <paramref name="start" /> containing
|
||||
/// <paramref name="count" /> elements.
|
||||
/// </summary>
|
||||
/// <param name="start">The number of results to discard from the total data set.</param>
|
||||
/// <param name="count">The number of rows the returned list should contain.</param>
|
||||
/// <returns>A list of AssetMetadata objects.</returns>
|
||||
public override List<AssetMetadata> FetchAssetMetadataSet(int start, int count)
|
||||
{
|
||||
List<AssetMetadata> retList = new List<AssetMetadata>(count);
|
||||
string sql = @" SELECT id, name, description, assetType, temporary, creatorid
|
||||
FROM assets
|
||||
order by id
|
||||
limit :stop
|
||||
offset :start;";
|
||||
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
|
||||
{
|
||||
cmd.Parameters.Add(m_database.CreateParameter("start", start));
|
||||
cmd.Parameters.Add(m_database.CreateParameter("stop", start + count - 1));
|
||||
conn.Open();
|
||||
using (NpgsqlDataReader reader = cmd.ExecuteReader())
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
AssetMetadata metadata = new AssetMetadata();
|
||||
metadata.FullID = DBGuid.FromDB(reader["id"]);
|
||||
metadata.Name = (string)reader["name"];
|
||||
metadata.Description = (string)reader["description"];
|
||||
metadata.Type = Convert.ToSByte(reader["assetType"]);
|
||||
metadata.Temporary = Convert.ToBoolean(reader["temporary"]);
|
||||
metadata.CreatorID = (string)reader["creatorid"];
|
||||
retList.Add(metadata);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return retList;
|
||||
}
|
||||
|
||||
public override bool Delete(string id)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
229
OpenSim/Data/PGSQL/PGSQLAuthenticationData.cs
Normal file
229
OpenSim/Data/PGSQL/PGSQLAuthenticationData.cs
Normal file
@@ -0,0 +1,229 @@
|
||||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator 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;
|
||||
using System.Collections.Generic;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using System.Data;
|
||||
using Npgsql;
|
||||
using NpgsqlTypes;
|
||||
|
||||
namespace OpenSim.Data.PGSQL
|
||||
{
|
||||
public class PGSQLAuthenticationData : IAuthenticationData
|
||||
{
|
||||
private string m_Realm;
|
||||
private List<string> m_ColumnNames = null;
|
||||
private int m_LastExpire = 0;
|
||||
private string m_ConnectionString;
|
||||
private PGSQLManager m_database;
|
||||
|
||||
public PGSQLAuthenticationData(string connectionString, string realm)
|
||||
{
|
||||
m_Realm = realm;
|
||||
m_ConnectionString = connectionString;
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
|
||||
{
|
||||
conn.Open();
|
||||
Migration m = new Migration(conn, GetType().Assembly, "AuthStore");
|
||||
m_database = new PGSQLManager(m_ConnectionString);
|
||||
m.Update();
|
||||
}
|
||||
}
|
||||
|
||||
public AuthenticationData Get(UUID principalID)
|
||||
{
|
||||
AuthenticationData ret = new AuthenticationData();
|
||||
ret.Data = new Dictionary<string, object>();
|
||||
|
||||
string sql = string.Format("select * from {0} where UUID = :principalID", m_Realm);
|
||||
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
|
||||
{
|
||||
cmd.Parameters.Add(m_database.CreateParameter("principalID", principalID));
|
||||
conn.Open();
|
||||
using (NpgsqlDataReader result = cmd.ExecuteReader())
|
||||
{
|
||||
if (result.Read())
|
||||
{
|
||||
ret.PrincipalID = principalID;
|
||||
|
||||
if (m_ColumnNames == null)
|
||||
{
|
||||
m_ColumnNames = new List<string>();
|
||||
|
||||
DataTable schemaTable = result.GetSchemaTable();
|
||||
foreach (DataRow row in schemaTable.Rows)
|
||||
m_ColumnNames.Add(row["ColumnName"].ToString());
|
||||
}
|
||||
|
||||
foreach (string s in m_ColumnNames)
|
||||
{
|
||||
if (s == "UUID")
|
||||
continue;
|
||||
|
||||
ret.Data[s] = result[s].ToString();
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public bool Store(AuthenticationData data)
|
||||
{
|
||||
if (data.Data.ContainsKey("UUID"))
|
||||
data.Data.Remove("UUID");
|
||||
|
||||
string[] fields = new List<string>(data.Data.Keys).ToArray();
|
||||
StringBuilder updateBuilder = new StringBuilder();
|
||||
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand())
|
||||
{
|
||||
updateBuilder.AppendFormat("update {0} set ", m_Realm);
|
||||
|
||||
bool first = true;
|
||||
foreach (string field in fields)
|
||||
{
|
||||
if (!first)
|
||||
updateBuilder.Append(", ");
|
||||
updateBuilder.AppendFormat("{0} = :{0}",field);
|
||||
|
||||
first = false;
|
||||
cmd.Parameters.Add(m_database.CreateParameter("" + field, data.Data[field]));
|
||||
}
|
||||
|
||||
updateBuilder.Append(" where UUID = :principalID");
|
||||
|
||||
cmd.CommandText = updateBuilder.ToString();
|
||||
cmd.Connection = conn;
|
||||
cmd.Parameters.Add(m_database.CreateParameter("principalID", data.PrincipalID));
|
||||
|
||||
conn.Open();
|
||||
if (cmd.ExecuteNonQuery() < 1)
|
||||
{
|
||||
StringBuilder insertBuilder = new StringBuilder();
|
||||
|
||||
insertBuilder.AppendFormat("insert into {0} (UUID, ", m_Realm);
|
||||
insertBuilder.Append(String.Join(", ", fields));
|
||||
insertBuilder.Append(") values (:principalID, :");
|
||||
insertBuilder.Append(String.Join(", :", fields));
|
||||
insertBuilder.Append(")");
|
||||
|
||||
cmd.CommandText = insertBuilder.ToString();
|
||||
|
||||
if (cmd.ExecuteNonQuery() < 1)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public bool SetDataItem(UUID principalID, string item, string value)
|
||||
{
|
||||
string sql = string.Format("update {0} set {1} = :{1} where UUID = :UUID", m_Realm, item);
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
|
||||
{
|
||||
cmd.Parameters.Add(m_database.CreateParameter("" + item, value));
|
||||
conn.Open();
|
||||
if (cmd.ExecuteNonQuery() > 0)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public bool SetToken(UUID principalID, string token, int lifetime)
|
||||
{
|
||||
if (System.Environment.TickCount - m_LastExpire > 30000)
|
||||
DoExpire();
|
||||
|
||||
string sql = "insert into tokens (UUID, token, validity) values (:principalID, :token, :lifetime)";
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
|
||||
{
|
||||
cmd.Parameters.Add(m_database.CreateParameter("principalID", principalID));
|
||||
cmd.Parameters.Add(m_database.CreateParameter("token", token));
|
||||
cmd.Parameters.Add(m_database.CreateParameter("lifetime", DateTime.Now.AddMinutes(lifetime)));
|
||||
conn.Open();
|
||||
|
||||
if (cmd.ExecuteNonQuery() > 0)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public bool CheckToken(UUID principalID, string token, int lifetime)
|
||||
{
|
||||
if (System.Environment.TickCount - m_LastExpire > 30000)
|
||||
DoExpire();
|
||||
|
||||
DateTime validDate = DateTime.Now.AddMinutes(lifetime);
|
||||
string sql = "update tokens set validity = :validDate where UUID = :principalID and token = :token and validity > (CURRENT_DATE + CURRENT_TIME)";
|
||||
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
|
||||
{
|
||||
cmd.Parameters.Add(m_database.CreateParameter("principalID", principalID));
|
||||
cmd.Parameters.Add(m_database.CreateParameter("token", token));
|
||||
cmd.Parameters.Add(m_database.CreateParameter("validDate", validDate));
|
||||
conn.Open();
|
||||
|
||||
if (cmd.ExecuteNonQuery() > 0)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private void DoExpire()
|
||||
{
|
||||
DateTime currentDateTime = DateTime.Now;
|
||||
string sql = "delete from tokens where validity < :currentDateTime";
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
|
||||
{
|
||||
conn.Open();
|
||||
cmd.Parameters.Add(m_database.CreateParameter("currentDateTime", currentDateTime));
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
m_LastExpire = System.Environment.TickCount;
|
||||
}
|
||||
}
|
||||
}
|
||||
72
OpenSim/Data/PGSQL/PGSQLAvatarData.cs
Normal file
72
OpenSim/Data/PGSQL/PGSQLAvatarData.cs
Normal file
@@ -0,0 +1,72 @@
|
||||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator 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.Reflection;
|
||||
using System.Threading;
|
||||
using log4net;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using Npgsql;
|
||||
using NpgsqlTypes;
|
||||
|
||||
|
||||
namespace OpenSim.Data.PGSQL
|
||||
{
|
||||
/// <summary>
|
||||
/// A PGSQL Interface for Avatar Storage
|
||||
/// </summary>
|
||||
public class PGSQLAvatarData : PGSQLGenericTableHandler<AvatarBaseData>,
|
||||
IAvatarData
|
||||
{
|
||||
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
public PGSQLAvatarData(string connectionString, string realm) :
|
||||
base(connectionString, realm, "Avatar")
|
||||
{
|
||||
}
|
||||
|
||||
public bool Delete(UUID principalID, string name)
|
||||
{
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand())
|
||||
{
|
||||
|
||||
cmd.CommandText = String.Format("DELETE FROM {0} where PrincipalID = :PrincipalID and Name = :Name", m_Realm);
|
||||
cmd.Parameters.Add(m_database.CreateParameter("PrincipalID", principalID));
|
||||
cmd.Parameters.Add(m_database.CreateParameter("Name", name));
|
||||
cmd.Connection = conn;
|
||||
conn.Open();
|
||||
if (cmd.ExecuteNonQuery() > 0)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
589
OpenSim/Data/PGSQL/PGSQLEstateData.cs
Normal file
589
OpenSim/Data/PGSQL/PGSQLEstateData.cs
Normal file
@@ -0,0 +1,589 @@
|
||||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator 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.Reflection;
|
||||
using log4net;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
using System.Data;
|
||||
using Npgsql;
|
||||
using NpgsqlTypes;
|
||||
|
||||
namespace OpenSim.Data.PGSQL
|
||||
{
|
||||
public class PGSQLEstateStore : IEstateDataStore
|
||||
{
|
||||
private const string _migrationStore = "EstateStore";
|
||||
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
private PGSQLManager _Database;
|
||||
private string m_connectionString;
|
||||
private FieldInfo[] _Fields;
|
||||
private Dictionary<string, FieldInfo> _FieldMap = new Dictionary<string, FieldInfo>();
|
||||
|
||||
#region Public methods
|
||||
|
||||
public PGSQLEstateStore()
|
||||
{
|
||||
}
|
||||
|
||||
public PGSQLEstateStore(string connectionString)
|
||||
{
|
||||
Initialise(connectionString);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initialises the estatedata class.
|
||||
/// </summary>
|
||||
/// <param name="connectionString">connectionString.</param>
|
||||
public void Initialise(string connectionString)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(connectionString))
|
||||
{
|
||||
m_connectionString = connectionString;
|
||||
_Database = new PGSQLManager(connectionString);
|
||||
}
|
||||
|
||||
//Migration settings
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
|
||||
{
|
||||
conn.Open();
|
||||
Migration m = new Migration(conn, GetType().Assembly, "EstateStore");
|
||||
m.Update();
|
||||
}
|
||||
|
||||
//Interesting way to get parameters! Maybe implement that also with other types
|
||||
Type t = typeof(EstateSettings);
|
||||
_Fields = t.GetFields(BindingFlags.NonPublic |
|
||||
BindingFlags.Instance |
|
||||
BindingFlags.DeclaredOnly);
|
||||
|
||||
foreach (FieldInfo f in _Fields)
|
||||
{
|
||||
if (f.Name.Substring(0, 2) == "m_")
|
||||
_FieldMap[f.Name.Substring(2)] = f;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Loads the estate settings.
|
||||
/// </summary>
|
||||
/// <param name="regionID">region ID.</param>
|
||||
/// <returns></returns>
|
||||
public EstateSettings LoadEstateSettings(UUID regionID, bool create)
|
||||
{
|
||||
EstateSettings es = new EstateSettings();
|
||||
|
||||
string sql = "select estate_settings." + String.Join(",estate_settings.", FieldList) +
|
||||
" from estate_map left join estate_settings on estate_map.EstateID = estate_settings.EstateID " +
|
||||
" where estate_settings.EstateID is not null and RegionID = :RegionID";
|
||||
|
||||
bool insertEstate = false;
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
|
||||
{
|
||||
cmd.Parameters.Add(_Database.CreateParameter("RegionID", regionID));
|
||||
conn.Open();
|
||||
using (NpgsqlDataReader reader = cmd.ExecuteReader())
|
||||
{
|
||||
if (reader.Read())
|
||||
{
|
||||
foreach (string name in FieldList)
|
||||
{
|
||||
FieldInfo f = _FieldMap[name];
|
||||
object v = reader[name];
|
||||
if (f.FieldType == typeof(bool))
|
||||
{
|
||||
f.SetValue(es, v);
|
||||
}
|
||||
else if (f.FieldType == typeof(UUID))
|
||||
{
|
||||
f.SetValue(es, new UUID((Guid)v)); // uuid);
|
||||
}
|
||||
else if (f.FieldType == typeof(string))
|
||||
{
|
||||
f.SetValue(es, v.ToString());
|
||||
}
|
||||
else if (f.FieldType == typeof(UInt32))
|
||||
{
|
||||
f.SetValue(es, Convert.ToUInt32(v));
|
||||
}
|
||||
else if (f.FieldType == typeof(Single))
|
||||
{
|
||||
f.SetValue(es, Convert.ToSingle(v));
|
||||
}
|
||||
else
|
||||
f.SetValue(es, v);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
insertEstate = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (insertEstate && create)
|
||||
{
|
||||
DoCreate(es);
|
||||
LinkRegion(regionID, (int)es.EstateID);
|
||||
}
|
||||
|
||||
LoadBanList(es);
|
||||
|
||||
es.EstateManagers = LoadUUIDList(es.EstateID, "estate_managers");
|
||||
es.EstateAccess = LoadUUIDList(es.EstateID, "estate_users");
|
||||
es.EstateGroups = LoadUUIDList(es.EstateID, "estate_groups");
|
||||
|
||||
//Set event
|
||||
es.OnSave += StoreEstateSettings;
|
||||
return es;
|
||||
}
|
||||
|
||||
public EstateSettings CreateNewEstate()
|
||||
{
|
||||
EstateSettings es = new EstateSettings();
|
||||
es.OnSave += StoreEstateSettings;
|
||||
|
||||
DoCreate(es);
|
||||
|
||||
LoadBanList(es);
|
||||
|
||||
es.EstateManagers = LoadUUIDList(es.EstateID, "estate_managers");
|
||||
es.EstateAccess = LoadUUIDList(es.EstateID, "estate_users");
|
||||
es.EstateGroups = LoadUUIDList(es.EstateID, "estate_groups");
|
||||
|
||||
return es;
|
||||
}
|
||||
|
||||
private void DoCreate(EstateSettings es)
|
||||
{
|
||||
List<string> names = new List<string>(FieldList);
|
||||
|
||||
names.Remove("EstateID");
|
||||
|
||||
string sql = string.Format("insert into estate_settings ({0}) values ( :{1} )", String.Join(",", names.ToArray()), String.Join(", :", names.ToArray()));
|
||||
|
||||
m_log.Debug("[DB ESTATE]: SQL: " + sql);
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
|
||||
using (NpgsqlCommand insertCommand = new NpgsqlCommand(sql, conn))
|
||||
{
|
||||
insertCommand.CommandText = sql + "; Select cast(lastval() as int) as ID ;";
|
||||
|
||||
foreach (string name in names)
|
||||
{
|
||||
insertCommand.Parameters.Add(_Database.CreateParameter("" + name, _FieldMap[name].GetValue(es)));
|
||||
}
|
||||
//NpgsqlParameter idParameter = new NpgsqlParameter("ID", SqlDbType.Int);
|
||||
//idParameter.Direction = ParameterDirection.Output;
|
||||
//insertCommand.Parameters.Add(idParameter);
|
||||
conn.Open();
|
||||
|
||||
es.EstateID = 100;
|
||||
|
||||
using (NpgsqlDataReader result = insertCommand.ExecuteReader())
|
||||
{
|
||||
if (result.Read())
|
||||
{
|
||||
es.EstateID = (uint)result.GetInt32(0);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//TODO check if this is needed??
|
||||
es.Save();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Stores the estate settings.
|
||||
/// </summary>
|
||||
/// <param name="es">estate settings</param>
|
||||
public void StoreEstateSettings(EstateSettings es)
|
||||
{
|
||||
List<string> names = new List<string>(FieldList);
|
||||
|
||||
names.Remove("EstateID");
|
||||
|
||||
string sql = string.Format("UPDATE estate_settings SET ");
|
||||
foreach (string name in names)
|
||||
{
|
||||
sql += name + " = :" + name + ", ";
|
||||
}
|
||||
sql = sql.Remove(sql.LastIndexOf(","));
|
||||
sql += " WHERE EstateID = :EstateID";
|
||||
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
|
||||
{
|
||||
foreach (string name in names)
|
||||
{
|
||||
cmd.Parameters.Add(_Database.CreateParameter("" + name, _FieldMap[name].GetValue(es)));
|
||||
}
|
||||
|
||||
cmd.Parameters.Add(_Database.CreateParameter("EstateID", es.EstateID));
|
||||
conn.Open();
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
|
||||
SaveBanList(es);
|
||||
SaveUUIDList(es.EstateID, "estate_managers", es.EstateManagers);
|
||||
SaveUUIDList(es.EstateID, "estate_users", es.EstateAccess);
|
||||
SaveUUIDList(es.EstateID, "estate_groups", es.EstateGroups);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Private methods
|
||||
|
||||
private string[] FieldList
|
||||
{
|
||||
get { return new List<string>(_FieldMap.Keys).ToArray(); }
|
||||
}
|
||||
|
||||
private void LoadBanList(EstateSettings es)
|
||||
{
|
||||
es.ClearBans();
|
||||
|
||||
string sql = "select bannedUUID from estateban where EstateID = :EstateID";
|
||||
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
|
||||
{
|
||||
NpgsqlParameter idParameter = new NpgsqlParameter("EstateID", DbType.Int32);
|
||||
idParameter.Value = es.EstateID;
|
||||
cmd.Parameters.Add(idParameter);
|
||||
conn.Open();
|
||||
using (NpgsqlDataReader reader = cmd.ExecuteReader())
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
EstateBan eb = new EstateBan();
|
||||
|
||||
eb.BannedUserID = new UUID((Guid)reader["bannedUUID"]); //uuid;
|
||||
eb.BannedHostAddress = "0.0.0.0";
|
||||
eb.BannedHostIPMask = "0.0.0.0";
|
||||
es.AddBan(eb);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private UUID[] LoadUUIDList(uint estateID, string table)
|
||||
{
|
||||
List<UUID> uuids = new List<UUID>();
|
||||
|
||||
string sql = string.Format("select uuid from {0} where EstateID = :EstateID", table);
|
||||
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
|
||||
{
|
||||
cmd.Parameters.Add(_Database.CreateParameter("EstateID", estateID));
|
||||
conn.Open();
|
||||
using (NpgsqlDataReader reader = cmd.ExecuteReader())
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
uuids.Add(new UUID((Guid)reader["uuid"])); //uuid);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return uuids.ToArray();
|
||||
}
|
||||
|
||||
private void SaveBanList(EstateSettings es)
|
||||
{
|
||||
//Delete first
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
|
||||
{
|
||||
conn.Open();
|
||||
using (NpgsqlCommand cmd = conn.CreateCommand())
|
||||
{
|
||||
cmd.CommandText = "delete from estateban where EstateID = :EstateID";
|
||||
cmd.Parameters.AddWithValue("EstateID", (int)es.EstateID);
|
||||
cmd.ExecuteNonQuery();
|
||||
|
||||
//Insert after
|
||||
cmd.CommandText = "insert into estateban (EstateID, bannedUUID,bannedIp, bannedIpHostMask, bannedNameMask) values ( :EstateID, :bannedUUID, '','','' )";
|
||||
cmd.Parameters.AddWithValue("bannedUUID", Guid.Empty);
|
||||
foreach (EstateBan b in es.EstateBans)
|
||||
{
|
||||
cmd.Parameters["bannedUUID"].Value = b.BannedUserID.Guid;
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void SaveUUIDList(uint estateID, string table, UUID[] data)
|
||||
{
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
|
||||
{
|
||||
conn.Open();
|
||||
using (NpgsqlCommand cmd = conn.CreateCommand())
|
||||
{
|
||||
cmd.Parameters.AddWithValue("EstateID", (int)estateID);
|
||||
cmd.CommandText = string.Format("delete from {0} where EstateID = :EstateID", table);
|
||||
cmd.ExecuteNonQuery();
|
||||
|
||||
cmd.CommandText = string.Format("insert into {0} (EstateID, uuid) values ( :EstateID, :uuid )", table);
|
||||
cmd.Parameters.AddWithValue("uuid", Guid.Empty);
|
||||
foreach (UUID uuid in data)
|
||||
{
|
||||
cmd.Parameters["uuid"].Value = uuid.Guid; //.ToString(); //TODO check if this works
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public EstateSettings LoadEstateSettings(int estateID)
|
||||
{
|
||||
EstateSettings es = new EstateSettings();
|
||||
string sql = "select estate_settings." + String.Join(",estate_settings.", FieldList) + " from estate_settings where EstateID = :EstateID";
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
|
||||
{
|
||||
conn.Open();
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
|
||||
{
|
||||
cmd.Parameters.AddWithValue("EstateID", (int)estateID);
|
||||
using (NpgsqlDataReader reader = cmd.ExecuteReader())
|
||||
{
|
||||
if (reader.Read())
|
||||
{
|
||||
foreach (string name in FieldList)
|
||||
{
|
||||
FieldInfo f = _FieldMap[name];
|
||||
object v = reader[name];
|
||||
if (f.FieldType == typeof(bool))
|
||||
{
|
||||
f.SetValue(es, Convert.ToInt32(v) != 0);
|
||||
}
|
||||
else if (f.FieldType == typeof(UUID))
|
||||
{
|
||||
f.SetValue(es, new UUID((Guid)v)); // uuid);
|
||||
}
|
||||
else if (f.FieldType == typeof(string))
|
||||
{
|
||||
f.SetValue(es, v.ToString());
|
||||
}
|
||||
else if (f.FieldType == typeof(UInt32))
|
||||
{
|
||||
f.SetValue(es, Convert.ToUInt32(v));
|
||||
}
|
||||
else if (f.FieldType == typeof(Single))
|
||||
{
|
||||
f.SetValue(es, Convert.ToSingle(v));
|
||||
}
|
||||
else
|
||||
f.SetValue(es, v);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
LoadBanList(es);
|
||||
|
||||
es.EstateManagers = LoadUUIDList(es.EstateID, "estate_managers");
|
||||
es.EstateAccess = LoadUUIDList(es.EstateID, "estate_users");
|
||||
es.EstateGroups = LoadUUIDList(es.EstateID, "estate_groups");
|
||||
|
||||
//Set event
|
||||
es.OnSave += StoreEstateSettings;
|
||||
return es;
|
||||
|
||||
}
|
||||
|
||||
public List<EstateSettings> LoadEstateSettingsAll()
|
||||
{
|
||||
List<EstateSettings> allEstateSettings = new List<EstateSettings>();
|
||||
|
||||
List<int> allEstateIds = GetEstatesAll();
|
||||
|
||||
foreach (int estateId in allEstateIds)
|
||||
allEstateSettings.Add(LoadEstateSettings(estateId));
|
||||
|
||||
return allEstateSettings;
|
||||
}
|
||||
|
||||
public List<int> GetEstates(string search)
|
||||
{
|
||||
List<int> result = new List<int>();
|
||||
string sql = "select estateID from estate_settings where EstateName = :EstateName";
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
|
||||
{
|
||||
conn.Open();
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
|
||||
{
|
||||
cmd.Parameters.AddWithValue("EstateName", search);
|
||||
|
||||
using (IDataReader reader = cmd.ExecuteReader())
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
result.Add(Convert.ToInt32(reader["EstateID"]));
|
||||
}
|
||||
reader.Close();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public List<int> GetEstatesAll()
|
||||
{
|
||||
List<int> result = new List<int>();
|
||||
string sql = "select estateID from estate_settings";
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
|
||||
{
|
||||
conn.Open();
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
|
||||
{
|
||||
using (IDataReader reader = cmd.ExecuteReader())
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
result.Add(Convert.ToInt32(reader["EstateID"]));
|
||||
}
|
||||
reader.Close();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public List<int> GetEstatesByOwner(UUID ownerID)
|
||||
{
|
||||
List<int> result = new List<int>();
|
||||
string sql = "select estateID from estate_settings where EstateOwner = :EstateOwner";
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
|
||||
{
|
||||
conn.Open();
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
|
||||
{
|
||||
cmd.Parameters.AddWithValue("EstateOwner", ownerID);
|
||||
|
||||
using (IDataReader reader = cmd.ExecuteReader())
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
result.Add(Convert.ToInt32(reader["EstateID"]));
|
||||
}
|
||||
reader.Close();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public bool LinkRegion(UUID regionID, int estateID)
|
||||
{
|
||||
string deleteSQL = "delete from estate_map where RegionID = :RegionID";
|
||||
string insertSQL = "insert into estate_map values (:RegionID, :EstateID)";
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
|
||||
{
|
||||
conn.Open();
|
||||
|
||||
NpgsqlTransaction transaction = conn.BeginTransaction();
|
||||
|
||||
try
|
||||
{
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(deleteSQL, conn))
|
||||
{
|
||||
cmd.Transaction = transaction;
|
||||
cmd.Parameters.AddWithValue("RegionID", regionID.Guid);
|
||||
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(insertSQL, conn))
|
||||
{
|
||||
cmd.Transaction = transaction;
|
||||
cmd.Parameters.AddWithValue("RegionID", regionID.Guid);
|
||||
cmd.Parameters.AddWithValue("EstateID", estateID);
|
||||
|
||||
int ret = cmd.ExecuteNonQuery();
|
||||
|
||||
if (ret != 0)
|
||||
transaction.Commit();
|
||||
else
|
||||
transaction.Rollback();
|
||||
|
||||
return (ret != 0);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
m_log.Error("[REGION DB]: LinkRegion failed: " + ex.Message);
|
||||
transaction.Rollback();
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public List<UUID> GetRegions(int estateID)
|
||||
{
|
||||
List<UUID> result = new List<UUID>();
|
||||
string sql = "select RegionID from estate_map where EstateID = :EstateID";
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
|
||||
{
|
||||
conn.Open();
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
|
||||
{
|
||||
cmd.Parameters.AddWithValue("EstateID", estateID);
|
||||
|
||||
using (IDataReader reader = cmd.ExecuteReader())
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
result.Add(DBGuid.FromDB(reader["RegionID"]));
|
||||
}
|
||||
reader.Close();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public bool DeleteEstate(int estateID)
|
||||
{
|
||||
// TODO: Implementation!
|
||||
return false;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
116
OpenSim/Data/PGSQL/PGSQLFriendsData.cs
Normal file
116
OpenSim/Data/PGSQL/PGSQLFriendsData.cs
Normal file
@@ -0,0 +1,116 @@
|
||||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator 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;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using Npgsql;
|
||||
|
||||
namespace OpenSim.Data.PGSQL
|
||||
{
|
||||
public class PGSQLFriendsData : PGSQLGenericTableHandler<FriendsData>, IFriendsData
|
||||
{
|
||||
public PGSQLFriendsData(string connectionString, string realm)
|
||||
: base(connectionString, realm, "FriendsStore")
|
||||
{
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
|
||||
{
|
||||
conn.Open();
|
||||
Migration m = new Migration(conn, GetType().Assembly, "FriendsStore");
|
||||
m.Update();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public bool Delete(string principalID, string friend)
|
||||
{
|
||||
UUID princUUID = UUID.Zero;
|
||||
|
||||
bool ret = UUID.TryParse(principalID, out princUUID);
|
||||
|
||||
if (ret)
|
||||
return Delete(princUUID, friend);
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
public bool Delete(UUID principalID, string friend)
|
||||
{
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand())
|
||||
{
|
||||
cmd.CommandText = String.Format("delete from {0} where PrincipalID = :PrincipalID and Friend = :Friend", m_Realm);
|
||||
cmd.Parameters.Add(m_database.CreateParameter("PrincipalID", principalID));
|
||||
cmd.Parameters.Add(m_database.CreateParameter("Friend", friend));
|
||||
cmd.Connection = conn;
|
||||
conn.Open();
|
||||
cmd.ExecuteNonQuery();
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public FriendsData[] GetFriends(string principalID)
|
||||
{
|
||||
UUID princUUID = UUID.Zero;
|
||||
|
||||
bool ret = UUID.TryParse(principalID, out princUUID);
|
||||
|
||||
if (ret)
|
||||
return GetFriends(princUUID);
|
||||
else
|
||||
return new FriendsData[0];
|
||||
}
|
||||
|
||||
public FriendsData[] GetFriends(UUID principalID)
|
||||
{
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand())
|
||||
{
|
||||
|
||||
cmd.CommandText = String.Format("select a.*,case when b.Flags is null then -1 else b.Flags end as TheirFlags from {0} as a " +
|
||||
" left join {0} as b on a.PrincipalID = b.Friend and a.Friend = b.PrincipalID " +
|
||||
" where a.PrincipalID = :PrincipalID", m_Realm);
|
||||
cmd.Parameters.Add(m_database.CreateParameter("PrincipalID", principalID));
|
||||
cmd.Connection = conn;
|
||||
conn.Open();
|
||||
return DoQuery(cmd);
|
||||
}
|
||||
}
|
||||
|
||||
public FriendsData[] GetFriends(Guid principalID)
|
||||
{
|
||||
return GetFriends(principalID);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
445
OpenSim/Data/PGSQL/PGSQLGenericTableHandler.cs
Normal file
445
OpenSim/Data/PGSQL/PGSQLGenericTableHandler.cs
Normal file
@@ -0,0 +1,445 @@
|
||||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator 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.Data;
|
||||
using System.Reflection;
|
||||
using log4net;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
using System.Text;
|
||||
using Npgsql;
|
||||
|
||||
namespace OpenSim.Data.PGSQL
|
||||
{
|
||||
public class PGSQLGenericTableHandler<T> where T : class, new()
|
||||
{
|
||||
private static readonly ILog m_log =
|
||||
LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
protected string m_ConnectionString;
|
||||
protected PGSQLManager m_database; //used for parameter type translation
|
||||
protected Dictionary<string, FieldInfo> m_Fields =
|
||||
new Dictionary<string, FieldInfo>();
|
||||
|
||||
protected Dictionary<string, string> m_FieldTypes = new Dictionary<string, string>();
|
||||
|
||||
protected List<string> m_ColumnNames = null;
|
||||
protected string m_Realm;
|
||||
protected FieldInfo m_DataField = null;
|
||||
|
||||
public PGSQLGenericTableHandler(string connectionString,
|
||||
string realm, string storeName)
|
||||
{
|
||||
m_Realm = realm;
|
||||
|
||||
m_ConnectionString = connectionString;
|
||||
|
||||
if (storeName != String.Empty)
|
||||
{
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
|
||||
{
|
||||
conn.Open();
|
||||
Migration m = new Migration(conn, GetType().Assembly, storeName);
|
||||
m.Update();
|
||||
}
|
||||
|
||||
}
|
||||
m_database = new PGSQLManager(m_ConnectionString);
|
||||
|
||||
Type t = typeof(T);
|
||||
FieldInfo[] fields = t.GetFields(BindingFlags.Public |
|
||||
BindingFlags.Instance |
|
||||
BindingFlags.DeclaredOnly);
|
||||
|
||||
LoadFieldTypes();
|
||||
|
||||
if (fields.Length == 0)
|
||||
return;
|
||||
|
||||
foreach (FieldInfo f in fields)
|
||||
{
|
||||
if (f.Name != "Data")
|
||||
m_Fields[f.Name] = f;
|
||||
else
|
||||
m_DataField = f;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void LoadFieldTypes()
|
||||
{
|
||||
m_FieldTypes = new Dictionary<string, string>();
|
||||
|
||||
string query = string.Format(@"select column_name,data_type
|
||||
from INFORMATION_SCHEMA.COLUMNS
|
||||
where table_name = lower('{0}');
|
||||
|
||||
", m_Realm);
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(query, conn))
|
||||
{
|
||||
conn.Open();
|
||||
using (NpgsqlDataReader rdr = cmd.ExecuteReader())
|
||||
{
|
||||
while (rdr.Read())
|
||||
{
|
||||
// query produces 0 to many rows of single column, so always add the first item in each row
|
||||
m_FieldTypes.Add((string)rdr[0], (string)rdr[1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void CheckColumnNames(NpgsqlDataReader reader)
|
||||
{
|
||||
if (m_ColumnNames != null)
|
||||
return;
|
||||
|
||||
m_ColumnNames = new List<string>();
|
||||
|
||||
DataTable schemaTable = reader.GetSchemaTable();
|
||||
|
||||
foreach (DataRow row in schemaTable.Rows)
|
||||
{
|
||||
if (row["ColumnName"] != null &&
|
||||
(!m_Fields.ContainsKey(row["ColumnName"].ToString())))
|
||||
m_ColumnNames.Add(row["ColumnName"].ToString());
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// TODO GET CONSTRAINTS FROM POSTGRESQL
|
||||
private List<string> GetConstraints()
|
||||
{
|
||||
List<string> constraints = new List<string>();
|
||||
string query = string.Format(@"SELECT kcu.column_name
|
||||
FROM information_schema.table_constraints tc
|
||||
LEFT JOIN information_schema.key_column_usage kcu
|
||||
ON tc.constraint_catalog = kcu.constraint_catalog
|
||||
AND tc.constraint_schema = kcu.constraint_schema
|
||||
AND tc.constraint_name = kcu.constraint_name
|
||||
|
||||
LEFT JOIN information_schema.referential_constraints rc
|
||||
ON tc.constraint_catalog = rc.constraint_catalog
|
||||
AND tc.constraint_schema = rc.constraint_schema
|
||||
AND tc.constraint_name = rc.constraint_name
|
||||
|
||||
LEFT JOIN information_schema.constraint_column_usage ccu
|
||||
ON rc.unique_constraint_catalog = ccu.constraint_catalog
|
||||
AND rc.unique_constraint_schema = ccu.constraint_schema
|
||||
AND rc.unique_constraint_name = ccu.constraint_name
|
||||
|
||||
where tc.table_name = lower('{0}')
|
||||
and lower(tc.constraint_type) in ('primary key')
|
||||
and kcu.column_name is not null
|
||||
;", m_Realm);
|
||||
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(query, conn))
|
||||
{
|
||||
conn.Open();
|
||||
using (NpgsqlDataReader rdr = cmd.ExecuteReader())
|
||||
{
|
||||
while (rdr.Read())
|
||||
{
|
||||
// query produces 0 to many rows of single column, so always add the first item in each row
|
||||
constraints.Add((string)rdr[0]);
|
||||
}
|
||||
}
|
||||
return constraints;
|
||||
}
|
||||
}
|
||||
|
||||
public virtual T[] Get(string field, string key)
|
||||
{
|
||||
return Get(new string[] { field }, new string[] { key });
|
||||
}
|
||||
|
||||
public virtual T[] Get(string[] fields, string[] keys)
|
||||
{
|
||||
if (fields.Length != keys.Length)
|
||||
return new T[0];
|
||||
|
||||
List<string> terms = new List<string>();
|
||||
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand())
|
||||
{
|
||||
|
||||
for (int i = 0; i < fields.Length; i++)
|
||||
{
|
||||
if ( m_FieldTypes.ContainsKey(fields[i].ToLower()) )
|
||||
cmd.Parameters.Add(m_database.CreateParameter(fields[i], keys[i], m_FieldTypes[fields[i].ToLower() ]));
|
||||
else
|
||||
cmd.Parameters.Add(m_database.CreateParameter(fields[i], keys[i]));
|
||||
|
||||
terms.Add(" " + fields[i] + " = :" + fields[i]);
|
||||
}
|
||||
|
||||
string where = String.Join(" AND ", terms.ToArray());
|
||||
|
||||
string query = String.Format("SELECT * FROM {0} WHERE {1}",
|
||||
m_Realm, where);
|
||||
|
||||
cmd.Connection = conn;
|
||||
cmd.CommandText = query;
|
||||
conn.Open();
|
||||
return DoQuery(cmd);
|
||||
}
|
||||
}
|
||||
|
||||
protected T[] DoQuery(NpgsqlCommand cmd)
|
||||
{
|
||||
List<T> result = new List<T>();
|
||||
using (NpgsqlDataReader reader = cmd.ExecuteReader())
|
||||
{
|
||||
if (reader == null)
|
||||
return new T[0];
|
||||
|
||||
CheckColumnNames(reader);
|
||||
|
||||
while (reader.Read())
|
||||
{
|
||||
T row = new T();
|
||||
|
||||
foreach (string name in m_Fields.Keys)
|
||||
{
|
||||
if (m_Fields[name].GetValue(row) is bool)
|
||||
{
|
||||
int v = Convert.ToInt32(reader[name]);
|
||||
m_Fields[name].SetValue(row, v != 0 ? true : false);
|
||||
}
|
||||
else if (m_Fields[name].GetValue(row) is UUID)
|
||||
{
|
||||
UUID uuid = UUID.Zero;
|
||||
|
||||
UUID.TryParse(reader[name].ToString(), out uuid);
|
||||
m_Fields[name].SetValue(row, uuid);
|
||||
}
|
||||
else if (m_Fields[name].GetValue(row) is int)
|
||||
{
|
||||
int v = Convert.ToInt32(reader[name]);
|
||||
m_Fields[name].SetValue(row, v);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_Fields[name].SetValue(row, reader[name]);
|
||||
}
|
||||
}
|
||||
|
||||
if (m_DataField != null)
|
||||
{
|
||||
Dictionary<string, string> data =
|
||||
new Dictionary<string, string>();
|
||||
|
||||
foreach (string col in m_ColumnNames)
|
||||
{
|
||||
data[col] = reader[col].ToString();
|
||||
|
||||
if (data[col] == null)
|
||||
data[col] = String.Empty;
|
||||
}
|
||||
|
||||
m_DataField.SetValue(row, data);
|
||||
}
|
||||
|
||||
result.Add(row);
|
||||
}
|
||||
return result.ToArray();
|
||||
}
|
||||
}
|
||||
|
||||
public virtual T[] Get(string where)
|
||||
{
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand())
|
||||
{
|
||||
|
||||
string query = String.Format("SELECT * FROM {0} WHERE {1}",
|
||||
m_Realm, where);
|
||||
cmd.Connection = conn;
|
||||
cmd.CommandText = query;
|
||||
|
||||
//m_log.WarnFormat("[PGSQLGenericTable]: SELECT {0} WHERE {1}", m_Realm, where);
|
||||
|
||||
conn.Open();
|
||||
return DoQuery(cmd);
|
||||
}
|
||||
}
|
||||
|
||||
public virtual bool Store(T row)
|
||||
{
|
||||
List<string> constraintFields = GetConstraints();
|
||||
List<KeyValuePair<string, string>> constraints = new List<KeyValuePair<string, string>>();
|
||||
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand())
|
||||
{
|
||||
|
||||
StringBuilder query = new StringBuilder();
|
||||
List<String> names = new List<String>();
|
||||
List<String> values = new List<String>();
|
||||
|
||||
foreach (FieldInfo fi in m_Fields.Values)
|
||||
{
|
||||
names.Add(fi.Name);
|
||||
values.Add(":" + fi.Name);
|
||||
// Temporarily return more information about what field is unexpectedly null for
|
||||
// http://opensimulator.org/mantis/view.php?id=5403. This might be due to a bug in the
|
||||
// InventoryTransferModule or we may be required to substitute a DBNull here.
|
||||
if (fi.GetValue(row) == null)
|
||||
throw new NullReferenceException(
|
||||
string.Format(
|
||||
"[PGSQL GENERIC TABLE HANDLER]: Trying to store field {0} for {1} which is unexpectedly null",
|
||||
fi.Name, row));
|
||||
|
||||
if (constraintFields.Count > 0 && constraintFields.Contains(fi.Name))
|
||||
{
|
||||
constraints.Add(new KeyValuePair<string, string>(fi.Name, fi.GetValue(row).ToString() ));
|
||||
}
|
||||
if (m_FieldTypes.ContainsKey(fi.Name.ToLower()))
|
||||
cmd.Parameters.Add(m_database.CreateParameter(fi.Name, fi.GetValue(row), m_FieldTypes[fi.Name.ToLower()]));
|
||||
else
|
||||
cmd.Parameters.Add(m_database.CreateParameter(fi.Name, fi.GetValue(row)));
|
||||
}
|
||||
|
||||
if (m_DataField != null)
|
||||
{
|
||||
Dictionary<string, string> data =
|
||||
(Dictionary<string, string>)m_DataField.GetValue(row);
|
||||
|
||||
foreach (KeyValuePair<string, string> kvp in data)
|
||||
{
|
||||
if (constraintFields.Count > 0 && constraintFields.Contains(kvp.Key))
|
||||
{
|
||||
constraints.Add(new KeyValuePair<string, string>(kvp.Key, kvp.Key));
|
||||
}
|
||||
names.Add(kvp.Key);
|
||||
values.Add(":" + kvp.Key);
|
||||
|
||||
if (m_FieldTypes.ContainsKey(kvp.Key.ToLower()))
|
||||
cmd.Parameters.Add(m_database.CreateParameter("" + kvp.Key, kvp.Value, m_FieldTypes[kvp.Key.ToLower()]));
|
||||
else
|
||||
cmd.Parameters.Add(m_database.CreateParameter("" + kvp.Key, kvp.Value));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
query.AppendFormat("UPDATE {0} SET ", m_Realm);
|
||||
int i = 0;
|
||||
for (i = 0; i < names.Count - 1; i++)
|
||||
{
|
||||
query.AppendFormat("{0} = {1}, ", names[i], values[i]);
|
||||
}
|
||||
query.AppendFormat("{0} = {1} ", names[i], values[i]);
|
||||
if (constraints.Count > 0)
|
||||
{
|
||||
List<string> terms = new List<string>();
|
||||
for (int j = 0; j < constraints.Count; j++)
|
||||
{
|
||||
terms.Add(" " + constraints[j].Key + " = :" + constraints[j].Key);
|
||||
}
|
||||
string where = String.Join(" AND ", terms.ToArray());
|
||||
query.AppendFormat(" WHERE {0} ", where);
|
||||
|
||||
}
|
||||
cmd.Connection = conn;
|
||||
cmd.CommandText = query.ToString();
|
||||
|
||||
conn.Open();
|
||||
if (cmd.ExecuteNonQuery() > 0)
|
||||
{
|
||||
m_log.WarnFormat("[PGSQLGenericTable]: Updating {0}", m_Realm);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
// assume record has not yet been inserted
|
||||
|
||||
query = new StringBuilder();
|
||||
query.AppendFormat("INSERT INTO {0} (", m_Realm);
|
||||
query.Append(String.Join(",", names.ToArray()));
|
||||
query.Append(") values (" + String.Join(",", values.ToArray()) + ")");
|
||||
cmd.Connection = conn;
|
||||
cmd.CommandText = query.ToString();
|
||||
m_log.WarnFormat("[PGSQLGenericTable]: Inserting into {0} sql {1}", m_Realm, cmd.CommandText);
|
||||
if (conn.State != ConnectionState.Open)
|
||||
conn.Open();
|
||||
if (cmd.ExecuteNonQuery() > 0)
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public virtual bool Delete(string field, string key)
|
||||
{
|
||||
return Delete(new string[] { field }, new string[] { key });
|
||||
}
|
||||
|
||||
public virtual bool Delete(string[] fields, string[] keys)
|
||||
{
|
||||
if (fields.Length != keys.Length)
|
||||
return false;
|
||||
|
||||
List<string> terms = new List<string>();
|
||||
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand())
|
||||
{
|
||||
for (int i = 0; i < fields.Length; i++)
|
||||
{
|
||||
if (m_FieldTypes.ContainsKey(fields[i].ToLower()))
|
||||
cmd.Parameters.Add(m_database.CreateParameter(fields[i], keys[i], m_FieldTypes[fields[i].ToLower()]));
|
||||
else
|
||||
cmd.Parameters.Add(m_database.CreateParameter(fields[i], keys[i]));
|
||||
|
||||
terms.Add(" " + fields[i] + " = :" + fields[i]);
|
||||
}
|
||||
|
||||
string where = String.Join(" AND ", terms.ToArray());
|
||||
|
||||
string query = String.Format("DELETE FROM {0} WHERE {1}", m_Realm, where);
|
||||
|
||||
cmd.Connection = conn;
|
||||
cmd.CommandText = query;
|
||||
conn.Open();
|
||||
|
||||
if (cmd.ExecuteNonQuery() > 0)
|
||||
{
|
||||
//m_log.Warn("[PGSQLGenericTable]: " + deleteCommand);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
68
OpenSim/Data/PGSQL/PGSQLGridUserData.cs
Normal file
68
OpenSim/Data/PGSQL/PGSQLGridUserData.cs
Normal file
@@ -0,0 +1,68 @@
|
||||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator 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.Data;
|
||||
using System.Reflection;
|
||||
using System.Threading;
|
||||
using log4net;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
|
||||
namespace OpenSim.Data.PGSQL
|
||||
{
|
||||
/// <summary>
|
||||
/// A PGSQL Interface for Avatar Storage
|
||||
/// </summary>
|
||||
public class PGSQLGridUserData : PGSQLGenericTableHandler<GridUserData>,
|
||||
IGridUserData
|
||||
{
|
||||
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
public PGSQLGridUserData(string connectionString, string realm) :
|
||||
base(connectionString, realm, "GridUserStore")
|
||||
{
|
||||
}
|
||||
|
||||
public new GridUserData Get(string userID)
|
||||
{
|
||||
GridUserData[] ret = Get("UserID", userID);
|
||||
|
||||
if (ret.Length == 0)
|
||||
return null;
|
||||
|
||||
return ret[0];
|
||||
}
|
||||
|
||||
public GridUserData[] GetAll(string userID)
|
||||
{
|
||||
return base.Get(String.Format("UserID LIKE '{0}%'", userID));
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
831
OpenSim/Data/PGSQL/PGSQLInventoryData.cs
Normal file
831
OpenSim/Data/PGSQL/PGSQLInventoryData.cs
Normal file
@@ -0,0 +1,831 @@
|
||||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator 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.Data;
|
||||
using System.Reflection;
|
||||
using log4net;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using Npgsql;
|
||||
|
||||
namespace OpenSim.Data.PGSQL
|
||||
{
|
||||
/// <summary>
|
||||
/// A PGSQL interface for the inventory server
|
||||
/// </summary>
|
||||
public class PGSQLInventoryData : IInventoryDataPlugin
|
||||
{
|
||||
private const string _migrationStore = "InventoryStore";
|
||||
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
/// <summary>
|
||||
/// The database manager
|
||||
/// </summary>
|
||||
private PGSQLManager database;
|
||||
private string m_connectionString;
|
||||
|
||||
#region IPlugin members
|
||||
|
||||
[Obsolete("Cannot be default-initialized!")]
|
||||
public void Initialise()
|
||||
{
|
||||
m_log.Info("[PGSQLInventoryData]: " + Name + " cannot be default-initialized!");
|
||||
throw new PluginNotInitialisedException(Name);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Loads and initialises the PGSQL inventory storage interface
|
||||
/// </summary>
|
||||
/// <param name="connectionString">connect string</param>
|
||||
/// <remarks>use PGSQL_connection.ini</remarks>
|
||||
public void Initialise(string connectionString)
|
||||
{
|
||||
m_connectionString = connectionString;
|
||||
database = new PGSQLManager(connectionString);
|
||||
|
||||
//New migrations check of store
|
||||
database.CheckMigration(_migrationStore);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The name of this DB provider
|
||||
/// </summary>
|
||||
/// <returns>A string containing the name of the DB provider</returns>
|
||||
public string Name
|
||||
{
|
||||
get { return "PGSQL Inventory Data Interface"; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Closes this DB provider
|
||||
/// </summary>
|
||||
public void Dispose()
|
||||
{
|
||||
database = null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns the version of this DB provider
|
||||
/// </summary>
|
||||
/// <returns>A string containing the DB provider</returns>
|
||||
public string Version
|
||||
{
|
||||
get { return database.getVersion(); }
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Folder methods
|
||||
|
||||
/// <summary>
|
||||
/// Returns a list of the root folders within a users inventory
|
||||
/// </summary>
|
||||
/// <param name="user">The user whos inventory is to be searched</param>
|
||||
/// <returns>A list of folder objects</returns>
|
||||
public List<InventoryFolderBase> getUserRootFolders(UUID user)
|
||||
{
|
||||
if (user == UUID.Zero)
|
||||
return new List<InventoryFolderBase>();
|
||||
|
||||
return getInventoryFolders(UUID.Zero, user);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// see InventoryItemBase.getUserRootFolder
|
||||
/// </summary>
|
||||
/// <param name="user">the User UUID</param>
|
||||
/// <returns></returns>
|
||||
public InventoryFolderBase getUserRootFolder(UUID user)
|
||||
{
|
||||
List<InventoryFolderBase> items = getUserRootFolders(user);
|
||||
|
||||
InventoryFolderBase rootFolder = null;
|
||||
|
||||
// There should only ever be one root folder for a user. However, if there's more
|
||||
// than one we'll simply use the first one rather than failing. It would be even
|
||||
// nicer to print some message to this effect, but this feels like it's too low a
|
||||
// to put such a message out, and it's too minor right now to spare the time to
|
||||
// suitably refactor.
|
||||
if (items.Count > 0)
|
||||
{
|
||||
rootFolder = items[0];
|
||||
}
|
||||
|
||||
return rootFolder;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns a list of folders in a users inventory contained within the specified folder
|
||||
/// </summary>
|
||||
/// <param name="parentID">The folder to search</param>
|
||||
/// <returns>A list of inventory folders</returns>
|
||||
public List<InventoryFolderBase> getInventoryFolders(UUID parentID)
|
||||
{
|
||||
return getInventoryFolders(parentID, UUID.Zero);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns a specified inventory folder
|
||||
/// </summary>
|
||||
/// <param name="folderID">The folder to return</param>
|
||||
/// <returns>A folder class</returns>
|
||||
public InventoryFolderBase getInventoryFolder(UUID folderID)
|
||||
{
|
||||
string sql = "SELECT * FROM inventoryfolders WHERE folderID = :folderID";
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
|
||||
{
|
||||
cmd.Parameters.Add(database.CreateParameter("folderID", folderID));
|
||||
conn.Open();
|
||||
using (NpgsqlDataReader reader = cmd.ExecuteReader())
|
||||
{
|
||||
if (reader.Read())
|
||||
{
|
||||
return readInventoryFolder(reader);
|
||||
}
|
||||
}
|
||||
}
|
||||
m_log.InfoFormat("[INVENTORY DB] : Found no inventory folder with ID : {0}", folderID);
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns all child folders in the hierarchy from the parent folder and down.
|
||||
/// Does not return the parent folder itself.
|
||||
/// </summary>
|
||||
/// <param name="parentID">The folder to get subfolders for</param>
|
||||
/// <returns>A list of inventory folders</returns>
|
||||
public List<InventoryFolderBase> getFolderHierarchy(UUID parentID)
|
||||
{
|
||||
//Note maybe change this to use a Dataset that loading in all folders of a user and then go throw it that way.
|
||||
//Note this is changed so it opens only one connection to the database and not everytime it wants to get data.
|
||||
|
||||
/* NOTE: the implementation below is very inefficient (makes a separate request to get subfolders for
|
||||
* every found folder, recursively). Inventory code for other DBs has been already rewritten to get ALL
|
||||
* inventory for a specific user at once.
|
||||
*
|
||||
* Meanwhile, one little thing is corrected: getFolderHierarchy(UUID.Zero) doesn't make sense and should never
|
||||
* be used, so check for that and return an empty list.
|
||||
*/
|
||||
|
||||
List<InventoryFolderBase> folders = new List<InventoryFolderBase>();
|
||||
|
||||
if (parentID == UUID.Zero)
|
||||
return folders;
|
||||
|
||||
string sql = "SELECT * FROM inventoryfolders WHERE parentFolderID = :parentID";
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
|
||||
{
|
||||
cmd.Parameters.Add(database.CreateParameter("parentID", parentID));
|
||||
conn.Open();
|
||||
folders.AddRange(getInventoryFolders(cmd));
|
||||
|
||||
List<InventoryFolderBase> tempFolders = new List<InventoryFolderBase>();
|
||||
|
||||
foreach (InventoryFolderBase folderBase in folders)
|
||||
{
|
||||
tempFolders.AddRange(getFolderHierarchy(folderBase.ID, cmd));
|
||||
}
|
||||
if (tempFolders.Count > 0)
|
||||
{
|
||||
folders.AddRange(tempFolders);
|
||||
}
|
||||
}
|
||||
return folders;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new inventory folder
|
||||
/// </summary>
|
||||
/// <param name="folder">Folder to create</param>
|
||||
public void addInventoryFolder(InventoryFolderBase folder)
|
||||
{
|
||||
string sql = @"INSERT INTO inventoryfolders (folderID, agentID, parentFolderID, folderName, type, version)
|
||||
VALUES (:folderID, :agentID, :parentFolderID, :folderName, :type, :version);";
|
||||
|
||||
string folderName = folder.Name;
|
||||
if (folderName.Length > 64)
|
||||
{
|
||||
folderName = folderName.Substring(0, 64);
|
||||
m_log.Warn("[INVENTORY DB]: Name field truncated from " + folder.Name.Length.ToString() + " to " + folderName.Length + " characters on add");
|
||||
}
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
|
||||
{
|
||||
cmd.Parameters.Add(database.CreateParameter("folderID", folder.ID));
|
||||
cmd.Parameters.Add(database.CreateParameter("agentID", folder.Owner));
|
||||
cmd.Parameters.Add(database.CreateParameter("parentFolderID", folder.ParentID));
|
||||
cmd.Parameters.Add(database.CreateParameter("folderName", folderName));
|
||||
cmd.Parameters.Add(database.CreateParameter("type", folder.Type));
|
||||
cmd.Parameters.Add(database.CreateParameter("version", folder.Version));
|
||||
conn.Open();
|
||||
try
|
||||
{
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.ErrorFormat("[INVENTORY DB]: Error : {0}", e.Message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Updates an inventory folder
|
||||
/// </summary>
|
||||
/// <param name="folder">Folder to update</param>
|
||||
public void updateInventoryFolder(InventoryFolderBase folder)
|
||||
{
|
||||
string sql = @"UPDATE inventoryfolders SET agentID = :agentID,
|
||||
parentFolderID = :parentFolderID,
|
||||
folderName = :folderName,
|
||||
type = :type,
|
||||
version = :version
|
||||
WHERE folderID = :folderID";
|
||||
|
||||
string folderName = folder.Name;
|
||||
if (folderName.Length > 64)
|
||||
{
|
||||
folderName = folderName.Substring(0, 64);
|
||||
m_log.Warn("[INVENTORY DB]: Name field truncated from " + folder.Name.Length.ToString() + " to " + folderName.Length + " characters on update");
|
||||
}
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
|
||||
{
|
||||
cmd.Parameters.Add(database.CreateParameter("folderID", folder.ID));
|
||||
cmd.Parameters.Add(database.CreateParameter("agentID", folder.Owner));
|
||||
cmd.Parameters.Add(database.CreateParameter("parentFolderID", folder.ParentID));
|
||||
cmd.Parameters.Add(database.CreateParameter("folderName", folderName));
|
||||
cmd.Parameters.Add(database.CreateParameter("type", folder.Type));
|
||||
cmd.Parameters.Add(database.CreateParameter("version", folder.Version));
|
||||
conn.Open();
|
||||
try
|
||||
{
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.ErrorFormat("[INVENTORY DB]: Error : {0}", e.Message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Updates an inventory folder
|
||||
/// </summary>
|
||||
/// <param name="folder">Folder to update</param>
|
||||
public void moveInventoryFolder(InventoryFolderBase folder)
|
||||
{
|
||||
string sql = @"UPDATE inventoryfolders SET parentFolderID = :parentFolderID WHERE folderID = :folderID";
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
|
||||
{
|
||||
cmd.Parameters.Add(database.CreateParameter("parentFolderID", folder.ParentID));
|
||||
cmd.Parameters.Add(database.CreateParameter("folderID", folder.ID));
|
||||
conn.Open();
|
||||
try
|
||||
{
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.ErrorFormat("[INVENTORY DB]: Error : {0}", e.Message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Delete an inventory folder
|
||||
/// </summary>
|
||||
/// <param name="folderID">Id of folder to delete</param>
|
||||
public void deleteInventoryFolder(UUID folderID)
|
||||
{
|
||||
string sql = "SELECT * FROM inventoryfolders WHERE parentFolderID = :parentID";
|
||||
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
|
||||
{
|
||||
List<InventoryFolderBase> subFolders;
|
||||
cmd.Parameters.Add(database.CreateParameter("parentID", UUID.Zero));
|
||||
conn.Open();
|
||||
subFolders = getFolderHierarchy(folderID, cmd);
|
||||
|
||||
|
||||
//Delete all sub-folders
|
||||
foreach (InventoryFolderBase f in subFolders)
|
||||
{
|
||||
DeleteOneFolder(f.ID, conn);
|
||||
DeleteItemsInFolder(f.ID, conn);
|
||||
}
|
||||
|
||||
//Delete the actual row
|
||||
DeleteOneFolder(folderID, conn);
|
||||
DeleteItemsInFolder(folderID, conn);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Item Methods
|
||||
|
||||
/// <summary>
|
||||
/// Returns a list of items in a specified folder
|
||||
/// </summary>
|
||||
/// <param name="folderID">The folder to search</param>
|
||||
/// <returns>A list containing inventory items</returns>
|
||||
public List<InventoryItemBase> getInventoryInFolder(UUID folderID)
|
||||
{
|
||||
string sql = "SELECT * FROM inventoryitems WHERE parentFolderID = :parentFolderID";
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
|
||||
{
|
||||
cmd.Parameters.Add(database.CreateParameter("parentFolderID", folderID));
|
||||
conn.Open();
|
||||
List<InventoryItemBase> items = new List<InventoryItemBase>();
|
||||
|
||||
using (NpgsqlDataReader reader = cmd.ExecuteReader())
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
items.Add(readInventoryItem(reader));
|
||||
}
|
||||
}
|
||||
return items;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns a specified inventory item
|
||||
/// </summary>
|
||||
/// <param name="itemID">The item ID</param>
|
||||
/// <returns>An inventory item</returns>
|
||||
public InventoryItemBase getInventoryItem(UUID itemID)
|
||||
{
|
||||
string sql = "SELECT * FROM inventoryitems WHERE inventoryID = :inventoryID";
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
|
||||
{
|
||||
cmd.Parameters.Add(database.CreateParameter("inventoryID", itemID));
|
||||
conn.Open();
|
||||
using (NpgsqlDataReader reader = cmd.ExecuteReader())
|
||||
{
|
||||
if (reader.Read())
|
||||
{
|
||||
return readInventoryItem(reader);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
m_log.InfoFormat("[INVENTORY DB]: Found no inventory item with ID : {0}", itemID);
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds a specified item to the database
|
||||
/// </summary>
|
||||
/// <param name="item">The inventory item</param>
|
||||
public void addInventoryItem(InventoryItemBase item)
|
||||
{
|
||||
if (getInventoryItem(item.ID) != null)
|
||||
{
|
||||
updateInventoryItem(item);
|
||||
return;
|
||||
}
|
||||
|
||||
string sql = @"INSERT INTO inventoryitems
|
||||
(inventoryID, assetID, assetType, parentFolderID, avatarID, inventoryName,
|
||||
inventoryDescription, inventoryNextPermissions, inventoryCurrentPermissions,
|
||||
invType, creatorID, inventoryBasePermissions, inventoryEveryOnePermissions, inventoryGroupPermissions,
|
||||
salePrice, saleType, creationDate, groupID, groupOwned, flags)
|
||||
VALUES
|
||||
(:inventoryID, :assetID, :assetType, :parentFolderID, :avatarID, :inventoryName, :inventoryDescription,
|
||||
:inventoryNextPermissions, :inventoryCurrentPermissions, :invType, :creatorID,
|
||||
:inventoryBasePermissions, :inventoryEveryOnePermissions, :inventoryGroupPermissions, :salePrice, :saleType,
|
||||
:creationDate, :groupID, :groupOwned, :flags)";
|
||||
|
||||
string itemName = item.Name;
|
||||
if (item.Name.Length > 64)
|
||||
{
|
||||
itemName = item.Name.Substring(0, 64);
|
||||
m_log.Warn("[INVENTORY DB]: Name field truncated from " + item.Name.Length.ToString() + " to " + itemName.Length.ToString() + " characters");
|
||||
}
|
||||
|
||||
string itemDesc = item.Description;
|
||||
if (item.Description.Length > 128)
|
||||
{
|
||||
itemDesc = item.Description.Substring(0, 128);
|
||||
m_log.Warn("[INVENTORY DB]: Description field truncated from " + item.Description.Length.ToString() + " to " + itemDesc.Length.ToString() + " characters");
|
||||
}
|
||||
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
|
||||
using (NpgsqlCommand command = new NpgsqlCommand(sql, conn))
|
||||
{
|
||||
command.Parameters.Add(database.CreateParameter("inventoryID", item.ID));
|
||||
command.Parameters.Add(database.CreateParameter("assetID", item.AssetID));
|
||||
command.Parameters.Add(database.CreateParameter("assetType", item.AssetType));
|
||||
command.Parameters.Add(database.CreateParameter("parentFolderID", item.Folder));
|
||||
command.Parameters.Add(database.CreateParameter("avatarID", item.Owner));
|
||||
command.Parameters.Add(database.CreateParameter("inventoryName", itemName));
|
||||
command.Parameters.Add(database.CreateParameter("inventoryDescription", itemDesc));
|
||||
command.Parameters.Add(database.CreateParameter("inventoryNextPermissions", item.NextPermissions));
|
||||
command.Parameters.Add(database.CreateParameter("inventoryCurrentPermissions", item.CurrentPermissions));
|
||||
command.Parameters.Add(database.CreateParameter("invType", item.InvType));
|
||||
command.Parameters.Add(database.CreateParameter("creatorID", item.CreatorId));
|
||||
command.Parameters.Add(database.CreateParameter("inventoryBasePermissions", item.BasePermissions));
|
||||
command.Parameters.Add(database.CreateParameter("inventoryEveryOnePermissions", item.EveryOnePermissions));
|
||||
command.Parameters.Add(database.CreateParameter("inventoryGroupPermissions", item.GroupPermissions));
|
||||
command.Parameters.Add(database.CreateParameter("salePrice", item.SalePrice));
|
||||
command.Parameters.Add(database.CreateParameter("saleType", item.SaleType));
|
||||
command.Parameters.Add(database.CreateParameter("creationDate", item.CreationDate));
|
||||
command.Parameters.Add(database.CreateParameter("groupID", item.GroupID));
|
||||
command.Parameters.Add(database.CreateParameter("groupOwned", item.GroupOwned));
|
||||
command.Parameters.Add(database.CreateParameter("flags", item.Flags));
|
||||
conn.Open();
|
||||
try
|
||||
{
|
||||
command.ExecuteNonQuery();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.Error("[INVENTORY DB]: Error inserting item :" + e.Message);
|
||||
}
|
||||
}
|
||||
|
||||
sql = "UPDATE inventoryfolders SET version = version + 1 WHERE folderID = @folderID";
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
|
||||
using (NpgsqlCommand command = new NpgsqlCommand(sql, conn))
|
||||
{
|
||||
command.Parameters.Add(database.CreateParameter("folderID", item.Folder.ToString()));
|
||||
conn.Open();
|
||||
try
|
||||
{
|
||||
command.ExecuteNonQuery();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.Error("[INVENTORY DB] Error updating inventory folder for new item :" + e.Message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Updates the specified inventory item
|
||||
/// </summary>
|
||||
/// <param name="item">Inventory item to update</param>
|
||||
public void updateInventoryItem(InventoryItemBase item)
|
||||
{
|
||||
string sql = @"UPDATE inventoryitems SET assetID = :assetID,
|
||||
assetType = :assetType,
|
||||
parentFolderID = :parentFolderID,
|
||||
avatarID = :avatarID,
|
||||
inventoryName = :inventoryName,
|
||||
inventoryDescription = :inventoryDescription,
|
||||
inventoryNextPermissions = :inventoryNextPermissions,
|
||||
inventoryCurrentPermissions = :inventoryCurrentPermissions,
|
||||
invType = :invType,
|
||||
creatorID = :creatorID,
|
||||
inventoryBasePermissions = :inventoryBasePermissions,
|
||||
inventoryEveryOnePermissions = :inventoryEveryOnePermissions,
|
||||
inventoryGroupPermissions = :inventoryGroupPermissions,
|
||||
salePrice = :salePrice,
|
||||
saleType = :saleType,
|
||||
creationDate = :creationDate,
|
||||
groupID = :groupID,
|
||||
groupOwned = :groupOwned,
|
||||
flags = :flags
|
||||
WHERE inventoryID = :inventoryID";
|
||||
|
||||
string itemName = item.Name;
|
||||
if (item.Name.Length > 64)
|
||||
{
|
||||
itemName = item.Name.Substring(0, 64);
|
||||
m_log.Warn("[INVENTORY DB]: Name field truncated from " + item.Name.Length.ToString() + " to " + itemName.Length.ToString() + " characters on update");
|
||||
}
|
||||
|
||||
string itemDesc = item.Description;
|
||||
if (item.Description.Length > 128)
|
||||
{
|
||||
itemDesc = item.Description.Substring(0, 128);
|
||||
m_log.Warn("[INVENTORY DB]: Description field truncated from " + item.Description.Length.ToString() + " to " + itemDesc.Length.ToString() + " characters on update");
|
||||
}
|
||||
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
|
||||
using (NpgsqlCommand command = new NpgsqlCommand(sql, conn))
|
||||
{
|
||||
command.Parameters.Add(database.CreateParameter("inventoryID", item.ID));
|
||||
command.Parameters.Add(database.CreateParameter("assetID", item.AssetID));
|
||||
command.Parameters.Add(database.CreateParameter("assetType", item.AssetType));
|
||||
command.Parameters.Add(database.CreateParameter("parentFolderID", item.Folder));
|
||||
command.Parameters.Add(database.CreateParameter("avatarID", item.Owner));
|
||||
command.Parameters.Add(database.CreateParameter("inventoryName", itemName));
|
||||
command.Parameters.Add(database.CreateParameter("inventoryDescription", itemDesc));
|
||||
command.Parameters.Add(database.CreateParameter("inventoryNextPermissions", item.NextPermissions));
|
||||
command.Parameters.Add(database.CreateParameter("inventoryCurrentPermissions", item.CurrentPermissions));
|
||||
command.Parameters.Add(database.CreateParameter("invType", item.InvType));
|
||||
command.Parameters.Add(database.CreateParameter("creatorID", item.CreatorId));
|
||||
command.Parameters.Add(database.CreateParameter("inventoryBasePermissions", item.BasePermissions));
|
||||
command.Parameters.Add(database.CreateParameter("inventoryEveryOnePermissions", item.EveryOnePermissions));
|
||||
command.Parameters.Add(database.CreateParameter("inventoryGroupPermissions", item.GroupPermissions));
|
||||
command.Parameters.Add(database.CreateParameter("salePrice", item.SalePrice));
|
||||
command.Parameters.Add(database.CreateParameter("saleType", item.SaleType));
|
||||
command.Parameters.Add(database.CreateParameter("creationDate", item.CreationDate));
|
||||
command.Parameters.Add(database.CreateParameter("groupID", item.GroupID));
|
||||
command.Parameters.Add(database.CreateParameter("groupOwned", item.GroupOwned));
|
||||
command.Parameters.Add(database.CreateParameter("flags", item.Flags));
|
||||
conn.Open();
|
||||
try
|
||||
{
|
||||
command.ExecuteNonQuery();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.Error("[INVENTORY DB]: Error updating item :" + e.Message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// See IInventoryDataPlugin
|
||||
|
||||
/// <summary>
|
||||
/// Delete an item in inventory database
|
||||
/// </summary>
|
||||
/// <param name="itemID">the item UUID</param>
|
||||
public void deleteInventoryItem(UUID itemID)
|
||||
{
|
||||
string sql = "DELETE FROM inventoryitems WHERE inventoryID=:inventoryID";
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
|
||||
{
|
||||
cmd.Parameters.Add(database.CreateParameter("inventoryID", itemID));
|
||||
try
|
||||
{
|
||||
conn.Open();
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.Error("[INVENTORY DB]: Error deleting item :" + e.Message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public InventoryItemBase queryInventoryItem(UUID itemID)
|
||||
{
|
||||
return getInventoryItem(itemID);
|
||||
}
|
||||
|
||||
public InventoryFolderBase queryInventoryFolder(UUID folderID)
|
||||
{
|
||||
return getInventoryFolder(folderID);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns all activated gesture-items in the inventory of the specified avatar.
|
||||
/// </summary>
|
||||
/// <param name="avatarID">The <see cref="UUID"/> of the avatar</param>
|
||||
/// <returns>
|
||||
/// The list of gestures (<see cref="InventoryItemBase"/>s)
|
||||
/// </returns>
|
||||
public List<InventoryItemBase> fetchActiveGestures(UUID avatarID)
|
||||
{
|
||||
string sql = "SELECT * FROM inventoryitems WHERE avatarId = :uuid AND assetType = :assetType and flags = 1";
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
|
||||
{
|
||||
cmd.Parameters.Add(database.CreateParameter("uuid", avatarID));
|
||||
cmd.Parameters.Add(database.CreateParameter("assetType", (int)AssetType.Gesture));
|
||||
conn.Open();
|
||||
using (NpgsqlDataReader reader = cmd.ExecuteReader())
|
||||
{
|
||||
List<InventoryItemBase> gestureList = new List<InventoryItemBase>();
|
||||
while (reader.Read())
|
||||
{
|
||||
gestureList.Add(readInventoryItem(reader));
|
||||
}
|
||||
return gestureList;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Private methods
|
||||
|
||||
/// <summary>
|
||||
/// Delete an item in inventory database
|
||||
/// </summary>
|
||||
/// <param name="folderID">the item ID</param>
|
||||
/// <param name="connection">connection to the database</param>
|
||||
private void DeleteItemsInFolder(UUID folderID, NpgsqlConnection connection)
|
||||
{
|
||||
using (NpgsqlCommand command = new NpgsqlCommand("DELETE FROM inventoryitems WHERE folderID=:folderID", connection))
|
||||
{
|
||||
command.Parameters.Add(database.CreateParameter("folderID", folderID));
|
||||
|
||||
try
|
||||
{
|
||||
command.ExecuteNonQuery();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.Error("[INVENTORY DB] Error deleting item :" + e.Message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the folder hierarchy in a loop.
|
||||
/// </summary>
|
||||
/// <param name="parentID">parent ID.</param>
|
||||
/// <param name="command">SQL command/connection to database</param>
|
||||
/// <returns></returns>
|
||||
private static List<InventoryFolderBase> getFolderHierarchy(UUID parentID, NpgsqlCommand command)
|
||||
{
|
||||
command.Parameters["parentID"].Value = parentID.Guid; //.ToString();
|
||||
|
||||
List<InventoryFolderBase> folders = getInventoryFolders(command);
|
||||
|
||||
if (folders.Count > 0)
|
||||
{
|
||||
List<InventoryFolderBase> tempFolders = new List<InventoryFolderBase>();
|
||||
|
||||
foreach (InventoryFolderBase folderBase in folders)
|
||||
{
|
||||
tempFolders.AddRange(getFolderHierarchy(folderBase.ID, command));
|
||||
}
|
||||
|
||||
if (tempFolders.Count > 0)
|
||||
{
|
||||
folders.AddRange(tempFolders);
|
||||
}
|
||||
}
|
||||
return folders;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the inventory folders.
|
||||
/// </summary>
|
||||
/// <param name="parentID">parentID, use UUID.Zero to get root</param>
|
||||
/// <param name="user">user id, use UUID.Zero, if you want all folders from a parentID.</param>
|
||||
/// <returns></returns>
|
||||
private List<InventoryFolderBase> getInventoryFolders(UUID parentID, UUID user)
|
||||
{
|
||||
string sql = "SELECT * FROM inventoryfolders WHERE parentFolderID = :parentID AND agentID LIKE :uuid";
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
|
||||
using (NpgsqlCommand command = new NpgsqlCommand(sql, conn))
|
||||
{
|
||||
if (user == UUID.Zero)
|
||||
{
|
||||
command.Parameters.Add(database.CreateParameter("uuid", "%"));
|
||||
}
|
||||
else
|
||||
{
|
||||
command.Parameters.Add(database.CreateParameter("uuid", user));
|
||||
}
|
||||
command.Parameters.Add(database.CreateParameter("parentID", parentID));
|
||||
conn.Open();
|
||||
return getInventoryFolders(command);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the inventory folders.
|
||||
/// </summary>
|
||||
/// <param name="command">SQLcommand.</param>
|
||||
/// <returns></returns>
|
||||
private static List<InventoryFolderBase> getInventoryFolders(NpgsqlCommand command)
|
||||
{
|
||||
using (NpgsqlDataReader reader = command.ExecuteReader())
|
||||
{
|
||||
|
||||
List<InventoryFolderBase> items = new List<InventoryFolderBase>();
|
||||
while (reader.Read())
|
||||
{
|
||||
items.Add(readInventoryFolder(reader));
|
||||
}
|
||||
return items;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Reads a list of inventory folders returned by a query.
|
||||
/// </summary>
|
||||
/// <param name="reader">A PGSQL Data Reader</param>
|
||||
/// <returns>A List containing inventory folders</returns>
|
||||
protected static InventoryFolderBase readInventoryFolder(NpgsqlDataReader reader)
|
||||
{
|
||||
try
|
||||
{
|
||||
InventoryFolderBase folder = new InventoryFolderBase();
|
||||
folder.Owner = DBGuid.FromDB(reader["agentID"]);
|
||||
folder.ParentID = DBGuid.FromDB(reader["parentFolderID"]);
|
||||
folder.ID = DBGuid.FromDB(reader["folderID"]);
|
||||
folder.Name = (string)reader["folderName"];
|
||||
folder.Type = (short)reader["type"];
|
||||
folder.Version = Convert.ToUInt16(reader["version"]);
|
||||
|
||||
return folder;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.Error("[INVENTORY DB] Error reading inventory folder :" + e.Message);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Reads a one item from an SQL result
|
||||
/// </summary>
|
||||
/// <param name="reader">The SQL Result</param>
|
||||
/// <returns>the item read</returns>
|
||||
private static InventoryItemBase readInventoryItem(IDataRecord reader)
|
||||
{
|
||||
try
|
||||
{
|
||||
InventoryItemBase item = new InventoryItemBase();
|
||||
|
||||
item.ID = DBGuid.FromDB(reader["inventoryID"]);
|
||||
item.AssetID = DBGuid.FromDB(reader["assetID"]);
|
||||
item.AssetType = Convert.ToInt32(reader["assetType"].ToString());
|
||||
item.Folder = DBGuid.FromDB(reader["parentFolderID"]);
|
||||
item.Owner = DBGuid.FromDB(reader["avatarID"]);
|
||||
item.Name = reader["inventoryName"].ToString();
|
||||
item.Description = reader["inventoryDescription"].ToString();
|
||||
item.NextPermissions = Convert.ToUInt32(reader["inventoryNextPermissions"]);
|
||||
item.CurrentPermissions = Convert.ToUInt32(reader["inventoryCurrentPermissions"]);
|
||||
item.InvType = Convert.ToInt32(reader["invType"].ToString());
|
||||
item.CreatorId = reader["creatorID"].ToString();
|
||||
item.BasePermissions = Convert.ToUInt32(reader["inventoryBasePermissions"]);
|
||||
item.EveryOnePermissions = Convert.ToUInt32(reader["inventoryEveryOnePermissions"]);
|
||||
item.GroupPermissions = Convert.ToUInt32(reader["inventoryGroupPermissions"]);
|
||||
item.SalePrice = Convert.ToInt32(reader["salePrice"]);
|
||||
item.SaleType = Convert.ToByte(reader["saleType"]);
|
||||
item.CreationDate = Convert.ToInt32(reader["creationDate"]);
|
||||
item.GroupID = DBGuid.FromDB(reader["groupID"]);
|
||||
item.GroupOwned = Convert.ToBoolean(reader["groupOwned"]);
|
||||
item.Flags = Convert.ToUInt32(reader["flags"]);
|
||||
|
||||
return item;
|
||||
}
|
||||
catch (NpgsqlException e)
|
||||
{
|
||||
m_log.Error("[INVENTORY DB]: Error reading inventory item :" + e.Message);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Delete a folder in inventory databasae
|
||||
/// </summary>
|
||||
/// <param name="folderID">the folder UUID</param>
|
||||
/// <param name="connection">connection to database</param>
|
||||
private void DeleteOneFolder(UUID folderID, NpgsqlConnection connection)
|
||||
{
|
||||
try
|
||||
{
|
||||
using (NpgsqlCommand command = new NpgsqlCommand("DELETE FROM inventoryfolders WHERE folderID=:folderID and type=-1", connection))
|
||||
{
|
||||
command.Parameters.Add(database.CreateParameter("folderID", folderID));
|
||||
|
||||
command.ExecuteNonQuery();
|
||||
}
|
||||
}
|
||||
catch (NpgsqlException e)
|
||||
{
|
||||
m_log.Error("[INVENTORY DB]: Error deleting folder :" + e.Message);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
313
OpenSim/Data/PGSQL/PGSQLManager.cs
Normal file
313
OpenSim/Data/PGSQL/PGSQLManager.cs
Normal file
@@ -0,0 +1,313 @@
|
||||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator 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.Data;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
using log4net;
|
||||
using OpenMetaverse;
|
||||
using Npgsql;
|
||||
using NpgsqlTypes;
|
||||
|
||||
namespace OpenSim.Data.PGSQL
|
||||
{
|
||||
/// <summary>
|
||||
/// A management class for the MS SQL Storage Engine
|
||||
/// </summary>
|
||||
public class PGSQLManager
|
||||
{
|
||||
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
/// <summary>
|
||||
/// Connection string for ADO.net
|
||||
/// </summary>
|
||||
private readonly string connectionString;
|
||||
|
||||
/// <summary>
|
||||
/// Initialize the manager and set the connectionstring
|
||||
/// </summary>
|
||||
/// <param name="connection"></param>
|
||||
public PGSQLManager(string connection)
|
||||
{
|
||||
connectionString = connection;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Type conversion to a SQLDbType functions
|
||||
/// </summary>
|
||||
/// <param name="type"></param>
|
||||
/// <returns></returns>
|
||||
internal NpgsqlDbType DbtypeFromType(Type type)
|
||||
{
|
||||
if (type == typeof(string))
|
||||
{
|
||||
return NpgsqlDbType.Varchar;
|
||||
}
|
||||
if (type == typeof(double))
|
||||
{
|
||||
return NpgsqlDbType.Double;
|
||||
}
|
||||
if (type == typeof(Single))
|
||||
{
|
||||
return NpgsqlDbType.Double;
|
||||
}
|
||||
if (type == typeof(int))
|
||||
{
|
||||
return NpgsqlDbType.Integer;
|
||||
}
|
||||
if (type == typeof(bool))
|
||||
{
|
||||
return NpgsqlDbType.Boolean;
|
||||
}
|
||||
if (type == typeof(UUID))
|
||||
{
|
||||
return NpgsqlDbType.Uuid;
|
||||
}
|
||||
if (type == typeof(sbyte))
|
||||
{
|
||||
return NpgsqlDbType.Integer;
|
||||
}
|
||||
if (type == typeof(Byte[]))
|
||||
{
|
||||
return NpgsqlDbType.Bytea;
|
||||
}
|
||||
if (type == typeof(uint) || type == typeof(ushort))
|
||||
{
|
||||
return NpgsqlDbType.Integer;
|
||||
}
|
||||
if (type == typeof(ulong))
|
||||
{
|
||||
return NpgsqlDbType.Bigint;
|
||||
}
|
||||
if (type == typeof(DateTime))
|
||||
{
|
||||
return NpgsqlDbType.Timestamp;
|
||||
}
|
||||
|
||||
return NpgsqlDbType.Varchar;
|
||||
}
|
||||
|
||||
internal NpgsqlDbType DbtypeFromString(Type type, string PGFieldType)
|
||||
{
|
||||
if (PGFieldType == "")
|
||||
{
|
||||
return DbtypeFromType(type);
|
||||
}
|
||||
|
||||
if (PGFieldType == "character varying")
|
||||
{
|
||||
return NpgsqlDbType.Varchar;
|
||||
}
|
||||
if (PGFieldType == "double precision")
|
||||
{
|
||||
return NpgsqlDbType.Double;
|
||||
}
|
||||
if (PGFieldType == "integer")
|
||||
{
|
||||
return NpgsqlDbType.Integer;
|
||||
}
|
||||
if (PGFieldType == "boolean")
|
||||
{
|
||||
return NpgsqlDbType.Boolean;
|
||||
}
|
||||
if (PGFieldType == "uuid")
|
||||
{
|
||||
return NpgsqlDbType.Uuid;
|
||||
}
|
||||
if (PGFieldType == "bytea")
|
||||
{
|
||||
return NpgsqlDbType.Bytea;
|
||||
}
|
||||
|
||||
return DbtypeFromType(type);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates value for parameter.
|
||||
/// </summary>
|
||||
/// <param name="value">The value.</param>
|
||||
/// <returns></returns>
|
||||
private static object CreateParameterValue(object value)
|
||||
{
|
||||
Type valueType = value.GetType();
|
||||
|
||||
if (valueType == typeof(UUID)) //TODO check if this works
|
||||
{
|
||||
return ((UUID) value).Guid;
|
||||
}
|
||||
if (valueType == typeof(UUID))
|
||||
{
|
||||
return ((UUID)value).Guid;
|
||||
}
|
||||
if (valueType == typeof(bool))
|
||||
{
|
||||
return (bool)value;
|
||||
}
|
||||
if (valueType == typeof(Byte[]))
|
||||
{
|
||||
return value;
|
||||
}
|
||||
if (valueType == typeof(int))
|
||||
{
|
||||
return value;
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Create value for parameter based on PGSQL Schema
|
||||
/// </summary>
|
||||
/// <param name="value"></param>
|
||||
/// <param name="PGFieldType"></param>
|
||||
/// <returns></returns>
|
||||
internal static object CreateParameterValue(object value, string PGFieldType)
|
||||
{
|
||||
if (PGFieldType == "uuid")
|
||||
{
|
||||
UUID uidout;
|
||||
UUID.TryParse(value.ToString(), out uidout);
|
||||
return uidout;
|
||||
}
|
||||
if (PGFieldType == "integer")
|
||||
{
|
||||
int intout;
|
||||
int.TryParse(value.ToString(), out intout);
|
||||
return intout;
|
||||
}
|
||||
if (PGFieldType == "boolean")
|
||||
{
|
||||
return (value.ToString() == "true");
|
||||
}
|
||||
if (PGFieldType == "timestamp with time zone")
|
||||
{
|
||||
return (DateTime)value;
|
||||
}
|
||||
if (PGFieldType == "timestamp without time zone")
|
||||
{
|
||||
return (DateTime)value;
|
||||
}
|
||||
return CreateParameterValue(value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Create a parameter for a command
|
||||
/// </summary>
|
||||
/// <param name="parameterName">Name of the parameter.</param>
|
||||
/// <param name="parameterObject">parameter object.</param>
|
||||
/// <returns></returns>
|
||||
internal NpgsqlParameter CreateParameter(string parameterName, object parameterObject)
|
||||
{
|
||||
return CreateParameter(parameterName, parameterObject, false);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates the parameter for a command.
|
||||
/// </summary>
|
||||
/// <param name="parameterName">Name of the parameter.</param>
|
||||
/// <param name="parameterObject">parameter object.</param>
|
||||
/// <param name="parameterOut">if set to <c>true</c> parameter is a output parameter</param>
|
||||
/// <returns></returns>
|
||||
internal NpgsqlParameter CreateParameter(string parameterName, object parameterObject, bool parameterOut)
|
||||
{
|
||||
//Tweak so we dont always have to add : sign
|
||||
if (parameterName.StartsWith(":")) parameterName = parameterName.Replace(":","");
|
||||
|
||||
//HACK if object is null, it is turned into a string, there are no nullable type till now
|
||||
if (parameterObject == null) parameterObject = "";
|
||||
|
||||
NpgsqlParameter parameter = new NpgsqlParameter(parameterName, DbtypeFromType(parameterObject.GetType()));
|
||||
|
||||
if (parameterOut)
|
||||
{
|
||||
parameter.Direction = ParameterDirection.Output;
|
||||
}
|
||||
else
|
||||
{
|
||||
parameter.Direction = ParameterDirection.Input;
|
||||
parameter.Value = CreateParameterValue(parameterObject);
|
||||
}
|
||||
|
||||
return parameter;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Create a parameter with PGSQL schema type
|
||||
/// </summary>
|
||||
/// <param name="parameterName"></param>
|
||||
/// <param name="parameterObject"></param>
|
||||
/// <param name="PGFieldType"></param>
|
||||
/// <returns></returns>
|
||||
internal NpgsqlParameter CreateParameter(string parameterName, object parameterObject, string PGFieldType)
|
||||
{
|
||||
//Tweak so we dont always have to add : sign
|
||||
if (parameterName.StartsWith(":")) parameterName = parameterName.Replace(":", "");
|
||||
|
||||
//HACK if object is null, it is turned into a string, there are no nullable type till now
|
||||
if (parameterObject == null) parameterObject = "";
|
||||
|
||||
NpgsqlParameter parameter = new NpgsqlParameter(parameterName, DbtypeFromString(parameterObject.GetType(), PGFieldType));
|
||||
|
||||
parameter.Direction = ParameterDirection.Input;
|
||||
parameter.Value = CreateParameterValue(parameterObject, PGFieldType);
|
||||
|
||||
return parameter;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Checks if we need to do some migrations to the database
|
||||
/// </summary>
|
||||
/// <param name="migrationStore">migrationStore.</param>
|
||||
public void CheckMigration(string migrationStore)
|
||||
{
|
||||
using (NpgsqlConnection connection = new NpgsqlConnection(connectionString))
|
||||
{
|
||||
connection.Open();
|
||||
Assembly assem = GetType().Assembly;
|
||||
PGSQLMigration migration = new PGSQLMigration(connection, assem, migrationStore);
|
||||
|
||||
migration.Update();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns the version of this DB provider
|
||||
/// </summary>
|
||||
/// <returns>A string containing the DB provider</returns>
|
||||
public string getVersion()
|
||||
{
|
||||
Module module = GetType().Module;
|
||||
// string dllName = module.Assembly.ManifestModule.Name;
|
||||
Version dllVersion = module.Assembly.GetName().Version;
|
||||
|
||||
return
|
||||
string.Format("{0}.{1}.{2}.{3}", dllVersion.Major, dllVersion.Minor, dllVersion.Build,
|
||||
dllVersion.Revision);
|
||||
}
|
||||
}
|
||||
}
|
||||
102
OpenSim/Data/PGSQL/PGSQLMigration.cs
Normal file
102
OpenSim/Data/PGSQL/PGSQLMigration.cs
Normal file
@@ -0,0 +1,102 @@
|
||||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator 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 Npgsql;
|
||||
using System;
|
||||
using System.Data;
|
||||
using System.Data.Common;
|
||||
using System.Reflection;
|
||||
|
||||
namespace OpenSim.Data.PGSQL
|
||||
{
|
||||
public class PGSQLMigration : Migration
|
||||
{
|
||||
public PGSQLMigration(NpgsqlConnection conn, Assembly assem, string type)
|
||||
: base(conn, assem, type)
|
||||
{
|
||||
}
|
||||
|
||||
public PGSQLMigration(NpgsqlConnection conn, Assembly assem, string subtype, string type)
|
||||
: base(conn, assem, subtype, type)
|
||||
{
|
||||
}
|
||||
|
||||
protected override int FindVersion(DbConnection conn, string type)
|
||||
{
|
||||
int version = 0;
|
||||
NpgsqlConnection lcConn = (NpgsqlConnection)conn;
|
||||
|
||||
using (NpgsqlCommand cmd = lcConn.CreateCommand())
|
||||
{
|
||||
try
|
||||
{
|
||||
cmd.CommandText = "select version from migrations where name = '" + type + "' " +
|
||||
" order by version desc limit 1"; //Must be
|
||||
using (NpgsqlDataReader reader = cmd.ExecuteReader())
|
||||
{
|
||||
if (reader.Read())
|
||||
{
|
||||
version = Convert.ToInt32(reader["version"]);
|
||||
}
|
||||
reader.Close();
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
// Return -1 to indicate table does not exist
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
return version;
|
||||
}
|
||||
|
||||
protected override void ExecuteScript(DbConnection conn, string[] script)
|
||||
{
|
||||
if (!(conn is NpgsqlConnection))
|
||||
{
|
||||
base.ExecuteScript(conn, script);
|
||||
return;
|
||||
}
|
||||
|
||||
foreach (string sql in script)
|
||||
{
|
||||
try
|
||||
{
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, (NpgsqlConnection)conn))
|
||||
{
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
throw new Exception(sql);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
115
OpenSim/Data/PGSQL/PGSQLPresenceData.cs
Normal file
115
OpenSim/Data/PGSQL/PGSQLPresenceData.cs
Normal file
@@ -0,0 +1,115 @@
|
||||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator 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.Data;
|
||||
using System.Reflection;
|
||||
using System.Threading;
|
||||
using log4net;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using Npgsql;
|
||||
|
||||
namespace OpenSim.Data.PGSQL
|
||||
{
|
||||
/// <summary>
|
||||
/// A MySQL Interface for the Presence Server
|
||||
/// </summary>
|
||||
public class PGSQLPresenceData : PGSQLGenericTableHandler<PresenceData>,
|
||||
IPresenceData
|
||||
{
|
||||
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
public PGSQLPresenceData(string connectionString, string realm) :
|
||||
base(connectionString, realm, "Presence")
|
||||
{
|
||||
}
|
||||
|
||||
public PresenceData Get(UUID sessionID)
|
||||
{
|
||||
PresenceData[] ret = Get("SessionID", sessionID.ToString());
|
||||
|
||||
if (ret.Length == 0)
|
||||
return null;
|
||||
|
||||
return ret[0];
|
||||
}
|
||||
|
||||
public void LogoutRegionAgents(UUID regionID)
|
||||
{
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand())
|
||||
{
|
||||
|
||||
cmd.CommandText = String.Format("DELETE FROM {0} WHERE RegionID=:RegionID", m_Realm);
|
||||
|
||||
cmd.Parameters.Add(m_database.CreateParameter("RegionID", regionID));
|
||||
cmd.Connection = conn;
|
||||
conn.Open();
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
}
|
||||
|
||||
public bool ReportAgent(UUID sessionID, UUID regionID)
|
||||
{
|
||||
PresenceData[] pd = Get("SessionID", sessionID.ToString());
|
||||
if (pd.Length == 0)
|
||||
return false;
|
||||
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand())
|
||||
{
|
||||
|
||||
cmd.CommandText = String.Format(@"UPDATE {0} SET
|
||||
RegionID = :RegionID
|
||||
WHERE SessionID = :SessionID", m_Realm);
|
||||
|
||||
cmd.Parameters.Add(m_database.CreateParameter("SessionID", sessionID));
|
||||
cmd.Parameters.Add(m_database.CreateParameter("RegionID", regionID));
|
||||
cmd.Connection = conn;
|
||||
conn.Open();
|
||||
if (cmd.ExecuteNonQuery() == 0)
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public bool VerifyAgent(UUID agentId, UUID secureSessionID)
|
||||
{
|
||||
PresenceData[] ret = Get("SecureSessionID", secureSessionID.ToString());
|
||||
|
||||
if (ret.Length == 0)
|
||||
return false;
|
||||
|
||||
if(ret[0].UserID != agentId.ToString())
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
356
OpenSim/Data/PGSQL/PGSQLRegionData.cs
Normal file
356
OpenSim/Data/PGSQL/PGSQLRegionData.cs
Normal file
@@ -0,0 +1,356 @@
|
||||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator 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.Data;
|
||||
using System.Drawing;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
using log4net;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
using RegionFlags = OpenSim.Framework.RegionFlags;
|
||||
using Npgsql;
|
||||
|
||||
namespace OpenSim.Data.PGSQL
|
||||
{
|
||||
/// <summary>
|
||||
/// A PGSQL Interface for the Region Server.
|
||||
/// </summary>
|
||||
public class PGSQLRegionData : IRegionData
|
||||
{
|
||||
private string m_Realm;
|
||||
private List<string> m_ColumnNames = null;
|
||||
private string m_ConnectionString;
|
||||
private PGSQLManager m_database;
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
public PGSQLRegionData(string connectionString, string realm)
|
||||
{
|
||||
m_Realm = realm;
|
||||
m_ConnectionString = connectionString;
|
||||
m_database = new PGSQLManager(connectionString);
|
||||
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
|
||||
{
|
||||
conn.Open();
|
||||
Migration m = new Migration(conn, GetType().Assembly, "GridStore");
|
||||
m.Update();
|
||||
}
|
||||
}
|
||||
|
||||
public List<RegionData> Get(string regionName, UUID scopeID)
|
||||
{
|
||||
string sql = "select * from "+m_Realm+" where regionName like :regionName";
|
||||
if (scopeID != UUID.Zero)
|
||||
sql += " and ScopeID = :scopeID";
|
||||
sql += " order by regionName";
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
|
||||
{
|
||||
cmd.Parameters.Add(m_database.CreateParameter("regionName", regionName));
|
||||
if (scopeID != UUID.Zero)
|
||||
cmd.Parameters.Add(m_database.CreateParameter("scopeID", scopeID));
|
||||
conn.Open();
|
||||
return RunCommand(cmd);
|
||||
}
|
||||
}
|
||||
|
||||
public RegionData Get(int posX, int posY, UUID scopeID)
|
||||
{
|
||||
string sql = "select * from "+m_Realm+" where locX = :posX and locY = :posY";
|
||||
if (scopeID != UUID.Zero)
|
||||
sql += " and ScopeID = :scopeID";
|
||||
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
|
||||
{
|
||||
cmd.Parameters.Add(m_database.CreateParameter("posX", posX));
|
||||
cmd.Parameters.Add(m_database.CreateParameter("posY", posY));
|
||||
if (scopeID != UUID.Zero)
|
||||
cmd.Parameters.Add(m_database.CreateParameter("scopeID", scopeID));
|
||||
conn.Open();
|
||||
List<RegionData> ret = RunCommand(cmd);
|
||||
if (ret.Count == 0)
|
||||
return null;
|
||||
|
||||
return ret[0];
|
||||
}
|
||||
}
|
||||
|
||||
public RegionData Get(UUID regionID, UUID scopeID)
|
||||
{
|
||||
string sql = "select * from "+m_Realm+" where uuid = :regionID";
|
||||
if (scopeID != UUID.Zero)
|
||||
sql += " and ScopeID = :scopeID";
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
|
||||
{
|
||||
cmd.Parameters.Add(m_database.CreateParameter("regionID", regionID));
|
||||
if (scopeID != UUID.Zero)
|
||||
cmd.Parameters.Add(m_database.CreateParameter("scopeID", scopeID));
|
||||
conn.Open();
|
||||
List<RegionData> ret = RunCommand(cmd);
|
||||
if (ret.Count == 0)
|
||||
return null;
|
||||
|
||||
return ret[0];
|
||||
}
|
||||
}
|
||||
|
||||
public List<RegionData> Get(int startX, int startY, int endX, int endY, UUID scopeID)
|
||||
{
|
||||
string sql = "select * from "+m_Realm+" where locX between :startX and :endX and locY between :startY and :endY";
|
||||
if (scopeID != UUID.Zero)
|
||||
sql += " and ScopeID = :scopeID";
|
||||
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
|
||||
{
|
||||
cmd.Parameters.Add(m_database.CreateParameter("startX", startX));
|
||||
cmd.Parameters.Add(m_database.CreateParameter("startY", startY));
|
||||
cmd.Parameters.Add(m_database.CreateParameter("endX", endX));
|
||||
cmd.Parameters.Add(m_database.CreateParameter("endY", endY));
|
||||
cmd.Parameters.Add(m_database.CreateParameter("scopeID", scopeID));
|
||||
conn.Open();
|
||||
return RunCommand(cmd);
|
||||
}
|
||||
}
|
||||
|
||||
public List<RegionData> RunCommand(NpgsqlCommand cmd)
|
||||
{
|
||||
List<RegionData> retList = new List<RegionData>();
|
||||
|
||||
NpgsqlDataReader result = cmd.ExecuteReader();
|
||||
|
||||
while (result.Read())
|
||||
{
|
||||
RegionData ret = new RegionData();
|
||||
ret.Data = new Dictionary<string, object>();
|
||||
|
||||
UUID regionID;
|
||||
UUID.TryParse(result["uuid"].ToString(), out regionID);
|
||||
ret.RegionID = regionID;
|
||||
UUID scope;
|
||||
UUID.TryParse(result["ScopeID"].ToString(), out scope);
|
||||
ret.ScopeID = scope;
|
||||
ret.RegionName = result["regionName"].ToString();
|
||||
ret.posX = Convert.ToInt32(result["locX"]);
|
||||
ret.posY = Convert.ToInt32(result["locY"]);
|
||||
ret.sizeX = Convert.ToInt32(result["sizeX"]);
|
||||
ret.sizeY = Convert.ToInt32(result["sizeY"]);
|
||||
|
||||
if (m_ColumnNames == null)
|
||||
{
|
||||
m_ColumnNames = new List<string>();
|
||||
|
||||
DataTable schemaTable = result.GetSchemaTable();
|
||||
foreach (DataRow row in schemaTable.Rows)
|
||||
m_ColumnNames.Add(row["ColumnName"].ToString());
|
||||
}
|
||||
|
||||
foreach (string s in m_ColumnNames)
|
||||
{
|
||||
if (s == "uuid")
|
||||
continue;
|
||||
if (s == "ScopeID")
|
||||
continue;
|
||||
if (s == "regionName")
|
||||
continue;
|
||||
if (s == "locX")
|
||||
continue;
|
||||
if (s == "locY")
|
||||
continue;
|
||||
|
||||
ret.Data[s] = result[s].ToString();
|
||||
}
|
||||
|
||||
retList.Add(ret);
|
||||
}
|
||||
return retList;
|
||||
}
|
||||
|
||||
public bool Store(RegionData data)
|
||||
{
|
||||
if (data.Data.ContainsKey("uuid"))
|
||||
data.Data.Remove("uuid");
|
||||
if (data.Data.ContainsKey("ScopeID"))
|
||||
data.Data.Remove("ScopeID");
|
||||
if (data.Data.ContainsKey("regionName"))
|
||||
data.Data.Remove("regionName");
|
||||
if (data.Data.ContainsKey("posX"))
|
||||
data.Data.Remove("posX");
|
||||
if (data.Data.ContainsKey("posY"))
|
||||
data.Data.Remove("posY");
|
||||
if (data.Data.ContainsKey("sizeX"))
|
||||
data.Data.Remove("sizeX");
|
||||
if (data.Data.ContainsKey("sizeY"))
|
||||
data.Data.Remove("sizeY");
|
||||
if (data.Data.ContainsKey("locX"))
|
||||
data.Data.Remove("locX");
|
||||
if (data.Data.ContainsKey("locY"))
|
||||
data.Data.Remove("locY");
|
||||
|
||||
string[] fields = new List<string>(data.Data.Keys).ToArray();
|
||||
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand())
|
||||
{
|
||||
|
||||
string update = "update " + m_Realm + " set locX=:posX, locY=:posY, sizeX=:sizeX, sizeY=:sizeY ";
|
||||
|
||||
foreach (string field in fields)
|
||||
{
|
||||
|
||||
update += ", ";
|
||||
update += " " + field + " = :" + field;
|
||||
|
||||
cmd.Parameters.Add(m_database.CreateParameter("" + field, data.Data[field]));
|
||||
}
|
||||
|
||||
update += " where uuid = :regionID";
|
||||
|
||||
if (data.ScopeID != UUID.Zero)
|
||||
update += " and ScopeID = :scopeID";
|
||||
|
||||
cmd.CommandText = update;
|
||||
cmd.Connection = conn;
|
||||
cmd.Parameters.Add(m_database.CreateParameter("regionID", data.RegionID));
|
||||
cmd.Parameters.Add(m_database.CreateParameter("regionName", data.RegionName));
|
||||
cmd.Parameters.Add(m_database.CreateParameter("scopeID", data.ScopeID));
|
||||
cmd.Parameters.Add(m_database.CreateParameter("posX", data.posX));
|
||||
cmd.Parameters.Add(m_database.CreateParameter("posY", data.posY));
|
||||
cmd.Parameters.Add(m_database.CreateParameter("sizeX", data.sizeX));
|
||||
cmd.Parameters.Add(m_database.CreateParameter("sizeY", data.sizeY));
|
||||
conn.Open();
|
||||
try
|
||||
{
|
||||
if (cmd.ExecuteNonQuery() < 1)
|
||||
{
|
||||
string insert = "insert into " + m_Realm + " (uuid, ScopeID, locX, locY, sizeX, sizeY, regionName, " +
|
||||
String.Join(", ", fields) +
|
||||
") values (:regionID, :scopeID, :posX, :posY, :sizeX, :sizeY, :regionName, :" + String.Join(", :", fields) + ")";
|
||||
|
||||
cmd.CommandText = insert;
|
||||
|
||||
try
|
||||
{
|
||||
if (cmd.ExecuteNonQuery() < 1)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
m_log.Warn("[PGSQL Grid]: Error inserting into Regions table: " + ex.Message + ", INSERT sql: " + insert);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
m_log.Warn("[PGSQL Grid]: Error updating Regions table: " + ex.Message + ", UPDATE sql: " + update);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public bool SetDataItem(UUID regionID, string item, string value)
|
||||
{
|
||||
string sql = "update " + m_Realm +
|
||||
" set " + item + " = :" + item + " where uuid = :UUID";
|
||||
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
|
||||
{
|
||||
cmd.Parameters.Add(m_database.CreateParameter("" + item, value));
|
||||
cmd.Parameters.Add(m_database.CreateParameter("UUID", regionID));
|
||||
conn.Open();
|
||||
if (cmd.ExecuteNonQuery() > 0)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public bool Delete(UUID regionID)
|
||||
{
|
||||
string sql = "delete from " + m_Realm +
|
||||
" where uuid = :UUID";
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
|
||||
{
|
||||
cmd.Parameters.Add(m_database.CreateParameter("UUID", regionID));
|
||||
conn.Open();
|
||||
if (cmd.ExecuteNonQuery() > 0)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public List<RegionData> GetDefaultRegions(UUID scopeID)
|
||||
{
|
||||
return Get((int)RegionFlags.DefaultRegion, scopeID);
|
||||
}
|
||||
|
||||
public List<RegionData> GetDefaultHypergridRegions(UUID scopeID)
|
||||
{
|
||||
return Get((int)RegionFlags.DefaultHGRegion, scopeID);
|
||||
}
|
||||
|
||||
public List<RegionData> GetFallbackRegions(UUID scopeID, int x, int y)
|
||||
{
|
||||
List<RegionData> regions = Get((int)RegionFlags.FallbackRegion, scopeID);
|
||||
RegionDataDistanceCompare distanceComparer = new RegionDataDistanceCompare(x, y);
|
||||
regions.Sort(distanceComparer);
|
||||
|
||||
return regions;
|
||||
}
|
||||
|
||||
public List<RegionData> GetHyperlinks(UUID scopeID)
|
||||
{
|
||||
return Get((int)RegionFlags.Hyperlink, scopeID);
|
||||
}
|
||||
|
||||
private List<RegionData> Get(int regionFlags, UUID scopeID)
|
||||
{
|
||||
string sql = "SELECT * FROM " + m_Realm + " WHERE (flags & " + regionFlags.ToString() + ") <> 0";
|
||||
if (scopeID != UUID.Zero)
|
||||
sql += " AND ScopeID = :scopeID";
|
||||
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
|
||||
{
|
||||
cmd.Parameters.Add(m_database.CreateParameter("scopeID", scopeID));
|
||||
conn.Open();
|
||||
return RunCommand(cmd);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
2243
OpenSim/Data/PGSQL/PGSQLSimulationData.cs
Normal file
2243
OpenSim/Data/PGSQL/PGSQLSimulationData.cs
Normal file
File diff suppressed because it is too large
Load Diff
327
OpenSim/Data/PGSQL/PGSQLUserAccountData.cs
Normal file
327
OpenSim/Data/PGSQL/PGSQLUserAccountData.cs
Normal file
@@ -0,0 +1,327 @@
|
||||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator 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;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using System.Text;
|
||||
using Npgsql;
|
||||
using log4net;
|
||||
using System.Reflection;
|
||||
|
||||
namespace OpenSim.Data.PGSQL
|
||||
{
|
||||
public class PGSQLUserAccountData : PGSQLGenericTableHandler<UserAccountData>,IUserAccountData
|
||||
{
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
/*
|
||||
public PGSQLUserAccountData(string connectionString, string realm) :
|
||||
base(connectionString, realm, "UserAccount")
|
||||
{
|
||||
}
|
||||
*/
|
||||
|
||||
private string m_Realm;
|
||||
private List<string> m_ColumnNames = null;
|
||||
private PGSQLManager m_database;
|
||||
|
||||
public PGSQLUserAccountData(string connectionString, string realm) :
|
||||
base(connectionString, realm, "UserAccount")
|
||||
{
|
||||
m_Realm = realm;
|
||||
m_ConnectionString = connectionString;
|
||||
m_database = new PGSQLManager(connectionString);
|
||||
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
|
||||
{
|
||||
conn.Open();
|
||||
Migration m = new Migration(conn, GetType().Assembly, "UserAccount");
|
||||
m.Update();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
public List<UserAccountData> Query(UUID principalID, UUID scopeID, string query)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
*/
|
||||
|
||||
public override UserAccountData[] Get(string[] fields, string[] keys)
|
||||
{
|
||||
UserAccountData[] retUA = base.Get(fields,keys);
|
||||
|
||||
if (retUA.Length > 0)
|
||||
{
|
||||
Dictionary<string, string> data = retUA[0].Data;
|
||||
Dictionary<string, string> data2 = new Dictionary<string, string>();
|
||||
|
||||
foreach (KeyValuePair<string,string> chave in data)
|
||||
{
|
||||
string s2 = chave.Key;
|
||||
|
||||
if (s2 == "created") s2 = "Created";
|
||||
if (s2 == "userlevel") s2 = "UserLevel";
|
||||
if (s2 == "UserTitle") s2 = "UserTitle";
|
||||
if (s2 == "userflags") s2 = "UserFlags";
|
||||
if (s2 == "serviceurls") s2 = "ServiceURLs";
|
||||
|
||||
data2[s2] = chave.Value;
|
||||
|
||||
if (m_FieldTypes.ContainsKey(chave.Key))
|
||||
{
|
||||
string tipo = "";
|
||||
m_FieldTypes.TryGetValue(chave.Key, out tipo);
|
||||
m_FieldTypes.Add(s2, tipo);
|
||||
}
|
||||
}
|
||||
foreach (KeyValuePair<string, string> chave in data2)
|
||||
{
|
||||
if (!retUA[0].Data.ContainsKey(chave.Key))
|
||||
retUA[0].Data.Add(chave.Key, chave.Value);
|
||||
}
|
||||
}
|
||||
|
||||
return retUA;
|
||||
}
|
||||
|
||||
public UserAccountData Get(UUID principalID, UUID scopeID)
|
||||
{
|
||||
UserAccountData ret = new UserAccountData();
|
||||
ret.Data = new Dictionary<string, string>();
|
||||
|
||||
string sql = string.Format("select * from {0} where principalID = :principalID", m_Realm);
|
||||
if (scopeID != UUID.Zero)
|
||||
sql += " and ScopeID = :scopeID";
|
||||
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
|
||||
{
|
||||
cmd.Parameters.Add(m_database.CreateParameter("principalID", principalID));
|
||||
cmd.Parameters.Add(m_database.CreateParameter("scopeID", scopeID));
|
||||
|
||||
conn.Open();
|
||||
using (NpgsqlDataReader result = cmd.ExecuteReader())
|
||||
{
|
||||
if (result.Read())
|
||||
{
|
||||
ret.PrincipalID = principalID;
|
||||
UUID scope;
|
||||
UUID.TryParse(result["scopeid"].ToString(), out scope);
|
||||
ret.ScopeID = scope;
|
||||
|
||||
if (m_ColumnNames == null)
|
||||
{
|
||||
m_ColumnNames = new List<string>();
|
||||
|
||||
DataTable schemaTable = result.GetSchemaTable();
|
||||
foreach (DataRow row in schemaTable.Rows)
|
||||
m_ColumnNames.Add(row["ColumnName"].ToString());
|
||||
}
|
||||
|
||||
foreach (string s in m_ColumnNames)
|
||||
{
|
||||
string s2 = s;
|
||||
if (s2 == "uuid")
|
||||
continue;
|
||||
if (s2 == "scopeid")
|
||||
continue;
|
||||
|
||||
ret.Data[s] = result[s].ToString();
|
||||
ret.Data[s2] = result[s].ToString();
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
public override bool Store(UserAccountData data)
|
||||
{
|
||||
if (data.Data.ContainsKey("principalid"))
|
||||
data.Data.Remove("principalid");
|
||||
if (data.Data.ContainsKey("scopeid"))
|
||||
data.Data.Remove("scopeid");
|
||||
|
||||
string[] fields = new List<string>(data.Data.Keys).ToArray();
|
||||
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand())
|
||||
{
|
||||
m_log.DebugFormat("[USER]: Try to update user {0} {1}", data.FirstName, data.LastName);
|
||||
|
||||
StringBuilder updateBuilder = new StringBuilder();
|
||||
updateBuilder.AppendFormat("update {0} set ", m_Realm);
|
||||
bool first = true;
|
||||
foreach (string field in fields)
|
||||
{
|
||||
if (!first)
|
||||
updateBuilder.Append(", ");
|
||||
updateBuilder.AppendFormat("{0} = :{0}", field);
|
||||
|
||||
first = false;
|
||||
if (m_FieldTypes.ContainsKey(field.ToLower()))
|
||||
cmd.Parameters.Add(m_database.CreateParameter("" + field, data.Data[field], m_FieldTypes[field.ToLower()]));
|
||||
else
|
||||
cmd.Parameters.Add(m_database.CreateParameter("" + field, data.Data[field]));
|
||||
}
|
||||
|
||||
updateBuilder.Append(" where principalid = :principalID");
|
||||
|
||||
if (data.ScopeID != UUID.Zero)
|
||||
updateBuilder.Append(" and ScopeID = :scopeID");
|
||||
|
||||
cmd.CommandText = updateBuilder.ToString();
|
||||
cmd.Connection = conn;
|
||||
cmd.Parameters.Add(m_database.CreateParameter("principalID", data.PrincipalID));
|
||||
cmd.Parameters.Add(m_database.CreateParameter("scopeID", data.ScopeID));
|
||||
|
||||
m_log.DebugFormat("[USER]: SQL update user {0} ", cmd.CommandText);
|
||||
|
||||
conn.Open();
|
||||
|
||||
m_log.DebugFormat("[USER]: CON opened update user {0} ", cmd.CommandText);
|
||||
|
||||
int conta = 0;
|
||||
try
|
||||
{
|
||||
conta = cmd.ExecuteNonQuery();
|
||||
}
|
||||
catch (Exception e){
|
||||
m_log.ErrorFormat("[USER]: ERROR opened update user {0} ", e.Message);
|
||||
}
|
||||
|
||||
|
||||
if (conta < 1)
|
||||
{
|
||||
|
||||
m_log.DebugFormat("[USER]: Try to insert user {0} {1}", data.FirstName, data.LastName);
|
||||
|
||||
StringBuilder insertBuilder = new StringBuilder();
|
||||
insertBuilder.AppendFormat("insert into {0} (principalid, ScopeID, ", m_Realm);
|
||||
insertBuilder.Append(String.Join(", ", fields));
|
||||
insertBuilder.Append(") values (:principalID, :scopeID, :");
|
||||
insertBuilder.Append(String.Join(", :", fields));
|
||||
insertBuilder.Append(")");
|
||||
|
||||
cmd.CommandText = insertBuilder.ToString();
|
||||
|
||||
if (cmd.ExecuteNonQuery() < 1)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
m_log.DebugFormat("[USER]: User {0} {1} exists", data.FirstName, data.LastName);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
public bool Store(UserAccountData data, UUID principalID, string token)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
public bool SetDataItem(UUID principalID, string item, string value)
|
||||
{
|
||||
string sql = string.Format("update {0} set {1} = :{1} where UUID = :UUID", m_Realm, item);
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
|
||||
{
|
||||
if (m_FieldTypes.ContainsKey(item))
|
||||
cmd.Parameters.Add(m_database.CreateParameter("" + item, value, m_FieldTypes[item]));
|
||||
else
|
||||
cmd.Parameters.Add(m_database.CreateParameter("" + item, value));
|
||||
|
||||
cmd.Parameters.Add(m_database.CreateParameter("UUID", principalID));
|
||||
conn.Open();
|
||||
|
||||
if (cmd.ExecuteNonQuery() > 0)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
//public UserAccountData[] Get(string[] keys, string[] vals)
|
||||
//{
|
||||
// return null;
|
||||
//}
|
||||
|
||||
public UserAccountData[] GetUsers(UUID scopeID, string query)
|
||||
{
|
||||
string[] words = query.Split(new char[] { ' ' });
|
||||
|
||||
for (int i = 0; i < words.Length; i++)
|
||||
{
|
||||
if (words[i].Length < 3)
|
||||
{
|
||||
if (i != words.Length - 1)
|
||||
Array.Copy(words, i + 1, words, i, words.Length - i - 1);
|
||||
Array.Resize(ref words, words.Length - 1);
|
||||
}
|
||||
}
|
||||
|
||||
if (words.Length == 0)
|
||||
return new UserAccountData[0];
|
||||
|
||||
if (words.Length > 2)
|
||||
return new UserAccountData[0];
|
||||
|
||||
string sql = "";
|
||||
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand())
|
||||
{
|
||||
if (words.Length == 1)
|
||||
{
|
||||
sql = String.Format("select * from {0} where (ScopeID=:ScopeID or ScopeID='00000000-0000-0000-0000-000000000000') and (FirstName like :search or LastName like :search)", m_Realm);
|
||||
cmd.Parameters.Add(m_database.CreateParameter("scopeID", scopeID));
|
||||
cmd.Parameters.Add(m_database.CreateParameter("search", "%" + words[0] + "%"));
|
||||
}
|
||||
else
|
||||
{
|
||||
sql = String.Format("select * from {0} where (ScopeID=:ScopeID or ScopeID='00000000-0000-0000-0000-000000000000') and (FirstName like :searchFirst or LastName like :searchLast)", m_Realm);
|
||||
cmd.Parameters.Add(m_database.CreateParameter("searchFirst", "%" + words[0] + "%"));
|
||||
cmd.Parameters.Add(m_database.CreateParameter("searchLast", "%" + words[1] + "%"));
|
||||
cmd.Parameters.Add(m_database.CreateParameter("ScopeID", scopeID.ToString()));
|
||||
}
|
||||
cmd.Connection = conn;
|
||||
cmd.CommandText = sql;
|
||||
conn.Open();
|
||||
return DoQuery(cmd);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
317
OpenSim/Data/PGSQL/PGSQLXInventoryData.cs
Normal file
317
OpenSim/Data/PGSQL/PGSQLXInventoryData.cs
Normal file
@@ -0,0 +1,317 @@
|
||||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator 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;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using log4net;
|
||||
using Npgsql;
|
||||
|
||||
namespace OpenSim.Data.PGSQL
|
||||
{
|
||||
public class PGSQLXInventoryData : IXInventoryData
|
||||
{
|
||||
// private static readonly ILog m_log = LogManager.GetLogger(
|
||||
// MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
private PGSQLFolderHandler m_Folders;
|
||||
private PGSQLItemHandler m_Items;
|
||||
|
||||
public PGSQLXInventoryData(string conn, string realm)
|
||||
{
|
||||
m_Folders = new PGSQLFolderHandler(
|
||||
conn, "inventoryfolders", "InventoryStore");
|
||||
m_Items = new PGSQLItemHandler(
|
||||
conn, "inventoryitems", String.Empty);
|
||||
}
|
||||
|
||||
public static UUID str2UUID(string strUUID)
|
||||
{
|
||||
UUID newUUID = UUID.Zero;
|
||||
|
||||
UUID.TryParse(strUUID, out newUUID);
|
||||
|
||||
return newUUID;
|
||||
}
|
||||
|
||||
public XInventoryFolder[] GetFolders(string[] fields, string[] vals)
|
||||
{
|
||||
return m_Folders.Get(fields, vals);
|
||||
}
|
||||
|
||||
public XInventoryItem[] GetItems(string[] fields, string[] vals)
|
||||
{
|
||||
return m_Items.Get(fields, vals);
|
||||
}
|
||||
|
||||
public bool StoreFolder(XInventoryFolder folder)
|
||||
{
|
||||
if (folder.folderName.Length > 64)
|
||||
folder.folderName = folder.folderName.Substring(0, 64);
|
||||
return m_Folders.Store(folder);
|
||||
}
|
||||
|
||||
public bool StoreItem(XInventoryItem item)
|
||||
{
|
||||
if (item.inventoryName.Length > 64)
|
||||
item.inventoryName = item.inventoryName.Substring(0, 64);
|
||||
if (item.inventoryDescription.Length > 128)
|
||||
item.inventoryDescription = item.inventoryDescription.Substring(0, 128);
|
||||
|
||||
return m_Items.Store(item);
|
||||
}
|
||||
|
||||
public bool DeleteFolders(string field, string val)
|
||||
{
|
||||
return m_Folders.Delete(field, val);
|
||||
}
|
||||
|
||||
public bool DeleteFolders(string[] fields, string[] vals)
|
||||
{
|
||||
return m_Folders.Delete(fields, vals);
|
||||
}
|
||||
|
||||
public bool DeleteItems(string field, string val)
|
||||
{
|
||||
return m_Items.Delete(field, val);
|
||||
}
|
||||
|
||||
public bool DeleteItems(string[] fields, string[] vals)
|
||||
{
|
||||
return m_Items.Delete(fields, vals);
|
||||
}
|
||||
|
||||
public bool MoveItem(string id, string newParent)
|
||||
{
|
||||
return m_Items.MoveItem(id, newParent);
|
||||
}
|
||||
|
||||
public bool MoveFolder(string id, string newParent)
|
||||
{
|
||||
return m_Folders.MoveFolder(id, newParent);
|
||||
}
|
||||
|
||||
public XInventoryItem[] GetActiveGestures(UUID principalID)
|
||||
{
|
||||
return m_Items.GetActiveGestures(principalID.ToString());
|
||||
}
|
||||
|
||||
public int GetAssetPermissions(UUID principalID, UUID assetID)
|
||||
{
|
||||
return m_Items.GetAssetPermissions(principalID, assetID);
|
||||
}
|
||||
}
|
||||
|
||||
public class PGSQLItemHandler : PGSQLInventoryHandler<XInventoryItem>
|
||||
{
|
||||
public PGSQLItemHandler(string c, string t, string m) :
|
||||
base(c, t, m)
|
||||
{
|
||||
}
|
||||
|
||||
public bool MoveItem(string id, string newParent)
|
||||
{
|
||||
XInventoryItem[] retrievedItems = Get(new string[] { "inventoryID" }, new string[] { id });
|
||||
if (retrievedItems.Length == 0)
|
||||
return false;
|
||||
|
||||
UUID oldParent = retrievedItems[0].parentFolderID;
|
||||
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
|
||||
{
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand())
|
||||
{
|
||||
|
||||
cmd.CommandText = String.Format("update {0} set parentFolderID = :ParentFolderID where inventoryID = :InventoryID", m_Realm);
|
||||
cmd.Parameters.Add(m_database.CreateParameter("ParentFolderID", newParent ));
|
||||
cmd.Parameters.Add(m_database.CreateParameter("InventoryID", id ));
|
||||
cmd.Connection = conn;
|
||||
conn.Open();
|
||||
|
||||
if (cmd.ExecuteNonQuery() == 0)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
IncrementFolderVersion(oldParent);
|
||||
IncrementFolderVersion(newParent);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public XInventoryItem[] GetActiveGestures(string principalID)
|
||||
{
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
|
||||
{
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand())
|
||||
{
|
||||
cmd.CommandText = String.Format("select * from inventoryitems where avatarId = :uuid and assetType = :type and flags = 1", m_Realm);
|
||||
|
||||
cmd.Parameters.Add(m_database.CreateParameter("uuid", principalID ));
|
||||
cmd.Parameters.Add(m_database.CreateParameter("type", (int)AssetType.Gesture));
|
||||
cmd.Connection = conn;
|
||||
conn.Open();
|
||||
return DoQuery(cmd);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public int GetAssetPermissions(UUID principalID, UUID assetID)
|
||||
{
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
|
||||
{
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand())
|
||||
{
|
||||
cmd.CommandText = String.Format("select bit_or(inventoryCurrentPermissions) as inventoryCurrentPermissions " +
|
||||
" from inventoryitems where avatarID = :PrincipalID " +
|
||||
" and assetID = ':AssetID' group by assetID", m_Realm);
|
||||
|
||||
cmd.Parameters.Add(m_database.CreateParameter("PrincipalID", principalID));
|
||||
cmd.Parameters.Add(m_database.CreateParameter("AssetID", assetID));
|
||||
cmd.Connection = conn;
|
||||
conn.Open();
|
||||
using (NpgsqlDataReader reader = cmd.ExecuteReader())
|
||||
{
|
||||
|
||||
int perms = 0;
|
||||
|
||||
if (reader.Read())
|
||||
{
|
||||
perms = Convert.ToInt32(reader["inventoryCurrentPermissions"]);
|
||||
}
|
||||
|
||||
return perms;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public override bool Store(XInventoryItem item)
|
||||
{
|
||||
if (!base.Store(item))
|
||||
return false;
|
||||
|
||||
IncrementFolderVersion(item.parentFolderID);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public class PGSQLFolderHandler : PGSQLInventoryHandler<XInventoryFolder>
|
||||
{
|
||||
public PGSQLFolderHandler(string c, string t, string m) :
|
||||
base(c, t, m)
|
||||
{
|
||||
}
|
||||
|
||||
public bool MoveFolder(string id, string newParentFolderID)
|
||||
{
|
||||
XInventoryFolder[] folders = Get(new string[] { "folderID" }, new string[] { id });
|
||||
|
||||
if (folders.Length == 0)
|
||||
return false;
|
||||
|
||||
UUID oldParentFolderUUID = folders[0].parentFolderID;
|
||||
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
|
||||
{
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand())
|
||||
{
|
||||
|
||||
cmd.CommandText = String.Format("update {0} set parentFolderID = :ParentFolderID where folderID = :folderID", m_Realm);
|
||||
cmd.Parameters.Add(m_database.CreateParameter("ParentFolderID", newParentFolderID));
|
||||
cmd.Parameters.Add(m_database.CreateParameter("folderID", id));
|
||||
cmd.Connection = conn;
|
||||
conn.Open();
|
||||
|
||||
if (cmd.ExecuteNonQuery() == 0)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
IncrementFolderVersion(oldParentFolderUUID);
|
||||
IncrementFolderVersion(newParentFolderID);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public override bool Store(XInventoryFolder folder)
|
||||
{
|
||||
if (!base.Store(folder))
|
||||
return false;
|
||||
|
||||
IncrementFolderVersion(folder.parentFolderID);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public class PGSQLInventoryHandler<T> : PGSQLGenericTableHandler<T> where T: class, new()
|
||||
{
|
||||
public PGSQLInventoryHandler(string c, string t, string m) : base(c, t, m) {}
|
||||
|
||||
protected bool IncrementFolderVersion(UUID folderID)
|
||||
{
|
||||
return IncrementFolderVersion(folderID.ToString());
|
||||
}
|
||||
|
||||
protected bool IncrementFolderVersion(string folderID)
|
||||
{
|
||||
// m_log.DebugFormat("[MYSQL ITEM HANDLER]: Incrementing version on folder {0}", folderID);
|
||||
// Util.PrintCallStack();
|
||||
|
||||
string sql = "update inventoryfolders set version=version+1 where folderID = :folderID";
|
||||
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
|
||||
{
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
|
||||
{
|
||||
conn.Open();
|
||||
|
||||
cmd.Parameters.AddWithValue("folderID", folderID);
|
||||
|
||||
try
|
||||
{
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
65
OpenSim/Data/PGSQL/Properties/AssemblyInfo.cs
Normal file
65
OpenSim/Data/PGSQL/Properties/AssemblyInfo.cs
Normal file
@@ -0,0 +1,65 @@
|
||||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator 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.Reflection;
|
||||
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("OpenSim.Data.PGSQL")]
|
||||
[assembly : AssemblyDescription("")]
|
||||
[assembly : AssemblyConfiguration("")]
|
||||
[assembly : AssemblyCompany("http://opensimulator.org")]
|
||||
[assembly : AssemblyProduct("OpenSim.Data.PGSQL")]
|
||||
[assembly : AssemblyCopyright("Copyright (c) OpenSimulator.org Developers 2007-2009")]
|
||||
[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("0e1c1ca4-2cf2-4315-b0e7-432c02feea8a")]
|
||||
|
||||
// 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("0.7.6.*")]
|
||||
|
||||
94
OpenSim/Data/PGSQL/Resources/AssetStore.migrations
Normal file
94
OpenSim/Data/PGSQL/Resources/AssetStore.migrations
Normal file
@@ -0,0 +1,94 @@
|
||||
:VERSION 1
|
||||
|
||||
CREATE TABLE assets (
|
||||
id varchar(36) NOT NULL PRIMARY KEY,
|
||||
name varchar(64) NOT NULL,
|
||||
description varchar(64) NOT NULL,
|
||||
assetType smallint NOT NULL,
|
||||
local smallint NOT NULL,
|
||||
temporary smallint NOT NULL,
|
||||
data bytea NOT NULL
|
||||
) ;
|
||||
|
||||
:VERSION 2
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE Tmp_assets
|
||||
(
|
||||
id varchar(36) NOT NULL,
|
||||
name varchar(64) NOT NULL,
|
||||
description varchar(64) NOT NULL,
|
||||
assetType smallint NOT NULL,
|
||||
local boolean NOT NULL,
|
||||
temporary boolean NOT NULL,
|
||||
data bytea NOT NULL
|
||||
) ;
|
||||
|
||||
INSERT INTO Tmp_assets (id, name, description, assetType, local, temporary, data)
|
||||
SELECT id, name, description, assetType, case when local = 1 then true else false end, case when temporary = 1 then true else false end, data
|
||||
FROM assets ;
|
||||
|
||||
DROP TABLE assets;
|
||||
|
||||
Alter table Tmp_assets
|
||||
rename to assets;
|
||||
|
||||
ALTER TABLE assets ADD PRIMARY KEY (id);
|
||||
|
||||
COMMIT;
|
||||
|
||||
|
||||
:VERSION 3
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
ALTER TABLE assets add create_time integer default 0;
|
||||
ALTER TABLE assets add access_time integer default 0;
|
||||
|
||||
COMMIT;
|
||||
|
||||
|
||||
:VERSION 4
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE Tmp_assets
|
||||
(
|
||||
id uuid NOT NULL,
|
||||
name varchar(64) NOT NULL,
|
||||
description varchar(64) NOT NULL,
|
||||
assetType smallint NOT NULL,
|
||||
local boolean NOT NULL,
|
||||
temporary boolean NOT NULL,
|
||||
data bytea NOT NULL,
|
||||
create_time int NULL,
|
||||
access_time int NULL
|
||||
) ;
|
||||
|
||||
|
||||
INSERT INTO Tmp_assets (id, name, description, assetType, local, temporary, data, create_time, access_time)
|
||||
SELECT cast(id as uuid), name, description, assetType, local, temporary, data, create_time, access_time
|
||||
FROM assets ;
|
||||
|
||||
DROP TABLE assets;
|
||||
|
||||
Alter table Tmp_assets
|
||||
rename to assets;
|
||||
|
||||
ALTER TABLE assets ADD PRIMARY KEY (id);
|
||||
|
||||
COMMIT;
|
||||
|
||||
|
||||
:VERSION 5
|
||||
|
||||
DELETE FROM assets WHERE id = 'dc4b9f0b-d008-45c6-96a4-01dd947ac621';
|
||||
|
||||
:VERSION 6
|
||||
|
||||
ALTER TABLE assets ADD asset_flags INTEGER NOT NULL DEFAULT 0;
|
||||
|
||||
:VERSION 7
|
||||
|
||||
alter table assets add creatorid varchar(36) not null default '';
|
||||
31
OpenSim/Data/PGSQL/Resources/AuthStore.migrations
Normal file
31
OpenSim/Data/PGSQL/Resources/AuthStore.migrations
Normal file
@@ -0,0 +1,31 @@
|
||||
:VERSION 1
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE auth (
|
||||
uuid uuid NOT NULL default '00000000-0000-0000-0000-000000000000',
|
||||
passwordHash varchar(32) NOT NULL,
|
||||
passwordSalt varchar(32) NOT NULL,
|
||||
webLoginKey varchar(255) NOT NULL,
|
||||
accountType VARCHAR(32) NOT NULL DEFAULT 'UserAccount'
|
||||
) ;
|
||||
|
||||
CREATE TABLE tokens (
|
||||
uuid uuid NOT NULL default '00000000-0000-0000-0000-000000000000',
|
||||
token varchar(255) NOT NULL,
|
||||
validity TIMESTAMP NOT NULL )
|
||||
;
|
||||
|
||||
COMMIT;
|
||||
|
||||
:VERSION 2
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
INSERT INTO auth (UUID, passwordHash, passwordSalt, webLoginKey, accountType)
|
||||
SELECT UUID AS UUID, passwordHash AS passwordHash, passwordSalt AS passwordSalt, webLoginKey AS webLoginKey, 'UserAccount' as accountType
|
||||
FROM users
|
||||
where exists ( Select * from information_schema.tables where table_name = 'users' )
|
||||
;
|
||||
|
||||
COMMIT;
|
||||
59
OpenSim/Data/PGSQL/Resources/Avatar.migrations
Normal file
59
OpenSim/Data/PGSQL/Resources/Avatar.migrations
Normal file
@@ -0,0 +1,59 @@
|
||||
:VERSION 1
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE Avatars (
|
||||
PrincipalID uuid NOT NULL PRIMARY KEY,
|
||||
Name varchar(32) NOT NULL,
|
||||
Value varchar(255) NOT NULL DEFAULT ''
|
||||
);
|
||||
|
||||
|
||||
COMMIT;
|
||||
|
||||
:VERSION 2
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE Tmp_Avatars
|
||||
(
|
||||
PrincipalID uuid NOT NULL,
|
||||
Name varchar(32) NOT NULL,
|
||||
Value text NOT NULL DEFAULT ''
|
||||
) ;
|
||||
|
||||
INSERT INTO Tmp_Avatars (PrincipalID, Name, Value)
|
||||
SELECT PrincipalID, cast(Name as text), Value
|
||||
FROM Avatars ;
|
||||
|
||||
DROP TABLE Avatars;
|
||||
|
||||
Alter table Tmp_Avatars
|
||||
rename to Avatars;
|
||||
|
||||
COMMIT;
|
||||
|
||||
:VERSION 3
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE Tmp_Avatars
|
||||
(
|
||||
PrincipalID uuid NOT NULL,
|
||||
Name varchar(32) NOT NULL,
|
||||
Value text NOT NULL DEFAULT ''
|
||||
);
|
||||
|
||||
ALTER TABLE Tmp_Avatars ADD PRIMARY KEY (PrincipalID, Name);
|
||||
|
||||
|
||||
INSERT INTO Tmp_Avatars (PrincipalID, Name, Value)
|
||||
SELECT PrincipalID, cast(Name as text), Value FROM Avatars ;
|
||||
|
||||
DROP TABLE Avatars;
|
||||
|
||||
Alter table Tmp_Avatars
|
||||
rename to Avatars;
|
||||
|
||||
COMMIT;
|
||||
|
||||
296
OpenSim/Data/PGSQL/Resources/EstateStore.migrations
Normal file
296
OpenSim/Data/PGSQL/Resources/EstateStore.migrations
Normal file
@@ -0,0 +1,296 @@
|
||||
:VERSION 1
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE estate_managers(
|
||||
EstateID int NOT NULL Primary Key,
|
||||
uuid varchar(36) NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE estate_groups(
|
||||
EstateID int NOT NULL,
|
||||
uuid varchar(36) NOT NULL
|
||||
);
|
||||
|
||||
|
||||
CREATE TABLE estate_users(
|
||||
EstateID int NOT NULL,
|
||||
uuid varchar(36) NOT NULL
|
||||
);
|
||||
|
||||
|
||||
CREATE TABLE estateban(
|
||||
EstateID int NOT NULL,
|
||||
bannedUUID varchar(36) NOT NULL,
|
||||
bannedIp varchar(16) NOT NULL,
|
||||
bannedIpHostMask varchar(16) NOT NULL,
|
||||
bannedNameMask varchar(64) NULL DEFAULT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE estate_settings(
|
||||
EstateID serial NOT NULL,
|
||||
EstateName varchar(64) NULL DEFAULT (NULL),
|
||||
AbuseEmailToEstateOwner boolean NOT NULL,
|
||||
DenyAnonymous boolean NOT NULL,
|
||||
ResetHomeOnTeleport boolean NOT NULL,
|
||||
FixedSun boolean NOT NULL,
|
||||
DenyTransacted boolean NOT NULL,
|
||||
BlockDwell boolean NOT NULL,
|
||||
DenyIdentified boolean NOT NULL,
|
||||
AllowVoice boolean NOT NULL,
|
||||
UseGlobalTime boolean NOT NULL,
|
||||
PricePerMeter int NOT NULL,
|
||||
TaxFree boolean NOT NULL,
|
||||
AllowDirectTeleport boolean NOT NULL,
|
||||
RedirectGridX int NOT NULL,
|
||||
RedirectGridY int NOT NULL,
|
||||
ParentEstateID int NOT NULL,
|
||||
SunPosition double precision NOT NULL,
|
||||
EstateSkipScripts boolean NOT NULL,
|
||||
BillableFactor double precision NOT NULL,
|
||||
PublicAccess boolean NOT NULL,
|
||||
AbuseEmail varchar(255) NOT NULL,
|
||||
EstateOwner varchar(36) NOT NULL,
|
||||
DenyMinors boolean NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE estate_map(
|
||||
RegionID varchar(36) NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'),
|
||||
EstateID int NOT NULL
|
||||
);
|
||||
|
||||
COMMIT;
|
||||
|
||||
:VERSION 2
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE INDEX IX_estate_managers ON estate_managers
|
||||
(
|
||||
EstateID
|
||||
);
|
||||
|
||||
|
||||
CREATE INDEX IX_estate_groups ON estate_groups
|
||||
(
|
||||
EstateID
|
||||
);
|
||||
|
||||
|
||||
CREATE INDEX IX_estate_users ON estate_users
|
||||
(
|
||||
EstateID
|
||||
);
|
||||
|
||||
COMMIT;
|
||||
|
||||
:VERSION 3
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE Tmp_estateban
|
||||
(
|
||||
EstateID int NOT NULL,
|
||||
bannedUUID varchar(36) NOT NULL,
|
||||
bannedIp varchar(16) NULL,
|
||||
bannedIpHostMask varchar(16) NULL,
|
||||
bannedNameMask varchar(64) NULL
|
||||
);
|
||||
|
||||
INSERT INTO Tmp_estateban (EstateID, bannedUUID, bannedIp, bannedIpHostMask, bannedNameMask)
|
||||
SELECT EstateID, bannedUUID, bannedIp, bannedIpHostMask, bannedNameMask FROM estateban;
|
||||
|
||||
DROP TABLE estateban;
|
||||
|
||||
Alter table Tmp_estateban
|
||||
rename to estateban;
|
||||
|
||||
CREATE INDEX IX_estateban ON estateban
|
||||
(
|
||||
EstateID
|
||||
);
|
||||
|
||||
COMMIT;
|
||||
|
||||
|
||||
:VERSION 4
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE Tmp_estate_managers
|
||||
(
|
||||
EstateID int NOT NULL,
|
||||
uuid uuid NOT NULL
|
||||
);
|
||||
|
||||
INSERT INTO Tmp_estate_managers (EstateID, uuid)
|
||||
SELECT EstateID, cast(uuid as uuid) FROM estate_managers;
|
||||
|
||||
DROP TABLE estate_managers;
|
||||
|
||||
Alter table Tmp_estate_managers
|
||||
rename to estate_managers;
|
||||
|
||||
CREATE INDEX IX_estate_managers ON estate_managers
|
||||
(
|
||||
EstateID
|
||||
);
|
||||
|
||||
COMMIT;
|
||||
|
||||
|
||||
:VERSION 5
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE Tmp_estate_groups
|
||||
(
|
||||
EstateID int NOT NULL,
|
||||
uuid uuid NOT NULL
|
||||
) ;
|
||||
|
||||
INSERT INTO Tmp_estate_groups (EstateID, uuid)
|
||||
SELECT EstateID, cast(uuid as uuid) FROM estate_groups;
|
||||
|
||||
DROP TABLE estate_groups;
|
||||
|
||||
Alter table Tmp_estate_groups
|
||||
rename to estate_groups;
|
||||
|
||||
CREATE INDEX IX_estate_groups ON estate_groups
|
||||
(
|
||||
EstateID
|
||||
);
|
||||
|
||||
COMMIT;
|
||||
|
||||
|
||||
:VERSION 6
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE Tmp_estate_users
|
||||
(
|
||||
EstateID int NOT NULL,
|
||||
uuid uuid NOT NULL
|
||||
);
|
||||
|
||||
INSERT INTO Tmp_estate_users (EstateID, uuid)
|
||||
SELECT EstateID, cast(uuid as uuid) FROM estate_users ;
|
||||
|
||||
DROP TABLE estate_users;
|
||||
|
||||
Alter table Tmp_estate_users
|
||||
rename to estate_users;
|
||||
|
||||
CREATE INDEX IX_estate_users ON estate_users
|
||||
(
|
||||
EstateID
|
||||
);
|
||||
|
||||
COMMIT;
|
||||
|
||||
|
||||
:VERSION 7
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE Tmp_estateban
|
||||
(
|
||||
EstateID int NOT NULL,
|
||||
bannedUUID uuid NOT NULL,
|
||||
bannedIp varchar(16) NULL,
|
||||
bannedIpHostMask varchar(16) NULL,
|
||||
bannedNameMask varchar(64) NULL
|
||||
);
|
||||
|
||||
INSERT INTO Tmp_estateban (EstateID, bannedUUID, bannedIp, bannedIpHostMask, bannedNameMask)
|
||||
SELECT EstateID, cast(bannedUUID as uuid), bannedIp, bannedIpHostMask, bannedNameMask FROM estateban ;
|
||||
|
||||
DROP TABLE estateban;
|
||||
|
||||
Alter table Tmp_estateban
|
||||
rename to estateban;
|
||||
|
||||
CREATE INDEX IX_estateban ON estateban
|
||||
(
|
||||
EstateID
|
||||
);
|
||||
|
||||
COMMIT;
|
||||
|
||||
|
||||
:VERSION 8
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE Tmp_estate_settings
|
||||
(
|
||||
EstateID serial NOT NULL,
|
||||
EstateName varchar(64) NULL DEFAULT (NULL),
|
||||
AbuseEmailToEstateOwner boolean NOT NULL,
|
||||
DenyAnonymous boolean NOT NULL,
|
||||
ResetHomeOnTeleport boolean NOT NULL,
|
||||
FixedSun boolean NOT NULL,
|
||||
DenyTransacted boolean NOT NULL,
|
||||
BlockDwell boolean NOT NULL,
|
||||
DenyIdentified boolean NOT NULL,
|
||||
AllowVoice boolean NOT NULL,
|
||||
UseGlobalTime boolean NOT NULL,
|
||||
PricePerMeter int NOT NULL,
|
||||
TaxFree boolean NOT NULL,
|
||||
AllowDirectTeleport boolean NOT NULL,
|
||||
RedirectGridX int NOT NULL,
|
||||
RedirectGridY int NOT NULL,
|
||||
ParentEstateID int NOT NULL,
|
||||
SunPosition double precision NOT NULL,
|
||||
EstateSkipScripts boolean NOT NULL,
|
||||
BillableFactor double precision NOT NULL,
|
||||
PublicAccess boolean NOT NULL,
|
||||
AbuseEmail varchar(255) NOT NULL,
|
||||
EstateOwner uuid NOT NULL,
|
||||
DenyMinors boolean NOT NULL
|
||||
);
|
||||
|
||||
INSERT INTO Tmp_estate_settings (EstateID, EstateName, AbuseEmailToEstateOwner, DenyAnonymous, ResetHomeOnTeleport, FixedSun, DenyTransacted, BlockDwell, DenyIdentified, AllowVoice, UseGlobalTime, PricePerMeter, TaxFree, AllowDirectTeleport, RedirectGridX, RedirectGridY, ParentEstateID, SunPosition, EstateSkipScripts, BillableFactor, PublicAccess, AbuseEmail, EstateOwner, DenyMinors)
|
||||
SELECT EstateID, EstateName, AbuseEmailToEstateOwner, DenyAnonymous, ResetHomeOnTeleport, FixedSun, DenyTransacted, BlockDwell, DenyIdentified, AllowVoice, UseGlobalTime, PricePerMeter, TaxFree, AllowDirectTeleport, RedirectGridX, RedirectGridY, ParentEstateID, SunPosition, EstateSkipScripts, BillableFactor, PublicAccess, AbuseEmail, cast(EstateOwner as uuid), DenyMinors FROM estate_settings ;
|
||||
|
||||
DROP TABLE estate_settings;
|
||||
|
||||
Alter table Tmp_estate_settings
|
||||
rename to estate_settings;
|
||||
|
||||
|
||||
COMMIT;
|
||||
|
||||
|
||||
:VERSION 9
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE Tmp_estate_map
|
||||
(
|
||||
RegionID uuid NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'),
|
||||
EstateID int NOT NULL
|
||||
);
|
||||
|
||||
INSERT INTO Tmp_estate_map (RegionID, EstateID)
|
||||
SELECT cast(RegionID as uuid), EstateID FROM estate_map ;
|
||||
|
||||
DROP TABLE estate_map;
|
||||
|
||||
Alter table Tmp_estate_map
|
||||
rename to estate_map;
|
||||
|
||||
COMMIT;
|
||||
|
||||
:VERSION 10
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
ALTER TABLE estate_settings ADD COLUMN AllowLandmark boolean NOT NULL default true;
|
||||
ALTER TABLE estate_settings ADD COLUMN AllowParcelChanges boolean NOT NULL default true;
|
||||
ALTER TABLE estate_settings ADD COLUMN AllowSetHome boolean NOT NULL default true;
|
||||
COMMIT;
|
||||
|
||||
|
||||
|
||||
42
OpenSim/Data/PGSQL/Resources/FriendsStore.migrations
Normal file
42
OpenSim/Data/PGSQL/Resources/FriendsStore.migrations
Normal file
@@ -0,0 +1,42 @@
|
||||
:VERSION 1
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE Friends (
|
||||
PrincipalID uuid NOT NULL,
|
||||
Friend varchar(255) NOT NULL,
|
||||
Flags char(16) NOT NULL DEFAULT '0',
|
||||
Offered varchar(32) NOT NULL DEFAULT 0);
|
||||
|
||||
|
||||
COMMIT;
|
||||
|
||||
:VERSION 2
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
INSERT INTO Friends (PrincipalID, Friend, Flags, Offered)
|
||||
SELECT ownerID, friendID, friendPerms, 0 FROM userfriends;
|
||||
|
||||
COMMIT;
|
||||
|
||||
:VERSION 3
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE Tmp_Friends
|
||||
(PrincipalID varchar(255) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000',
|
||||
Friend varchar(255) NOT NULL,
|
||||
Flags char(16) NOT NULL DEFAULT '0',
|
||||
Offered varchar(32) NOT NULL DEFAULT 0) ;
|
||||
|
||||
INSERT INTO Tmp_Friends (PrincipalID, Friend, Flags, Offered)
|
||||
SELECT cast(PrincipalID as varchar(255)), Friend, Flags, Offered FROM Friends ;
|
||||
|
||||
DROP TABLE Friends;
|
||||
|
||||
Alter table Tmp_Friends
|
||||
rename to Friends;
|
||||
|
||||
|
||||
COMMIT;
|
||||
242
OpenSim/Data/PGSQL/Resources/GridStore.migrations
Normal file
242
OpenSim/Data/PGSQL/Resources/GridStore.migrations
Normal file
@@ -0,0 +1,242 @@
|
||||
:VERSION 1
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE regions(
|
||||
regionHandle varchar(255) NULL,
|
||||
regionName varchar(255) NULL,
|
||||
uuid varchar(255) NOT NULL PRIMARY KEY,
|
||||
regionRecvKey varchar(255) NULL,
|
||||
regionSecret varchar(255) NULL,
|
||||
regionSendKey varchar(255) NULL,
|
||||
regionDataURI varchar(255) NULL,
|
||||
serverIP varchar(255) NULL,
|
||||
serverPort varchar(255) NULL,
|
||||
serverURI varchar(255) NULL,
|
||||
locX varchar(255) NULL,
|
||||
locY varchar(255) NULL,
|
||||
locZ varchar(255) NULL,
|
||||
eastOverrideHandle varchar(255) NULL,
|
||||
westOverrideHandle varchar(255) NULL,
|
||||
southOverrideHandle varchar(255) NULL,
|
||||
northOverrideHandle varchar(255) NULL,
|
||||
regionAssetURI varchar(255) NULL,
|
||||
regionAssetRecvKey varchar(255) NULL,
|
||||
regionAssetSendKey varchar(255) NULL,
|
||||
regionUserURI varchar(255) NULL,
|
||||
regionUserRecvKey varchar(255) NULL,
|
||||
regionUserSendKey varchar(255) NULL,
|
||||
regionMapTexture varchar(255) NULL,
|
||||
serverHttpPort varchar(255) NULL,
|
||||
serverRemotingPort varchar(255) NULL,
|
||||
owner_uuid varchar(36) NULL
|
||||
);
|
||||
|
||||
COMMIT;
|
||||
|
||||
|
||||
:VERSION 2
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE Tmp_regions
|
||||
(
|
||||
uuid varchar(36) NOT NULL,
|
||||
regionHandle bigint NULL,
|
||||
regionName varchar(20) NULL,
|
||||
regionRecvKey varchar(128) NULL,
|
||||
regionSendKey varchar(128) NULL,
|
||||
regionSecret varchar(128) NULL,
|
||||
regionDataURI varchar(128) NULL,
|
||||
serverIP varchar(64) NULL,
|
||||
serverPort int NULL,
|
||||
serverURI varchar(255) NULL,
|
||||
locX int NULL,
|
||||
locY int NULL,
|
||||
locZ int NULL,
|
||||
eastOverrideHandle bigint NULL,
|
||||
westOverrideHandle bigint NULL,
|
||||
southOverrideHandle bigint NULL,
|
||||
northOverrideHandle bigint NULL,
|
||||
regionAssetURI varchar(255) NULL,
|
||||
regionAssetRecvKey varchar(128) NULL,
|
||||
regionAssetSendKey varchar(128) NULL,
|
||||
regionUserURI varchar(255) NULL,
|
||||
regionUserRecvKey varchar(128) NULL,
|
||||
regionUserSendKey varchar(128) NULL,
|
||||
regionMapTexture varchar(36) NULL,
|
||||
serverHttpPort int NULL,
|
||||
serverRemotingPort int NULL,
|
||||
owner_uuid varchar(36) NULL,
|
||||
originUUID varchar(36) NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000')
|
||||
);
|
||||
|
||||
INSERT INTO Tmp_regions (uuid, regionHandle, regionName, regionRecvKey, regionSendKey, regionSecret, regionDataURI, serverIP, serverPort, serverURI, locX, locY, locZ, eastOverrideHandle, westOverrideHandle, southOverrideHandle, northOverrideHandle, regionAssetURI, regionAssetRecvKey, regionAssetSendKey, regionUserURI, regionUserRecvKey, regionUserSendKey, regionMapTexture, serverHttpPort, serverRemotingPort, owner_uuid)
|
||||
SELECT cast(uuid as varchar(36)), cast(regionHandle as bigint), cast(regionName as varchar(20)), cast(regionRecvKey as varchar(128)), cast(regionSendKey as varchar(128)), cast(regionSecret as varchar(128)), cast(regionDataURI as varchar(128)), cast(serverIP as varchar(64)), cast(serverPort as int), serverURI, cast(locX as int), cast(locY as int), cast(locZ as int), cast(eastOverrideHandle as bigint), cast(westOverrideHandle as bigint),
|
||||
cast(southOverrideHandle as bigint), cast(northOverrideHandle as bigint), regionAssetURI, cast(regionAssetRecvKey as varchar(128)), cast(regionAssetSendKey as varchar(128)), regionUserURI, cast(regionUserRecvKey as varchar(128)), cast(regionUserSendKey as varchar(128)), cast(regionMapTexture as varchar(36)),
|
||||
cast(serverHttpPort as int), cast(serverRemotingPort as int), owner_uuid
|
||||
FROM regions;
|
||||
|
||||
DROP TABLE regions;
|
||||
|
||||
alter table Tmp_regions
|
||||
rename to regions;
|
||||
|
||||
COMMIT;
|
||||
|
||||
:VERSION 3
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE INDEX IX_regions_name ON regions
|
||||
(
|
||||
regionName
|
||||
);
|
||||
|
||||
CREATE INDEX IX_regions_handle ON regions
|
||||
(
|
||||
regionHandle
|
||||
);
|
||||
|
||||
|
||||
CREATE INDEX IX_regions_override ON regions
|
||||
(
|
||||
eastOverrideHandle,
|
||||
westOverrideHandle,
|
||||
southOverrideHandle,
|
||||
northOverrideHandle
|
||||
);
|
||||
|
||||
COMMIT;
|
||||
|
||||
|
||||
:VERSION 4
|
||||
|
||||
/* To prevent any potential data loss issues, you should review this script in detail before running it outside the cotext of the database designer.*/
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE Tmp_regions
|
||||
(
|
||||
uuid uuid NOT NULL,
|
||||
regionHandle bigint NULL,
|
||||
regionName varchar(20) NULL,
|
||||
regionRecvKey varchar(128) NULL,
|
||||
regionSendKey varchar(128) NULL,
|
||||
regionSecret varchar(128) NULL,
|
||||
regionDataURI varchar(128) NULL,
|
||||
serverIP varchar(64) NULL,
|
||||
serverPort int NULL,
|
||||
serverURI varchar(255) NULL,
|
||||
locX int NULL,
|
||||
locY int NULL,
|
||||
locZ int NULL,
|
||||
eastOverrideHandle bigint NULL,
|
||||
westOverrideHandle bigint NULL,
|
||||
southOverrideHandle bigint NULL,
|
||||
northOverrideHandle bigint NULL,
|
||||
regionAssetURI varchar(255) NULL,
|
||||
regionAssetRecvKey varchar(128) NULL,
|
||||
regionAssetSendKey varchar(128) NULL,
|
||||
regionUserURI varchar(255) NULL,
|
||||
regionUserRecvKey varchar(128) NULL,
|
||||
regionUserSendKey varchar(128) NULL,
|
||||
regionMapTexture uuid NULL,
|
||||
serverHttpPort int NULL,
|
||||
serverRemotingPort int NULL,
|
||||
owner_uuid uuid NOT NULL,
|
||||
originUUID uuid NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000')
|
||||
);
|
||||
|
||||
|
||||
INSERT INTO Tmp_regions (uuid, regionHandle, regionName, regionRecvKey, regionSendKey, regionSecret, regionDataURI, serverIP, serverPort, serverURI, locX, locY, locZ, eastOverrideHandle, westOverrideHandle, southOverrideHandle, northOverrideHandle, regionAssetURI, regionAssetRecvKey, regionAssetSendKey, regionUserURI, regionUserRecvKey, regionUserSendKey, regionMapTexture, serverHttpPort, serverRemotingPort, owner_uuid, originUUID)
|
||||
SELECT cast(uuid as uuid), regionHandle, regionName, regionRecvKey, regionSendKey, regionSecret, regionDataURI, serverIP, serverPort, serverURI, locX, locY, locZ, eastOverrideHandle, westOverrideHandle, southOverrideHandle, northOverrideHandle, regionAssetURI, regionAssetRecvKey, regionAssetSendKey, regionUserURI, regionUserRecvKey, regionUserSendKey, cast(regionMapTexture as uuid), serverHttpPort, serverRemotingPort, cast( owner_uuid as uuid), cast(originUUID as uuid) FROM regions ;
|
||||
|
||||
|
||||
DROP TABLE regions;
|
||||
|
||||
alter table Tmp_regions rename to regions;
|
||||
|
||||
ALTER TABLE regions ADD CONSTRAINT
|
||||
PK__regions__uuid PRIMARY KEY
|
||||
(
|
||||
uuid
|
||||
);
|
||||
|
||||
CREATE INDEX IX_regions_name ON regions
|
||||
(
|
||||
regionName
|
||||
);
|
||||
|
||||
CREATE INDEX IX_regions_handle ON regions
|
||||
(
|
||||
regionHandle
|
||||
);
|
||||
|
||||
CREATE INDEX IX_regions_override ON regions
|
||||
(
|
||||
eastOverrideHandle,
|
||||
westOverrideHandle,
|
||||
southOverrideHandle,
|
||||
northOverrideHandle
|
||||
);
|
||||
|
||||
COMMIT;
|
||||
|
||||
|
||||
:VERSION 5
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
ALTER TABLE regions ADD access int default 0;
|
||||
|
||||
COMMIT;
|
||||
|
||||
|
||||
:VERSION 6
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
ALTER TABLE regions ADD scopeid uuid default '00000000-0000-0000-0000-000000000000';
|
||||
ALTER TABLE regions alter column owner_uuid set DEFAULT ('00000000-0000-0000-0000-000000000000');
|
||||
ALTER TABLE regions ADD sizeX integer not null default 0;
|
||||
ALTER TABLE regions ADD sizeY integer not null default 0;
|
||||
|
||||
COMMIT;
|
||||
|
||||
|
||||
:VERSION 7
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
ALTER TABLE regions ADD flags integer NOT NULL DEFAULT 0;
|
||||
CREATE INDEX flags ON regions(flags);
|
||||
ALTER TABLE regions ADD last_seen integer NOT NULL DEFAULT 0;
|
||||
ALTER TABLE regions ADD PrincipalID uuid NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000';
|
||||
ALTER TABLE regions ADD Token varchar(255) NOT NULL DEFAULT 0;
|
||||
|
||||
COMMIT;
|
||||
|
||||
:VERSION 8
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
ALTER TABLE regions ALTER COLUMN regionName type VarChar(128) ;
|
||||
|
||||
DROP INDEX IX_regions_name;
|
||||
ALTER TABLE regions ALTER COLUMN regionName type VarChar(128),
|
||||
ALTER COLUMN regionName SET NOT NULL;
|
||||
|
||||
CREATE INDEX IX_regions_name ON regions
|
||||
(
|
||||
regionName
|
||||
);
|
||||
|
||||
COMMIT;
|
||||
|
||||
:VERSION 9
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
ALTER TABLE regions ADD parcelMapTexture uuid NULL;
|
||||
|
||||
COMMIT;
|
||||
|
||||
60
OpenSim/Data/PGSQL/Resources/GridUserStore.migrations
Normal file
60
OpenSim/Data/PGSQL/Resources/GridUserStore.migrations
Normal file
@@ -0,0 +1,60 @@
|
||||
:VERSION 1 # --------------------------
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE GridUser (
|
||||
UserID VARCHAR(255) NOT NULL Primary Key,
|
||||
HomeRegionID CHAR(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000',
|
||||
HomePosition CHAR(64) NOT NULL DEFAULT '<0,0,0>',
|
||||
HomeLookAt CHAR(64) NOT NULL DEFAULT '<0,0,0>',
|
||||
LastRegionID CHAR(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000',
|
||||
LastPosition CHAR(64) NOT NULL DEFAULT '<0,0,0>',
|
||||
LastLookAt CHAR(64) NOT NULL DEFAULT '<0,0,0>',
|
||||
Online CHAR(5) NOT NULL DEFAULT 'false',
|
||||
Login CHAR(16) NOT NULL DEFAULT '0',
|
||||
Logout CHAR(16) NOT NULL DEFAULT '0'
|
||||
) ;
|
||||
|
||||
COMMIT;
|
||||
|
||||
:VERSION 2 # --------------------------
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE GridUser_tmp (
|
||||
UserID VARCHAR(255) NOT NULL,
|
||||
HomeRegionID uuid NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000',
|
||||
HomePosition CHAR(64) NOT NULL DEFAULT '<0,0,0>',
|
||||
HomeLookAt CHAR(64) NOT NULL DEFAULT '<0,0,0>',
|
||||
LastRegionID uuid NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000',
|
||||
LastPosition CHAR(64) NOT NULL DEFAULT '<0,0,0>',
|
||||
LastLookAt CHAR(64) NOT NULL DEFAULT '<0,0,0>',
|
||||
Online CHAR(5) NOT NULL DEFAULT 'false',
|
||||
Login CHAR(16) NOT NULL DEFAULT '0',
|
||||
Logout CHAR(16) NOT NULL DEFAULT '0'
|
||||
);
|
||||
|
||||
COMMIT;
|
||||
|
||||
|
||||
INSERT INTO GridUser_tmp (UserID
|
||||
,HomeRegionID
|
||||
,HomePosition
|
||||
,HomeLookAt
|
||||
,LastRegionID
|
||||
,LastPosition
|
||||
,LastLookAt
|
||||
,Online
|
||||
,Login
|
||||
,Logout)
|
||||
SELECT UserID, cast(HomeRegionID as uuid), HomePosition ,HomeLookAt , cast(LastRegionID as uuid),
|
||||
LastPosition
|
||||
,LastLookAt
|
||||
,Online
|
||||
,Login
|
||||
,Logout FROM GridUser;
|
||||
|
||||
DROP TABLE GridUser;
|
||||
|
||||
alter table GridUser_tmp rename to GridUser;
|
||||
|
||||
211
OpenSim/Data/PGSQL/Resources/InventoryStore.migrations
Normal file
211
OpenSim/Data/PGSQL/Resources/InventoryStore.migrations
Normal file
@@ -0,0 +1,211 @@
|
||||
:VERSION 1
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE inventoryfolders (
|
||||
folderID varchar(36) NOT NULL default '' PRIMARY KEY,
|
||||
agentID varchar(36) default NULL,
|
||||
parentFolderID varchar(36) default NULL,
|
||||
folderName varchar(64) default NULL,
|
||||
type smallint NOT NULL default 0,
|
||||
version int NOT NULL default 0
|
||||
);
|
||||
|
||||
|
||||
CREATE INDEX owner ON inventoryfolders
|
||||
(
|
||||
agentID ASC
|
||||
);
|
||||
|
||||
CREATE INDEX parent ON inventoryfolders
|
||||
(
|
||||
parentFolderID ASC
|
||||
);
|
||||
|
||||
|
||||
CREATE TABLE inventoryitems (
|
||||
inventoryID varchar(36) NOT NULL default '' Primary Key,
|
||||
assetID varchar(36) default NULL,
|
||||
assetType int default NULL,
|
||||
parentFolderID varchar(36) default NULL,
|
||||
avatarID varchar(36) default NULL,
|
||||
inventoryName varchar(64) default NULL,
|
||||
inventoryDescription varchar(128) default NULL,
|
||||
inventoryNextPermissions int default NULL,
|
||||
inventoryCurrentPermissions int default NULL,
|
||||
invType int default NULL,
|
||||
creatorID varchar(36) default NULL,
|
||||
inventoryBasePermissions int NOT NULL default 0,
|
||||
inventoryEveryOnePermissions int NOT NULL default 0,
|
||||
salePrice int default NULL,
|
||||
saleType smallint default NULL,
|
||||
creationDate int default NULL,
|
||||
groupID varchar(36) default NULL,
|
||||
groupOwned boolean default NULL,
|
||||
flags int default NULL
|
||||
);
|
||||
|
||||
|
||||
CREATE INDEX ii_owner ON inventoryitems
|
||||
(
|
||||
avatarID ASC
|
||||
);
|
||||
|
||||
CREATE INDEX ii_folder ON inventoryitems
|
||||
(
|
||||
parentFolderID ASC
|
||||
);
|
||||
|
||||
COMMIT;
|
||||
|
||||
|
||||
:VERSION 2
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
ALTER TABLE inventoryitems ADD inventoryGroupPermissions INTEGER NOT NULL default 0;
|
||||
|
||||
COMMIT;
|
||||
|
||||
:VERSION 3
|
||||
|
||||
/* To prevent any potential data loss issues, you should review this script in detail before running it outside the cotext of the database designer.*/
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE Tmp_inventoryfolders
|
||||
(
|
||||
folderID uuid NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'),
|
||||
agentID uuid NULL DEFAULT (NULL),
|
||||
parentFolderID uuid NULL DEFAULT (NULL),
|
||||
folderName varchar(64) NULL DEFAULT (NULL),
|
||||
type smallint NOT NULL DEFAULT ((0)),
|
||||
version int NOT NULL DEFAULT ((0))
|
||||
);
|
||||
|
||||
INSERT INTO Tmp_inventoryfolders (folderID, agentID, parentFolderID, folderName, type, version)
|
||||
SELECT cast(folderID as uuid), cast(agentID as uuid), cast(parentFolderID as uuid), folderName, type, version
|
||||
FROM inventoryfolders;
|
||||
|
||||
DROP TABLE inventoryfolders;
|
||||
|
||||
alter table Tmp_inventoryfolders rename to inventoryfolders;
|
||||
|
||||
ALTER TABLE inventoryfolders ADD CONSTRAINT
|
||||
PK__inventor__C2FABFB3173876EA PRIMARY KEY
|
||||
(
|
||||
folderID
|
||||
);
|
||||
|
||||
CREATE INDEX owner ON inventoryfolders
|
||||
(
|
||||
agentID
|
||||
);
|
||||
|
||||
CREATE INDEX parent ON inventoryfolders
|
||||
(
|
||||
parentFolderID
|
||||
);
|
||||
|
||||
COMMIT;
|
||||
|
||||
|
||||
:VERSION 4
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE Tmp_inventoryitems
|
||||
(
|
||||
inventoryID uuid NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'),
|
||||
assetID uuid NULL DEFAULT (NULL),
|
||||
assetType int NULL DEFAULT (NULL),
|
||||
parentFolderID uuid NULL DEFAULT (NULL),
|
||||
avatarID uuid NULL DEFAULT (NULL),
|
||||
inventoryName varchar(64) NULL DEFAULT (NULL),
|
||||
inventoryDescription varchar(128) NULL DEFAULT (NULL),
|
||||
inventoryNextPermissions int NULL DEFAULT (NULL),
|
||||
inventoryCurrentPermissions int NULL DEFAULT (NULL),
|
||||
invType int NULL DEFAULT (NULL),
|
||||
creatorID uuid NULL DEFAULT (NULL),
|
||||
inventoryBasePermissions int NOT NULL DEFAULT ((0)),
|
||||
inventoryEveryOnePermissions int NOT NULL DEFAULT ((0)),
|
||||
salePrice int NULL DEFAULT (NULL),
|
||||
saleType smallint NULL DEFAULT (NULL),
|
||||
creationDate int NULL DEFAULT (NULL),
|
||||
groupID uuid NULL DEFAULT (NULL),
|
||||
groupOwned boolean NULL DEFAULT (NULL),
|
||||
flags int NULL DEFAULT (NULL),
|
||||
inventoryGroupPermissions int NOT NULL DEFAULT ((0))
|
||||
);
|
||||
|
||||
|
||||
INSERT INTO Tmp_inventoryitems (inventoryID, assetID, assetType, parentFolderID, avatarID, inventoryName, inventoryDescription, inventoryNextPermissions, inventoryCurrentPermissions, invType, creatorID, inventoryBasePermissions, inventoryEveryOnePermissions, salePrice, saleType, creationDate, groupID, groupOwned, flags, inventoryGroupPermissions)
|
||||
SELECT cast(inventoryID as uuid), cast(assetID as uuid), assetType, cast(parentFolderID as uuid), cast(avatarID as uuid), inventoryName, inventoryDescription, inventoryNextPermissions, inventoryCurrentPermissions, invType, cast(creatorID as uuid), inventoryBasePermissions, inventoryEveryOnePermissions, salePrice, saleType, creationDate, cast(groupID as uuid), groupOwned, flags, inventoryGroupPermissions
|
||||
FROM inventoryitems ;
|
||||
|
||||
DROP TABLE inventoryitems;
|
||||
|
||||
alter table Tmp_inventoryitems rename to inventoryitems;
|
||||
|
||||
ALTER TABLE inventoryitems ADD CONSTRAINT
|
||||
PK__inventor__C4B7BC2220C1E124 PRIMARY KEY
|
||||
(
|
||||
inventoryID
|
||||
);
|
||||
|
||||
|
||||
CREATE INDEX ii2_owner ON inventoryitems
|
||||
(
|
||||
avatarID
|
||||
);
|
||||
|
||||
CREATE INDEX ii2_folder ON inventoryitems
|
||||
(
|
||||
parentFolderID
|
||||
);
|
||||
|
||||
COMMIT;
|
||||
|
||||
:VERSION 5
|
||||
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
-- # Restoring defaults:
|
||||
-- # NOTE: inventoryID does NOT need one: it's NOT NULL PK and a unique Guid must be provided every time anyway!
|
||||
|
||||
alter table inventoryitems
|
||||
alter column inventoryBasePermissions set default 0;
|
||||
alter table inventoryitems
|
||||
alter column inventoryEveryOnePermissions set default 0;
|
||||
alter table inventoryitems
|
||||
alter column inventoryGroupPermissions set default 0 ;
|
||||
|
||||
COMMIT ;
|
||||
|
||||
:VERSION 7
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
-- # CreatorID goes back to VARCHAR(36) (???)
|
||||
|
||||
alter table inventoryitems
|
||||
alter column CreatorID type varchar(36);
|
||||
|
||||
COMMIT ;
|
||||
|
||||
:VERSION 8
|
||||
|
||||
ALTER TABLE inventoryitems
|
||||
alter column CreatorID set DEFAULT '00000000-0000-0000-0000-000000000000';
|
||||
|
||||
|
||||
:VERSION 9
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
--# CreatorID goes up to VARCHAR(255)
|
||||
|
||||
alter table inventoryitems
|
||||
alter column CreatorID type varchar(255);
|
||||
|
||||
Commit;
|
||||
16
OpenSim/Data/PGSQL/Resources/LogStore.migrations
Normal file
16
OpenSim/Data/PGSQL/Resources/LogStore.migrations
Normal file
@@ -0,0 +1,16 @@
|
||||
:VERSION 1
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE logs (
|
||||
logID int NOT NULL Primary Key,
|
||||
target varchar(36) default NULL,
|
||||
server varchar(64) default NULL,
|
||||
method varchar(64) default NULL,
|
||||
arguments varchar(255) default NULL,
|
||||
priority int default NULL,
|
||||
message text
|
||||
);
|
||||
|
||||
COMMIT;
|
||||
|
||||
30
OpenSim/Data/PGSQL/Resources/Presence.migrations
Normal file
30
OpenSim/Data/PGSQL/Resources/Presence.migrations
Normal file
@@ -0,0 +1,30 @@
|
||||
:VERSION 1
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE Presence (
|
||||
UserID varchar(255) NOT NULL,
|
||||
RegionID uuid NOT NULL,
|
||||
SessionID uuid NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000',
|
||||
SecureSessionID uuid NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000'
|
||||
);
|
||||
|
||||
|
||||
COMMIT;
|
||||
|
||||
:VERSION 2
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE UNIQUE INDEX SessionID ON Presence(SessionID);
|
||||
CREATE INDEX UserID ON Presence(UserID);
|
||||
|
||||
COMMIT;
|
||||
|
||||
:VERSION 2
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
ALTER TABLE Presence ADD LastSeen Timestamp
|
||||
|
||||
COMMIT;
|
||||
1129
OpenSim/Data/PGSQL/Resources/RegionStore.migrations
Normal file
1129
OpenSim/Data/PGSQL/Resources/RegionStore.migrations
Normal file
File diff suppressed because it is too large
Load Diff
51
OpenSim/Data/PGSQL/Resources/UserAccount.migrations
Normal file
51
OpenSim/Data/PGSQL/Resources/UserAccount.migrations
Normal file
@@ -0,0 +1,51 @@
|
||||
:VERSION 1
|
||||
|
||||
CREATE TABLE UserAccounts (
|
||||
PrincipalID uuid NOT NULL Primary key,
|
||||
ScopeID uuid NOT NULL,
|
||||
FirstName varchar(64) NOT NULL,
|
||||
LastName varchar(64) NOT NULL,
|
||||
Email varchar(64) NULL,
|
||||
ServiceURLs text NULL,
|
||||
Created int default NULL
|
||||
);
|
||||
|
||||
|
||||
:VERSION 2
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
INSERT INTO UserAccounts (PrincipalID, ScopeID, FirstName, LastName, Email, ServiceURLs, Created)
|
||||
SELECT UUID AS PrincipalID, '00000000-0000-0000-0000-000000000000' AS ScopeID,
|
||||
username AS FirstName,
|
||||
lastname AS LastName,
|
||||
email as Email, (
|
||||
'AssetServerURI=' +
|
||||
userAssetURI + ' InventoryServerURI=' + userInventoryURI + ' GatewayURI= HomeURI=') AS ServiceURLs,
|
||||
created as Created FROM users;
|
||||
|
||||
COMMIT;
|
||||
|
||||
:VERSION 3
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE UNIQUE INDEX PrincipalID ON UserAccounts(PrincipalID);
|
||||
CREATE INDEX Email ON UserAccounts(Email);
|
||||
CREATE INDEX FirstName ON UserAccounts(FirstName);
|
||||
CREATE INDEX LastName ON UserAccounts(LastName);
|
||||
CREATE INDEX Name ON UserAccounts(FirstName,LastName);
|
||||
|
||||
COMMIT;
|
||||
|
||||
:VERSION 4
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
ALTER TABLE UserAccounts ADD UserLevel integer NOT NULL DEFAULT 0;
|
||||
ALTER TABLE UserAccounts ADD UserFlags integer NOT NULL DEFAULT 0;
|
||||
ALTER TABLE UserAccounts ADD UserTitle varchar(64) NOT NULL DEFAULT '';
|
||||
|
||||
COMMIT;
|
||||
|
||||
|
||||
404
OpenSim/Data/PGSQL/Resources/UserStore.migrations
Normal file
404
OpenSim/Data/PGSQL/Resources/UserStore.migrations
Normal file
@@ -0,0 +1,404 @@
|
||||
:VERSION 1
|
||||
|
||||
CREATE TABLE users (
|
||||
UUID varchar(36) NOT NULL default '' Primary Key,
|
||||
username varchar(32) NOT NULL,
|
||||
lastname varchar(32) NOT NULL,
|
||||
passwordHash varchar(32) NOT NULL,
|
||||
passwordSalt varchar(32) NOT NULL,
|
||||
homeRegion bigint default NULL,
|
||||
homeLocationX double precision default NULL,
|
||||
homeLocationY double precision default NULL,
|
||||
homeLocationZ double precision default NULL,
|
||||
homeLookAtX double precision default NULL,
|
||||
homeLookAtY double precision default NULL,
|
||||
homeLookAtZ double precision default NULL,
|
||||
created int NOT NULL,
|
||||
lastLogin int NOT NULL,
|
||||
userInventoryURI varchar(255) default NULL,
|
||||
userAssetURI varchar(255) default NULL,
|
||||
profileCanDoMask int default NULL,
|
||||
profileWantDoMask int default NULL,
|
||||
profileAboutText text,
|
||||
profileFirstText text,
|
||||
profileImage varchar(36) default NULL,
|
||||
profileFirstImage varchar(36) default NULL,
|
||||
webLoginKey varchar(36) default NULL
|
||||
);
|
||||
|
||||
CREATE INDEX usernames ON users
|
||||
(
|
||||
username ASC,
|
||||
lastname ASC
|
||||
);
|
||||
|
||||
|
||||
CREATE TABLE agents (
|
||||
UUID varchar(36) NOT NULL Primary Key,
|
||||
sessionID varchar(36) NOT NULL,
|
||||
secureSessionID varchar(36) NOT NULL,
|
||||
agentIP varchar(16) NOT NULL,
|
||||
agentPort int NOT NULL,
|
||||
agentOnline smallint NOT NULL,
|
||||
loginTime int NOT NULL,
|
||||
logoutTime int NOT NULL,
|
||||
currentRegion varchar(36) NOT NULL,
|
||||
currentHandle bigint NOT NULL,
|
||||
currentPos varchar(64) NOT NULL
|
||||
);
|
||||
|
||||
CREATE INDEX session ON agents
|
||||
(
|
||||
sessionID ASC
|
||||
);
|
||||
|
||||
CREATE INDEX ssession ON agents
|
||||
(
|
||||
secureSessionID ASC
|
||||
);
|
||||
|
||||
|
||||
CREATE TABLE userfriends(
|
||||
ownerID varchar(50) NOT NULL,
|
||||
friendID varchar(50) NOT NULL,
|
||||
friendPerms varchar(50) NOT NULL,
|
||||
datetimestamp varchar(50) NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE avatarappearance (
|
||||
Owner varchar(36) NOT NULL primary key,
|
||||
Serial int NOT NULL,
|
||||
Visual_Params bytea NOT NULL,
|
||||
Texture bytea NOT NULL,
|
||||
Avatar_Height double precision NOT NULL,
|
||||
Body_Item varchar(36) NOT NULL,
|
||||
Body_Asset varchar(36) NOT NULL,
|
||||
Skin_Item varchar(36) NOT NULL,
|
||||
Skin_Asset varchar(36) NOT NULL,
|
||||
Hair_Item varchar(36) NOT NULL,
|
||||
Hair_Asset varchar(36) NOT NULL,
|
||||
Eyes_Item varchar(36) NOT NULL,
|
||||
Eyes_Asset varchar(36) NOT NULL,
|
||||
Shirt_Item varchar(36) NOT NULL,
|
||||
Shirt_Asset varchar(36) NOT NULL,
|
||||
Pants_Item varchar(36) NOT NULL,
|
||||
Pants_Asset varchar(36) NOT NULL,
|
||||
Shoes_Item varchar(36) NOT NULL,
|
||||
Shoes_Asset varchar(36) NOT NULL,
|
||||
Socks_Item varchar(36) NOT NULL,
|
||||
Socks_Asset varchar(36) NOT NULL,
|
||||
Jacket_Item varchar(36) NOT NULL,
|
||||
Jacket_Asset varchar(36) NOT NULL,
|
||||
Gloves_Item varchar(36) NOT NULL,
|
||||
Gloves_Asset varchar(36) NOT NULL,
|
||||
Undershirt_Item varchar(36) NOT NULL,
|
||||
Undershirt_Asset varchar(36) NOT NULL,
|
||||
Underpants_Item varchar(36) NOT NULL,
|
||||
Underpants_Asset varchar(36) NOT NULL,
|
||||
Skirt_Item varchar(36) NOT NULL,
|
||||
Skirt_Asset varchar(36) NOT NULL
|
||||
);
|
||||
|
||||
:VERSION 2
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
ALTER TABLE users ADD homeRegionID varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000';
|
||||
ALTER TABLE users ADD userFlags int NOT NULL default 0;
|
||||
ALTER TABLE users ADD godLevel int NOT NULL default 0;
|
||||
ALTER TABLE users ADD customType varchar(32) not null default '';
|
||||
ALTER TABLE users ADD partner varchar(36) not null default '00000000-0000-0000-0000-000000000000';
|
||||
|
||||
COMMIT;
|
||||
|
||||
|
||||
:VERSION 3
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE avatarattachments (
|
||||
UUID varchar(36) NOT NULL
|
||||
, attachpoint int NOT NULL
|
||||
, item varchar(36) NOT NULL
|
||||
, asset varchar(36) NOT NULL);
|
||||
|
||||
CREATE INDEX IX_avatarattachments ON avatarattachments
|
||||
(
|
||||
UUID
|
||||
);
|
||||
|
||||
COMMIT;
|
||||
|
||||
|
||||
:VERSION 4
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE Tmp_userfriends
|
||||
(
|
||||
ownerID varchar(36) NOT NULL,
|
||||
friendID varchar(36) NOT NULL,
|
||||
friendPerms int NOT NULL,
|
||||
datetimestamp int NOT NULL
|
||||
);
|
||||
|
||||
INSERT INTO Tmp_userfriends (ownerID, friendID, friendPerms, datetimestamp)
|
||||
SELECT cast(ownerID as varchar(36)), cast(friendID as varchar(36)), cast(friendPerms as int), cast(datetimestamp as int)
|
||||
FROM userfriends;
|
||||
|
||||
DROP TABLE userfriends;
|
||||
|
||||
alter table Tmp_userfriends rename to userfriends;
|
||||
|
||||
CREATE INDEX IX_userfriends_ownerID ON userfriends
|
||||
(
|
||||
ownerID
|
||||
);
|
||||
|
||||
CREATE INDEX IX_userfriends_friendID ON userfriends
|
||||
(
|
||||
friendID
|
||||
);
|
||||
|
||||
COMMIT;
|
||||
|
||||
|
||||
:VERSION 5
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
ALTER TABLE users add email varchar(250);
|
||||
|
||||
COMMIT;
|
||||
|
||||
|
||||
:VERSION 6
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE Tmp_users
|
||||
(
|
||||
UUID uuid NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'),
|
||||
username varchar(32) NOT NULL,
|
||||
lastname varchar(32) NOT NULL,
|
||||
passwordHash varchar(32) NOT NULL,
|
||||
passwordSalt varchar(32) NOT NULL,
|
||||
homeRegion bigint NULL DEFAULT (NULL),
|
||||
homeLocationX double precision NULL DEFAULT (NULL),
|
||||
homeLocationY double precision NULL DEFAULT (NULL),
|
||||
homeLocationZ double precision NULL DEFAULT (NULL),
|
||||
homeLookAtX double precision NULL DEFAULT (NULL),
|
||||
homeLookAtY double precision NULL DEFAULT (NULL),
|
||||
homeLookAtZ double precision NULL DEFAULT (NULL),
|
||||
created int NOT NULL,
|
||||
lastLogin int NOT NULL,
|
||||
userInventoryURI varchar(255) NULL DEFAULT (NULL),
|
||||
userAssetURI varchar(255) NULL DEFAULT (NULL),
|
||||
profileCanDoMask int NULL DEFAULT (NULL),
|
||||
profileWantDoMask int NULL DEFAULT (NULL),
|
||||
profileAboutText text NULL,
|
||||
profileFirstText text NULL,
|
||||
profileImage uuid NULL DEFAULT (NULL),
|
||||
profileFirstImage uuid NULL DEFAULT (NULL),
|
||||
webLoginKey uuid NULL DEFAULT (NULL),
|
||||
homeRegionID uuid NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'),
|
||||
userFlags int NOT NULL DEFAULT ((0)),
|
||||
godLevel int NOT NULL DEFAULT ((0)),
|
||||
customType varchar(32) NOT NULL DEFAULT (''),
|
||||
partner uuid NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'),
|
||||
email varchar(250) NULL
|
||||
);
|
||||
|
||||
INSERT INTO Tmp_users (UUID, username, lastname, passwordHash, passwordSalt, homeRegion, homeLocationX, homeLocationY, homeLocationZ, homeLookAtX, homeLookAtY, homeLookAtZ, created, lastLogin, userInventoryURI, userAssetURI, profileCanDoMask, profileWantDoMask, profileAboutText, profileFirstText, profileImage, profileFirstImage, webLoginKey, homeRegionID, userFlags, godLevel, customType, partner, email)
|
||||
SELECT cast(UUID as uuid), username, lastname, passwordHash, passwordSalt, homeRegion, homeLocationX, homeLocationY, homeLocationZ, homeLookAtX, homeLookAtY, homeLookAtZ, created, lastLogin, userInventoryURI, userAssetURI, profileCanDoMask, profileWantDoMask, profileAboutText, profileFirstText, cast(profileImage as uuid), cast(profileFirstImage as uuid), cast(webLoginKey as uuid), cast(homeRegionID as uuid), userFlags, godLevel, customType, cast(partner as uuid), email
|
||||
FROM users ;
|
||||
|
||||
DROP TABLE users;
|
||||
|
||||
alter table Tmp_users rename to users;
|
||||
|
||||
ALTER TABLE users ADD CONSTRAINT
|
||||
PK__users__65A475E737A5467C PRIMARY KEY
|
||||
(
|
||||
UUID
|
||||
);
|
||||
|
||||
CREATE INDEX usernames ON users
|
||||
(
|
||||
username,
|
||||
lastname
|
||||
);
|
||||
|
||||
COMMIT;
|
||||
|
||||
|
||||
:VERSION 7
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE Tmp_agents
|
||||
(
|
||||
UUID uuid NOT NULL,
|
||||
sessionID uuid NOT NULL,
|
||||
secureSessionID uuid NOT NULL,
|
||||
agentIP varchar(16) NOT NULL,
|
||||
agentPort int NOT NULL,
|
||||
agentOnline smallint NOT NULL,
|
||||
loginTime int NOT NULL,
|
||||
logoutTime int NOT NULL,
|
||||
currentRegion uuid NOT NULL,
|
||||
currentHandle bigint NOT NULL,
|
||||
currentPos varchar(64) NOT NULL
|
||||
);
|
||||
|
||||
INSERT INTO Tmp_agents (UUID, sessionID, secureSessionID, agentIP, agentPort, agentOnline, loginTime, logoutTime, currentRegion, currentHandle, currentPos)
|
||||
SELECT cast(UUID as uuid), cast(sessionID as uuid), cast(secureSessionID as uuid), agentIP, agentPort, agentOnline, loginTime, logoutTime, cast(currentRegion as uuid), currentHandle, currentPos
|
||||
FROM agents ;
|
||||
|
||||
DROP TABLE agents;
|
||||
|
||||
alter table Tmp_agents rename to agents;
|
||||
|
||||
ALTER TABLE agents ADD CONSTRAINT
|
||||
PK__agents__65A475E749C3F6B7 PRIMARY KEY
|
||||
(
|
||||
UUID
|
||||
) ;
|
||||
|
||||
CREATE INDEX session ON agents
|
||||
(
|
||||
sessionID
|
||||
);
|
||||
|
||||
CREATE INDEX ssession ON agents
|
||||
(
|
||||
secureSessionID
|
||||
);
|
||||
|
||||
COMMIT;
|
||||
|
||||
|
||||
:VERSION 8
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE Tmp_userfriends
|
||||
(
|
||||
ownerID uuid NOT NULL,
|
||||
friendID uuid NOT NULL,
|
||||
friendPerms int NOT NULL,
|
||||
datetimestamp int NOT NULL
|
||||
);
|
||||
|
||||
INSERT INTO Tmp_userfriends (ownerID, friendID, friendPerms, datetimestamp)
|
||||
SELECT cast(ownerID as uuid), cast( friendID as uuid), friendPerms, datetimestamp
|
||||
FROM userfriends;
|
||||
|
||||
DROP TABLE userfriends;
|
||||
|
||||
alter table Tmp_userfriends rename to userfriends;
|
||||
|
||||
CREATE INDEX IX_userfriends_ownerID ON userfriends
|
||||
(
|
||||
ownerID
|
||||
);
|
||||
|
||||
CREATE INDEX IX_userfriends_friendID ON userfriends
|
||||
(
|
||||
friendID
|
||||
);
|
||||
|
||||
COMMIT;
|
||||
|
||||
|
||||
:VERSION 9
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE Tmp_avatarappearance
|
||||
(
|
||||
Owner uuid NOT NULL,
|
||||
Serial int NOT NULL,
|
||||
Visual_Params bytea NOT NULL,
|
||||
Texture bytea NOT NULL,
|
||||
Avatar_Height double precision NOT NULL,
|
||||
Body_Item uuid NOT NULL,
|
||||
Body_Asset uuid NOT NULL,
|
||||
Skin_Item uuid NOT NULL,
|
||||
Skin_Asset uuid NOT NULL,
|
||||
Hair_Item uuid NOT NULL,
|
||||
Hair_Asset uuid NOT NULL,
|
||||
Eyes_Item uuid NOT NULL,
|
||||
Eyes_Asset uuid NOT NULL,
|
||||
Shirt_Item uuid NOT NULL,
|
||||
Shirt_Asset uuid NOT NULL,
|
||||
Pants_Item uuid NOT NULL,
|
||||
Pants_Asset uuid NOT NULL,
|
||||
Shoes_Item uuid NOT NULL,
|
||||
Shoes_Asset uuid NOT NULL,
|
||||
Socks_Item uuid NOT NULL,
|
||||
Socks_Asset uuid NOT NULL,
|
||||
Jacket_Item uuid NOT NULL,
|
||||
Jacket_Asset uuid NOT NULL,
|
||||
Gloves_Item uuid NOT NULL,
|
||||
Gloves_Asset uuid NOT NULL,
|
||||
Undershirt_Item uuid NOT NULL,
|
||||
Undershirt_Asset uuid NOT NULL,
|
||||
Underpants_Item uuid NOT NULL,
|
||||
Underpants_Asset uuid NOT NULL,
|
||||
Skirt_Item uuid NOT NULL,
|
||||
Skirt_Asset uuid NOT NULL
|
||||
);
|
||||
|
||||
INSERT INTO Tmp_avatarappearance (Owner, Serial, Visual_Params, Texture, Avatar_Height, Body_Item, Body_Asset, Skin_Item, Skin_Asset, Hair_Item, Hair_Asset, Eyes_Item, Eyes_Asset, Shirt_Item, Shirt_Asset, Pants_Item, Pants_Asset, Shoes_Item, Shoes_Asset, Socks_Item, Socks_Asset, Jacket_Item, Jacket_Asset, Gloves_Item, Gloves_Asset, Undershirt_Item, Undershirt_Asset, Underpants_Item, Underpants_Asset, Skirt_Item, Skirt_Asset)
|
||||
SELECT cast(Owner as uuid), Serial, Visual_Params, Texture, Avatar_Height, cast(Body_Item as uuid), cast(Body_Asset as uuid), cast(Skin_Item as uuid), cast(Skin_Asset as uuid), cast(Hair_Item as uuid), cast(Hair_Asset as uuid), cast(Eyes_Item as uuid), cast(Eyes_Asset as uuid), cast(Shirt_Item as uuid), cast(Shirt_Asset as uuid), cast(Pants_Item as uuid), cast(Pants_Asset as uuid), cast(Shoes_Item as uuid), cast(Shoes_Asset as uuid), cast(Socks_Item as uuid), cast(Socks_Asset as uuid), cast(Jacket_Item as uuid), cast(Jacket_Asset as uuid), cast(Gloves_Item as uuid), cast(Gloves_Asset as uuid), cast(Undershirt_Item as uuid), cast(Undershirt_Asset as uuid), cast(Underpants_Item as uuid), cast(Underpants_Asset as uuid), cast(Skirt_Item as uuid), cast(Skirt_Asset as uuid)
|
||||
FROM avatarappearance ;
|
||||
|
||||
DROP TABLE avatarappearance;
|
||||
|
||||
alter table Tmp_avatarappearance rename to avatarappearance;
|
||||
|
||||
ALTER TABLE avatarappearance ADD CONSTRAINT
|
||||
PK__avatarap__7DD115CC4E88ABD4 PRIMARY KEY
|
||||
(
|
||||
Owner
|
||||
);
|
||||
|
||||
COMMIT;
|
||||
|
||||
|
||||
:VERSION 10
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE Tmp_avatarattachments
|
||||
(
|
||||
UUID uuid NOT NULL,
|
||||
attachpoint int NOT NULL,
|
||||
item uuid NOT NULL,
|
||||
asset uuid NOT NULL
|
||||
);
|
||||
|
||||
INSERT INTO Tmp_avatarattachments (UUID, attachpoint, item, asset)
|
||||
SELECT cast(UUID as uuid), attachpoint, cast(item as uuid), cast(asset as uuid)
|
||||
FROM avatarattachments ;
|
||||
|
||||
DROP TABLE avatarattachments;
|
||||
|
||||
alter table Tmp_avatarattachments rename to avatarattachments;
|
||||
|
||||
CREATE INDEX IX_avatarattachments ON avatarattachments
|
||||
(
|
||||
UUID
|
||||
);
|
||||
|
||||
COMMIT;
|
||||
|
||||
|
||||
:VERSION 11
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
ALTER TABLE users ADD scopeID uuid not null default '00000000-0000-0000-0000-000000000000';
|
||||
|
||||
COMMIT;
|
||||
@@ -513,6 +513,7 @@ namespace OpenSim
|
||||
if (estateOwnerUuid == UUID.Zero)
|
||||
estateOwnerUuid = UUID.Random();
|
||||
|
||||
m_log.DebugFormat("[USER]: Try to create user {0} {1}", estateOwnerFirstName, estateOwnerLastName);
|
||||
account
|
||||
= ((UserAccountService)scene.UserAccountService).CreateUser(
|
||||
regionInfo.ScopeID,
|
||||
|
||||
@@ -1894,6 +1894,8 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
{
|
||||
try
|
||||
{
|
||||
m_log.InfoFormat("[TERRAIN]: Loading Terrain ID {0}.", RegionInfo.RegionID);
|
||||
|
||||
double[,] map = SimulationDataService.LoadTerrain(RegionInfo.RegionID);
|
||||
if (map == null)
|
||||
{
|
||||
|
||||
0
OpenSim/Region/Physics/BulletSPlugin/BSConstraint.cs
Executable file → Normal file
0
OpenSim/Region/Physics/BulletSPlugin/BSConstraint.cs
Executable file → Normal file
0
OpenSim/Region/Physics/BulletSPlugin/BSConstraint6Dof.cs
Executable file → Normal file
0
OpenSim/Region/Physics/BulletSPlugin/BSConstraint6Dof.cs
Executable file → Normal file
0
OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs
Executable file → Normal file
0
OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs
Executable file → Normal file
0
OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs
Executable file → Normal file
0
OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs
Executable file → Normal file
0
OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs
Executable file → Normal file
0
OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs
Executable file → Normal file
0
OpenSim/Region/Physics/BulletSPlugin/BSMaterials.cs
Executable file → Normal file
0
OpenSim/Region/Physics/BulletSPlugin/BSMaterials.cs
Executable file → Normal file
0
OpenSim/Region/Physics/BulletSPlugin/BSMotors.cs
Executable file → Normal file
0
OpenSim/Region/Physics/BulletSPlugin/BSMotors.cs
Executable file → Normal file
0
OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs
Executable file → Normal file
0
OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs
Executable file → Normal file
0
OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs
Executable file → Normal file
0
OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs
Executable file → Normal file
0
OpenSim/Region/Physics/BulletSPlugin/BSTerrainManager.cs
Executable file → Normal file
0
OpenSim/Region/Physics/BulletSPlugin/BSTerrainManager.cs
Executable file → Normal file
0
OpenSim/Region/Physics/BulletSPlugin/BSTerrainMesh.cs
Executable file → Normal file
0
OpenSim/Region/Physics/BulletSPlugin/BSTerrainMesh.cs
Executable file → Normal file
@@ -168,9 +168,9 @@ namespace OpenSim.Services.UserAccountService
|
||||
else
|
||||
u.UserTitle = string.Empty;
|
||||
if (d.Data.ContainsKey("UserLevel") && d.Data["UserLevel"] != null)
|
||||
Int32.TryParse(d.Data["UserLevel"], out u.UserLevel);
|
||||
Int32.TryParse(d.Data["UserLevel"].ToString(), out u.UserLevel);
|
||||
if (d.Data.ContainsKey("UserFlags") && d.Data["UserFlags"] != null)
|
||||
Int32.TryParse(d.Data["UserFlags"], out u.UserFlags);
|
||||
Int32.TryParse(d.Data["UserFlags"].ToString(), out u.UserFlags);
|
||||
|
||||
if (d.Data.ContainsKey("ServiceURLs") && d.Data["ServiceURLs"] != null)
|
||||
{
|
||||
@@ -258,9 +258,9 @@ namespace OpenSim.Services.UserAccountService
|
||||
|
||||
public bool StoreUserAccount(UserAccount data)
|
||||
{
|
||||
// m_log.DebugFormat(
|
||||
// "[USER ACCOUNT SERVICE]: Storing user account for {0} {1} {2}, scope {3}",
|
||||
// data.FirstName, data.LastName, data.PrincipalID, data.ScopeID);
|
||||
m_log.DebugFormat(
|
||||
"[USER ACCOUNT SERVICE]: Storing user account for {0} {1} {2}, scope {3}",
|
||||
data.FirstName, data.LastName, data.PrincipalID, data.ScopeID);
|
||||
|
||||
UserAccountData d = new UserAccountData();
|
||||
|
||||
@@ -469,9 +469,14 @@ namespace OpenSim.Services.UserAccountService
|
||||
public UserAccount CreateUser(UUID scopeID, UUID principalID, string firstName, string lastName, string password, string email)
|
||||
{
|
||||
UserAccount account = GetUserAccount(UUID.Zero, firstName, lastName);
|
||||
|
||||
if (null == account)
|
||||
{
|
||||
m_log.InfoFormat("[USER ACCOUNT SERVICE]: Account {0} {1} not exist. Trying to create",
|
||||
firstName, lastName);
|
||||
|
||||
account = new UserAccount(UUID.Zero, principalID, firstName, lastName, email);
|
||||
|
||||
if (account.ServiceURLs == null || (account.ServiceURLs != null && account.ServiceURLs.Count == 0))
|
||||
{
|
||||
account.ServiceURLs = new Dictionary<string, object>();
|
||||
@@ -491,6 +496,9 @@ namespace OpenSim.Services.UserAccountService
|
||||
m_log.WarnFormat("[USER ACCOUNT SERVICE]: Unable to set password for account {0} {1}.",
|
||||
firstName, lastName);
|
||||
}
|
||||
|
||||
m_log.InfoFormat( "[USER ACCOUNT SERVICE]: Account {0} {1} {2} Trying GridRegion",
|
||||
firstName, lastName, account.PrincipalID);
|
||||
|
||||
GridRegion home = null;
|
||||
if (m_GridService != null)
|
||||
@@ -511,6 +519,9 @@ namespace OpenSim.Services.UserAccountService
|
||||
firstName, lastName);
|
||||
}
|
||||
|
||||
m_log.InfoFormat("[USER ACCOUNT SERVICE]: Account {0} {1} {2} Trying Inventory",
|
||||
firstName, lastName, account.PrincipalID);
|
||||
|
||||
if (m_InventoryService != null)
|
||||
{
|
||||
success = m_InventoryService.CreateUserInventory(account.PrincipalID);
|
||||
|
||||
@@ -1,26 +1,26 @@
|
||||
/*
|
||||
* Copyright (c) Contributors, http://aurora-sim.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 Aurora-Sim 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.
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) Contributors, http://aurora-sim.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 Aurora-Sim 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.
|
||||
*/
|
||||
|
||||
BIN
bin/Npgsql.dll
Normal file
BIN
bin/Npgsql.dll
Normal file
Binary file not shown.
BIN
bin/Npgsql.pdb
Normal file
BIN
bin/Npgsql.pdb
Normal file
Binary file not shown.
4120
bin/Npgsql.xml
Normal file
4120
bin/Npgsql.xml
Normal file
File diff suppressed because it is too large
Load Diff
@@ -26,6 +26,12 @@
|
||||
;StorageProvider = "OpenSim.Data.MSSQL.dll"
|
||||
;ConnectionString = "Server=localhost\SQLEXPRESS;Database=opensim;User Id=opensim; password=***;"
|
||||
|
||||
; PGSQL
|
||||
; Uncomment these lines if you want to use PGSQL storage
|
||||
; Change the connection string to your db details
|
||||
;StorageProvider = "OpenSim.Data.PGSQL.dll"
|
||||
;ConnectionString = "Server=localhost;Database=opensim;User Id=opensim; password=***;"
|
||||
|
||||
[Hypergrid]
|
||||
; Uncomment the variables in this section only if you are in
|
||||
; Hypergrid configuration. Otherwise, ignore.
|
||||
|
||||
@@ -27,6 +27,12 @@
|
||||
;StorageProvider = "OpenSim.Data.MSSQL.dll"
|
||||
;ConnectionString = "Server=localhost\SQLEXPRESS;Database=opensim;User Id=opensim; password=***;"
|
||||
|
||||
; PGSQL
|
||||
; Uncomment these lines if you want to use PGSQL storage
|
||||
; Change the connection string to your db details
|
||||
;StorageProvider = "OpenSim.Data.PGSQL.dll"
|
||||
;ConnectionString = "Server=localhost;Database=opensim;User Id=opensim; password=***;"
|
||||
|
||||
[Hypergrid]
|
||||
; Uncomment the variables in this section only if you are in
|
||||
; Hypergrid configuration. Otherwise, ignore.
|
||||
|
||||
0
bin/lib32/libopenjpeg-dotnet.so
Executable file → Normal file
0
bin/lib32/libopenjpeg-dotnet.so
Executable file → Normal file
0
bin/lib32/libsqlite3_32.so
Executable file → Normal file
0
bin/lib32/libsqlite3_32.so
Executable file → Normal file
Binary file not shown.
Binary file not shown.
0
bin/lib64/libopenjpeg-dotnet-x86_64.so
Executable file → Normal file
0
bin/lib64/libopenjpeg-dotnet-x86_64.so
Executable file → Normal file
0
bin/lib64/libopenjpeg-dotnet.dylib
Executable file → Normal file
0
bin/lib64/libopenjpeg-dotnet.dylib
Executable file → Normal file
0
bin/lib64/libsqlite3.dylib
Executable file → Normal file
0
bin/lib64/libsqlite3.dylib
Executable file → Normal file
0
bin/lib64/libsqlite3_64.so
Executable file → Normal file
0
bin/lib64/libsqlite3_64.so
Executable file → Normal file
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
0
bin/pCampBot.exe.config
Executable file → Normal file
0
bin/pCampBot.exe.config
Executable file → Normal file
34
prebuild.xml
34
prebuild.xml
@@ -2073,6 +2073,40 @@
|
||||
</Files>
|
||||
</Project>
|
||||
|
||||
<Project frameworkVersion="v3_5" name="OpenSim.Data.PGSQL" path="OpenSim/Data/PGSQL" type="Library">
|
||||
<Configuration name="Debug">
|
||||
<Options>
|
||||
<OutputPath>../../../bin/</OutputPath>
|
||||
</Options>
|
||||
</Configuration>
|
||||
<Configuration name="Release">
|
||||
<Options>
|
||||
<OutputPath>../../../bin/</OutputPath>
|
||||
</Options>
|
||||
</Configuration>
|
||||
|
||||
<ReferencePath>../../../bin/</ReferencePath>
|
||||
<Reference name="System"/>
|
||||
<Reference name="System.Xml"/>
|
||||
<Reference name="System.Data"/>
|
||||
<Reference name="System.Drawing"/>
|
||||
<Reference name="OpenSim.Framework"/>
|
||||
<Reference name="OpenSim.Data"/>
|
||||
<Reference name="OpenSim.Region.Framework"/>
|
||||
<Reference name="OpenSim.Framework.Console"/>
|
||||
<Reference name="OpenMetaverseTypes" path="../../../bin/"/>
|
||||
<Reference name="OpenMetaverse" path="../../../bin/"/>
|
||||
<Reference name="log4net" path="../../../bin/"/>
|
||||
<Reference name="Mono.Addins" path="../../../bin/"/>
|
||||
<Reference name="Npgsql" path="../../../bin/"/>
|
||||
|
||||
<Files>
|
||||
<Match pattern="*.cs" recurse="true"/>
|
||||
<Match buildAction="EmbeddedResource" path="Resources" pattern="*.migrations"/>
|
||||
<Match buildAction="EmbeddedResource" path="Resources" pattern="*.addin.xml" recurse="true"/>
|
||||
</Files>
|
||||
</Project>
|
||||
|
||||
<Project frameworkVersion="v3_5" name="OpenSim.Data.SQLite" path="OpenSim/Data/SQLite" type="Library">
|
||||
<Configuration name="Debug">
|
||||
<Options>
|
||||
|
||||
7
syncneb.bat
Normal file
7
syncneb.bat
Normal file
@@ -0,0 +1,7 @@
|
||||
rem git remote add upstream https://github.com/nebadon2025/opensimulator.git
|
||||
|
||||
git fetch upstream
|
||||
|
||||
git merge upstream/master
|
||||
|
||||
pause
|
||||
Reference in New Issue
Block a user