/* * 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 MySql.Data.MySqlClient; using OpenMetaverse; using OpenSim.Framework; using OpenSim.Region.Framework.Interfaces; namespace OpenSim.Data.MySQL { // public class MySQLGenericHandler : MySqlFramework where T: class, new() public class MySQLGenericHandler : MySqlFramework { // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); protected virtual Assembly Assembly { get { return GetType().Assembly; } } public MySQLGenericHandler(MySqlTransaction trans) : base(trans) { CommonConstruct(); } public MySQLGenericHandler(string connectionString) : base(connectionString) { CommonConstruct(); } protected void CommonConstruct() { // We always use a new connection for any Migrations using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) { dbcon.Open(); } } /* private void CheckColumnNames(IDataReader reader) { if (m_ColumnNames != null) return; List columnNames = new List(); DataTable schemaTable = reader.GetSchemaTable(); foreach (DataRow row in schemaTable.Rows) { if (row["ColumnName"] != null) columnNames.Add(row["ColumnName"].ToString()); } m_ColumnNames = columnNames; } */ /* public virtual T[] Get(string table, string field, string key) { return Get(table, new string[] { field }, new string[] { key }); } public virtual T[] Get(string table, string[] fields, string[] keys) { return Get(table, fields, keys, String.Empty); } public virtual T[] Get(string table, string[] fields, string[] keys, string options) { if (fields.Length != keys.Length) return new T[0]; List terms = new List(); using (MySqlCommand cmd = new MySqlCommand()) { for (int i = 0 ; i < fields.Length ; i++) { cmd.Parameters.AddWithValue(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} {2}", table, where, options); cmd.CommandText = query; return DoQuery(cmd); } } protected T[] DoQuery(MySqlCommand cmd) { if (m_trans == null) { using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) { dbcon.Open(); T[] ret = DoQueryWithConnection(cmd, dbcon); dbcon.Close(); return ret; } } else { return DoQueryWithTransaction(cmd, m_trans); } } protected T[] DoQueryWithTransaction(MySqlCommand cmd, MySqlTransaction trans) { cmd.Transaction = trans; return DoQueryWithConnection(cmd, trans.Connection); } protected T[] DoQueryWithConnection(MySqlCommand cmd, MySqlConnection dbcon) { List result = new List(); cmd.Connection = dbcon; using (IDataReader 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 (reader[name] is DBNull) { continue; } if (m_Fields[name].FieldType == typeof(bool)) { int v = Convert.ToInt32(reader[name]); m_Fields[name].SetValue(row, v != 0 ? true : false); } else if (m_Fields[name].FieldType == typeof(UUID)) { m_Fields[name].SetValue(row, DBGuid.FromDB(reader[name])); } else if (m_Fields[name].FieldType == typeof(int)) { int v = Convert.ToInt32(reader[name]); m_Fields[name].SetValue(row, v); } else if (m_Fields[name].FieldType == typeof(uint)) { uint v = Convert.ToUInt32(reader[name]); m_Fields[name].SetValue(row, v); } else { m_Fields[name].SetValue(row, reader[name]); } } if (m_DataField != null) { Dictionary data = new Dictionary(); 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); } */ /* } cmd.Connection = null; return result.ToArray(); } public virtual T[] Get(string table, string where) { using (MySqlCommand cmd = new MySqlCommand()) { string query = String.Format("select * from {0} where {1}", table, where); cmd.CommandText = query; return DoQuery(cmd); } } */ public virtual bool Delete(string table, string field, string key) { return Delete(table, new string[] { field }, new string[] { key }); } public virtual bool Delete(string table, string[] fields, string[] keys) { // m_log.DebugFormat( // "[MYSQL GENERIC TABLE HANDLER]: Delete(string[] fields, string[] keys) invoked with {0}:{1}", // string.Join(",", fields), string.Join(",", keys)); if (fields.Length != keys.Length) return false; List terms = new List(); using (MySqlCommand cmd = new MySqlCommand()) { for (int i = 0 ; i < fields.Length ; i++) { cmd.Parameters.AddWithValue(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}", table, where); cmd.CommandText = query; return ExecuteNonQuery(cmd) > 0; } } public long GetCount(string table, string field, string key) { return GetCount(table, new string[] { field }, new string[] { key }); } public long GetCount(string table, string[] fields, string[] keys) { if (fields.Length != keys.Length) return 0; List terms = new List(); using (MySqlCommand cmd = new MySqlCommand()) { for (int i = 0; i < fields.Length; i++) { cmd.Parameters.AddWithValue(fields[i], keys[i]); terms.Add("`" + fields[i] + "` = ?" + fields[i]); } string where = String.Join(" and ", terms.ToArray()); string query = String.Format("select count(*) from {0} where {1}", table, where); cmd.CommandText = query; Object result = DoQueryScalar(cmd); return Convert.ToInt64(result); } } public long GetCount(string table, string where) { using (MySqlCommand cmd = new MySqlCommand()) { string query = String.Format("select count(*) from {0} where {1}", table, where); cmd.CommandText = query; object result = DoQueryScalar(cmd); return Convert.ToInt64(result); } } public long GetCount(string table) { using (MySqlCommand cmd = new MySqlCommand()) { string query = String.Format("select count(*) from {0}", table); cmd.CommandText = query; object result = DoQueryScalar(cmd); return Convert.ToInt64(result); } } public object DoQueryScalar(MySqlCommand cmd) { if (m_trans == null) { using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) { dbcon.Open(); cmd.Connection = dbcon; Object ret = cmd.ExecuteScalar(); cmd.Connection = null; dbcon.Close(); return ret; } } else { cmd.Connection = m_trans.Connection; cmd.Transaction = m_trans; return cmd.ExecuteScalar(); } } } }